changeset 314:e95cb9a3dd9b

change code, delete firstTime.
author oc
date Wed, 28 Jan 2015 19:32:21 +0900
parents 45aa7825ef6f
children 53c1f1663ab7
files src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java src/viewer_swing/java/com/glavsoft/viewer/Viewer.java src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java
diffstat 3 files changed, 581 insertions(+), 626 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Wed Jan 28 17:27:59 2015 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Wed Jan 28 19:32:21 2015 +0900
@@ -67,13 +67,12 @@
     protected boolean needSendPixelFormat;
     private TreeRFBProto rfb;
     private long checkCounter = 0;
-    private boolean firstTime = true;
     public int numberOfRectangles = 0;
     private Timer timer = null;
 
     public ReceiverTask(Reader reader,
                         IRepaintController repaintController, ClipboardController clipboardController,
-                        DecodersContainer decoders, ProtocolContext context,
+                        DecodersContainer decoders, final ProtocolContext context,
                         TreeRFBProto _rfb) {
         rfb = _rfb;
         this.reader = reader;
@@ -99,6 +98,22 @@
             // これを定期的にフルサイズのframebufferUpdateを送信するThreadにしよう!
             fullscreenFbUpdateIncrementalRequest.sendFullScreenRequest();
             connectionFinished();
+            if(rfb.checkDelay) {
+                SendCheckDelay sendCheckDelay = new SendCheckDelay(rfb);
+                Thread sendCheckDelayThread = new Thread(sendCheckDelay, "send-check-delay");
+                sendCheckDelayThread.start();
+            }
+            if(rfb.fixingSize) {
+                timer = new Timer("framebufferUpdate-request-timer", true);
+                timer.schedule(new TimerTask() {
+                    @Override
+                    public void run() { 
+                        context.setFbWidth(rfb.fixingSizeWidth);
+                        context.setFbHeight(rfb.fixingSizeHeight);
+                        context.sendMessage(new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true));
+                    }
+                }, 0, 100);
+            }
         }
     }
 
@@ -216,36 +231,10 @@
         if(numberOfRectangles != 1)
             System.out.println("numberofrectangle : " + numberOfRectangles);
 
-        if(rfb.isTreeManager() && firstTime) {
-            if(rfb.checkDelay) {
-                SendCheckDelay sendCheckDelay = new SendCheckDelay(rfb);
-                Thread sendCheckDelayThread = new Thread(sendCheckDelay, "send-check-delay");
-                sendCheckDelayThread.start();
-            }
-            if(rfb.fixingSize) {
-                timer = new Timer(true);
-                timer.schedule(new TimerTask() {
-                    @Override
-                    public void run() {
-                        context.setFbWidth(rfb.fixingSizeWidth);
-                        context.setFbHeight(rfb.fixingSizeHeight);
-                        context.sendMessage(new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true));
-                    }
-                }, 0, 100);
-            }
-        }
 
         while (numberOfRectangles-- > 0) {
             FramebufferUpdateRectangle rect = new FramebufferUpdateRectangle();
             rect.fill(reader);
-            int singleWidth = rfb.getSingleWidth();
-
-            if(rfb.filterSingleDisplay && firstTime) {
-                if (singleWidth == 0) {
-                    rfb.setSingleDisplaySize(rect.width, rect.height);
-                }
-                this.firstTime = false;
-            }
 
             long time = System.currentTimeMillis();
             if(rfb.isTreeManager() && rfb.checkDelay)
@@ -255,15 +244,9 @@
             logger.finest(rect.toString() + (0 == numberOfRectangles ? "\n---" : ""));
             if (decoder != null) {
                 decoder.decode(reader, renderer, rect);  // TreeVNC processing here
-                if(!(rfb.getCuiVersion())) {
-                    if (rfb.filterSingleDisplay) {
-                        if (rect.x < singleWidth) {
-                            repaintController.repaintBitmap(rect);
-                        }
-                    } else {
-                        repaintController.repaintBitmap(rect);
-                    }
-                }
+                if (rfb.getCuiVersion()) continue;
+                if (rfb.filterSingleDisplay && rect.x >= rfb.getSingleWidth()) continue;
+                repaintController.repaintBitmap(rect);
             } else if (rect.getEncodingType() == EncodingType.RICH_CURSOR) {
                 RichCursorDecoder.getInstance().decode(reader, renderer, rect);
                 if(repaintController!=null)
--- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Wed Jan 28 17:27:59 2015 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Wed Jan 28 19:32:21 2015 +0900
@@ -452,21 +452,18 @@
 
     @Override
     public ArrayList<Rectangle> getScreenRectangles() {
-        // before change server, data from previous server
+        // before change the screen server, data from previous server
         // should be stopped.
         setCuiVersion(false);
-        // Host have screens.
-        // Each screen number in order from left.
-        // put screens in rectangles.
+        // New screen server has one or more screens.
+        // Screens are numbered in the order from left.
+        // put screens in an ArrayList.
         ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>();
-        GraphicsConfiguration[] gc = null;
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
         GraphicsDevice[] gs = ge.getScreenDevices();
-        for (int j = 0; j < gs.length; j++) {
-            GraphicsDevice gd = gs[j];
-            gc = gd.getConfigurations();
-            for (int i=0; i < gc.length; i++) {
-                rectangles.add(gc[i].getBounds());
+        for (GraphicsDevice gd : gs) {
+            for (GraphicsConfiguration r : gd.getConfigurations()) {
+                rectangles.add(r.getBounds());
             }
         }
         return rectangles;
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Wed Jan 28 17:27:59 2015 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Wed Jan 28 19:32:21 2015 +0900
@@ -58,28 +58,28 @@
 import jp.ac.u_ryukyu.treevnc.*;
 
 public class SwingViewerWindow implements IChangeSettingsListener {
-	public static final int FS_SCROLLING_ACTIVE_BORDER = 20;
-	private JToggleButton zoomFitButton;
-	private JToggleButton zoomFullScreenButton;
-	private JButton zoomInButton;
-	private JButton zoomOutButton;
-	private JButton zoomAsIsButton;
-	private JPanel outerPanel;
-	private JScrollPane scroller;
-	private JFrame frame;
-	private boolean forceResizable = true;
-	private ButtonsBar buttonsBar;
-	private Surface surface;
-	private boolean isSeparateFrame;
+    public static final int FS_SCROLLING_ACTIVE_BORDER = 20;
+    private JToggleButton zoomFitButton;
+    private JToggleButton zoomFullScreenButton;
+    private JButton zoomInButton;
+    private JButton zoomOutButton;
+    private JButton zoomAsIsButton;
+    private JPanel outerPanel;
+    private JScrollPane scroller;
+    private JFrame frame;
+    private boolean forceResizable = true;
+    private ButtonsBar buttonsBar;
+    private Surface surface;
+    private boolean isSeparateFrame;
     private final boolean isApplet;
     private ViewerInterface viewer;
     private String connectionString;
     private ConnectionPresenter presenter;
     private Rectangle oldContainerBounds;
-	private volatile boolean isFullScreen;
-	private Border oldScrollerBorder;
-	private JLayeredPane lpane;
-	private EmptyButtonsBarMouseAdapter buttonsBarMouseAdapter;
+    private volatile boolean isFullScreen;
+    private Border oldScrollerBorder;
+    private JLayeredPane lpane;
+    private EmptyButtonsBarMouseAdapter buttonsBarMouseAdapter;
     private String remoteDesktopName;
     private ProtocolSettings rfbSettings;
     private UiSettings uiSettings;
@@ -91,8 +91,8 @@
     private List<JComponent> kbdButtons;
 
     public SwingViewerWindow(Protocol workingProtocol, ProtocolSettings rfbSettings, UiSettings uiSettings, Surface surface,
-                             boolean isSeparateFrame, boolean isApplet, ViewerInterface viewer, String connectionString,
-                             ConnectionPresenter presenter, int w, int h) {
+            boolean isSeparateFrame, boolean isApplet, ViewerInterface viewer, String connectionString,
+            ConnectionPresenter presenter, int w, int h) {
         this.workingProtocol = workingProtocol;
         this.rfbSettings = rfbSettings;
         this.uiSettings = uiSettings;
@@ -106,12 +106,12 @@
         this.height = h;
 
         if(viewer instanceof Viewer)
-        	createContainer(surface, isApplet, (Viewer)viewer);
-        
+            createContainer(surface, isApplet, (Viewer)viewer);
+
 
         if (uiSettings.showControls) {
-        	if(viewer instanceof Viewer)
-        		createButtonsPanel(workingProtocol, isSeparateFrame? frame: (Viewer)viewer);
+            if(viewer instanceof Viewer)
+                createButtonsPanel(workingProtocol, isSeparateFrame? frame: (Viewer)viewer);
             if (isSeparateFrame) registerResizeListener(frame);
             updateZoomButtonsState();
         }
@@ -137,85 +137,85 @@
                 }
             }).start();
         }
-	}
+    }
 
-	private void createContainer(final Surface surface, boolean isApplet, JApplet appletWindow) {
-		outerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)) {
-			/**
+    private void createContainer(final Surface surface, boolean isApplet, JApplet appletWindow) {
+        outerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)) {
+            /**
              * 
              */
             private static final long serialVersionUID = 1L;
             @Override
-			public Dimension getSize() {
-				return surface.getPreferredSize();
-			}
-			@Override
-			public Dimension getPreferredSize() {
-				return surface.getPreferredSize();
-			}
-		};
+            public Dimension getSize() {
+                return surface.getPreferredSize();
+            }
+            @Override
+            public Dimension getPreferredSize() {
+                return surface.getPreferredSize();
+            }
+        };
         Dimension outerPanelSize = outerPanel.getSize();
         double width = outerPanelSize.getWidth();
         double height = outerPanelSize.getHeight();
         outerPanel.setBackground(Color.DARK_GRAY);
