org.xmind.cathy.internal.GeneralPrefPage.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.cathy.internal.GeneralPrefPage.java

Source

/* ******************************************************************************
 * Copyright (c) 2006-2012 XMind Ltd. and others.
 * 
 * This file is a part of XMind 3. XMind releases 3 and
 * above are dual-licensed under the Eclipse Public License (EPL),
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 * and the GNU Lesser General Public License (LGPL), 
 * which is available at http://www.gnu.org/licenses/lgpl.html
 * See http://www.xmind.net/license.html for details.
 * 
 * Contributors:
 *     XMind Ltd. - initial API and implementation
 *******************************************************************************/
package org.xmind.cathy.internal;

import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.internal.IPreferenceConstants;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.xmind.core.usagedata.IUsageDataSampler;
import org.xmind.core.usagedata.IUsageDataUploader;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.prefs.PrefConstants;
import org.xmind.ui.resources.ColorUtils;
import org.xmind.ui.util.NumberUtils;

public class GeneralPrefPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, Listener {

    //    private static class SoftCheckFileFieldEditor
    //            extends StringButtonFieldEditor {
    //
    //        private String[] extensions = null;
    //
    //        private String[] extensionNames = null;
    //
    //        public SoftCheckFileFieldEditor(String name, String labelText,
    //                Composite parent) {
    //            init(name, labelText);
    //            setChangeButtonText(JFaceResources.getString("openBrowse"));//$NON-NLS-1$
    //            createControl(parent);
    //        }
    //
    //        @Override
    //        public void setEmptyStringAllowed(boolean b) {
    //            super.setEmptyStringAllowed(b);
    //            refreshValidState();
    //        }
    //
    //        @Override
    //        protected boolean checkState() {
    //            Text text = getTextControl();
    //            if (text == null)
    //                return false;
    //            boolean validFile;
    //            String path = text.getText();
    //            if ("".equals(path)) { //$NON-NLS-1$
    //                validFile = isEmptyStringAllowed();
    //            } else {
    //                validFile = new File(path).isFile();
    //            }
    //            if (validFile) {
    //                getPage().setMessage(null);
    //            } else {
    //                getPage().setMessage(getErrorMessage(),
    //                        IMessageProvider.WARNING);
    //            }
    //            return validFile;
    //        }
    //
    //        @Override
    //        protected String changePressed() {
    //            File f = new File(getTextControl().getText());
    //            if (!f.exists()) {
    //                f = null;
    //            }
    //            File d = getFile(f);
    //            if (d == null) {
    //                return null;
    //            }
    //            return d.getAbsolutePath();
    //        }
    //
    //        /**
    //         * Helper to open the file chooser dialog.
    //         * 
    //         * @param startingDirectory
    //         *            the directory to open the dialog on.
    //         * @return File The File the user selected or <code>null</code> if they
    //         *         do not.
    //         */
    //        private File getFile(File startingDirectory) {
    //            FileDialog dialog = new FileDialog(getShell(),
    //                    SWT.OPEN | SWT.SHEET);
    //            if (extensions != null) {
    //                dialog.setFilterExtensions(extensions);
    //                if (extensionNames != null) {
    //                    dialog.setFilterNames(extensionNames);
    //                }
    //            }
    //            if (startingDirectory != null) {
    //                dialog.setFileName(startingDirectory.getPath());
    //            }
    //            String file = dialog.open();
    //            if (file != null) {
    //                file = file.trim();
    //                if (file.length() > 0) {
    //                    return new File(file);
    //                }
    //            }
    //
    //            return null;
    //        }
    //
    //        public void setExtensions(String[] extensions) {
    //            this.extensions = extensions;
    //        }
    //
    //        public void setExtensionNames(String[] extensionNames) {
    //            this.extensionNames = extensionNames;
    //        }
    //
    //    }

    //    private IntegerFieldEditor autoSaveIntervalsField;
    //
    //    private Composite autoSaveIntervalsParent;

    private Text autoSaveIntervalsInput;

    private boolean autoBackup = true;

    private BooleanFieldEditor autoBackupField;

    private IntegerFieldEditor recentFilesField;

