/*******************************************************************************
* 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.ArrayList;
import org.eclipse.jface.viewers.CellEditor;
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.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.constraint.impl.XAttributeConstraintAList;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
public class XModelObjectEditor {
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 XModelObject object = null;
protected XAttribute[] attributes = new XAttribute[0];
protected XCellModifier modifier = new XCellModifier();
protected boolean viewMode = false;
public XModelObjectEditor() {
xtable.setTableProvider(new XTableProviderImpl());
}
public void dispose() {
if (xtable!=null) xtable.dispose();
xtable = null;
}
public void setModelObject(XModelObject object) {
if(this.object == object) return;
stopEditing();
this.object = object;
if(xtable.getTable() == null || xtable.getTable().isDisposed()) return;
xtable.getTable().setSelection(-1);
updateTimeStamp = -2;
update();
}
public void setViewMode(boolean b) {
viewMode = b;
}
public Control createControl(Composite parent) {
return createControl(parent, xtable.style);
}
public Control createControl(Composite parent, int style) {
updateTimeStamp = -1;
xtable.createControl(parent, style);
xtable.getViewer().setColumnProperties(new String[]{"name", "value"}); //$NON-NLS-1$ //$NON-NLS-2$
xtable.getViewer().setCellModifier(modifier);
if(!viewMode) {
xtable.getViewer().setCellEditors(new CellEditor[]{null, new XCellEditor(xtable.getTable())});
}
update();
return xtable.getTable();
}
public Control getControl() {
return xtable.getTable();
}
protected void loadAttributes() {
ArrayList<XAttribute> list = new ArrayList<XAttribute>();
XAttribute[] as = (object == null) ? new XAttribute[0] : object.getModelEntity().getAttributes();
for (int i = 0; i < as.length; i++)
if(as[i].isVisible()) list.add(as[i]);
attributes = list.toArray(new XAttribute[0]);
}
public void stopEditing() {
if(object != null && xtable.getViewer() != null && xtable.getViewer().isCellEditorActive()) {
CellEditor editor = xtable.getViewer().getCellEditors()[1];
if(editor instanceof XCellEditor) {
((XCellEditor)editor).applyEditorValue();
}
}
}
long updateTimeStamp = -1;
public void update() {
if(xtable.getTable() == null) return;
long ts = (object == null) ? -1 : object.getTimeStamp();
if(updateTimeStamp == ts) return;
updateTimeStamp = ts;
loadAttributes();
xtable.update();
}
class XTableProviderImpl implements XTableProvider {
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return attributes.length;
}
public String getColumnName(int c) {
return (c == 0) ? "name" : "value";
}
public String getValueAt(int r, int c) {
if(c == 0) {
String labelText = WizardKeys.getAttributeDisplayName(attributes[r], true);
if(labelText == null) {
labelText = attributes[r].getName();
}
//use visual name as everywhere
// labelText = (labelText == null) ? attributes[r].getName() : labelText.toLowerCase();
return labelText;
}
String v = "" + object.getAttributeValue(attributes[r].getName()); //$NON-NLS-1$
if(attributes[r].getConstraint() instanceof XAttributeConstraintAList) {
v = WizardKeys.getVisualListValue(attributes[r], v);
}
return v;
}
public Object getDataAt(int r) {
return new XAttributeInfo(object, attributes[r].getName());
}
public Color getColor(int r) {
XAttributeInfo data = (XAttributeInfo)getDataAt(r);
return (data.isEditable() && !viewMode) ? DEFAULT_COLOR : DISABLED_COLOR;
}
public int getWidthHint(int c) {
return (c == 0) ? 10 : 20;
}
public void dispose() {
object = null;
}
}
}