-		lpane = new JLayeredPane() {
-			/**
+        lpane = new JLayeredPane() {
+            /**
              * 
              */
             private static final long serialVersionUID = 1L;
             @Override
-			public Dimension getSize() {
-				return surface.getPreferredSize();
-			}
-			@Override
-			public Dimension getPreferredSize() {
-				return surface.getPreferredSize();
-			}
-		};
-		lpane.setPreferredSize(surface.getPreferredSize());
-		lpane.add(surface, JLayeredPane.DEFAULT_LAYER, 0);
-		outerPanel.add(lpane);
+            public Dimension getSize() {
+                return surface.getPreferredSize();
+            }
+            @Override
+            public Dimension getPreferredSize() {
+                return surface.getPreferredSize();
+            }
+        };
+        lpane.setPreferredSize(surface.getPreferredSize());
+        lpane.add(surface, JLayeredPane.DEFAULT_LAYER, 0);
+        outerPanel.add(lpane);
 
-		scroller = new JScrollPane(outerPanel);
-		if (isSeparateFrame) {
-			frame = new JFrame();
-			frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-			if ( ! isApplet) {
-				frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-			}
+        scroller = new JScrollPane(outerPanel);
+        if (isSeparateFrame) {
+            frame = new JFrame();
+            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+            if ( ! isApplet) {
+                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+            }
             frame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
-			Utils.setApplicationIconsForWindow(frame);
+            Utils.setApplicationIconsForWindow(frame);
             frame.setLayout(new BorderLayout(0, 0));
             frame.add(scroller, BorderLayout.CENTER);
 
-//			frame.pack();
+            //			frame.pack();
             outerPanel.setSize(surface.getPreferredSize());
             internalPack(null);
             if(viewer.getRfb().isTreeManager() || viewer.getCuiVersion()) {
-            	frame.setVisible(false);
-            	viewer.setCuiVersion(false);
+                frame.setVisible(false);
+                viewer.setCuiVersion(false);
             } else 
-            	frame.setVisible(true);
+                frame.setVisible(true);
             //frame.setVisible(false);
             frame.validate();
-		} else {
+        } else {
             appletWindow.setLayout(new BorderLayout(0, 0));
             appletWindow.add(scroller, BorderLayout.CENTER);
             appletWindow.validate();
-		}
-	}
+        }
+    }
 
-	public void pack() {
-		final Dimension outerPanelOldSize = outerPanel.getSize();
-		outerPanel.setSize(surface.getPreferredSize());
-		if (isSeparateFrame && ! isZoomToFitSelected()) {
-			internalPack(outerPanelOldSize);
-		}
+    public void pack() {
+        final Dimension outerPanelOldSize = outerPanel.getSize();
+        outerPanel.setSize(surface.getPreferredSize());
+        if (isSeparateFrame && ! isZoomToFitSelected()) {
+            internalPack(outerPanelOldSize);
+        }
         if (buttonsBar != null) {
             updateZoomButtonsState();
         }
         updateWindowTitle();
-	}
+    }
 
     public boolean isZoomToFitSelected() {
         return isZoomToFitSelected;
@@ -229,191 +229,191 @@
         remoteDesktopName = name;
         TreeRFBProto rfb = viewer.getRfb();
         if (rfb!=null) {
-        	int port = rfb.getAcceptPort();
-        	remoteDesktopName += ":" + port; 
+            int port = rfb.getAcceptPort();
+            remoteDesktopName += ":" + port; 
         }
         updateWindowTitle();
     }
 
     private void updateWindowTitle() {
         if (isSeparateFrame) {
-			frame.setTitle(remoteDesktopName + " [zoom: " + uiSettings.getScalePercentFormatted() + "%]");
-		}
+            frame.setTitle(remoteDesktopName + " [zoom: " + uiSettings.getScalePercentFormatted() + "%]");
+        }
     }
 
