/****************************************************************************** * Copyright (c) 2002, 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.gmf.runtime.common.ui.services.properties.extended; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.gmf.runtime.common.core.util.StringStatics; import org.eclipse.gmf.runtime.common.ui.dialogs.PropertiesDialog; import org.eclipse.gmf.runtime.common.ui.services.properties.PropertiesService; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.preference.PreferenceNode; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.dialogs.PropertyPage; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; /** * Cell editor for properties that can be modified via a property page. * This cell editor is composed of an elipsis button for editing via * a property page. * * @author ldamus */ public class PropertyPageCellEditor extends MultiButtonCellEditor { /** * My property descriptor */ private final PropertyPagePropertyDescriptor propertyDescriptor; /** * Creates a new property page cell editor parented under the given control. * The cell editor value is <code>null</code> initially, and has no * validator. * * @param parent The parent control * @param descriptor The property descriptor for this cell */ public PropertyPageCellEditor( Composite parent, PropertyPagePropertyDescriptor descriptor) { this(parent, descriptor, SWT.NONE); } /** * Creates a new property page cell editor parented under the given control. * The cell editor value is <code>null</code> initially, and has no * validator. * * @param parent The parent control * @param descriptor The property descriptor for this cell * @param style the style bits */ public PropertyPageCellEditor( Composite parent, PropertyPagePropertyDescriptor descriptor, int style) { super(parent, style); propertyDescriptor = descriptor; } /** * Gets the property descriptor for this cell editor. * * @return the property descriptor */ private PropertyPagePropertyDescriptor getPropertyDescriptor() { return propertyDescriptor; } /** * Opens the {@link org.eclipse.gmf.runtime.common.ui.dialogs.PropertiesDialog}. Always * returns null. The UI is updated by the model event when the property * is modified by the property dialog. * * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control) */ protected Object openDialogBox(Control cellEditorWindow) { // Invoke the property dialog PropertiesDialog dialog = new PropertiesDialog( getControl().getShell(), new PreferenceManager()); // handle invokation of cell editor from collection editor PropertyPagePropertyDescriptor realDescriptor = null; if (getValue() instanceof ElementValue) { Object element = ((ElementValue) getValue()).getElement(); if (element instanceof PropertyPagePropertyDescriptor) { realDescriptor = (PropertyPagePropertyDescriptor) element; } } List pages = null; if (realDescriptor != null) { pages = realDescriptor.createPropertyPages(); } else { pages = getPropertyDescriptor().createPropertyPages(); } for (Iterator i = pages.iterator(); i.hasNext();) { PropertyPage page = (PropertyPage) i.next(); // handle invokation of cell editor from collection editor if (realDescriptor != null) { final IPropertySource source = realDescriptor.getPropertySource(); page.setElement(new IAdaptable() { public Object getAdapter(Class adapter) { if (adapter.equals(IPropertySource.class)) { return source; } return null; } }); } dialog.getPreferenceManager().addToRoot( new PreferenceNode(StringStatics.BLANK, page)); } dialog.create(); dialog.open(); // refresh property for collection editor for (Iterator i = pages.iterator(); i.hasNext();) { PropertyPage page = (PropertyPage) i.next(); IAdaptable adaptable = page.getElement(); if (adaptable != null) { IPropertySource source = (IPropertySource) adaptable.getAdapter( IPropertySource.class); if (source instanceof IExtendedPropertySource) { Object element = ((IExtendedPropertySource) source).getElement(); IPropertySource propertySource = PropertiesService.getInstance().getPropertySource( element); assert null != propertySource; for (Iterator j = Arrays .asList(propertySource.getPropertyDescriptors()) .iterator(); j.hasNext(); ) { IPropertyDescriptor descriptor = (IPropertyDescriptor) j.next(); if (descriptor .getId() .equals(getPropertyDescriptor().getId())) { // apply new value in cell editor setValue( new ElementValue( source, propertySource.getPropertyValue( descriptor.getId()))); fireApplyEditorValue(); break; } } } } } return null; } /** * Determines if there is text to copy. * * @return <code>true</code> if the text selection is not empty, * <code>false</code>otherwise */ public boolean isCopyEnabled() { return false; } /** * Determines if there is text to cut * * @return <code>true</code> if the text selection is not empty, * <code>false</code>otherwise */ public boolean isCutEnabled() { return false; } /** * Determines if there is text to delete * * @return <code>true</code> if the text selection is not empty, * <code>false</code>otherwise */ public boolean isDeleteEnabled() { return false; } /** * Determines if there is a text widget on which text can be pasted * * @return <code>true</code> if the text selection is not empty, * <code>false</code>otherwise */ public boolean isPasteEnabled() { return false; } /** * Determines if there is a text widget in which text can be saved * * @return <code>true</code> if the text widget is not disposed, * <code>false</code>otherwise */ public boolean isSaveAllEnabled() { return false; } /** * Determines if there is text to be selected. * * @return <code>true</code> if select all is possible, * <code>false</code> otherwise */ public boolean isSelectAllEnabled() { return false; } /** * Copies the selected text */ public void performCopy() { // default implementation do nothing } /** * Cuts the selected text to the clipboard. */ public void performCut() { /* not suppoerted */ } /** * Deletes the selected text or, if there is no selection, * the character next character from the current position. */ public void performDelete() { /* not suppoerted */ } /** * Pastes the the clipboard contents over the selected text. */ public void performPaste() { /* not suppoerted */ } /** * Selects all of the text */ public void performSelectAll() { /* not suppoerted */ } /** * Getter method for value * @return the value of this cell editor */ protected Object getCellObjectValue() { return super.doGetValue(); } /** * @see org.eclipse.gmf.runtime.common.ui.services.properties.extended.MultiButtonCellEditor#initButtons() */ protected void initButtons() { // 'set' button IPropertyAction setAction = new IPropertyAction() { public Object execute(Control owner) { return openDialogBox(owner); } }; addButton("...", setAction); //$NON-NLS-1$ } }