blob: e886b5ee7760ae4ac18a766beba3128e75fff490 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 Torkild U. Resheim.
*
* 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:
* Torkild U. Resheim - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.docs.epub.ui;
import java.io.File;
import java.util.Set;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.mylyn.docs.epub.core.PublicationProxy;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.plugin.AbstractUIPlugin;
public class MainPage extends WizardPage {
private DataBindingContext m_bindingContext;
private Text titleText;
private Text copyrightText;
private Text coverText;
private Text styleSheetText;
private Text identifierText;
private Text subjectText;
/**
* @wbp.nonvisual location=681,21
*/
private PublicationProxy bean = new PublicationProxy();
private Combo schemeText;
private Text authorText;
private Combo combo;
private DateTime dateTime;
/**
* Create the wizard.
*
* @wbp.parser.constructor
*/
public MainPage() {
super("wizardPage"); //$NON-NLS-1$
setMessage(Messages.MainPage_0);
setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EPUBUIPlugin.PLUGIN_ID, "icons/wizard-banner.png")); //$NON-NLS-1$
setTitle(Messages.MainPage_1);
}
public MainPage(PublicationProxy bean) {
this();
this.bean = bean;
}
/**
* Create contents of the wizard.
*
* @param parent
*/
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
setControl(container);
container.setLayout(new GridLayout(1, true));
Group grpRequiredDetails = new Group(container, SWT.NONE);
grpRequiredDetails.setLayout(new GridLayout(4, false));
GridData gd_grpRequiredDetails = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
gd_grpRequiredDetails.heightHint = 187;
grpRequiredDetails.setLayoutData(gd_grpRequiredDetails);
grpRequiredDetails.setText(Messages.MainPage_2);
Label lblTitle = new Label(grpRequiredDetails, SWT.NONE);
lblTitle.setText(Messages.MainPage_3);
titleText = new Text(grpRequiredDetails, SWT.BORDER);
titleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
Label lblAuthor = new Label(grpRequiredDetails, SWT.NONE);
lblAuthor.setText(Messages.MainPage_4);
authorText = new Text(grpRequiredDetails, SWT.BORDER);
authorText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblNewLabel_1 = new Label(grpRequiredDetails, SWT.NONE);
lblNewLabel_1.setText(Messages.MainPage_5);
dateTime = new DateTime(grpRequiredDetails, SWT.BORDER | SWT.LONG);
Label lblIdentifier = new Label(grpRequiredDetails, SWT.NONE);
lblIdentifier.setText(Messages.MainPage_6);
identifierText = new Text(grpRequiredDetails, SWT.BORDER);
identifierText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblScheme = new Label(grpRequiredDetails, SWT.NONE);
lblScheme.setText(Messages.MainPage_7);
schemeText = new Combo(grpRequiredDetails, SWT.BORDER);
schemeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
schemeText.add(Messages.MainPage_8);
Label lblCopyright = new Label(grpRequiredDetails, SWT.NONE);
lblCopyright.setText(Messages.MainPage_9);
copyrightText = new Text(grpRequiredDetails, SWT.BORDER);
copyrightText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblLanguage = new Label(grpRequiredDetails, SWT.NONE);
lblLanguage.setText(Messages.MainPage_10);
combo = new Combo(grpRequiredDetails, SWT.READ_ONLY);
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Set<String> locales = bean.getLocales().keySet();
for (String name : locales) {
combo.add(name);
}
Label lblDescription = new Label(grpRequiredDetails, SWT.NONE);
lblDescription.setText(Messages.MainPage_11);
subjectText = new Text(grpRequiredDetails, SWT.BORDER);
subjectText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
Group grpCoverAndStyling = new Group(container, SWT.NONE);
grpCoverAndStyling.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
grpCoverAndStyling.setText(Messages.MainPage_12);
grpCoverAndStyling.setLayout(new GridLayout(3, false));
Label lblNewLabel = new Label(grpCoverAndStyling, SWT.NONE);
lblNewLabel.setText(Messages.MainPage_13);
coverText = new Text(grpCoverAndStyling, SWT.BORDER);
coverText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
Button button = new Button(grpCoverAndStyling, SWT.NONE);
button.setText("..."); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// XXX: Replace with ResourceSelectionDialog?
FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
dialog.setFilterNames(new String[] { Messages.MainPage_15 });
dialog.setFilterExtensions(new String[] { "*.png;*.gif;*.jpg;*.svg" }); //$NON-NLS-1$
dialog.setFilterPath(bean.getMarkupFile().getAbsolutePath());
String s = dialog.open();
if (s != null) {
coverText.setText(s);
}
}
});
Label lblStyleSheet = new Label(grpCoverAndStyling, SWT.NONE);
lblStyleSheet.setBounds(0, 0, 59, 14);
lblStyleSheet.setText(Messages.MainPage_16);
styleSheetText = new Text(grpCoverAndStyling, SWT.BORDER);
styleSheetText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Button button_1 = new Button(grpCoverAndStyling, SWT.NONE);
button_1.setText("..."); //$NON-NLS-1$
button_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// XXX: Replace with ResourceSelectionDialog?
FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
dialog.setFilterNames(new String[] { Messages.MainPage_18 });
dialog.setFilterExtensions(new String[] { "*.css" }); //$NON-NLS-1$
dialog.setFilterPath(bean.getMarkupFile().getAbsolutePath());
String s = dialog.open();
if (s != null) {
styleSheetText.setText(s);
}
}
});
m_bindingContext = initDataBindings();
WizardPageSupport.create(this, m_bindingContext);
setMessage(Messages.MainPage_0);
}
private final class StringValidator implements IValidator {
private final String errorText;
private final ControlDecoration controlDecoration;
public StringValidator(String errorText, Control control) {
this.errorText = errorText;
controlDecoration = new ControlDecoration(control, SWT.LEFT | SWT.TOP);
FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault().getFieldDecoration(
FieldDecorationRegistry.DEC_REQUIRED);
controlDecoration.setImage(fieldDecoration.getImage());
}
public IStatus validate(Object value) {
if (value instanceof String) {
String text = (String) value;
if (text.trim().length() == 0) {
controlDecoration.show();
return ValidationStatus.cancel(errorText);
}
}
controlDecoration.hide();
return ValidationStatus.ok();
}
}
private final class FileValidator implements IValidator {
private final String errorText;
private final String[] fileSuffixes;
private final ControlDecoration controlDecoration;
public FileValidator(String errorText, Control control, String[] fileSuffixes) {
this.errorText = errorText;
this.fileSuffixes = fileSuffixes;
controlDecoration = new ControlDecoration(control, SWT.LEFT | SWT.TOP);
FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault().getFieldDecoration(
FieldDecorationRegistry.DEC_ERROR);
controlDecoration.setImage(fieldDecoration.getImage());
controlDecoration.hide();
}
public IStatus validate(Object value) {
if (value instanceof String && ((String) value).length() > 0) {
File file = new File((String) value);
if (!file.exists()) {
controlDecoration.show();
return ValidationStatus.error("The specified file must exist."); //$NON-NLS-1$
}
boolean suffixOK = false;
String name = file.getName();
for (String suffix : fileSuffixes) {
if (name.endsWith(suffix)) {
suffixOK = true;
}
}
if (!suffixOK) {
controlDecoration.show();
return ValidationStatus.error(errorText);
}
}
controlDecoration.hide();
return ValidationStatus.ok();
}
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue textObserveTextObserveWidget = SWTObservables.observeText(titleText, SWT.Modify);
final IObservableValue beanTitleObserveValue = PojoObservables.observeValue(bean, "title"); //$NON-NLS-1$
UpdateValueStrategy titleStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
titleStrategy.setBeforeSetValidator(new StringValidator("A title must be specified", titleText)); //$NON-NLS-1$
bindingContext.bindValue(textObserveTextObserveWidget, beanTitleObserveValue, titleStrategy, null);
//
IObservableValue text_3ObserveTextObserveWidget = SWTObservables.observeText(authorText, SWT.Modify);
final IObservableValue beanCreatorObserveValue = PojoObservables.observeValue(bean, "creator"); //$NON-NLS-1$
UpdateValueStrategy authorStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
authorStrategy.setBeforeSetValidator(new StringValidator("An author must be specified", authorText)); //$NON-NLS-1$
bindingContext.bindValue(text_3ObserveTextObserveWidget, beanCreatorObserveValue, authorStrategy, null);
//
IObservableValue dateTimeObserveSelectionObserveWidget = SWTObservables.observeSelection(dateTime);
final IObservableValue beanPublicationDateObserveValue = PojoObservables.observeValue(bean, "publicationDate"); //$NON-NLS-1$
bindingContext.bindValue(dateTimeObserveSelectionObserveWidget, beanPublicationDateObserveValue, null, null);
//
IObservableValue text_4ObserveTextObserveWidget = SWTObservables.observeText(identifierText, SWT.Modify);
final IObservableValue beanIdentifierObserveValue = PojoObservables.observeValue(bean, "identifier"); //$NON-NLS-1$
UpdateValueStrategy identifierStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
identifierStrategy.setBeforeSetValidator(new StringValidator("An identifier must be specified", identifierText)); //$NON-NLS-1$
bindingContext.bindValue(text_4ObserveTextObserveWidget, beanIdentifierObserveValue, identifierStrategy, null);
//
IObservableValue schemeTextObserveTextObserveWidget = SWTObservables.observeText(schemeText);
final IObservableValue beanIdSchemeObserveValue = PojoObservables.observeValue(bean, "scheme"); //$NON-NLS-1$
UpdateValueStrategy schemeStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
schemeStrategy.setBeforeSetValidator(new StringValidator("An identifier scheme must be specified", schemeText)); //$NON-NLS-1$
bindingContext.bindValue(schemeTextObserveTextObserveWidget, beanIdSchemeObserveValue, schemeStrategy, null);
//
IObservableValue text_1ObserveTextObserveWidget = SWTObservables.observeText(copyrightText, SWT.Modify);
final IObservableValue beanRightsObserveValue = PojoObservables.observeValue(bean, "rights"); //$NON-NLS-1$
UpdateValueStrategy rightsStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
rightsStrategy.setBeforeSetValidator(new StringValidator("Rights must be specified", copyrightText)); //$NON-NLS-1$
bindingContext.bindValue(text_1ObserveTextObserveWidget, beanRightsObserveValue, rightsStrategy, null);
//
IObservableValue comboObserveTextObserveWidget = SWTObservables.observeText(combo);
final IObservableValue beanLanguageObserveValue = PojoObservables.observeValue(bean, "language"); //$NON-NLS-1$
UpdateValueStrategy languageStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
languageStrategy.setBeforeSetValidator(new StringValidator("A language must be specified", combo)); //$NON-NLS-1$
bindingContext.bindValue(comboObserveTextObserveWidget, beanLanguageObserveValue, languageStrategy, null);
//
IObservableValue subjectTextObserveTextObserveWidget = SWTObservables.observeText(subjectText, SWT.Modify);
final IObservableValue beanSubjectObserveValue = PojoObservables.observeValue(bean, "subject"); //$NON-NLS-1$
UpdateValueStrategy subjectStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
subjectStrategy.setBeforeSetValidator(new StringValidator("A subject must be specified", subjectText)); //$NON-NLS-1$
bindingContext.bindValue(subjectTextObserveTextObserveWidget, beanSubjectObserveValue, subjectStrategy, null);
//
IObservableValue coverObserveTextObserveWidget = SWTObservables.observeText(coverText, SWT.Modify);
IObservableValue beanCoverObserveValue = PojoObservables.observeValue(bean, "cover"); //$NON-NLS-1$
UpdateValueStrategy coverStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
coverStrategy.setBeforeSetValidator(new FileValidator(
"The cover image must be a valid image file of type PNG, SVG or JPEG.", coverText, new String[] { //$NON-NLS-1$
".png", ".svg", ".jpeg", ".jpg" })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
bindingContext.bindValue(coverObserveTextObserveWidget, beanCoverObserveValue, coverStrategy, null);
//
IObservableValue styleSheetTextObserveTextObserveWidget = SWTObservables.observeText(styleSheetText, SWT.Modify);
IObservableValue beanStyleSheetObserveValue = PojoObservables.observeValue(bean, "styleSheet"); //$NON-NLS-1$
UpdateValueStrategy styleSheetStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
styleSheetStrategy.setBeforeSetValidator(new FileValidator("The style sheet must be a valid CSS file.", //$NON-NLS-1$
styleSheetText, new String[] { ".css" })); //$NON-NLS-1$
bindingContext.bindValue(styleSheetTextObserveTextObserveWidget, beanStyleSheetObserveValue,
styleSheetStrategy, null);
//
return bindingContext;
}
@Override
public boolean isPageComplete() {
boolean ok = super.isPageComplete();
if (ok) {
setMessage("Press finish to generate an EPUB from the Wiki markup."); //$NON-NLS-1$
}
return ok;
}
}