-	private void internalPack(Dimension outerPanelOldSize) {
-		final Rectangle workareaRectangle = getWorkareaRectangle();
-		if (workareaRectangle.equals(frame.getBounds())) {
-			forceResizable = true;
-		}
-		final boolean isHScrollBar = scroller.getHorizontalScrollBar().isShowing() && ! forceResizable;
-		final boolean isVScrollBar = scroller.getVerticalScrollBar().isShowing() && ! forceResizable;
+    private void internalPack(Dimension outerPanelOldSize) {
+        final Rectangle workareaRectangle = getWorkareaRectangle();
+        if (workareaRectangle.equals(frame.getBounds())) {
+            forceResizable = true;
+        }
+        final boolean isHScrollBar = scroller.getHorizontalScrollBar().isShowing() && ! forceResizable;
+        final boolean isVScrollBar = scroller.getVerticalScrollBar().isShowing() && ! forceResizable;
 
-		boolean isWidthChangeable = true;
-		boolean isHeightChangeable = true;
-		if (outerPanelOldSize != null && surface.oldSize != null) {
-			isWidthChangeable = forceResizable ||
-					(outerPanelOldSize.width == surface.oldSize.width && ! isHScrollBar);
-			isHeightChangeable = forceResizable ||
-					(outerPanelOldSize.height == surface.oldSize.height && ! isVScrollBar);
-		}
-		forceResizable = false;
-		frame.validate();
+        boolean isWidthChangeable = true;
+        boolean isHeightChangeable = true;
+        if (outerPanelOldSize != null && surface.oldSize != null) {
+            isWidthChangeable = forceResizable ||
+                    (outerPanelOldSize.width == surface.oldSize.width && ! isHScrollBar);
+            isHeightChangeable = forceResizable ||
+                    (outerPanelOldSize.height == surface.oldSize.height && ! isVScrollBar);
+        }
+        forceResizable = false;
+        frame.validate();
 
-		final Insets containerInsets = frame.getInsets();
-		Dimension preferredSize = frame.getPreferredSize();
-		Rectangle preferredRectangle = new Rectangle(frame.getLocation(), preferredSize);
+        final Insets containerInsets = frame.getInsets();
+        Dimension preferredSize = frame.getPreferredSize();
+        Rectangle preferredRectangle = new Rectangle(frame.getLocation(), preferredSize);
 
-		if (null == outerPanelOldSize && workareaRectangle.contains(preferredRectangle)) {
-			frame.pack();
-		} else {
-			Dimension minDimension = new Dimension(
-					containerInsets.left + containerInsets.right, containerInsets.top + containerInsets.bottom);
-			if (buttonsBar != null && buttonsBar.isVisible) {
-				minDimension.width += buttonsBar.getWidth();
-				minDimension.height += buttonsBar.getHeight();
-			}
-			Dimension dim = new Dimension(preferredSize);
-			Point location = frame.getLocation();
-			if ( ! isWidthChangeable) {
-				dim.width = frame.getWidth();
-			} else {
+        if (null == outerPanelOldSize && workareaRectangle.contains(preferredRectangle)) {
+            frame.pack();
+        } else {
+            Dimension minDimension = new Dimension(
+                    containerInsets.left + containerInsets.right, containerInsets.top + containerInsets.bottom);
+            if (buttonsBar != null && buttonsBar.isVisible) {
+                minDimension.width += buttonsBar.getWidth();
+                minDimension.height += buttonsBar.getHeight();
+            }
+            Dimension dim = new Dimension(preferredSize);
+            Point location = frame.getLocation();
+            if ( ! isWidthChangeable) {
+                dim.width = frame.getWidth();
+            } else {
                 // このあたり、scalepercentを計算するのに使えそう
-				if (isVScrollBar) dim.width += scroller.getVerticalScrollBar().getWidth();
-				if (dim.width < minDimension.width) dim.width = minDimension.width;
+                if (isVScrollBar) dim.width += scroller.getVerticalScrollBar().getWidth();
+                if (dim.width < minDimension.width) dim.width = minDimension.width;
 
-				int dx = location.x - workareaRectangle.x;
-				if (dx < 0) {
-					dx = 0;
-					location.x = workareaRectangle.x;
-				}
-				int w = workareaRectangle.width - dx;
-				if (w < dim.width) {
-					int dw = dim.width - w;
-					if (dw < dx) {
-						location.x -= dw;
-					} else {
-						dim.width = workareaRectangle.width;
-						location.x = workareaRectangle.x;
-					}
-				}
-			}
-			if ( ! isHeightChangeable) {
-				dim.height = frame.getHeight();
-			} else {
+                int dx = location.x - workareaRectangle.x;
+                if (dx < 0) {
+                    dx = 0;
+                    location.x = workareaRectangle.x;
+                }
+                int w = workareaRectangle.width - dx;
+                if (w < dim.width) {
+                    int dw = dim.width - w;
+                    if (dw < dx) {
+                        location.x -= dw;
+                    } else {
+                        dim.width = workareaRectangle.width;
+                        location.x = workareaRectangle.x;
+                    }
+                }
+            }
+            if ( ! isHeightChangeable) {
+                dim.height = frame.getHeight();
+            } else {
 
-				if (isHScrollBar) dim.height += scroller.getHorizontalScrollBar().getHeight();
-				if (dim.height < minDimension.height) dim.height = minDimension.height;
+                if (isHScrollBar) dim.height += scroller.getHorizontalScrollBar().getHeight();
+                if (dim.height < minDimension.height) dim.height = minDimension.height;
 
-				int dy = location.y - workareaRectangle.y;
-				if (dy < 0) {
-					dy = 0;
-					location.y = workareaRectangle.y;
-				}
-				int h = workareaRectangle.height - dy;
-				if (h < dim.height) {
-					int dh = dim.height - h;
-					if (dh < dy) {
-						location.y -= dh;
-					} else {
-						dim.height = workareaRectangle.height;
-						location.y = workareaRectangle.y;
-					}
-				}
-			}
+                int dy = location.y - workareaRectangle.y;
+                if (dy < 0) {
+                    dy = 0;
+                    location.y = workareaRectangle.y;
+                }
+                int h = workareaRectangle.height - dy;
+                if (h < dim.height) {
+                    int dh = dim.height - h;
+                    if (dh < dy) {
+                        location.y -= dh;
+                    } else {
+                        dim.height = workareaRectangle.height;
+                        location.y = workareaRectangle.y;
+                    }
+                }
+            }
             // set full size
             /*
             dim.width = workareaRectangle.width;
             dim.height = workareaRectangle.height;
-            */
-			if ( ! location.equals(frame.getLocation())) {
-				frame.setLocation(location);
-			}
-			if ( ! isFullScreen ) {
-				frame.setSize(dim);
-			}
-		}
-		scroller.revalidate();
-	}
+             */
+            if ( ! location.equals(frame.getLocation())) {
+                frame.setLocation(location);
+            }
+            if ( ! isFullScreen ) {
+                frame.setSize(dim);
+            }
+        }
+        scroller.revalidate();
+    }
 
-	private Rectangle getWorkareaRectangle() {
-		final GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration();
-		final Rectangle screenBounds = graphicsConfiguration.getBounds();
-		final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration);
+    private Rectangle getWorkareaRectangle() {
+        final GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration();
+        final Rectangle screenBounds = graphicsConfiguration.getBounds();
+        final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration);
 
