package rtt.ui.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
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.graphics.Color;
import org.eclipse.swt.graphics.Point;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import rtt.core.archive.configuration.Configuration;
import rtt.ui.dialogs.utils.ClassSelectionAdapter;
import rtt.ui.dialogs.utils.ResourceSelectionAdapter;
import rtt.ui.dialogs.utils.ResourceSelectionAdapter.DialogType;
import rtt.ui.model.RttProject;
import rtt.ui.viewer.ViewerUtils;
public class ConfigurationDialog extends TitleAreaDialog {
private String title;
private String message;
private Text nameText;
private Text initNodeText;
private Button defaultButton;
private ListViewer listViewer;
private boolean nameEditable = true;
private String configName = "";
private String initNodeName = "";
private List<String> cpEntries;
private boolean isDefault = false;
private RttProject project;
private Color red;
/**
* Create the dialog.
* @param parentShell
*/
public ConfigurationDialog(Shell parentShell, RttProject project, Configuration config) {
super(parentShell);
setHelpAvailable(false);
setShellStyle(SWT.DIALOG_TRIM | SWT.MAX | SWT.RESIZE);
red = new Color(getParentShell().getDisplay(), 255, 150, 150);
this.project = project;
configName = config.getName();
initNodeName = config.getInitialNode();
cpEntries = new ArrayList<String>();
if (config.getClasspath() != null && config.getClasspath().getPath() != null) {
cpEntries.addAll(config.getClasspath().getPath());
}
}
@Override
public void setTitle(String newTitle) {
this.title = newTitle;
}
@Override
public void setMessage(String newMessage) {
this.message = newMessage;
}
/**
* Create contents of the dialog.
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
super.setMessage(message, IMessageProvider.INFORMATION);
super.setTitle(title);
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new GridLayout(3, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
Label nameLabel = new Label(container, SWT.NONE);
nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
nameLabel.setText("Name:");
nameText = new Text(container, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
nameText.setText(configName);
nameText.addModifyListener(getModifyListener());
nameText.setEnabled(nameEditable);
defaultButton = new Button(container, SWT.CHECK);
defaultButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
defaultButton.setAlignment(SWT.CENTER);
defaultButton.setText("Default");
defaultButton.setSelection(isDefault);
defaultButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setOkButtonEnabled(true);
}
});
Label initNodeLabel = new Label(container, SWT.NONE);
initNodeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
initNodeLabel.setText("Initial Node:");
initNodeText = new Text(container, SWT.BORDER);
initNodeText.setText(initNodeName);
initNodeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
initNodeText.addModifyListener(getModifyListener());
Button initNodeButton = new Button(container, SWT.NONE);
initNodeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 0, 1));
initNodeButton.setText("Find ...");
initNodeButton.addSelectionListener(new ClassSelectionAdapter(getParentShell(),
initNodeText, project.getSearchScope()));
Label classpathLabel = new Label(container, SWT.NONE);
classpathLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
classpathLabel.setText("Classpath:");
listViewer = new ListViewer(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
listViewer.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
listViewer.setContentProvider(new ArrayContentProvider());
listViewer.setLabelProvider(new LabelProvider());
listViewer.setInput(cpEntries);
Composite classpathComposite = new Composite(container, SWT.NONE);
classpathComposite.setLayout(new GridLayout(1, true));
Button btnAddFile = new Button(classpathComposite, SWT.NONE);
btnAddFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnAddFile.setText("Add Files ...");
btnAddFile.addSelectionListener(new ResourceSelectionAdapter(DialogType.RESOURCE, this));
Button btnAddFolder = new Button(classpathComposite, SWT.NONE);
btnAddFolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnAddFolder.setText("Add Binary Folder ...");
btnAddFolder.addSelectionListener(new ResourceSelectionAdapter(DialogType.CONTAINER, this));
Button btnAddAbsolute = new Button(classpathComposite, SWT.NONE);
btnAddAbsolute.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnAddAbsolute.setText("Add Entry ...");
btnAddAbsolute.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
InputDialog dialog = new InputDialog(getParentShell(), "Add Entry...", "", "", null);
dialog.setBlockOnOpen(true);
if (dialog.open() == Dialog.OK) {
cpEntries.add(dialog.getValue());
setOkButtonEnabled(true);
listViewer.refresh();
}
}
});
Composite composite = new Composite(classpathComposite, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
final Button btnRemove = new Button(classpathComposite, SWT.NONE);
btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnRemove.setText("Remove");
btnRemove.setEnabled(false);
btnRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String selectedString = ViewerUtils.getSelection(listViewer.getSelection(), String.class);
if (selectedString != null && !selectedString.equals("")) {
int oldIndex = cpEntries.indexOf(selectedString);
cpEntries.remove(selectedString);
listViewer.refresh();
int size = cpEntries.size();
if (size == 0) {
btnRemove.setEnabled(false);
} else{
int select = Math.min(oldIndex, size - 1);
listViewer.setSelection(new StructuredSelection(cpEntries.get(select)));
}
setOkButtonEnabled(true);
}
}
});
new Label(container, SWT.NONE);
Label lblNoteToAdd = new Label(container, SWT.NONE);
lblNoteToAdd.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
lblNoteToAdd.setText("Note: To add Java archives (*.jar) use 'Add Files ...' ");
new Label(container, SWT.NONE);
Composite spacer = new Composite(container, SWT.NONE);
GridData gd_spacer = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
gd_spacer.heightHint = 30;
spacer.setLayoutData(gd_spacer);
listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
boolean enable = false;
String selectedString = ViewerUtils.getSelection(event.getSelection(), String.class);
if (selectedString != null && !selectedString.equals("")) {
enable = true;
}
btnRemove.setEnabled(enable);
}
});
return area;
}
private ModifyListener getModifyListener() {
return new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
setOkButtonEnabled(true);
}
};
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
Button okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true);
okButton.setEnabled(false);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
}
public void setOkButtonEnabled(boolean enable) {
Button okButton = this.getButton(OK);
if (okButton != null) {
// if name or init node text is empty, disable
getButton(OK).setEnabled(enable && hasContent());
}
}
private boolean hasContent() {
boolean nameHasContent = hasContent(nameText);
boolean initNodeHasContent = hasContent(initNodeText);
if (nameHasContent && initNodeHasContent) {
setErrorMessage(null);
} else {
setErrorMessage("Please check marked text box(es)");
}
return nameHasContent && initNodeHasContent;
}
private boolean hasContent(Text text) {
String content = text.getText().trim();
boolean hasContent = !content.equals("");
if (hasContent) {
text.setBackground(null);
} else {
text.setBackground(red);
}
return hasContent;
}
@Override
protected void okPressed() {
configName = nameText.getText().trim();
initNodeName = initNodeText.getText().trim();
isDefault = defaultButton.getSelection();
super.okPressed();
}
@Override
protected void finalize() throws Throwable {
red.dispose();
super.finalize();
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(500, 450);
}
public String getConfigName() {
return configName;
}
public String getInitNodeName() {
return initNodeName;
}
public List<String> getClasspathEntries() {
return cpEntries;
}
public void setDefault(boolean isDefault) {
this.isDefault = isDefault;
}
public boolean isDefault() {
return isDefault;
}
public RttProject getProject() {
return project;
}
public ListViewer getViewer() {
return listViewer;
}
public void setNameEditable(boolean nameEditable) {
this.nameEditable = nameEditable;
}
}