/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* AttributeTree.java
*
* Created on 1. Juli 2004, 14:16
*/
package Sirius.navigator.ui.attributes;
import Sirius.navigator.types.treenode.ClassTreeNode;
import Sirius.navigator.types.treenode.DefaultMetaTreeNode;
import Sirius.navigator.types.treenode.ObjectTreeNode;
import org.apache.log4j.Logger;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.dnd.peer.*;
import java.awt.event.*;
import java.beans.Beans;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import de.cismet.tools.CismetThreadPool;
/**
* DOCUMENT ME!
*
* @author pascal
* @version $Revision$, $Date$
*/
public class AttributeTree extends JTree {
//~ Instance fields --------------------------------------------------------
private final Logger logger = Logger.getLogger(this.getClass());
private AttributeNode rootNode = null;
/** Holds value of property ignoreSubsitute. */
private boolean ignoreSubsitute = true;
/** Holds value of property ignoreArrayHelperObjects. */
private boolean ignoreArrayHelperObjects = true;
/** Holds value of property ignoreInvisibleAttributes. */
private boolean ignoreInvisibleAttributes;
/** Holds value of property newAttributeRequest. */
private boolean newAttributeRequest;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of AttributeTree.
*/
public AttributeTree() {
super(new DefaultTreeModel(null));
this.setCellRenderer(new IconRenderer());
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param node DOCUMENT ME!
*/
public void setTreeNode(final Object node) {
this.setNewAttributeRequest(true);
if ((node != null) && (node instanceof DefaultMetaTreeNode)) {
if (logger.isDebugEnabled()) {
logger.debug("creating new AttributeTreeThread"); // NOI18N
}
this.clear();
CismetThreadPool.execute(new Thread("AttributeTreeThread") // NOI18N
{
@Override
public void run() {
AttributeTree.this.setNewAttributeRequest(false);
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread started"); // NOI18N
}
synchronized (AttributeTree.this) {
try {
if (AttributeTree.this.isNewAttributeRequest()) {
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread: new request, aborting thread (1)"); // NOI18N
}
AttributeTree.this.notifyAll();
return;
}
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread running"); // NOI18N
}
if (((DefaultMetaTreeNode)node).isClassNode()) {
AttributeTree.this.rootNode = new ClassAttributeNode(
node.toString(),
AttributeTree.this.isIgnoreSubsitute(),
AttributeTree.this.ignoreArrayHelperObjects,
AttributeTree.this.ignoreInvisibleAttributes,
((ClassTreeNode)node).getMetaClass());
} else if (((DefaultMetaTreeNode)node).isObjectNode()) {
AttributeTree.this.rootNode = new ObjectAttributeNode(
node.toString(),
AttributeTree.this.isIgnoreSubsitute(),
AttributeTree.this.ignoreArrayHelperObjects,
AttributeTree.this.ignoreInvisibleAttributes,
((ObjectTreeNode)node).getMetaObject());
} else {
AttributeTree.this.rootNode = null;
}
if (AttributeTree.this.isNewAttributeRequest()) {
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread: new request, aborting thread (2)"); // NOI18N
}
AttributeTree.this.notifyAll();
return;
}
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread performing GUI update"); // NOI18N
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (logger.isDebugEnabled()) {
logger.debug(
"AttributeTreeThread: setting new root node '"
+ rootNode
+ "'"); // NOI18N
}
if (AttributeTree.this.isNewAttributeRequest()) {
if (logger.isDebugEnabled()) {
logger.debug(
"AttributeTreeThread: new request, aborting thread (1)"); // NOI18N
}
return;
}
((DefaultTreeModel)AttributeTree.this.getModel()).setRoot(rootNode);
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread GUI update in progress"); // NOI18N
}
((DefaultTreeModel)AttributeTree.this.getModel()).reload();
AttributeTree.this.setSelectionRow(0);
}
});
} catch (Exception exp) {
logger.error("could not update attribute tree", exp); // NOI18N
AttributeTree.this.clear();
}
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread: notifiy waiting threads"); // NOI18N
}
AttributeTree.this.notifyAll();
}
if (logger.isDebugEnabled()) {
logger.debug("AttributeTreeThread finished"); // NOI18N
}
}
});
} else {
this.clear();
}
}
/**
* DOCUMENT ME!
*/
public void clear() {
((DefaultTreeModel)this.getModel()).setRoot(null);
((DefaultTreeModel)this.getModel()).reload();
this.setSelectionRow(0);
this.rootNode = null;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public synchronized AttributeNode getRootNode() {
return this.rootNode;
}
/**
* Getter for property obeySubsitute.
*
* @return Value of property obeySubsitute.
*/
public boolean isIgnoreSubsitute() {
return this.ignoreSubsitute;
}
/**
* Setter for property obeySubsitute.
*
* @param ignoreSubsitute New value of property obeySubsitute.
*/
public void setIgnoreSubsitute(final boolean ignoreSubsitute) {
this.ignoreSubsitute = ignoreSubsitute;
}
/**
* Getter for property ignoreArrayHelperObjects.
*
* @return Value of property ignoreArrayHelperObjects.
*/
public boolean isIgnoreArrayHelperObjects() {
return this.ignoreArrayHelperObjects;
}
/**
* Setter for property ignoreArrayHelperObjects.
*
* @param ignoreArrayHelperObjects New value of property ignoreArrayHelperObjects.
*/
public void setIgnoreArrayHelperObjects(final boolean ignoreArrayHelperObjects) {
this.ignoreArrayHelperObjects = ignoreArrayHelperObjects;
}
/**
* Getter for property ignoreInvisibleAttributes.
*
* @return Value of property ignoreInvisibleAttributes.
*/
public boolean isIgnoreInvisibleAttributes() {
return this.ignoreInvisibleAttributes;
}
/**
* Setter for property ignoreInvisibleAttributes.
*
* @param ignoreInvisibleAttributes New value of property ignoreInvisibleAttributes.
*/
public void setIgnoreInvisibleAttributes(final boolean ignoreInvisibleAttributes) {
this.ignoreInvisibleAttributes = ignoreInvisibleAttributes;
}
/**
* Getter for property newAttributeRequest.
*
* @return Value of property newAttributeRequest.
*/
private synchronized boolean isNewAttributeRequest() {
return this.newAttributeRequest;
}
/**
* Setter for property newAttributeRequest.
*
* @param newAttributeRequest New value of property newAttributeRequest.
*/
private synchronized void setNewAttributeRequest(final boolean newAttributeRequest) {
this.newAttributeRequest = newAttributeRequest;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class IconRenderer extends DefaultTreeCellRenderer {
//~ Methods ------------------------------------------------------------
@Override
public Component getTreeCellRendererComponent(final JTree tree,
final Object value,
final boolean selected,
final boolean expanded,
final boolean leaf,
final int row,
final boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
this.setIcon(((AttributeNode)value).getIcon());
return this;
}
}
}