blob: 7501f3ed359cf7f28445f03574aace5ac2c718eb [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.ruta.utils.ui;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
public class SelectTypesDialog extends Dialog implements Listener {
private Shell shell;
private Text typeNameUI;
private Table list;
public String typeName = "error-TypeName-never-set";
private Button okButton;
private Button cancelButton;
private List<String> allTypes;
private List<String> selectedTypes;
private List<String> initialTypes;
public SelectTypesDialog(Shell shell, List<String> allTypes, List<String> selectedTypes) {
super(shell);
this.shell = shell;
this.allTypes = allTypes;
this.selectedTypes = selectedTypes;
this.initialTypes = new ArrayList<String>(selectedTypes);
createDialogArea();
init();
}
protected Control createDialogArea() {
Composite mainArea = (Composite) createDialogArea(shell);
createWideLabel(mainArea, " Type Name:");
typeNameUI = newText(mainArea, SWT.SINGLE, "Specify the type name");
typeNameUI.addListener(SWT.Modify, this);
createWideLabel(mainArea, " Matching Types:");
list = newTable(mainArea, SWT.CHECK);
((GridData) list.getLayoutData()).heightHint = 250;
((GridData) list.getLayoutData()).minimumHeight = 100;
typeNameUI.addListener(SWT.CHECK, this);
displayFilteredTypes("");
createButtonBar(mainArea);
return mainArea;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing = 3;
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
applyDialogFont(composite);
return composite;
}
@Override
protected Control createButtonBar(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 0;
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(SWT.CENTER, SWT.CENTER, false, false);
composite.setLayoutData(data);
createButtonsForButtonBar(composite);
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, IDialogConstants.OK_ID, "OK", true);
cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, " Cancel ", false);
}
private void init() {
TableItem[] items = list.getItems();
for (TableItem tableItem : items) {
if (selectedTypes.contains(tableItem.getText())) {
tableItem.setChecked(true);
}
}
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
TableItem[] items = list.getItems();
List<String> selection = new ArrayList<String>();
for (TableItem tableItem : items) {
if (tableItem.getChecked()) {
selection.add(tableItem.getText());
}
}
selectedTypes = selection;
shell.dispose();
}
});
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
selectedTypes = initialTypes;
shell.dispose();
}
});
int width = 300;
int height = 400;
shell.setSize(width, height);
shell.setMinimumSize(300, 300);
shell.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - width) / 2, (Toolkit
.getDefaultToolkit().getScreenSize().height - height) / 2);
shell.setLayout(new FillLayout());
shell.layout();
}
protected Label createWideLabel(Composite parent, String message) {
Label label = null;
label = new Label(parent, SWT.WRAP);
label.setText(null != message ? message : "");
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
data.verticalAlignment = SWT.CENTER;
label.setLayoutData(data);
return label;
}
protected Text newText(Composite parent, int style, String tip) {
Text t = new Text(parent, style | SWT.BORDER);
t.setToolTipText(tip);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
t.addListener(SWT.KeyUp, this);
t.addListener(SWT.MouseUp, this);
return t;
}
protected Table newTable(Composite parent, int style) {
Table table = new Table(parent, style | SWT.BORDER | SWT.MULTI);
GridData gd = new GridData(GridData.FILL_BOTH);
table.setLayoutData(gd);
table.addListener(SWT.Selection, this);
table.addListener(SWT.KeyUp, this);
return table;
}
private void displayFilteredTypes(String aTypeName) {
list.setRedraw(false);
list.removeAll();
String topEntry = "";
aTypeName = aTypeName.toLowerCase();
for (String type : allTypes) {
String candidateTypeName = type.toLowerCase();
if (StringUtils.isBlank(aTypeName)
|| candidateTypeName.toLowerCase().indexOf(aTypeName.toLowerCase()) != -1) {
if (StringUtils.isEmpty(topEntry)) {
topEntry = type;
}
TableItem item = new TableItem(list, SWT.NULL);
item.setText(type);
if (selectedTypes.contains(item.getText())) {
item.setChecked(true);
}
}
}
list.setRedraw(true);
}
public void handleEvent(Event event) {
if (event.widget == typeNameUI && event.type == SWT.Modify) {
displayFilteredTypes(typeNameUI.getText());
} else if (event.widget == list) {
Widget item = event.item;
if (item instanceof TableItem) {
TableItem ti = (TableItem) item;
TableItem[] selection = list.getSelection();
for (TableItem tableItem : selection) {
if (tableItem != ti) {
if (ti.getChecked()) {
tableItem.setChecked(true);
selectedTypes.add(tableItem.getText());
} else {
selectedTypes.remove(tableItem.getText());
tableItem.setChecked(false);
}
}
}
if (ti.getChecked()) {
selectedTypes.add(ti.getText());
} else {
selectedTypes.remove(ti.getText());
}
}
}
}
public boolean isValid() {
return true;
}
public List<String> getSelectedTypes() {
return selectedTypes;
}
public void setSelectedTypes(List<String> selectedTypes) {
this.selectedTypes = selectedTypes;
}
}