edu.wisc.ssec.mcidasv.ui
Class McvComponentGroup

java.lang.Object
  extended by ucar.unidata.collab.SharableImpl
      extended by ucar.unidata.collab.PropertiedThing
          extended by ucar.unidata.ui.ComponentHolder
              extended by ucar.unidata.ui.ComponentGroup
                  extended by ucar.unidata.idv.ui.IdvComponentGroup
                      extended by edu.wisc.ssec.mcidasv.ui.McvComponentGroup
All Implemented Interfaces:
PropertyChangeListener, EventListener, Sharable

public class McvComponentGroup
extends IdvComponentGroup

Extends the IDV component groups so that we can intercept clicks for Bruce's tab popup menu and handle drag and drop. It also intercepts ViewManager creation in order to wrap components in McIDASVComponentHolders rather than IdvComponentHolders. Doing this allows us to associate ViewManagers back to their ComponentHolders, and this functionality is taken advantage of to form the hierarchical names seen in the McIDASVViewPanel.


Nested Class Summary
private  class McvComponentGroup.TabPopupListener
          Handle pop-up events for tabs.
 
Field Summary
private static String CMD_DISPLAY_DESTROY
          Action command for destroying a display.
private static String CMD_DISPLAY_EJECT
          Action command for ejecting a display from a tab.
private static String CMD_DISPLAY_RENAME
          Action command for renaming a display.
protected static String ICO_CLOSE
          Path to the "close tab" icon in the popup menu.
protected static String ICO_RENAME
          Path to the "rename" icon in the popup menu.
protected static String ICO_UNDOCK
          Path to the eject icon in the popup menu.
private  IntegratedDataViewer idv
          Keep a reference to avoid extraneous calls to getIdv().
private  boolean initDone
          Whether or not init has been called.
private  List<ComponentHolder> knownHolders
          Holders that McV knows are held by this component group.
private  JPopupMenu popup
          The popup menu for the McV tabbed display interface.
private  int tabCount
          Number of tabs that have been stored in this group.
private  boolean tabRenamed
          Whether or not redoLayout() needs to worry about a renamed tab.
private  IdvWindow window
          Reference to the window associated with this group.
 
Fields inherited from class ucar.unidata.ui.ComponentGroup
container, LAYOUT_BORDER, LAYOUT_DESKTOP, LAYOUT_GRAPH, LAYOUT_GRID, LAYOUT_GRIDBAG, LAYOUT_HSPLIT, LAYOUT_LIST, LAYOUT_MENU, LAYOUT_NAMES, LAYOUT_TABS, LAYOUT_TREE, LAYOUT_VSPLIT, LAYOUTS, outerContainer, tabbedPane
 
Fields inherited from class ucar.unidata.ui.ComponentHolder
ATTR_NAME, BORDER_NAMES, BORDERS, displayBtn, header, isRemoved, nameFld, parent
 
Fields inherited from class ucar.unidata.collab.PropertiedThing
propertiesDialog
 
Constructor Summary
McvComponentGroup()
          Default constructor for serialization.
McvComponentGroup(IntegratedDataViewer idv, String name)
          A pretty typical constructor.
McvComponentGroup(IntegratedDataViewer idv, String name, IdvWindow window)
          This constructor catches the window that will be contain this group.
 
Method Summary
 void addComponent(ComponentHolder holder, int index)
           Adds a component holder to this group.
 Element createXmlNode(Document doc)
          Doesn't do anything for the time being...
protected  boolean destroyDisplay(int idx)
          Prompts the user to confirm removal of the component holder at index idx.
 JComponent doMakeContents()
          Create and return the GUI contents.
protected  JPopupMenu doMakeTabMenu()
          Create the JPopupMenu that will be displayed for a tab.
private  ComponentHolder ejectDisplay(int idx)
          Remove the component holder at index idx.
 ComponentHolder getActiveComponentHolder()
           
 int getActiveIndex()
           