-		screenBounds.x += screenInsets.left;
-		screenBounds.y += screenInsets.top;
-		if (width != 0) {
-		    screenBounds.width = width;
-		    screenBounds.height = height;
-		} else {
-		    screenBounds.width -= screenInsets.left + screenInsets.right;
-		    screenBounds.height -= screenInsets.top + screenInsets.bottom;
+        screenBounds.x += screenInsets.left;
+        screenBounds.y += screenInsets.top;
+        if (width != 0) {
+            screenBounds.width = width;
+            screenBounds.height = height;
+        } else {
+            screenBounds.width -= screenInsets.left + screenInsets.right;
+            screenBounds.height -= screenInsets.top + screenInsets.bottom;
         }
 
-		return screenBounds;
-	}
+        return screenBounds;
+    }
 
-	void addZoomButtons() {
-		buttonsBar.createStrut();
-		zoomOutButton = buttonsBar.createButton("zoom-out", "Zoom Out", new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				zoomFitButton.setSelected(false);
+    void addZoomButtons() {
+        buttonsBar.createStrut();
+        zoomOutButton = buttonsBar.createButton("zoom-out", "Zoom Out", new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                zoomFitButton.setSelected(false);
                 uiSettings.zoomOut();
-			}
-		});
-		zoomInButton = buttonsBar.createButton("zoom-in", "Zoom In", new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				zoomFitButton.setSelected(false);
+            }
+        });
+        zoomInButton = buttonsBar.createButton("zoom-in", "Zoom In", new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                zoomFitButton.setSelected(false);
                 uiSettings.zoomIn();
-			}
-		});
-		zoomAsIsButton = buttonsBar.createButton("zoom-100", "Zoom 100%", new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				zoomFitButton.setSelected(false);
-				forceResizable = false;
+            }
+        });
+        zoomAsIsButton = buttonsBar.createButton("zoom-100", "Zoom 100%", new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                zoomFitButton.setSelected(false);
+                forceResizable = false;
                 uiSettings.zoomAsIs();
-			}
-		});
+            }
+        });
 
-		zoomFitButton = buttonsBar.createToggleButton("zoom-fit", "Zoom to Fit Window",
-				new ItemListener() {
-					@Override
-					public void itemStateChanged(ItemEvent e) {
-						if (e.getStateChange() == ItemEvent.SELECTED) {
-							setZoomToFitSelected(true);
-							forceResizable = true;
-							zoomToFit();
-							updateZoomButtonsState();
-						} else {
-							setZoomToFitSelected(false);
-						}
-						setSurfaceToHandleKbdFocus();
-					}
-				});
+        zoomFitButton = buttonsBar.createToggleButton("zoom-fit", "Zoom to Fit Window",
+                new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    setZoomToFitSelected(true);
+                    forceResizable = true;
+                    zoomToFit();
+                    updateZoomButtonsState();
+                } else {
+                    setZoomToFitSelected(false);
+                }
+                setSurfaceToHandleKbdFocus();
+            }
+        });
 
-		zoomFullScreenButton = buttonsBar.createToggleButton("zoom-fullscreen", "Full Screen",
-			new ItemListener() {
-				@Override
-				public void itemStateChanged(ItemEvent e) {
-					updateZoomButtonsState();
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-                        uiSettings.setFullScreen(switchOnFullscreenMode());
-					} else {
-						switchOffFullscreenMode();
-                        uiSettings.setFullScreen(false);
-					}
-					setSurfaceToHandleKbdFocus();
-				}
-			});
-			if ( ! isSeparateFrame) {
-				zoomFullScreenButton.setEnabled(false);
-				zoomFitButton.setEnabled(false);
-			}
-		}
+        zoomFullScreenButton = buttonsBar.createToggleButton("zoom-fullscreen", "Full Screen",
+                new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                updateZoomButtonsState();
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    uiSettings.setFullScreen(switchOnFullscreenMode());
+                } else {
+                    switchOffFullscreenMode();
+                    uiSettings.setFullScreen(false);
+                }
+                setSurfaceToHandleKbdFocus();
+            }
+        });
+        if ( ! isSeparateFrame) {
+            zoomFullScreenButton.setEnabled(false);
+            zoomFitButton.setEnabled(false);
+        }
+    }
 
     protected void setSurfaceToHandleKbdFocus() {
         if (surface != null && ! surface.requestFocusInWindow()) {
@@ -422,121 +422,121 @@
     }
 
     boolean switchOnFullscreenMode() {
-		zoomFullScreenButton.setSelected(true);
-		oldContainerBounds = frame.getBounds();
-		setButtonsBarVisible(false);
-		forceResizable = true;
-		frame.dispose();
-		frame.setUndecorated(true);
-		frame.setResizable(false);
-		frame.setVisible(true);
-		try {
-			frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(frame);
-			isFullScreen = true;
-			scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
-			scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
-			oldScrollerBorder = scroller.getBorder();
-			scroller.setBorder(new EmptyBorder(0, 0, 0, 0));
-			new FullscreenBorderDetectionThread(frame).start();
-		} catch (Exception ex) {
+        zoomFullScreenButton.setSelected(true);
+        oldContainerBounds = frame.getBounds();
+        setButtonsBarVisible(false);
+        forceResizable = true;
+        frame.dispose();
+        frame.setUndecorated(true);
+        frame.setResizable(false);
+        frame.setVisible(true);
+        try {
+            frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(frame);
+            isFullScreen = true;
+            scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
+            scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+            oldScrollerBorder = scroller.getBorder();
+            scroller.setBorder(new EmptyBorder(0, 0, 0, 0));
+            new FullscreenBorderDetectionThread(frame).start();
+        } catch (Exception ex) {
             Logger.getLogger(this.getClass().getName()).info("Cannot switch into FullScreen mode: " + ex.getMessage());
-			return false;
-		}
+            return false;
+        }
         return true;
-	}
+    }
 
-	private void switchOffFullscreenMode() {
-		if (isFullScreen) {
-			zoomFullScreenButton.setSelected(false);
-			isFullScreen = false;
-			setButtonsBarVisible(true);
-			try {
-				frame.dispose();
-				frame.setUndecorated(false);
-				frame.setResizable(true);
-				frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(null);
-			} catch (Exception e) {
-				// nop
-			}
-			scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
-			scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-			scroller.setBorder(oldScrollerBorder);
-			this.frame.setBounds(oldContainerBounds);
-			frame.setVisible(true);
-			pack();
-		}
-	}
+    private void switchOffFullscreenMode() {
+        if (isFullScreen) {
+            zoomFullScreenButton.setSelected(false);
+            isFullScreen = false;
+            setButtonsBarVisible(true);
+            try {
+                frame.dispose();
+                frame.setUndecorated(false);
+                frame.setResizable(true);
+                frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(null);
+            } catch (Exception e) {
+                // nop
+            }
+            scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
+            scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+            scroller.setBorder(oldScrollerBorder);
+            this.frame.setBounds(oldContainerBounds);
+            frame.setVisible(true);
+            pack();
+        }
+    }
 
