/*******************************************************************************
* Copyright (c) 2010 Philipp Kursawe.
* 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:
* Philipp Kursawe (phil.kursawe@gmail.com) - initial API and implementation
******************************************************************************/
package copyto.target.http.ui.internal;
import java.net.URL;
import java.util.Collection;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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 copyto.target.http.core.internal.html.form.Form;
import copyto.target.http.core.internal.html.form.TextAreaElement;
/**
* Displays the results of an form auto-detect operation.
*
* @author <a href="mailto:phil.kursawe@gmail.com">Philipp Kursawe</a>
*
*/
public class AutoDetectResultDialog extends TitleAreaDialog {
private final Collection<Form> forms;
private Form selectedForm;
private IViewerObservableValue selection;
private URL url;
public AutoDetectResultDialog(Shell shell, URL url, Collection<Form> forms) {
super(shell);
setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER
| SWT.APPLICATION_MODAL | SWT.RESIZE | getDefaultOrientation());
setHelpAvailable(false);
this.url = url;
this.forms = forms;
}
@Override
protected void okPressed() {
selectedForm = (Form) selection.getValue();
super.okPressed();
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle("Multiple forms detected");
setMessage(String.format("At %s where multiple forms found.", url));
Composite client = (Composite) super.createDialogArea(parent);
GridLayoutFactory.swtDefaults().applyTo(client);
Label label = new Label(client, SWT.LEFT);
label.setText("Please select the form you want to use" + ":");
TableViewer viewer = new TableViewer(client);
GridDataFactory.fillDefaults().grab(true, false).applyTo(
viewer.getControl());
viewer.setContentProvider(ArrayContentProvider.getInstance());
viewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
Form form = (Form) element;
TextAreaElement textArea = form.findTextArea();
return String.format("Form: %s %s", form.getName(),
textArea != null ? "(suggestion)" : "");
}
});
viewer.setInput(forms);
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
okPressed();
}
});
selection = ViewersObservables.observeSingleSelection(viewer);
Text text = new Text(client, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY
| SWT.V_SCROLL);
text.setFont(JFaceResources.getTextFont());
GridDataFactory.fillDefaults().hint(SWT.DEFAULT, 200).grab(true, true)
.applyTo(text);
IObservableValue detail = MasterDetailObservables.detailValue(
selection, new IObservableFactory() {
public IObservable createObservable(final Object target) {
return new AbstractObservableValue() {
public Object getValueType() {
return String.class;
}
@Override
protected Object doGetValue() {
return target.toString();
}
};
}
}, String.class);
final DataBindingContext dbx = new DataBindingContext();
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dbx.dispose();
}
});
dbx.bindValue(
SWTObservables.observeText(text, SWT.None),
detail,
new UpdateValueStrategy(false, UpdateValueStrategy.POLICY_NEVER),
null);
for (Form form : forms) {
TextAreaElement textArea = form.findTextArea();
if (textArea != null) {
selection.setValue(form);
break;
}
}
viewer.getControl().setFocus();
return client;
}
public static Form select(Shell shell, URL url, Collection<Form> forms) {
AutoDetectResultDialog dialog = new AutoDetectResultDialog(shell, url,
forms);
if (dialog.open() == Window.OK) {
return (Form) dialog.selectedForm;
}
return null;
}
}