protected  int getDisplayComponentCount()
          Returns the number of display components "in" this group.
protected  ComponentHolder getHolderAt(int index)
          Returns the ComponentHolder at the given position within this component group.
 void getViewManagers(List viewManagers)
           
 void importDisplayControl(DisplayControlImpl dc)
           Importing a display control entails adding the control to the component group and informing the UI that the control is no longer in its own window.
 int indexOf(ComponentHolder holder)
          Returns the index of holder within this component group.
private  void init()
          Initializes the various UI components.
 void makeDynamicSkin(Element root)
          Basically just creates a McVCompHolder for holding a dynamic skin and sets the name of the component holder.
 void makeNew(String what)
           Create a new component whose type will be determined by the contents of what.
 void makeSkin(int index)
           Handles creation of the component represented by the XML skin at the given index.
 IdvComponentHolder makeSkinAtIndex(int index)
           
private  String makeWindowTitle(String title)
          Create a window title suitable for an application window.
 int quietAddComponent(ComponentHolder component)
          Adds a component to the end of the list of display components without forcing the IDV-land code to redraw.
 ComponentHolder quietRemoveComponentAt(int index)
          Remove the component at index without forcing the IDV-land component group to redraw.
 void redoLayout()
           Forces this group to layout its components.
protected  void renameDisplay(int idx)
          Prompt the user to change the name of the component holder at index idx.
 void setActiveComponentHolder(ComponentHolder holder)
          Used to set the tab associated with holder as the active tab in our JTabbedPane.
 boolean setActiveIndex(int index)
          Make the component holder at index active.
 void setIdv(IntegratedDataViewer newIdv)
          Overridden so that McV can also update its copy of the IDV reference.
private  boolean shouldGenerateName(ComponentHolder h, int i)
           
 
Methods inherited from class ucar.unidata.idv.ui.IdvComponentGroup
addGroups, applyProperties, doDrop, dropOk, getAutoImportDisplays, getIdv, getPopupMenuItems, getPropertiesComponents, importAllDisplayControls, initWith, setAutoImportDisplays, tryToImportDisplayControl, writeSkin
 
Methods inherited from class ucar.unidata.ui.ComponentGroup
addComponent, doRemove, editLayout, findComponentsWithType, getDisplayComponents, getGridColumns, getIconified, getLastPosition, getLayout, getNumColumns, getNumRows, getTypeName, isAncestor, main, makeTree, print, removeComponent, setDisplayComponents, setGridColumns, setIconified, setLastPosition, setLayout, setNumColumns, setNumRows, setRowsColumns, setState, subtreeChanged, toString, wrapContents, xxxxgetPropertyTabs
 
Methods inherited from class ucar.unidata.ui.ComponentHolder
clearContents, doMakeHeader, getBeingShown, getBorder, getBorderLayoutLocation, getCategory, getContents, getHierachicalName, getIcon, getInternalFrame, getInternalFrameShown, getLayoutRect, getName, getParent, getRoot, getShowHeader, removeDisplayComponent, setBorder, setBorder, setBorderLayoutLocation, setCategory, setInternalFrameShown, setLayoutRect, setName, setParent, setShowHeader, showPopup
 
Methods inherited from class ucar.unidata.collab.PropertiedThing
addPropertyChangeListener, doApplyProperties, firePropertyChange, firePropertyChange, getPropertyListeners, getPropertyTabs, isShowing, propertyChange, removePropertyChangeListener, showProperties, showProperties
 
Methods inherited from class ucar.unidata.collab.SharableImpl
applySharableProperties, doShare, doShare, doShareExternal, doShareInternal, getReceiveShareTime, getSharablePropertiesComponent, getShareGroup, getSharing, getUniqueId, initSharable, receiveShareData, removeSharable, setReceiveShareTime, setShareGroup, setSharing, setUniqueId, showSharableDialog
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

ICO_CLOSE

protected static final String ICO_CLOSE
Path to the "close tab" icon in the popup menu.

