Skip to content
Snippets Groups Projects
Commit eaf71397 authored by Simon Barner's avatar Simon Barner
Browse files

- Introduce AnnotationEditingSupportBase class

- Ensure and document that all output of TextEditingSupport.getValue() is converted to a non-null String. This is required because this value will be consumed in TextCellEditor.doSetValue() which expects such input
parent ebd5d5f3
No related branches found
No related tags found
No related merge requests found
/*--------------------------------------------------------------------------+
$Id$
| |
| Copyright 2014 ForTISS GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.base.ui.annotation.editingsupport;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.swt.widgets.Shell;
import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
import org.fortiss.tooling.base.ui.annotation.AnnotationEntry;
import org.fortiss.tooling.base.ui.annotation.view.GenericAnnotationView;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.IPersistencyService;
/**
* Base class for {@link EditingSupport}s used in the {@link GenericAnnotationView}.
*
* @author barner
* @author $Author$
* @version $Rev$
* @ConQAT.Rating RED
*/
public abstract class AnnotationEditingSupportBase extends EditingSupport {
/** Specification class of this column */
protected Class<? extends IAnnotatedSpecification> specClass;
/** Constructor. */
public AnnotationEditingSupportBase(ColumnViewer viewer,
Class<? extends IAnnotatedSpecification> specClass) {
super(viewer);
this.specClass = specClass;
}
/** {@inheritDoc} */
@Override
protected boolean canEdit(Object element) {
if(element instanceof AnnotationEntry) {
AnnotationEntry data = (AnnotationEntry)element;
return data.getSpecificationValue(specClass) != AnnotationEntry.NOVAL;
}
return true;
}
/** Actually gets the value from the {@link IAnnotatedSpecification}. */
protected Object doGetValue(AnnotationEntry annotationEntry) {
return annotationEntry.getSpecificationValue(specClass);
}
/** {@inheritDoc} */
@Override
protected Object getValue(Object element) {
if(element instanceof AnnotationEntry) {
return doGetValue((AnnotationEntry)element);
}
return null;
}
/** Actually sets a {@link String} value into a {@link IAnnotatedSpecification}. */
protected void doSetValue(AnnotationEntry annotationEntry, String value) throws Exception {
annotationEntry.setSpecificationValue(value, specClass);
}
/** {@inheritDoc} */
@Override
protected void setValue(Object element, final Object value) {
if(element instanceof AnnotationEntry && value instanceof String) {
final AnnotationEntry annotationEntry = (AnnotationEntry)element;
if(!value.equals(getValue(element))) {
ITopLevelElement modelContext =
IPersistencyService.INSTANCE.getTopLevelElementFor(annotationEntry
.getModelElement());
modelContext.runAsCommand(new Runnable() {
@Override
public void run() {
try {
doSetValue(annotationEntry, (String)value);
} catch(IllegalArgumentException e) {
MessageDialog
.openError(
new Shell(),
"ERROR",
"The value you entered does not have the desired type.\nDetailed message:\n" +
e.getMessage());
} catch(Exception e) {
MessageDialog.openError(new Shell(), "ERROR", e.getMessage());
}
}
});
this.getViewer().refresh(true);
}
}
}
}
......@@ -19,19 +19,13 @@ package org.fortiss.tooling.base.ui.annotation.editingsupport;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
import org.fortiss.tooling.base.ui.annotation.AnnotationEntry;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.IPersistencyService;
/**
* This class constructs and manages an editing element for the annotation view. It provides a combo
......@@ -42,13 +36,10 @@ import org.fortiss.tooling.kernel.service.IPersistencyService;
* @version $Rev$
* @ConQAT.Rating YELLOW Hash: AC8E4395DB075EC3FA9BF290373BBD9B
*/
public class ComboBoxEditingSupport extends EditingSupport {
public class ComboBoxEditingSupport extends AnnotationEditingSupportBase {
/** Combo box cell editor */
private ComboBoxViewerCellEditor cellEditor = null;
/** Specification class of this column */
private Class<? extends IAnnotatedSpecification> specClass;
/**
* Constructor.
*
......@@ -61,13 +52,12 @@ public class ComboBoxEditingSupport extends EditingSupport {
*/
public ComboBoxEditingSupport(ColumnViewer viewer,
Class<? extends IAnnotatedSpecification> clazz, List<String> values) {
super(viewer);
super(viewer, clazz);
cellEditor = new ComboBoxViewerCellEditor((Composite)getViewer().getControl());
cellEditor.setLabelProvider(new LabelProvider());
cellEditor.setContentProvider(new ArrayContentProvider());
cellEditor.setInput(values);
cellEditor.getViewer().getCCombo().setEditable(false);
specClass = clazz;
}
/** {@inheritDoc} */
......@@ -75,61 +65,4 @@ public class ComboBoxEditingSupport extends EditingSupport {
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
/** {@inheritDoc} */
@Override
protected boolean canEdit(Object element) {
if(element instanceof AnnotationEntry) {
AnnotationEntry data = (AnnotationEntry)element;
return data.getSpecificationValue(specClass) != AnnotationEntry.NOVAL;
}
return true;
}
/** {@inheritDoc} */
@Override
protected Object getValue(Object element) {
if(element instanceof AnnotationEntry) {
AnnotationEntry data = (AnnotationEntry)element;
return data.getSpecificationValue(specClass);
}
return null;
}
/** {@inheritDoc} */
@Override
protected void setValue(Object element, final Object value) {
if(element instanceof AnnotationEntry && value instanceof String) {
final AnnotationEntry data = (AnnotationEntry)element;
if(!value.equals(data.getSpecificationValue(specClass))) {
ITopLevelElement modelContext =
IPersistencyService.INSTANCE.getTopLevelElementFor(data.getModelElement());
modelContext.runAsCommand(new Runnable() {
@Override
public void run() {
try {
data.setSpecificationValue((String)value, specClass);
} catch(IllegalArgumentException e) {
// should not happen with combo boxes and given values
MessageDialog
.openError(
new Shell(),
"ERROR",
"The value you entered does not have the desired type.\nDetailed message:\n" +
e.getMessage());
} catch(Exception e) {
// e.printStackTrace();
MessageDialog.openError(new Shell(), "ERROR", e.getMessage());
}
}
});
this.getViewer().refresh(true);
}
}
}
}
......@@ -17,15 +17,10 @@ $Id$
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.base.ui.annotation.editingsupport;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.swt.widgets.Shell;
import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
import org.fortiss.tooling.base.ui.annotation.AnnotationEntry;
import org.fortiss.tooling.base.ui.annotation.valueprovider.MultiInstanceAnnotationValueProviderBase;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.IPersistencyService;
/**
* This class extends {@link TextEditingSupport} to support text annotations for which multiple
......@@ -52,53 +47,14 @@ public class MultiInstanceAnnotationTextEditingSupport extends TextEditingSuppor
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
protected Object getValue(Object element) {
String rval = null;
if(element instanceof AnnotationEntry) {
AnnotationEntry data = (AnnotationEntry)element;
if(data.getSpecificationValue(specClass) != null) {
rval =
((EMap<String, String>)data.getSpecificationValue(specClass))
.get(instanceKey);
}
}
return rval != null ? rval : "";
protected Object doGetValue(AnnotationEntry annotationEntry) {
return annotationEntry.getSpecificationValue(specClass, instanceKey);
}
/** {@inheritDoc} */
@Override
protected void setValue(Object element, final Object value) {
if(element instanceof AnnotationEntry && value instanceof String) {
final AnnotationEntry entry = (AnnotationEntry)element;
if(!value.equals(entry.getSpecificationValue(specClass, instanceKey))) {
ITopLevelElement modelContext =
IPersistencyService.INSTANCE.getTopLevelElementFor(entry.getModelElement());
modelContext.runAsCommand(new Runnable() {
@Override
public void run() {
try {
entry.setSpecificationValue(value, specClass, instanceKey);
} catch(IllegalArgumentException e) {
// e.printStackTrace();
MessageDialog
.openError(
new Shell(),
"ERROR",
"The value you entered does not have the desired type.\nDetailed message:\n" +
e.getMessage());
} catch(Exception e) {
MessageDialog.openError(new Shell(), "ERROR", e.getMessage());
}
}
});
this.getViewer().refresh(true);
}
}
protected void doSetValue(AnnotationEntry annotationEntry, String value) throws Exception {
annotationEntry.setSpecificationValue(value, specClass, instanceKey);
}
}
......@@ -17,18 +17,12 @@ $Id$
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.base.ui.annotation.editingsupport;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
import org.fortiss.tooling.base.ui.annotation.AnnotationEntry;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.IPersistencyService;
/**
* This class constructs and manages an editing element for the annotation view. It provides a
......@@ -40,19 +34,17 @@ import org.fortiss.tooling.kernel.service.IPersistencyService;
* @version $Rev$
* @ConQAT.Rating YELLOW Hash: 09C91FA1AB55052CD74ECF69E121DD7C
*/
public class TextEditingSupport extends EditingSupport {
public class TextEditingSupport extends AnnotationEditingSupportBase {
/** Text cell editor */
protected TextCellEditor cellEditor = null;
/** Specification class of this column */
protected Class<? extends IAnnotatedSpecification> specClass;
/** Constructor. */
public TextEditingSupport(ColumnViewer viewer, Class<? extends IAnnotatedSpecification> class1) {
super(viewer);
public TextEditingSupport(ColumnViewer viewer,
Class<? extends IAnnotatedSpecification> specClass) {
super(viewer, specClass);
cellEditor = new TextCellEditor((Composite)getViewer().getControl(), SWT.NONE);
specClass = class1;
}
/** {@inheritDoc} */
......@@ -61,62 +53,17 @@ public class TextEditingSupport extends EditingSupport {
return cellEditor;
}
/** {@inheritDoc} */
@Override
protected boolean canEdit(Object element) {
if(element instanceof AnnotationEntry) {
AnnotationEntry data = (AnnotationEntry)element;
return data.getSpecificationValue(specClass) != AnnotationEntry.NOVAL;
}
return true;
}
/** {@inheritDoc} */
@Override
protected Object getValue(Object element) {
if(element instanceof AnnotationEntry) {
AnnotationEntry annotationEntry = (AnnotationEntry)element;
Object value = annotationEntry.getSpecificationValue(specClass);
if(value != null) {
return value.toString();
}
// This method is triggered from several methods in EditingSupport, which - for this
// TextEditingSupport - passes its result to TextCellEditor.doSetValue() which expects a
// non-null String.
Object rval = super.getValue(element);
if(rval != null) {
return rval.toString();
}
return "";
}
/** {@inheritDoc} */
@Override
protected void setValue(Object element, final Object value) {
if(element instanceof AnnotationEntry && value instanceof String) {
final AnnotationEntry entry = (AnnotationEntry)element;
if(!value.equals(entry.getSpecificationValue(specClass))) {
ITopLevelElement modelContext =
IPersistencyService.INSTANCE.getTopLevelElementFor(entry.getModelElement());
modelContext.runAsCommand(new Runnable() {
@Override
public void run() {
try {
entry.setSpecificationValue((String)value, specClass);
} catch(IllegalArgumentException e) {
// e.printStackTrace();
MessageDialog
.openError(
new Shell(),
"ERROR",
"The value you entered does not have the desired type.\nDetailed message:\n" +
e.getMessage());
} catch(Exception e) {
MessageDialog.openError(new Shell(), "ERROR", e.getMessage());
}
}
});
this.getViewer().refresh(true);
}
}
return "";
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment