edu.wisc.ssec.mcidasv.ui
Class DraggableTabbedPane

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by javax.swing.JComponent
              extended by javax.swing.JTabbedPane
                  extended by edu.wisc.ssec.mcidasv.ui.DraggableTabbedPane
All Implemented Interfaces:
DragGestureListener, DragSourceListener, DropTargetListener, MouseListener, MouseMotionListener, ImageObserver, MenuContainer, Serializable, EventListener, Accessible, SwingConstants

public class DraggableTabbedPane
extends JTabbedPane
implements DragGestureListener, DragSourceListener, DropTargetListener, MouseListener, MouseMotionListener

This is a rather simplistic drag and drop enabled JTabbedPane. It allows users to use drag and drop to move tabs between windows and reorder tabs.

See Also:
Serialized Form

Nested Class Summary
(package private)  class DraggableTabbedPane.CloseableMetalTabbedPaneUI
           
(package private)  class DraggableTabbedPane.CloseableTabbedPaneUI
           
private static class DraggableTabbedPane.DraggableTabFlavor
          To be perfectly honest I'm still a bit fuzzy about DataFlavors.
static class DraggableTabbedPane.TabButton
           
private static class DraggableTabbedPane.TransferableIndex
          Used to simply provide a reference to the originating DraggableTabbedPane while we're dragging and dropping.
 
Nested classes/interfaces inherited from class javax.swing.JTabbedPane
JTabbedPane.AccessibleJTabbedPane, JTabbedPane.ModelListener
 
Nested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponent
 
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
 
Field Summary
private  String currentTabColor
           
private  DragSource dragSource
          Used for starting the dragging process.
private  DropTarget dropTarget
          Used for signaling that we'll accept drops (registers listeners).
private  McvComponentGroup group
          The component group holding our components.
private  IntegratedDataViewer idv
          Keep around this reference so that we can access the UI Manager.
private static String IDX_ICON
          Path to the icon we'll use as an index indicator.
private static String indexColorMetal
           
private static String indexColorUglyTabs
           
private  Image INDICATOR
          The actual image that we'll use to display the index indications.
protected static boolean outsideDrag
          Used to signal across all DraggableTabbedPanes that the component currently being dragged originated in another window.
private  int overIndex
          The tab index that the user is currently over.
private static Color selected
           
private static long serialVersionUID
           
private  int sourceIndex
          The tab index where the drag started.
private static Color unselected
           
private static int VALID_ACTION
          Local shorthand for the actions we're accepting.
private  IdvWindow window
          The IDV window that contains this tabbed pane.
 
Fields inherited from class javax.swing.JTabbedPane
changeEvent, changeListener, model, SCROLL_TAB_LAYOUT, tabPlacement, WRAP_TAB_LAYOUT
 
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 javax.swing.SwingConstants
BOTTOM, CENTER, EAST, HORIZONTAL, LEADING, LEFT, NEXT, NORTH, NORTH_EAST, NORTH_WEST, PREVIOUS, RIGHT, SOUTH, SOUTH_EAST, SOUTH_WEST, TOP, TRAILING, VERTICAL, WEST
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
DraggableTabbedPane(IdvWindow win, IntegratedDataViewer idv, McvComponentGroup group)
          Mostly just registers that this component should listen for drag and drop operations.
 
Method Summary
 void addTab(String title, Component component)
           
 void addTab(String title, Component component, Icon extraIcon)
           
 void doDrop(int srcIdx, int dstIdx)
          Moves a component to its new index within the component group.
 void dragDropEnd(DragSourceDropEvent e)
          Handles what happens at the very end of a drag and drop.
 void dragEnter(DragSourceDragEvent e)
           
 void dragEnter(DropTargetDragEvent e)
          Triggered when the user drags into dropTarget.
 void dragExit(DragSourceEvent e)
           
 void dragExit(DropTargetEvent e)
          Triggered when the user drags out of dropTarget.
 void dragGestureRecognized(DragGestureEvent e)
          Triggered when the user does a (platform-dependent) drag initiating gesture.
 void dragOver(DragSourceDragEvent e)
           
 void dragOver(DropTargetDragEvent e)
          Triggered continually while the user is dragging over dropTarget.
 void drop(DropTargetDropEvent e)
          Triggered when a drop has happened over dropTarget.
 void dropActionChanged(DragSourceDragEvent e)
           
 void dropActionChanged(DropTargetDragEvent e)
           
 void mouseClicked(MouseEvent e)
           
 void mouseDragged(MouseEvent e)
           
 void mouseEntered(MouseEvent e)
           
 void mouseExited(MouseEvent e)
           
 void mouseMoved(MouseEvent e)
           
 void mousePressed(MouseEvent e)
           
 void mouseReleased(MouseEvent e)
           
