com.nokia.s60tools.compatibilityanalyser.ui.wizards.ProductSDKSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.compatibilityanalyser.ui.wizards.ProductSDKSelectionPage.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:
*
*/
package com.nokia.s60tools.compatibilityanalyser.ui.wizards;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.s60tools.compatibilityanalyser.CompatibilityAnalyserPlugin;
import com.nokia.s60tools.compatibilityanalyser.data.BaselineProfile;
import com.nokia.s60tools.compatibilityanalyser.data.ProductSdkData;
import com.nokia.s60tools.compatibilityanalyser.data.SavingUserData;
import com.nokia.s60tools.compatibilityanalyser.model.CompatibilityAnalyserEngine;
import com.nokia.s60tools.compatibilityanalyser.resources.Messages;
import com.nokia.s60tools.compatibilityanalyser.ui.dialogs.BaselineEditor;
import com.nokia.s60tools.compatibilityanalyser.utils.BaselineProfileUtils;
import com.nokia.s60tools.compatibilityanalyser.utils.CompatibilityAnalyserUtils;
import com.nokia.s60tools.compatibilityanalyser.utils.FileMethods;
import com.nokia.s60tools.compatibilityanalyser.utils.GlobalDataReader;
import com.nokia.s60tools.compatibilityanalyser.utils.HelpContextIDs;
import com.nokia.s60tools.ui.wizards.S60ToolsWizardPage;

/**
 * 
 * Wizard Page of Analysis wizard, wherein Baseline profile
 * and Current SDK details can be given
 *
 */
public class ProductSDKSelectionPage extends S60ToolsWizardPage implements ModifyListener, SelectionListener {

    private Composite composite;
    private String[] sdkNames;
    private String[] sdkVersions;
    private int size = 0;
    private List<ISymbianSDK> loadedSdks;

    private CompatibilityAnalyserEngine engine;
    public Combo profileCombo;
    private SavingUserData prevData = new SavingUserData();
    private String[] basics;
    private Button configure;
    private IPreferenceStore prefStore = CompatibilityAnalyserPlugin.getCompatabilityAnalyserPrefStore();

    Label epocDirectory;
    Combo sdkNameCombo;
    Combo versionCombo;
    Button headersButton;
    Button libsButton;
    ISymbianSDK selectedSDK;

    private String targetPath = null;
    private String targetURL = null;
    private String downloadStatus;

    public ProductSDKSelectionPage(CompatibilityAnalyserEngine engine) {
        super(Messages.getString("ProductSDKSelectionPage.title")); //$NON-NLS-1$

        setTitle(Messages.getString("ProductSDKSelectionPage.PageTitle")); //$NON-NLS-1$
        setDescription(Messages.getString("ProductSDKSelectionPage.Descreption")); //$NON-NLS-1$

        setPageComplete(false);
        this.engine = engine;
    }

    @Override
    public void recalculateButtonStates() {

    }

    @Override
    public void setInitialFocus() {

    }

