| /******************************************************************************* |
| * Copyright (c) 2004, 2006 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.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; |
| 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; |
| |
| 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; |
| |
| propertyDescriptorFactory = new XMLTableTreePropertyDescriptorFactory(); |
| } |
| |
| 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(fTree.getDisplay().getSystemColor(SWT.COLOR_BLACK)); |
| gc.setBackground(fTree.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; |
| |
| ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument()); |
| if ((result == null) && (mq != null)) { |
| CMElementDeclaration ed = mq.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; |
| } |
| } |
| } |