blob: 4916c2e90a8edc0e191ef1f57eb58e1af7e0e9dd [file] [log] [blame]
/***********************************************************************
* Copyright (c) 2008 Anyware Technologies
*
* 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:
* Anyware Technologies - initial API and implementation
*
* $Id: EAnnotationPropertySection.java,v 1.8 2009/05/06 13:54:14 jlescot Exp $
**********************************************************************/
package org.eclipse.emf.ecoretools.properties.internal.sections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.emf.common.ui.celleditor.ExtendedDialogCellEditor;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecoretools.properties.internal.Messages;
import org.eclipse.emf.ecoretools.tabbedproperties.EMFRecordingChangeCommand;
import org.eclipse.emf.ecoretools.tabbedproperties.providers.TabbedPropertiesLabelProvider;
import org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection;
import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.DialogCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
/**
* Annotations section <br>
* creation : 23 avr. 2008
*
* @author <a href="mailto:gilles.cannenterre@anyware-tech.com">Gilles
* Cannenterre</a>
*/
public class EAnnotationPropertySection extends AbstractTabbedPropertySection {
private static class MultiLineInputDialog extends InputDialog {
public MultiLineInputDialog(Shell parentShell, String title, String message, String initialValue, IInputValidator validator ) {
super(parentShell, title, message, initialValue, validator);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createButtonBar(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
// create a layout with spacing and margins appropriate for the font
// size.
GridLayout layout = new GridLayout();
layout.numColumns = 0; // this is incremented by createButton
layout.makeColumnsEqualWidth = true;
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
composite.setLayout(layout);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER);
composite.setLayoutData(data);
composite.setFont(parent.getFont());
// Add the buttons to the button bar.
createButtonsForButtonBar(composite);
return composite;
}
/**
* @see org.eclipse.jface.dialogs.InputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Control control = super.createDialogArea(parent);
Text text = getText();
if (text != null) {
GridData data = new GridData(GridData.FILL_BOTH);
data.grabExcessVerticalSpace = true;
data.grabExcessHorizontalSpace = true;
data.heightHint = 5 * text.getLineHeight();
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
text.setLayoutData(data);
}
return control;
}
/*
* @see org.eclipse.jface.dialogs.InputDialog#getInputTextStyle()
*/
@Override
protected int getInputTextStyle() {
return SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
}
}
private class ViewerContentProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof List) {
return ((List<?>) parentElement).toArray();
}
if (parentElement instanceof Map) {
return ((Map<?, ?>) parentElement).entrySet().toArray();
}
return Collections.EMPTY_LIST.toArray();
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof List) {
return ((List<?>) element).isEmpty();
}
if (element instanceof Map) {
return ((Map<?, ?>) element).isEmpty();
}
return false;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
// Ignore
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Ignore
}
}
private Group groupEAnnotations;
private Group groupMapEntries;
private TreeViewer eAnnotationViewer;
private TreeViewer mapEntryViewer;
private EAnnotation currentEAnnotation;
private Entry<?, ?> currentEntry;
/**
* @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#getFeature()
*/
@Override
protected EStructuralFeature getFeature() {
return EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS;
}
/**
* @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#getLabelText()
*/
@Override
protected String getLabelText() {
return Messages.EAnnotationPropertySection_Annotations;
}
/**
* @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractTabbedPropertySection#createWidgets(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createWidgets(Composite composite) {
super.createWidgets(composite);
groupEAnnotations = getWidgetFactory().createGroup(composite, Messages.EAnnotationPropertySection_AnnotationsGroup);
groupEAnnotations.setLayout(new GridLayout());
createGroupEAnnotationContents(groupEAnnotations);
groupMapEntries = getWidgetFactory().createGroup(composite, Messages.EAnnotationPropertySection_EntriesGroup);
groupMapEntries.setLayout(new GridLayout());
createGroupMapEntryContents(groupMapEntries);
}
/**
* @see org.eclipse.emf.ecoretools.tabbedproperties.sections.AbstractListPropertySection#setSectionData(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void setSectionData(Composite composite) {
super.setSectionData(composite);
FormData data = new FormData();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
groupEAnnotations.setLayoutData(data);
data = new FormData();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
data.top = new FormAttachment(groupEAnnotations, ITabbedPropertyConstants.VSPACE);
groupMapEntries.setLayoutData(data);
}
/**
* Create the group contents
*
* @param parent
* the parent Composite
*/
protected void createGroupEAnnotationContents(Composite parent) {
TabbedPropertySheetWidgetFactory widgetFactory = getWidgetFactory();
Composite composite = widgetFactory.createComposite(parent);
composite.setLayout(new GridLayout(2, false));
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridData featureViewerData2 = new GridData(GridData.FILL_BOTH);
featureViewerData2.grabExcessHorizontalSpace = true;
featureViewerData2.grabExcessVerticalSpace = true;
featureViewerData2.verticalSpan = 2;
featureViewerData2.heightHint = 80;
createEAnnotationViewer(composite, featureViewerData2);
addRemoveButtonEAnnotationComposite(composite, eAnnotationViewer);
}
/**
* Create the group contents
*
* @param parent
* the parent Composite
*/
protected void createGroupMapEntryContents(Composite parent) {
TabbedPropertySheetWidgetFactory widgetFactory = getWidgetFactory();
Composite composite = widgetFactory.createComposite(parent);
composite.setLayout(new GridLayout(2, false));
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridData featureViewerData2 = new GridData(GridData.FILL_BOTH);
featureViewerData2.grabExcessHorizontalSpace = true;
featureViewerData2.grabExcessVerticalSpace = true;
featureViewerData2.verticalSpan = 2;
featureViewerData2.heightHint = 80;
createMapEntryViewer(composite, featureViewerData2);
addRemoveButtonMapEntryComposite(composite, mapEntryViewer);
}
private void createMapEntryViewer(Composite parent, GridData layoutData) {
mapEntryViewer = createTreeViewer(parent, layoutData);
final TextCellEditor textCellEditor = new TextCellEditor(mapEntryViewer.getTree());
TreeViewerColumn columnKey = new TreeViewerColumn(mapEntryViewer, SWT.NONE);
columnKey.getColumn().setResizable(true);
columnKey.getColumn().setMoveable(true);
columnKey.getColumn().setWidth(200);
columnKey.getColumn().setText(Messages.EAnnotationPropertySection_Key);
columnKey.setLabelProvider(new ColumnLabelProvider() {
private ILabelProvider labelProvider = getLabelProvider();
/**
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (element instanceof Entry) {
return (((Entry<?, ?>) element).getKey() != null) ? ((Entry<?, ?>) element).getKey().toString() : Messages.EAnnotationPropertySection_Null;
}
return Messages.EAnnotationPropertySection_Unknown;
}
/**
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
return labelProvider.getImage(element);
}
/**
* @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
*/
@Override
public void dispose() {
labelProvider.dispose();
super.dispose();
}
});
columnKey.setEditingSupport(new EditingSupport(eAnnotationViewer) {
@Override
protected boolean canEdit(Object element) {
if (false == element instanceof Entry) {
return false;
}
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
return textCellEditor;
}
@Override
protected Object getValue(Object element) {
if (false == element instanceof Entry) {
return ""; //$NON-NLS-1$
}
return ((((Entry<?, ?>) element).getKey() == null) ? "" : ((Entry<?, ?>) element).getKey()); //$NON-NLS-1$
}
@Override
protected void setValue(Object element, Object value) {
if (false == element instanceof Entry) {
return;
}
final String text = value.toString();
if (currentEAnnotation != null && currentEAnnotation.getDetails().get(text) != null)
{
return;
}
final Entry<?, ?> entry = (Entry<?, ?>) element;
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
currentEAnnotation.getDetails().put(text, entry.getValue().toString());
currentEAnnotation.getDetails().remove(entry);
}
});
mapEntryViewer.refresh();
}
});
TreeViewerColumn columnValue = new TreeViewerColumn(mapEntryViewer, SWT.NONE);
columnValue.getColumn().setResizable(true);
columnValue.getColumn().setMoveable(true);
columnValue.getColumn().setWidth(200);
columnValue.getColumn().setText(Messages.EAnnotationPropertySection_Value);
columnValue.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (false == element instanceof Entry) {
return ""; //$NON-NLS-1$
}
return ((((Entry<?, ?>) element).getValue() == null) ? "" : ((Entry<?, ?>) element).getValue().toString()); //$NON-NLS-1$
}
});
final DialogCellEditor dialogCellEditor = new ExtendedDialogCellEditor(mapEntryViewer.getTree(), getLabelProvider()) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
MultiLineInputDialog dialog = new MultiLineInputDialog(cellEditorWindow.getShell(), Messages.EAnnotationPropertySection_EntryValue, null, getCurrentEntryValue(), null);
dialog.open();
return dialog.getValue();
}
private String getCurrentEntryValue() {
if (currentEntry == null) {
return ""; //$NON-NLS-1$
}
return currentEntry.getValue().toString();
}
};
columnValue.setEditingSupport(new EditingSupport(eAnnotationViewer) {
@Override
protected boolean canEdit(Object element) {
if (false == element instanceof Entry) {
return false;
}
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
return dialogCellEditor;
}
@Override
protected Object getValue(Object element) {
if (false == element instanceof Entry) {
return ""; //$NON-NLS-1$
}
return ((((Entry<?, ?>) element).getValue() == null) ? "" : ((Entry<?, ?>) element).getValue()); //$NON-NLS-1$
}
@Override
protected void setValue(Object element, Object value) {
if (false == element instanceof Entry) {
return;
}
final String text = value.toString();
@SuppressWarnings("unchecked")
final Entry<?, String> entry = (Entry<?, String>) element;
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
entry.setValue(text);
}
});
mapEntryViewer.update(element, null);
}
});
mapEntryViewer.setContentProvider(new ViewerContentProvider());
mapEntryViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if (false == event.getSelection() instanceof IStructuredSelection) {
currentEntry = null;
return;
}
Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
if (false == selection instanceof Entry) {
currentEntry = null;
return;
}
currentEntry = (Entry<?, ?>) selection;
}
});
}
private void createEAnnotationViewer(Composite parent, GridData layoutData) {
eAnnotationViewer = createTreeViewer(parent, layoutData);
final TextCellEditor textCellEditor = new TextCellEditor(eAnnotationViewer.getTree());
TreeViewerColumn columnName = new TreeViewerColumn(eAnnotationViewer, SWT.NONE);
columnName.getColumn().setResizable(true);
columnName.getColumn().setMoveable(true);
columnName.getColumn().setWidth(200);
columnName.getColumn().setText(Messages.EAnnotationPropertySection_Source);
columnName.setLabelProvider(new ColumnLabelProvider() {
private ILabelProvider labelProvider = getLabelProvider();
/**
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (element instanceof EAnnotation) {
return ((EAnnotation) element).getSource();
}
return Messages.EAnnotationPropertySection_Unknown;
}
/**
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
return labelProvider.getImage(element);
}
/**
* @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
*/
@Override
public void dispose() {
labelProvider.dispose();
super.dispose();
}
});
columnName.setEditingSupport(new EditingSupport(eAnnotationViewer) {
@Override
protected boolean canEdit(Object element) {
if (false == element instanceof EAnnotation) {
return false;
}
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
return textCellEditor;
}
@Override
protected Object getValue(Object element) {
if (false == element instanceof EAnnotation) {
return ""; //$NON-NLS-1$
}
return ((((EAnnotation) element).getSource() == null) ? "" : ((EAnnotation) element).getSource()); //$NON-NLS-1$
}
@Override
protected void setValue(Object element, Object value) {
if (false == element instanceof EAnnotation) {
return;
}
final String text = value.toString();
if (((EModelElement) getEObject()).getEAnnotation(text) != null) {
return;
}
final EAnnotation eAnnotation = (EAnnotation) element;
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
eAnnotation.setSource(text);
}
});
eAnnotationViewer.update(element, null);
}
});
TreeViewerColumn columnEReference = new TreeViewerColumn(eAnnotationViewer, SWT.NONE);
columnEReference.getColumn().setResizable(true);
columnEReference.getColumn().setMoveable(true);
columnEReference.getColumn().setWidth(200);
columnEReference.getColumn().setText(Messages.EAnnotationPropertySection_References);
columnEReference.setLabelProvider(new ColumnLabelProvider() {
private ILabelProvider labelProvider = getLabelProvider();
/**
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (false == element instanceof EAnnotation) {
return ""; //$NON-NLS-1$
}
String content = ""; //$NON-NLS-1$
for (EObject eObject : ((EAnnotation) element).getReferences()) {
content = labelProvider.getText(eObject) + ", " + content; //$NON-NLS-1$
}
return content;
}
/**
* @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
*/
@Override
public void dispose() {
labelProvider.dispose();
super.dispose();
}
});
final DialogCellEditor dialogCellEditor = new ExtendedDialogCellEditor(eAnnotationViewer.getTree(), getLabelProvider()) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
FeatureEditorDialog dialog = new FeatureEditorDialog(cellEditorWindow.getShell(), labelProvider, currentEAnnotation, EcorePackage.Literals.EANNOTATION__REFERENCES,
Messages.EAnnotationPropertySection_ChooseReferences, getPotentialReferences());
dialog.open();
return dialog.getResult();
}
private List<?> getPotentialReferences() {
List<EObject> potentialMatches = new ArrayList<EObject>();
if (currentEAnnotation.eResource() == null) {
return Collections.emptyList();
}
for (Iterator<EObject> it = currentEAnnotation.eResource().getAllContents(); it.hasNext();) {
potentialMatches.add(it.next());
}
return potentialMatches;
}
};
columnEReference.setEditingSupport(new EditingSupport(eAnnotationViewer) {
private ILabelProvider labelProvider = getLabelProvider();
@Override
protected boolean canEdit(Object element) {
if (false == element instanceof EAnnotation) {
return false;
}
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
return dialogCellEditor;
}
@Override
protected Object getValue(Object element) {
if (false == element instanceof EAnnotation) {
return ""; //$NON-NLS-1$
}
String content = ""; //$NON-NLS-1$
for (EObject eObject : ((EAnnotation) element).getReferences()) {
content = labelProvider.getText(eObject) + ", " + content; //$NON-NLS-1$
}
return content;
}
@Override
protected void setValue(Object element, final Object value) {
if (false == element instanceof EAnnotation || value == null) {
return;
}
final EAnnotation eAnnotation = (EAnnotation) element;
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
if (value instanceof List) {
eAnnotation.getReferences().clear();
@SuppressWarnings("unchecked")
List<EObject> eObjectValues = (List<EObject>) value;
eAnnotation.getReferences().addAll(eObjectValues);
}
}
});
eAnnotationViewer.update(element, null);
}
});
eAnnotationViewer.setContentProvider(new ViewerContentProvider());
eAnnotationViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if (false == event.getSelection() instanceof IStructuredSelection) {
currentEAnnotation = null;
return;
}
Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
if (false == selection instanceof EAnnotation) {
currentEAnnotation = null;
return;
}
currentEAnnotation = (EAnnotation) selection;
mapEntryViewer.setInput(getMapEntries());
}
});
}
private Collection<? extends EAnnotation> getEAnnotations() {
if (getEObject() instanceof EModelElement) {
return ((EModelElement) getEObject()).getEAnnotations();
}
return Collections.emptyList();
}
private Collection<Map.Entry<String, String>> getMapEntries() {
if (currentEAnnotation != null) {
return currentEAnnotation.getDetails();
}
return Collections.emptyList();
}
private TreeViewer createTreeViewer(Composite parent, GridData layoutData) {
TreeViewer treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
treeViewer.getTree().setLinesVisible(true);
treeViewer.getTree().setHeaderVisible(true);
treeViewer.getTree().setLayoutData(layoutData);
TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(treeViewer, new FocusCellOwnerDrawHighlighter(treeViewer));
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(treeViewer) {
@Override
protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
}
};
TreeViewerEditor.create(treeViewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL
| ColumnViewerEditor.KEYBOARD_ACTIVATION);
return treeViewer;
}
private void addRemoveButtonEAnnotationComposite(Composite parent, TreeViewer viewer) {
TabbedPropertySheetWidgetFactory widgetFactory = getWidgetFactory();
Composite comp = widgetFactory.createComposite(parent);
comp.setLayout(new GridLayout());
Button add = widgetFactory.createButton(comp, Messages.EAnnotationPropertySection_Add, SWT.NONE);
add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
add.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
public void widgetSelected(SelectionEvent e) {
if (false == getEObject() instanceof EModelElement) {
return;
}
final EAnnotation newEAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
setDefaultNameForElement((EModelElement) getEObject(), newEAnnotation);
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
((EModelElement) getEObject()).getEAnnotations().add(newEAnnotation);
}
});
eAnnotationViewer.setInput(getEAnnotations());
}
private void setDefaultNameForElement(EModelElement container, EAnnotation elementToConfigure) {
Boolean foundName = false;
int count = 0;
while (!foundName && count < 10000) {
if (container.getEAnnotation(Messages.EAnnotationPropertySection_EAnnotation + count) == null) {
elementToConfigure.setSource(Messages.EAnnotationPropertySection_EAnnotation + count);
foundName = true;
}
count++;
}
}
});
Button remove = widgetFactory.createButton(comp, Messages.EAnnotationPropertySection_Remove, SWT.NONE);
remove.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
remove.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
public void widgetSelected(SelectionEvent e) {
if (false == getEObject() instanceof EModelElement) {
return;
}
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
((EModelElement) getEObject()).getEAnnotations().remove(currentEAnnotation);
}
});
eAnnotationViewer.setInput(getEAnnotations());
}
});
}
private void addRemoveButtonMapEntryComposite(Composite parent, TreeViewer viewer) {
TabbedPropertySheetWidgetFactory widgetFactory = getWidgetFactory();
Composite comp = widgetFactory.createComposite(parent);
comp.setLayout(new GridLayout());
Button add = widgetFactory.createButton(comp, Messages.EAnnotationPropertySection_Add, SWT.NONE);
add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
add.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
public void widgetSelected(SelectionEvent e) {
if (currentEAnnotation == null) {
return;
}
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
currentEAnnotation.getDetails().put(getKeyString(currentEAnnotation), ""); //$NON-NLS-1$
}
});
mapEntryViewer.setInput(getMapEntries());
}
private String getKeyString(EAnnotation container) {
int count = 0;
for (Map.Entry<String, String> eDetail : container.getDetails()) {
if (eDetail.getKey() != null) {
if (eDetail.getKey().equals(Messages.EAnnotationPropertySection_EStringToStringMapEntry + count)) {
count++;
}
}
}
return Messages.EAnnotationPropertySection_EStringToStringMapEntry + count;
}
});
Button remove = widgetFactory.createButton(comp, Messages.EAnnotationPropertySection_Remove, SWT.NONE);
remove.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
remove.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
public void widgetSelected(SelectionEvent e) {
if (currentEAnnotation == null) {
return;
}
getEditingDomain().getCommandStack().execute(new EMFRecordingChangeCommand(getEObject().eResource()) {
@Override
protected void doExecute() {
currentEAnnotation.getDetails().remove(currentEntry);
}
});
mapEntryViewer.setInput(getMapEntries());
}
});
}
protected ILabelProvider getLabelProvider() {
return new TabbedPropertiesLabelProvider(new EcoreItemProviderAdapterFactory());
}
@Override
public void refresh() {
super.refresh();
eAnnotationViewer.setInput(getEAnnotations());
mapEntryViewer.setInput(getMapEntries());
}
}