blob: eed1072e6ba658bfb241723a60955671104ff82c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.uima.taeconfigurator.editors.ui.dialogs;
import org.apache.uima.cas.Type;
import org.apache.uima.resource.metadata.FeatureDescription;
import org.apache.uima.resource.metadata.TypeDescription;
import org.apache.uima.taeconfigurator.editors.ui.AbstractSection;
import org.apache.uima.taeconfigurator.editors.ui.TypeSection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Text;
public class AddFeatureDialog extends AbstractDialogKeyVerify {
private static final int ONLY_NON_PRIMITIVE_TYPES = 0;
private static final int ALL_TYPES = 1;
private StyledText featureNameUI;
private Text featureRangeNameUI;
private Text descriptionUI;
public String featureName;
private String originalFeatureName;
public String featureRangeName;
public String description;
public String elementRangeName;
public Boolean multiRef;
private TypeSection typeSection;
private TypeDescription td;
private FeatureDescription existingFd;
private TypesWithNameSpaces allTypesList;
private Composite multiRefComposite;
private CCombo multiRefUI;
private Composite elementTypeComposite;
private Text elementRangeNameUI;
private int typeFilter;
/**
* @param aSection
* @param aExistingTd
*/
public AddFeatureDialog(AbstractSection aSection, TypeDescription aTd,
FeatureDescription aExistingFd) {
super(aSection, "Add a Feature", "Use this panel to add or edit a feature");
typeSection = (TypeSection) aSection;
td = aTd;
existingFd = aExistingFd;
}
protected Control createDialogArea(Composite parent) {
Composite mainArea = (Composite) super.createDialogArea(parent, existingFd);
createWideLabel(mainArea, "The feature name must be unique within this type");
// This part of the form looks like this sketch
//
// Feature Name: Text field << in 2 grid composite
// Range Type: CCombo << in 2 grid composite
// checkbox: multiple references allowed (hidden if not applicable)
// Element Type: same as above (hidden if not applicable)
// description: Text field << in 2 grid composite
Composite twoCol = new2ColumnComposite(mainArea);
featureNameUI = newLabeledSingleLineStyledText(twoCol, "Feature Name", S_);
typeFilter = ALL_TYPES;
featureRangeNameUI = newLabeledTypeInput(section, twoCol, "Range Type:",
"The range type specifies the type of value this feature can hold.");
multiRefComposite = new2ColumnComposite(twoCol);
((GridData) multiRefComposite.getLayoutData()).horizontalSpan = 2;
multiRefUI = newLabeledCCombo(multiRefComposite, "References:",
"Specify if this reference is the only reference to the collection object");
multiRefUI.add("Not Specified - defaults to multiple references not allowed");
multiRefUI.add("Multiple references not allowed");
multiRefUI.add("Multiple references allowed");
multiRefUI.select(0);
elementTypeComposite = new2ColumnComposite(twoCol);
((GridData) elementTypeComposite.getLayoutData()).horizontalSpan = 2;
typeFilter = ONLY_NON_PRIMITIVE_TYPES;
elementRangeNameUI = newLabeledTypeInput(section, elementTypeComposite, "Element Type:",
"The element type of each element in the Array or List object");
descriptionUI = newDescription(twoCol, S_);
newErrorMessage(twoCol, 2);
if (null != existingFd) {
descriptionUI.setText(convertNull(existingFd.getDescription()));
featureNameUI.setText(originalFeatureName = existingFd.getName());
featureRangeNameUI.setText(existingFd.getRangeTypeName());
Boolean mra = existingFd.getMultipleReferencesAllowed();
multiRefUI.select((null == mra) ? 0 : (mra.booleanValue()) ? 2 : 1);
String ert = existingFd.getElementType();
elementRangeNameUI.setText((null == ert) ? "" : ert);
}
manageVisibleFields();
return mainArea;
}
private void manageVisibleFields() {
String range = featureRangeNameUI.getText();
if (AbstractSection.isArrayOrListType(range)) {
multiRefComposite.setVisible(true);
if (AbstractSection.isFSArrayOrListType(range)) {
elementTypeComposite.setVisible(true);
} else {
elementTypeComposite.setVisible(false);
}
} else {
multiRefComposite.setVisible(false);
elementTypeComposite.setVisible(false);
}
}
public void handleEvent(Event event) {
super.handleEvent(event);
if (event.type == SWT.Modify && event.widget == featureRangeNameUI)
manageVisibleFields();
}
public TypesWithNameSpaces getTypeSystemInfoList() {
TypesWithNameSpaces result = super.getTypeSystemInfoList();
Type[] allTypes = (Type[]) editor.allTypes.get().values().toArray(new Type[0]);
/* Arrays.sort(allTypes, new Comparator() {
public int compare(Object o1, Object o2) {
Type t1 = (Type) o1;
Type t2 = (Type) o2;
return t1.getShortName().compareTo(t2.getShortName());
}
});
*/
for (int i = 0; i < allTypes.length; i++) {
Type type = allTypes[i];
if (typeFilter == ONLY_NON_PRIMITIVE_TYPES) {
if (!type.isPrimitive()) {
result.add(type.getName());
}
} else {
result.add(type.getName());
}
}
if (typeFilter == ALL_TYPES)
allTypesList = result;
return result;
}
public void copyValuesFromGUI() {
featureName = featureNameUI.getText();
description = nullIf0lengthString(descriptionUI.getText());
featureRangeName = featureRangeNameUI.getText();
multiRef = (1 == multiRefUI.getSelectionIndex()) ? Boolean.FALSE : (2 == multiRefUI
.getSelectionIndex()) ? Boolean.TRUE : null;
if (TypeSection.isFSArrayOrListType(featureRangeName)) {
elementRangeName = elementRangeNameUI.getText();
if ("".equals(elementRangeName)) {
elementRangeName = null;
}
} else {
elementRangeName = null;
}
}
public boolean verifyKeyChecks(VerifyEvent event) {
if (event.keyCode == SWT.CR || event.keyCode == SWT.TAB)
return true;
if (Character.isJavaIdentifierPart(event.character))
return true;
if (event.widget == featureRangeNameUI && event.character == '.')
return true;
return false;
}
public boolean isValid() {
if (featureName.length() == 0 || featureRangeName.length() == 0)
return false;
if (!featureName.equals(originalFeatureName)) {
String errMsg = typeSection.checkFeature(this, td, existingFd);
if (null != errMsg) {
setErrorMessage(errMsg);
return false;
}
}
if (!typeContainedInTypeSystemInfoList(featureRangeName, allTypesList)) {
setErrorMessage("RangeType '" + featureRangeName
+ "' is unknown. If this is intended, please define it first.");
return false;
}
return true;
}
public void textModifyCallback(Event e) {
manageVisibleFields();
}
public void enableOK() {
copyValuesFromGUI();
okButton.setEnabled(featureName.length() > 0 && featureRangeName.length() > 0);
}
}