public FloatChildDocks(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."); // 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); // Create the single child docks for the float dock. SingleDock singleDock1 = new SingleDock(); SingleDock singleDock2 = new SingleDock(); // Add the dockables to the single docks. singleDock1.addDockable(dockable1, SingleDock.SINGLE_POSITION); singleDock2.addDockable(dockable2, SingleDock.SINGLE_POSITION); // Create the tab dock. TabDock tabDock = new TabDock(); // Add the dockable to the tab dock. tabDock.addDockable(dockable3, new Position(0)); // The position for the float child docks. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int x = screenSize.width / 2 - 100; int y = screenSize.height / 2 - 100; // Get the float dock. This is a standard dock of the floating dock model. FloatDock floatDock = dockModel.getFloatDock(frame); floatDock.setChildDockFactory(new SingleDockFactory()); floatDock.setDockPriority(Priority.CAN_DOCK_WITH_PRIORITY); // Add the child docks to the float dock. floatDock.addChildDock(singleDock1, new Position(x, y, 0)); floatDock.addChildDock(singleDock2, new Position(x + 50, y + 50, 1)); // Add the 1 root dock to the dock model. dockModel.addRootDock("tabDock", tabDock, frame); // Add the split pane to the panel. add(tabDock, BorderLayout.CENTER); }
/** * Resets the cursor. Cleans up what was painted before. Searches a destination dock for the last * mouse location and tries to dock the dragged dockable in this dock. */ public void stopDragging(MouseEvent mouseEvent) { // Reset the old cursor. cursorManager.resetCursor(); // Clean up what was painted for dragging. dockableDragPainter.clear(); // Get the mouse location in screen coordinates. computeScreenLocation(mouseEvent); // Do we have to move an externalized dockable? if (draggedDockable.getState() == DockableState.EXTERNALIZED) { // Move the dockable. ExternalizedDraggerSupport.moveExternalizedDockable( draggedDockable, screenLocation, dockableOffset); // No dragging anymore. reset(); return; } // Get the destination dock. Dock[] destinationDocks = dockRetriever.retrieveHighestPriorityDock(screenLocation, draggedDockable); if (destinationDocks == null) { return; } Dock destinationDock = destinationDocks[0]; // Is the destination dock different from the origin? if (destinationDock != null) { if (!destinationDock.equals(originDock)) { // Get the mouse location for the new dock. locationInDestinationDock.setLocation(screenLocation.x, screenLocation.y); if (destinationDock instanceof Component) { SwingUtilities.convertPointFromScreen( locationInDestinationDock, (Component) destinationDock); } // Check if we can move the dock of the dockable in the float dock. if (destinationDock instanceof FloatDock) { // Get the root dock and the dock under the root. Dock rootDock = originDock; Dock dockUnderRoot = null; while (rootDock.getParentDock() != null) { dockUnderRoot = rootDock; rootDock = rootDock.getParentDock(); } // Is the root dock the float dock? if (rootDock instanceof FloatDock) { // Is the dockable already in this dock and are there no others? List childrenOfDockable = new ArrayList(); List childrenOfDock = new ArrayList(); DockingUtil.retrieveDockables(draggedDockable, childrenOfDockable); DockingUtil.retrieveDockables(dockUnderRoot, childrenOfDock); if (sameElements(childrenOfDockable, childrenOfDock)) { ((FloatDock) rootDock) .moveDock(dockUnderRoot, locationInDestinationDock, dockableOffset); return; } } } // Get the real dockable in the model with this ID. Dockable dockableWrapper = DockingUtil.retrieveDockableOfDockModel(draggedDockable.getID()); if (dockableWrapper == null) { throw new IllegalStateException( "The dragged dockable should be docked in the dock model."); } // Remove the dockable from the old dock, add to the new dock. // Use the docking manager for the addition and removal, because the listenenrs have to // informed. if (!originDock.equals(draggedDockable.getDock())) { throw new IllegalStateException("The origin dock is not the parent of the dockable."); } DockingManager.getDockingExecutor() .changeDocking( dockableWrapper, destinationDock, locationInDestinationDock, dockableOffset); // Clean the dock from which the dockable is removed. DockingManager.getDockingExecutor().cleanDock(originDock, false); } else { // Get the real dockable in the model with this ID. Dockable dockableWrapper = DockingUtil.retrieveDockableOfDockModel(draggedDockable.getID()); if (dockableWrapper == null) { throw new IllegalStateException( "The dragged dockable should be docked in the dock model."); } // Move the dockable to a new position in the same dock. if (!originDock.equals(draggedDockable.getDock())) { throw new IllegalStateException("The origin dock is not the parent of the dockable."); } DockingManager.getDockingExecutor() .changeDocking(dockableWrapper, originDock, locationInDestinationDock, new Point(0, 0)); } } // No dragging anymore. reset(); }