com.arm.cmsis.pack.project.wizards.CmsisCodeTemplateNewWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.project.wizards.CmsisCodeTemplateNewWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2015 ARM Ltd. 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:
 * ARM Ltd and ARM Germany GmbH - Initial API and implementation
 *******************************************************************************/

package com.arm.cmsis.pack.project.wizards;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;

import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpCodeTemplate;
import com.arm.cmsis.pack.project.CpProjectPlugIn;
import com.arm.cmsis.pack.project.IHelpContextIds;
import com.arm.cmsis.pack.project.IRteProject;
import com.arm.cmsis.pack.project.Messages;
import com.arm.cmsis.pack.project.utils.ProjectUtils;
import com.arm.cmsis.pack.ui.CpPlugInUI;
import com.arm.cmsis.pack.utils.Utils;

/**
 * The "New" wizard page allows setting the container for the new file as well
 * as the file name. The page will only accept file name with the extension that
 * matches the code template's.
 */
public class CmsisCodeTemplateNewWizardPage extends WizardPage {
    private Text projectText;
    private Button projectBrowse;

    private Text containerText;
    private Button containerBrowse;

    private ISelection selection;
    private TreeViewer fViewer;
    Text fileText;

    ICpCodeTemplate selectedCodeTemplate;

    ICpCodeTemplate getCpCodeTemplate(Object obj) {
        if (obj instanceof ICpCodeTemplate) {
            return (ICpCodeTemplate) obj;
        }
        return null;
    }

    class CodeTemplateContentProvider implements ITreeContentProvider {

        @Override
        public void dispose() {
            // does nothing
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // does nothing
        }

        @Override
        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        @Override
        public Object[] getChildren(Object parentElement) {
            ICpCodeTemplate codeTemplate = getCpCodeTemplate(parentElement);
            if (codeTemplate != null) {
                return codeTemplate.getChildArray();
            }
            return null;
        }

        @Override
        public Object getParent(Object element) {
            ICpCodeTemplate codeTemplate = getCpCodeTemplate(element);
            if (codeTemplate != null) {
                return codeTemplate.getParent();
            }
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            return getChildren(element) != null && getChildren(element).length > 0;
        }

    }

    class ComponentColumnLabelProvider extends ColumnLabelProvider {
        @Override
        public Image getImage(Object element) {
            return CpPlugInUI.getImage(CpPlugInUI.ICON_RTE);
        }

        @Override
        public String getText(Object element) {
            ICpCodeTemplate codeTemplate = getCpCodeTemplate(element);
            if (codeTemplate != null) {
                return codeTemplate.getComponentName();
            }
            return CmsisConstants.EMPTY_STRING;
        }
    }

    class NameColumnLabelProvider extends ColumnLabelProvider {
        @Override
        public Image getImage(Object element) {
            return null;
        }

        @Override
        public String getText(Object element) {
            ICpCodeTemplate codeTemplate = getCpCodeTemplate(element);
            if (codeTemplate != null) {
                return codeTemplate.getSelectionName();
            }
            return CmsisConstants.EMPTY_STRING;
        }
    }

    /**
     * Constructor for SampleNewWizardPage.
     * @param pageName
     */
    public CmsisCodeTemplateNewWizardPage(ISelection selection) {
        super(Messages.CmsisCodeTemplate_WizardPage);
        setTitle(Messages.CmsisCodeTemplate_Title);
        setDescription(Messages.CmsisCodeTemplate_Description);
        this.selection = selection;
    }

    @Override
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 3;
        //layout.verticalSpacing = 5;

