|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.vcs.advanced.projectsettings;
import java.beans.BeanInfo;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor;
import java.lang.reflect.InvocationTargetException;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.openide.cookies.InstanceCookie;
import org.openide.filesystems.FileSystem;
import org.openide.loaders.XMLDataObject;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.BeanNode;
import org.openide.nodes.Children;
import org.openide.nodes.Sheet;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
import org.openide.util.WeakListener;
/**
* The node, that represents the CommandLineVcsFileSystem instance.
* Inspired by InstanceNode.
*
* @author Martin Entlicher
*/
public class CommandLineVcsFileSystemNode extends AbstractNode {
private XMLDataObject obj;
private InstanceCookie ic;
private PropertyChangeListener xmlPropertyListener;
private PropertyChangeListener instancePropertyListener;
/** Creates a new instance of CommandLineVcsFileSystemNode */
public CommandLineVcsFileSystemNode(XMLDataObject obj, InstanceCookie ic) {
super(Children.LEAF);
this.obj = obj;
this.ic = ic;
xmlPropertyListener = new XMLPropertyListener();
obj.addPropertyChangeListener(WeakListener.propertyChange(xmlPropertyListener, obj));
setIconBase("org/netbeans/modules/vcs/advanced/vcsGeneric"); // NOI18N
getCookieSet().add(ic);
getCookieSet().add(obj);
updateState();
}
public HelpCtx getHelpCtx() {
return new HelpCtx(CommandLineVcsFileSystemNode.class);
}
private void updateState() {
boolean wasSetDisplayName = false;
boolean wasSetSystemName = false;
try {
Document doc = obj.getDocument();
Element rootElem = doc.getDocumentElement();
NodeList propertiesesList = rootElem.getElementsByTagName(CommandLineVcsFileSystemInstance.FS_PROPERTIES_ELEM);
if (propertiesesList.getLength() > 0) {
Element propertiesNode = (Element) propertiesesList.item(0);
NodeList propertiesList = propertiesNode.getElementsByTagName(CommandLineVcsFileSystemInstance.FS_PROPERTY_ELEM);
for (int i = 0; i < propertiesList.getLength(); i++) {
Node property = propertiesList.item(i);
NamedNodeMap propertyAttrs = property.getAttributes();
Node nameAttr = propertyAttrs.getNamedItem(CommandLineVcsFileSystemInstance.PROPERTY_NAME_ATTR);
if (nameAttr == null) continue;
String name = nameAttr.getNodeValue();
if ("displayName".equals(name)) { // NOI18N
String value = getPropertyValue(property);
setDisplayName(value);
setShortDescription(NbBundle.getMessage(CommandLineVcsFileSystemNode.class,
"CommandLineVcsFileSystemNode.Description", value));
wasSetDisplayName = true;
if (wasSetDisplayName && wasSetSystemName) break;
}
if ("systemName".equals(name)) { // NOI18N
String value = getPropertyValue(property);
setName(value);
wasSetSystemName = true;
if (wasSetDisplayName && wasSetSystemName) break;
}
}
}
} catch (java.io.IOException ioex) {
} catch (SAXException sex) {}
if (!wasSetDisplayName) {
try {
FileSystem instFS = (FileSystem) ic.instanceCreate();
setDisplayName(instFS.getDisplayName());
} catch (java.io.IOException ioex) {
} catch (ClassNotFoundException cnfex) {}
}
if (!wasSetSystemName) {
try {
FileSystem instFS = (FileSystem) ic.instanceCreate();
setName(instFS.getSystemName());
} catch (java.io.IOException ioex) {
} catch (ClassNotFoundException cnfex) {}
}
}
private String getPropertyValue(Node property) {
String value = ""; // NOI18N
NodeList valueList = property.getChildNodes();
int m = valueList.getLength();
for (int j = 0; j < m; j++) {
Node valueNode = valueList.item(j);
if (CommandLineVcsFileSystemInstance.PROPERTY_VALUE_TAG.equals(valueNode.getNodeName())) {
NodeList textList = valueNode.getChildNodes();
for (int itl = 0; itl < textList.getLength(); itl++) {
Node subNode = textList.item(itl);
if (subNode instanceof Text) {
Text textNode = (Text) subNode;
value += textNode.getData();
}
if (subNode instanceof EntityReference) {
EntityReference entityNode = (EntityReference) subNode;
NodeList entityList = entityNode.getChildNodes();
for (int iel = 0; iel < entityList.getLength(); iel++) {
Node entitySubNode = entityList.item(iel);
if (entitySubNode instanceof Text) {
Text textEntityNode = (Text) entitySubNode;
value += textEntityNode.getData();
}
}
}
}
}
}
return value;
}
/** try to register PropertyChangeListener to instance to fire its changes.*/
private void initPropListener() {
try {
BeanInfo info = Utilities.getBeanInfo(ic.instanceClass());
java.beans.EventSetDescriptor[] descs = info.getEventSetDescriptors();
java.lang.reflect.Method setter = null;
for (int i = 0; descs != null && i < descs.length; i++) {
setter = descs[i].getAddListenerMethod();
if (setter != null && setter.getName().equals("addPropertyChangeListener")) { // NOI18N
Object bean = ic.instanceCreate();
instancePropertyListener = new InstancePropertyListener();
setter.invoke(bean, new Object[] { WeakListener.propertyChange(instancePropertyListener, bean) });
}
}
} catch (java.io.IOException ioex) {
} catch (ClassNotFoundException cnfex) {
} catch (java.beans.IntrospectionException iex) {
} catch (IllegalAccessException iaex) {
} catch (java.lang.reflect.InvocationTargetException itex) {}
}
protected Sheet createSheet() {
//Sheet orig = super.createSheet();
//changeSheet(orig);
//return orig;
Sheet sheet = new Sheet();
try {
// properties
BeanInfo beanInfo = Utilities.getBeanInfo (ic.instanceClass ());
BeanNode.Descriptor descr = BeanNode.computeProperties (ic.instanceCreate (), beanInfo);
initPropListener();
// ok, introspection succeeded, we will have properties tab
Sheet.Set props = Sheet.createPropertiesSet();
if (descr.property != null) {
convertProps (props, descr.property, ic);
}
sheet.put (props);
if (descr.expert != null && descr.expert.length != 0) {
Sheet.Set exp = Sheet.createExpertSet();
convertProps (exp, descr.expert, ic);
sheet.put (exp);
}
} catch (ClassNotFoundException ex) {
//TopManager.getDefault ().getErrorManager ().notify (ErrorManager.INFORMATIONAL, ex);
} catch (java.io.IOException ex) {
//TopManager.getDefault ().getErrorManager ().notify (ErrorManager.INFORMATIONAL, ex);
} catch (java.beans.IntrospectionException ex) {
//TopManager.getDefault ().getErrorManager ().notify (ErrorManager.INFORMATIONAL, ex);
}
return sheet;
}
/** Method that converts properties of an object.
* @param set set to add properties to
* @param arr array of Node.Property and Node.IndexedProperty
* @param ido IDO providing task to invoke when a property changes
*/
private static final void convertProps(Sheet.Set set, org.openide.nodes.Node.Property[] arr, InstanceCookie ic) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] instanceof org.openide.nodes.Node.IndexedProperty) {
set.put (new I ((org.openide.nodes.Node.IndexedProperty)arr[i], ic));
} else {
set.put (new P (arr[i], ic));
}
}
}
/** A property that delegates every call to original property
* but when modified, also starts a saving task.
*/
private static final class P extends org.openide.nodes.Node.Property {
/** delegate */
private org.openide.nodes.Node.Property del;
/** task to executed */
private InstanceCookie ic;
public P (org.openide.nodes.Node.Property del, InstanceCookie ic) {
super (del.getValueType ());
this.del = del;
this.ic = ic;
}
public void setName(java.lang.String str) {
del.setName(str);
}
public void restoreDefaultValue() throws IllegalAccessException, InvocationTargetException {
del.restoreDefaultValue();
}
public void setValue(java.lang.String str, java.lang.Object obj) {
del.setValue(str, obj);
}
public boolean supportsDefaultValue() {
return del.supportsDefaultValue();
}
public boolean canRead() {
return del.canRead ();
}
public PropertyEditor getPropertyEditor() {
return del.getPropertyEditor();
}
public boolean isHidden() {
return del.isHidden();
}
public Object getValue() throws IllegalAccessException, InvocationTargetException {
return del.getValue ();
}
public void setExpert(boolean param) {
del.setExpert(param);
}
/** Delegates the set value and also saves the bean.
*/
public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
del.setValue (val);
//FileSystem fs = (FileSystem) ic.instanceCreate();
//fs.
//t.scheduleSave();
}
public void setShortDescription(java.lang.String str) {
del.setShortDescription(str);
}
public boolean isExpert() {
return del.isExpert();
}
public boolean canWrite() {
return del.canWrite ();
}
public Class getValueType() {
return del.getValueType();
}
public java.lang.String getDisplayName() {
return del.getDisplayName();
}
public java.util.Enumeration attributeNames() {
return del.attributeNames();
}
public java.lang.String getShortDescription() {
return del.getShortDescription();
}
public java.lang.String getName() {
return del.getName();
}
public void setHidden(boolean param) {
del.setHidden(param);
}
public void setDisplayName(java.lang.String str) {
del.setDisplayName(str);
}
public boolean isPreferred() {
return del.isPreferred();
}
public java.lang.Object getValue(java.lang.String str) {
return del.getValue(str);
}
public void setPreferred(boolean param) {
del.setPreferred(param);
}
} // end of P
/** A property that delegates every call to original property
* but when modified, also starts a saving task.
*/
private static final class I extends org.openide.nodes.Node.IndexedProperty {
/** delegate */
private org.openide.nodes.Node.IndexedProperty del;
/** task to executed */
private InstanceCookie ic;
public I (org.openide.nodes.Node.IndexedProperty del, InstanceCookie ic) {
super (del.getValueType (), del.getElementType ());
this.del = del;
this.ic = ic;
}
public void setName(java.lang.String str) {
del.setName(str);
}
public void restoreDefaultValue() throws IllegalAccessException, InvocationTargetException {
del.restoreDefaultValue();
}
public void setValue(java.lang.String str, java.lang.Object obj) {
del.setValue(str, obj);
}
public boolean supportsDefaultValue() {
return del.supportsDefaultValue();
}
public boolean canRead() {
return del.canRead ();
}
public PropertyEditor getPropertyEditor() {
return del.getPropertyEditor();
}
public boolean isHidden() {
return del.isHidden();
}
public Object getValue() throws IllegalAccessException, InvocationTargetException {
return del.getValue ();
}
public void setExpert(boolean param) {
del.setExpert(param);
}
/** Delegates the set value and also saves the bean.
*/
public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
del.setValue (val);
//t.scheduleSave();
}
public void setShortDescription(java.lang.String str) {
del.setShortDescription(str);
}
public boolean isExpert() {
return del.isExpert();
}
public boolean canWrite() {
return del.canWrite ();
}
public Class getValueType() {
return del.getValueType();
}
public java.lang.String getDisplayName() {
return del.getDisplayName();
}
public java.util.Enumeration attributeNames() {
return del.attributeNames();
}
public java.lang.String getShortDescription() {
return del.getShortDescription();
}
public java.lang.String getName() {
return del.getName();
}
public void setHidden(boolean param) {
del.setHidden(param);
}
public void setDisplayName(java.lang.String str) {
del.setDisplayName(str);
}
public boolean isPreferred() {
return del.isPreferred();
}
public java.lang.Object getValue(java.lang.String str) {
return del.getValue(str);
}
public void setPreferred(boolean param) {
del.setPreferred(param);
}
public boolean canIndexedRead () {
return del.canIndexedRead ();
}
public Class getElementType () {
return del.getElementType ();
}
public Object getIndexedValue (int index) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
return del.getIndexedValue (index);
}
public boolean canIndexedWrite () {
return del.canIndexedWrite ();
}
public void setIndexedValue (int indx, Object val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
del.setIndexedValue (indx, val);
//t.scheduleSave();
}
public PropertyEditor getIndexedPropertyEditor () {
return del.getIndexedPropertyEditor ();
}
} // end of I
private final class XMLPropertyListener extends Object implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent ev) {
if (XMLDataObject.PROP_DOCUMENT.equals(ev.getPropertyName())) {
updateState();
}
}
}
private final class InstancePropertyListener extends Object implements PropertyChangeListener {
private boolean doNotListen = false;
public void propertyChange(PropertyChangeEvent e) {
if (doNotListen) return;
firePropertyChange(e.getPropertyName(), e.getOldValue(), e.getNewValue());
}
public void destroy() {
doNotListen = true;
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.