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