/** Adds a drag listener on the content component of a dockable. */
  private void createDockableDragger(Dockable dockable) {

    // Create the dragger for the dockable.
    DragListener dragListener =
        DockingManager.getDockableDragListenerFactory().createDragListener(dockable);
    dockable.getContent().addMouseListener(dragListener);
    dockable.getContent().addMouseMotionListener(dragListener);
  }
  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);
  }
  /**
   * Creates a docking path for the given dockable. It contains the information how the dockable is
   * docked now. The docking path is added to the docking path model of the docking manager.
   *
   * @param dockable The dockable for which a docking path has to be created.
   * @return The docking path model. Null if the dockable is not docked.
   */
  private DockingPath addDockingPath(Dockable dockable) {

    if (dockable.getDock() != null) {
      // Create the docking path of the dockable.
      DockingPath dockingPath = DefaultDockingPath.createDockingPath(dockable);
      DockingManager.getDockingPathModel().add(dockingPath);
      return dockingPath;
    }

    return null;
  }
  public void showPopupMenu(MouseEvent mouseEvent) {

    // Create the popup menu.
    JPopupMenu popupMenu =
        DockingManager.getComponentFactory().createPopupMenu(draggedDockable, null);

    // Show the popup menu.
    if (popupMenu != null) {
      popupMenu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
    }
  }
  public MultiWorkspaceExample(JFrame frame) {
    super(new BorderLayout());

    // 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.");
    TextPanel textPanel9 = new TextPanel("I am window 9.");
    TextPanel textPanel10 = new TextPanel("I am window 10.");
    TextPanel textPanel11 = new TextPanel("I am window 11.");
    TextPanel textPanel12 = new TextPanel("I am window 12.");
    TextPanel textPanel13 = new TextPanel("I am window 13.");
    TextPanel textPanel14 = new TextPanel("I am window 14.");

    // Create the dockables around the content components.
    Dockable[] dockables = new Dockable[14];
    dockables[0] = new DefaultDockable("Window1", textPanel1, "Window 1", null, DockingMode.ALL);
    dockables[1] = new DefaultDockable("Window2", textPanel2, "Window 2", null, DockingMode.ALL);
    dockables[2] = new DefaultDockable("Window3", textPanel3, "Window 3", null, DockingMode.ALL);
    dockables[3] = new DefaultDockable("Window4", textPanel4, "Window 4", null, DockingMode.ALL);
    dockables[4] = new DefaultDockable("Window5", textPanel5, "Window 5", null, DockingMode.ALL);
    dockables[5] = new DefaultDockable("Window6", textPanel6, "Window 6", null, DockingMode.ALL);
    dockables[6] = new DefaultDockable("Window7", textPanel7, "Window 7", null, DockingMode.ALL);
    dockables[7] = new DefaultDockable("Window8", textPanel8, "Window 8", null, DockingMode.ALL);
    dockables[8] = new DefaultDockable("Window9", textPanel9, "Window 9", null, DockingMode.ALL);
    dockables[9] = new DefaultDockable("Window10", textPanel10, "Window 10", null, DockingMode.ALL);
    dockables[10] =
        new DefaultDockable("Window11", textPanel11, "Window 11", null, DockingMode.ALL);
    dockables[11] =
        new DefaultDockable("Window12", textPanel12, "Window 12", null, DockingMode.ALL);
    dockables[12] =
        new DefaultDockable("Window13", textPanel13, "Window 13", null, DockingMode.ALL);
    dockables[13] =
        new DefaultDockable("Window14", textPanel14, "Window 14", null, DockingMode.ALL);

    // Add minimize, maximize, externalize, and close actions to the dockables.
    dockables[0] = addActions(dockables[0]);
    dockables[1] = addActions(dockables[1]);
    dockables[2] = addActions(dockables[2]);
    dockables[3] = addActions(dockables[3]);
    dockables[4] = addActions(dockables[4]);
    dockables[5] = addActions(dockables[5]);
    dockables[6] = addActions(dockables[6]);
    dockables[7] = addActions(dockables[7]);
    dockables[8] = addActions(dockables[8]);
    dockables[9] = addActions(dockables[9]);
    dockables[10] = addActions(dockables[10]);
    dockables[11] = addActions(dockables[11]);
    dockables[12] = addActions(dockables[12]);
    dockables[13] = addActions(dockables[13]);

    // Create the buttons with a dockable around.
    Dockable[] buttonDockables = createButtonDockables();

    // Create a minimizer.
    LineMinimizer minimizer1 = new LineMinimizer();
    LineMinimizer minimizer2 = new LineMinimizer();

    // Create a maximizer.
    SingleMaximizer maximizer1 = new SingleMaximizer(minimizer1);
    SingleMaximizer maximizer2 = new SingleMaximizer(minimizer2);

    // Create an externalizer.
    FloatExternalizer externalizer1 = new FloatExternalizer(frame);
    FloatExternalizer externalizer2 = new FloatExternalizer(frame);
    externalizer2.setHidden(true);

    // The UI.
    JTabbedPane tabbedPane = new JTabbedPane();
    this.add(tabbedPane, BorderLayout.CENTER);

    // Try to decode the dock model from file.
    DockModelPropertiesDecoder dockModelDecoder = new DockModelPropertiesDecoder();
    if (dockModelDecoder.canDecodeSource(SOURCE)) {
      try {
        // Create the map with the dockables, that the decoder needs.
        Map dockablesMap = new HashMap();
        for (int index = 0; index < dockables.length; index++) {
          dockablesMap.put(dockables[index].getID(), dockables[index]);
        }
        for (int index = 0; index < buttonDockables.length; index++) {
          dockablesMap.put(buttonDockables[index].getID(), buttonDockables[index]);
        }

        // Create the map with the owner windows, that the decoder needs.
        Map ownersMap = new HashMap();
        ownersMap.put(frameId, frame);

        // Create the map with the visualizers, that the decoder needs.
        Map visualizersMap = new HashMap();
        visualizersMap.put("maximizer1", maximizer1);
        visualizersMap.put("maximizer2", maximizer2);
        visualizersMap.put("minimizer1", minimizer1);
        visualizersMap.put("minimizer2", minimizer2);
        visualizersMap.put("externalizer1", externalizer1);
        visualizersMap.put("externalizer2", externalizer2);

        // Decode the file.
        dockModel =
            (DockModel) dockModelDecoder.decode(SOURCE, dockablesMap, ownersMap, visualizersMap);
      } catch (FileNotFoundException fileNotFoundException) {
        System.out.println("Could not find the file [" + SOURCE + "] with the saved dock model.");
        System.out.println("Continuing with the default dock model.");
      } catch (IOException ioException) {
        System.out.println("Could not decode a dock model: [" + ioException + "].");
        ioException.printStackTrace();
        System.out.println("Continuing with the default dock model.");
      }
    }

    // These are the root docks of the dock model.
    SplitDock splitDock1 = null;
    SplitDock splitDock2 = null;
    BorderDock toolBarBorderDock1 = null;
    BorderDock toolBarBorderDock2 = null;
    HidableFloatDock float1 = null;
    HidableFloatDock float2 = null;

    // Could we decode a dock model?
    if (dockModel == null) {
      // Create the dock model and dock model group.
      dockModel = new DefaultDockModel(SOURCE);
      dockModel.addOwner("frame", frame);

      // Give the dock model to the docking manager.
      DockingManager.setDockModel(dockModel);

      // Add visualizers.
      dockModel.addVisualizer("minimizer1", minimizer1, frame);
      dockModel.addVisualizer("minimizer2", minimizer2, frame);
      dockModel.addVisualizer("maximizer1", maximizer1, frame);
      dockModel.addVisualizer("maximizer2", maximizer2, frame);
      dockModel.addVisualizer("externalizer1", externalizer1, frame);
      dockModel.addVisualizer("externalizer2", externalizer2, frame);

      // Create the float docks.
      float1 = new HidableFloatDock(frame);
      float2 = new HidableFloatDock(frame);
      float2.setHidden(true);

      // Create the child tab docks.
      TabDock leftTabDock1 = new TabDock();
      TabDock rightTabDock1 = new TabDock();
      TabDock leftTabDock2 = new TabDock();
      TabDock rightTabDock2 = new TabDock();

      // Add the dockables to these tab docks.
      leftTabDock1.addDockable(dockables[0], new Position(0));
      leftTabDock1.addDockable(dockables[1], new Point(), new Point());
      rightTabDock1.addDockable(dockables[2], new Point(), new Point());
      rightTabDock1.addDockable(dockables[3], new Point(), new Point());
      leftTabDock2.addDockable(dockables[7], new Point(), new Point());
      leftTabDock2.addDockable(dockables[8], new Point(), new Point());
      rightTabDock2.addDockable(dockables[9], new Point(), new Point());
      rightTabDock2.addDockable(dockables[10], new Point(), new Point());

      // Create the split docks.
      splitDock1 = new SplitDock();
      splitDock2 = new SplitDock();

      // Add the child docks to the split dock at the left and right.
      splitDock1.addChildDock(leftTabDock1, new Position(Position.LEFT));
      splitDock1.addChildDock(rightTabDock1, new Position(Position.RIGHT));
      splitDock1.setDividerLocation(FRAME_WIDTH / 2);
      splitDock2.addChildDock(leftTabDock2, new Position(Position.LEFT));
      splitDock2.addChildDock(rightTabDock2, new Position(Position.RIGHT));
      splitDock2.setDividerLocation(FRAME_WIDTH / 2);

      // Create the border dock for the buttons.
      toolBarBorderDock1 = new BorderDock(new CompositeToolBarDockFactory());
      toolBarBorderDock2 = new BorderDock(new CompositeToolBarDockFactory());
      toolBarBorderDock1.setMode(BorderDock.MODE_TOOL_BAR);
      toolBarBorderDock2.setMode(BorderDock.MODE_TOOL_BAR);
      CompositeLineDock compositeToolBarDock1 =
          new CompositeLineDock(
              CompositeLineDock.ORIENTATION_HORIZONTAL,
              false,
              new ToolBarDockFactory(),
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      CompositeLineDock compositeToolBarDock2 =
          new CompositeLineDock(
              CompositeLineDock.ORIENTATION_VERTICAL,
              false,
              new ToolBarDockFactory(),
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      CompositeLineDock compositeToolBarDock3 =
          new CompositeLineDock(
              CompositeLineDock.ORIENTATION_HORIZONTAL,
              false,
              new ToolBarDockFactory(),
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      CompositeLineDock compositeToolBarDock4 =
          new CompositeLineDock(
              CompositeLineDock.ORIENTATION_VERTICAL,
              false,
              new ToolBarDockFactory(),
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      toolBarBorderDock1.setDock(compositeToolBarDock1, Position.TOP);
      toolBarBorderDock1.setDock(compositeToolBarDock2, Position.LEFT);
      toolBarBorderDock2.setDock(compositeToolBarDock3, Position.TOP);
      toolBarBorderDock2.setDock(compositeToolBarDock4, Position.LEFT);

      // The line docks for the buttons.
      LineDock toolBarDock1 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock2 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock3 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock4 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock5 =
          new LineDock(
              LineDock.ORIENTATION_VERTICAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock6 =
          new LineDock(
              LineDock.ORIENTATION_VERTICAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock7 =
          new LineDock(
              LineDock.ORIENTATION_VERTICAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);

      LineDock toolBarDock8 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock9 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock10 =
          new LineDock(
              LineDock.ORIENTATION_HORIZONTAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock11 =
          new LineDock(
              LineDock.ORIENTATION_VERTICAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);
      LineDock toolBarDock12 =
          new LineDock(
              LineDock.ORIENTATION_VERTICAL,
              false,
              DockingMode.HORIZONTAL_TOOLBAR,
              DockingMode.VERTICAL_TOOLBAR);

      GridDock toolGridDock1 = new GridDock(DockingMode.TOOL_GRID);
      GridDock toolGridDock2 = new GridDock(DockingMode.TOOL_GRID);

      // Add the dockables to the line docks and the grid dock.
      toolBarDock1.addDockable(buttonDockables[0], new Position(0));
      toolBarDock1.addDockable(buttonDockables[1], new Position(1));
      toolBarDock1.addDockable(buttonDockables[2], new Position(2));
      toolBarDock1.addDockable(buttonDockables[3], new Position(3));

      toolBarDock2.addDockable(buttonDockables[4], new Position(4));
      toolBarDock2.addDockable(buttonDockables[5], new Position(5));
      toolBarDock2.addDockable(buttonDockables[6], new Position(6));

      toolBarDock3.addDockable(buttonDockables[7], new Position(0));
      toolBarDock3.addDockable(buttonDockables[8], new Position(1));
      toolBarDock3.addDockable(buttonDockables[9], new Position(2));

      toolBarDock4.addDockable(buttonDockables[10], new Position(0));
      toolBarDock4.addDockable(buttonDockables[11], new Position(1));
      toolBarDock4.addDockable(buttonDockables[12], new Position(2));

      toolBarDock5.addDockable(buttonDockables[13], new Position(0));
      toolBarDock5.addDockable(buttonDockables[14], new Position(1));
      toolBarDock5.addDockable(buttonDockables[15], new Position(2));
      toolBarDock6.addDockable(buttonDockables[16], new Position(3));
      toolBarDock6.addDockable(buttonDockables[17], new Position(4));

      toolBarDock7.addDockable(buttonDockables[18], new Position(0));
      toolBarDock7.addDockable(buttonDockables[19], new Position(1));

      toolGridDock1.addDockable(buttonDockables[20], new Position(0));
      toolGridDock1.addDockable(buttonDockables[21], new Position(1));
      toolGridDock1.addDockable(buttonDockables[22], new Position(2));
      toolGridDock1.addDockable(buttonDockables[23], new Position(3));
      toolGridDock1.addDockable(buttonDockables[24], new Position(4));
      toolGridDock2.addDockable(buttonDockables[25], new Position(5));
      toolGridDock2.addDockable(buttonDockables[26], new Position(6));
      toolGridDock2.addDockable(buttonDockables[27], new Position(7));
      toolGridDock2.addDockable(buttonDockables[28], new Position(8));

      toolBarDock8.addDockable(buttonDockables[29], new Position(0));
      toolBarDock8.addDockable(buttonDockables[30], new Position(1));
      toolBarDock8.addDockable(buttonDockables[31], new Position(2));

      toolBarDock9.addDockable(buttonDockables[32], new Position(3));
      toolBarDock9.addDockable(buttonDockables[33], new Position(4));
      toolBarDock10.addDockable(buttonDockables[34], new Position(5));
      toolBarDock10.addDockable(buttonDockables[35], new Position(6));
      toolBarDock10.addDockable(buttonDockables[36], new Position(6));

      toolBarDock11.addDockable(buttonDockables[37], new Position(0));
      toolBarDock11.addDockable(buttonDockables[38], new Position(1));
      toolBarDock12.addDockable(buttonDockables[39], new Position(2));
      toolBarDock12.addDockable(buttonDockables[40], new Position(3));
      toolBarDock12.addDockable(buttonDockables[41], new Position(4));

      // Add the line docks and grid to their composite parents.
      compositeToolBarDock1.addChildDock(toolBarDock1, new Position(0));
      compositeToolBarDock1.addChildDock(toolBarDock2, new Position(1));
      compositeToolBarDock1.addChildDock(toolBarDock3, new Position(2));
      compositeToolBarDock1.addChildDock(toolBarDock4, new Position(3));
      compositeToolBarDock2.addChildDock(toolBarDock5, new Position(0));
      compositeToolBarDock2.addChildDock(toolBarDock6, new Position(1));
      compositeToolBarDock2.addChildDock(toolBarDock7, new Position(2));

      compositeToolBarDock3.addChildDock(toolBarDock8, new Position(0));
      compositeToolBarDock3.addChildDock(toolBarDock9, new Position(1));
      compositeToolBarDock3.addChildDock(toolBarDock10, new Position(2));
      compositeToolBarDock4.addChildDock(toolBarDock11, new Position(0));
      compositeToolBarDock4.addChildDock(toolBarDock12, new Position(1));

      float1.addChildDock(toolGridDock1, new Position(400, 300));
      float2.addChildDock(toolGridDock2, new Position(450, 350));

      // Minimize dockables.
      minimizer1.visualizeDockable(dockables[4]);
      minimizer1.visualizeDockable(dockables[5]);
      minimizer2.visualizeDockable(dockables[11]);
      minimizer2.visualizeDockable(dockables[12]);

      // Externalize dockable.
      // externalizer.visualizeDockable(dockable13);
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
      Point location = new Point((screenSize.width - 200) / 2, (screenSize.height - 200) / 2);
      externalizer1.externalizeDockable(dockables[6], location);
      externalizer2.externalizeDockable(dockables[13], location);

      // Add the root docks to the dock model.
      dockModel.addRootDock("dock1", splitDock1, frame);
      dockModel.addRootDock("dock2", splitDock2, frame);
      dockModel.addRootDock("toolBarBorderDock1", toolBarBorderDock1, frame);
      dockModel.addRootDock("toolBarBorderDock2", toolBarBorderDock2, frame);
      dockModel.addRootDock("float1", float1, frame);
      dockModel.addRootDock("float2", float2, frame);

      // Add docking paths.
      addDockingPath(dockables[0]);
      addDockingPath(dockables[1]);
      addDockingPath(dockables[2]);
      addDockingPath(dockables[3]);
      addDockingPath(dockables[4]);
      addDockingPath(dockables[5]);
      addDockingPath(dockables[7]);
      addDockingPath(dockables[8]);
      addDockingPath(dockables[9]);
      addDockingPath(dockables[10]);
      addDockingPath(dockables[11]);
      addDockingPath(dockables[12]);

      DockingPath dockingPathToCopy1 =
          DockingManager.getDockingPathModel().getDockingPath(dockables[0].getID());
      DockingPath dockingPathToCopy2 =
          DockingManager.getDockingPathModel().getDockingPath(dockables[9].getID());
      DockingPath dockingPath1 =
          DefaultDockingPath.copyDockingPath(dockables[6], dockingPathToCopy1);
      DockingPath dockingPath2 =
          DefaultDockingPath.copyDockingPath(dockables[13], dockingPathToCopy2);
      DockingManager.getDockingPathModel().add(dockingPath1);
      DockingManager.getDockingPathModel().add(dockingPath2);

    } else {

      // Get the root dock from the dock model.
      splitDock1 = (SplitDock) dockModel.getRootDock("dock1");
      splitDock2 = (SplitDock) dockModel.getRootDock("dock2");
      toolBarBorderDock1 = (BorderDock) dockModel.getRootDock("toolBarBorderDock1");
      toolBarBorderDock2 = (BorderDock) dockModel.getRootDock("toolBarBorderDock2");
      float1 = (HidableFloatDock) dockModel.getRootDock("float1");
      float2 = (HidableFloatDock) dockModel.getRootDock("float2");
    }

    // Listen when the frame is closed. The workspace should be saved.
    frame.addWindowListener(new WorkspaceSaver());

    // General code.
    tabbedPane.addTab("Workspace 1", toolBarBorderDock1);
    tabbedPane.addTab("Workspace 2", toolBarBorderDock2);

    toolBarBorderDock1.setCenterComponent(maximizer1);
    toolBarBorderDock2.setCenterComponent(maximizer2);

    minimizer1.setContent(splitDock1);
    minimizer2.setContent(splitDock2);

    // Listen to the selections of the tabs.
    SingleSelectionModel selectionModel = tabbedPane.getModel();
    selectionModel.addChangeListener(
        new TabChangelistener(tabbedPane, float1, float2, externalizer1, externalizer2));
  }
  public VisualizersExample(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.");
    TextPanel textPanel9 = new TextPanel("I am window 9.");

    // 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);
    Dockable dockable9 = new DefaultDockable("Window9", textPanel9, "Window 9", icon);

    // Add minimize, maximize, externalize, 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);
    dockable9 = addActions(dockable9);

    // 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 an externalizer.
    FloatExternalizer externalizer = new FloatExternalizer(frame);
    dockModel.addVisualizer("externalizer", externalizer, frame);

    // Create a minimizer.
    LineMinimizer minimizer = new LineMinimizer(splitDock);
    dockModel.addVisualizer("minimizer", minimizer, frame);

    // Create a maximizer.
    SingleMaximizer maximizer = new SingleMaximizer(minimizer);
    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);

    // Externalize dockable.
    // externalizer.visualizeDockable(dockable9);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Point location = new Point((screenSize.width - 200) / 2, (screenSize.height - 200) / 2);
    externalizer.externalizeDockable(dockable9, location);
  }
 /**
  * Gets the cursor that is used for dragging a dockable, when the dockable cannot be docked in an
  * underlying dock.
  *
  * @return The cursor that is used for dragging a dockable, when the dockable cannot be docked in
  *     an underlying dock.
  */
 protected Cursor retrieveCanNotDockCursor() {
   return DockingManager.getCanNotDockCursor();
 }
  /**
   * 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();
  }