com.nokia.carbide.cpp.internal.pi.wizards.ui.NewPIWizardPagePkgListTask.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.pi.wizards.ui.NewPIWizardPagePkgListTask.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 the License "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: 
 *
 */

package com.nokia.carbide.cpp.internal.pi.wizards.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.FileDialog;
import org.eclipse.ui.PlatformUI;

import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
import com.nokia.carbide.cdt.builder.project.ISISBuilderInfo;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.CarbidePiWizardHelpIds;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.IPkgEntry;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.PkgEntryList;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.PkgListTree;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.PkgListTreeContentProvider;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.PkgListTreeLabelProvider;
import com.nokia.carbide.cpp.internal.pi.wizards.ui.util.PkgListTreeViewer;

public class NewPIWizardPagePkgListTask extends NewPIWizardPage implements INewPIWizardSettings {

    // control
    private Composite composite = null;
    //   private Label label = null;
    private PkgListTreeViewer projectTreeViewer;
    private Composite filelistComposite = null;
    private Composite buttonComposite = null;
    private Button addPkgButton = null;
    private Button removeButton = null;
    private boolean isSisBuilderConfigurationChecked;
    private PkgListTreeContentProvider pkgListTreeContentProvider;

    // data model
    PkgListTree pkgListRoot = null;

    protected NewPIWizardPagePkgListTask() {
        super(""); //$NON-NLS-1$
        setTitle(Messages.getString("NewPIWizardPagePkgListTask.title")); //$NON-NLS-1$
        setDescription(Messages.getString("NewPIWizardPagePkgListTask.description")); //$NON-NLS-1$
    }

    public void createControl(Composite parent) {
        super.createControl(parent);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(gridLayout);
        //      label = new Label(composite, SWT.NONE);
        //      label.setText(Messages.getString("NewPIWizardPagePkgListTask.label")); //$NON-NLS-1$
        createFilelistComposite();
        setControl(composite);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
                CarbidePiWizardHelpIds.PI_IMPORT_WIZARD_PKG_LIST);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.DialogPage#performHelp()
     */
    @Override
    public void performHelp() {
        WizardDialog wizardDialog = (WizardDialog) getContainer();
        if (wizardDialog.buttonBar != null) {
            PlatformUI.getWorkbench().getHelpSystem().setHelp(wizardDialog.buttonBar,
                    CarbidePiWizardHelpIds.PI_IMPORT_WIZARD_PKG_LIST);
        }
    }

    /**
     * This method initializes filelistComposite   
     *
     */
    private void createFilelistComposite() {
        GridLayout gridLayout2 = new GridLayout();
        gridLayout2.numColumns = 2;
        filelistComposite = new Composite(composite, SWT.NONE);
        filelistComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        filelistComposite.setLayout(gridLayout2);
        projectTreeViewer = new PkgListTreeViewer(filelistComposite, SWT.H_SCROLL | SWT.BORDER);
        pkgListRoot = new PkgListTree();
        projectTreeViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        projectTreeViewer
                .setContentProvider(pkgListTreeContentProvider = new PkgListTreeContentProvider(pkgListRoot));
        projectTreeViewer.setLabelProvider(new DecoratingLabelProvider(new PkgListTreeLabelProvider(),
                PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
        projectTreeViewer.setInput(pkgListRoot);
        projectTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent arg0) {
                ISelection selection = arg0.getSelection();
                // if selecting disabled item, ditch the selection and restore viewer
                // selection using data object
                if (selection instanceof TreeSelection) {
                    TreeSelection treeSelection = (TreeSelection) selection;
                    TreePath[] paths = treeSelection.getPaths();
                    if (paths.length == 1) {
                        if (projectTreeViewer.getElementEnabled(paths[0].getLastSegment()) == false) {
                            setupPageFromFromNewPIWizardSettings();
                        }
                    }
                }
                NewPIWizardSettings npiws = NewPIWizardSettings.getInstance();
                npiws.selectedAppFileList.clear();
                for (IPkgEntry pkg : projectTreeViewer.getSelectedPkgs()) {
                    npiws.selectedAppFileList.add(pkg);
                }
                npiws.selectedProjectList.clear();
                for (IProject project : projectTreeViewer.getSelectedProjects()) {
                    npiws.selectedProjectList.add(project);
                }
                npiws.selectedBuildConfigList.clear();
                for (ICarbideBuildConfiguration config : projectTreeViewer.getSelectedConfigs()) {
                    npiws.selectedBuildConfigList.add(config);
                }
                npiws.availableAppFileList.clear();
                IPkgEntry[] allPkg = pkgListRoot.getPkgEntries();
                for (IPkgEntry pkg : allPkg) {
                    npiws.availableAppFileList.add(pkg);
                }
            }
        });
        projectTreeViewer.expandToLevel(2); // just to project level