-	private void zoomToFit() {
-		Dimension scrollerSize = scroller.getSize();
-		Insets scrollerInsets = scroller.getInsets();
+    private void zoomToFit() {
+        Dimension scrollerSize = scroller.getSize();
+        Insets scrollerInsets = scroller.getInsets();
         uiSettings.zoomToFit(scrollerSize.width - scrollerInsets.left - scrollerInsets.right,
                 scrollerSize.height - scrollerInsets.top - scrollerInsets.bottom +
-                        (isFullScreen ? buttonsBar.getHeight() : 0),
+                (isFullScreen ? buttonsBar.getHeight() : 0),
                 workingProtocol.getFbWidth(), workingProtocol.getFbHeight());
-	}
+    }
 
-	void registerResizeListener(Container container) {
-		container.addComponentListener(new ComponentAdapter() {
-			@Override
-			public void componentResized(ComponentEvent e) {
-				if (isZoomToFitSelected()) {
-					zoomToFit();
-					updateZoomButtonsState();
-					updateWindowTitle();
-					setSurfaceToHandleKbdFocus();
-				}
-			}
-		});
-	}
+    void registerResizeListener(Container container) {
+        container.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                if (isZoomToFitSelected()) {
+                    zoomToFit();
+                    updateZoomButtonsState();
+                    updateWindowTitle();
+                    setSurfaceToHandleKbdFocus();
+                }
+            }
+        });
+    }
 
-	void updateZoomButtonsState() {
-		zoomOutButton.setEnabled(uiSettings.getScalePercent() > UiSettings.MIN_SCALE_PERCENT);
-		zoomInButton.setEnabled(uiSettings.getScalePercent() < UiSettings.MAX_SCALE_PERCENT);
-		zoomAsIsButton.setEnabled(uiSettings.getScalePercent() != 100);
-	}
+    void updateZoomButtonsState() {
+        zoomOutButton.setEnabled(uiSettings.getScalePercent() > UiSettings.MIN_SCALE_PERCENT);
+        zoomInButton.setEnabled(uiSettings.getScalePercent() < UiSettings.MAX_SCALE_PERCENT);
+        zoomAsIsButton.setEnabled(uiSettings.getScalePercent() != 100);
+    }
 
-	public ButtonsBar createButtonsBar() {
-		buttonsBar = new ButtonsBar();
-		return buttonsBar;
-	}
+    public ButtonsBar createButtonsBar() {
+        buttonsBar = new ButtonsBar();
+        return buttonsBar;
+    }
 
     public void setButtonsBarVisible(boolean isVisible) {
         setButtonsBarVisible(isVisible, frame);
     }
 
-	private void setButtonsBarVisible(boolean isVisible, Container container) {
-		buttonsBar.setVisible(isVisible);
-		if (isVisible) {
-			buttonsBar.borderOff();
-			container.add(buttonsBar.bar, BorderLayout.NORTH);
+    private void setButtonsBarVisible(boolean isVisible, Container container) {
+        buttonsBar.setVisible(isVisible);
+        if (isVisible) {
+            buttonsBar.borderOff();
+            container.add(buttonsBar.bar, BorderLayout.NORTH);
             container.validate();
-		} else {
-			container.remove(buttonsBar.bar);
-			buttonsBar.borderOn();
-		}
-	}
+        } else {
+            container.remove(buttonsBar.bar);
+            buttonsBar.borderOn();
+        }
+    }
 
-	public void setButtonsBarVisibleFS(boolean isVisible) {
-		if (isVisible) {
-			if ( ! buttonsBar.isVisible) {
-				lpane.add(buttonsBar.bar, JLayeredPane.POPUP_LAYER, 0);
-				final int bbWidth = buttonsBar.bar.getPreferredSize().width;
-				buttonsBar.bar.setBounds(
-						scroller.getViewport().getViewPosition().x + (scroller.getWidth() - bbWidth)/2, 0,
-						bbWidth, buttonsBar.bar.getPreferredSize().height);
+    public void setButtonsBarVisibleFS(boolean isVisible) {
+        if (isVisible) {
+            if ( ! buttonsBar.isVisible) {
+                lpane.add(buttonsBar.bar, JLayeredPane.POPUP_LAYER, 0);
+                final int bbWidth = buttonsBar.bar.getPreferredSize().width;
+                buttonsBar.bar.setBounds(
+                        scroller.getViewport().getViewPosition().x + (scroller.getWidth() - bbWidth)/2, 0,
+                        bbWidth, buttonsBar.bar.getPreferredSize().height);
 
-				// prevent mouse events to through down to Surface
-				if (null == buttonsBarMouseAdapter) buttonsBarMouseAdapter = new EmptyButtonsBarMouseAdapter();
-				buttonsBar.bar.addMouseListener(buttonsBarMouseAdapter);
-			}
-		} else {
-			buttonsBar.bar.removeMouseListener(buttonsBarMouseAdapter);
-			lpane.remove(buttonsBar.bar);
-			lpane.repaint(buttonsBar.bar.getBounds());
-		}
-		buttonsBar.setVisible(isVisible);
-	}
+                // prevent mouse events to through down to Surface
+                if (null == buttonsBarMouseAdapter) buttonsBarMouseAdapter = new EmptyButtonsBarMouseAdapter();
+                buttonsBar.bar.addMouseListener(buttonsBarMouseAdapter);
+            }
+        } else {
+            buttonsBar.bar.removeMouseListener(buttonsBarMouseAdapter);
+            lpane.remove(buttonsBar.bar);
+            lpane.repaint(buttonsBar.bar.getBounds());
+        }
+        buttonsBar.setVisible(isVisible);
+    }
 
     public Surface getSurface() {
         return surface;
@@ -550,223 +550,223 @@
     }
 
     public static class ButtonsBar {
-		private static final Insets BUTTONS_MARGIN = new Insets(2, 2, 2, 2);
-		private JPanel bar;
-		private boolean isVisible;
+        private static final Insets BUTTONS_MARGIN = new Insets(2, 2, 2, 2);
+        private JPanel bar;
+        private boolean isVisible;
 
-		public ButtonsBar() {
-			bar = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 1));
-		}
+        public ButtonsBar() {
+            bar = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 1));
+        }
 
-		public JButton createButton(String iconId, String tooltipText, ActionListener actionListener) {
-			JButton button = new JButton(Utils.getButtonIcon(iconId));
-			button.setToolTipText(tooltipText);
-			button.setMargin(BUTTONS_MARGIN);
-			bar.add(button);
-			button.addActionListener(actionListener);
-			return button;
-		}
+        public JButton createButton(String iconId, String tooltipText, ActionListener actionListener) {
+            JButton button = new JButton(Utils.getButtonIcon(iconId));
+            button.setToolTipText(tooltipText);
+            button.setMargin(BUTTONS_MARGIN);
+            bar.add(button);
+            button.addActionListener(actionListener);
+            return button;
+        }
 
