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();
  }