edu.ucsb.nceas.morpho.plugins.datapackagewizard
Class CustomList

java.lang.Object
  extended byjava.awt.Component
      extended byjava.awt.Container
          extended byjavax.swing.JComponent
              extended byjavax.swing.JPanel
                  extended byedu.ucsb.nceas.morpho.plugins.datapackagewizard.CustomList
All Implemented Interfaces:
javax.accessibility.Accessible, java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable

public class CustomList
extends javax.swing.JPanel

Interface CustomList

See Also:
Serialized Form

Nested Class Summary
 
Nested classes inherited from class javax.swing.JPanel
javax.swing.JPanel.AccessibleJPanel
 
Nested classes inherited from class javax.swing.JComponent
javax.swing.JComponent.AccessibleJComponent
 
Nested classes inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
 
Nested classes inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
 
Field Summary
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.AddAction addAction
           
static short AND
           
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.DeleteAction deleteAction
           
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.DuplicateAction duplicateAction
           
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.EditAction editAction
           
static short EMPTY_STRING_NOTRIM
           
static short EMPTY_STRING_TRIM
           
static short IGNORE
           
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.MoveDownAction moveDownAction
           
protected  edu.ucsb.nceas.morpho.plugins.datapackagewizard.MoveUpAction moveUpAction
           
static short NULL
           
static short OR
           
 
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 java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
CustomList(java.lang.String[] colNames, java.lang.Object[] columnEditors, int displayRows, boolean showAddButton, boolean showEditButton, boolean showDuplicateButton, boolean showDeleteButton, boolean showMoveUpButton, boolean showMoveDownButton)
          constructor - creates a multi-column list based on the parameters passed:
 
Method Summary
 void addRow(java.util.List rowList)
          adds the row to the list after the currently-selected row, or at the end if no row is selected.
 void deleteEmptyRows(short logicMode, short[] conditions)
          Removes any rows that are "empty", as defined by the parameters specified in the passed short array "conditions", as described below.
 void editCellAt(int row, int col)
          Method to edit a particular cell.
 void fireAddAction()
          Method to fire the Add action of the CustomList.
 void fireDeleteAction()
          Method to fire the Delete action of the CustomList.
 void fireDuplicateAction()
          Method to fire the Duplicate action of the CustomList.
 void fireEditAction()
          Method to fire the Edit action of the CustomList.
 void fireEditingStopped()
          Tells the list to stop editing and commit all edited values to the model.
 void fireMoveDownAction()
          Method to fire the Move-Down action of the CustomList.
 void fireMoveUpAction()
          Method to fire the Move-Up action of the CustomList.
 void focusAddButton()
          Gives the "Add" button keyboard focus
 javax.swing.Action getCustomAddAction()
          Gets the javax.swing.Action to be executed on pressing the ADD button.
 javax.swing.Action getCustomDeleteAction()
          Gets the javax.swing.Action to be executed on pressing the appropriate list button.
 javax.swing.Action getCustomDuplicateAction()
          Gets the javax.swing.Action to be executed on pressing the appropriate list button.
 javax.swing.Action getCustomEditAction()
          Gets the javax.swing.Action to be executed on pressing the appropriate list button.
 java.util.List getListOfRowLists()
          returns a java.util.List containing elements that are also java.util.List objects, each of which represents a row from the list.
 int getRowCount()
          returns the total number of rows in the list
 int getSelectedRowIndex()
          returns the index of the currently-selected row, or -1 if none selected
 java.util.List getSelectedRowList()
          returns the List containing the objects in the currently-selected row, or null if none selected
 java.util.List[] getSelectedRows()
          returns an array of Lists containing the objects in the currently-selected rows, or null if none selected
 javax.swing.event.TableModelEvent getTableModelEvent()
           
 boolean isEnabled()
          Gets the boolean indicating whether the customlist is enabled or not
 void removeAllRows()
          removes all the rows from the list
 void removeRow(int row)
          removes the row with the specified index from the list
 void replaceRow(int rowIndex, java.util.List newRow)
          replaces the row corresponding to the given row number with the Objects in the List provided,or with a blank row if the List is null.
 void replaceSelectedRow(java.util.List newRow)
          replaces the currently-selected row with the Objects in the List provided, or with a blank row if the List is null
 void scrollToRow(int row)
          Scrolls the CustomList (if necessary) to the particular row such that it becomes visible.
 void selectAndEditCell(int row, int col)
           
 void setBackground(java.awt.Color bgColor)
          Sets the boolean to indicate whether the customlist can be edited or not.
 void setBorderForButtonPanel(int top, int left, int bottom, int right)
          Sets the border widths for the button Panel.
 void setColumnWidthPercentages(double[] columnWidths)
          Sets the relative widths of each column in the columnList.
 void setCustomAddAction(javax.swing.Action a)
          Sets the javax.swing.Action to be executed on pressing the ADD button.
 void setCustomDeleteAction(javax.swing.Action a)
          Sets the javax.swing.Action to be executed on pressing the appropriate list button.
 void setCustomDuplicateAction(javax.swing.Action a)
          Sets the javax.swing.Action to be executed on pressing the appropriate list button.
 void setCustomEditAction(javax.swing.Action a)
          Sets the javax.swing.Action to be executed on pressing the appropriate list button.
 void setEditable(boolean editable)
          Sets the boolean to indicate whether the customlist can be edited or not.
 void setEnabled(boolean enabled)
          Sets the boolean to indicate whether the customlist should be disabled or not.
 void setListButtonDimensions(java.awt.Dimension dims)
          Sets the dimensions for all the buttons in the custom list.
 void setSelectedRows(int[] idx)
           
 
