/******************************************************************************* * 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.adapter; import java.beans.PropertyChangeEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Properties; import org.eclipse.core.runtime.IAdaptable; import org.jboss.tools.common.model.ui.IAttributeErrorProvider; import org.jboss.tools.common.model.ui.IValueChangeListener; import org.jboss.tools.common.model.ui.IValueProvider; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.attribute.editor.ExtendedFieldEditor; import org.jboss.tools.common.model.ui.attribute.editor.PropertyEditor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.XActionInvoker; import org.jboss.tools.common.model.XFilteredTree; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.ui.actions.IActionProvider; public class DefaultTreeSelectionAdapter extends DefaultValueAdapter implements IAdaptable, ISelectionProvider, ISelectionChangedListener { public static final String LINK_ACTION = "linkAction"; //$NON-NLS-1$ protected ILabelProvider labelProvider; protected ITreeContentProvider treeContentProvider; public DefaultTreeSelectionAdapter() {} public void dispose() { super.dispose(); if (labelProvider!=null) labelProvider.dispose(); labelProvider = null; if (treeContentProvider!=null) treeContentProvider.dispose(); treeContentProvider = null; if (actionProvider!=null) actionProvider.dispose(); actionProvider = null; } // IAdaptable public Object getAdapter(Class adapter) { if (adapter == IValueProvider.class) { return this; } if (adapter == IValueChangeListener.class) { return this; } if (adapter == IAttributeErrorProvider.class) return this; if (adapter == ISelectionProvider.class) { return this; } if (adapter == ISelectionChangedListener.class) { return this; } if (adapter == ILabelProvider.class) { if (this.labelProvider==null) { this.labelProvider = new DefaultXModelObjectLabelProvider(); } return this.labelProvider; } if (adapter == ITreeContentProvider.class) { return getTreeContentProvider(); } if (adapter == IActionProvider.class) { return getActionProvider(); } if(adapter == IContentAssistProcessor.class) { //deprecated, replaced by AttributeContentProposalProviderFactory DefaultTreeSelectionContentAssistProcessor processor = new DefaultTreeSelectionContentAssistProcessor(); ITreeContentProvider tree = getTreeContentProvider(); if(tree instanceof DefaultXAttributeTreeContentProvider) { processor.setTreeProvider((DefaultXAttributeTreeContentProvider)tree); return processor; } else { return null; } } Assert.isTrue(true, "DefaultTreeSelectionAdapter instance itself cannot provide adapter for "+adapter.getName()); //$NON-NLS-1$ return null; } ArrayList<ISelectionChangedListener> selectionChangeListeners = new ArrayList<ISelectionChangedListener>(); // ISelectionProvider public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangeListeners.add(listener); } public ISelection getSelection() { Object v = getValue(); Object object = (v == null) ? null : getObjectByPath(v.toString()); return object == null ? new StructuredSelection() : new StructuredSelection(object); } public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangeListeners.remove(listener); } public void setSelection(ISelection selection) {} // ISelectionChangedListener public void selectionChanged(SelectionChangedEvent event) { StructuredSelection selection = (StructuredSelection)event.getSelection(); Iterator i = selection.iterator(); while (i.hasNext()) { XModelObject object = (XModelObject)i.next(); if (getFilteredTree()==null) return; if(!getFilteredTree().isSelectable(object)) continue; this.valueChange(new PropertyChangeEvent(this, PropertyEditor.VALUE, null, getPathByObject(object))); if (labelAction!=null) { labelAction.setXModelObject(object); } } } private Object getObjectByPath(String path) { if (getFilteredTree()!=null) { return getFilteredTree().find(path); } return null; } private String getPathByObject(Object object) { return getFilteredTree().getValue((XModelObject)object); } private XFilteredTree getFilteredTree() { if (getTreeContentProvider() instanceof DefaultXAttributeTreeContentProvider) return ((DefaultXAttributeTreeContentProvider)getTreeContentProvider()).getFilteredTree(); return null; } // IActionProviderImplementation private ActionProvider actionProvider; private XActionWrapper labelAction; protected ActionProvider getActionProvider() { if (this.actionProvider == null) { this.actionProvider = new ActionProvider(); } return this.actionProvider; } class ActionProvider implements IActionProvider { private HashMap<String,IAction> actions = new HashMap<String,IAction>(); public IAction getAction(String actionName) { return actions.get(actionName); } public IAction[] getActions() { return actions.values().toArray(new IAction[actions.values().size()]); } public void putAction(String actionAlias, IAction action) { actions.put(actionAlias, action); } public void dispose() { if (actions!=null) actions.clear(); actions = null; } public void update(ISelection selection) { // if(actions != null) { // for (IAction a: actions.values()) { // if(a instanceof XActionWrapper) { // ((XActionWrapper)a).setXModelObject(getModelObject()); // } // } // } //not implemented } } public ITreeContentProvider getTreeContentProvider() { if (this.treeContentProvider==null) { DefaultXAttributeTreeContentProvider treeContentProvider = new DefaultXAttributeTreeContentProvider(attribute, model, modelObject); this.treeContentProvider = treeContentProvider; } return this.treeContentProvider; } private void initActions() { treeContentProvider = getTreeContentProvider(); if (treeContentProvider instanceof DefaultXAttributeTreeContentProvider) { String linkActionName = ((DefaultXAttributeTreeContentProvider)treeContentProvider).getProperties().getProperty(LINK_ACTION); if (linkActionName!=null) { XAction xAction = XActionInvoker.getAction(linkActionName, modelObject); if (xAction!=null) { XActionWrapper linkAction = new XActionWrapper(xAction); //Let it always be enabled, or we need //good update not only depending on value but on workspace resources. // XModelObject object = (XModelObject)getObjectByPath(this.getStringValue(Boolean.TRUE.booleanValue())); // linkAction.setXModelObject(object); linkAction.setEnabled(true); getActionProvider().putAction(ExtendedFieldEditor.LABEL_SELECTED, linkAction); } } } } /** * @see org.jboss.tools.common.model.ui.attribute.adapter.IModelPropertyEditorAdapter#setAttribute(org.jboss.tools.common.meta.XAttribute) */ public void setAttribute(XAttribute attribute) { super.setAttribute(attribute); if (modelObject!=null && attribute!=null) initActions(); } /** * @see org.jboss.tools.common.model.ui.attribute.adapter.IModelPropertyEditorAdapter#setModelObject(org.jboss.tools.common.model.XModelObject) */ public void setModelObject(XModelObject object) { super.setModelObject(object); if (modelObject!=null && attribute!=null) initActions(); } }