/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.objecteditor;
import java.util.Properties;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TableItem;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
public class ExtendedPropertiesEditor {
static Color DEFAULT_COLOR = Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
static Color DISABLED_COLOR = Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
static Image EMPTY = EclipseResourceUtil.getImage("images/actions/empty.gif"); //$NON-NLS-1$
protected XTable xtable = new XTable();
protected ExtendedProperties attributes;
protected ICellModifier modifier = new CellModifierImpl();
protected boolean readOnly = false;
ExtendedCellEditorProvider cellEditorProvider = null;
Properties context = new Properties();
public ExtendedPropertiesEditor() {
xtable.setTableProvider(new XTableProviderImpl());
}
public void setExtendedProperties(ExtendedProperties attributes) {
if(this.attributes == attributes) return;
stopEditing();
this.attributes = attributes;
if(attributes != null) {
context.setProperty("nodeName", "" + attributes.getNodeName()); //$NON-NLS-1$ //$NON-NLS-2$
cellEditorProvider = attributes.createCellEditorProvider();
if(attributes.getNode() != null) {
context.put("node", attributes.getNode()); //$NON-NLS-1$
}
}
if(xtable.getTable() == null || xtable.getTable().isDisposed()) return;
xtable.getTable().setSelection(-1);
update();
}
public void setReadOnly(boolean b) {
readOnly = b;
}
public Control createControl(Composite parent) {
return createControl(parent, xtable.style);
}
public Control createControl(Composite parent, int style) {
xtable.createControl(parent, style);
xtable.getViewer().setColumnProperties(new String[]{"name", "value"}); //$NON-NLS-1$ //$NON-NLS-2$
xtable.getViewer().setCellModifier(modifier);
if(!readOnly) {
CellEditor cellEditor = (cellEditorProvider != null)
? cellEditorProvider.createCellEditor(xtable.getTable(), context)
: new ExtendedTextCellEditor(xtable.getTable());
xtable.getViewer().setCellEditors(new CellEditor[]{null, cellEditor});
}
update();
return xtable.getTable();
}
public Control getControl() {
return xtable.getTable();
}
public void stopEditing() {
if(attributes != null && xtable.getViewer() != null && xtable.getViewer().isCellEditorActive()) {
CellEditor editor = xtable.getViewer().getCellEditors()[1];
if(editor instanceof XCellEditor) {
((XCellEditor)editor).applyEditorValue();
} else if(editor instanceof ExtendedCellEditorProvider.StoppableCellEditor) {
((ExtendedCellEditorProvider.StoppableCellEditor)editor).stopEditing();
}
}
}
public void update() {
if(xtable.getTable() == null) return;
xtable.update();
}
public void dispose() {
if (xtable!=null) xtable.dispose();
xtable = null;
if (context != null) {
context.clear();
context = null;
}
}
class XTableProviderImpl implements XTableProvider {
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return (attributes == null) ? 0 : attributes.getAttributes().length;
}
public String getColumnName(int c) {
return (c == 0) ? "name" : "value";
}
public String getValueAt(int r, int c) {
String name = attributes.getAttributes()[r];
return (c == 0) ? name : "" + attributes.getAttributeValue(name); //$NON-NLS-1$
}
public Object getDataAt(int r) {
if(attributes == null) return null;
AttributeWrapper w = new AttributeWrapper();
w.attributes = attributes;
w.name = attributes.getAttributes()[r];
w.value = attributes.getAttributeValue(w.name);
return w;
}
public Color getColor(int r) {
if(attributes == null) return DISABLED_COLOR;
String name = attributes.getAttributes()[r];
return (attributes.isEditableAttribute(name) && !readOnly) ? DEFAULT_COLOR : DISABLED_COLOR;
}
public int getWidthHint(int c) {
return (c == 0) ? 10 : 20;
}
public void dispose() {
attributes = null;
}
}
}
class CellModifierImpl implements ICellModifier {
public boolean canModify(Object element, String property) {
if(!"value".equals(property)) return false; //$NON-NLS-1$
AttributeWrapper v = (AttributeWrapper)element;
return v != null && v.attributes.isEditableAttribute(v.name);
}
public Object getValue(Object element, String property) {
return element;
}
public void modify(Object element, String property, Object value) {
AttributeWrapper v = (AttributeWrapper)value;
if(v == null || v.value == null) return;
String stringValue = v.value;
String old = v.attributes.getAttributeValue(v.name);
if("".equals(stringValue)) { //$NON-NLS-1$
if(old == null || old.length() == 0) return;
} else {
if(old != null && old.equals(stringValue)) return;
}
v.attributes.setAttributeValue(v.name, stringValue);
TableItem item = (TableItem)element;
if (item!=null && !item.isDisposed()) {
item.setData(v);
item.setText(1, stringValue);
}
}
}
class ExtendedTextCellEditor extends TextCellEditor {
AttributeWrapper wrapper;
protected Object doGetValue() {
if(wrapper != null) {
wrapper.value = (String)super.doGetValue();
}
return wrapper;
}
public ExtendedTextCellEditor(Composite parent) {
super(parent);
}
protected void doSetValue(Object value) {
wrapper = (AttributeWrapper)value;
super.doSetValue(wrapper == null ? "" : wrapper.attributes.getAttributeValue(wrapper.name)); //$NON-NLS-1$
setValueValid(true);
}
}