Methods inherited from class javax.swing.JPanel
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
 
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addPropertyChangeListener, addPropertyChangeListener, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBorder, getBounds, getClientProperty, getComponentGraphics, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getGraphics, getHeight, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isOptimizedDrawingEnabled, isPaintingTile, isPreferredSizeSet, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBorder, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setFont, setForeground, 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, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setFocusCycleRoot, setFocusTraversalKeys, setFocusTraversalPolicy, 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, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMouseWheelListeners, getName, getParent, getPeer, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, 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, processMouseEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, 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

NULL

public static final short NULL
See Also:
Constant Field Values

EMPTY_STRING_TRIM

public static final short EMPTY_STRING_TRIM
See Also:
Constant Field Values

EMPTY_STRING_NOTRIM

public static final short EMPTY_STRING_NOTRIM
See Also:
Constant Field Values

IGNORE

public static final short IGNORE
See Also:
Constant Field Values

OR

public static final short OR
See Also:
Constant Field Values

AND

public static final short AND
See Also:
Constant Field Values

addAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.AddAction addAction

deleteAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.DeleteAction deleteAction

editAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.EditAction editAction

duplicateAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.DuplicateAction duplicateAction

moveUpAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.MoveUpAction moveUpAction

moveDownAction

protected edu.ucsb.nceas.morpho.plugins.datapackagewizard.MoveDownAction moveDownAction
Constructor Detail

CustomList

public CustomList(java.lang.String[] colNames,
                  java.lang.Object[] columnEditors,
                  int displayRows,
                  boolean showAddButton,
                  boolean showEditButton,
                  boolean showDuplicateButton,
                  boolean showDeleteButton,
                  boolean showMoveUpButton,
                  boolean showMoveDownButton)
constructor - creates a multi-column list based on the parameters passed:

Parameters:
colNames - array containing Strings for column names that will be displayed at the top of each column.
columnEditors - array containing Objects that this class will use as the default display and editing widget for the cells in each column. For example,

                    String[] listValues = new String[] {"item 1", "item 2"};
                    Object[] columnEditors
                          = new Object[] {  new JComboBox(listValues),
                                            new JTextField() };

                  
If any array element is null, the corresponding column will be made non-editable, and if the entire array is null, all columns will be made non-editable.
displayRows - the number of rows that should be shown in the list for display purposes. Note that this will be overridden if, for example, the list is added to the center of a BorderLayout
showAddButton - boolean value to indicate whether this button is displayed next to the list
showEditButton - boolean value to indicate whether this button is displayed next to the list
showDuplicateButton - boolean value to indicate whether this button is displayed next to the list
showDeleteButton - boolean value to indicate whether this button is displayed next to the list
showMoveUpButton - boolean value to indicate whether this button is displayed next to the list
showMoveDownButton - boolean value to indicate whether this button is displayed next to the list
Method Detail

getTableModelEvent

public javax.swing.event.TableModelEvent getTableModelEvent()
Returns:
the TableModelEvent to be reused when requesting table updates

setColumnWidthPercentages

public void setColumnWidthPercentages(double[] columnWidths)
Sets the relative widths of each column in the columnList. This is used when unequally sized columns are needed. Input is an array of doubles containing the percentage width of each column. The length of the array must equal the number of columns in the customList and the sum of the percentages must equal 100.