    /**
     * Constructs the UI elements of this page on given Composite
     */
    public void createControl(Composite parent) {

        composite = new Composite(parent, SWT.NULL);
        GridLayout g = new GridLayout();
        g.numColumns = 1;
        composite.setLayout(g);

        Group filetypeGroup = new Group(composite, SWT.NONE);

        GridLayout gl = new GridLayout();
        gl.numColumns = 1;
        GridData productGD = new GridData(GridData.FILL_HORIZONTAL);

        filetypeGroup.setLayout(gl);
        filetypeGroup.setLayoutData(productGD);
        filetypeGroup.setVisible(true);
        filetypeGroup.setText(Messages.getString("ProductSDKSelectionPage.AnalysisType"));

        //Creation of Group for File Types Selection
        headersButton = new Button(filetypeGroup, SWT.CHECK);
        GridData headerGD = new GridData(GridData.FILL_HORIZONTAL);
        headerGD.horizontalSpan = 2;
        headersButton.setLayoutData(headerGD);
        headersButton.setSelection(engine.isHeaderAnalysisChecked());
        headersButton.setText(Messages.getString("ProductSDKSelectionPage.HeaderAnalysis"));
        headersButton.setToolTipText(Messages.getString("ProductSDKSelectionPage.ToolTip_checkbox"));
        headersButton.addSelectionListener(this);

        libsButton = new Button(filetypeGroup, SWT.CHECK);
        GridData libsGD = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
        libsGD.horizontalSpan = 2;
        libsButton.setLayoutData(libsGD);
        libsButton.setSelection(engine.isLibraryAnalysisChecked());
        libsButton.setText(Messages.getString("ProductSDKSelectionPage.LibraryAnalysis"));
        libsButton.setToolTipText(Messages.getString("ProductSDKSelectionPage.Tooltip_libsbutton"));
        libsButton.addSelectionListener(this);

        createBaselineGroup();
        createProductGroup();

        setHelp();
        setControl(composite);
    }

    /**
     * Validates the given values by user for various fields.
     * If invalid, shows an error message and returns false.
     * Otherwise, this returns true.
     */
    public boolean canFlipToNextPage() {
        this.setErrorMessage(null);

        if (sdkNameCombo.getText().length() == 0) {
            this.setErrorMessage("Please provide a valid SDK");
            return false;
        } else if (sdkNameCombo.indexOf(sdkNameCombo.getText()) == -1) {
            this.setErrorMessage("Invalid SDK.");
            return false;
        }
        if ((!headersButton.getSelection()) && (!libsButton.getSelection())) {
            this.setErrorMessage(Messages.getString("ProductSDKSelectionPage.NoFileTypes"));
            return false;
        }
        if (versionCombo.getText().length() == 0) {
            this.setErrorMessage(Messages.getString("ProductSDKSelectionPage.VersionStringCannotbeNull"));
            return false;
        }

        if (selectedSDK != null) {
            File filepath = new File(selectedSDK.getEPOCROOT());
            if (!filepath.exists()) {
                setErrorMessage(Messages.getString("LibraryFilesPage.28"));
                return false;
            }
        }
        if (profileCombo.getSelectionIndex() == 0 || profileCombo.getText().length() == 0) {
            profileCombo.select(0);
            setErrorMessage("Select profile from the list");
            return false;
        } else if (profileCombo.getText().length() > 0 && profileCombo.indexOf(profileCombo.getText()) == -1) {
            setErrorMessage("Given profile does not exist. Please select a valid profile");
            return false;
        } else
            configure.setEnabled(true);

        return true;
    }

    public boolean canFinish() {
        return this.canFlipToNextPage();
    }