-		public void createStrut() {
-			bar.add(Box.createHorizontalStrut(10));
-		}
+        public void createStrut() {
+            bar.add(Box.createHorizontalStrut(10));
+        }
 
-		public JToggleButton createToggleButton(String iconId, String tooltipText, ItemListener itemListener) {
-			JToggleButton button = new JToggleButton(Utils.getButtonIcon(iconId));
-			button.setToolTipText(tooltipText);
-			button.setMargin(BUTTONS_MARGIN);
-			bar.add(button);
-			button.addItemListener(itemListener);
-			return button;
-		}
+        public JToggleButton createToggleButton(String iconId, String tooltipText, ItemListener itemListener) {
+            JToggleButton button = new JToggleButton(Utils.getButtonIcon(iconId));
+            button.setToolTipText(tooltipText);
+            button.setMargin(BUTTONS_MARGIN);
+            bar.add(button);
+            button.addItemListener(itemListener);
+            return button;
+        }
 
-		public void setVisible(boolean isVisible) {
-			this.isVisible = isVisible;
+        public void setVisible(boolean isVisible) {
+            this.isVisible = isVisible;
             if (isVisible) bar.revalidate();
-		}
+        }
 
-		public int getWidth() {
-			return bar.getMinimumSize().width;
-		}
-		public int getHeight() {
-			return bar.getMinimumSize().height;
-		}
+        public int getWidth() {
+            return bar.getMinimumSize().width;
+        }
+        public int getHeight() {
+            return bar.getMinimumSize().height;
+        }
 
-		public void borderOn() {
-			bar.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
-		}
+        public void borderOn() {
+            bar.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+        }
 
-		public void borderOff() {
-			bar.setBorder(BorderFactory.createEmptyBorder());
-		}
-	}
+        public void borderOff() {
+            bar.setBorder(BorderFactory.createEmptyBorder());
+        }
+    }
 
-	private static class EmptyButtonsBarMouseAdapter extends MouseAdapter {
-		// empty
-	}
+    private static class EmptyButtonsBarMouseAdapter extends MouseAdapter {
+        // empty
+    }
 
