Mercurial > hg > Applications > TreeVNC
diff src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java @ 0:4689cc86d6cb
create TreeViewer2 Repository
author | Yu Taninari <you@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 03 Jul 2012 13:20:49 +0900 |
parents | |
children | e7ce2b2ffed8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java Tue Jul 03 13:20:49 2012 +0900 @@ -0,0 +1,279 @@ +// Copyright (C) 2010, 2011 GlavSoft LLC. +// All rights reserved. +// +//------------------------------------------------------------------------- +// This file is part of the TightVNC software. Please visit our Web site: +// +// http://www.tightvnc.com/ +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//------------------------------------------------------------------------- +// + +package com.glavsoft.viewer; + +import com.glavsoft.viewer.swing.Surface; +import com.glavsoft.viewer.swing.UiSettings; +import com.glavsoft.viewer.swing.Utils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.Serializable; + +public class ContainerManager implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + private final Viewer viewer; + private JToggleButton zoomFitButton; + private JButton zoomInButton; + private JButton zoomOutButton; + private JButton zoomAsIsButton; + private JPanel outerPanel; + private JScrollPane scroller; + private Container container; + private JPanel buttonBar; + + public ContainerManager(Viewer viewer) { this.viewer = viewer; } + + + public Container createContainer(final Surface surface, boolean isSeparateFrame, boolean isApplet) { + outerPanel = System.getProperty("os.name").toLowerCase().startsWith("windows") ? + new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)) { + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public Dimension getSize() { + return surface.getPreferredSize(); + } + } : + new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + + outerPanel.add(surface); + + JFrame frame; + scroller = new JScrollPane(outerPanel); + if (isSeparateFrame) { + frame = new JFrame(); + if ( ! isApplet) { + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + java.util.List<Image> icons = Utils.getIcons(); + if (icons.size() != 0) { + frame.setIconImages(icons); + } + container = frame; + } else { + container = viewer; + } + container.setLayout(new BorderLayout(0, 0)); + container.add(scroller, BorderLayout.CENTER); + + if (isSeparateFrame) { +// frame.pack(); + outerPanel.setSize(surface.getPreferredSize()); + internalPack(null); + container.setVisible(true); + } + container.validate(); + return container; + } + + public void pack() { + final Dimension outerPanelOldSize = outerPanel.getSize(); + outerPanel.setSize(viewer.getSurface().getPreferredSize()); + if (container != viewer && ! viewer.isZoomToFitSelected()) { + internalPack(outerPanelOldSize); + } + scroller.validate(); + updateZoomButtonsState(); + viewer.updateFrameTitle(); + } + + private void internalPack(Dimension outerPanelOldSize) { + final Rectangle workareaRectangle = getWorkareaRectangle(); + final boolean isHScrollBar = scroller.getHorizontalScrollBar().isShowing(); + final boolean isVScrollBar = scroller.getVerticalScrollBar().isShowing(); + + container.validate(); + + final Insets containerInsets = container.getInsets(); + Dimension preferredSize = container.getPreferredSize(); + Rectangle preferredRectangle = new Rectangle(container.getLocation(), preferredSize); + +// if (workareaRectangle.contains(preferredRectangle)) { + if (null == outerPanelOldSize && workareaRectangle.contains(preferredRectangle)) { + ((JFrame)container).pack(); + } else { + Dimension minDimension = new Dimension( + containerInsets.left + containerInsets.right, containerInsets.top + containerInsets.bottom); + if (buttonBar != null) { + minDimension.width += buttonBar.getMinimumSize().width; + minDimension.height += buttonBar.getMinimumSize().height; + } + Dimension dim = new Dimension(preferredSize); + Point location = container.getLocation(); + if (isHScrollBar) { + dim.width = container.getWidth(); + } else { + if (isVScrollBar) dim.width += scroller.getVerticalScrollBar().getWidth(); + if (dim.width < minDimension.width) dim.width = minDimension.width; + + int dx = 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 (isVScrollBar) { + dim.height = container.getHeight(); + } else { + + if (isHScrollBar) dim.height += scroller.getHorizontalScrollBar().getHeight(); + if (dim.height < minDimension.height) dim.height = minDimension.height; + + int dy = location.y - workareaRectangle.y; + int h = workareaRectangle.height - dy; + if (h < dim.height) { + int dh = dim.height - h; + if (dh < dy) { +// h = dim.height; + location.y -= dh; + } else { +// h = + dim.height = workareaRectangle.height; + location.y = workareaRectangle.y; + } + } + } + if ( ! location.equals(container.getLocation())) { + container.setLocation(location); + } + container.setSize(dim); + } + } + + private Rectangle getWorkareaRectangle() { + final GraphicsConfiguration graphicsConfiguration = container.getGraphicsConfiguration(); + final Rectangle screenBounds = graphicsConfiguration.getBounds(); + final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration); + + screenBounds.x += screenInsets.left; + screenBounds.y += screenInsets.top; + screenBounds.width -= screenInsets.left + screenInsets.right; + screenBounds.height -= screenInsets.top + screenInsets.bottom; + return screenBounds; + } + + void addZoomButtons(JPanel buttonBar, Insets margin) { + this.buttonBar = buttonBar; + buttonBar.add(Box.createHorizontalStrut(10)); + + zoomFitButton = new JToggleButton(Utils.getButtonIcon("zoom-fit")); + + zoomOutButton = new JButton(Utils.getButtonIcon("zoom-out")); + zoomOutButton.setToolTipText("Zoom Out"); + zoomOutButton.setMargin(margin); + buttonBar.add(zoomOutButton); + zoomOutButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + zoomFitButton.setSelected(false); + viewer.getUiSettings().zoomOut(); + } + }); + + zoomInButton = new JButton(Utils.getButtonIcon("zoom-in")); + zoomInButton.setToolTipText("Zoom In"); + zoomInButton.setMargin(margin); + buttonBar.add(zoomInButton); + zoomInButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + zoomFitButton.setSelected(false); + viewer.getUiSettings().zoomIn(); + } + }); + + zoomAsIsButton = new JButton(Utils.getButtonIcon("zoom-100")); + zoomAsIsButton.setToolTipText("Zoom 100%"); + zoomAsIsButton.setMargin(margin); + buttonBar.add(zoomAsIsButton); + zoomAsIsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + zoomFitButton.setSelected(false); + viewer.getUiSettings().zoomAsIs(); + } + }); + + zoomFitButton.setToolTipText("Zoom to Fit Window"); + zoomFitButton.setMargin(margin); + buttonBar.add(zoomFitButton); + + zoomFitButton.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + viewer.setZoomToFitSelected(true); + zoomToFit(); + updateZoomButtonsState(); + } else { + viewer.setZoomToFitSelected(false); + } + viewer.setSurfaceToHandleKbdFocus(); + } + }); + } + + private void zoomToFit() { + Dimension scrollerSize = scroller.getSize(); + Insets scrollerInsets = scroller.getInsets(); + viewer.getUiSettings().zoomToFit(scrollerSize.width - scrollerInsets.left - scrollerInsets.right, + scrollerSize.height - scrollerInsets.top - scrollerInsets.bottom, + viewer.getWorkingProtocol().getFbWidth(), viewer.getWorkingProtocol().getFbHeight()); + } + + void registerResizeListener(Container container) { + container.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + if (viewer.isZoomToFitSelected()) { + zoomToFit(); + updateZoomButtonsState(); + viewer.updateFrameTitle(); + viewer.setSurfaceToHandleKbdFocus(); + } + } + }); + } + + void updateZoomButtonsState() { + zoomOutButton.setEnabled(viewer.getUiSettings().getScalePercent() > UiSettings.MIN_SCALE_PERCENT); + zoomInButton.setEnabled(viewer.getUiSettings().getScalePercent() < UiSettings.MAX_SCALE_PERCENT); + zoomAsIsButton.setEnabled(viewer.getUiSettings().getScalePercent() != 100); + } +} \ No newline at end of file