blob: 495950b18d15bfaa7e403bddc731e00f65309b76 [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 java.util.Arrays;
import java.util.Comparator;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.Type;
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.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class AddTypeDialog extends AbstractDialogKeyVerifyJavaNames {
private StyledText typeNameUI;
private Text supertypeNameUI;
private Text descriptionUI;
public String typeName;
private String originalTypeName;
public String supertypeName;
public String description;
private TypeSection typeSection;
private TypeDescription existingTd = null;
private TypesWithNameSpaces allTypesList;
// private boolean seenThisAlready = false;
public AddTypeDialog(AbstractSection aSection) {
super(aSection, "Add a Type", "Use this panel to specify a type.");
typeSection = (TypeSection) aSection;
}
/**
* Constructor for Editing an existing Type DescriptionD
*
* @param aSection
* @param aExistingTd
*/
public AddTypeDialog(AbstractSection aSection, TypeDescription aExistingTd) {
this(aSection);
existingTd = aExistingTd;
}
protected Control createDialogArea(Composite parent) {
Composite mainArea = (Composite) super.createDialogArea(parent, existingTd);
createWideLabel(mainArea,
"Type names must be globally unique, unless you are intentionally redefining another type.");
// This part of the form looks like this sketch
//
// typeName: Text field << in 2 grid composite
// supertypeName: Text field << in 2 grid composite
// description: Text field << in 2 grid composite
Composite twoCol = new Composite(mainArea, SWT.NONE);
twoCol.setLayout(new GridLayout(2, false)); // false = not equal width
twoCol.setLayoutData(new GridData(GridData.FILL_BOTH));
typeNameUI = newLabeledSingleLineStyledText(twoCol, "Type Name", S_);
typeNameUI.setText("some.typename.you.Choose");
new Label(twoCol, SWT.NONE).setText("Supertype:");
supertypeNameUI = newTypeInput(section, twoCol);
descriptionUI = newDescription(twoCol, S_);
newErrorMessage(twoCol, 2);
if (null != existingTd) {
descriptionUI.setText(convertNull(existingTd.getDescription()));
typeNameUI.setText(originalTypeName = existingTd.getName());
supertypeNameUI.setText(convertNull(existingTd.getSupertypeName()));
}
// setting this triggers the handle event for modify
// so this has to follow setting up the other widgets
// because handle event reads them
else
supertypeNameUI.setText(CAS.TYPE_NAME_ANNOTATION);
return mainArea;
}
/*
* Supplies the list of valid types
*
* @see org.apache.uima.taeconfigurator.editors.ui.dialogs.AbstractDialog#getTypeSystemInfoList()
*/
public TypesWithNameSpaces getTypeSystemInfoList() {
TypesWithNameSpaces result = super.getTypeSystemInfoList();
boolean hasFeatures = false;
boolean hasAllowedValues = false;
if (null != existingTd) {
hasFeatures = ((null != existingTd.getFeatures()) && (existingTd.getFeatures().length > 0));
hasAllowedValues = ((null != existingTd.getAllowedValues()) && (existingTd.getAllowedValues().length > 0));
if (hasAllowedValues) {
result.add(CAS.TYPE_NAME_STRING);
allTypesList = result;
return result;
}
}
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 (type.isInheritanceFinal() && !CAS.TYPE_NAME_STRING.equals(type.getName()))
continue;
if (hasFeatures && CAS.TYPE_NAME_STRING.equals(type.getName()))
continue;
result.add(type.getName());
}
allTypesList = result;
return result;
}
public void copyValuesFromGUI() {
typeName = typeNameUI.getText();
description = nullIf0lengthString(descriptionUI.getText());
supertypeName = supertypeNameUI.getText();
}
public boolean isValid() {
if (typeName.length() == 0)
return false;
if (typeName.charAt(typeName.length() - 1) == '.') {
setErrorMessage("Name cannot end with a period (.)");
return false;
}
if (!typeName.equals(originalTypeName)) {
String errMsg = typeSection.checkDuplTypeName(typeName);
if (null != errMsg) {
setErrorMessage(errMsg);
return false;
}
}
if (!typeContainedInTypeSystemInfoList(supertypeName, allTypesList)) {
setErrorMessage("SuperType '" + supertypeName
+ "' is unknown. If this is intended, please define it first.");
return false;
}
TypeDescription importedType = editor.getImportedTypeSystemDesription().getType(typeName);
if (null != importedType) {
if (!supertypeName.equals(importedType.getSupertypeName())) {
setErrorMessage("The supertype specified must be '" + importedType.getSupertypeName()
+ "' due to merging with imported types. Please change it to this type.");
return false;
}
}
return true;
}
public void enableOK() {
copyValuesFromGUI();
okButton.setEnabled(typeName.length() > 0);
}
}