/********************************************************************************
* *
* (c) Copyright 2010 Verizon Communications USA and The Open University UK *
* *
* This software is freely distributed in accordance with *
* the GNU Lesser General Public (LGPL) license, version 3 or later *
* as published by the Free Software Foundation. *
* For details see LGPL: http://www.fsf.org/licensing/licenses/lgpl.html *
* and GPL: http://www.fsf.org/licensing/licenses/gpl-3.0.html *
* *
* This software is provided by the copyright holders and contributors "as is" *
* and any express or implied warranties, including, but not limited to, the *
* implied warranties of merchantability and fitness for a particular purpose *
* are disclaimed. In no event shall the copyright owner or contributors be *
* liable for any direct, indirect, incidental, special, exemplary, or *
* consequential damages (including, but not limited to, procurement of *
* substitute goods or services; loss of use, data, or profits; or business *
* interruption) however caused and on any theory of liability, whether in *
* contract, strict liability, or tort (including negligence or otherwise) *
* arising in any way out of the use of this software, even if advised of the *
* possibility of such damage. *
* *
********************************************************************************/
package com.compendium.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.NoSuchElementException;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.border.AbstractBorder;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.compendium.LanguageProperties;
import com.compendium.ProjectCompendium;
import com.compendium.core.ICoreConstants;
import com.compendium.core.datamodel.IModel;
import com.compendium.core.datamodel.ModelSessionException;
import com.compendium.core.datamodel.NodePosition;
import com.compendium.core.datamodel.NodeSummary;
import com.compendium.core.datamodel.PCSession;
import com.compendium.core.datamodel.View;
import com.compendium.ui.dialogs.UINodeContentDialog;
import com.compendium.ui.plaf.ListUI;
import com.compendium.ui.plaf.NodeUI;
import com.compendium.ui.plaf.ViewPaneUI;
import com.compendium.ui.popups.UIViewOutlinePopupMenu;
/**
* This class is used to display outline view.
* Holds the data for and handles the events of the tree node in the outline view.
* @author Lakshmi Prabhakaran
*/
public class UIViewOutline extends JPanel implements IUIConstants, ActionListener, TreeExpansionListener,
TreeSelectionListener, PropertyChangeListener, TreeWillExpandListener {
/**
* class's own logger
*/
final Logger log = LoggerFactory.getLogger(getClass());
/** The serial version id */
private static final long serialVersionUID = -673517173364176061L;
/** the object of this class */
public static UIViewOutline me = null;
/** The scrollpane for the stencil set.*/
private JScrollPane oScrollPane = null;
/** Has this panel been drawn yet?*/
private boolean drawn = false;
/** The string value of this outline view.*/
private String sMode = ""; //$NON-NLS-1$
/** The JTree to display outline view */
private JTree tree = null;
/** List of Parent Node IDs against Child nodes */
private Hashtable htNodes = new Hashtable();
/** A list of listeners objects */
private static Vector viewListener = new Vector();
/** The cache model for the currently open database.*/
private IModel oModel = ProjectCompendium.APP.getModel();
/** The session for this model.*/
private PCSession oSession = oModel.getSession();
/** The root Node of the tree */
protected static DefaultMutableTreeNode rootNode = null;
/** The tree Model for the JTree. */
private DefaultTreeModel treeModel = null;
/** The name of the project in the outline view.*/
private String sProject = ""; //$NON-NLS-1$
/** A list of nodes against nodeSummary */
private Hashtable htTreeNodes = new Hashtable();
/** A list of nodes against parent node */
private Hashtable htNodeParent = new Hashtable();
/** Currently selected node */
private UIViewOutlineTreeNode selectedNode = null;
/** The view in which the currently selected node exists. */
private View selectedView = null;
/** Currently selected node's NodeSummary */
private NodeSummary selectedNodeSummary = null;
/** The author name of the current user.*/
private String sAuthor = ""; //$NON-NLS-1$
/** The node right-click popup menu associated with this node - null if one has not been opened yet.*/
private UIViewOutlinePopupMenu popup = null;
/** The button to close the outline view.*/
private UIButton pbCancel = null;
/**
* Constructor. Create a new instance of UIViewOutline, for a outline view.
* @param name, the name of the Tab
* @param sProject, The name of the project in the outline view.
*/
public UIViewOutline(String sProject, String name) {
this.sProject = sProject;
this.sMode = name;
setAuthor(oModel.getUserProfile().getUserName());
UIViewOutline.me = this;
}
/**
* Draws the contents of this panel.
*/
public void draw() {
ProjectCompendium.APP.setWaitCursor();
setLayout(new BorderLayout());
UIViewOutlineTreeNode node = new UIViewOutlineTreeNode(sProject, -1);
rootNode = new DefaultMutableTreeNode(node);
treeModel = new DefaultTreeModel(rootNode);
tree = new JTree(treeModel);
tree.setFont(ProjectCompendiumFrame.currentDefaultFont);
addNodesToTree();
// Create a tree that allows one selection at a time.
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
tree.setEditable(true);
tree.setShowsRootHandles(true);
tree.setToggleClickCount(4);
//keep root node expanded
tree.expandPath(tree.getPathForRow(0));
// Set the icon for nodes.
TreeNodeRenderer renderer = new TreeNodeRenderer();
tree.setCellRenderer(renderer);
// Enable tool tips.
ToolTipManager.sharedInstance().registerComponent(tree);
// Set the cell editor to modify nodes
TreeCellEditor cellEditor = new TreeNodeEditor(tree, (DefaultTreeCellRenderer)tree.getCellRenderer());
tree.setCellEditor(cellEditor);
// Listen for the changes.
treeModel.addTreeModelListener(new OutlineTreeModelListener());
tree.addTreeSelectionListener(this);
tree.addTreeWillExpandListener(this);
tree.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent arg0) {
TreePath path = tree.getSelectionPath();
if(path != null){
DefaultMutableTreeNode treeNode = (((DefaultMutableTreeNode) path.getLastPathComponent()));
UIViewOutlineTreeNode node =(UIViewOutlineTreeNode)treeNode.getUserObject();
if( treeNode != rootNode){
setStatus(node.getObject());
}
}else{
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
}
public void focusLost(FocusEvent arg0) {
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
});
tree.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(tree.isFocusOwner() && selectedNode != null){
int modifier = e.getModifiers();
int shortcutKey = ProjectCompendium.APP.shortcutKey;
int keyCode = e.getKeyCode();
if(modifier == shortcutKey){
switch (keyCode) {
case KeyEvent.VK_C: {
onCopy();
break;
}
case KeyEvent.VK_X: {
onCut();
break ;
}
case KeyEvent.VK_V: {
onPaste();
break;
}
}
} else if((keyCode == KeyEvent.VK_DELETE && modifier == 0) &&
selectedNode != rootNode.getUserObject()){
onDelete();
} else if((keyCode == KeyEvent.VK_F12 && modifier == 0) &&
selectedNode != rootNode.getUserObject()){
onMarkSeenUnseen(selectedNodeSummary, ICoreConstants.READSTATE);
} else if((modifier == Event.SHIFT_MASK && keyCode == KeyEvent.VK_F12) &&
selectedNode != rootNode.getUserObject()){
onMarkSeenUnseen(selectedNodeSummary, ICoreConstants.UNREADSTATE);
}
e.consume();
if(popup != null)
popup.onCancel();
return ;
}
}
});
tree.addMouseListener(new MouseAdapter(){
public void mouseExited(MouseEvent evt){
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
public void mouseClicked(MouseEvent evt) {
TreePath selPath = tree.getPathForLocation(evt.getX(), evt.getY());
UIViewOutlineTreeNode parentNode = null;
UIViewOutlineTreeNode childNode = null;
DefaultMutableTreeNode treeNode = null;
selectedView = null;
selectedNode = null;
boolean isLevelOneNode = true;
boolean isRightMouse = SwingUtilities.isRightMouseButton(evt);
boolean isLeftMouse = SwingUtilities.isLeftMouseButton(evt);
if (ProjectCompendium.isMac &&
(evt.getButton() == 3 && evt.isShiftDown()) ||
(evt.getButton() == 1 && evt.isAltDown())) {
isRightMouse = true;
isLeftMouse = false;
}
if(selPath != null ) {
treeNode = (((DefaultMutableTreeNode) selPath.getLastPathComponent()));
childNode =(UIViewOutlineTreeNode)treeNode.getUserObject();
selectedNode = childNode ;
if(!treeNode.equals(rootNode)){
DefaultMutableTreeNode parent = null;
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
Object[] nodes = (Object[]) selPath.getPath();
if(nodes.length > 2){
// parent view is the node at level 1
parent = (DefaultMutableTreeNode)nodes[1];
parentNode = (UIViewOutlineTreeNode) parent.getUserObject();
isLevelOneNode = false;
selectedView = View.getView(parentNode.getId());
} else {
selectedView = View.getView(childNode.getId());
}
if(View.isViewType(childNode.getType())) {
parentNode = childNode;
}
}
else {
if(!childNode.getObject().equals(ProjectCompendium.APP.getHomeView())){
parent = (DefaultMutableTreeNode)treeNode.getParent();
parentNode = (UIViewOutlineTreeNode) parent.getUserObject();
selectedView = View.getView(parentNode.getId());
isLevelOneNode = false;
}
if(View.isViewType(childNode.getType())) {
parentNode = childNode;
}
}
View parentView = View.getView(parentNode.getId());
NodeSummary child = (NodeSummary)childNode.getObject();
setStatus(child);
if(isLeftMouse){
// if single click open the view,
// if double click open its contents.
//which also opens view first as single click processed too.
if (evt.getClickCount() == 2){
int type = child.getType();
if (type == ICoreConstants.REFERENCE || type == ICoreConstants.REFERENCE_SHORTCUT) {
openReference(child, parentView);
} else {
openContents(child, UINodeContentDialog.CONTENTS_TAB);
}
} else if(evt.getClickCount() == 1){
// Open the view if it is a Map/ List other wise open the parent view.
openView(parentView, child);
}
} else if(isRightMouse){
tree.setSelectionPath(selPath);
NodeSummary node = (NodeSummary)childNode.getObject();
String sNodeID = node.getId();
if (sNodeID.equals(ProjectCompendium.APP.getInBoxID())){
return ;
}
popup = new UIViewOutlinePopupMenu("Popup Menu", node, UIViewOutline.this, isLevelOneNode); //$NON-NLS-1$
popup.show(tree, evt.getX()+ 20, evt.getY());
}
}
tree.requestFocus();
evt.consume();
}
}
});
Dimension size = tree.getPreferredSize();
oScrollPane = new JScrollPane(tree);
oScrollPane.setBackground(Color.white);
oScrollPane.setPreferredSize(new Dimension(300, size.height));
add(oScrollPane, BorderLayout.CENTER);
add(createButtonPanel(), BorderLayout.SOUTH);
updateTreeSelection();
drawn = true;
ProjectCompendium.APP.setDefaultCursor();
}
/**
* Return the font size to its default and then appliy the passed text zoom.
* (To the default specificed by the user in the Project Options)
*/
public void onReturnTextAndZoom(int zoom) {
Font font = ProjectCompendiumFrame.currentDefaultFont;
Font newFont = new Font(font.getName(), font.getStyle(), font.getSize()+zoom);
tree.setFont(newFont);
FontMetrics metrics = tree.getFontMetrics(newFont);
tree.setRowHeight(metrics.getHeight());
}
/**
* Return the font size to its default
* (To the default specificed by the user in the Project Options)
*/
public void onReturnTextToActual() {
tree.setFont(ProjectCompendiumFrame.currentDefaultFont);
FontMetrics metrics = tree.getFontMetrics(ProjectCompendiumFrame.currentDefaultFont);
tree.setRowHeight(metrics.getHeight());
}
/**
* Increase the currently dislayed font size by one point.
*/
public void onIncreaseTextSize() {
Font font = tree.getFont();
Font newFont = new Font(font.getName(), font.getStyle(), font.getSize()+1);
tree.setFont(newFont);
FontMetrics metrics = tree.getFontMetrics(newFont);
tree.setRowHeight(metrics.getHeight());
}
/**
* Reduce the currently dislayed font size by one point.
*/
public void onReduceTextSize() {
Font font = tree.getFont();
Font newFont = new Font(font.getName(), font.getStyle(), font.getSize()-1);
tree.setFont(newFont);
FontMetrics metrics = tree.getFontMetrics(newFont);
tree.setRowHeight(metrics.getHeight());
}
/**
* Create and return the button panel.
*/
private JPanel createButtonPanel() {
JPanel oButtonPanel = new JPanel();
pbCancel = new UIButton(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.closeButton")); //$NON-NLS-1$
pbCancel.setMnemonic(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.closeButtonMnemonic").charAt(0)); //$NON-NLS-1$
pbCancel.addActionListener(this);
oButtonPanel.add(pbCancel);
return oButtonPanel;
}
/**
* Get the name for this tab.
* @return String, the name of this tab.
*/
public String getObjectName() {
return sMode;
}
/**
* Sets the name for this tab.
*/
public void setObjectName(String s ) {
sMode = s;
}
/**
* @return Returns the rootNode.
*/
public static DefaultMutableTreeNode getRootNode() {
return rootNode;
}
/**
* Has this panel been drawn yet?
* @return boolean, true if the panel has been drawn, else false.
*/
public boolean isDrawn() {
return drawn;
}
/**
* Refresh the tree
*
*/
public void refreshTree(){
tree.repaint();
}
/**
* adds nodes to the tree depending on the option selected
*
*/
public void addNodesToTree(){
rootNode.removeAllChildren();
// Create the nodes according the option selected
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
createViewsAndNodes();
} else if (sMode.equals(DISPLAY_VIEWS_ONLY)) {
View homeView = oModel.getUserProfile().getHomeView();
homeView.initialize(oSession,oModel);
UIViewOutlineTreeNode top = new UIViewOutlineTreeNode(homeView);
DefaultMutableTreeNode topNode = new DefaultMutableTreeNode(top);
if( !homeView.getListenerList().contains(this)){
homeView.addPropertyChangeListener(this);
}
addToTreeNodes(topNode, top.getId());
rootNode.add(topNode);
createViewNodes(topNode, true);
}
tree.repaint();
treeModel.reload(rootNode);
}
/**
* Displays the author, creation date and detail in the status bar
* @param oNode NodeSummary of the node
*/
private void setStatus(NodeSummary oNode){
String sStatus = ""; //$NON-NLS-1$
String author = oNode.getAuthor();
String creationDate = (UIUtilities.getSimpleDateFormat("dd, MMMM, yyyy h:mm a").format(oNode.getCreationDate()).toString()); //$NON-NLS-1$
String showtext = author + " " + creationDate +", " + //$NON-NLS-1$ //$NON-NLS-2$
oNode.getDetail();
if (showtext != null) {
showtext = showtext.replace('\n',' ');
showtext = showtext.replace('\r',' ');
showtext = showtext.replace('\t',' ');
sStatus = showtext;
}
ProjectCompendium.APP.setStatus(sStatus);
}
/**
* Marks seen/unseen for the given node
* @param node com.compendium.code.datamodel.NodeSummary, the node associated with this menu.
* @param state, the state to set
*/
public void onMarkSeenUnseen(NodeSummary node, int state){
try {
String nodeID = node.getId();
String homeID = ProjectCompendium.APP.getHomeView().getId();
String inboxID = ProjectCompendium.APP.getInBoxID();
if(!(nodeID.equals(homeID) || nodeID.equals(inboxID))) {
node.setState(state);
// Bug Fix - State change doesn't reflect in List views immediately.
Vector views = node.getMultipleViews();
if(node instanceof View){
views.add(node);
}
refreshViews(views);
}
} catch(Exception io) {
if(state == ICoreConstants.READSTATE)
log.info("Unable to mark as seen"); //$NON-NLS-1$
else
log.info("Unable to mark as un-seen"); //$NON-NLS-1$
}
}
/**
* Marks seen/unseen for whole view
* @param view com.compendium.code.datamodel.View, the view associated with this menu.
* @param state, the state to set
*/
public void onMarkAll(View view, int state){
try {
String viewID = view.getId();
String homeID = ProjectCompendium.APP.getHomeView().getId();
String inboxID = ProjectCompendium.APP.getInBoxID();
if(!(viewID.equals(homeID) || viewID.equals(inboxID))) {
view.setState(state);
Vector views = new Vector();
views.add(view);
refreshViews(views);
}
Enumeration nodes = oModel.getNodeService().getChildNodes(oSession, view.getId());
for(Enumeration e = nodes;e.hasMoreElements();) {
NodeSummary nodeSummary = (NodeSummary)e.nextElement();
String nodeID = nodeSummary.getId();
if(!(nodeID.equals(homeID) || nodeID.equals(inboxID))) {
nodeSummary.setState(state);
Vector views = nodeSummary.getMultipleViews();
if(nodeSummary instanceof View){
views.add(nodeSummary);
}
refreshViews(views);
}
}
} catch(Exception io) {
if(state == ICoreConstants.READSTATE)
log.info("Unable to mark as seen"); //$NON-NLS-1$
else
log.info("Unable to mark as un-seen"); //$NON-NLS-1$
}
}
/**
* Repaints the view frames.
* @param views , The views to be refreshed
*/
private void refreshViews(Vector views) {
for(int i = 0; i < views.size(); i++){
View view = (View)views.get(i);
UIViewFrame internalFrame = ProjectCompendium.APP.getInternalFrame(view);
if(internalFrame != null){
ProjectCompendium.APP.getAllFrames().remove(internalFrame);
internalFrame.dispose();
internalFrame = ProjectCompendium.APP.addViewToDesktop(view, view.getLabel());
try {
internalFrame.setClosed(false);
} catch (PropertyVetoException e) {
log.error("Error...", e);
}
if(view.equals(ProjectCompendium.APP.getHomeView())){
String label = " " +oModel.getUserProfile().getUserName() + "\'s " + view.getLabel(); //$NON-NLS-1$ //$NON-NLS-2$
internalFrame.setTitle(label);
internalFrame.setClosable(false);
}
// internalFrame.setNavigationHistory(internalFrame.getChildNavigationHistory());
}
}
}
/**
* Copies the selected node to clipboard
*/
public void onCopy(){
TreePath treePath = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
UIViewOutlineTreeNode treeNode = (UIViewOutlineTreeNode)node.getUserObject();
NodeSummary oNode = treeNode.getObject();
if(oNode.equals(ProjectCompendium.APP.getHomeView()) || oNode.getId().equals(ProjectCompendium.APP.getInBoxID())){
return ;
}
if(selectedView == null || selectedView.equals(oNode)){
Vector parentViews;
try {
parentViews = oNode.getMultipleViews();
selectedView = (View) parentViews.get(0);
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
}
UIViewFrame oViewFrame = ProjectCompendium.APP.getViewFrame(selectedView, selectedView.getLabel());
UIViewFrame currentFrame = ProjectCompendium.APP.getCurrentFrame();
if (oViewFrame instanceof UIMapViewFrame) {
UIViewPane oPane = ((UIMapViewFrame)oViewFrame).getViewPane();
UINode uinode = (UINode) oPane.get(oNode.getId());
uinode.setSelected(true);
oPane.setSelectedNode(uinode, ICoreConstants.SINGLESELECT);
NodeUI nodeUI = uinode.getUI();
if (uinode != null) {
if (uinode.isSelected()) {
oPane.getUI().copyToClipboard(null);
}
else {
uinode.getViewPane().getUI().copyToClipboard(nodeUI);
}
uinode.setSelected(false);
uinode.requestFocus();
}
} else {
UIListViewFrame oListViewFrame = (UIListViewFrame)oViewFrame;
UIList oUIList = oListViewFrame.getUIList();
oUIList.selectNode(oUIList.getIndexOf(oNode), ICoreConstants.SINGLESELECT);
ListUI listui = oUIList.getListUI();
listui.copyToClipboard();
oUIList.deselectAll();
}
if(!currentFrame.equals(oViewFrame)){
oViewFrame.moveToBack();
}
}// End of function OnCopy()
/**
* Cuts the selected node to clipboard
*/
public void onCut(){
TreePath treePath = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
UIViewOutlineTreeNode treeNode = (UIViewOutlineTreeNode)node.getUserObject();
NodeSummary oNode = treeNode.getObject();
if(oNode.equals(ProjectCompendium.APP.getHomeView()) || oNode.getId().equals(ProjectCompendium.APP.getInBoxID())){
return ;
}
if(selectedView == null ||selectedView.equals(oNode)){
Vector parentViews;
try {
parentViews = oNode.getMultipleViews();
selectedView = (View) parentViews.get(0);
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
}
UIViewFrame oViewFrame = ProjectCompendium.APP.getViewFrame(selectedView, selectedView.getLabel());
UIViewFrame currentFrame = ProjectCompendium.APP.getCurrentFrame();
if (oViewFrame instanceof UIMapViewFrame) {
UIViewPane oPane = ((UIMapViewFrame)oViewFrame).getViewPane();
UINode uinode = (UINode) oPane.get(oNode.getId());
uinode.setSelected(true);
oPane.setSelectedNode(uinode, ICoreConstants.SINGLESELECT);
NodeUI nodeUI = uinode.getUI();
if (uinode != null) {
if (uinode.isSelected()) {
oPane.getUI().cutToClipboard(null);
}
else {
uinode.getViewPane().getUI().cutToClipboard(nodeUI);
}
uinode.requestFocus();
}
} else {
UIListViewFrame oListViewFrame = (UIListViewFrame)oViewFrame;
UIList oUIList = oListViewFrame.getUIList();
oUIList.selectNode(oUIList.getIndexOf(oNode), ICoreConstants.SINGLESELECT);
ListUI listui = oUIList.getListUI();
listui.cutToClipboard();
}
if(!currentFrame.equals(oViewFrame)){
oViewFrame.moveToBack();
}
}// End of function OnCut()
/**
* Paste the node from clipboard
*/
public void onPaste(){
TreePath treePath = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
UIViewOutlineTreeNode treeNode = (UIViewOutlineTreeNode)node.getUserObject();
NodeSummary oNode = treeNode.getObject();
if(oNode.getId().equals(ProjectCompendium.APP.getInBoxID()) || (!(oNode instanceof View))){
return ;
}
ProjectCompendium.APP.ht_pasteCheck.clear();
UIViewFrame oViewFrame = ProjectCompendium.APP.addViewToDesktop((View)oNode, oNode.getLabel());
if (oViewFrame instanceof UIMapViewFrame) {
ViewPaneUI paneUI = ( ((UIMapViewFrame)oViewFrame).getViewPane().getUI());
paneUI.pasteFromClipboard();
ProjectCompendium.APP.scaleAerialToFit(); // will refresh aerial view after paste
} else {
((UIListViewFrame)oViewFrame).getUIList().getListUI().pasteFromClipboard();
}
try {
Vector views = new Vector();
views.add(oNode);
refreshViews(views);
} catch (Exception e) {
}
}// End of function OnPaste()
/**
* Deletes the selected node
*
*/
public void onDelete(){
TreePath treePath = tree.getSelectionPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
UIViewOutlineTreeNode treeNode =(UIViewOutlineTreeNode)node.getUserObject();
// root node and Home window cannot be deleted.
if(!(node.equals(rootNode) || (treeNode.getObject()).equals(ProjectCompendium.APP.getHomeView()) ||
(treeNode.getId()).equals(ProjectCompendium.APP.getInBoxID()))) {
NodeSummary nodeSum = treeNode.getObject();
nodeSum.initialize(oSession, oModel);
try {
Vector parentViews = nodeSum.getMultipleViews();
if(parentViews.size() == 1 && nodeSum instanceof View){
// if the deleted node is a view, close the view if open.
UIViewFrame frame = ProjectCompendium.APP.getInternalFrame((View)nodeSum);
if(frame != null){
ProjectCompendium.APP.getAllFrames().remove(frame);
frame.dispose();
}
}
if(sMode.equals(DISPLAY_VIEWS_ONLY)){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)node.getParent();
UIViewOutlineTreeNode parentTreeNode =(UIViewOutlineTreeNode)parentNode.getUserObject();
NodeSummary parentSum = parentTreeNode.getObject();
View view = View.getView(parentSum.getId());
view.initialize(oSession, oModel);
Vector v = new Vector();
v.add(view);
deleteSelectedNode(v, nodeSum);
} else if(sMode.equals(DISPLAY_VIEWS_AND_NODES)) {
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)node.getParent();
if (!parentNode.equals(rootNode)){
Object[] nodes = (Object[]) treePath.getPath();
DefaultMutableTreeNode parentView = (DefaultMutableTreeNode)nodes[1];
UIViewOutlineTreeNode parentTreeNode =(UIViewOutlineTreeNode)parentView.getUserObject();
NodeSummary parentSum = parentTreeNode.getObject();
View view = View.getView(parentSum.getId());
view.initialize(oSession, oModel);
Vector v = new Vector();
v.add(view);
deleteSelectedNode(v, nodeSum);
} else if(parentViews.size() == 1){
deleteSelectedNode(parentViews, nodeSum);
} else{
int response = JOptionPane.showConfirmDialog(ProjectCompendium.APP,
LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.message1a")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$
LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.message1b")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$
LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.message1c")+"\n\n"+ //$NON-NLS-1$ //$NON-NLS-2$
LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.message1d"), //$NON-NLS-1$
LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.message1e")+nodeSum.getLabel(), JOptionPane.YES_NO_OPTION); //$NON-NLS-1$
if (response == JOptionPane.YES_OPTION) {
deleteSelectedNode(parentViews, nodeSum);
}
}
}
} catch (SQLException e1) {
e1.printStackTrace();
} catch (ModelSessionException e1) {
e1.printStackTrace();
}
}
}
/**
* Deletes the given node from the given views
* @param view View where the node to be delete exists
* @param node NodeSummary to be deleted
* @throws ModelSessionException
* @throws SQLException
* @throws NoSuchElementException
*/
public void deleteSelectedNode(Vector views, NodeSummary node) {
for(int i= 0; i <views.size(); i ++){
View view = (View) views.get(i);
UIViewFrame frame = ProjectCompendium.APP.getViewFrame(view, view.getLabel());
if(frame instanceof UIMapViewFrame){
UIViewPane pane = ((UIMapViewFrame)frame).getViewPane();
UINode uiNode = (UINode)pane.get(node.getId());
pane.setSelectedNode(uiNode,ICoreConstants.SINGLESELECT);
pane.getUI().onDelete();
} else {
UIList list = ((UIListViewFrame)frame).getUIList();
list.deselectAll();
list.selectNode(list.getIndexOf(node), ICoreConstants.SINGLESELECT);
list.getListUI().onDelete();
}
}
refreshViews(views);
}
/**
* To create nodes for the outline view tree - view and nodes options
*/
public DefaultMutableTreeNode createViewsAndNodes() {
cleanUp();
removeChildNodes(rootNode);
rootNode.removeAllChildren();
View root = oModel.getUserProfile().getHomeView();
root.initialize(oSession, oModel);
try {
root.initializeMembers();
UIViewOutlineTreeNode top = new UIViewOutlineTreeNode(root);
DefaultMutableTreeNode topNode = new DefaultMutableTreeNode(top);
if( !root.getListenerList().contains(this)){
root.addPropertyChangeListener(this);
}
addToTreeNodes(topNode, top.getId());
rootNode.add(topNode);
DefaultMutableTreeNode dummyNode = new DefaultMutableTreeNode("dummy"); //$NON-NLS-1$
if(root.getNodeCount()> 0){
topNode.add(dummyNode);
}
Vector views = null;
try {
views = oModel.getNodeService().getAllChildViews(oSession, root.getId());
} catch(Exception e) {
log.error("Error...", e);
}
for (int i = 0; i< views.size(); i++){
View ns = (View)views.get(i);
DefaultMutableTreeNode childNode = null;
UIViewOutlineTreeNode child = new UIViewOutlineTreeNode(ns);
childNode = new DefaultMutableTreeNode(child);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
}
rootNode.add(childNode);
addToTreeNodes(childNode, ns.getId());
if(ns.getNodeCount() > 0){
dummyNode = new DefaultMutableTreeNode("dummy"); //$NON-NLS-1$
childNode.add(dummyNode);
}
}
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
return rootNode;
}
/**
* To update the given tree node
* @param parent, node of the tree where child nodes have to be added
*/
public void updateNodes(DefaultMutableTreeNode parent) {
removeChildNodes(parent);
parent.removeAllChildren();
NodeSummary nodeSum = ((UIViewOutlineTreeNode)parent.getUserObject()).getObject();
TreeNode[] parentNodes = (TreeNode[])parent.getPath();
String id = ((UIViewOutlineTreeNode)((DefaultMutableTreeNode)parentNodes[1]).getUserObject()).getId();
//parent - child relationship based on the links
UIArrangeLeftRight arrange = new UIArrangeLeftRight();
View view = View.getView(id);
view.initialize(oSession, oModel);
if (view != null){
arrange.processView(view);
Hashtable htNodesId = arrange.getNodes();
Hashtable htNodesLevel = arrange.getNodesLevel();
Hashtable htNodesBelow = arrange.getNodesBelow();
Vector nodeLevelList = arrange.getNodeLevelList();
Vector nodesAdded = new Vector();
if (nodeLevelList.size() > 0) {
// CYCLE THROUGH NODES SORTED BY YPOS AND PRINT THEM AND THIER CHILDREN
for(Enumeration f = ((Vector)nodeLevelList.elementAt(0)).elements();f.hasMoreElements();) {
String nodeToAddId = (String)f.nextElement();
NodeSummary nodeToAdd = (NodeSummary) htNodesId.get(nodeToAddId);
DefaultMutableTreeNode childNode = null;
UIViewOutlineTreeNode child = new UIViewOutlineTreeNode(nodeToAdd);
childNode = new DefaultMutableTreeNode(child);
if(!nodeToAdd.getListenerList().contains(this)){
nodeToAdd.addPropertyChangeListener(this);
}
parent.add(childNode);
nodesAdded.add(nodeToAdd);
addToTreeNodes(childNode, nodeToAddId);
nodesAdded = recursiveNodeAddition(childNode, htNodesBelow, htNodesId, nodesAdded);
}//end for
}//end if
//temp Fix - If any node has been left out because of complex linkage then add them as level 1
try {
if(nodesAdded.size() < view.getNodeCount()){
for(Enumeration e = htNodesId.keys(); e.hasMoreElements(); ){
String nodeToAddId = (String)e.nextElement();
NodeSummary nodeToAdd = (NodeSummary) htNodesId.get(nodeToAddId);
if(!nodesAdded.contains(nodeToAdd)) {
UIViewOutlineTreeNode child = new UIViewOutlineTreeNode(nodeToAdd);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
if(!nodeToAdd.getListenerList().contains(this)){
nodeToAdd.addPropertyChangeListener(this);
}
parent.add(childNode);
nodesAdded.add(nodeToAdd);
addToTreeNodes(childNode, nodeToAddId);
}//end if
}//end for
}//end if
} catch (ModelSessionException e) {
log.error("Error...", e);
}//end try
}// end if view != null
}//end updateNodes
//private Hashtable nodesRecursed = new Hashtable(51);
/**
* Add the child nodes to the parent. (parent - Child relationship is based on links)
* @param node, DefaultMutableTreeNode whose children has to added
* @param htNodesBelow, Hashtable of nodes against their child nodes
*/
private Vector recursiveNodeAddition(DefaultMutableTreeNode node, Hashtable htNodesBelow, Hashtable htNodes, Vector nodesAdded){
UIViewOutlineTreeNode treeNode = (UIViewOutlineTreeNode) node.getUserObject();
NodeSummary nodeSum = treeNode.getObject();
String nodeId = treeNode.getId();
Vector nodeChildren = (Vector)htNodesBelow.get(nodeId);
if (nodeChildren != null) {
for (int i = 0; i < nodeChildren.size(); i++) {
String nodeToAddId = (String)nodeChildren.elementAt(i);
NodeSummary nodeToAdd = (NodeSummary) htNodes.get(nodeToAddId);
UIViewOutlineTreeNode child = new UIViewOutlineTreeNode(nodeToAdd);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
if(!nodeToAdd.getListenerList().contains(this)){
nodeToAdd.addPropertyChangeListener(this);
}
node.add(childNode);
addToTreeNodes(childNode, nodeToAddId);
if(!nodesAdded.contains(nodeToAdd)) {
nodesAdded.add(nodeToAdd);
nodesAdded = recursiveNodeAddition(childNode, htNodesBelow, htNodes, nodesAdded);
}
}
}
return nodesAdded;
}
/**
* To create nodes for the outline view for Views Only option
* @param node, node of the tree where child nodes have to be added
* @param getChild, boolean true, if child nodes has to be added to the node
*/
public DefaultMutableTreeNode createViewNodes(DefaultMutableTreeNode parent, boolean getChild) {
if(parent.equals(rootNode)){
cleanUp();
parent = (DefaultMutableTreeNode) parent.getFirstChild();
htNodes.clear();
htNodeParent.clear();
htTreeNodes.clear();
NodeSummary parentSummary = ((UIViewOutlineTreeNode)parent.getUserObject()).getObject();
String id = parentSummary.getId();
addToTreeNodes(parent, id);
}
NodeSummary parentSummary = ((UIViewOutlineTreeNode)parent.getUserObject()).getObject();
String id = parentSummary.getId();
removeChildNodes(parent);
parent.removeAllChildren();
if(getChild){
htNodes.remove(parentSummary.getId());
Vector vtChildNodes = new Vector();;
try {
vtChildNodes = oModel.getNodeService().getChildViews(oSession, id);
htNodes.put(id, vtChildNodes);
// find next level to display expand/collapse icon
for (int i = 0; i < vtChildNodes.size(); i++ ){
String viewId = ((View) vtChildNodes.get(i)).getId();
Vector temp = oModel.getNodeService().getChildViews(oSession, viewId);
htNodes.put(viewId, temp);
}
} catch (SQLException e) {
log.error("Error...", e);
}
}
Vector vtNodes = ((Vector) htNodes.get(id));
for (Enumeration e = vtNodes.elements() ; e.hasMoreElements();){
NodeSummary ns = (NodeSummary)e.nextElement();
String nodeId = ns.getId();
UIViewOutlineTreeNode child = new UIViewOutlineTreeNode(ns);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
}
addToTreeNodes(childNode, nodeId);
//put child node against the parent, it is useful when displaying views only option
// when a node type is changed from other types to View node.
htNodeParent.put(childNode, parent);
parent.add(childNode);
//check if any views contains itself (even at several levels deep)
boolean isRepeat = false;
TreeNode[] path = childNode.getPath();
for(int j = 0; j < path.length - 1; j ++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) path[j];
NodeSummary parentNodeSummary = ((UIViewOutlineTreeNode)parentNode.getUserObject()).getObject();
if(ns.equals(parentNodeSummary)){
isRepeat = true ;
}
}
if((htNodes.containsKey(nodeId)) && (!isRepeat)) {
Vector vtChildNodes = ((Vector) htNodes.get(nodeId));
if(vtChildNodes.size() > 0){
DefaultMutableTreeNode dummy = new DefaultMutableTreeNode("dummy"); //$NON-NLS-1$
childNode.add(dummy);
}
}
}
treeModel.reload(parent);
return parent;
}
/**
* Open the contents popup for the currently selected node.
*/
public void openContents(NodeSummary node, int tab) {
String sNodeID = node.getId();
if (!sNodeID.equals(ProjectCompendium.APP.getHomeView().getId()) &&
!sNodeID.equals(ProjectCompendium.APP.getInBoxID())) {
UINodeContentDialog contentDialog = new UINodeContentDialog(ProjectCompendium.APP, node, tab);
UIUtilities.centerComponent(contentDialog, ProjectCompendium.APP);
contentDialog.setVisible(true);
}
}
/**
* Open a reference node.
* @param node
* @param view
*/
public void openReference(NodeSummary node, View view){
String path = node.getSource();
if (path == null || path.equals("")) { //$NON-NLS-1$
openContents(node, UINodeContentDialog.CONTENTS_TAB);
} else if (path.startsWith(ICoreConstants.sINTERNAL_REFERENCE)) {
path = path.substring(ICoreConstants.sINTERNAL_REFERENCE.length());
int ind = path.indexOf("/"); //$NON-NLS-1$
if (ind != -1) {
String sGoToViewID = path.substring(0, ind);
String sGoToNodeID = path.substring(ind+1);
IModel model = ProjectCompendium.APP.getModel();
String history = "Outline View "; //$NON-NLS-1$
UIUtilities.jumpToNode(sGoToViewID, sGoToNodeID, history);
}
} else if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("www.")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (ExecuteControl.launch( path ) == null) {
openContents(node, UINodeContentDialog.CONTENTS_TAB);
}
} else {
File file = new File(path);
String sPath = path;
if (file.exists()) {
sPath = file.getAbsolutePath();
}
// It the reference is not a file, just pass the path as is, as it is probably a special type of url.
if (ExecuteControl.launch( sPath ) == null) {
openContents(node, UINodeContentDialog.CONTENTS_TAB);
}
}
}
/**
* Opens the given view and highlights the given node
* @param viewSum, View to be opened
* @param ns, NodeSummary of the node to be highlighted
*/
public void openView(View viewSum, NodeSummary ns) {
try {
View view = viewSum;
view.initialize(oSession, oModel);
view.initializeMembers();
UIViewFrame viewFrame = ProjectCompendium.APP.addViewToDesktop(view, view.getLabel());
viewFrame.setNavigationHistory(viewFrame.getChildNavigationHistory());
if(!viewSum.equals(ns)){
UIUtilities.focusNodeAndScroll(ns, viewFrame);
}
Vector history = new Vector();
history.addElement( "Outline View "); //$NON-NLS-1$
viewFrame.setNavigationHistory(history);
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
}
/**
* Returns the list of listeners
* @return Vector, list of listener object
*/
public static Vector getViewListener() {
return viewListener;
}
/**
* Adds to the list of listeners
* @return Vector, list of listener object
*/
public static Vector addToViewListener(NodeSummary view) {
if(!viewListener.contains(view))
viewListener.add(view);
return viewListener;
}
/**
* Returns to the list of nodes associated with the given id
* @return Vector, list of nodes
*/
public Vector getTreeNode(String id) {
Vector v = new Vector();
if(htTreeNodes.containsValue(id)){
for(Enumeration e = htTreeNodes.keys();e.hasMoreElements();){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.nextElement();
String nodeId = (String) htTreeNodes.get(node) ;
if(nodeId.equals(id)){
v.add(node);
}
}
}
return v;
}
/**
* Removes the given node from the list
* @param node, DefaultMutableTreeNode, the node to be removed
*/
public void removeTreeNode(DefaultMutableTreeNode node) {
htTreeNodes.remove(node);
}
/**
* Removes the all child nodes for the given node recursively
* @param node, DefaultMutableTreeNode, the node whose children to be removed
*/
public void removeChildNodes(DefaultMutableTreeNode node) {
int count = node.getChildCount();
for(int i=0; i < count; i++){
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
if(childNode.getUserObject() instanceof String){
node.remove(childNode);
return ;
} else {
removeChildNodes(childNode);
removeTreeNode(childNode);
}
for (Enumeration e = htNodeParent.keys(); e.hasMoreElements();){
DefaultMutableTreeNode child = (DefaultMutableTreeNode) e.nextElement();
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)htNodeParent.get(child);
if(node.equals(parent)) {
htNodeParent.remove(child);
}
}
}
}
/**
* Removes the node from the outline view that is removed from main view
* @param ns, NodeSummary of the view node whose child has been removed
*/
public void removeChildViews(NodeSummary ns){
UIArrangeLeftRight arrange = new UIArrangeLeftRight();
if (ns != null && ns instanceof View){
View view = (View) ns;
arrange.processView(view);
Hashtable htNodesId = arrange.getNodes();
Hashtable htNodesLevel = arrange.getNodesLevel();
Hashtable htNodesBelow = arrange.getNodesBelow();
Vector nodeLevelList = arrange.getNodeLevelList();
for(Enumeration f = htNodesId.keys();f.hasMoreElements();) {
String nodeId = (String)f.nextElement();
NodeSummary node = (NodeSummary)htNodesId.get(nodeId);
if(View.isViewType(node.getType())) {
try {
if(node.getMultipleViews().size() == 1) {
Vector viewNodes = getTreeNode(nodeId);
for(int i =0; i< viewNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) viewNodes.get(i);
if((parentNode.getParent() != null) && (parentNode.getParent().equals(rootNode))) {
NodeSummary nodeSum = ((UIViewOutlineTreeNode)parentNode.getUserObject()).getObject();
removeChildViews(nodeSum);
removeTreeNode(parentNode);
rootNode.remove(parentNode);
}
}
}
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
}
}
}
}
/**
* Adds the given node to the table
* @param node, the key object for the hashtable
* @param s, String , the id - the value object for the hashtable
* @return Hashtable, the updated the hashtable
*/
public Hashtable addToTreeNodes( DefaultMutableTreeNode node, String s) {
htTreeNodes.put(node, s);
return htTreeNodes;
}
/**
* Returns the Tree
* @return JTree, the outline view tree
*/
public JTree getTree() {
return tree;
}
/**
* Return the treeModel
* @return DefaultTreeModel, the treeModel associated with the Tree
*/
public DefaultTreeModel getTreeModel() {
return treeModel;
}
/**
* Indicates when nodes on a view are selected and deselected.
* @param selected true for selected false for deselected.
*/
public void setNodeSelected(boolean selected) {
tree.clearSelection();
if (selected) {
updateTreeSelection();
}
}
/**
* Updates the list of nodes for the currently selected nodes in the current view.
*/
private void updateTreeSelection() {
Vector allNodes = new Vector(51);
Hashtable htNodesCheck = new Hashtable();
UIViewFrame frame = ProjectCompendium.APP.getCurrentFrame();
NodeSummary parentView = null;
if (frame != null) {
if (frame instanceof UIMapViewFrame) {
UIMapViewFrame mapFrame = (UIMapViewFrame)frame;
UIViewPane pane = mapFrame.getViewPane();
if (pane != null) {
parentView = pane.getView();
Enumeration e = pane.getSelectedNodes();
UINode node = null;
NodeSummary oNode = null;
String sNodeID = ""; //$NON-NLS-1$
for (Enumeration en=e; en.hasMoreElements();) {
node = (UINode)en.nextElement();
sNodeID = node.getNode().getId();
oNode = node.getNode();
if (!sNodeID.equals(ProjectCompendium.APP.getTrashBinID())) {
allNodes.addElement(oNode);
}
}
}
} else if (frame instanceof UIListViewFrame) {
UIListViewFrame listFrame = (UIListViewFrame)frame;
UIList list = listFrame.getUIList();
parentView = list.getView();
if (list != null) {
Enumeration e = list.getSelectedNodes();
NodePosition nodePos = null;
for (Enumeration en=e; en.hasMoreElements();) {
nodePos = (NodePosition)en.nextElement();
allNodes.addElement(nodePos.getNode());
}
}
}
for(int k = 0; k < allNodes.size(); k ++){
NodeSummary node = (NodeSummary) allNodes.get(k);
String sNodeID = node.getId();
Vector v = getTreeNode(sNodeID);
for(int i = 0; i < v.size(); i++){
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) v.get(i);
TreePath selectedNodePath = new TreePath(treeNode.getPath());
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
DefaultMutableTreeNode topLevelNode = (DefaultMutableTreeNode) treeNode.getParent();
UIViewOutlineTreeNode topLevelOutlineNode = (UIViewOutlineTreeNode)topLevelNode.getUserObject();
TreePath topLevelPath = new TreePath(topLevelNode.getPath());
if(topLevelNode.equals(rootNode)) {
tree.addSelectionPath(selectedNodePath);
} else {
Vector parentViews = getTreeNode(parentView.getId());
for(int j = 0; j < parentViews.size(); j ++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parentViews.get(j);
TreePath parentPath = new TreePath(parentNode.getPath());
if(!tree.isCollapsed(parentPath)){
if(parentNode.isNodeDescendant(treeNode)){
tree.addSelectionPath(selectedNodePath);
}
}
}
}
} else if(sMode.equals(DISPLAY_VIEWS_ONLY)){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) treeNode.getParent();
if(parentNode != null ){
UIViewOutlineTreeNode parentOutlineNode = (UIViewOutlineTreeNode)parentNode.getUserObject();
if(parentOutlineNode.getObject().equals(parentView)){
TreePath parentPath = new TreePath(parentNode.getPath());
if(!tree.isCollapsed(parentPath)){
tree.addSelectionPath(selectedNodePath);
}
}
}
}
}
}
}
}
/**
* Removes the node from teh outline view for views only option
* @param ns NodeSummary of the node to be removed
* @param oView View in which the node is.
*/
public void removeNodeForViewsOnly(NodeSummary ns, View oView){
Vector nodes = getTreeNode(ns.getId());
Vector parentIds = new Vector();
for(int i=0;i< nodes.size(); i++){
DefaultMutableTreeNode child = (DefaultMutableTreeNode)nodes.get(i);
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)child.getParent();
String parentId = ((UIViewOutlineTreeNode)parent.getUserObject()).getId();
parentIds.add(parentId);
if(oView.getId().equals(parentId)){
parent.remove(child);
removeTreeNode(child);
htNodeParent.remove(child);
viewListener.remove(((UIViewOutlineTreeNode)parent.getUserObject()).getObject());
treeModel.reload(parent);
}
}
}
/**
* Removes the node from the outline view for views and nodes options
* @param ns NodeSummary of the node to be removed
*/
public void removeNodeForViewsAndNodes(NodeSummary ns){
try {
// if the node is in multiple view just create the nodes and reload the root
// to place the nodes in correct order.
if(ns.getMultipleViews().size() >= 1){
createViewsAndNodes();
treeModel.reload(rootNode);
tree.repaint();
return;
}
} catch (SQLException e) {
log.error("Error...", e);
} catch (ModelSessionException e) {
log.error("Error...", e);
}
//if the node is a view and is not in mulitple views., then deleted the view node from root
if(ns instanceof View){
Vector parents = getTreeNode(ns.getId());
if (parents == null || parents.size() <= 0){
return;
}
for (int i=0; i<parents.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parents.get(i);
if((parentNode.getParent() != null) && (parentNode.getParent().equals(rootNode))) {
removeChildNodes(parentNode);
removeChildViews(ns);
removeTreeNode(parentNode);
rootNode.remove(parentNode);
treeModel.reload(rootNode);
}
viewListener.remove(ns);
}
}
}
public void addNodeForViewsOnly(NodeSummary ns, View oView){
if((ns.getType()!= ICoreConstants.TRASHBIN)){
Vector nodes = getTreeNode(ns.getId());
Vector parentIds = new Vector();
Vector viewIds = new Vector();
// check if the newly added node is in other views
for(int i=0;i< nodes.size(); i++){
DefaultMutableTreeNode child = (DefaultMutableTreeNode)nodes.get(i);
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)child.getParent();
String parentId = ((UIViewOutlineTreeNode)parent.getUserObject()).getId();
parentIds.add(parentId);
}
//Just to make sure the newly node isn't in the current view
if(!parentIds.contains(oView.getId())){
Vector parentNodes = getTreeNode(oView.getId());
for (int i=0; i<parentNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentNodes.get(i);
UIViewOutlineTreeNode treeNode = new UIViewOutlineTreeNode(ns);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(treeNode);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
}
parentNode.add(node);
addToTreeNodes(node,treeNode.getId());
htNodeParent.put(node, parentNode);
treeModel.reload(parentNode);
}
}
}
}
public void addNodeForViewsAndNodes(NodeSummary ns , View oView){
if((ns.getType()!= ICoreConstants.TRASHBIN)){
if(ns instanceof View ){
createViewsAndNodes();
View view = (View)ns;
view.initialize(oSession, oModel);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
addToViewListener(ns);
}
treeModel.reload(rootNode);
} else {
Vector parentNodes = getTreeNode(oView.getId());
for (int i=0; i<parentNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentNodes.get(i);
if(parentNode.getParent() != null && parentNode.getParent().equals(rootNode)){
updateNodes(parentNode);
treeModel.reload(parentNode);
break;
}
}
}
}
}
/**
* Create and show the right-click node popup menu for the given node.
* @param node com.compendium.core.datamodel.NodeSummary, the node to create the popup for.
* @param x, the x position of the mouse event that triggered this request.
* @param y, the y position of the mouse event that triggered this request.
*/
public UIViewOutlinePopupMenu showPopupMenu(NodeSummary node, int x, int y, boolean isLevelOneNode) {
UIViewOutlinePopupMenu popup = new UIViewOutlinePopupMenu(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UIViewOutline.popupMenu"), node, this, isLevelOneNode); //$NON-NLS-1$
Dimension dim = ProjectCompendium.APP.getScreenSize();
int screenWidth = dim.width - 50; //to accomodate for the scrollbar
int screenHeight = dim.height ; //to accomodate for the menubar...
Point point = new Point(x,y);
int realX = Math.abs(point.x - getX())+ 50;
int realY = Math.abs(point.y - getY())+ 20;
int endXCoordForPopUpMenu = realX + popup.getWidth();
int endYCoordForPopUpMenu = realY + popup.getHeight();
int offsetX = (screenWidth) - endXCoordForPopUpMenu;
int offsetY = (screenHeight) - endYCoordForPopUpMenu;
if(offsetX > 0)
offsetX = 0;
if(offsetY > 0)
offsetY = 0;
// popup.setCoordinates(realX+offsetX, realY+offsetY);
// popup.show(tree, realX+offsetX, realY+offsetY);
popup.setCoordinates(point.x + 50 , point.y);
popup.show(tree, point.x +50 , point.y);
return popup;
}
/**
* Handles property change events.
* @param evt, the associated PropertyChangeEvent object.
*/
public void propertyChange(PropertyChangeEvent evt) {
Object obj = evt.getSource();
String prop = evt.getPropertyName();
Object oldvalue = evt.getOldValue();
Object newvalue = evt.getNewValue();
// get the expanded tree descendants.
Enumeration e = tree.getExpandedDescendants(new TreePath(rootNode.getPath()));
if(prop.equals(NodeSummary.STATE_PROPERTY)){
NodeSummary ns = (NodeSummary) obj;
int newState = ((Integer) newvalue).intValue();
Vector nodes = getTreeNode(ns.getId());
for(int i =0; i <nodes.size(); i++){
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) nodes.get(i);
if(treeNode != rootNode.getFirstChild()){
UIViewOutlineTreeNode outlineTreeNode = (UIViewOutlineTreeNode) treeNode.getUserObject();
outlineTreeNode.setState(newState);
}
}
refreshTree();
} else
if(prop.equals(View.CHILDREN_PROPERTY)){
} else if(((prop.equals(View.LINK_REMOVED)|| prop.equals(View.LINK_ADDED))||prop.equals(View.NODE_REMOVED))){
View oView = (View) obj;
if (sMode.equals(DISPLAY_VIEWS_AND_NODES)) {
if(prop.equals(View.NODE_REMOVED)){
NodeSummary ns = (NodeSummary) newvalue;
removeNodeForViewsAndNodes(ns);
}
Vector parentNodes = getTreeNode(oView.getId());
if (parentNodes == null || parentNodes.size() <= 0){
return;
}
// Update the parent view.
for (int i=0; i<parentNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentNodes.get(i);
TreeNode[] path = parentNode.getPath();
TreePath parentPath = new TreePath(path);
if ((parentNode.getParent() != null) &&
(parentNode.getParent().equals(rootNode)) &&
tree.isExpanded(parentPath)) {
updateNodes(parentNode);
treeModel.reload(parentNode);
}
}
} else if ((sMode.equals(DISPLAY_VIEWS_ONLY)) && prop.equals(View.NODE_REMOVED)){
NodeSummary ns = (NodeSummary) newvalue;
if(View.isViewType(ns.getType())) {
if(prop.equals(View.NODE_REMOVED)){
removeNodeForViewsOnly(ns, oView);
}
}
}
} else if(prop.equals(NodeSummary.LABEL_PROPERTY)){
NodeSummary ns = (NodeSummary) obj;
if(sMode.equals(DISPLAY_VIEWS_AND_NODES) ||
(sMode.equals(DISPLAY_VIEWS_ONLY) &&
View.isViewType(ns.getType()))) {
Vector vtNodes = getTreeNode(ns.getId());
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
if(node.getUserObject() instanceof UIViewOutlineTreeNode){
((UIViewOutlineTreeNode)node.getUserObject()).setLabel(newvalue.toString());
}
treeModel.reload(node);
}
}
} else if(prop.equals(View.NODE_ADDED)) {
NodePosition np = (NodePosition) newvalue;
View oView = np.getView();
NodeSummary ns = np.getNode();
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
addNodeForViewsAndNodes(ns, oView);
} else if (sMode.equals(DISPLAY_VIEWS_ONLY) && View.isViewType(ns.getType())) {
addNodeForViewsOnly(ns, oView);
}
}else if (prop.equals(View.NODE_TRANSCLUDED)){
NodePosition np = (NodePosition) newvalue;
View oView = (View)obj;
NodeSummary ns = np.getNode();
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
if((ns.getType()!= ICoreConstants.TRASHBIN)){
Vector v = getTreeNode(ns.getId());
Vector parentNodes = getTreeNode(oView.getId());
/*
if(ns instanceof View ){
if(v.size() == 0){
createViewsAndNodes();
View view = (View)ns;
view.initialize(oSession, oModel);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
addToViewListener(ns);
}
treeModel.reload(rootNode);
}
} */
for (int i = 0; i < parentNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentNodes.get(i);
TreeNode[] path = parentNode.getPath();
TreePath treePath = new TreePath(path);
if(parentNode.getParent() != null && parentNode.getParent().equals(rootNode)){
if(v == null || v.size() == 0){
updateNodes(parentNode);
treeModel.reload(parentNode);
tree.repaint();
}
for(int j = 0; j < v.size(); j++){
DefaultMutableTreeNode child = (DefaultMutableTreeNode) v.get(j);
if((!parentNode.isNodeDescendant(child)) && tree.isExpanded(treePath)){
updateNodes(parentNode);
treeModel.reload(parentNode);
tree.repaint();
//tree.collapsePath(treePath);
}
}
}
}
}
} else if (sMode.equals(DISPLAY_VIEWS_ONLY) && View.isViewType(ns.getType())){
//log.info("IN NODE TRANSCLUDED "+ns.getLabel()+ ", type:" +ns.getType());
if((ns.getType() == ICoreConstants.TRASHBIN)){
return ;
}
Vector nodes = getTreeNode(ns.getId());
Vector parentIds = new Vector();
// check if the newly added node is in other views
for(int i=0;i< nodes.size(); i++){
DefaultMutableTreeNode child = (DefaultMutableTreeNode)nodes.get(i);
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) child.getParent();
String parentId = ((UIViewOutlineTreeNode)parent.getUserObject()).getId();
parentIds.add(parentId);
}
//Just to make sure the newly node isn't in the current view
if(!parentIds.contains(oView.getId())){
Vector parentNodes = getTreeNode(oView.getId());
for (int i=0; i<parentNodes.size(); i++){
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) parentNodes.get(i);
UIViewOutlineTreeNode treeNode = new UIViewOutlineTreeNode(ns);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(treeNode);
if(!ns.getListenerList().contains(this)){
ns.addPropertyChangeListener(this);
}
parentNode.add(node);
addToTreeNodes(node,treeNode.getId());
if(View.isViewType(ns.getType())){
createViewNodes(node, true);
treeModel.reload(node);
}
htNodeParent.put(node, parentNode);
treeModel.reload(parentNode);
}
}
}
} else if (prop.equals(NodeSummary.SOURCE_PROPERTY)){
NodeSummary ns = (NodeSummary) obj;
if(sMode.equals(DISPLAY_VIEWS_AND_NODES) ||
(sMode.equals(DISPLAY_VIEWS_ONLY) && View.isViewType(ns.getType()))) {
Vector vtNodes = getTreeNode(ns.getId());
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
if(node.getUserObject() instanceof UIViewOutlineTreeNode){
((UIViewOutlineTreeNode)node.getUserObject()).setReference(newvalue.toString());
}
treeModel.reload(node);
}
}
} else if (prop.equals(NodeSummary.NODE_TYPE_PROPERTY)){
NodeSummary ns = (NodeSummary) obj;
int newType = Integer.parseInt(newvalue.toString());
int oldType = Integer.parseInt(oldvalue.toString());
Vector vtNodes = getTreeNode(ns.getId());
try {
// if the old type is different from the new type, obtain the nodesummary
// from the database as it is not update in NodeSummary list yet.
NodeSummary nodeSum = oModel.getNodeService().getNodeSummary(oSession, ns.getId());
nodeSum.initialize(oSession, oModel);
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)){
if(View.isViewType(newType)){
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
UIViewOutlineTreeNode treeNode = ((UIViewOutlineTreeNode)node.getUserObject());
if(!View.isViewType(treeNode.getType())){
createViewsAndNodes();
treeModel.reload(rootNode);
for (;e.hasMoreElements();){
TreePath path = (TreePath)e.nextElement();
if(tree.getRowForPath(path) != -1)
tree.expandPath(path);
}
break;
} else {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
treeModel.reload(node);
}
}
if(vtNodes.size() == 0){
createViewsAndNodes();
treeModel.reload(rootNode);
}
if(!nodeSum.getListenerList().contains(this)){
nodeSum.addPropertyChangeListener(this);
addToViewListener(nodeSum);
}
tree.repaint();
} else {
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
UIViewOutlineTreeNode treeNode = ((UIViewOutlineTreeNode)node.getUserObject());
//log.info(treeNode.getType());
if(node.getParent() != null && node.getParent().equals(rootNode)){
removeChildNodes(node);
rootNode.remove(node);
treeModel.reload(node);
} else {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
treeModel.reload(node);
}
}
tree.repaint();
}
} else if(sMode.equals(DISPLAY_VIEWS_ONLY)){
// if the new type is map / list
if(View.isViewType(newType)){
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
UIViewOutlineTreeNode treeNode = ((UIViewOutlineTreeNode)node.getUserObject());
if(treeNode.getType() != newType){
if (sMode.equals(DISPLAY_VIEWS_ONLY)) {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
if(!View.isViewType(oldType)){
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)htNodeParent.get(node);
parent.add(node);
treeModel.reload(parent);
}
} else {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
treeModel.reload(node);
}
}
}
if(!nodeSum.getListenerList().contains(this)){
nodeSum.addPropertyChangeListener(this);
addToViewListener(nodeSum);
}
} else {
for(int i=0; i< vtNodes.size(); i++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)vtNodes.get(i);
UIViewOutlineTreeNode treeNode = ((UIViewOutlineTreeNode)node.getUserObject());
if(treeNode.getType() != newType){
if (sMode.equals(DISPLAY_VIEWS_ONLY)) {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
if(View.isViewType(oldType)){
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)node.getParent();
parent.remove(node);
//removeTreeNode(node);
htNodeParent.put(node, parent);
treeModel.reload(parent);
}
} else {
treeNode.setObject(nodeSum);
treeNode.setType(newType);
treeModel.reload(node);
}
}
}
if(!nodeSum.getListenerList().contains(this)){
nodeSum.addPropertyChangeListener(this);
addToViewListener(nodeSum);
}
}
}
tree.repaint();
} catch (SQLException ex) {
log.error("Error...", ex);
}
}
// expand all the expanded tree nodes
if(e != null){
for (;e.hasMoreElements();){
TreePath path = (TreePath)e.nextElement();
if(tree.getRowForPath(path) != -1)
tree.expandPath(path);
}
}
}
/**
* Handles the tree will expand events
* @param evt, the associated TreeExpansionEvent object.
*/
public void treeWillExpand(TreeExpansionEvent evt) throws ExpandVetoException {
ProjectCompendium.APP.setWaitCursor();
TreePath selPath = evt.getPath();
if(selPath != null ){
if(sMode.equals(DISPLAY_VIEWS_AND_NODES)) {
TreePath rootPath = tree.getPathForRow(0);
if(selPath != rootPath){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
NodeSummary ns = ((UIViewOutlineTreeNode)node.getUserObject()).getObject();
if((node != null && node.getParent() !=null) && node.getParent().equals(rootNode)){
updateNodes(node);
treeModel.reload(node);
}
} else if(selPath == rootPath) {
createViewsAndNodes();
treeModel.reload();
}
} else if(sMode.equals(DISPLAY_VIEWS_ONLY)) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
node = createViewNodes (node, true);
treeModel.reload(node);
}
}
ProjectCompendium.APP.setDefaultCursor();
}
/**
* Handles the tree will collapse events
* @param evt, the associated TreeExpansionEvent object.
*/
public void treeWillCollapse(TreeExpansionEvent evt) throws ExpandVetoException {
}
/**
* Called whenever the value of the tree selection changes.
*/
public void valueChanged(TreeSelectionEvent arg0) {
TreePath path = arg0.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
selectedNode = ((UIViewOutlineTreeNode) node.getUserObject());
selectedNodeSummary = selectedNode.getObject();
UIViewOutlineTreeNode treeNode = (UIViewOutlineTreeNode)(node.getUserObject());
if(treeNode.getObject() != null )
setStatus(treeNode.getObject());
else
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
/**
* The inner class that defines the requirements for an object that displays a tree node
* @author Lakshmi Prabhakaran
*
*/
private class TreeNodeRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 7969295074672629921L;
Icon imageIcon ;
UIViewOutlineTreeNode treeNode = null;
/** Sets the value of the current tree cell to value.
*
* @return the Component that the renderer uses to draw the value
*/
public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(tree, value, sel,
expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
treeNode = (UIViewOutlineTreeNode)(node.getUserObject());
String toolTip = treeNode.getLabel();
int type = treeNode.getType();
int state = treeNode.getState();
//set the font
setFont(tree.getFont());
if (type == ICoreConstants.REFERENCE) {
imageIcon = UINode.getReferenceImageSmall(treeNode.getReference());
} else if (type == -1) {
imageIcon = getOpenIcon();
} else {
imageIcon = UINode.getNodeImageSmall(type);
}
if (treeNode.getObject() != null) {
if(treeNode.getObject().getId().equals(ProjectCompendium.APP.getInBoxID())) {
imageIcon = UIImages.get(IUIConstants.INBOX_SM);
}
}
setIcon(imageIcon);
setToolTipText(toolTip);
// set border color
setBorder(new NodeBorder(state, imageIcon));
return this;
}
public String getToolTipText(MouseEvent e){
if(treeNode.getObject() != null ){
// set status info
setStatus(treeNode.getObject());
} else {
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
return this.getToolTipText();
}
}
/**
* This class configures an editor in a tree.
* @author Lakshmi Prabhakaran
*
*/
private class TreeNodeEditor extends DefaultTreeCellEditor {
UIViewOutlineTreeNode treeNode = null;
/** constructor **/
public TreeNodeEditor(JTree tree, DefaultTreeCellRenderer cellRenderer) {
super(tree, cellRenderer);
super.renderer = cellRenderer;
}
/**
*
*/
public Component getTreeCellEditorComponent(JTree tree,
Object value,
boolean isSelected,
boolean expanded,
boolean leaf,
int row){
Icon imageIcon = renderer.getDefaultClosedIcon();
Component c = super.getTreeCellEditorComponent(tree, value, isSelected,
expanded, leaf, row);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
treeNode = (UIViewOutlineTreeNode)(node.getUserObject());
String toolTip = treeNode.getLabel();
int type = treeNode.getType();
int state = treeNode.getState();
NodeSummary nodeSum = treeNode.getObject();
((JTextField)editingComponent).setEditable(true);
((JTextField)editingComponent).setFont(ProjectCompendium.APP.currentDefaultFont);
// set uneditable for project name and home window cell
if(node.equals(rootNode) || (node.equals(rootNode.getFirstChild()))){
((JTextField)editingComponent).setEditable(false);
} else if (nodeSum != null && nodeSum.getId().equals(ProjectCompendium.APP.getInBoxID())) {
((JTextField)editingComponent).setEditable(false);
} else {
((JTextField)editingComponent).addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent arg0) {
if( treeNode.getObject() != null){
setStatus(treeNode.getObject());
}else{
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
}
public void focusLost(FocusEvent arg0) {
ProjectCompendium.APP.setStatus(""); //$NON-NLS-1$
}
});
}
if (type == ICoreConstants.REFERENCE) {
imageIcon = UINode.getReferenceImageSmall(treeNode.getReference());
} else {
imageIcon = UINode.getNodeImageSmall(type);
}
if (treeNode.getObject() != null) {
if(treeNode.getObject().getId().equals(ProjectCompendium.APP.getInBoxID())) {
imageIcon = UIImages.get(IUIConstants.INBOX_SM);
}
}
setToolTipText(toolTip);
super.editingIcon = imageIcon;
// set border color
setBorder(new NodeBorder(state, imageIcon));
return c;
}
}
/**
* The tree Model listener for the tree associated with the outer class
* @author Lakshmi Prabhakaran
*
*/
private class OutlineTreeModelListener implements TreeModelListener {
public OutlineTreeModelListener(){}
/**
* Handles Tree nodes changed event
* @param e, the event associated with TreeModelEvent
*/
public void treeNodesChanged(TreeModelEvent e) {
DefaultMutableTreeNode node;
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent());
try {
int index = e.getChildIndices()[0];
node = (DefaultMutableTreeNode) (parent.getChildAt(index));
String newvalue = node.getUserObject().toString();
node.setUserObject(selectedNode);
selectedNodeSummary.setLabel(newvalue, sAuthor);
treeModel.reload(node.getParent());
tree.repaint();
} catch (Exception ex) {
log.error("Error...", ex);
}
}
public void treeNodesInserted(TreeModelEvent arg0) {
}
public void treeNodesRemoved(TreeModelEvent arg0) {
}
public void treeStructureChanged(TreeModelEvent arg0) {
}
}
/**
* This border class paints the border for this node.
*/
private class NodeBorder extends AbstractBorder {
int state;
Icon imageIcon;
public NodeBorder(int state, Icon icon){
this.state = state;
imageIcon = icon;
}
public void paintBorder (Component c, Graphics g, int x, int y, int width, int height) {
if (state == ICoreConstants.UNREADSTATE) {
Color oldColor = g.getColor();
g.setColor(UNREAD_BORDER_COLOR);
int iconWidth = imageIcon.getIconWidth();
g.draw3DRect(x + (iconWidth + 3) , y + 1, width - (iconWidth + 5), height-2, true);
g.setColor(oldColor);
}
else if (state == ICoreConstants.MODIFIEDSTATE) {
Color oldColor = g.getColor();
g.setColor(MODIFIED_BORDER_COLOR);
int iconWidth = imageIcon.getIconWidth();
g.draw3DRect(x + (iconWidth +3) , y + 1, width - (iconWidth + 5), height-2, true);
g.setColor(oldColor);
} else {
Color oldColor = g.getColor();
g.setColor(oldColor);
}
}
}
/**
* @return Returns the sAuthor.
*/
public String getAuthor() {
return sAuthor;
}
/**
* @param author The sAuthor to set.
*/
public void setAuthor(String author) {
sAuthor = author;
}
/**
* @return Returns the selectedNodeSummary.
*/
public NodeSummary getSelectedNodeSummary() {
return selectedNodeSummary;
}
/**
* @return Returns the selectedView.
*/
public NodeSummary getSelectedView() {
return selectedView;
}
public void actionPerformed(ActionEvent arg0) {
Object source = arg0.getSource();
if (source == pbCancel) {
ProjectCompendium.APP.getMenuManager().removeOutlineView(true);
}
}
/**
* Remove all listeners before closing view
*
*/
public void cleanUp(){
for(Enumeration e = htTreeNodes.keys(); e.hasMoreElements();){
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) e.nextElement();
UIViewOutlineTreeNode outlineNode = (UIViewOutlineTreeNode) treeNode.getUserObject();
NodeSummary node = outlineNode.getObject();
if(node.getListenerList().contains(this)){
node.removePropertyChangeListener(this);
}
}
}
public void treeExpanded(TreeExpansionEvent arg0) {
updateTreeSelection();
}
public void treeCollapsed(TreeExpansionEvent arg0) {
updateTreeSelection();
}
}