See Also:
Constant Field Values

ICO_RENAME

protected static final String ICO_RENAME
Path to the "rename" icon in the popup menu.

See Also:
Constant Field Values

ICO_UNDOCK

protected static final String ICO_UNDOCK
Path to the eject icon in the popup menu.

See Also:
Constant Field Values

CMD_DISPLAY_DESTROY

private static final String CMD_DISPLAY_DESTROY
Action command for destroying a display.

See Also:
Constant Field Values

CMD_DISPLAY_EJECT

private static final String CMD_DISPLAY_EJECT
Action command for ejecting a display from a tab.

See Also:
Constant Field Values

CMD_DISPLAY_RENAME

private static final String CMD_DISPLAY_RENAME
Action command for renaming a display.

See Also:
Constant Field Values

popup

private final JPopupMenu popup
The popup menu for the McV tabbed display interface.


tabCount

private int tabCount
Number of tabs that have been stored in this group.


initDone

private boolean initDone
Whether or not init has been called.


knownHolders

private List<ComponentHolder> knownHolders
Holders that McV knows are held by this component group. Used to avoid any needless work in redoLayout.


idv

private IntegratedDataViewer idv
Keep a reference to avoid extraneous calls to getIdv().


window

private IdvWindow window
Reference to the window associated with this group.


tabRenamed

private boolean tabRenamed
Whether or not redoLayout() needs to worry about a renamed tab.

Constructor Detail

McvComponentGroup

public McvComponentGroup()
Default constructor for serialization.


McvComponentGroup

public McvComponentGroup(IntegratedDataViewer idv,
                         String name)
A pretty typical constructor.

Parameters:
idv - The main IDV instance.
name - Presumably the name of this component group?

McvComponentGroup

public McvComponentGroup(IntegratedDataViewer idv,
                         String name,
                         IdvWindow window)
This constructor catches the window that will be contain this group.

Parameters:
idv - The main IDV instance.
name - Presumably the name of this component group?
window - The window holding this component group.
Method Detail

init

private void init()
Initializes the various UI components.


doMakeContents

public JComponent doMakeContents()
Create and return the GUI contents. Overridden so that McV can implement the right click tab menu and draggable tabs.

Overrides:
doMakeContents in class ComponentGroup
Returns:
GUI contents

importDisplayControl

public void importDisplayControl(DisplayControlImpl dc)

Importing a display control entails adding the control to the component group and informing the UI that the control is no longer in its own window.

Overridden in McV so that the display control is wrapped in a McIDASVComponentHolder rather than a IdvComponentHolder.

Overrides:
importDisplayControl in class IdvComponentGroup
Parameters:
dc - The display control to import.

makeDynamicSkin

public void makeDynamicSkin(Element root)
Basically just creates a McVCompHolder for holding a dynamic skin and sets the name of the component holder.

Parameters:
root - The XML skin that we'll use.

createXmlNode

public Element createXmlNode(Document doc)
Doesn't do anything for the time being...

Overrides:
createXmlNode in class IdvComponentGroup
Parameters:
doc -
Returns:
XML representation of the contents of this component group.

makeSkin

public void makeSkin(int index)

Handles creation of the component represented by the XML skin at the given index.

Overridden so that McV can wrap the component in a McIDASVComponentHolder.

Overrides:
makeSkin in class IdvComponentGroup
Parameters:
index - The index of the skin within the skin resource.

makeSkinAtIndex

public IdvComponentHolder makeSkinAtIndex(int index)

makeNew

public void makeNew(String what)

Create a new component whose type will be determined by the contents of what.

Overridden so that McV can wrap up the components in McVComponentHolders, which allow McV to map ViewManagers to ComponentHolders.

Overrides:
makeNew in class IdvComponentGroup
Parameters:
what - String that determines what sort of component we create.

redoLayout

public void redoLayout()