        createButtonComposite();
    }

    /**
     * This method initializes buttonComposite   
     *
     */
    private void createButtonComposite() {
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        buttonComposite = new Composite(filelistComposite, SWT.NONE);
        buttonComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
        buttonComposite.setLayout(gridLayout);
        addPkgButton = new Button(buttonComposite, SWT.PUSH);
        addPkgButton.setText(Messages.getString("NewPIWizardPagePkgListTask.pkg.button")); //$NON-NLS-1$
        removeButton = new Button(buttonComposite, SWT.PUSH);
        removeButton.setText(Messages.getString("NewPIWizardPagePkgListTask.remove.button")); //$NON-NLS-1$

        GridData buttonWidthGridData = new GridData();
        buttonWidthGridData.widthHint = Math.max(addPkgButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x,
                removeButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        addPkgButton.setLayoutData(buttonWidthGridData);
        removeButton.setLayoutData(buttonWidthGridData);
        addPkgButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleAddPkg();
            }
        });
        removeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleRemovePkg();
            }
        });
    }

    private void handleAddPkg() {
        String pkgFilePath;
        FileDialog dialog = new FileDialog(getShell());
        String[] pkgExtensions = { "*.pkg", //$NON-NLS-1$
                "*.*" }; //$NON-NLS-1$
        String[] pkgNames = { Messages.getString("NewPIWizardPagePkgListTask.pkg.filter.name"), //$NON-NLS-1$
                Messages.getString("NewPIWizardPagePkgListTask.all.filter.name") }; //$NON-NLS-1$
        dialog.setFilterExtensions(pkgExtensions);
        dialog.setFilterNames(pkgNames);
        pkgFilePath = dialog.open();

        if (pkgFilePath != null) {
            NewPIWizardPagePkgSdkDialog sdkDialog = new NewPIWizardPagePkgSdkDialog(getShell());
            if (sdkDialog.open() == NewPIWizardPagePkgSdkDialog.OK) {
                IPkgEntry pkgEntry = PkgEntryList.getInstance().getPkgEntry(pkgFilePath, sdkDialog.getSelection());
                boolean found = false;
                for (IPkgEntry entry : pkgListRoot.getPkgEntries()) {
                    if (pkgEntry.equals(entry)) {
                        found = true;
                        break;
                    }
                }
                if (found == false) {
                    pkgListRoot.addPkgEntry(pkgEntry);
                }
                removeButton.setEnabled(pkgListRoot.getPkgEntries().length != 0);
                // only expanded/visible items are available for selecting programatically
                projectTreeViewer.reveal(pkgEntry);
                // This shows the new PKG in UI and force associate of the new PKG, so we can select later
                projectTreeViewer.refresh();
                //projectTreeViewer.initializeSelectedItems(selectedObjects.toArray());
                // reveal is not necessary, but we do it for safety
            }
        }
    }

    private void handleRemovePkg() {
        NewPIWizardRemovePkgDialog removeDialog = new NewPIWizardRemovePkgDialog(getShell(),
                pkgListRoot.getPkgEntries());
        removeDialog.open();
        IPkgEntry[] removeList = removeDialog.getRemovedList();
        if (removeList != null) {
            for (int i = 0; i < removeList.length; i++) {
                pkgListRoot.removePkgEntry(removeList[i]);
            }
            removeButton.setEnabled(pkgListRoot.getPkgEntries().length != 0);
            projectTreeViewer.refresh();
        }
    }

    public void setupPageFromFromNewPIWizardSettings() {
        NewPIWizardSettings npiws = NewPIWizardSettings.getInstance();
        ArrayList<TreePath> selectedPath = new ArrayList<TreePath>();
        pkgListRoot.removeAllPkgEntries();

        // Build TreePath for all selected configurations and their project parent
        ICarbideBuildConfiguration needToUnselect = null;
        for (ICarbideBuildConfiguration selected : npiws.selectedBuildConfigList) {
            List<ISISBuilderInfo> sisBuilderInfoList = selected.getSISBuilderInfoList();
            boolean allPkgGood = true && sisBuilderInfoList.size() > 0;
            for (ISISBuilderInfo sisBuilderInfo : sisBuilderInfoList) {
                if (sisBuilderInfo == null) {
                    allPkgGood = false;
                } else if (sisBuilderInfo.getPKGFullPath().toFile().exists() == false) {
                    allPkgGood = false;
                }

            }
            if (allPkgGood) {
                TreePath configPath = projectTreeViewer.getTreePathForElement(selected);
                if (configPath != null) {
                    selectedPath.add(configPath);
                }
                // check the project as well
                TreePath projectPath = projectTreeViewer
                        .getTreePathForElement(selected.getCarbideProject().getProject());
                if (projectPath != null) {
                    selectedPath.add(projectPath);
                }
            } else {
                needToUnselect = selected; // selected configuration have non-exist PKG, need to unselect this later
            }
        }
        if (needToUnselect != null) {
            npiws.selectedBuildConfigList.remove(needToUnselect);
        }
        for (IProject selected : npiws.selectedProjectList) {
            // We deal with this when we set a build config
        }
        for (IPkgEntry entry : npiws.availableAppFileList) {
            pkgListRoot.addPkgEntry(entry);
            // only expanded/visible items are available for selecting programatically
            projectTreeViewer.reveal(entry);
        }
        removeButton.setEnabled(pkgListRoot.getPkgEntries().length != 0);
        // Build TreePath for all selected PKG
        for (IPkgEntry selected : npiws.selectedAppFileList) {
            TreePath pkgPath = projectTreeViewer.getTreePathForElement(selected);
            if (pkgPath != null) {
                selectedPath.add(pkgPath);
            }
        }

        // This shows the change in model(e.g. adding PKG) and force associate of the new tree nodes, so we can select later
        projectTreeViewer.refresh();
        projectTreeViewer.initializeSelectedItems(selectedPath.toArray(new TreePath[selectedPath.size()]));
        // Show the selection
        projectTreeViewer.refresh();
    }

    public void validatePage() {
    }

    @Override
    public void setVisible(boolean visable) {
        super.setVisible(visable);
        // show possible sis builder configuration warnings once during the wizard session
        if (visable && !isSisBuilderConfigurationChecked) {
            isSisBuilderConfigurationChecked = true;
            pkgListTreeContentProvider.getCarbideCppProjects(true);
        }
    }

}