    private void createBaselineGroup() {
        Group baselineGrp = new Group(composite, SWT.NONE);
        baselineGrp.setText("Baseline Profile Configuration");
        GridLayout gl = new GridLayout();
        gl.numColumns = 2;
        baselineGrp.setLayout(gl);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        baselineGrp.setLayoutData(gd);

        Label selectLabel = new Label(baselineGrp, SWT.NONE);
        selectLabel.setText(Messages.getString("BaselineSelectionPage.SelectBaseline"));

        profileCombo = new Combo(baselineGrp, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
        GridData comboGD = new GridData(GridData.FILL_HORIZONTAL);
        profileCombo.setLayoutData(comboGD);
        profileCombo.addSelectionListener(this);
        profileCombo.addModifyListener(this);
        basics = new String[] { "Select profile here..." };
        profileCombo.setItems(basics);

        String[] array = BaselineProfileUtils.getAllBaselinesProfiles();
        for (String profile : array)
            if (profileCombo.indexOf(profile) == -1)
                profileCombo.add(profile);
        profileCombo.select(0);

        String lastUsedProfile = prefStore
                .getString(CompatibilityAnalyserPreferencesConstants.LAST_USED_BASELINE_PROFILE);
        if (lastUsedProfile != null)
            profileCombo.select(profileCombo.indexOf(lastUsedProfile));

        Label editLabel = new Label(baselineGrp, SWT.NONE);
        editLabel.setText(Messages.getString("BaselineSelectionPage.EditBaseline"));

        configure = new Button(baselineGrp, SWT.PUSH);
        configure.setText(Messages.getString("BaselineSelectionPage.ConfigureBaseline"));
        configure.setToolTipText(Messages.getString("BaselineSelectionPage.OpenBaseline"));
        configure.addSelectionListener(this);

    }

    private void createProductGroup() {
        Group productGroup = new Group(composite, SWT.NONE);

        GridLayout gl = new GridLayout();
        gl.numColumns = 2;
        GridData productGD = new GridData(GridData.FILL_HORIZONTAL);

        productGroup.setLayout(gl);
        productGroup.setLayoutData(productGD);
        productGroup.setVisible(true);
        productGroup.setText(Messages.getString("ProductSDKSelectionPage.CurrentSDKConfiguration"));

        Label nameLabel = new Label(productGroup, SWT.LEFT);
        nameLabel.setText(Messages.getString("ProductSDKSelectionPage.SDKName"));
        GridData nameGD = new GridData(GridData.FILL_HORIZONTAL);
        nameLabel.setLayoutData(nameGD);

        sdkNameCombo = new Combo(productGroup, SWT.BORDER | SWT.DROP_DOWN);
        GridData comboGD = new GridData(GridData.FILL_HORIZONTAL);
        sdkNameCombo.setLayoutData(comboGD);
        sdkNameCombo.setToolTipText(Messages.getString("ProductSDKSelectionPage.Tooltip_sdkCombo"));
        sdkNameCombo.addModifyListener(this);

        loadedSdks = CompatibilityAnalyserPlugin.fetchLoadedSdkList();
        size = loadedSdks.size();

        Label versionLabel = new Label(productGroup, SWT.LEFT);
        versionLabel.setText(Messages.getString("ProductSDKSelectionPage.CurrentSDKVersion")); //$NON-NLS-1$

        GridData versionGD = new GridData(GridData.FILL_HORIZONTAL);
        versionLabel.setLayoutData(versionGD);

        versionCombo = new Combo(productGroup, SWT.BORDER);
        GridData textGD = new GridData(GridData.FILL_HORIZONTAL);
        versionCombo.setLayoutData(textGD);
        GlobalDataReader reader = CompatibilityAnalyserUtils.getGlobalDataReader();
        if (reader != null) {
            String[] sVersions = reader.readSupportedSDKVersions();
            if (sVersions != null)
                versionCombo.setItems(sVersions);
        }
        versionCombo.setToolTipText(Messages.getString("ProductSDKSelectionPage.ToolTipForVersionCombo"));
        versionCombo.addModifyListener(this);

        Label epocRootLabel = new Label(productGroup, SWT.LEFT);
        epocRootLabel.setText(Messages.getString("ProductSDKSelectionPage.EpocRootLabel"));
        GridData epocGD = new GridData(GridData.FILL_HORIZONTAL);
        epocRootLabel.setLayoutData(epocGD);

        epocDirectory = new Label(productGroup, SWT.NONE);
        epocDirectory.setToolTipText(Messages.getString("ProductSDKSelectionPage.ToolTipForepocRootDir"));
        epocDirectory.setLayoutData(epocGD);

        if (size > 0) {
            sdkNames = new String[size];
            sdkVersions = new String[size];
            for (int i = 0; i < size; i++) {
                sdkNames[i] = loadedSdks.get(i).getUniqueId();
                String s = loadedSdks.get(i).getSDKVersion().toString();
                sdkVersions[i] = s.substring(0, 3);
                sdkNameCombo.add(sdkNames[i], i);
            }
            try {
                sdkNameCombo.setItems(sdkNames);

                ProductSdkData sdkData = engine.getCurrentSdkData();

                if (sdkData != null && sdkData.productSdkName != null) {
                    if (sdkNameCombo.indexOf(sdkData.productSdkName) != -1)
                        sdkNameCombo.select(sdkNameCombo.indexOf(sdkData.productSdkName));
                    else
                        sdkNameCombo.setText(sdkData.productSdkName);
                } else
                    sdkNameCombo.select(0);

                int index = sdkNameCombo.getSelectionIndex();

                if (index != -1) {
                    selectedSDK = loadedSdks.get(index);

                    if (versionCombo.indexOf(sdkVersions[index]) != -1)
                        versionCombo.select(versionCombo.indexOf(sdkVersions[index]));
                    else {
                        SavingUserData userData = new SavingUserData();
                        String lastVersion = userData.getLastSdkVersion(sdkNameCombo.getText());
                        if (lastVersion != null)
                            versionCombo.setText(lastVersion);
                        else
                            versionCombo.setText("");
                    }
                    epocDirectory.setText(selectedSDK.getEPOCROOT());
                    sdkData.productSdkName = sdkNameCombo.getText();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else
            this.setErrorMessage(Messages.getString("ProductSDKSelectionPage.NoSDKsInstalled"));

    }

    public void modifyText(ModifyEvent e) {
        try {
            if (e.widget == sdkNameCombo) {
                int i = sdkNameCombo.indexOf(sdkNameCombo.getText());

                if (i != -1) {
                    epocDirectory.setText(loadedSdks.get(i).getEPOCROOT());
                    if (versionCombo.indexOf(sdkVersions[i]) != -1)
                        versionCombo.select(versionCombo.indexOf(sdkVersions[i]));
                    else {
                        SavingUserData userData = new SavingUserData();
                        String lastVersion = userData.getLastSdkVersion(sdkNameCombo.getText());
                        if (lastVersion != null)
                            versionCombo.setText(lastVersion);
                        else
                            versionCombo.setText("");
                    }
                    selectedSDK = loadedSdks.get(i);
                    engine.getCurrentSdkData().productSdkName = sdkNameCombo.getText();
                }
                this.getContainer().updateButtons();
            } else if (e.widget == versionCombo) {
                this.getContainer().updateButtons();
            } else if (e.widget == profileCombo) {
                engine.setBaselineProfile(profileCombo.getText());
                this.getContainer().updateButtons();
            }

        } catch (Exception exception) {
            System.out.println(exception.getMessage());
        }
    }

    public void widgetDefaultSelected(SelectionEvent e) {

    }

    public void widgetSelected(SelectionEvent e) {

        if ((e.widget == headersButton) || (e.widget == libsButton)) {
            this.getContainer().updateButtons();
        } else if (e.widget == configure) {
            BaselineEditor dd = null;
            if (profileCombo.getSelectionIndex() == 0)
                dd = new BaselineEditor(Display.getDefault().getActiveShell(), null);
            else
                dd = new BaselineEditor(Display.getDefault().getActiveShell(), profileCombo.getText());
            dd.setBlockOnOpen(true);

            int status = dd.open();
            if (status == IDialogConstants.OK_ID) {
                profileCombo.setItems(basics);
                String[] updatedProfiles = BaselineProfileUtils.getAllBaselinesProfiles();
                if (updatedProfiles != null) {
                    for (int i = 0; i < updatedProfiles.length; i++)
                        if (profileCombo.indexOf(updatedProfiles[i]) == -1) {
                            profileCombo.add(updatedProfiles[i]);
                        }
                    if (updatedProfiles.length > 0) {
                        if (profileCombo.indexOf(updatedProfiles[0]) != -1) {
                            Object obj = BaselineProfileUtils.getBaselineProfileData(updatedProfiles[0]);
                            if (obj instanceof BaselineProfile && ((BaselineProfile) obj).isUpdated())
                                profileCombo.select(profileCombo.indexOf(updatedProfiles[0]));
                            else
                                profileCombo.select(0);
                        }
                    }
                } else
                    profileCombo.select(0);
            } else if (status == IDialogConstants.IGNORE_ID) {
                profileCombo.setItems(basics);
                String[] updatedProfiles = BaselineProfileUtils.getAllBaselinesProfiles();
                if (updatedProfiles != null)
                    for (int i = 0; i < updatedProfiles.length; i++)
                        if (profileCombo.indexOf(updatedProfiles[i]) == -1)
                            profileCombo.add(updatedProfiles[i]);
                profileCombo.select(0);
            }

            engine.setBaselineProfile(profileCombo.getText());
            this.getContainer().updateButtons();
        } else if (e.widget == profileCombo) {
            this.setMessage(null);

            Object obj = BaselineProfileUtils.getBaselineProfileData(profileCombo.getText());
            if (obj instanceof BaselineProfile) {
                BaselineProfile pro = (BaselineProfile) obj;
                if (pro.isPredefined()) {
                    if (!pro.isUpdated()) {
                        targetPath = "c:\\apps\\ca-baselines\\" + pro.getProfileName();
                        targetURL = pro.getSdkUrl();

                        IRunnableWithProgress op = new IRunnableWithProgress() {
                            public void run(IProgressMonitor monitor) {
                                if (new File(targetPath).exists())
                                    FileMethods.deleteFolder(targetPath);
                                downloadStatus = CompatibilityAnalyserEngine.downloadAndExtractFileFromWebServer(
                                        targetURL, targetPath, CompatibilityAnalyserEngine.ElementTypes.FolderType,
                                        "include", monitor);
                            }
                        };
                        IWorkbench wb = PlatformUI.getWorkbench();
                        IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
                        Shell shell = win != null ? win.getShell() : null;
                        try {
                            new ProgressMonitorDialog(shell).run(true, true, op);
                        } catch (InvocationTargetException err) {
                            err.printStackTrace();
                        } catch (InterruptedException err) {
                            err.printStackTrace();
                        }

                        if (downloadStatus == null) {
                            File epocRoot = new File(CompatibilityAnalyserEngine.getEpocFolderPath());
                            BaselineProfile profile = (BaselineProfile) obj;
                            profile.setSdkName(profile.getProfileName());
                            profile.setRadio_default_hdr(true);
                            profile.setRadio_dir_hdr(false);
                            profile.setRadio_default_build_target(true);
                            profile.setRadio_build_target(false);
                            profile.setRadio_dir_libs(false);
                            profile.setSdkEpocRoot(
                                    FileMethods.appendPathSeparator(epocRoot.getParentFile().getAbsolutePath()));
                            profile.setUpdated(true);
                            BaselineProfileUtils.saveProfileOnFileSystem(profile);
                            prevData.saveValue(SavingUserData.ValueTypes.PROFILENAME, profile.getProfileName());
                        } else {
                            profileCombo.select(0);
                            MessageDialog.openError(this.getShell(), "Compatibility Analyser", downloadStatus);
                            downloadStatus = null;
                        }
                    }
                }
                engine.setBaselineProfile(profileCombo.getText());
            }
            this.getContainer().updateButtons();
        }

    }

    public void setHelp() {
        PlatformUI.getWorkbench().getHelpSystem().setHelp(headersButton, HelpContextIDs.CURRENT_SDK);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(libsButton, HelpContextIDs.CURRENT_SDK);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(sdkNameCombo, HelpContextIDs.CURRENT_SDK);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(versionCombo, HelpContextIDs.CURRENT_SDK);
    }

    public boolean isHeaderAnalysisSelected() {
        return headersButton.getSelection();
    }

    public boolean isLibraryAnalysisSelected() {
        return libsButton.getSelection();
    }
}