org.eclipse.mylyn.internal.docs.epub.ui.MainPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.docs.epub.ui.MainPage.java

Source

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