CubeTwister 2.0alpha142 2012-02-11

ch.randelshofer.gui
Class JDnDList

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by javax.swing.JList
                  extended by ch.randelshofer.gui.MutableJList
                      extended by ch.randelshofer.gui.JDnDList
All Implemented Interfaces:
java.awt.dnd.Autoscroll, java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, javax.accessibility.Accessible, javax.swing.Scrollable, org.jhotdraw.gui.EditableComponent

public class JDnDList
extends MutableJList
implements java.awt.dnd.Autoscroll

A JList that supports drag and drop operations if its model is an instance of MutableListModel.

The DnDJList supports Copy, Move and Link drag and drop actions. The default is Copy and Move. To change the supported actions use setSupportedDragActions and setSupportedDropActions.

FIXME: Implement Workarounds for Apple MRJ 1.3.1 Update 1 for Mac OS X 10.1.x FIXME: Implement cloning.

Version:
3.0.1 2010-11-06 Fixes possible NPE in method getSupportedDragActions.
3.0 2008-03-21 Reimplemented with TransferHandler. Renamed from DnDJList to JDnDList.
2.2.1 2007-06-07 On dropActionChanged, we need always to call accept drag.
2.2 2006-10-24 Added timer for autoscroll.
2.1.1 2006-01-07 Clear isUnderDrag variable when rejecting drop.
2.1 2004-02-06 Moved all listener methods into the private inner class EventHandler.
2.0 2003-11-01 Revised.
1.0 2002-12-17 Created.
Author:
Werner Randelshofer
See Also:
Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class javax.swing.JList
javax.swing.JList.AccessibleJList, javax.swing.JList.DropLocation
 
Nested classes/interfaces inherited from class javax.swing.JComponent
javax.swing.JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BaselineResizeBehavior, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
 
Field Summary
 
Fields inherited from class javax.swing.JList
HORIZONTAL_WRAP, VERTICAL, VERTICAL_WRAP
 
Fields inherited from class javax.swing.JComponent
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface org.jhotdraw.gui.EditableComponent
SELECTION_EMPTY_PROPERTY
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
JDnDList()
          Constructs a DnDJList with an empty DefaultMutableListModel.
JDnDList(MutableListModel m)
          Constructs a DnDJList with the specified MutableListModel.
 
Method Summary
 void addSelectionInterval(int anchor, int lead)
          Set the selection to be the union of the specified interval with current selection.
 void autoscroll(java.awt.Point location)
          notify the Component to autoscroll
 void clearSelection()
          Clears the selection - after calling this method isSelectionEmpty() will return true.
protected  java.awt.Image createDragImage(java.awt.Point dragOrigin, int dragOriginItemIndex, int[] draggedIndices, boolean isSelected, java.awt.Point imageOffset)
          Creates a drag image and computes the image offset as a side effect.
 java.awt.Insets getAutoscrollInsets()
          This method returns the Insets describing the autoscrolling region or border relative to the geometry of the implementing Component.
 boolean getPaintsDropCursor()
          Returns true if the DnDJList paints a drop cursor when it is an active drop target.
 int getSupportedDragActions()
          This method returns an int representing the type of drag action(s) this DnDJList supports.
 int getSupportedDropActions()
          This method returns an int representing the type of drop action(s) this DnDJList supports.
static void main(java.lang.String[] args)
           
protected  void paintAutoscrollRegion(java.awt.Graphics g)
          Paints a rectangle which gives the user a hint, where the autoscroll region is.
 void paintComponent(java.awt.Graphics g)
          Paints the component and draws the drop cursor and the autoscroll region if the DnDJList is an active drop target.
protected  void paintDropCursor(java.awt.Graphics g)
          Paints a cursor which gives the user a hint, where the potential insertion point of the current drag and drop operation is.
 void removeSelectionInterval(int index0, int index1)
          Set the selection to be the set difference of the specified interval and the current selection.
protected  void repaintDropCursor(int oldInsertionIndex, int newInsertionIndex)
          Calls repaint for the graphics region where the old insertion point was and where the new insertion point is.
 void setEnabled(boolean b)
          Sets the enabled state of the DnDJList.
 void setModel(javax.swing.ListModel m)
          Sets the model that represents the contents or "value" of the list.
 void setPaintsDropCursor(boolean b)
          Turns the drop cursor feature on or of.
 void setSelectedIndex(int index)
          Select a single cell.
 void setSelectedIndices(int[] indices)
          Select a set of cells.
 void setSelectionInterval(int anchor, int lead)
          Select the specified interval.
 void setSupportedDragActions(int actions)
          This method sets the permitted source drag action(s) for this DnDJList.
 void setSupportedDropActions(int actions)
          This method sets the permitted target drop action(s) for this DnDJList.
 