Forces this group to layout its components. Extended because the IDV was doing extra work that McIDAS-V doesn't need, such as dealing with layouts other than LAYOUT_TABS and needlessly reinitializing the group's container.

Overrides:
redoLayout in class ComponentGroup
See Also:
ComponentGroup.redoLayout()

getViewManagers

public void getViewManagers(List viewManagers)
Overrides:
getViewManagers in class IdvComponentGroup

addComponent

public void addComponent(ComponentHolder holder,
                         int index)

Adds a component holder to this group. Extended so that the added holder becomes the active tab, and the component is explicitly set to visible in an effort to fix that heavyweight/lightweight component problem.

Overrides:
addComponent in class ComponentGroup
Parameters:
holder -
index -
See Also:
ComponentGroup.addComponent(ComponentHolder, int)

shouldGenerateName

private boolean shouldGenerateName(ComponentHolder h,
                                   int i)

setActiveComponentHolder

public void setActiveComponentHolder(ComponentHolder holder)
Used to set the tab associated with holder as the active tab in our JTabbedPane.

Parameters:
holder - The active component holder.

getActiveIndex

public int getActiveIndex()
Returns:
The index of the active component holder within this group.

setActiveIndex

public boolean setActiveIndex(int index)
Make the component holder at index active.

Parameters:
index - The index of the desired component holder.
Returns:
True if the active component holder was set, false otherwise.

indexOf

public int indexOf(ComponentHolder holder)
Returns the index of holder within this component group.

Overrides:
indexOf in class ComponentGroup
Returns:
Either the index of holder, or -1 if ComponentGroup.getDisplayComponents() returns a null List.
See Also:
List.indexOf(Object)

getHolderAt

protected ComponentHolder getHolderAt(int index)
Returns the ComponentHolder at the given position within this component group.

Parameters:
index - Index of the ComponentHolder to return.
Returns:
ComponentHolder at index.
See Also:
List.get(int)

getActiveComponentHolder

public ComponentHolder getActiveComponentHolder()
Returns:
Component holder that corresponds to the selected tab.

setIdv

public void setIdv(IntegratedDataViewer newIdv)
Overridden so that McV can also update its copy of the IDV reference.

Overrides:
setIdv in class IdvComponentGroup

makeWindowTitle

private String makeWindowTitle(String title)
Create a window title suitable for an application window.

Parameters:
title - Window title
Returns:
Application title plus the window title.

getDisplayComponentCount

protected int getDisplayComponentCount()
Returns the number of display components "in" this group.

Returns:
Either the size() of the List returned by ComponentGroup.getDisplayComponents() or -1 if getDisplayComponents() returns a null List.

doMakeTabMenu

protected JPopupMenu doMakeTabMenu()
Create the JPopupMenu that will be displayed for a tab.

Returns:
Menu initialized with tab options

ejectDisplay

private ComponentHolder ejectDisplay(int idx)
Remove the component holder at index idx. This method does not destroy the component holder.

Parameters:
idx - Index of the ejected component holder.
Returns:
Component holder that was ejected.

renameDisplay

protected void renameDisplay(int idx)
Prompt the user to change the name of the component holder at index idx. Nothing happens if the user doesn't enter anything.

Parameters:
idx - Index of the component holder.

destroyDisplay

protected boolean destroyDisplay(int idx)
Prompts the user to confirm removal of the component holder at index idx. Nothing happens if the user declines.

Parameters:
idx - Index of the component holder.
Returns:
Either true if the user elected to remove, false otherwise.

quietRemoveComponentAt

public ComponentHolder quietRemoveComponentAt(int index)
Remove the component at index without forcing the IDV-land component group to redraw.

Parameters:
index - The index of the component to be removed.
Returns:
The removed component.

quietAddComponent

public int quietAddComponent(ComponentHolder component)
Adds a component to the end of the list of display components without forcing the IDV-land code to redraw.

Parameters:
component - The component to add.
Returns:
The index of the newly added component, or -1 if ComponentGroup.getDisplayComponents() returned a null List.