public void dragDraggableComponent(DraggableComponent component, Point p) {
    if (draggableComponentList.contains(component)) {
      component.drag(SwingUtilities.convertPoint(this, p, component.getComponent()));
    }

    // component.drag(SwingUtilities.convertPoint(this, p, component.getComponent()));
  }
  public void insertDraggableComponent(DraggableComponent component, int index) {
    component.setLayoutOrderList(layoutOrderList);

    component.addListener(draggableComponentListener);
    if (index < 0) {
      layoutOrderList.add(component.getComponent());
      componentBox.add(component.getComponent());
    } else {
      layoutOrderList.add(index, component.getComponent());
      componentBox.add(component.getComponent(), index);
    }

    sortComponentList(!descendingSortOrder);

    draggableComponentList.add(component);
    component.setOuterParentArea(outerParentArea);
    componentBox.revalidate();

    fireAddedEvent(component);
    if (autoSelect
        && layoutOrderList.size() == 1
        && selectedComponent == null
        && component.isEnabled()) doSelectComponent(component);

    updateScrollButtons();
  }
 public void selectDraggableComponent(DraggableComponent component) {
   if (component == null) {
     if (selectedComponent != null) {
       DraggableComponent oldSelected = selectedComponent;
       selectedComponent = null;
       fireSelectedEvent(selectedComponent, oldSelected);
       // componentBox.repaint();
     }
   } else component.select();
 }
  public void removeDraggableComponent(DraggableComponent component) {
    if (component != null && draggableComponentList.contains(component)) {
      // component.abortDrag();
      int index = layoutOrderList.indexOf(component.getComponent());
      component.removeListener(draggableComponentListener);
      if (component == topComponent) topComponent = null;
      if (layoutOrderList.size() > 1 && selectedComponent != null) {
        if (selectedComponent == component) {
          if (autoSelect) {
            int selectIndex = findSelectableComponentIndex(index);
            if (selectIndex > -1)
              selectDraggableComponent(
                  findDraggableComponent((Component) layoutOrderList.get(selectIndex)));
            else selectedComponent = null;
          } else {
            selectDraggableComponent(null);
          }
        }
      } else {
        if (selectedComponent != null) {
          DraggableComponent oldSelected = selectedComponent;
          selectedComponent = null;
          fireSelectedEvent(selectedComponent, oldSelected);
        }
      }
      draggableComponentList.remove(component);
      layoutOrderList.remove(component.getComponent());
      componentBox.remove(component.getComponent());
      componentBox.revalidate();
      // componentBox.validate();
      component.setLayoutOrderList(null);

      sortComponentList(!descendingSortOrder);

      updateScrollButtons();

      fireRemovedEvent(component);
    }
  }
  private void doSort() {
    if (mustSort && getComponentSpacing() < 0 && componentBox.getComponentCount() > 0) {
      setIgnoreAddRemoveNotify(true);

      mustSort = false;
      Component c;
      Component tc = topComponent != null ? topComponent.getComponent() : null;

      // componentBoxEnabled = false;

      // long millis = System.currentTimeMillis();

      int index = 0;
      if (tc != null) {
        if (componentBox.getComponent(0) != tc) {
          componentBox.remove(tc);
          componentBox.add(tc, index);
        }
        index++;
      }

      int switc = 0;
      int size = layoutOrderList.size();
      for (int i = 0; i < size; i++) {
        c = (Component) layoutOrderList.get(doReverseSort ? size - i - 1 : i);
        if (c != tc) {
          if (componentBox.getComponent(index) != c) {
            switc++;
            componentBox.remove(c);
            componentBox.add(c, index);
          }
          index++;
        }
      }

      setIgnoreAddRemoveNotify(false);

      /*System.out.print("  Box:   ");
      for (int i = 0; i < componentBox.getComponentCount(); i++)
        System.out.print(componentBox.getComponent(i) + "  ");
      System.out.println();
      System.out.print("  Order: ");
      for (int i = 0; i < layoutOrderList.size(); i++)
        System.out.print(layoutOrderList.get(i) + "  ");*/
      // System.out.println();
      /*			long millis = System.currentTimeMillis();
      componentBox.removeAll();

      if (tc != null)
      	componentBox.add(tc);

      int size = layoutOrderList.size();
      for (int i = 0; i < size; i++) {
      	c = (Component) layoutOrderList.get(doReverseSort ? size - i - 1 : i);
      	if (c != tc)
      		componentBox.add(c);
      }*/

      // componentBoxEnabled = true;

      // System.out.println("Sorting " + scount++ + "  time: " + (System.currentTimeMillis() -
      // millis) + "  Sorted: " + switc);
    }
  }
 public int getDraggableComponentIndex(DraggableComponent component) {
   return layoutOrderList.indexOf(component.getComponent());
 }