| /******************************************************************************* |
| * 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; |
| } |
| } |