/*******************************************************************************
* 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.ui.internal.preferences;
import java.net.URL;
import java.util.Collection;
import java.util.HashSet;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.osgi.framework.FrameworkUtil;
import copyto.core.Target;
import copyto.ui.internal.Messages;
import eclipseutils.jface.databinding.Builder;
import eclipseutils.jface.databinding.BuilderAdapter;
import eclipseutils.jface.databinding.BuiltTitleAreaDialog;
import eclipseutils.jface.databinding.FieldOptions;
import eclipseutils.jface.databinding.GridLayoutBuilder;
import eclipseutils.jface.databinding.customizers.SelectAllOnFocus;
import eclipseutils.jface.databinding.validators.CompoundValidator;
import eclipseutils.jface.databinding.validators.ListValidator;
import eclipseutils.jface.databinding.validators.NotEmptyValidator;
import eclipseutils.jface.databinding.validators.NotValidator;
/**
* TODO: Add validation of URL that it contains at least ${copyto.text} Make
* sure the preferences are initialized.
*
* @author <a href="mailto:phil.kursawe@gmail.com">Philipp Kursawe</a>
*
*/
class EditDialog extends BuiltTitleAreaDialog {
private static final String COPYTO_TEXT_VAR = "${copyto.text}"; //$NON-NLS-1$
private static final String[] PROPOSALS = new String[] { COPYTO_TEXT_VAR,
"${copyto.mime-type}", "${copyto.source}" }; //$NON-NLS-1$//$NON-NLS-2$
private final Target target;
private final HashSet<String> existingItems;
public EditDialog(final Shell parentShell, final Target target,
final Collection<Target> existingItems) {
super(parentShell);
setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER
| SWT.APPLICATION_MODAL | SWT.RESIZE | getDefaultOrientation());
this.target = target;
this.existingItems = new HashSet<String>();
for (final Target t : existingItems) {
if (!t.getName().equals(target.getName())) {
this.existingItems.add(t.getName());
}
}
setHelpAvailable(false);
}
@Override
protected void configureShell(final Shell newShell) {
super.configureShell(newShell);
String name = target.getFactory().getName();
newShell.setText(NLS.bind(Messages.EditDialog_ShellText, name));
setTitle(NLS.bind(Messages.EditDialog_Title, name));
//setMessage(NLS.bind(Messages.EditDialog_Desc, name));
ImageDescriptor desc = (ImageDescriptor) Platform.getAdapterManager()
.loadAdapter(target, ImageDescriptor.class.getName());
if (desc == null) {
final URL iconEntry = FileLocator.find(FrameworkUtil
.getBundle(getClass()), new Path(
"$nl$/icons/e32/copyto.png"), null); //$NON-NLS-1$
desc = (iconEntry != null) ? ImageDescriptor
.createFromURL(iconEntry) : null;
}
if (desc != null) {
final Image image = desc.createImage();
setTitleImage(image);
newShell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(final DisposeEvent e) {
image.dispose();
}
});
}
}
final static SimpleContentProposalProvider proposalProvider = new SimpleContentProposalProvider(
PROPOSALS);
public Builder createBuilder(final Composite parent) {
final IValidator labelValidator = new CompoundValidator(
NotEmptyValidator.getInstance(true), new NotValidator(
IStatus.WARNING, new ListValidator(existingItems),
Messages.EditDialog_DuplicateTarget));
BuilderAdapter adapter = (BuilderAdapter) Platform.getAdapterManager()
.loadAdapter(target, BuilderAdapter.class.getName());
return adapter.create(target, new GridLayoutBuilder(parent, target,
UpdateValueStrategy.POLICY_CONVERT).field("name", //$NON-NLS-1$
new FieldOptions(labelValidator)
.setControlCustomizer(new SelectAllOnFocus())));
}
}