From 252eb3b314fc4c8146b258be9dcf577576aaa427 Mon Sep 17 00:00:00 2001 From: "wimba.com" Date: Tue, 21 Sep 2004 21:27:54 +0000 Subject: [PATCH] Additional changes to support scroll panes whether an applet is running in its own frame or on an html page. Some resizing support. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2535 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- .../src/com/tightvnc/rfbplayer/RfbPlayer.java | 68 ++++++++++++++----- .../src/com/tightvnc/rfbplayer/VncCanvas.java | 67 ++++++++++-------- 2 files changed, 90 insertions(+), 45 deletions(-) diff --git a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java index c46c769c..4b748890 100644 --- a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java +++ b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java @@ -31,6 +31,11 @@ public class RfbPlayer extends java.applet.Applet boolean inAnApplet = true; boolean inSeparateFrame = false; + /** current applet width */ + int dispW = 300; + /** current applet height */ + int dispH = 200; + // // main() is called when run as a java program from the command line. // It simply runs the applet inside a newly-created frame. @@ -133,34 +138,36 @@ public class RfbPlayer extends java.applet.Applet gbc.weightx = 1.0; gbc.weighty = 1.0; - if (inSeparateFrame) { + // Create a panel which itself is resizeable and can hold + // non-resizeable VncCanvas component at the top left corner. + Panel canvasPanel = new Panel(); + canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + canvasPanel.add(vc); - // Create a panel which itself is resizeable and can hold - // non-resizeable VncCanvas component at the top left corner. - Panel canvasPanel = new Panel(); - canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - canvasPanel.add(vc); + // Create a ScrollPane which will hold a panel with VncCanvas + // inside. + desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED); + gbc.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(canvasPanel, gbc); + desktopScrollPane.add(canvasPanel); - // Create a ScrollPane which will hold a panel with VncCanvas - // inside. - desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED); - gbc.fill = GridBagConstraints.BOTH; + // Now add the scroll bar to the container. + if (inSeparateFrame) { gridbag.setConstraints(desktopScrollPane, gbc); - desktopScrollPane.add(canvasPanel); - - // Finally, add our ScrollPane to the Frame window. vncFrame.add(desktopScrollPane); vncFrame.setTitle(rfb.desktopName); vncFrame.pack(); vc.resizeDesktopFrame(); - } else { + // Size the scroll pane to display size. + desktopScrollPane.setSize(dispW, dispH); // Just add the VncCanvas component to the Applet. - gridbag.setConstraints(vc, gbc); - add(vc); + gbc.fill = GridBagConstraints.NONE; + gridbag.setConstraints(desktopScrollPane, gbc); + add(desktopScrollPane); validate(); - + vc.resizeEmbeddedApplet(); } while (true) { @@ -271,6 +278,10 @@ public class RfbPlayer extends java.applet.Applet deferScreenUpdates = (int)readLongParameter("Defer screen updates", 20); if (deferScreenUpdates < 0) deferScreenUpdates = 0; // Just in case. + + // Display width and height. + dispW = readIntParameter("DISPLAY_WIDTH", dispW); + dispH = readIntParameter("DISPLAY_HEIGHT", dispH); } public String readParameter(String name, boolean required) { @@ -324,6 +335,18 @@ public class RfbPlayer extends java.applet.Applet return result; } + int readIntParameter(String name, int defaultValue) { + String str = readParameter(name, false); + int result = defaultValue; + if (str != null) { + try { + result = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } + return result; + } + // // fatalError() - print out a fatal error message. // @@ -364,6 +387,17 @@ public class RfbPlayer extends java.applet.Applet } } + // + // Set the new width and height of the applet. Call when browser is resized to + // resize the viewer. + // + public void displaySize(int width, int height) { + dispW = width; + dispH = height; + if (!inSeparateFrame) { + vc.resizeEmbeddedApplet(); + } + } // // Close application properly on window close event. diff --git a/java/src/com/tightvnc/rfbplayer/VncCanvas.java b/java/src/com/tightvnc/rfbplayer/VncCanvas.java index 48d0f6d5..b369c631 100644 --- a/java/src/com/tightvnc/rfbplayer/VncCanvas.java +++ b/java/src/com/tightvnc/rfbplayer/VncCanvas.java @@ -180,48 +180,59 @@ class VncCanvas extends Canvas implements Observer { } void resizeDesktopFrame() { + // size the canvas setSize(rfb.framebufferWidth, rfb.framebufferHeight); - // FIXME: Find a better way to determine correct size of a - // ScrollPane. -- const - Insets insets = player.desktopScrollPane.getInsets(); - player.desktopScrollPane.setSize(rfb.framebufferWidth + - 2 * Math.min(insets.left, insets.right), - rfb.framebufferHeight + - 2 * Math.min(insets.top, insets.bottom)); - - player.vncFrame.pack(); - - // Try to limit the frame size to the screen size. + // determine screen size Dimension screenSize = player.vncFrame.getToolkit().getScreenSize(); - Dimension frameSize = player.vncFrame.getSize(); - Dimension newSize = frameSize; + Dimension scrollSize = player.desktopScrollPane.getSize(); // Reduce Screen Size by 30 pixels in each direction; // This is a (poor) attempt to account for // 1) Menu bar on Macintosh (should really also account for // Dock on OSX). Usually 22px on top of screen. - // 2) Taxkbar on Windows (usually about 28 px on bottom) - // 3) Other obstructions. - + // 2) Taxkbar on Windows (usually about 28 px on bottom) + // 3) Other obstructions. screenSize.height -= 30; screenSize.width -= 30; - - boolean needToResizeFrame = false; - if (frameSize.height > screenSize.height) { - newSize.height = screenSize.height; - needToResizeFrame = true; - } - if (frameSize.width > screenSize.width) { - newSize.width = screenSize.width; - needToResizeFrame = true; + // Further reduce the screen size to account for the + // scroll pane's insets. + Insets insets = player.desktopScrollPane.getInsets(); + screenSize.height -= insets.top + insets.bottom; + screenSize.width -= insets.left + insets.right; + + // Limit pane size to fit on screen. + boolean needResize = false; + if (scrollSize.width != rfb.framebufferWidth || + scrollSize.height != rfb.framebufferHeight) + needResize = true; + int w = rfb.framebufferWidth, h = rfb.framebufferHeight; + if (w > screenSize.width) { + w = screenSize.width; + needResize = true; } - if (needToResizeFrame) { - player.vncFrame.setSize(newSize); + if (h > screenSize.height) { + h = screenSize.height; + needResize = true; } + if (needResize) + player.desktopScrollPane.setSize(w, h); + + player.vncFrame.pack(); + } + + void resizeEmbeddedApplet() { + // size the canvas + setSize(rfb.framebufferWidth, rfb.framebufferHeight); + + // resize scroll pane if necessary + Dimension scrollSize = player.desktopScrollPane.getSize(); + if (scrollSize.width != player.dispW || + scrollSize.height != player.dispH) + player.desktopScrollPane.setSize(player.dispW, player.dispH); - player.desktopScrollPane.doLayout(); + player.validate(); } // -- 2.39.5