/** * This example shows the usage of a minimizer and a maximizer. * The minimizer is a com.javadocking.visualizer.WindowMinimizer. * The maximizer is a com.javadocking.visualizer.SingleMaximizer. * The dockables have actions to minimize, maximize, and restore itself. * Some dockables are already minimized, when the application is started. * * @author Heidi Rakels */ public class WindowMinimizerExample extends JPanel { // Static fields. public static final int FRAME_WIDTH = 800; public static final int FRAME_HEIGHT = 550; // Constructor. public WindowMinimizerExample(JFrame frame) { super(new BorderLayout()); // Create the dock model for the docks. FloatDockModel dockModel = new FloatDockModel(); dockModel.addOwner("frame0", frame); // Give the dock model to the docking manager. DockingManager.setDockModel(dockModel); // Create the content components. TextPanel textPanel1 = new TextPanel("I am window 1."); TextPanel textPanel2 = new TextPanel("I am window 2."); TextPanel textPanel3 = new TextPanel("I am window 3."); TextPanel textPanel4 = new TextPanel("I am window 4."); TextPanel textPanel5 = new TextPanel("I am window 5."); TextPanel textPanel6 = new TextPanel("I am window 6."); TextPanel textPanel7 = new TextPanel("I am window 7."); TextPanel textPanel8 = new TextPanel("I am window 8."); // Create the dockables around the content components. Icon icon = new ImageIcon(getClass().getResource("/com/javadocking/resources/images/text12.gif")); Dockable dockable1 = new DefaultDockable("Window1", textPanel1, "Window 1", icon); Dockable dockable2 = new DefaultDockable("Window2", textPanel2, "Window 2", icon); Dockable dockable3 = new DefaultDockable("Window3", textPanel3, "Window 3", icon); Dockable dockable4 = new DefaultDockable("Window4", textPanel4, "Window 4", icon); Dockable dockable5 = new DefaultDockable("Window5", textPanel5, "Window 5", icon); Dockable dockable6 = new DefaultDockable("Window6", textPanel6, "Window 6", icon); Dockable dockable7 = new DefaultDockable("Window7", textPanel7, "Window 7", icon); Dockable dockable8 = new DefaultDockable("Window8", textPanel8, "Window 8", icon); // Add minimize, maximize and close actions to the dockables. dockable1 = addActions(dockable1); dockable2 = addActions(dockable2); dockable3 = addActions(dockable3); dockable4 = addActions(dockable4); dockable5 = addActions(dockable5); dockable6 = addActions(dockable6); dockable7 = addActions(dockable7); dockable8 = addActions(dockable8); // Create the child tab dock. TabDock leftTabDock = new TabDock(); TabDock rightTabDock = new TabDock(); // Add the dockables to the tab dock. leftTabDock.addDockable(dockable1, new Position(0)); leftTabDock.addDockable(dockable2, new Position(1)); rightTabDock.addDockable(dockable3, new Position(0)); rightTabDock.addDockable(dockable4, new Position(1)); // Create the split dock. SplitDock splitDock = new SplitDock(); // Add the child docks to the split dock at the left and right. splitDock.addChildDock(leftTabDock, new Position(Position.LEFT)); splitDock.addChildDock(rightTabDock, new Position(Position.RIGHT)); splitDock.setDividerLocation(395); // Add the root dock to the dock model. dockModel.addRootDock("splitDock", splitDock, frame); // Create a minimizer. WindowMinimizer minimizer = new WindowMinimizer(frame, "Windows", 100, 100); dockModel.addVisualizer("minimizer", minimizer, frame); // Create a maximizer. SingleMaximizer maximizer = new SingleMaximizer(splitDock); dockModel.addVisualizer("maximizer", maximizer, frame); // Add the maximizer to the panel. this.add(maximizer, BorderLayout.CENTER); // Minimize dockables. minimizer.visualizeDockable(dockable5); minimizer.visualizeDockable(dockable6); minimizer.visualizeDockable(dockable7); minimizer.visualizeDockable(dockable8); // Add the path of the dockables that are not docked already. DockingPath dockingPathToCopy1 = DefaultDockingPath.createDockingPath(dockable1); DockingPath dockingPathToCopy2 = DefaultDockingPath.createDockingPath(dockable3); DockingPath dockingPath5 = DefaultDockingPath.copyDockingPath(dockable5, dockingPathToCopy1); DockingPath dockingPath6 = DefaultDockingPath.copyDockingPath(dockable6, dockingPathToCopy1); DockingPath dockingPath7 = DefaultDockingPath.copyDockingPath(dockable7, dockingPathToCopy2); DockingPath dockingPath8 = DefaultDockingPath.copyDockingPath(dockable8, dockingPathToCopy2); DockingManager.getDockingPathModel().add(dockingPath5); DockingManager.getDockingPathModel().add(dockingPath6); DockingManager.getDockingPathModel().add(dockingPath7); DockingManager.getDockingPathModel().add(dockingPath8); } /** * Decorates the given dockable with a state actions. * * @param dockable The dockable to decorate. * @return The wrapper around the given dockable, with actions. */ private Dockable addActions(Dockable dockable) { Dockable wrapper = new StateActionDockable(dockable, new DefaultDockableStateActionFactory(), new int[0]); int[] states = {DockableState.NORMAL, DockableState.MINIMIZED, DockableState.MAXIMIZED}; wrapper = new StateActionDockable(wrapper, new DefaultDockableStateActionFactory(), states); return wrapper; } /** * This is the class for the content. */ private class TextPanel extends JPanel implements DraggableContent { private JLabel label; public TextPanel(String text) { super(new FlowLayout()); // The panel. setMinimumSize(new Dimension(80,80)); setPreferredSize(new Dimension(150,150)); setBackground(Color.white); setBorder(BorderFactory.createLineBorder(Color.lightGray)); // The label. label = new JLabel(text); label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); add(label); } // Implementations of DraggableContent. public void addDragListener(DragListener dragListener) { addMouseListener(dragListener); addMouseMotionListener(dragListener); label.addMouseListener(dragListener); label.addMouseMotionListener(dragListener); } } /** * A visualizer that shows minimized dockables in a dialog. * * @author Heidi Rakels. */ private class WindowMinimizer implements Visualizer { // Fields. /** The panel with the minimizers. */ private MinimizerPanel minimizerPanel; /** The dialog that contains the minimized dockable headers. */ private JDialog dialog; // Constructors. /** * Constructs a visualizer that shows minimized dockables in a dialog. * * @param owner The window owner. * @param title The window title. * @param x The x-position for the window. * @param y The y-position for the window. */ public WindowMinimizer(JFrame owner, String title, int x, int y) { minimizerPanel = new MinimizerPanel(MinimizerPanel.ORIENTATION_VERTICAL); // Create the dialog. dialog = new JDialog(owner); dialog.setTitle(title); dialog.setLocation(x, y); dialog.setContentPane(minimizerPanel); dialog.pack(); } /** * Constructs a visualizer that shows minimized dockables in a dialog. * * @param owner The window owner. * @param title The window title. * @param x The x-position for the window. * @param y The y-position for the window. */ public WindowMinimizer(JDialog owner, String title, int x, int y) { minimizerPanel = new MinimizerPanel(MinimizerPanel.ORIENTATION_VERTICAL); // Create the dialog. dialog = new JDialog(owner); dialog.setTitle(title); dialog.setLocation(x, y); dialog.setContentPane(minimizerPanel); dialog.pack(); } // Implementations of Visualizer. public int getState() { return minimizerPanel.getState(); } public boolean canVisualizeDockable(Dockable dockableToVisualize) { return minimizerPanel.canVisualizeDockable(dockableToVisualize); } public void visualizeDockable(Dockable dockableToVisualize) { minimizerPanel.visualizeDockable(dockableToVisualize); if (minimizerPanel.getVisualizedDockableCount() > 0) { dialog.pack(); dialog.setVisible(true); } // Don't forget this, otherwise the delegate will be registered as the visualizer. dockableToVisualize.setState(DockableState.MINIMIZED, this); } public int getVisualizedDockableCount() { return minimizerPanel.getVisualizedDockableCount(); } public Dockable getVisualizedDockable(int index) throws IndexOutOfBoundsException { return minimizerPanel.getVisualizedDockable(index); } public void removeVisualizedDockable(Dockable dockableToRemove) { minimizerPanel.removeVisualizedDockable(dockableToRemove); if (minimizerPanel.getVisualizedDockableCount() == 0) { dialog.setVisible(false); } dialog.pack(); } /** * Loads the properties of this maximizer. The dockables that were maximized, * when the model was saved, are not maximized again. */ public void loadProperties(String prefix, Properties properties, Map dockablesMap, Window owner) throws IOException { // Set the position of the dialog. int xPosition = 0; xPosition = PropertiesUtil.getInteger(properties, prefix + "xPosition", xPosition); int yPosition = 0; yPosition = PropertiesUtil.getInteger(properties, prefix + "yPosition", yPosition); dialog.setLocation(xPosition, yPosition); // Load the properties of the delegate. minimizerPanel.loadProperties(prefix, properties, dockablesMap, owner); } /** * Saves the properties of this maximizer. The dockables that are maximized, * are not saved. */ public void saveProperties(String prefix, Properties properties) { // Save the position of the dialog. PropertiesUtil.setInteger(properties, prefix + "xPosition", dialog.getLocation().x); PropertiesUtil.setInteger(properties, prefix + "yPosition", dialog.getLocation().y); // Save the properties of the delegate. minimizerPanel.saveProperties(prefix, properties); } } // Main method. public static void createAndShowGUI() { // Create the frame. JFrame frame = new JFrame("Split dock"); // Create the panel and add it to the frame. WindowMinimizerExample panel = new WindowMinimizerExample(frame); frame.getContentPane().add(panel); // Set the frame properties and show it. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((screenSize.width - FRAME_WIDTH) / 2, (screenSize.height - FRAME_HEIGHT) / 2); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setVisible(true); } public static void main(String args[]) { Runnable doCreateAndShowGUI = new Runnable() { public void run() { createAndShowGUI(); } }; SwingUtilities.invokeLater(doCreateAndShowGUI); } }