-	private class FullscreenBorderDetectionThread extends Thread {
-		public static final int SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS = 700;
-		private final JFrame frame;
-		private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
-		private ScheduledFuture<?> futureForShow;
-		private ScheduledFuture<?> futureForHide;
-		private Point mousePoint, oldMousePoint;
-		private Point viewPosition;
+    private class FullscreenBorderDetectionThread extends Thread {
+        public static final int SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS = 700;
+        private final JFrame frame;
+        private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
+        private ScheduledFuture<?> futureForShow;
+        private ScheduledFuture<?> futureForHide;
+        private Point mousePoint, oldMousePoint;
+        private Point viewPosition;
 
-		public FullscreenBorderDetectionThread(JFrame frame) {
-			super("FS border detector");
-			this.frame = frame;
-		}
+        public FullscreenBorderDetectionThread(JFrame frame) {
+            super("FS border detector");
+            this.frame = frame;
+        }
 
-		public void run() {
-			setPriority(Thread.MIN_PRIORITY);
-			while(isFullScreen) {
-				mousePoint = MouseInfo.getPointerInfo().getLocation();
-				if (null == oldMousePoint) oldMousePoint = mousePoint;
-				SwingUtilities.convertPointFromScreen(mousePoint, frame);
-				viewPosition = scroller.getViewport().getViewPosition();
-				processButtonsBarVisibility();
+        public void run() {
+            setPriority(Thread.MIN_PRIORITY);
+            while(isFullScreen) {
+                mousePoint = MouseInfo.getPointerInfo().getLocation();
+                if (null == oldMousePoint) oldMousePoint = mousePoint;
+                SwingUtilities.convertPointFromScreen(mousePoint, frame);
+                viewPosition = scroller.getViewport().getViewPosition();
+                processButtonsBarVisibility();
 
-				boolean needScrolling = processVScroll() || processHScroll();
-				oldMousePoint = mousePoint;
-				if (needScrolling) {
-					cancelShowExecutor();
-					setButtonsBarVisibleFS(false);
-					makeScrolling(viewPosition);
-				}
-				try {
+                boolean needScrolling = processVScroll() || processHScroll();
+                oldMousePoint = mousePoint;
+                if (needScrolling) {
+                    cancelShowExecutor();
+                    setButtonsBarVisibleFS(false);
+                    makeScrolling(viewPosition);
+                }
+                try {
                     Thread.sleep(100);
                 } catch (Exception e) {
-					// nop
-				}
-			}
-		}
+                    // nop
+                }
+            }
+        }
 
-		private boolean processHScroll() {
-			if (mousePoint.x < FS_SCROLLING_ACTIVE_BORDER) {
-				if (viewPosition.x > 0) {
-					int delta = FS_SCROLLING_ACTIVE_BORDER - mousePoint.x;
-					if (mousePoint.y != oldMousePoint.y) delta *= 2; // speedify scrolling on mouse moving
-					viewPosition.x -= delta;
-					if (viewPosition.x < 0) viewPosition.x = 0;
-					return true;
-				}
-			} else if (mousePoint.x > (frame.getWidth() - FS_SCROLLING_ACTIVE_BORDER)) {
-				final Rectangle viewRect = scroller.getViewport().getViewRect();
-				final int right = viewRect.width + viewRect.x;
-				if (right < outerPanel.getSize().width) {
-					int delta = FS_SCROLLING_ACTIVE_BORDER - (frame.getWidth() - mousePoint.x);
-					if (mousePoint.y != oldMousePoint.y) delta *= 2; // speedify scrolling on mouse moving
-					viewPosition.x += delta;
-					if (viewPosition.x + viewRect.width > outerPanel.getSize().width) viewPosition.x =
-							outerPanel.getSize().width - viewRect.width;
-					return true;
-				}
-			}
-			return false;
-		}
+        private boolean processHScroll() {
+            if (mousePoint.x < FS_SCROLLING_ACTIVE_BORDER) {
+                if (viewPosition.x > 0) {
+                    int delta = FS_SCROLLING_ACTIVE_BORDER - mousePoint.x;
+                    if (mousePoint.y != oldMousePoint.y) delta *= 2; // speedify scrolling on mouse moving
+                    viewPosition.x -= delta;
+                    if (viewPosition.x < 0) viewPosition.x = 0;
+                    return true;
+                }
+            } else if (mousePoint.x > (frame.getWidth() - FS_SCROLLING_ACTIVE_BORDER)) {
+                final Rectangle viewRect = scroller.getViewport().getViewRect();
+                final int right = viewRect.width + viewRect.x;
+                if (right < outerPanel.getSize().width) {
+                    int delta = FS_SCROLLING_ACTIVE_BORDER - (frame.getWidth() - mousePoint.x);
+                    if (mousePoint.y != oldMousePoint.y) delta *= 2; // speedify scrolling on mouse moving
+                    viewPosition.x += delta;
+                    if (viewPosition.x + viewRect.width > outerPanel.getSize().width) viewPosition.x =
+                            outerPanel.getSize().width - viewRect.width;
+                    return true;
+                }
+            }
+            return false;
+        }
 
-		private boolean processVScroll() {
-			if (mousePoint.y < FS_SCROLLING_ACTIVE_BORDER) {
-				if (viewPosition.y > 0) {
-					int delta = FS_SCROLLING_ACTIVE_BORDER - mousePoint.y;
-					if (mousePoint.x != oldMousePoint.x) delta *= 2; // speedify scrolling on mouse moving
-					viewPosition.y -= delta;
-					if (viewPosition.y < 0) viewPosition.y = 0;
-					return true;
-				}
-			} else if (mousePoint.y > (frame.getHeight() - FS_SCROLLING_ACTIVE_BORDER)) {
-				final Rectangle viewRect = scroller.getViewport().getViewRect();
-				final int bottom = viewRect.height + viewRect.y;
-				if (bottom < outerPanel.getSize().height) {
-					int delta = FS_SCROLLING_ACTIVE_BORDER - (frame.getHeight() - mousePoint.y);
-					if (mousePoint.x != oldMousePoint.x) delta *= 2; // speedify scrolling on mouse moving
-					viewPosition.y += delta;
-					if (viewPosition.y + viewRect.height > outerPanel.getSize().height) viewPosition.y =
-							outerPanel.getSize().height - viewRect.height;
-					return true;
-				}
-			}
-			return false;
-		}
+        private boolean processVScroll() {
+            if (mousePoint.y < FS_SCROLLING_ACTIVE_BORDER) {
+                if (viewPosition.y > 0) {
+                    int delta = FS_SCROLLING_ACTIVE_BORDER - mousePoint.y;
+                    if (mousePoint.x != oldMousePoint.x) delta *= 2; // speedify scrolling on mouse moving
+                    viewPosition.y -= delta;
+                    if (viewPosition.y < 0) viewPosition.y = 0;
+                    return true;
+                }
+            } else if (mousePoint.y > (frame.getHeight() - FS_SCROLLING_ACTIVE_BORDER)) {
+                final Rectangle viewRect = scroller.getViewport().getViewRect();
+                final int bottom = viewRect.height + viewRect.y;
+                if (bottom < outerPanel.getSize().height) {
+                    int delta = FS_SCROLLING_ACTIVE_BORDER - (frame.getHeight() - mousePoint.y);
+                    if (mousePoint.x != oldMousePoint.x) delta *= 2; // speedify scrolling on mouse moving
+                    viewPosition.y += delta;
+                    if (viewPosition.y + viewRect.height > outerPanel.getSize().height) viewPosition.y =
+                            outerPanel.getSize().height - viewRect.height;
+                    return true;
+                }
+            }
+            return false;
+        }
 
-		private void processButtonsBarVisibility() {
-			if (mousePoint.y < 1) {
-				cancelHideExecutor();
-				// show buttons bar after delay
-				if (! buttonsBar.isVisible && (null == futureForShow || futureForShow.isDone())) {
-					futureForShow = scheduler.schedule(new Runnable() {
-						@Override
-						public void run() {
-							showButtonsBar();
-						}
-					}, SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS, TimeUnit.MILLISECONDS);
-				}
-			} else {
-				cancelShowExecutor();
-			}
-			if (buttonsBar.isVisible && mousePoint.y <= buttonsBar.getHeight()) {
-				cancelHideExecutor();
-			}
-			if (buttonsBar.isVisible && mousePoint.y > buttonsBar.getHeight()) {
-				// hide buttons bar after delay
-				if (null == futureForHide || futureForHide.isDone()) {
-					futureForHide = scheduler.schedule(new Runnable() {
-						@Override
-						public void run() {
-							SwingUtilities.invokeLater(new Runnable() {
-								@Override
-								public void run() {
-									setButtonsBarVisibleFS(false);
-									SwingViewerWindow.this.frame.validate();
-								}
-							});
-						}
-					}, SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS, TimeUnit.MILLISECONDS);
-				}
-			}
-		}
+        private void processButtonsBarVisibility() {
+            if (mousePoint.y < 1) {
+                cancelHideExecutor();
+                // show buttons bar after delay
+                if (! buttonsBar.isVisible && (null == futureForShow || futureForShow.isDone())) {
+                    futureForShow = scheduler.schedule(new Runnable() {
+                        @Override
+                        public void run() {
+                            showButtonsBar();
+                        }
+                    }, SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS, TimeUnit.MILLISECONDS);
+                }
+            } else {
+                cancelShowExecutor();
+            }
+            if (buttonsBar.isVisible && mousePoint.y <= buttonsBar.getHeight()) {
+                cancelHideExecutor();
+            }
+            if (buttonsBar.isVisible && mousePoint.y > buttonsBar.getHeight()) {
+                // hide buttons bar after delay
+                if (null == futureForHide || futureForHide.isDone()) {
+                    futureForHide = scheduler.schedule(new Runnable() {
+                        @Override
+                        public void run() {
+                            SwingUtilities.invokeLater(new Runnable() {
+                                @Override
+                                public void run() {
+                                    setButtonsBarVisibleFS(false);
+                                    SwingViewerWindow.this.frame.validate();
+                                }
+                            });
+                        }
+                    }, SHOW_HIDE_BUTTONS_BAR_DELAY_IN_MILLS, TimeUnit.MILLISECONDS);
+                }
+            }
+        }
 
-		private void cancelHideExecutor() {
-			cancelExecutor(futureForHide);
-		}
-		private void cancelShowExecutor() {
-			cancelExecutor(futureForShow);
-		}
+        private void cancelHideExecutor() {
+            cancelExecutor(futureForHide);
+        }
+        private void cancelShowExecutor() {
+            cancelExecutor(futureForShow);
+        }
 
-		private void cancelExecutor(ScheduledFuture<?> future) {
-			if (future != null && ! future.isDone()) {
-				future.cancel(true);
-			}
-		}
+        private void cancelExecutor(ScheduledFuture<?> future) {
+            if (future != null && ! future.isDone()) {
+                future.cancel(true);
+            }
+        }
 
-		private void makeScrolling(final Point viewPosition) {
-			SwingUtilities.invokeLater(new Runnable() {
-				@Override
-				public void run() {
-					scroller.getViewport().setViewPosition(viewPosition);
-					final Point mousePosition = surface.getMousePosition();
-					if (mousePosition != null) {
-						final MouseEvent mouseEvent = new MouseEvent(frame, 0, 0, 0,
-								mousePosition.x, mousePosition.y, 0, false);
-						for (MouseMotionListener mml : surface.getMouseMotionListeners()) {
-							mml.mouseMoved(mouseEvent);
-						}
-					}
-				}
-			});
-		}
+        private void makeScrolling(final Point viewPosition) {
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    scroller.getViewport().setViewPosition(viewPosition);
+                    final Point mousePosition = surface.getMousePosition();
+                    if (mousePosition != null) {
+                        final MouseEvent mouseEvent = new MouseEvent(frame, 0, 0, 0,
+                                mousePosition.x, mousePosition.y, 0, false);
+                        for (MouseMotionListener mml : surface.getMouseMotionListeners()) {
+                            mml.mouseMoved(mouseEvent);
+                        }
+                    }
+                }
+            });
+        }
 
