com.nokia.cdt.internal.debug.launch.ui.InstallationTab.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.cdt.internal.debug.launch.ui.InstallationTab.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.cdt.internal.debug.launch.ui;

import java.io.File;

import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.launch.ui.CLaunchConfigurationTab;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.Dialog;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;

import com.freescale.swt.widgets.CheckboxGroup;
import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDKFeatures;
import com.nokia.cdt.internal.debug.launch.LaunchPlugin;
import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;

import cwdbg.PreferenceConstants;

public class InstallationTab extends CLaunchConfigurationTab implements ICProjectDescriptionListener {

    private ILaunchConfiguration configuration;

    private Label hostLabel;
    private Text hostPath;
    private Button hostBrowse;
    private Label puLabel;
    private Text puPath;
    private Link puLink;
    private Label targetLabel;
    private Text targetPath;
    private Button forceInstall;
    private CheckboxGroup installerUIGroup;
    private Label driveLabel;
    private Combo drive;

    private String driveLetterArray[] = { "A", "B", "C", "D", "E", "F", "G" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$

    /* (non-Javadoc)
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        Composite comp = new Composite(parent, SWT.NONE);
        setControl(comp);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), LaunchTabHelpIds.RUN_MODE_INSTALLATION);

        GridLayout topLayout = new GridLayout();
        topLayout.numColumns = 2;
        comp.setLayout(topLayout);

        createVerticalSpacer(comp, 1);
        createSisGroup(comp, 1);
        createVerticalSpacer(comp, 1);
        createInstallerUIGroup(comp, 1);
        createVerticalSpacer(comp, 1);
        createPUInstallerUIGroup(comp, 1);

        Dialog.applyDialogFont(parent);
        checkControlState();
    }

    protected void createSisGroup(Composite parent, int colSpan) {
        Composite projComp = new Composite(parent, SWT.NONE);
        GridLayout projLayout = new GridLayout();
        projLayout.numColumns = 2;
        projLayout.marginHeight = 0;
        projLayout.marginWidth = 0;
        projComp.setLayout(projLayout);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = colSpan;
        projComp.setLayoutData(data);

        hostLabel = new Label(projComp, SWT.NONE);
        hostLabel.setText(Messages.getString("InstallationTab.1")); //$NON-NLS-1$
        data = new GridData();
        data.horizontalSpan = 2;
        hostLabel.setLayoutData(data);
        hostLabel.setToolTipText(Messages.getString("InstallationTab.2")); //$NON-NLS-1$
        hostLabel.setData(".uid", "InstallationTab.hostLabel"); //$NON-NLS-1$ //$NON-NLS-2$

        hostPath = new Text(projComp, SWT.BORDER);
        data = new GridData(GridData.FILL_HORIZONTAL);
        hostPath.setLayoutData(data);
        hostPath.setToolTipText(Messages.getString("InstallationTab.2")); //$NON-NLS-1$
        hostPath.setData(".uid", "InstallationTab.hostPath"); //$NON-NLS-1$ //$NON-NLS-2$
        hostPath.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                updatePULabel();
                updateLaunchConfigurationDialog();
            }
        });

        hostBrowse = createPushButton(projComp, Messages.getString("InstallationTab.3"), null); //$NON-NLS-1$
        hostBrowse.setData(".uid", "InstallationTab.hostBrowse"); //$NON-NLS-1$ //$NON-NLS-2$
        hostBrowse.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent evt) {
                FileDialog dialog = new FileDialog(getShell(), SWT.NONE);

                dialog.setText(Messages.getString("InstallationTab.4")); //$NON-NLS-1$
                dialog.setFilterExtensions(new String[] { "*.sis*", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
                dialog.setFilterNames(new String[] { Messages.getString("InstallationTab.27"), //$NON-NLS-1$
                        Messages.getString("InstallationTab.28") }); //$NON-NLS-1$

                BrowseDialogUtils.initializeFrom(dialog, hostPath);

                String result = dialog.open();
                if (result != null && new File(result).exists()) {
                    hostPath.setText(result);
                    updatePULabel();
                    updateLaunchConfigurationDialog();
                }
            }
        });

        targetLabel = new Label(projComp, SWT.NONE);
        targetLabel.setText(Messages.getString("InstallationTab.5")); //$NON-NLS-1$
        data = new GridData();
        data.horizontalSpan = 2;
        targetLabel.setLayoutData(data);
        targetLabel.setToolTipText(Messages.getString("InstallationTab.6")); //$NON-NLS-1$
        targetLabel.setData(".uid", "InstallationTab.targetLabel"); //$NON-NLS-1$ //$NON-NLS-2$

        targetPath = new Text(projComp, SWT.BORDER);
        data = new GridData(GridData.FILL_HORIZONTAL);
        targetPath.setLayoutData(data);
        targetPath.setToolTipText(Messages.getString("InstallationTab.6")); //$NON-NLS-1$
        targetPath.setData(".uid", "InstallationTab.targetPath"); //$NON-NLS-1$ //$NON-NLS-2$
        targetPath.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                updateLaunchConfigurationDialog();
            }
        });

        createVerticalSpacer(projComp, 2);

        forceInstall = createCheckButton(projComp, Messages.getString("InstallationTab.7")); //$NON-NLS-1$
        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        data.horizontalSpan = 2;
        forceInstall.setLayoutData(data);
        forceInstall.setToolTipText(Messages.getString("InstallationTab.8")); //$NON-NLS-1$
        forceInstall.setData(".uid", "InstallationTab.forceInstall"); //$NON-NLS-1$ //$NON-NLS-2$
        forceInstall.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateLaunchConfigurationDialog();
            }
        });
    }

    protected void createInstallerUIGroup(Composite parent, int colSpan) {
        Composite projComp = new Composite(parent, SWT.NONE);
        GridLayout projLayout = new GridLayout();
        projLayout.numColumns = 2;
        projLayout.marginHeight = 0;
        projLayout.marginWidth = 0;
        projComp.setLayout(projLayout);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = colSpan;
        projComp.setLayoutData(data);

        installerUIGroup = new CheckboxGroup(projComp, SWT.CHECK);
        installerUIGroup.setText(Messages.getString("InstallationTab.9")); //$NON-NLS-1$
        data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 2;
        installerUIGroup.setLayoutData(data);
        installerUIGroup.setToolTipText(Messages.getString("InstallationTab.10")); //$NON-NLS-1$
        installerUIGroup.getGroup().setLayout(projLayout);
        installerUIGroup.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateLaunchConfigurationDialog();
            }
        });

        driveLabel = new Label(installerUIGroup.getGroup(), SWT.NONE);
        driveLabel.setText(Messages.getString("InstallationTab.11")); //$NON-NLS-1$
        data = new GridData();
        data.horizontalSpan = 1;
        driveLabel.setLayoutData(data);
        driveLabel.setToolTipText(Messages.getString("InstallationTab.12")); //$NON-NLS-1$
        driveLabel.setData(".uid", "InstallationTab.driveLabel"); //$NON-NLS-1$ //$NON-NLS-2$
        drive = new Combo(installerUIGroup.getGroup(), SWT.READ_ONLY);
        for (int i = 0; i < driveLetterArray.length; i++) {
            drive.add(driveLetterArray[i]);
        }
        data = new GridData();
        data.horizontalSpan = 1;
        drive.setLayoutData(data);
        drive.setToolTipText(Messages.getString("InstallationTab.12")); //$NON-NLS-1$

        drive.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                updateLaunchConfigurationDialog();
            }
        });
    }

    protected void createPUInstallerUIGroup(Composite parent, int colSpan) {
        Composite projComp = new Composite(parent, SWT.NONE);
        GridLayout projLayout = new GridLayout();
        projLayout.numColumns = 2;
        projLayout.marginHeight = 0;
        projLayout.marginWidth = 0;
        projComp.setLayout(projLayout);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = colSpan;
        projComp.setLayoutData(data);

        puLabel = new Label(projComp, SWT.NONE);
        puLabel.setText(Messages.getString("InstallationTab.puLabel")); //$NON-NLS-1$
        data = new GridData();
        data.horizontalSpan = 2;
        puLabel.setLayoutData(data);
        puLabel.setToolTipText(Messages.getString("InstallationTab.puTooltip")); //$NON-NLS-1$

        puPath = new Text(projComp, SWT.BORDER);
        data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 2;
        puPath.setLayoutData(data);
        puPath.setToolTipText(Messages.getString("InstallationTab.puTooltip")); //$NON-NLS-1$
        puPath.setEditable(false);

        puLink = new Link(projComp, SWT.NONE);
        puLink.setText("<a>" + Messages.getString("InstallationTab.puHyperlink") + "...</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        data = new GridData(GridData.FILL_HORIZONTAL);
        puLink.setLayoutData(data);
        puLink.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                // listen for events so we can detect if they click on the link below and change sis info.
                CoreModel.getDefault().getProjectDescriptionManager()
                        .addCProjectDescriptionListener(InstallationTab.this, CProjectDescriptionEvent.APPLIED);

                PreferencesUtil.createPropertyDialogOn(getShell(), getProject(),
                        "com.nokia.carbide.cdt.internal.builder.ui.CarbideBuildConfigurationsPage", null, null) //$NON-NLS-1$
                        .open();
            }
        });
    }

    /* (non-Javadoc)
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void setDefaults(ILaunchConfigurationWorkingCopy config) {
    }

    /* (non-Javadoc)
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
     */
    public void initializeFrom(ILaunchConfiguration configuration) {
        try {
            hostPath.setText(configuration.getAttribute(PreferenceConstants.J_PN_SisFileHostPath, "")); //$NON-NLS-1$
            targetPath.setText(configuration.getAttribute(PreferenceConstants.J_PN_SisFileTargetPath, "")); //$NON-NLS-1$
            forceInstall
                    .setSelection(configuration.getAttribute(PreferenceConstants.J_PN_AlwaysInstallSisFile, false));
            installerUIGroup
                    .setSelection(configuration.getAttribute(PreferenceConstants.J_PN_HideInstallerUI, true));
            drive.select(configuration.getAttribute(PreferenceConstants.J_PN_InstallToDrive, 2));

            // cache the configuration
            this.configuration = configuration;

            // update the pu stuff
            updatePULabel();

            checkControlState();
        } catch (CoreException e) {
            LaunchPlugin.log(e);
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
        configuration.setAttribute(PreferenceConstants.J_PN_SisFileHostPath, hostPath.getText());
        configuration.setAttribute(PreferenceConstants.J_PN_SisFileTargetPath, targetPath.getText());
        configuration.setAttribute(PreferenceConstants.J_PN_AlwaysInstallSisFile, forceInstall.getSelection());
        configuration.setAttribute(PreferenceConstants.J_PN_HideInstallerUI, installerUIGroup.getSelection());
        configuration.setAttribute(PreferenceConstants.J_PN_InstallToDrive, drive.getSelectionIndex());

    }

    /* (non-Javadoc)
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
     */
    public String getName() {
        return Messages.getString("InstallationTab.13"); //$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
     */
    public Image getImage() {
        return LaunchImages.get(LaunchImages.IMG_VIEW_INSTALLATION_TAB);
    }

    protected void checkControlState() {
    }

    public boolean isValid(ILaunchConfiguration config) {

        setErrorMessage(null);
        setMessage(null);

        boolean result = super.isValid(config);
        if (result) {
            String pcPath = hostPath.getText().trim();
            if (pcPath.length() < 1) {
                // allow this but put a note at the top about it.
                setMessage(Messages.getString("InstallationTab.14")); //$NON-NLS-1$
            } else {
                if (!new File(pcPath).exists()) {
                    setErrorMessage(Messages.getString("InstallationTab.15")); //$NON-NLS-1$
                }
            }

            String remotePath = targetPath.getText().trim();
            if (remotePath.length() < 1) {
                setErrorMessage(Messages.getString("InstallationTab.16")); //$NON-NLS-1$
                result = false;
            } else if (remotePath.length() < 3) {
                setErrorMessage(Messages.getString("InstallationTab.17")); //$NON-NLS-1$
                result = false;
            } else {
                char drive = remotePath.charAt(0);
                char colon = remotePath.charAt(1);
                if (!Character.isLetter(drive) || colon != ':') {
                    setErrorMessage(Messages.getString("InstallationTab.17")); //$NON-NLS-1$
                    result = false;
                }
            }

            // make sure the drive to install on matches the drive of the process to launch
            try {
                if (installerUIGroup.getSelection()) {
                    String remoteProcess = config.getAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, ""); //$NON-NLS-1$
                    if (remoteProcess.length() > 0) {
                        char driveLetter = remoteProcess.toUpperCase().charAt(0);
                        int driveIndex = drive.getSelectionIndex();
                        if (driveLetter != driveLetterArray[driveIndex].charAt(0)) {
                            setErrorMessage(Messages.getString("InstallationTab.18")); //$NON-NLS-1$
                            result = false;
                        }
                    }
                }
            } catch (CoreException e) {
                LaunchPlugin.log(e);
            }
        }

        return result;
    }

    @Override
    public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
        super.activated(workingCopy);

        // forces page to get focus so that help works without having to select some control first.
        getControl().setFocus();
    }

    private void updatePULabel() {
        puLabel.setVisible(false);
        puPath.setVisible(false);
        puLink.setVisible(false);
        puPath.setText(""); //$NON-NLS-1$

        if (configuration == null) {
            return;
        }

        try {
            ILaunchConfigurationWorkingCopy config = configuration.getWorkingCopy();
            String buildConfigName = config
                    .getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, "");
            if (buildConfigName.length() > 0) {
                IProject project = getProject();
                if (project != null) {
                    ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
                    if (cpi != null) {
                        for (ICarbideBuildConfiguration buildConfig : cpi.getBuildConfigurations()) {
                            if (buildConfig.getDisplayString().equals(buildConfigName)) {
                                // enable the controls for EKA2 configs
                                if (buildConfig.getSDK().getSupportedFeatures()
                                        .contains(ISymbianSDKFeatures.IS_EKA2)) {
                                    puLabel.setVisible(true);
                                    puPath.setVisible(true);
                                    puLink.setVisible(true);
                                }
                                IPath puSisPath = CarbideCPPBuilder.getPartialUpgradeSisPath(buildConfig,
                                        new Path(hostPath.getText().trim()));
                                if (puSisPath == null) {
                                    puPath.setText(Messages.getString("InstallationTab.puNotEnabled")); //$NON-NLS-1$
                                } else if (!puSisPath.toFile().exists()) {
                                    puPath.setText(Messages.getString("InstallationTab.puNotAvailable")); //$NON-NLS-1$
                                } else {
                                    puPath.setText(puSisPath.toOSString());
                                }
                                if (puSisPath != null && puSisPath.toFile().exists()) {
                                }
                                break;
                            }
                        }
                    }
                }
            }
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private IProject getProject() {
        try {
            String projectName = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
            if (projectName.length() > 0) {
                return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
            }
        } catch (CoreException e) {
            e.printStackTrace();
            LaunchPlugin.log(e);
        }
        return null;
    }

    public void handleEvent(CProjectDescriptionEvent event) {
        if (event.getProject() != getProject()) {
            return;
        }

        updatePULabel();
    }

    @Override
    public void dispose() {
        CoreModel.getDefault().getProjectDescriptionManager().removeCProjectDescriptionListener(this);
        super.dispose();
    }

}