com.nokia.tools.variant.confml.ui.wizards.NewConfigurationWizardPageOne.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.variant.confml.ui.wizards.NewConfigurationWizardPageOne.java

Source

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 * 
 * Initial Contributors:
 * Nokia Corporation - Initial contribution
 * 
 * Contributors:
 * 
 * Description: This file is part of com.nokia.tools.variant.confml.ui component.
 */

package com.nokia.tools.variant.confml.ui.wizards;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE.SharedImages;

import com.nokia.tools.variant.confml.core.ConfMLCore;
import com.nokia.tools.vct.common.appmodel.EConfigurationProject;
import com.nokia.tools.vct.common.ui.wizards.dialogfields.DialogField;
import com.nokia.tools.vct.common.ui.wizards.dialogfields.IDialogFieldListener;
import com.nokia.tools.vct.common.ui.wizards.dialogfields.LayoutUtil;
import com.nokia.tools.vct.common.ui.wizards.dialogfields.PathDialogField;

public class NewConfigurationWizardPageOne extends WizardPage {

    class ViewerGroup extends Observable implements IDialogFieldListener {

        private TreeViewer viewer;
        private IResource basedOn = null;

        public ViewerGroup(IResource initial) {
            this.basedOn = initial;
        }

        public ISelection getSelection() {
            return viewer.getSelection();
        }

        private void fireEvent() {
            setChanged();
            notifyObservers();
        }

        public void dialogFieldChanged(DialogField field) {
            fireEvent();
            // notifyViewerGroup(field);
        }

        public Control createControl(Composite parent) {

            Composite comp = new Composite(parent, SWT.NONE);
            GridLayout layout = initGridLayout(new GridLayout(3, false), false);
            comp.setLayout(layout);
            comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            // comp.setLayout(new FillLayout());
            Label label = new Label(comp, SWT.NONE);
            label.setText("Based on configuration:");
            GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1);
            label.setLayoutData(gd);
            // comp.setLayoutData(new GridData(GridData.FILL, SWT.FILL, true, false));         