Methods inherited from class ch.randelshofer.gui.MutableJList
addNotify, configureEnclosingScrollPane, copy, create, createPopup, cut, delete, duplicate, paste, removeNotify, selectAll, unconfigureEnclosingScrollPane
 
Methods inherited from class javax.swing.JList
addListSelectionListener, createSelectionModel, ensureIndexIsVisible, fireSelectionValueChanged, getAccessibleContext, getAnchorSelectionIndex, getCellBounds, getCellRenderer, getDragEnabled, getDropLocation, getDropMode, getFirstVisibleIndex, getFixedCellHeight, getFixedCellWidth, getLastVisibleIndex, getLayoutOrientation, getLeadSelectionIndex, getListSelectionListeners, getMaxSelectionIndex, getMinSelectionIndex, getModel, getNextMatch, getPreferredScrollableViewportSize, getPrototypeCellValue, getScrollableBlockIncrement, getScrollableTracksViewportHeight, getScrollableTracksViewportWidth, getScrollableUnitIncrement, getSelectedIndex, getSelectedIndices, getSelectedValue, getSelectedValues, getSelectionBackground, getSelectionForeground, getSelectionMode, getSelectionModel, getToolTipText, getUI, getUIClassID, getValueIsAdjusting, getVisibleRowCount, indexToLocation, isSelectedIndex, isSelectionEmpty, locationToIndex, paramString, removeListSelectionListener, setCellRenderer, setDragEnabled, setDropMode, setFixedCellHeight, setFixedCellWidth, setLayoutOrientation, setListData, setListData, setPrototypeCellValue, setSelectedValue, setSelectionBackground, setSelectionForeground, setSelectionMode, setSelectionModel, setUI, setValueIsAdjusting, setVisibleRowCount, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.jhotdraw.gui.EditableComponent
addPropertyChangeListener, isSelectionEmpty, removePropertyChangeListener
 

Constructor Detail

JDnDList

public JDnDList()
Constructs a DnDJList with an empty DefaultMutableListModel.


JDnDList

public JDnDList(MutableListModel m)
Constructs a DnDJList with the specified MutableListModel.

Method Detail

setModel

public void setModel(javax.swing.ListModel m)
Sets the model that represents the contents or "value" of the list. The DnDJList supports drag and drop operations only when the model is an instance of MutableListModel.

Overrides:
setModel in class javax.swing.JList

setSupportedDragActions

public void setSupportedDragActions(int actions)
This method sets the permitted source drag action(s) for this DnDJList.

This is a bound property.

Parameters:
actions - the permitted source drag action(s). The value is constructed by doing a logical OR of the desired actions specified by the DnDConstants.ACTION_... constants.
See Also:
DnDConstants

getSupportedDragActions

public int getSupportedDragActions()
This method returns an int representing the type of drag action(s) this DnDJList supports.

Returns:
the currently permitted drag action(s) The value is constructed by doing a logical OR of the desired actions specified by the DnDConstants.ACTION_... constants.
See Also:
DnDConstants

setSupportedDropActions

public void setSupportedDropActions(int actions)
This method sets the permitted target drop action(s) for this DnDJList.

Parameters:
actions - the permitted target drop action(s). The value is constructed by doing a logical OR of the desired actions specified by the DnDConstants.ACTION_... constants.
See Also:
DnDConstants

getSupportedDropActions

public int getSupportedDropActions()
This method returns an int representing the type of drop action(s) this DnDJList supports.

Returns:
the currently permitted drop action(s) The value is constructed by doing a logical OR of the desired actions specified by the DnDConstants.ACTION_... constants.
See Also:
DnDConstants

setEnabled

public void setEnabled(boolean b)
Sets the enabled state of the DnDJList. Also sets the drop target's active state.

Overrides:
setEnabled in class MutableJList
See Also:
DropTarget.setActive(boolean)

setPaintsDropCursor

public void setPaintsDropCursor(boolean b)
Turns the drop cursor feature on or of.

The drop cursor indicates where an item will be inserted when the user drops an object at the current mouse location.

The drop cursor is shown only, when the DnDJList is the target of the current drag and drop operation and when it can accept the dragged object.


getPaintsDropCursor

public boolean getPaintsDropCursor()
Returns true if the DnDJList paints a drop cursor when it is an active drop target.


clearSelection

public void clearSelection()
Clears the selection - after calling this method isSelectionEmpty() will return true. This is a convenience method that just delegates to the selectionModel.

Specified by:
clearSelection in interface org.jhotdraw.gui.EditableComponent
Overrides:
clearSelection in class javax.swing.JList
See Also:
ListSelectionModel.clearSelection(), JList.isSelectionEmpty(), JList.addListSelectionListener(javax.swing.event.ListSelectionListener)

setSelectionInterval

public void setSelectionInterval(int anchor,
                                 int lead)
Select the specified interval. Both the anchor and lead indices are included. It's not neccessary for anchor to be less than lead. This is a convenience method that just delegates to the selectionModel.

