blob: 1b0f65f841239e535f5e8fc435e0b5b2dd6cda64 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.ui.dialogs;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.epf.library.edit.command.UserInput;
import org.eclipse.epf.library.edit.validation.IValidator;
import org.eclipse.epf.library.ui.providers.DelegateLabelProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
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.Shell;
import org.eclipse.swt.widgets.Text;
/**
* This dialog acts as a input dialog during command execution based on user
* input and inputType dialog behaviour changes.
*
* @author Shashidhar Kannoori
* @author Shilpa Toraskar
* @since 1.2
*
*/
public class UserInputsDialog extends Dialog {
IStructuredContentProvider contentProvider;
ILabelProvider labelProvider;
private String title;
private String globalErrorTxt = ""; //$NON-NLS-1$
private String message;
private List userInputs;
private boolean result = false;
Label messageArea;
Label errorArea;
HashMap<Object,Object> oldInfoForCancel;
private Color redColor;
public UserInputsDialog(Shell parentShell, List userInputs, String title,
String message) {
super(parentShell);
this.title = title;
this.message = message;
this.userInputs = userInputs;
oldInfoForCancel = new HashMap<Object,Object>();
}
/**
*
* @param title
*/
public void setTitle(String title) {
this.title = title;
}
/**
*
* @param msg
*/
public void setMessage(String message) {
this.message = message;
}
/**
* Create a Tree Viewer.
*
*/
protected void createTreeViewer(Composite parent, UserInput userInput) {
TreeViewer viewer;
if (!userInput.isMultiple()) {
viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
} else {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
}
GridData spec = new GridData(GridData.FILL_BOTH);
{
spec.widthHint = 200;
spec.heightHint = 200;
spec.horizontalSpan = 3;
viewer.getControl().setLayoutData(spec);
}
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
}
});
if (viewer != null) {
viewer.setLabelProvider(labelProvider);
if (contentProvider != null) {
viewer.setContentProvider(contentProvider);
} else {
viewer.setContentProvider(new ArrayContentProvider());
}
viewer.setUseHashlookup(true);
viewer.setInput(userInput.getChoices());
viewer.getControl().setFont(parent.getFont());
// TODO: treeViewer Sorter and Expand/Collapse
}
}
/**
* Creates a TableViewer
*
*/
protected void createTableViewer(Composite parent, UserInput userInput) {
TableViewer viewer = new TableViewer(parent);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
}
});
}
/**
* Creates a Text control
*
* @param parent
* @param userInput
*/
protected void createText(Composite parent, UserInput userInput) {
final UserInput localinput = userInput;
final IValidator validator = userInput.getValidator();
final Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
if (userInput.getInput() != null) {
text.setText((String) userInput.getInput());
}
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
getButton(OK).setEnabled(true);
errorArea.setText(""); //$NON-NLS-1$
String errorTxt = ""; //$NON-NLS-1$
if (validator != null) {
errorTxt = validator.isValid(text.getText());
if (errorTxt != null && errorTxt.length() > 0) {
errorArea.setText(errorTxt);
getButton(OK).setEnabled(false);
} else {
errorArea.setText(""); //$NON-NLS-1$
}
globalErrorTxt = errorTxt;
}
if (errorTxt == null || errorTxt.length() <= 0) {
localinput.setInput(text.getText());
}
}
});
text.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
String errorTxt = ""; //$NON-NLS-1$
if (validator != null) {
errorTxt = validator.isValid(text.getText());
if (errorTxt != null && errorTxt.length() > 0) {
errorArea.setText(errorTxt);
getButton(OK).setEnabled(false);
} else {
errorArea.setText(""); //$NON-NLS-1$
}
globalErrorTxt = errorTxt;
}
if (errorTxt == null || errorTxt.length() <= 0) {
localinput.setInput(text.getText());
}
}
});
}
/**
* Method to setInput, subclass can override it.
*
*/
protected void setInput(UserInput input, Object obj) {
input.setInput(obj);
}
/**
* Creates a Comboviewer.
*
* @param composite
* @param userInput
*/
protected void createComboViewer(Composite composite, UserInput userInput) {
final UserInput localInput = userInput;
final IValidator validator = userInput.getValidator();
final ComboViewer viewer = new ComboViewer(composite);
viewer.getCombo().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
viewer.setContentProvider(new ArrayContentProvider());
if (userInput.getLabelProvider() != null) {
viewer.setLabelProvider(new DelegateLabelProvider(userInput.getLabelProvider()));
}
List choices = userInput.getChoices();
viewer.setInput(choices);
if (choices != null && choices.size() > 0) {
viewer.setSelection(new StructuredSelection(choices.get(0)));
localInput.setInput(choices.get(0));
}
viewer.getCombo().addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
String errorTxt = ""; //$NON-NLS-1$
IStructuredSelection selected = (IStructuredSelection) viewer
.getSelection();
if (validator == null || selected == null) {
return;
}
IStatus status = validator.isValid(selected.getFirstElement());
if (status.getSeverity() == IStatus.ERROR) {
errorTxt = status.getMessage();
}
if (errorTxt != null && errorTxt.length() > 0) {
errorArea.setText(errorTxt);
getButton(OK).setEnabled(false);
} if (globalErrorTxt != null && globalErrorTxt.length() > 0) {
errorArea.setText(globalErrorTxt);
getButton(OK).setEnabled(false);
}
else
errorArea.setText(""); //$NON-NLS-1$
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
getButton(OK).setEnabled(true);
errorArea.setText(""); //$NON-NLS-1$
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
Object obj = selection.getFirstElement();
String errorTxt = ""; //$NON-NLS-1$
if (validator != null) {
IStatus status = validator.isValid(obj);
if (status.getCode() == IStatus.ERROR) {
errorTxt = status.getMessage();
}
if (errorTxt != null && errorTxt.length() > 0) {
errorArea.setText(errorTxt);
}
else if (globalErrorTxt != null && globalErrorTxt.length() > 0) {
errorArea.setText(globalErrorTxt);
getButton(OK).setEnabled(false);
}
else
errorArea.setText(""); //$NON-NLS-1$
}
if (errorTxt == null || errorTxt.length() <= 0) {
localInput.setInput(obj);
}
}
});
}
/**
* Create a Label and Text for message area.
*
* @param composite
* @return
*/
protected Label createMessageArea(Composite composite) {
Composite messageAreaComp = new Composite(composite, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.marginLeft = 0;
messageAreaComp.setLayout(gridLayout);
GridData gd = new GridData(GridData.FILL_BOTH);
messageAreaComp.setLayoutData(gd);
messageArea = new Label(messageAreaComp, SWT.WRAP);
if (message != null) {
messageArea.setText(message);
}
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.minimumWidth = 400;
messageArea.setLayoutData(gd);
applyDialogFont(messageArea);
Label separator = new Label(messageAreaComp, SWT.HORIZONTAL | SWT.SEPARATOR);
GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
gd1.horizontalSpan = 2;
separator.setLayoutData(gd1);
return messageArea;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
composite.setFont(parent.getFont());
GridLayout layout = (GridLayout) composite.getLayout();
layout.marginWidth = 10;
layout.marginHeight = 10;
// create message area
createMessageArea(composite);
// create dialog area
Composite dialogArea = new Composite(composite, SWT.NONE);
GridLayout dialogLayout = new GridLayout(2, false);
dialogLayout.marginLeft = 0;
dialogArea.setLayout(new GridLayout(2, false));
GridData gd = new GridData(GridData.FILL_BOTH);
dialogArea.setLayoutData(gd);
// Create controls based on UserInputs
if (userInputs != null && userInputs.size() > 0) {
for (Iterator iterator = userInputs.iterator(); iterator.hasNext();) {
Object object = iterator.next();
if (object instanceof UserInput) {
UserInput userInput = (UserInput) object;
// Store the userInput in the hashmap for cancel action.
oldInfoForCancel.put(userInput, userInput.getInput());
Label label = new Label(dialogArea, SWT.NONE);
label.setText(userInput.getLabel());
GridData gridData = new GridData(GridData.BEGINNING);
label.setLayoutData(gridData);
if (userInput.getType() == UserInput.TEXT) {
createText(dialogArea, userInput);
} else if (userInput.getType() == UserInput.SELECTION) {
createComboViewer(dialogArea, userInput);
}
// createEmptyLabel(dialogArea, 2);
}
}
}
createErrorArea(composite);
return composite;
}
/**
* Creates a Error Area.
*
* @param composite
*/
private void createErrorArea(Composite composite) {
Composite errorAreaComp = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginLeft = 0;
errorAreaComp.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
errorAreaComp.setLayoutData(gd);
// create blank label
// new Label(composite, SWT.WRAP);
errorArea = new Label(errorAreaComp, SWT.WRAP);
redColor = new Color(null, new RGB(255, 0, 0));
if(redColor != null){
errorArea.setForeground(redColor);
}
gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL);
gd.heightHint = 80;
errorArea.setLayoutData(gd);
applyDialogFont(errorArea);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (this.title != null) {
newShell.setText(this.title);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
result = true;
super.okPressed();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
*/
protected void cancelPressed() {
if (userInputs != null && userInputs.size() > 0) {
for (Iterator iterator = userInputs.iterator(); iterator.hasNext();) {
Object object = iterator.next();
if (object instanceof UserInput) {
UserInput userInput = (UserInput) object;
userInput.setInput(oldInfoForCancel.get(userInput));
}
}
}
super.cancelPressed();
}
/**
* Returns the results.
*
* @return
*/
public boolean getResult() {
return result;
}
@Override
public boolean close() {
if(redColor != null){
redColor.dispose();
}
return super.close();
}
/**
* Create a empty label.
*
* @param composite
* @param span
*/
// private void createEmptyLabel(Composite composite, int span){
// Label emptyLabel = new Label(composite, SWT.NONE);
// emptyLabel.setBackground(Colors.INHERITED_ELEMENT_LABEL);
// GridData emptyData = new GridData(GridData.FILL_HORIZONTAL);
// emptyLabel.setText("");
// emptyData = new GridData(GridData.FILL_HORIZONTAL);
// emptyData.horizontalSpan =span;
// emptyData.heightHint = 3;
// emptyLabel.setLayoutData(emptyData);
// }
/**
* validates the input with given Validator in UserInput.
*/
// private boolean validate() {
// for (Iterator iter = userInputs.iterator(); iter.hasNext();) {
// UserInput element = (UserInput) iter.next();
// IValidator validator = element.getValidator();
// if (validator != null) {
// if (element.getType() == UserInput.TEXT) {
// errorTxt += validator
// .isValid(element.getInput().toString());
// } else {
// errorTxt += validator.isValid(element.getInput());
// }
// }
// }
// errorTxt = "System out testing";
// if (errorTxt != null && errorTxt.length() > 0) {
// errorArea.setText(errorTxt);
// errorArea.setForeground(ColorConstants.red);
// return false;
// }
// return true;
// }
}