blob: d1431317d0e90c192c8dd583754790e1f3d8b928 [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.pear.insd.edit;
import java.util.Hashtable;
import org.apache.uima.pear.PearException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ResourceSelectionDialog;
import org.apache.uima.pear.tools.InstallationDescriptor;
/**
*
* This is wizard page to edit UIMA component basic information
*
*/
public class INSDComponentPage extends WizardPage implements InsdConstants {
InstallationDescriptor insd;
private Group gr;
public String compID = "";
public String compDescriptorPath = "";
public String compType = COMP_TYPE_ANALYSIS_ENGINE;
private Text compIDText;
private Text compDescriptorPathText;
IContainer currentContainer;
Hashtable wizardData;
/**
* Constructor
*/
public INSDComponentPage(IContainer currentContainer, InstallationDescriptor insd,
Hashtable wizardData) {
super("wizardPage");
setTitle("UIMA - Installation Descriptor - Component Information");
setDescription("Enter information about your UIMA component. The required fields are indicated with a (*).\n"
+ "The descriptor must be specified using paths relative to the project's root (e.g. \"desc/MyTAE.xml\").\n");
this.wizardData = wizardData;
this.insd = insd;
this.currentContainer = currentContainer;
// initialize Page with insd content;
try {
initializePage();
validateCompInfo();
} catch (Throwable e) {
PearException subEx = new PearException(
"The operation failed because the wizard's pages could not be initialized properly.",
e);
subEx.openErrorDialog(getShell());
this.dispose();
}
}
/**
* Removes the $main_root macro from the given String.
*
* @param s
* A String instance
* @return The given String after removing the $main_root macro.
*/
public static String removeMacros(String s) {
s = s.replaceFirst("\\$main_root\\./", "");
s = s.replaceFirst("\\$main_root\\.\\\\", "");
s = s.replaceFirst("\\$main_root/", "");
s = s.replaceFirst("\\$main_root\\\\", "");
s = s.replaceFirst("\\$main_root", "");
return s;
}
void initializePage() {
String temp = "";
temp = insd.getMainComponentId();
if (temp == null || temp.trim().length() == 0)
compID = currentContainer.getName();
else
compID = temp;
temp = insd.getMainComponentDesc();
compDescriptorPath = temp == null ? "" : removeMacros(temp);
}
public Text addTextField(Composite parent, String strLabel, String strText, boolean editable) {
Label label = new Label(parent, SWT.NULL);
label.setText(strLabel);
Text text = new Text(parent, SWT.BORDER | SWT.SINGLE);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.setText(strText);
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
text.setEditable(editable);
return text;
}
/**
* See IDialogPage#createControl(Composite)
*/
public void createControl(Composite parent) {
try {
// Add fields with default values, and modifyListener that call dialogchange()
Composite container = new Composite(parent, SWT.NULL);
FormLayout formLayout = new FormLayout();
container.setLayout(formLayout);
gr = new Group(container, SWT.NONE);
gr.setText("Component Information");
FormData data = new FormData();
data.width = 450;
data.left = new FormAttachment(0, 10);
gr.setLayoutData(data);
GridLayout grLayout = new GridLayout();
grLayout.numColumns = 3;
grLayout.verticalSpacing = 4;
gr.setLayout(grLayout);
compIDText = addTextField(gr, "&Component ID*:", compID, true);
Label compIDLabel = new Label(gr, SWT.NULL);
compIDLabel.setText(" ");
compDescriptorPathText = addTextField(gr, "&Component Descriptor*: ",
compDescriptorPath, true);
addButton(gr, " &Browse... ", true, compDescriptorPathText);
String fileValidationMsg = validateFiles();
setErrorMessage(fileValidationMsg);
dialogChanged();
setControl(container);
} catch (Throwable e) {
PearException subEx = new PearException(
"The operation failed because the wizard's pages could not be initialized properly.",
e);
subEx.openErrorDialog(getShell());
this.dispose();
}
}
/**
* Ensures that all required field are set.
*/
private void dialogChanged() {
compID = compIDText.getText();
System.out.println("compID: " + compID);
compDescriptorPath = compDescriptorPathText.getText();
System.out.println("compDescriptorPath: " + compDescriptorPath);
insd.setMainComponentDesc(compDescriptorPath);
saveWizardData();
if (compID == null || compID.trim().length() == 0 || compDescriptorPath == null
|| compDescriptorPath.trim().length() == 0) {
setPageComplete(false);
setErrorMessage(null);
} else
updateStatus(null);
}
void validateCompInfo() {
if (compID == null || compID.trim().length() == 0 || compDescriptorPath == null
|| compDescriptorPath.trim().length() == 0) {
setPageComplete(false);
setErrorMessage(null);
} else
updateStatus(null);
}
void saveWizardData() {
wizardData.put(COMP_DESCRIPTOR_PATH, compDescriptorPath);
}
private void updateStatus(String message) {
if (message == null) {
String fileValidationMsg = validateFiles();
setErrorMessage(fileValidationMsg);
setPageComplete(fileValidationMsg == null);
} else {
setErrorMessage(message);
setPageComplete(false);
}
}
private String validateFiles() {
String message = null;
StringBuffer sb = new StringBuffer();
String[] files = { compDescriptorPath }; // ,collectionIteratorDescriptorPath,casInitializerDescriptorPath,casConsumerDescriptorPath};
for (int i = 0; i < files.length; i++) {
String filename = files[i];
if (filename != null && filename.trim().length() > 0) {
filename = filename.trim();
IFile iFile = currentContainer.getFile(new Path(filename));
if (!iFile.exists())
sb.append("\n \"" + filename + "\" was not found in the current project!");
else if (filename.trim().indexOf(".xml") == -1)
sb.append("\n \"" + filename + "\" is not an xml file!");
}
}
String s = sb.toString();
if (s.length() > 0)
message = s;
return message;
}
/**
* Creates a new button
* <p>
* The <code>Dialog</code> implementation of this framework method creates a standard push
* button, registers for selection events including button presses and registers default buttons
* with its shell. The button id is stored as the buttons client data. Note that the parent's
* layout is assumed to be a GridLayout and the number of columns in this layout is incremented.
* Subclasses may override.
* </p>
*
* @param parent
* the parent composite
* @param label
* the label from the button
* @param defaultButton
* <code>true</code> if the button is to be the default button, and <code>false</code>
* otherwise
*/
protected Button addButton(Composite parent, String label, boolean defaultButton, final Text text) {
Button button = new Button(parent, SWT.PUSH);
button.setText(label);
if (defaultButton) {
Shell shell = parent.getShell();
if (shell != null) {
shell.setDefaultButton(button);
}
button.setFocus();
}
button.setFont(parent.getFont());
SelectionListener listener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ResourceSelectionDialog dialog = new ResourceSelectionDialog(getShell(), currentContainer,
"Selection Dialog");
dialog.setTitle("Selection Dialog");
dialog.setMessage("Please select a file:");
dialog.open();
Object[] result = dialog.getResult();
if (result[0] != null) {
IResource res = (IResource) result[0];
text.setText(res.getProjectRelativePath().toOSString());
}
}
};
button.addSelectionListener(listener);
return button;
}
/**
* Creates a new Radio button
*
* @param parent
* the parent composite
* @param label
* the label from the button
* @param defaultButton
* <code>true</code> if the button is to be the default button, and <code>false</code>
* otherwise
*/
protected Button addRadioButton(Composite parent, String label, boolean initialSelection) {
Button button = new Button(parent, SWT.RADIO);
button.setText(label);
button.setFont(parent.getFont());
button.setSelection(initialSelection);
SelectionListener listener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
dialogChanged();
}
};
button.addSelectionListener(listener);
return button;
}
/*
* see @DialogPage.setVisible(boolean)
*/
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible)
compIDText.setFocus();
}
}