/******************************************************************************* * 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.attribute; import java.util.*; import org.jboss.tools.common.model.util.XModelTreeListenerSWTASync; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.IPage; import org.eclipse.ui.views.properties.*; 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.XModel; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.adapter.IModelObjectAdapter; import org.jboss.tools.common.model.event.*; public class XModelObjectPropertySource implements IPropertySource, IXModelSupport, IModelObjectAdapter, IPropertySource2 { protected ArrayList<IPropertyDescriptor> propertyDescriptors; protected XModelObject modelObject; protected Properties cachedValues = new Properties(); private XModelTreeListener listener = new XModelTreeListenerSWTASync(new XModelTreeListenerImpl()); public XModelObjectPropertySource() {} public void dispose() { if (modelObject!=null && modelObject.getModel()!=null) { modelObject.getModel().removeModelTreeListener(listener); listener = null; } } public Object getEditableValue() { return null; } public IPropertyDescriptor[] getPropertyDescriptors() { return (IPropertyDescriptor[])propertyDescriptors.toArray(new IPropertyDescriptor[propertyDescriptors.size()]); } public Object getPropertyValue(Object id) { String n = getAttributeNameById(id); String v = modelObject.getAttributeValue(n); XAttribute a = modelObject.getModelEntity().getAttribute(n); if(a != null && v != null && a.getConstraint() instanceof XAttributeConstraintAList) { v = WizardKeys.getVisualListValue(a, v); } cachedValues.setProperty(n, "" + v); //$NON-NLS-1$ return v; } public boolean isPropertySet(Object id) { String n = getAttributeNameById(id); String defaultValue = modelObject.getModelEntity().getAttribute(n).getDefaultValue(); return !getPropertyValue(id).equals(defaultValue); } public void resetPropertyValue(Object id) { String n = getAttributeNameById(id); String defaultValue = modelObject.getModelEntity().getAttribute(n).getDefaultValue(); if(defaultValue == null) return; if(modelObject.isActive()) { try { modelObject.getModel().editObjectAttribute(modelObject, n, defaultValue.toString()); } catch (XModelException e) { throw new IllegalArgumentException(e); } } else { modelObject.setAttributeValue(n, defaultValue.toString()); } } private String getAttributeNameById(Object id) { return (id == null) ? null : id.toString(); } public void setPropertyValue(Object id, Object value) { if(value == null) return; String n = getAttributeNameById(id); String v = cachedValues.getProperty(n); if(value.equals(v)) return; cachedValues.setProperty(n, "" + value); //$NON-NLS-1$ value = fromVisualToModel(n, value.toString()); if(modelObject.isActive()) { try { modelObject.getModel().editObjectAttribute(modelObject, n, value.toString()); } catch (XModelException e) { throw new IllegalArgumentException(e); } } else { modelObject.setAttributeValue(n, value.toString()); } } private String fromVisualToModel(String n, String value) { XAttribute a = modelObject.getModelEntity().getAttribute(n); if(a != null && value != null && a.getConstraint() instanceof XAttributeConstraintAList) { String[] vs = ((XAttributeConstraintAList)a.getConstraint()).getValues(); for (int i = 0; i < vs.length; i++) { String v = WizardKeys.getVisualListValue(a, vs[i]); if(value.equals(v)) return vs[i]; } } return value; } // custom methods public void setModelObject(XModelObject object) { modelObject = object; XAttribute[] attrs = modelObject.getModelEntity().getAttributes(); propertyDescriptors = new ArrayList<IPropertyDescriptor>(); for (int i=0;i<attrs.length;++i) { if (attrs[i].isVisible() && !"element type".equals(attrs[i].getName())) { //$NON-NLS-1$ //propertyDescriptors.add(new TextPropertyDescriptor(attrs[i].getName(),attrs[i].getName())); propertyDescriptors.add(new XAttributePropertyDescription(this, attrs[i], modelObject)); } } XModel model = modelObject.getModel(); if(model.getManager("propertySheetUpdate") == null) { //$NON-NLS-1$ model.addModelTreeListener(listener); model.addManager("propertySheetUpdate", listener); //$NON-NLS-1$ } } public XModel getModel() { return modelObject.getModel(); } class XModelTreeListenerImpl implements XModelTreeListener { public void nodeChanged(XModelTreeEvent event) { if(modelObject == null || modelObject != event.getModelObject()) return; PropertySheet sh = null; try { sh = (PropertySheet)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$ } catch (NullPointerException exc) { //ignore } if(sh == null) return; IPage page = sh.getCurrentPage(); if(page instanceof PropertySheetPage) { PropertySheetPage p = (PropertySheetPage)page; if(p == null || p.getControl() == null || p.getControl().isDisposed()) return; p.refresh(); } } public void structureChanged(XModelTreeEvent event) {} } public boolean isPropertyResettable(Object id) { String n = getAttributeNameById(id); return modelObject != null && modelObject.isAttributeEditable(n); } }