Parameters:
columnWidths - the array of doubles representing the percentage widths of the columns

setBorderForButtonPanel

public void setBorderForButtonPanel(int top,
                                    int left,
                                    int bottom,
                                    int right)
Sets the border widths for the button Panel.

Parameters:
top - the spacing on top of the button panel
left - the spacing on left of the button panel
bottom - the spacing on bottom of the button panel
right - the spacing on right of the button panel

setListButtonDimensions

public void setListButtonDimensions(java.awt.Dimension dims)
Sets the dimensions for all the buttons in the custom list.

Parameters:
dims - the required Dimension for all the buttons

focusAddButton

public void focusAddButton()
Gives the "Add" button keyboard focus


scrollToRow

public void scrollToRow(int row)
Scrolls the CustomList (if necessary) to the particular row such that it becomes visible. This can be used to scroll the custom list to the top or bottom.

Parameters:
row - the row to be scrolled to.

fireEditingStopped

public void fireEditingStopped()
Tells the list to stop editing and commit all edited values to the model. Typically called by a wizard page when next> is pressed, so all changes are committed before validation.


fireAddAction

public void fireAddAction()
Method to fire the Add action of the CustomList. A row is added to the customlist as a result.This is useful when the customlist needs to be controlled from outside.


fireEditAction

public void fireEditAction()
Method to fire the Edit action of the CustomList. The selected row is edited as a result.This is useful when the customlist needs to be controlled from outside.


fireDeleteAction

public void fireDeleteAction()
Method to fire the Delete action of the CustomList. The selected row is deleted as a result.This is useful when the customlist needs to be controlled from outside.


fireDuplicateAction

public void fireDuplicateAction()
Method to fire the Duplicate action of the CustomList. The selected row is duplicated * as a result.This is useful when the customlist needs to be controlled from outside.


fireMoveUpAction

public void fireMoveUpAction()
Method to fire the Move-Up action of the CustomList. The selected row is moved one row up as a result.This is useful when the customlist needs to be controlled from outside.


fireMoveDownAction

public void fireMoveDownAction()
Method to fire the Move-Down action of the CustomList. The selected row is moved one row down as a result.This is useful when the customlist needs to be controlled from outside.


getSelectedRowIndex

public int getSelectedRowIndex()
returns the index of the currently-selected row, or -1 if none selected

Returns:
the index of the currently-selected row, or -1 if none selected

getSelectedRowList

public java.util.List getSelectedRowList()
returns the List containing the objects in the currently-selected row, or null if none selected

Returns:
the List containing the objects in the currently-selected row, or null if none selected

getSelectedRows

public java.util.List[] getSelectedRows()
returns an array of Lists containing the objects in the currently-selected rows, or null if none selected

Returns:
the List containing the objects in the currently-selected row, or null if none selected

setSelectedRows

public void setSelectedRows(int[] idx)

replaceSelectedRow

public void replaceSelectedRow(java.util.List newRow)
replaces the currently-selected row with the Objects in the List provided, or with a blank row if the List is null

Parameters:
newRow - List containing the objects in the new row that will replace the currently-selected row.

replaceRow

public void replaceRow(int rowIndex,
                       java.util.List newRow)
replaces the row corresponding to the given row number with the Objects in the List provided,or with a blank row if the List is null. Row numbers are 0-indexed.

Parameters:
rowIndex - index of the row to be replaced
newRow - List containing the objects in the new row that will replace the currently-selected row.

getRowCount

public int getRowCount()
returns the total number of rows in the list

Returns:
the total number of rows in the list

addRow

public void addRow(java.util.List rowList)
adds the row to the list after the currently-selected row, or at the end if no row is selected. Then scrolls to make the new row visible.

Parameters:
rowList - List defining the row data. If the list has "n" columns, the passed List may have 0 -> (n+1) elements as follows:
  • 0..n represents the actual data that will appear displayed in the list columns. If the number of elements is less than the number of display columns, the remaining columns will appear blank
  • List element (n+1) is the optional "user object", which may be any object that the user wants to associate with this row

removeRow

public void removeRow(int row)
removes the row with the specified index from the list

Parameters:
row - index of the row to be removed

removeAllRows

public void removeAllRows()
removes all the rows from the list


deleteEmptyRows

public void deleteEmptyRows(short logicMode,
                            short[] conditions)
Removes any rows that are "empty", as defined by the parameters specified in the passed short array "conditions", as described below. The elements of the "conditions" array correspond to the columns in the table (so element [0] defines the first column, element [1] the second, and so on). Legal values for the "conditions" array are as follows:

getListOfRowLists

public java.util.List getListOfRowLists()
returns a java.util.List containing elements that are also java.util.List objects, each of which represents a row from the list. Therefore, element 0 in the return List will contain a List that has the first row objects in it, and so on. Each row element will contain the objects used to poopulate the list's (table-)model, so the minimum number of entries in a row will be zero, and the max number will equal the number of columns in the list

Returns:
a java.util.List containing elements that are also java.util.List objects, each of which represents a row from the list

setCustomAddAction

public void setCustomAddAction(javax.swing.Action a)
Sets the javax.swing.Action to be executed on pressing the ADD button. NOTE that if no custom add action is set, or if a null action is set, the ADD button's 'private' Action (defined elsewhere in this class) will be executed; otherwise the custom action will be executed (and the 'private' Action will NOT be executed). Note that this behavior is different for the other custom action get/set methods, which are executed IN ADDITION to private actions

Parameters:
a - javax.swing.Action to be executed

getCustomAddAction

public javax.swing.Action getCustomAddAction()
Gets the javax.swing.Action to be executed on pressing the ADD button. NOTE that if no custom add action is set, or if a null action is set, the ADD button's 'private' Action (defined elsewhere in this class) will be executed; otherwise the custom action will be executed (and the 'private' Action will NOT be executed). Note that this behavior is different for the other custom action get/set methods, which are executed IN ADDITION to private actions

Returns:
the javax.swing.Action to be executed

setCustomEditAction

public void setCustomEditAction(javax.swing.Action a)
Sets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that the button's 'private' Action (defined elsewhere in this class) will be executed first, and then the custom action will be executed

Parameters:
a - javax.swing.Action to be executed

getCustomEditAction

public javax.swing.Action getCustomEditAction()
Gets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that the button's 'private' Action (defined elsewhere in this class) will be executed first, and then the custom action will be executed

Returns:
the javax.swing.Action to be executed

setCustomDuplicateAction

public void setCustomDuplicateAction(javax.swing.Action a)
Sets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that the button's 'private' Action (defined elsewhere in this class) will be executed first, and then the custom action will be executed

Parameters:
a - javax.swing.Action to be executed

getCustomDuplicateAction

public javax.swing.Action getCustomDuplicateAction()
Gets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that the button's 'private' Action (defined elsewhere in this class) will be executed first, and then the custom action will be executed

Returns:
the javax.swing.Action to be executed

setCustomDeleteAction

public void setCustomDeleteAction(javax.swing.Action a)
Sets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that if no custom delete action is set, or if a null action is set, the DELETE button's 'private' Action (defined elsewhere in this class) will be executed; otherwise the custom action will be executed (and the 'private' Action will NOT be executed). Note that this behavior is different for the other custom action get/set methods, which are executed IN ADDITION to private actions

Parameters:
a - javax.swing.Action to be executed

getCustomDeleteAction

public javax.swing.Action getCustomDeleteAction()
Gets the javax.swing.Action to be executed on pressing the appropriate list button. NOTE that the button's 'private' Action (defined elsewhere in this class) will be executed first, and then the custom action will be executed

Returns:
the javax.swing.Action to be executed

setEditable

public void setEditable(boolean editable)
Sets the boolean to indicate whether the customlist can be edited or not. If false, all the columns are made non-editable

Parameters:
editable - boolean indicating whether the custom list can be edited or not

editCellAt

public void editCellAt(int row,
                       int col)
Method to edit a particular cell. This method call results in the cursor being placed at that cell for editing (if the cell is editable).

Parameters:
row - the row of the cell
col - the column of the cell

selectAndEditCell

public void selectAndEditCell(int row,
                              int col)

setEnabled

public void setEnabled(boolean enabled)
Sets the boolean to indicate whether the customlist should be disabled or not. If false, all the columns are made non-editable and the buttons are disabled

Parameters:
enabled - boolean indicating whether the custom list be enabled or not

isEnabled

public boolean isEnabled()
Gets the boolean indicating whether the customlist is enabled or not

Returns:
boolean true custom list is enabled and false otherwise

setBackground

public void setBackground(java.awt.Color bgColor)
Sets the boolean to indicate whether the customlist can be edited or not. If false, all the columns are made non-editable

Parameters:
bgColor - boolean indicating whether the custom list can be edited or not


Copyright © 2000 National Center for Ecological Analysis and Synthesis. All Rights Reserved.