blob: b9635fdde1ed2f50dfb7b7cb440e3697d306b717 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2004 IBM Corporation and others. All rights reserved. This
* program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and
* is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.wst.xml.ui.internal.tabletree;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDescriptionBuilder;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class XMLTreeExtension extends TreeExtension {
public final static String STRUCTURE_PROPERTY = XMLEditorMessages.XMLTreeExtension_0;
public final static String VALUE_PROPERTY = XMLEditorMessages.XMLTreeExtension_1;
protected Composite control;
protected MyCellModifier modifier;
protected XMLTableTreePropertyDescriptorFactory propertyDescriptorFactory;
protected CMDescriptionBuilder decriptionBuilder = new CMDescriptionBuilder();
protected TreeContentHelper treeContentHelper = new TreeContentHelper();
protected Color f1, f2, b1, b2;
protected boolean cachedDataIsValid = true;
private ModelQuery fModelQuery;
public XMLTreeExtension(Tree tree) {
super(tree);
control = tree;
modifier = new MyCellModifier();
setCellModifier(modifier);
String[] properties = {STRUCTURE_PROPERTY, VALUE_PROPERTY};
setColumnProperties(properties);
f1 = tree.getDisplay().getSystemColor(SWT.COLOR_BLACK);
Color background = tree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
int r = Math.abs(background.getRed() - 125);
int g = Math.abs(background.getGreen() - 85);
int b = Math.abs(background.getBlue() - 105);
f2 = new Color(tree.getDisplay(), r, g, b);
b1 = tree.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION);
b2 = background;
}
public void dispose() {
super.dispose();
f2.dispose();
}
public void resetCachedData() {
cachedDataIsValid = false;
}
public void paintItems(GC gc, TreeItem[] items, Rectangle treeBounds) {
super.paintItems(gc, items, treeBounds);
cachedDataIsValid = true;
}
protected Object[] computeTreeExtensionData(Object object) {
Color color = f1;
String string = ""; //$NON-NLS-1$
if (string.length() == 0) {
string = (String) modifier.getValue(object, VALUE_PROPERTY);
color = f1;
}
if (string.length() == 0 && object instanceof Element) {
string = getElementValueHelper((Element) object);
color = f2;
}
Object[] data = new Object[2];
data[0] = string;
data[1] = color;
return data;
}
protected void paintItem(GC gc, TreeItem item, Rectangle bounds) {
super.paintItem(gc, item, bounds);
Object[] data = computeTreeExtensionData(item.getData());
if (data != null && data.length == 2) {
gc.setClipping(columnPosition, bounds.y + 1, controlWidth, bounds.height);
gc.setForeground((Color) data[1]);
gc.drawString((String) data[0], columnPosition + 5, bounds.y + 1);
gc.setClipping((Rectangle) null);
}
}
protected void addEmptyTreeMessage(GC gc) {
// here we print a message when the document is empty just to give the
// user a visual cue
// so that they know how to proceed to edit the blank view
gc.setForeground(tree.getDisplay().getSystemColor(SWT.COLOR_BLACK));
gc.setBackground(tree.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
gc.drawString(XMLEditorMessages.XMLTreeExtension_3, 10, 10);
gc.drawString(XMLEditorMessages.XMLTreeExtension_4, 10, 10 + gc.getFontMetrics().getHeight());
}
public String getElementValueHelper(Element element) {
String result = null;
if (result == null && getModelQuery() != null) {
CMElementDeclaration ed = getModelQuery().getCMElementDeclaration(element);
if (ed != null && !Boolean.TRUE.equals(ed.getProperty("isInferred"))) { //$NON-NLS-1$
result = decriptionBuilder.buildDescription(ed);
}
}
return result != null ? result : ""; //$NON-NLS-1$
}
/**
*
*/
public class MyCellModifier implements ICellModifier, TreeExtension.ICellEditorProvider {
public boolean canModify(Object element, String property) {
boolean result = false;
if (element instanceof Node) {
Node node = (Node) element;
result = property == VALUE_PROPERTY && treeContentHelper.isEditable(node);
}
return result;
}
public Object getValue(Object object, String property) {
String result = null;
if (object instanceof Node) {
result = treeContentHelper.getNodeValue((Node) object);
}
return (result != null) ? result : ""; //$NON-NLS-1$
}
public void modify(Object element, String property, Object value) {
//enableNodeSelectionListener(false);
Item item = (Item) element;
String oldValue = treeContentHelper.getNodeValue((Node) item.getData());
String newValue = value.toString();
if (newValue != null && !newValue.equals(oldValue)) {
treeContentHelper.setNodeValue((Node) item.getData(), value.toString());
}
//enableNodeSelectionListener(true);
}
public CellEditor getCellEditor(Object o, int col) {
IPropertyDescriptor pd = propertyDescriptorFactory.createPropertyDescriptor(o);
return pd != null ? pd.createPropertyEditor(control) : null;
}
}
public ModelQuery getModelQuery() {
return fModelQuery;
}
/**
* @param query
*/
public void setModelQuery(ModelQuery query) {
fModelQuery = query;
propertyDescriptorFactory = new XMLTableTreePropertyDescriptorFactory(query);
}
}