/******************************************************************************* * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf. * 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: * Michael Jastram - initial API and implementation * Lukas Ladenberger - ProR GUI ******************************************************************************/ package org.eclipse.rmf.reqif10.pror.editor.propertiesview; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.agilemore.agilegrid.AgileGrid; import org.agilemore.agilegrid.Cell; import org.agilemore.agilegrid.SWTX; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.rmf.reqif10.AttributeDefinition; import org.eclipse.rmf.reqif10.AttributeValue; import org.eclipse.rmf.reqif10.ReqIF10Package; import org.eclipse.rmf.reqif10.SpecElementWithAttributes; import org.eclipse.rmf.reqif10.common.util.ReqIF10Util; import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyContentProvider.Descriptor; import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyContentProvider.PropertyRow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuAdapter; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; /** * This control wraps an actual AgileGrid that displays the properties of the * current selection. It is instantiated twice, once for all and once for those * properties relevant to users (via showAllProps). * * @author Lukas Ladenberger * @author Michael Jastram * */ public class ProrPropertyControl extends AgileGrid implements PropertyChangeListener { protected ProrPropertyContentProvider contentProvider; private Object object; private AttributeValue removeValue; private AdapterFactory adapterFactory; public ProrPropertyControl(Composite parent, AdapterFactory adapterFactory, boolean showAllProps) { super(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWTX.FILL_WITH_LASTCOL | SWT.MULTI | SWT.DOUBLE_BUFFERED); this.adapterFactory = adapterFactory; setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); this.contentProvider = new ProrPropertyContentProvider(adapterFactory, showAllProps); super.setContentProvider(this.contentProvider); setCellRendererProvider(new ProrPropertyCellRendererProvider(this, adapterFactory, contentProvider)); setLayoutAdvisor(new ProrPropertyLayoutAdvisor(this)); setCellEditorProvider(new ProrPropertyCellEditorProvider(this, adapterFactory, this.contentProvider)); setRowResizeCursor(new Cursor(this.getDisplay(), SWT.CURSOR_ARROW)); // listen to property changes in content // Fix of 378041 contentProvider.addPropertyChangeListener(this); configurePopupMenu(parent); } public void setContentProvider(ProrPropertyContentProvider prorPropertyContentProvider){ this.contentProvider = prorPropertyContentProvider; super.setContentProvider(this.contentProvider); setCellRendererProvider(new ProrPropertyCellRendererProvider(this, adapterFactory, contentProvider)); setLayoutAdvisor(new ProrPropertyLayoutAdvisor(this)); setCellEditorProvider(new ProrPropertyCellEditorProvider(this, adapterFactory, this.contentProvider)); // listen to property changes in content // Fix of 378041 contentProvider.addPropertyChangeListener(this); } /** * Sets up a context menu that allows the value to be removed from * {@link SpecElementWithAttributes}. * * @param parent */ private void configurePopupMenu(Composite parent) { // Required to set the selection properly, before a context menu pops // up. addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { Cell[] cells = new Cell[] { getCell(e.x, e.y) }; ProrPropertyControl.this.clearSelection(); ProrPropertyControl.this.selectCells(cells); } }); // The actual menu. Menu menu = new Menu(parent); final MenuItem item = new MenuItem(menu, SWT.NONE); item.setText("Remove Value"); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeValue(); } }); // Prepares the menu, before it is shown. menu.addMenuListener(new MenuAdapter() { public void menuShown(MenuEvent e) { item.setEnabled(false); removeValue = null; Cell[] selection = ProrPropertyControl.this.getCellSelection(); if (selection.length == 1) { PropertyRow row = contentProvider .getRowContent(selection[0].row); if (row instanceof Descriptor) { Descriptor descriptor = (Descriptor) row; if (descriptor.isRMFSpecific()) { AttributeValue av = descriptor.getAttributeValue(); if (av != null && av.eContainer() != null) { removeValue = av; item.setEnabled(true); } } } } } }); setMenu(menu); } private void removeValue() { EditingDomain editingDomain = AdapterFactoryEditingDomain .getEditingDomainFor(removeValue); if (editingDomain != null) { Command cmd = null; if (removeValue.eContainer() instanceof SpecElementWithAttributes) { cmd = RemoveCommand .create(editingDomain, removeValue.eContainer(), ReqIF10Package.Literals.SPEC_ELEMENT_WITH_ATTRIBUTES__VALUES, removeValue); } else if (removeValue.eContainer() instanceof AttributeDefinition) { AttributeDefinition ad = (AttributeDefinition) removeValue .eContainer(); cmd = SetCommand.create(editingDomain, ad, ReqIF10Util.getDefaultValueFeature(ad), null); System.out.println(cmd.canExecute()); } if (cmd != null) { editingDomain.getCommandStack().execute(cmd); redrawCells(ProrPropertyControl.this.getCellSelection()); } else { System.err.println("Don't know parent: " + removeValue.eContainer()); } } } public void setSelection(ISelection selection) { if (selection instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection) selection; if (sel.size() == 1) { Object obj = sel.getFirstElement(); contentProvider.setContent(obj); object = obj; redraw(); return; } } contentProvider.setContent(null); redraw(); } // Fix of 378041 // listen to property changes in content // reload Content and redraw on change event public void propertyChange(PropertyChangeEvent event) { if (isDisposed()) return; if (event.getPropertyName().equals("")) { contentProvider.setContent(object); redraw(); } } }