com.siteview.mde.internal.ui.wizards.extension.BaseExtensionPointMainPage.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.wizards.extension.BaseExtensionPointMainPage.java

Source

/*******************************************************************************
 *  Copyright (c) 2000, 2008 IBM Corporation and others.
 *  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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.siteview.mde.internal.ui.wizards.extension;

import com.siteview.mde.core.monitor.IMonitorModelBase;
import com.siteview.mde.core.monitor.MonitorRegistry;

import com.siteview.mde.internal.ui.dialogs.PluginSelectionDialog;

import java.io.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import com.siteview.mde.internal.core.MDECore;
import com.siteview.mde.internal.core.ischema.IDocumentSection;
import com.siteview.mde.internal.core.ischema.ISchemaAttribute;
import com.siteview.mde.internal.core.schema.*;
import com.siteview.mde.internal.core.util.CoreUtility;
import com.siteview.mde.internal.core.util.IdUtil;
import com.siteview.mde.internal.ui.*;
import com.siteview.mde.internal.ui.util.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.views.navigator.ResourceComparator;

public abstract class BaseExtensionPointMainPage extends WizardPage {
    public static final String SETTINGS_PLUGIN_ID = "BaseExtensionPoint.settings.pluginId"; //$NON-NLS-1$
    public static final String SCHEMA_DIR = "schema"; //$NON-NLS-1$

    protected IContainer fContainer;
    protected Text fIdText;
    protected Text fPluginIdText;
    protected Text fNameText;
    protected Text fSchemaText;
    protected Text fSchemaLocationText;
    protected Button fOpenSchemaButton;
    protected Button fSharedSchemaButton;
    protected Button fPluginBrowseButton;
    protected Button fFindLocationButton;

    public BaseExtensionPointMainPage(IContainer container) {
        super("newExtensionPoint"); //$NON-NLS-1$
        fContainer = container;
    }

    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.verticalSpacing = 9;
        layout.makeColumnsEqualWidth = false;
        container.setLayout(layout);
        Label label;
        GridData gd;
        if (isPluginIdNeeded()) {
            label = new Label(container, SWT.NONE);
            label.setText(MDEUIMessages.BaseExtensionPoint_pluginId);
            fPluginIdText = new Text(container, SWT.SINGLE | SWT.BORDER);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.horizontalSpan = 1;
            gd.widthHint = 275;
            fPluginIdText.setLayoutData(gd);
            fPluginIdText.addModifyListener(new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    validatePage();
                }
            });
            fPluginBrowseButton = new Button(container, SWT.PUSH);
            gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
            gd.horizontalSpan = 1;
            gd.widthHint = 50;
            fPluginBrowseButton.setLayoutData(gd);
            fPluginBrowseButton.setText(MDEUIMessages.BaseExtensionPointMainPage_pluginBrowse);
            fPluginBrowseButton.setToolTipText(MDEUIMessages.BaseExtensionPointMainPage_pluginId_tooltip);
            fPluginBrowseButton.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    handlePluginBrowse();
                }
            });
            SWTUtil.setButtonDimensionHint(fPluginBrowseButton);
        }
        label = new Label(container, SWT.NONE);
        label.setText(MDEUIMessages.BaseExtensionPoint_id);
        fIdText = new Text(container, SWT.SINGLE | SWT.BORDER);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        fIdText.setLayoutData(gd);
        fIdText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                // setting the text will trigger validation
                // do not implicitly validate here
                fSchemaText.setText(getSchemaLocation() + (getSchemaLocation().length() > 0 ? "/" : "") //$NON-NLS-1$//$NON-NLS-2$
                        + fIdText.getText() + ".exsd"); //$NON-NLS-1$
            }
        });
        label = new Label(container, SWT.NONE);
        label.setText(MDEUIMessages.BaseExtensionPoint_name);
        fNameText = new Text(container, SWT.SINGLE | SWT.BORDER);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        fNameText.setLayoutData(gd);
        fNameText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                validatePage();
            }
        });
        if (isPluginIdNeeded() && !isPluginIdFinal()) {
            label = new Label(container, SWT.NONE);
            label.setText(MDEUIMessages.BaseExtensionPoint_schemaLocation);
            fSchemaLocationText = new Text(container, SWT.SINGLE | SWT.BORDER);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.widthHint = 150;
            gd.grabExcessHorizontalSpace = true;
            fSchemaLocationText.setLayoutData(gd);
            fSchemaLocationText.addModifyListener(new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    validatePage();
                }
            });
            fFindLocationButton = new Button(container, SWT.PUSH);
            gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
            gd.widthHint = 50;
            fFindLocationButton.setLayoutData(gd);
            fFindLocationButton.setText(MDEUIMessages.BaseExtensionPointMainPage_findBrowse);
            fFindLocationButton.setToolTipText(MDEUIMessages.BaseExtensionPointMainPage_schemaLocation_tooltip);
            fFindLocationButton.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    handleSchemaLocation();
                }
            });
            SWTUtil.setButtonDimensionHint(fFindLocationButton);
        }
        label = new Label(container, SWT.NONE);
        label.setText(MDEUIMessages.BaseExtensionPoint_schema);
        fSchemaText = new Text(container, SWT.SINGLE | SWT.BORDER);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        fSchemaText.setLayoutData(gd);
        fSchemaText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                validatePage();
            }
        });
        if (isSharedSchemaSwitchNeeded()) {
            fSharedSchemaButton = new Button(container, SWT.CHECK);
            fSharedSchemaButton.setText(MDEUIMessages.BaseExtensionPoint_shared);
            gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.horizontalSpan = 2;
            fSharedSchemaButton.setLayoutData(gd);
        }
        fOpenSchemaButton = new Button(container, SWT.CHECK);
        fOpenSchemaButton.setText(MDEUIMessages.BaseExtensionPoint_edit);
        fOpenSchemaButton.setSelection(true);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        fOpenSchemaButton.setLayoutData(gd);
        if (isPluginIdNeeded())
            fPluginIdText.setFocus();
        else
            fIdText.setFocus();
        setControl(container);
        initializeValues();
        validatePage();
        // do not start with an error message, convert to regular message
        String error = getErrorMessage();
        if (error != null) {
            setMessage(error);
            setErrorMessage(null);
        }
        Dialog.applyDialogFont(container);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IHelpContextIds.NEW_SCHEMA);
    }

    private InputStream createSchemaStream(String pluginId, String pointId, String name, boolean shared) {
        if (name.length() == 0)
            name = pointId;
        EditableSchema schema = new EditableSchema(pluginId, pointId, name, false);
        schema.setDescription(MDEUIMessages.BaseExtensionPoint_sections_overview);
        DocumentSection section;
        section = new DocumentSection(schema, IDocumentSection.SINCE,
                MDEUIMessages.BaseExtensionPointMainPage_since);
        section.setDescription(MDEUIMessages.BaseExtensionPoint_sections_since);
        schema.addDocumentSection(section);
        SchemaElement element;
        if (!shared) {
            element = new SchemaRootElement(schema, "extension"); //$NON-NLS-1$
            SchemaComplexType complexType = new SchemaComplexType(schema);
            element.setType(complexType);
            SchemaAttribute attribute = new SchemaAttribute(element, "point"); //$NON-NLS-1$
            attribute.setType(new SchemaSimpleType(schema, "string")); //$NON-NLS-1$
            attribute.setUse(ISchemaAttribute.REQUIRED);
            complexType.addAttribute(attribute);
            attribute = new SchemaAttribute(element, "id"); //$NON-NLS-1$
            attribute.setType(new SchemaSimpleType(schema, "string")); //$NON-NLS-1$
            complexType.addAttribute(attribute);
            attribute = new SchemaAttribute(element, "name"); //$NON-NLS-1$
            attribute.setType(new SchemaSimpleType(schema, "string")); //$NON-NLS-1$
            attribute.setTranslatableProperty(true);
            complexType.addAttribute(attribute);
            schema.addElement(element);
        }
        section = new DocumentSection(schema, IDocumentSection.EXAMPLES, "Examples"); //$NON-NLS-1$
        section.setDescription(MDEUIMessages.BaseExtensionPoint_sections_usage);
        schema.addDocumentSection(section);
        section = new DocumentSection(schema, IDocumentSection.API_INFO, "API Information"); //$NON-NLS-1$
        section.setDescription(MDEUIMessages.BaseExtensionPoint_sections_api);
        schema.addDocumentSection(section);
        section = new DocumentSection(schema, IDocumentSection.IMPLEMENTATION, "Supplied Implementation"); //$NON-NLS-1$
        section.setDescription(MDEUIMessages.BaseExtensionPoint_sections_supplied);
        schema.addDocumentSection(section);
        section = new DocumentSection(schema, IDocumentSection.COPYRIGHT, "Copyright"); //$NON-NLS-1$
        section.setDescription(MDEUIMessages.BaseExtensionPoint_sections_copyright);
        schema.addDocumentSection(section);
        StringWriter swriter = new StringWriter();
        try {
            PrintWriter writer = new PrintWriter(swriter, true);
            schema.save(writer);
            swriter.close();
        } catch (IOException e) {
            MDEPlugin.logException(e);
        }
        try {
            return new ByteArrayInputStream(swriter.toString().getBytes("UTF8")); //$NON-NLS-1$
        } catch (UnsupportedEncodingException e) {
            return new ByteArrayInputStream(new byte[0]);
        }
    }

    private IFile generateSchemaFile(String pluginId, String id, String name, boolean shared, String schema,
            IProgressMonitor monitor) throws CoreException {
        IFile schemaFile = null;

        IWorkspace workspace = fContainer.getWorkspace();
        IPath schemaPath = new Path(schema).removeLastSegments(1);
        IPath newSchemaPath = fContainer.getProjectRelativePath().append(schemaPath);
        monitor.subTask(MDEUIMessages.BaseExtensionPoint_generating);
        if (newSchemaPath.isEmpty() == false) {
            IFolder folder = fContainer.getProject().getFolder(newSchemaPath);
            CoreUtility.createFolder(folder);
        }
        InputStream source = createSchemaStream(pluginId, id, name, shared);
        IPath filePath = fContainer.getFullPath().append(schema);
        schemaFile = workspace.getRoot().getFile(filePath);
        if (!schemaFile.exists()) {
            // create for the first time
            schemaFile.create(source, true, monitor);
        } else {
            schemaFile.setContents(source, true, false, monitor);
        }
        IDE.setDefaultEditor(schemaFile, IMDEUIConstants.SCHEMA_EDITOR_ID);
        return schemaFile;
    }

    public IRunnableWithProgress getOperation() {
        final boolean openFile = fOpenSchemaButton.getSelection();
        final String id = fIdText.getText();
        final String name = fNameText.getText();
        final String schema = fSchemaText.getText();
        final boolean shared = fSharedSchemaButton != null ? fSharedSchemaButton.getSelection() : false;
        IRunnableWithProgress operation = new WorkspaceModifyOperation() {
            public void execute(final IProgressMonitor monitor) {
                try {
                    Display.getDefault().asyncExec(new Runnable() {

                        public void run() {
                            String schemaName = schema;
                            if (!schema.endsWith(".exsd")) //$NON-NLS-1$
                                schemaName = schema + ".exsd"; //$NON-NLS-1$

                            IFile file = fContainer.getFile(new Path(schema));
                            // do not overwrite if schema already exists
                            if (!file.exists())
                                try {
                                    file = generateSchemaFile(getPluginId(), id, name, shared, schemaName, monitor);
                                } catch (CoreException e) {
                                    MDEPlugin.logException(e);
                                }

                            if (file != null && openFile) {
                                fSchemaText.setText(file.getProjectRelativePath().toString());
                                openSchemaFile(file);
                            }
                        }

                    });

                } finally {
                    monitor.done();
                }
            }
        };
        return operation;
    }

    public String getSchemaLocation() {
        if (fSchemaText != null) {
            String schema = fSchemaText.getText();
            if (schema.length() == 0) {
                if (fSchemaLocationText != null
                        && SCHEMA_DIR.equals(new Path(fSchemaLocationText.getText()).lastSegment())) {
                    return ""; //$NON-NLS-1$
                }
                return SCHEMA_DIR;
            }

            int loc = schema.lastIndexOf("/"); //$NON-NLS-1$
            if (loc != -1)
                return schema.substring(0, loc);
        }
        return ""; //$NON-NLS-1$
    }

    public String getPluginId() {
        if (fPluginIdText != null) {
            return fPluginIdText.getText();
        }
        return ""; //$NON-NLS-1$
    }

    protected boolean isPluginIdNeeded() {
        return false;
    }

    protected boolean isPluginIdFinal() {
        return false;
    }

    protected boolean isSharedSchemaSwitchNeeded() {
        return false;
    }

    private void openSchemaFile(final IFile file) {
        final IWorkbenchWindow ww = MDEPlugin.getActiveWorkbenchWindow();
        Display d = ww.getShell().getDisplay();
        d.asyncExec(new Runnable() {
            public void run() {
                try {
                    String editorId = IMDEUIConstants.SCHEMA_EDITOR_ID;
                    ww.getActivePage().openEditor(new FileEditorInput(file), editorId);
                } catch (PartInitException e) {
                    MDEPlugin.logException(e);
                }
            }
        });
    }

    private void validatePage() {
        // clear opening message
        setMessage(null);
        String message = validateFieldContents();
        setErrorMessage(message);
        setPageComplete(message == null);
    }

    protected abstract String validateFieldContents();

    protected abstract void initializeValues();

    protected String validateExtensionPointID() {

        // Verify not zero length
        String id = fIdText.getText();
        if (id.length() == 0)
            return MDEUIMessages.BaseExtensionPointMainPage_missingExtensionPointID;

        // For 3.2 or greater plug-ins verify that it is a valid composite ID
        // and that it has a valid namespace
        // For 3.1 and lower plug-ins verify that it is a valid simple ID
        String pluginID = getPluginId();
        IMonitorModelBase model = MonitorRegistry.findModel(pluginID);
        // Verify that the plugin was found
        if (model == null) {
            return NLS.bind(MDEUIMessages.BaseExtensionPointMainPage_errorMsgPluginNotFound, pluginID);
        }

        String schemaVersion = model.getMonitorBase().getSchemaVersion();
        if (schemaVersion == null || Float.parseFloat(schemaVersion) >= 3.2) {
            if (!IdUtil.isValidCompositeID(id))
                return MDEUIMessages.BaseExtensionPointMainPage_invalidCompositeID;

        } else if (!IdUtil.isValidSimpleID(id))
            return MDEUIMessages.BaseExtensionPointMainPage_invalidSimpleID;

        return null;
    }

    protected String validateExtensionPointName() {
        // Verify not zero length
        if (fNameText.getText().length() == 0)
            return MDEUIMessages.BaseExtensionPointMainPage_missingExtensionPointName;

        return null;
    }

    protected String validateExtensionPointSchema() {
        // Verify not zero length
        if (fSchemaText.getText().length() == 0)
            return MDEUIMessages.BaseExtensionPointMainPage_missingExtensionPointSchema;

        return null;
    }

    private void handlePluginBrowse() {
        PluginSelectionDialog dialog = new PluginSelectionDialog(getShell(), MonitorRegistry.getWorkspaceModels(),
                false);
        dialog.create();
        if (dialog.open() == Window.OK) {
            IMonitorModelBase workspaceModelBase = (IMonitorModelBase) dialog.getFirstResult();
            fPluginIdText.setText(workspaceModelBase.getMonitorBase().getId());
        }
    }

    private void handleSchemaLocation() {
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
                new WorkbenchContentProvider());
        dialog.setTitle(MDEUIMessages.BaseExtensionPointMainPage_schemaLocation_title);
        dialog.setMessage(MDEUIMessages.BaseExtensionPointMainPage_schemaLocation_desc);
        dialog.setDoubleClickSelects(false);
        dialog.setAllowMultiple(false);
        dialog.addFilter(new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof IFile)
                    return false;
                return true;
            }
        });

        dialog.setInput(MDEPlugin.getWorkspace().getRoot());
        dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
        dialog.setInitialSelection(fContainer);
        dialog.create();
        PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(), IHelpContextIds.CONTAINER_SELECTION);
        if (dialog.open() == Window.OK) {
            Object[] elements = dialog.getResult();
            if (elements.length > 0) {
                IResource elem = (IResource) elements[0];
                String newPath = getWorkspaceRelativePath(elem.getLocation().toString());
                fSchemaLocationText.setText(newPath + "/"); //$NON-NLS-1$
            }
        }
    }

    private String getWorkspaceRelativePath(String path) {
        String workspacePath = MDECore.getWorkspace().getRoot().getLocation().toString();
        if (path.startsWith(workspacePath))
            path = path.replaceFirst(workspacePath, ""); //$NON-NLS-1$
        return path;
    }

    public String getInvalidIdMessage() {
        // No validation done (other than making sure id is not blank)
        return null;
    }

}