-		private void showButtonsBar() {
-			SwingUtilities.invokeLater(new Runnable() {
-				@Override
-				public void run() {
-					setButtonsBarVisibleFS(true);
-				}
-			});
-		}
-	}
+        private void showButtonsBar() {
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    setButtonsBarVisibleFS(true);
+                }
+            });
+        }
+    }
 
     protected void createButtonsPanel(final ProtocolContext context, Container container) {
         final SwingViewerWindow.ButtonsBar buttonsBar = createButtonsBar();
@@ -823,55 +823,40 @@
 
         JToggleButton ctrlButton = buttonsBar.createToggleButton("ctrl", "Ctrl Lock",
                 new ItemListener() {
-                    @Override
-                    public void itemStateChanged(ItemEvent e) {
-                        if (e.getStateChange() == ItemEvent.SELECTED) {
-                            context.sendMessage(new KeyEventMessage(Keymap.K_CTRL_LEFT, true));
-                        } else {
-                            context.sendMessage(new KeyEventMessage(Keymap.K_CTRL_LEFT, false));
-                        }
-                        setSurfaceToHandleKbdFocus();
-                    }
-                });
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    context.sendMessage(new KeyEventMessage(Keymap.K_CTRL_LEFT, true));
+                } else {
+                    context.sendMessage(new KeyEventMessage(Keymap.K_CTRL_LEFT, false));
+                }
+                setSurfaceToHandleKbdFocus();
+            }
+        });
         kbdButtons.add(ctrlButton);
 
         JToggleButton altButton = buttonsBar.createToggleButton("alt", "Alt Lock",
                 new ItemListener() {
-                    @Override
-                    public void itemStateChanged(ItemEvent e) {
-                        if (e.getStateChange() == ItemEvent.SELECTED) {
-                            context.sendMessage(new KeyEventMessage(Keymap.K_ALT_LEFT, true));
-                        } else {
-                            context.sendMessage(new KeyEventMessage(Keymap.K_ALT_LEFT, false));
-                        }
-                        setSurfaceToHandleKbdFocus();
-                    }
-                });
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    context.sendMessage(new KeyEventMessage(Keymap.K_ALT_LEFT, true));
+                } else {
+                    context.sendMessage(new KeyEventMessage(Keymap.K_ALT_LEFT, false));
+                }
+                setSurfaceToHandleKbdFocus();
+            }
+        });
         kbdButtons.add(altButton);
 
         JButton screenButton = buttonsBar.createButton("share", "Share my screen", new ActionListener() {
-        	@Override
-        	public void actionPerformed(ActionEvent e) {
-
+            @Override
+            public void actionPerformed(ActionEvent e) {
                 ArrayList<Rectangle> rectangles = viewer.getScreenRectangles();
                 int leftScreenNumber = 0;
-                int rightScreenNumber = 1;
                 int singleWidth = (int) rectangles.get(leftScreenNumber).getWidth();
                 int singleHeight = (int) rectangles.get(leftScreenNumber).getHeight();
                 viewer.getRfb().setSingleDisplaySize(singleWidth, singleHeight);
-                /*
-                // show share sound dialog.
-                boolean setShareSound = presenter.showShareSoundDialog();
-                if (setShareSound) {
-                    try {
-                        shareSound(viewer.getRfb().isTreeManager(), context);
-                    } catch (SocketException e1) {
-                        e1.printStackTrace();
-                    } catch (UnknownHostException e1) {
-                        e1.printStackTrace();
-                    }
-                }
-                */
                 if (viewer.getRfb().isTreeManager()) {
                     changeVncServer(viewer, singleWidth, singleHeight, viewer.getRfb().getId());
                     return;
@@ -882,20 +867,10 @@
         });
         kbdButtons.add(screenButton);
 
-        /*
-        final JButton soundButton = buttonsBar.createButton("share-sound", "Shara Sound", new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                // 再生するかどうかボタンにしよう
-            }
-        });
-        kbdButtons.add(soundButton);
-        */
-
         final JButton adjustHdSizeButton = buttonsBar.createButton("adjust-hd", "Adjust Hd Size", new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-//                adjustHdSizeButton.setSelected(false);
+                //                adjustHdSizeButton.setSelected(false);
                 int singleWidth = viewer.getRfb().getSingleWidth();
                 int singleHeight = viewer.getRfb().getSingleHeight();
                 if (viewer.getRfb().isTreeManager()) {
@@ -934,9 +909,9 @@
         modifierButtonListener.addButton(KeyEvent.VK_ALT, altButton);
         surface.addModifierListener(modifierButtonListener);
 
-//		JButton fileTransferButton = new JButton(Utils.getButtonIcon("file-transfer"));
-//		fileTransferButton.setMargin(buttonsMargin);
-//		buttonBar.add(fileTransferButton);
+        //		JButton fileTransferButton = new JButton(Utils.getButtonIcon("file-transfer"));
+        //		fileTransferButton.setMargin(buttonsMargin);
+        //		buttonBar.add(fileTransferButton);
 
         buttonsBar.createStrut();
 
@@ -1010,16 +985,16 @@
         message.append("Host: ").append(connectionString).append("\n\n");
 
         message.append("Desktop geometry: ")
-                .append(String.valueOf(surface.getWidth()))
-                .append(" \u00D7 ") // multiplication sign
-                .append(String.valueOf(surface.getHeight())).append("\n");
+        .append(String.valueOf(surface.getWidth()))
+        .append(" \u00D7 ") // multiplication sign
+        .append(String.valueOf(surface.getHeight())).append("\n");
         message.append("Color format: ")
-                .append(String.valueOf(Math.round(Math.pow(2, workingProtocol.getPixelFormat().depth))))
-                .append(" colors (")
-                .append(String.valueOf(workingProtocol.getPixelFormat().depth))
-                .append(" bits)\n");
+        .append(String.valueOf(Math.round(Math.pow(2, workingProtocol.getPixelFormat().depth))))
+        .append(" colors (")
+        .append(String.valueOf(workingProtocol.getPixelFormat().depth))
+        .append(" bits)\n");
         message.append("Current protocol version: ")
-                .append(workingProtocol.getProtocolVersion());
+        .append(workingProtocol.getProtocolVersion());
         if (workingProtocol.isTight()) {
             message.append("tight");
         }
@@ -1031,9 +1006,9 @@
         infoDialog.setVisible(true);
     }
 
-	public void setVisible(boolean b) {
-		frame.setVisible(b);
-	}
+    public void setVisible(boolean b) {
+        frame.setVisible(b);
+    }
 
     private void changeVncServer(ViewerInterface viewer, int width, int height, short id) {
         String localhost = "127.0.0.1";