Overrides:
setSelectionInterval in class javax.swing.JList
Parameters:
anchor - The first index to select
lead - The last index to select
See Also:
ListSelectionModel.setSelectionInterval(int, int), addSelectionInterval(int, int), removeSelectionInterval(int, int), JList.addListSelectionListener(javax.swing.event.ListSelectionListener)

addSelectionInterval

public void addSelectionInterval(int anchor,
                                 int lead)
Set the selection to be the union of the specified interval with current selection. Both the anchor and lead indices are included. It's not neccessary for anchor to be less than lead. This is a convenience method that just delegates to the selectionModel.

Overrides:
addSelectionInterval in class javax.swing.JList
Parameters:
anchor - The first index to add to the selection
lead - The last index to add to the selection
See Also:
ListSelectionModel.addSelectionInterval(int, int), setSelectionInterval(int, int), removeSelectionInterval(int, int), JList.addListSelectionListener(javax.swing.event.ListSelectionListener)

removeSelectionInterval

public void removeSelectionInterval(int index0,
                                    int index1)
Set the selection to be the set difference of the specified interval and the current selection. Both the anchor and lead indices are removed. It's not neccessary for anchor to be less than lead. This is a convenience method that just delegates to the selectionModel.

Overrides:
removeSelectionInterval in class javax.swing.JList
Parameters:
index0 - The first index to remove from the selection
index1 - The last index to remove from the selection
See Also:
ListSelectionModel.removeSelectionInterval(int, int), setSelectionInterval(int, int), addSelectionInterval(int, int), JList.addListSelectionListener(javax.swing.event.ListSelectionListener)

setSelectedIndex

public void setSelectedIndex(int index)
Select a single cell.

Overrides:
setSelectedIndex in class javax.swing.JList
Parameters:
index - The index of the one cell to select
See Also:
ListSelectionModel.setSelectionInterval(int, int), JList.isSelectedIndex(int), description: The index of the selected cell.

setSelectedIndices

public void setSelectedIndices(int[] indices)
Select a set of cells.

Overrides:
setSelectedIndices in class javax.swing.JList
Parameters:
indices - The indices of the cells to select
See Also:
ListSelectionModel.addSelectionInterval(int, int), JList.isSelectedIndex(int), JList.addListSelectionListener(javax.swing.event.ListSelectionListener)

getAutoscrollInsets

public java.awt.Insets getAutoscrollInsets()
This method returns the Insets describing the autoscrolling region or border relative to the geometry of the implementing Component.

This value is read once by the DropTarget upon entry of the drag Cursor into the associated Component.

Specified by:
getAutoscrollInsets in interface java.awt.dnd.Autoscroll
Returns:
the Insets

autoscroll

public void autoscroll(java.awt.Point location)
notify the Component to autoscroll

Specified by:
autoscroll in interface java.awt.dnd.Autoscroll
Parameters:
location - A Point indicating the location of the cursor that triggered this operation.

paintComponent

public void paintComponent(java.awt.Graphics g)
Paints the component and draws the drop cursor and the autoscroll region if the DnDJList is an active drop target.

Overrides:
paintComponent in class javax.swing.JComponent

paintAutoscrollRegion

protected void paintAutoscrollRegion(java.awt.Graphics g)
Paints a rectangle which gives the user a hint, where the autoscroll region is.


paintDropCursor

protected void paintDropCursor(java.awt.Graphics g)
Paints a cursor which gives the user a hint, where the potential insertion point of the current drag and drop operation is.

Note that you have to change method repaintInsertPoint if you change the shape of the drop cursor. �@see


repaintDropCursor

protected void repaintDropCursor(int oldInsertionIndex,
                                 int newInsertionIndex)
Calls repaint for the graphics region where the old insertion point was and where the new insertion point is.

Parameters:
oldInsertionIndex - index of the old insertion point.
Range: 0 <= value <= getModel().getSize()
newInsertionIndex - index of the new insertion point.
Range: 0 <= value <= getModel().getSize()

createDragImage

protected java.awt.Image createDragImage(java.awt.Point dragOrigin,
                                         int dragOriginItemIndex,
                                         int[] draggedIndices,
                                         boolean isSelected,
                                         java.awt.Point imageOffset)
Creates a drag image and computes the image offset as a side effect.

Parameters:
dragOrigin - The mouse location in component coordinates where the drag gesture was recognized.
dragOriginItemIndex - The index of the list item at the drag origin.
draggedIndices - The indices of the list items to be dragged.
isSelected - Indicates whether the dragged items are selected or not.
imageOffset - The image offset. As a side effect, the x and y coordinates of the argument will be set by this method. The image offset is to be used along with the returned image when invoking the start drag method!
Returns:
The drag image. To be used along with the imageOffset in a call to start drag.

main

public static void main(java.lang.String[] args)

(c) Werner Randelshofer.
All rights reserved.