    //    private Combo startupActionCombo;
    //
    //    private SoftCheckFileFieldEditor homeMapField;
    //
    //    private Control homeMapControl;

    private Control recentFilesControl;

    private Button startupActionButton;

    private ResourceManager resources;

    public GeneralPrefPage() {
        super(WorkbenchMessages.GeneralPrefPage_title, FLAT);
    }

    @Override
    public void applyData(Object data) {
        if (IPreferenceConstants.RECENT_FILES.equals(data)) {
            if (recentFilesControl != null && !recentFilesControl.isDisposed()) {
                recentFilesControl.setFocus();
                highlight(recentFilesControl.getParent());
            }
        }
    }

    private void highlight(final Control control) {
        final Display display = control.getDisplay();
        final Color oldBackground = control.getBackground();
        final Color c1 = oldBackground == null ? display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)
                : oldBackground;
        final int r1 = c1.getRed(), g1 = c1.getGreen(), b1 = c1.getBlue();
        final int r0 = 255, g0 = 240, b0 = 180;
        final int total = 30;
        final int[] step = new int[] { 0 };
        final Color[] c = new Color[1];
        display.timerExec(500, new Runnable() {
            public void run() {
                if (control.isDisposed())
                    return;
                c[0] = new Color(display, r0, g0, b0);
                control.setBackground(c[0]);
                display.timerExec(20, new Runnable() {
                    public void run() {
                        c[0].dispose();

                        if (control.isDisposed())
                            return;

                        ++step[0];
                        if (step[0] > total) {
                            control.setBackground(null);
                            return;
                        }

                        int x = step[0], y = total - step[0];
                        int r = (r0 * y + r1 * x) / total;
                        int g = (g0 * y + g1 * x) / total;
                        int b = (b0 * y + b1 * x) / total;
                        c[0] = new Color(display, r, g, b);
                        control.setBackground(c[0]);
                        display.timerExec(20, this);
                    }
                });
            }
        });
    }

    protected IPreferenceStore doGetPreferenceStore() {
        return CathyPlugin.getDefault().getPreferenceStore();
    }

    @Override
    public void createControl(Composite parent) {
        resources = new LocalResourceManager(JFaceResources.getResources(), parent);
        super.createControl(parent);
    }

    protected Control createContents(Composite parent) {
        Composite composite = (Composite) super.createContents(parent);
        ((GridLayout) composite.getLayout()).verticalSpacing = 15;
        return composite;
    }

    protected void createFieldEditors() {
        addStartupGroup();
        addRecentFileCountField();
        addAutoSaveGroup();
        addAutoBackupGroup();
        //addRememberLastSessionField();
        //addCheckUpdatesField();
        addSendUsageDataGroup();
    }

    private void addStartupGroup() {
        Composite parent = createGroup(WorkbenchMessages.Startup_title);
        addStartupActionField(parent);
        addCheckUpdatesField(parent);
    }

    private void addStartupActionField(Composite parent) {
        startupActionButton = new Button(parent, SWT.CHECK);
        startupActionButton.setText(WorkbenchMessages.RestoreLastSession_label);
        //        addField(new BooleanFieldEditor(CathyPlugin.RESTORE_LAST_SESSION,
        //                WorkbenchMessages.StartupAction_LastSession,
        //                createFieldContainer(parent, false)));
        //        Composite line = new Composite(parent, SWT.NONE);
        //        line.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        //        GridLayout layout = new GridLayout(2, false);
        //        layout.marginHeight = 0;
        //        layout.marginWidth = 0;
        //        line.setLayout(layout);
        //        fillStartupActionFields(line);
    }

    //    private void fillStartupActionFields(Composite parent) {
    //        Label label = new Label(parent, SWT.NONE);
    //        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true));
    //        label.setText(WorkbenchMessages.StartupAction_label);
    //
    //        startupActionCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
    //        startupActionCombo
    //                .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    //        startupActionCombo.add(WorkbenchMessages.StartupAction_OpenDialog);
    //        startupActionCombo.add(WorkbenchMessages.StartupAction_BlankMap);
    //        startupActionCombo.add(WorkbenchMessages.StartupAction_HomeMap);
    //        startupActionCombo.add(WorkbenchMessages.StartupAction_LastSession);
    //        startupActionCombo.addListener(SWT.Selection, this);
    //    }

    //    private void addHomeMapField(Composite parent) {
    //        Composite line = new Composite(parent, SWT.NONE);
    //        line.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    //        GridLayout layout = new GridLayout(2, false);
    //        layout.marginHeight = 0;
    //        layout.marginWidth = 0;
    //        line.setLayout(layout);
    //        fillHomeMapFields(line);
    //    }

    //    private void fillHomeMapFields(Composite parent) {
    //        Composite container = createFieldContainer(parent, true);
    //        addField(homeMapField = new SoftCheckFileFieldEditor(
    //                PrefConstants.HOME_MAP_LOCATION,
    //                WorkbenchMessages.HomeMap_label, container));
    //        homeMapControl = homeMapField.getTextControl(container);
    //        homeMapField.setErrorMessage(WorkbenchMessages.HomeMap_NotFound_error);
    //        String xmindExt = "*" + MindMapUI.FILE_EXT_XMIND; //$NON-NLS-1$
    //        homeMapField.setExtensions(new String[] { xmindExt });
    //        homeMapField.setExtensionNames(new String[] { NLS.bind("{0} ({1})", //$NON-NLS-1$
    //                DialogMessages.WorkbookFilterName, xmindExt) });
    //    }

    private void addCheckUpdatesField(Composite parent) {
        addField(new BooleanFieldEditor(CathyPlugin.CHECK_UPDATES_ON_STARTUP, WorkbenchMessages.CheckUpdates_label,
                createFieldContainer(parent, true)));
    }

    private void addRecentFileCountField() {
        Composite container = getFieldEditorParent();
        addField(recentFilesField = new IntegerFieldEditor(IPreferenceConstants.RECENT_FILES,
                WorkbenchMessages.RecentFiles_label, container));
        recentFilesControl = recentFilesField.getTextControl(container);
    }

    //    private void addRememberLastSessionField() {
    //        addField(new BooleanFieldEditor(CathyPlugin.RESTORE_LAST_SESSION,
    //                WorkbenchMessages.RestoreLastSession_label,
    //                getFieldEditorParent()));
    //    }
    //
    //    private void addCheckUpdatesField() {
    //        addField(new BooleanFieldEditor(CathyPlugin.CHECK_UPDATES_ON_STARTUP,
    //                WorkbenchMessages.CheckUpdates_label, getFieldEditorParent()));
    //    }

    private void addAutoSaveGroup() {
        String message = WorkbenchMessages.AutoSave_label2;
        int index = message.indexOf("{0}"); //$NON-NLS-1$
        int cols = 3;
        String label1, label2;
        if (index >= 0) {
            label1 = message.substring(0, index);
            label2 = message.substring(index + 3);
            if ("".equals(label2)) { //$NON-NLS-1$
                label2 = null;
                cols--;
            }
        } else {
            label1 = message;
            label2 = null;
            cols--;
            if ("".equals(label1)) {//$NON-NLS-1$
                label1 = null;
                cols--;
            }
        }

        Composite parent = getFieldEditorParent();
        GridLayout gridLayout = new GridLayout(cols, false);
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        gridLayout.horizontalSpacing = 0;
        parent.setLayout(gridLayout);
        //        parent.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, true));
        //                ((GridData) composite.getLayoutData()).horizontalIndent = 10;

        Composite booleanParent = new Composite(parent, SWT.NONE);
        booleanParent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true));
        addField(new BooleanFieldEditor(CathyPlugin.AUTO_SAVE_ENABLED, label1, booleanParent));

        autoSaveIntervalsInput = new Text(parent, SWT.SINGLE | SWT.BORDER | SWT.CENTER);
        autoSaveIntervalsInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true));
        ((GridData) autoSaveIntervalsInput.getLayoutData()).widthHint = 40;
        autoSaveIntervalsInput.setEnabled(getPreferenceStore().getBoolean(CathyPlugin.AUTO_SAVE_ENABLED));

        if (label2 != null) {
            Label label = new Label(parent, SWT.NONE);
            label.setText(label2);
            label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true));
        }
    }

    //    private void addAutoSaveGroup() {
    //        Composite parent = getFieldEditorParent();
    //        GridLayout gridLayout = new GridLayout(2, false);
    //        gridLayout.marginWidth = 0;
    //        gridLayout.marginHeight = 0;
    //        gridLayout.verticalSpacing = 0;
    //        gridLayout.horizontalSpacing = 0;
    //        parent.setLayout(gridLayout);
    //
    ////        PreferenceLinkArea link = new PreferenceLinkArea(parent,
    ////                SWT.NONE,
    ////                "org.xmind.ui.BackupPrefPage", //$NON-NLS-1$
    ////                "See <a>''{0}''</a> for auto saving and backup options.",
    ////                (IWorkbenchPreferenceContainer) getContainer(), null);
    ////        link.getControl().setLayoutData(
    ////                new GridData(SWT.FILL, SWT.FILL, true, false));
    //
    //
    //        addField(new BooleanFieldEditor(CathyPlugin.AUTO_SAVE_ENABLED,
    //                WorkbenchMessages.AutoSave_label, createFieldContainer(parent,
    //                        false)));
    //
    //        autoSaveIntervalsParent = createFieldContainer(parent, true);
    //
    //        addField(autoSaveIntervalsField = new IntegerFieldEditor(
    //                CathyPlugin.AUTO_SAVE_INTERVALS, "", //$NON-NLS-1$
    //                autoSaveIntervalsParent));
    //
    //        autoSaveIntervalsField.setEnabled(
    //                getPreferenceStore().getBoolean(CathyPlugin.AUTO_SAVE_ENABLED),
    //                autoSaveIntervalsParent);
    //
    //        Label label = new Label(parent, SWT.NONE);
    //        label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
    //                false));
    //        label.setText(WorkbenchMessages.AutoSave_Minutes);
    //
    //    }

    private void addAutoBackupGroup() {
        Composite parent = getFieldEditorParent();
        GridLayout gridLayout = new GridLayout(1, false);
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        gridLayout.horizontalSpacing = 0;
        parent.setLayout(gridLayout);
        addField(autoBackupField = new BooleanFieldEditor(PrefConstants.AUTO_BACKUP_ENABLE,
                WorkbenchMessages.AutoBackup_label, createFieldContainer(parent, true)));
    }

    private void addSendUsageDataGroup() {
        Composite composite = getFieldEditorParent();
        GridLayout gridLayout = new GridLayout(2, false);
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        gridLayout.horizontalSpacing = 5;
        composite.setLayout(gridLayout);

        Composite composite2 = new Composite(composite, SWT.NONE);
        composite2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));

        GridLayout gridLayout2 = new GridLayout(1, false);
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        gridLayout.horizontalSpacing = 0;
        composite2.setLayout(gridLayout2);

        addField(new BooleanFieldEditor(CathyPlugin.USAGE_DATA_UPLOADING_ENABLED,
                WorkbenchMessages.GeneralPrefPage_usageData_text, composite2));

        //
        Hyperlink privacyHyperlink = new Hyperlink(composite, SWT.NONE);
        privacyHyperlink.setBackground(composite.getBackground());
        privacyHyperlink.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
        privacyHyperlink.setText(WorkbenchMessages.GeneralPrefPage_seePolicy_link);
        privacyHyperlink.setUnderlined(true);
        privacyHyperlink.setForeground((Color) resources.get(ColorUtils.toDescriptor("#77afe0"))); //$NON-NLS-1$
        privacyHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
            public void linkActivated(HyperlinkEvent e) {
                Program.launch("http://www.xmind.net/privacy/usage/"); //$NON-NLS-1$
            }
        });

        if (CathyPlugin.getDefault().isDebugging("/debug/udc/showUploadButton")) { //$NON-NLS-1$
            Button uploadButton = new Button(composite, SWT.PUSH);
            GridData layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
            layoutData.horizontalSpan = 2;
            layoutData.horizontalIndent = 10;
            layoutData.minimumWidth = 100;
            uploadButton.setLayoutData(layoutData);
            uploadButton.setBackground(composite.getBackground());
            uploadButton.setText("Upload Now"); //$NON-NLS-1$
            uploadButton.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    IUsageDataSampler sampler = CathyPlugin.getDefault().getUsageDataCollector();
                    if (sampler instanceof IUsageDataUploader) {
                        ((IUsageDataUploader) sampler).forceUpload();
                    }
                }
            });
        }
    }

    private Composite createFieldContainer(Composite parent, boolean grabHorizontal) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, grabHorizontal, true));
        composite.setLayout(new GridLayout(1, false));
        return composite;
    }

    private Composite createGroup(String groupTitle) {
        Composite parent = getFieldEditorParent();
        GridLayout gridLayout = new GridLayout(1, false);
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        gridLayout.horizontalSpacing = 0;
        parent.setLayout(gridLayout);

        Group group = new Group(parent, SWT.NONE);
        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        group.setLayout(new GridLayout(1, false));
        group.setText(groupTitle);
        return group;
    }

    @Override
    protected void initialize() {
        super.initialize();
        int startupAction = getPreferenceStore().getInt(CathyPlugin.STARTUP_ACTION);
        startupActionButton.setSelection(startupAction == CathyPlugin.STARTUP_ACTION_LAST);
        //        startupActionCombo.select(startupAction);

        //        homeMapField.setPreferenceStore(
        //                MindMapUIPlugin.getDefault().getPreferenceStore());
        //        homeMapField.setEmptyStringAllowed(
        //                startupAction != CathyPlugin.STARTUP_ACTION_HOME);
        //        homeMapField.load();

        recentFilesField.setPreferenceStore(WorkbenchPlugin.getDefault().getPreferenceStore());
        recentFilesField.load();

        autoSaveIntervalsInput
                .setText(String.valueOf(getPreferenceStore().getInt(CathyPlugin.AUTO_SAVE_INTERVALS)));
        autoBackupField.setPreferenceStore(MindMapUIPlugin.getDefault().getPreferenceStore());
        autoBackupField.load();
    }

    public void init(IWorkbench workbench) {
    }

    @Override
    public boolean performOk() {
        if (!super.performOk())
            return false;

        if (startupActionButton.getSelection()) {
            getPreferenceStore().setValue(CathyPlugin.STARTUP_ACTION, CathyPlugin.STARTUP_ACTION_LAST);
        } else {
            getPreferenceStore().setValue(CathyPlugin.STARTUP_ACTION, CathyPlugin.STARTUP_ACTION_WIZARD);
        }

        int autoSaveIntervals = NumberUtils.safeParseInt(autoSaveIntervalsInput.getText(), 0);
        getPreferenceStore().setValue(CathyPlugin.AUTO_SAVE_INTERVALS, autoSaveIntervals);
        MindMapUIPlugin.getDefault().getPreferenceStore().setValue(PrefConstants.AUTO_BACKUP_ENABLE, autoBackup);
        return true;
    }

    public void propertyChange(PropertyChangeEvent event) {
        super.propertyChange(event);
        if (event.getSource() instanceof FieldEditor) {
            FieldEditor fe = (FieldEditor) event.getSource();
            if (event.getProperty().equals(FieldEditor.VALUE)) {
                String prefName = fe.getPreferenceName();
                if (CathyPlugin.AUTO_SAVE_ENABLED.equals(prefName)) {
                    autoSaveIntervalsInput.setEnabled(((Boolean) event.getNewValue()).booleanValue());
                    //                    autoSaveIntervalsField.setEnabled(
                    //                            (Boolean) event.getNewValue(),
                    //                            autoSaveIntervalsParent);
                } else if (PrefConstants.AUTO_BACKUP_ENABLE.equals(prefName)) {
                    autoBackup = ((Boolean) event.getNewValue()).booleanValue();
                }
            }
        }
    }

    public void handleEvent(Event event) {
        //        if (event.widget == startupActionCombo) {
        //            int startupAction = startupActionCombo.getSelectionIndex();
        //            homeMapField.setEmptyStringAllowed(
        //                    startupAction != CathyPlugin.STARTUP_ACTION_HOME);
        //            checkState();
        //        }
    }
}