com.mobilesorcery.sdk.extensions.ExtensionsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.mobilesorcery.sdk.extensions.ExtensionsPreferencePage.java

Source

package com.mobilesorcery.sdk.extensions;

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
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.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.mobilesorcery.sdk.core.MoSyncExtension;
import com.mobilesorcery.sdk.core.MoSyncExtensionManager;
import com.mobilesorcery.sdk.core.MoSyncExtensionManager.ExtensionAlreadyExistsException;
import com.mobilesorcery.sdk.extensionsupport.ExtensionSupportPlugin;
import com.mobilesorcery.sdk.ui.SimpleListEditor;
import com.mobilesorcery.sdk.ui.TextDialog;
import com.mobilesorcery.sdk.ui.UIUtils;

public class ExtensionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    class InstalledExtensionsEditor extends SimpleListEditor<MoSyncExtension> {

        private Button license;
        private MoSyncExtension current;

        public InstalledExtensionsEditor(Composite parent, int style) {
            super(parent, style);
        }

        protected int createButtons(Composite main) {
            add = createButton(main, "&Install...");
            remove = createButton(main, "&Uninstall");
            license = createButton(main, "&License");
            return 3;
        }

        protected void updateButtons(IStructuredSelection selection) {
            super.updateButtons(selection);
            current = (MoSyncExtension) ((IStructuredSelection) getSelection()).getFirstElement();
            license.setEnabled(current != null && current.getLicense() != null);
            license.addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    showLicense();
                }
            });
        }

        private void showLicense() {
            if (current != null) {
                TextDialog dialog = new TextDialog(getShell());
                dialog.setText(current.getLicense());
                dialog.open();
            }
        }

        public MoSyncExtension add(Object nextObject) {
            FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
            dialog.setFilterExtensions(new String[] { "*.ext" });
            String result = dialog.open();
            MoSyncExtension extension = null;
            if (result != null) {
                try {
                    try {
                        extension = MoSyncExtensionManager.getDefault().install(new File(result), false);
                    } catch (ExtensionAlreadyExistsException e) {
                        MoSyncExtension ext = e.getExisting();
                        if (MessageDialog.openQuestion(getShell(), "Extension already exists", MessageFormat.format(
                                "The extension {0} already exists.\nInstalled version: {1}\n\nDo you want to update the extension?",
                                ext.getName(), ext.getVersion()))) {
                            extension = MoSyncExtensionManager.getDefault().install(new File(result), true);
                        }
                    }
                } catch (Exception e) {
                    handleError(e, "Could not install extension");
                }
            }
            refresh();
            return extension;
        }

        public boolean remove(Object[] selection) {
            boolean doRemove = MessageDialog.openConfirm(getShell(), "Uninstall",
                    MessageFormat.format(
                            "This will remove {0} extension(s).\nNOTE: This operation cannot be undone.",
                            selection.length));
            if (doRemove) {
                try {
                    for (int i = 0; i < selection.length; i++) {
                        MoSyncExtensionManager.getDefault().uninstall((MoSyncExtension) selection[i]);
                    }
                } catch (Exception e) {
                    handleError(e, "Could not uninstall extension");
                    doRemove = false;
                }
            }
            return doRemove;
        }

        private void refresh() {
            setInput(MoSyncExtensionManager.getDefault().getExtensions());
        }

        private void handleError(Exception e, String msg) {
            ErrorDialog.openError(getShell(), msg, msg,
                    new Status(IStatus.ERROR, ExtensionSupportPlugin.PLUGIN_ID, e.getMessage(), e));
        }
    }

    private class ExtensionLabelProvider extends StyledCellLabelProvider {

        private Styler vendorStyler;

        public ExtensionLabelProvider() {
            Color vendorColor = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
            vendorStyler = UIUtils.createStyler(null, vendorColor);
        }

        public void update(ViewerCell cell) {
            MoSyncExtension ext = (MoSyncExtension) cell.getElement();
            StyledString extensionDesc = new StyledString();
            extensionDesc.append(ext.getName() + " ");
            extensionDesc.append(ext.getVersion() + " - " + ext.getVendor(), vendorStyler);
            cell.setStyleRanges(extensionDesc.getStyleRanges());
            cell.setText(extensionDesc.getString());
        }

    }

    public ExtensionsPreferencePage() {
        this("Extensions");
    }

    public ExtensionsPreferencePage(String title) {
        super(title);
    }

    public ExtensionsPreferencePage(String title, ImageDescriptor image) {
        super(title, image);
    }

    @Override
    public void init(IWorkbench workbench) {
    }

    @Override
    protected Control createContents(Composite parent) {
        Composite main = new Composite(parent, SWT.NONE);
        main.setLayout(UIUtils.newPrefsLayout(1));
        InstalledExtensionsEditor extensions = new InstalledExtensionsEditor(main, SWT.NONE);
        extensions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        extensions.setLabelProvider(new ExtensionLabelProvider());
        extensions.refresh();
        return main;
    }

}