        Label label = new Label(container, SWT.NULL);
        label.setText(Messages.CmsisCodeTemplateNewWizardPage_Project);
        projectText = new Text(container, SWT.BORDER | SWT.SINGLE);
        projectText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        projectText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                projectChanged();
            }
        });
        projectBrowse = new Button(container, SWT.PUSH);
        projectBrowse.setText(Messages.CmsisCodeTemplate_Browse);
        projectBrowse.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleProjectBrowse();
            }
        });

        fViewer = new TreeViewer(container,
                SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
        Tree tree = fViewer.getTree();
        GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
        gd_tree.heightHint = 300;
        tree.setLayoutData(gd_tree);
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        tree.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Object obj = e.item.getData();
                if (obj instanceof ICpCodeTemplate) {
                    selectedCodeTemplate = (ICpCodeTemplate) obj;
                    String[] codeTemplates = selectedCodeTemplate.getCodeTemplates();
                    if (codeTemplates.length == 0) {
                        fileText.setEditable(false);
                        fileText.setText(CmsisConstants.EMPTY_STRING);
                        return;
                    }
                    fileText.setEditable(true);
                    StringBuilder sb = new StringBuilder(Utils.extractFileName(codeTemplates[0]));
                    for (int i = 1; i < codeTemplates.length; i++) {
                        fileText.setEditable(false);
                        sb.append(' ');
                        sb.append(Utils.extractFileName(codeTemplates[i]));
                    }
                    fileText.setText(sb.toString());
                }
            }
        });

        TreeViewerColumn column0 = new TreeViewerColumn(fViewer, SWT.LEFT);
        column0.getColumn().setText(Messages.CmsisCodeTemplate_Component);
        column0.getColumn().setWidth(200);
        column0.setLabelProvider(new ComponentColumnLabelProvider());

        TreeViewerColumn column1 = new TreeViewerColumn(fViewer, SWT.LEFT);
        column1.getColumn().setText(Messages.CmsisCodeTemplate_Name);
        column1.getColumn().setWidth(320);
        column1.setLabelProvider(new NameColumnLabelProvider());

        fViewer.setContentProvider(new CodeTemplateContentProvider());

        IRteProject rteProject = getRteProject();
        if (rteProject != null) {
            ICpCodeTemplate codeTemplate = rteProject.getRteConfiguration().getCmsisCodeTemplate();
            fViewer.setInput(codeTemplate);
            fViewer.getControl().setFocus();
        }

        label = new Label(container, SWT.NULL);
        label.setText(Messages.CmsisCodeTemplate_Location);
        containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
        containerText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        containerText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                dialogChanged();
            }
        });
        containerBrowse = new Button(container, SWT.PUSH);
        containerBrowse.setText(Messages.CmsisCodeTemplate_Browse);
        containerBrowse.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleContainerBrowse();
            }
        });

        label = new Label(container, SWT.NULL);
        label.setText(Messages.CmsisCodeTemplate_FileName);
        fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
        fileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fileText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                dialogChanged();
            }
        });

        initialize();
        projectChanged();
        setControl(container);
        new Label(container, SWT.NONE);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent.getParent(), IHelpContextIds.CODE_TEMPLATE_WIZARD);
    }

    /**
     * Tests if the current workbench selection is a suitable container to use.
     */
    private void initialize() {
        if (selection != null && selection.isEmpty() == false && selection instanceof IStructuredSelection) {
            IStructuredSelection ssel = (IStructuredSelection) selection;
            if (ssel.size() > 1) {
                return;
            }
            Object obj = ssel.getFirstElement();
            IContainer container = null;
            if (obj instanceof IResource) {
                if (obj instanceof IContainer) {
                    container = (IContainer) obj;
                } else {
                    container = ((IResource) obj).getParent();
                }
            } else if (obj instanceof IAdaptable) {
                IAdaptable adaptable = (IAdaptable) obj;
                IResource res = (IResource) adaptable.getAdapter(IResource.class);
                if (res == null) {
                    return;
                }
                if (res instanceof IContainer) {
                    container = (IContainer) res;
                } else {
                    container = res.getParent();
                }
            }
            if (container != null) {
                projectText.setText(container.getProject().getName());
                projectText.setEditable(false);
                projectBrowse.setEnabled(false);
                containerText.setText(container.getFullPath().toString());
            }
        }
        if (getProjectName().isEmpty()) {
            containerText.setEditable(false);
            containerBrowse.setEnabled(false);
            fileText.setEditable(false);
        }
    }

    private IRteProject getRteProject() {
        if (selection != null && selection.isEmpty() == false && selection instanceof IStructuredSelection) {
            IStructuredSelection ssel = (IStructuredSelection) selection;
            if (ssel.size() > 1) {
                return null;
            }
            Object obj = ssel.getFirstElement();
            IResource res = ProjectUtils.getResource(obj);
            if (res != null) {
                return CpProjectPlugIn.getRteProjectManager().getRteProject(res.getProject());
            }
        }
        return null;
    }

    /**
     * Open the browser to select project
     */
    void handleProjectBrowse() {
        Set<IRteProject> rteProjects = new HashSet<IRteProject>();
        for (IRteProject p : CpProjectPlugIn.getRteProjectManager().getRteProjects()) {
            if (p.getProject().isOpen()) {
                rteProjects.add(p);
            }
        }
        ProjectSelectionDialog dialog = new ProjectSelectionDialog(getShell(), rteProjects);
        if (dialog.open() == Window.OK) {
            Object[] result = dialog.getResult();
            if (result != null && result.length == 1) {
                projectText.setText(((IRteProject) result[0]).getName());
            }
        }
    }

    /**
     * Uses the standard container selection dialog to choose the new value for
     * the container field.
     */
    void handleContainerBrowse() {
        ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(),
                ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectName()), false,
                Messages.CmsisCodeTemplate_SelectFolder);
        dialog.showClosedProjects(false);
        if (dialog.open() == Window.OK) {
            Object[] result = dialog.getResult();
            if (result.length == 1) {
                containerText.setText(((Path) result[0]).toString());
            }
        }
    }

    void projectChanged() {
        containerText.setEditable(false);
        containerBrowse.setEnabled(false);
        if (getProjectName().isEmpty()) {
            fViewer.setInput(null);
            updateStatus(Messages.CmsisCodeTemplateNewWizardPage_ProjectMustBeSpecified);
            return;
        }
        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectName());
        if (!project.exists() || (project.getType() & IResource.PROJECT) == 0) {
            fViewer.setInput(null);
            updateStatus(Messages.CmsisCodeTemplateNewWizardPage_ProjectMustExist);
            return;
        }
        if (!refreshComponents(project)) {
            fViewer.setInput(null);
            updateStatus(Messages.CmsisCodeTemplate_RefreshRTEProject);
            return;
        }
        containerText.setEditable(true);
        containerBrowse.setEnabled(true);
        dialogChanged();
    }

    /**
     * Ensures that location and file are set.
     */
    void dialogChanged() {
        IResource container = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(getContainerName()));
        String fileName = getFileName();

        if (getContainerName().isEmpty()) {
            updateStatus(Messages.CmsisCodeTemplate_FileContainerNotSpecified);
            return;
        }
        if (container == null || (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
            updateStatus(Messages.CmsisCodeTemplate_FileContainerNotExist);
            return;
        }
        String[] segments = container.getFullPath().segments();
        if (!segments[0].equals(getProjectName())) {
            updateStatus(Messages.CmsisCodeTemplateNewWizardPage_LocationNotUnderProject);
            return;
        }
        if (!container.isAccessible()) {
            updateStatus(Messages.CmsisCodeTemplate_ProjectNotWritable);
            return;
        }

        segments = container.getProjectRelativePath().segments();
        if (segments.length > 0 && segments[0].equals(CmsisConstants.RTE)) {
            updateStatus(Messages.CmsisCodeTemplate_FileUnderRTEFolder);
            return;
        }
        if (fileName.length() == 0) {
            updateStatus(Messages.CmsisCodeTemplate_FileNameNotSpecified);
            return;
        }
        if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
            updateStatus(Messages.CmsisCodeTemplate_FileNameNotValid);
            return;
        }
        int dotLoc = fileName.lastIndexOf('.');
        if (dotLoc == -1) {
            updateStatus(Messages.CmsisCodeTemplate_FileExtensionNotConsistent);
            return;
        }
        String ext = fileName.substring(dotLoc + 1);
        if (!extIsValid(ext)) {
            updateStatus(Messages.CmsisCodeTemplate_FileExtensionNotConsistent);
            return;
        }
        updateStatus(null);
    }

    private boolean extIsValid(String ext) {
        if (selectedCodeTemplate == null) {
            return false;
        }
        if (selectedCodeTemplate.getCodeTemplates().length != 1) {
            return true;
        }
        String templateExt = Utils.extractFileExtension(selectedCodeTemplate.getCodeTemplates()[0]);
        String fileExt = Utils.extractFileExtension(fileText.getText());
        if (templateExt.equals(fileExt)) {
            return true;
        }
        return false;
    }

    private void updateStatus(String message) {
        setErrorMessage(message);
        setPageComplete(message == null);
    }

    /**
     * @param resource
     * @return true if the fViewer has updated its input, false otherwise
     */
    protected boolean refreshComponents(IProject project) {
        IRteProject rteProject = CpProjectPlugIn.getRteProjectManager().getRteProject(project);
        if (rteProject != null) {
            ICpCodeTemplate codeTemplate = rteProject.getRteConfiguration().getCmsisCodeTemplate();
            fViewer.setInput(codeTemplate);
            fViewer.getControl().setFocus();
            return true;
        }
        return false;
    }

    public String getProjectName() {
        return projectText.getText();
    }

    public String getContainerName() {
        return containerText.getText();
    }

    public String getFileName() {
        return fileText.getText();
    }

    public String[] getCodeTemplateFileNames() {
        String[] fileNames = new String[selectedCodeTemplate.getCodeTemplates().length];
        for (int i = 0; i < fileNames.length; i++) {
            fileNames[i] = selectedCodeTemplate.getAbsolutePath(selectedCodeTemplate.getCodeTemplates()[i]);
        }
        return fileNames;
    }
}