private  void newWindowDrag(ComponentHolder dragged, Point drop)
          Handle the user dropping a tab outside of a McV window.
 void paint(Graphics g)
          Overridden so that McIDAS-V can draw an indicator of a dragged tab's possible
private  void processMouseEvents(MouseEvent e)
           
private  ComponentHolder removeDragged()
          "Quietly" removes the dragged component from its group.
 void setSelectedIndex(int index)
          Overriden so that McIDAS-V can change the window title upon changing tabs.
 
Methods inherited from class javax.swing.JTabbedPane
add, add, add, add, add, addChangeListener, addTab, addTab, createChangeListener, fireStateChanged, getAccessibleContext, getBackgroundAt, getBoundsAt, getChangeListeners, getComponentAt, getDisabledIconAt, getDisplayedMnemonicIndexAt, getForegroundAt, getIconAt, getMnemonicAt, getModel, getSelectedComponent, getSelectedIndex, getTabComponentAt, getTabCount, getTabLayoutPolicy, getTabPlacement, getTabRunCount, getTitleAt, getToolTipText, getToolTipTextAt, getUI, getUIClassID, indexAtLocation, indexOfComponent, indexOfTab, indexOfTab, indexOfTabComponent, insertTab, isEnabledAt, paramString, remove, remove, removeAll, removeChangeListener, removeTabAt, setBackgroundAt, setComponentAt, setDisabledIconAt, setDisplayedMnemonicIndexAt, setEnabledAt, setForegroundAt, setIconAt, setMnemonicAt, setModel, setSelectedComponent, setTabComponentAt, setTabLayoutPolicy, setTabPlacement, setTitleAt, setToolTipTextAt, setUI, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, 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, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, 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
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, 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
 

Field Detail

serialVersionUID

private static final long serialVersionUID
See Also:
Constant Field Values

VALID_ACTION

private static final int VALID_ACTION
Local shorthand for the actions we're accepting.

See Also:
Constant Field Values

IDX_ICON

private static final String IDX_ICON
Path to the icon we'll use as an index indicator.

See Also:
Constant Field Values

outsideDrag

protected static boolean outsideDrag
Used to signal across all DraggableTabbedPanes that the component currently being dragged originated in another window. This'll let McV determine if it has to do a quiet ComponentHolder transfer.


INDICATOR

private final Image INDICATOR
The actual image that we'll use to display the index indications.


sourceIndex

private int sourceIndex
The tab index where the drag started.


overIndex

private int overIndex
The tab index that the user is currently over.


dragSource

private DragSource dragSource
Used for starting the dragging process.


dropTarget

private DropTarget dropTarget
Used for signaling that we'll accept drops (registers listeners).


group

private McvComponentGroup group
The component group holding our components.


window

private IdvWindow window
The IDV window that contains this tabbed pane.


idv

private IntegratedDataViewer idv
Keep around this reference so that we can access the UI Manager.


unselected

private static final Color unselected

selected

private static final Color selected

indexColorMetal

private static final String indexColorMetal
See Also:
Constant Field Values

indexColorUglyTabs

private static final String indexColorUglyTabs
See Also:
Constant Field Values

currentTabColor

private String currentTabColor
Constructor Detail

DraggableTabbedPane

public DraggableTabbedPane(IdvWindow win,
                           IntegratedDataViewer idv,
                           McvComponentGroup group)
Mostly just registers that this component should listen for drag and drop operations.

Parameters:
win - The IDV window containing this tabbed pane.
idv - The main IDV instance.
group - The McvComponentGroup that holds this component's tabs.
Method Detail