            viewer = new TreeViewer(comp);
            gd = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
            gd.heightHint = 300;
            viewer.getControl().setLayoutData(gd);
            viewer.setContentProvider(new ITreeContentProvider() {
                public Object[] getChildren(Object element) {
                    List<Object> result = new ArrayList<Object>();

                    if (element instanceof IWorkspaceRoot) {
                        IWorkspaceRoot root = (IWorkspaceRoot) element;
                        IProject[] projects = root.getProjects();
                        for (int i = 0; i < projects.length; i++) {
                            result.add(projects[i]);
                        }
                    } else if (element instanceof IProject) {
                        IProject cnt = (IProject) element;
                        IResource[] members = {};
                        try {
                            members = cnt.members();
                        } catch (CoreException e) {
                            // ignore
                        }
                        for (IResource resource : members) {
                            if (resource instanceof IFile && resource.getName().endsWith("confml")) {
                                result.add(resource);
                            }
                        }
                    } else {
                    }
                    return result.toArray();
                }

                public Object getParent(Object element) {
                    if (element instanceof IResource) {
                        return ((IResource) element).getParent();
                    }
                    return null;
                }

                public boolean hasChildren(Object element) {
                    if (element instanceof IContainer) {
                        IContainer cnt = (IContainer) element;
                        try {
                            IResource[] members = cnt.members();
                            return members.length != 0;
                        } catch (CoreException e) {
                            e.printStackTrace();
                        }
                    }
                    return false;
                }

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

                public void dispose() {
                }

                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                }

            });
            viewer.setLabelProvider(new LabelProvider() {
                public Image getImage(Object obj) {
                    String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
                    if (obj instanceof IProject) {
                        imageKey = SharedImages.IMG_OBJ_PROJECT;
                    } else if (obj instanceof IFile) {
                        imageKey = ISharedImages.IMG_OBJ_FILE;
                    }
                    return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
                }

                @Override
                public String getText(Object element) {
                    if (element instanceof IResource) {
                        return ((IResource) element).getName();
                    }
                    if (element instanceof IProject) {
                        return ((IProject) element).getName();
                    }
                    return "null";
                }
            });
            viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());

            viewer.addSelectionChangedListener(new ISelectionChangedListener() {
                public void selectionChanged(SelectionChangedEvent event) {
                    ITreeSelection sel = (ITreeSelection) viewer.getSelection();

                    Object selected = sel.getFirstElement();
                    if (selected instanceof IResource) {
                        IResource res = (IResource) selected;
                        viewerGroup.setBasedOn(res);
                    }
                }
            });

            if (basedOn != null) {
                viewer.setSelection(new StructuredSelection(basedOn), true);
            }
            return comp;
        }

        protected void setBasedOn(IResource res) {
            this.basedOn = res;
            fireEvent();
        }

        protected IResource getBasedOn() {
            return this.basedOn;
        }

    }

    private class PathGroup extends Observable implements IDialogFieldListener {
        private final PathDialogField nameField;

        public PathGroup() {
            nameField = new PathDialogField();
            nameField.setLabelText("Configuration Name:");
            nameField.setDialogFieldListener(this);
        }

        private void fireEvent() {
            setChanged();
            notifyObservers();
        }

        public void dialogFieldChanged(DialogField field) {
            fireEvent();
        }

        public Control createControl(Composite composite) {
            final int numColumns = 3;
            final Composite group = new Composite(composite, SWT.NONE);
            group.setLayout(initGridLayout(new GridLayout(numColumns, false), false));
            nameField.doFillIntoGrid(group, numColumns);
            LayoutUtil.setHorizontalGrabbing(nameField.getTextControl(null));

            return group;
        }

    }

    private class Validator implements Observer {
        public void update(Observable o, Object arg) {

            IResource basedOn = viewerGroup.getBasedOn();
            if (basedOn == null) {
                setErrorMessage("Based on configuration: Based on configuration must be selected.");
                setMessage(null);
                setPageComplete(false);
                return;
            }

            IPath namePath = pathGroup.nameField.getPath();
            if (namePath == null) {
                setErrorMessage("Configuration name: the configuration name is empty.");
                setMessage(null);
                setPageComplete(false);
                return;
            }
            String name = namePath.toString();
            String ext = WizardUtils.getExtension(name);

            if (ext != null && !"confml".equals(ext)) {
                setErrorMessage("Configuration name: the configuration has incorrect file extension.");
                setMessage(null);
                setPageComplete(false);
                return;
            } else {
                if (ext == null) {
                    name = name + ".confml";
                }
            }

            IProject project = basedOn.getProject();
            IFile file = project.getFile(name);

            if (file.exists()) {
                setErrorMessage("Configuration name: the configuration already exists.");
                setMessage(null);
                setPageComplete(false);
                return;
            }

            EConfigurationProject cp = ConfMLCore.getProjectModel(project);
            if (cp == null) {
                setErrorMessage(
                        "Based on configuration: the selected project does not contain variant definition.");
                setMessage(null);
                setPageComplete(false);
                return;
            }

            setErrorMessage(null);
            setMessage(null);
            setPageComplete(true);
        }
    };

    static final String PAGE_NAME = "NewConfigurationLayerWizardPageOne";

    private final PathGroup pathGroup;
    private final Validator validator;
    private final ViewerGroup viewerGroup;

    /**
     * Constructor for SampleNewWizardPage.
     * @param selection 
     * 
     * @param pageName
     */
    public NewConfigurationWizardPageOne(IStructuredSelection selection) {
        super(PAGE_NAME);
        setTitle("Create new Configuration");
        setDescription("This wizard creates a new configuration based on existing one.");
        setPageComplete(false);

        viewerGroup = new ViewerGroup(setInitialSelection(selection));

        pathGroup = new PathGroup();
        validator = new Validator();
        pathGroup.addObserver(validator);
        viewerGroup.addObserver(validator);
    }

    /**
     * @see IDialogPage#createControl(Composite)
     */
    public void createControl(Composite parent) {
        initializeDialogUnits(parent);

        final Composite composite = new Composite(parent, SWT.NULL);
        composite.setFont(parent.getFont());
        composite.setLayout(initGridLayout(new GridLayout(1, false), true));
        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));

        viewerGroup.createControl(composite);

        // create UI elements
        Control pathControl = createPathControl(composite);
        pathControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        //      Control contentTypeControl = createContentTypeControl(composite);
        //      contentTypeControl
        //            .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        setControl(composite);
    }

    private Control createPathControl(Composite composite) {
        Control control = pathGroup.createControl(composite);
        return control;
    }

    private GridLayout initGridLayout(GridLayout layout, boolean margins) {
        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        if (margins) {
            layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
            layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        } else {
            layout.marginWidth = 0;
            layout.marginHeight = 0;
        }
        return layout;
    }

    public IResource setInitialSelection(IStructuredSelection selection) {
        Object[] items = selection.toArray();
        for (int i = 0; i < items.length; i++) {
            Object item = items[i];
            if (item instanceof IResource) {
                IResource res = (IResource) item;
                if (res instanceof IProject) {
                    return res;
                } else {
                    if (res.getParent() instanceof IProject) {
                        return res;
                    } else {
                        return res.getProject();
                    }
                }
            }

        }
        return null;
    }

    public IResource getBasedOn() {
        return viewerGroup.getBasedOn();
    }

    public IResource getNewConfigurationRoot() {
        String name = pathGroup.nameField.getText();
        if (!name.endsWith(".confml")) {
            name = name + ".confml";
        }
        return getBasedOn().getProject().getFile(name);
    }
}