dragGestureRecognized

public void dragGestureRecognized(DragGestureEvent e)
Triggered when the user does a (platform-dependent) drag initiating gesture. Used to populate the things that the user is attempting to drag.

Specified by:
dragGestureRecognized in interface DragGestureListener

dragEnter

public void dragEnter(DropTargetDragEvent e)
Triggered when the user drags into dropTarget.

Specified by:
dragEnter in interface DropTargetListener

dragExit

public void dragExit(DropTargetEvent e)
Triggered when the user drags out of dropTarget.

Specified by:
dragExit in interface DropTargetListener

dragOver

public void dragOver(DropTargetDragEvent e)
Triggered continually while the user is dragging over dropTarget. McIDAS-V uses this to draw the index indicator.

Specified by:
dragOver in interface DropTargetListener
Parameters:
e - Information about the current state of the drag.

drop

public void drop(DropTargetDropEvent e)
Triggered when a drop has happened over dropTarget.

Specified by:
drop in interface DropTargetListener
Parameters:
e - State that we'll need in order to handle the drop.

removeDragged

private ComponentHolder removeDragged()
"Quietly" removes the dragged component from its group. If the last component in a group has been dragged out of the group, the associated window will be killed.

Returns:
The removed component.

doDrop

public void doDrop(int srcIdx,
                   int dstIdx)
Moves a component to its new index within the component group.

Parameters:
srcIdx - The old index of the component.
dstIdx - The new index of the component.

paint

public void paint(Graphics g)
Overridden so that McIDAS-V can draw an indicator of a dragged tab's possible

Overrides:
paint in class JComponent

setSelectedIndex

public void setSelectedIndex(int index)
Overriden so that McIDAS-V can change the window title upon changing tabs.

Overrides:
setSelectedIndex in class JTabbedPane

newWindowDrag

private void newWindowDrag(ComponentHolder dragged,
                           Point drop)
Handle the user dropping a tab outside of a McV window. This will create a new window and add the dragged tab to the ComponentGroup within the newly created window. The new window is the same size as the origin window, with the top centered over the location where the user released the mouse.

Parameters:
dragged - The ComponentHolder that's being dragged around.
drop - The x- and y-coordinates where the user dropped the tab.

dragDropEnd

public void dragDropEnd(DragSourceDropEvent e)
Handles what happens at the very end of a drag and drop. Since I could not find a better method for it, tabs that are dropped outside of a McV window are handled with this method.

Specified by:
dragDropEnd in interface DragSourceListener

dragEnter

public void dragEnter(DragSourceDragEvent e)
Specified by:
dragEnter in interface DragSourceListener

dragExit

public void dragExit(DragSourceEvent e)
Specified by:
dragExit in interface DragSourceListener

dragOver

public void dragOver(DragSourceDragEvent e)
Specified by:
dragOver in interface DragSourceListener

dropActionChanged

public void dropActionChanged(DragSourceDragEvent e)
Specified by:
dropActionChanged in interface DragSourceListener

dropActionChanged

public void dropActionChanged(DropTargetDragEvent e)
Specified by:
dropActionChanged in interface DropTargetListener

mouseClicked

public void mouseClicked(MouseEvent e)
Specified by:
mouseClicked in interface MouseListener

mouseExited

public void mouseExited(MouseEvent e)
Specified by:
mouseExited in interface MouseListener

mousePressed

public void mousePressed(MouseEvent e)
Specified by:
mousePressed in interface MouseListener

mouseEntered

public void mouseEntered(MouseEvent e)
Specified by:
mouseEntered in interface MouseListener

mouseMoved

public void mouseMoved(MouseEvent e)
Specified by:
mouseMoved in interface MouseMotionListener

mouseDragged

public void mouseDragged(MouseEvent e)
Specified by:
mouseDragged in interface MouseMotionListener

mouseReleased

public void mouseReleased(MouseEvent e)
Specified by:
mouseReleased in interface MouseListener

processMouseEvents

private void processMouseEvents(MouseEvent e)

addTab

public void addTab(String title,
                   Component component)
Overrides:
addTab in class JTabbedPane

addTab

public void addTab(String title,
                   Component component,
                   Icon extraIcon)