com.nokia.s60tools.compatibilityanalyser.ui.dialogs.AdvancedOptionsDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.compatibilityanalyser.ui.dialogs.AdvancedOptionsDialog.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: Class to display KnownIssues settings
*
*/
package com.nokia.s60tools.compatibilityanalyser.ui.dialogs;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
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.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
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.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.nokia.s60tools.compatibilityanalyser.CompatibilityAnalyserPlugin;
import com.nokia.s60tools.compatibilityanalyser.data.ProductSdkData;
import com.nokia.s60tools.compatibilityanalyser.model.CompatibilityAnalyserEngine;
import com.nokia.s60tools.compatibilityanalyser.resources.Messages;
import com.nokia.s60tools.compatibilityanalyser.ui.wizards.CompatibilityAnalyserPreferencesConstants;
import com.nokia.s60tools.compatibilityanalyser.ui.wizards.FeedbackHandler;
import com.nokia.s60tools.compatibilityanalyser.utils.FileMethods;
import com.nokia.s60tools.compatibilityanalyser.utils.HelpContextIDs;

public class AdvancedOptionsDialog extends TrayDialog implements SelectionListener, FeedbackHandler {

    private Composite parent;
    //System include controls
    private Table syspath_table;
    private Button add_sys_button;
    private Button remove_sys_button;
    private Button remove_all_sys_button;

    //Forced headers Controls
    private Table forced_table;
    private Button forced_addBtn;
    private Button forced_removeBtn;
    private Button forced_removeAllBtn;

    //Use Platform Data check box
    private Button usePlatformData;

    private IPreferenceStore prefStore = CompatibilityAnalyserPlugin.getCompatabilityAnalyserPrefStore();
    private ProductSdkData currentData;
    private Color invalidColor = new Color(Display.getDefault(), 255, 0, 0);
    Font invalidFile_Font = new Font(Display.getDefault(), "Tahoma", 8, SWT.ITALIC);
    private String epocRoot;
    private ArrayList<String> children;
    private ArrayList<String> subChildren;
    private boolean isMonitorCancelled;
    private ProgressMonitorDialog progDlg;
    private String[] allSysIncHdrPaths;
    private ShowFilesListDialog addDialog;
    private ArrayList<String> displayFiles;
    private String absolutePath;
    private ArrayList<String> numOfFiles;
    private int invalidHeadersCount = 0;

    public AdvancedOptionsDialog(Shell shell, ProductSdkData currentData, String epocRoot) {
        super(shell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        this.currentData = currentData;
        this.epocRoot = epocRoot;
    }

    protected Control createContents(Composite composite) {

        parent = new Composite(composite, SWT.NONE);
        parent.setLayout(new GridLayout(1, true));
        parent.setLayoutData(new GridData(GridData.FILL_BOTH));
        parent.getShell().setText("Advanced options...");

        GridData gd = new GridData(GridData.FILL_BOTH);
        Group system_inc_grp = new Group(parent, SWT.NONE);
        system_inc_grp.setText("System include paths");
        system_inc_grp.setLayout(new GridLayout(2, false));
        system_inc_grp.setLayoutData(gd);

        syspath_table = new Table(system_inc_grp,
                SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
        gd = new GridData(GridData.FILL_BOTH);
        gd.verticalSpan = 4;
        gd.heightHint = 100;
        syspath_table.setLayoutData(gd);

        TableColumn col = new TableColumn(syspath_table, SWT.FILL | SWT.FULL_SELECTION);
        col.setText("Platform headers");
        col.setWidth(400);

        add_sys_button = new Button(system_inc_grp, SWT.PUSH);
        add_sys_button.setText("Add include path...");
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        add_sys_button.setLayoutData(gd);
        add_sys_button.addSelectionListener(this);

        remove_sys_button = new Button(system_inc_grp, SWT.PUSH);
        remove_sys_button.setText("Remove");
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        remove_sys_button.setLayoutData(gd);
        remove_sys_button.addSelectionListener(this);

        remove_all_sys_button = new Button(system_inc_grp, SWT.PUSH);
        remove_all_sys_button.setText("Remove all");
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        remove_all_sys_button.setLayoutData(gd);
        remove_all_sys_button.addSelectionListener(this);

        gd = new GridData(GridData.FILL_BOTH);
        Group forced_hdrs_grp = new Group(parent, SWT.NONE);
        forced_hdrs_grp.setText("Forced headers");
        forced_hdrs_grp.setLayout(new GridLayout(2, false));
        forced_hdrs_grp.setLayoutData(gd);

        gd = new GridData(GridData.FILL_BOTH);
        gd.verticalSpan = 4;
        gd.heightHint = 100;
        forced_table = new Table(forced_hdrs_grp,
                SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
        forced_table.setLayoutData(gd);
        forced_table.addSelectionListener(this);

        TableColumn col1 = new TableColumn(forced_table, SWT.LEFT | SWT.FILL);
        col1.setText(Messages.getString("HeaderFilesPage.Column1_Title"));
        col1.setWidth(320);

        forced_addBtn = new Button(forced_hdrs_grp, SWT.PUSH);
        forced_addBtn.setText("Add...");
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        gd.widthHint = 100;
        forced_addBtn.setLayoutData(gd);
        forced_addBtn.addSelectionListener(this);

        forced_removeBtn = new Button(forced_hdrs_grp, SWT.PUSH);
        forced_removeBtn.setText(Messages.getString("BaselineEditor.Remove"));
        forced_removeBtn.setEnabled(false);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        gd.widthHint = 100;
        forced_removeBtn.setLayoutData(gd);
        forced_removeBtn.addSelectionListener(this);

        forced_removeAllBtn = new Button(forced_hdrs_grp, SWT.PUSH);
        forced_removeAllBtn.setText("Remove all");
        forced_removeAllBtn.setEnabled(false);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        gd.widthHint = 100;
        forced_removeAllBtn.setLayoutData(gd);
        forced_removeAllBtn.addSelectionListener(this);

        gd = new GridData(GridData.FILL_HORIZONTAL);
        Group dependency_data_grp = new Group(parent, SWT.NONE);
        dependency_data_grp.setText("Dependency data");
        dependency_data_grp.setLayout(new GridLayout(2, false));
        dependency_data_grp.setLayoutData(gd);

        usePlatformData = new Button(dependency_data_grp, SWT.CHECK);
        gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING);
        usePlatformData.setSelection(
                prefStore.getBoolean(CompatibilityAnalyserPreferencesConstants.USEPLATFORMDATA_LAST_SELECTION));
        usePlatformData.setLayoutData(gd);

        Label lbl = new Label(dependency_data_grp, SWT.WRAP);
        lbl.setText(Messages.getString("PlatformHeadersPage.UseDependencies"));
        gd = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
        lbl.setLayoutData(gd);

        setDialogHelpAvailable(false);
        setHelpAvailable(true);
        setHelp();
        setCurrentData(currentData);
        dialogChanged();
        return super.createContents(parent);
    }

    private void setCurrentData(ProductSdkData cData) {
        syspath_table.removeAll();
        //Set the system include paths
        if (cData.currentIncludes != null) {
            for (String path : cData.currentIncludes) {
                TableItem item = new TableItem(syspath_table, SWT.NONE);
                item.setText(0, path);
                if (!(new File(path).exists())) {
                    item.setForeground(invalidColor);
                    item.setFont(invalidFile_Font);
                }
            }
            syspath_table.select(0);
        }

        //Set forced headers
        if (cData.forcedHeaders != null) {
            for (String s : cData.forcedHeaders) {
                TableItem item = new TableItem(forced_table, SWT.NONE);
                item.setText(s);
            }
        }

        //Use Platform Data
        if (cData.isOpenedFromProject)
            usePlatformData.setSelection(false);
    }

    private void dialogChanged() {
        remove_sys_button.setEnabled(syspath_table.getItemCount() > 0);
        remove_all_sys_button.setEnabled(syspath_table.getItemCount() > 0);

        forced_removeBtn.setEnabled(forced_table.getItemCount() > 0);
        forced_removeAllBtn.setEnabled(forced_table.getItemCount() > 0);
    }

    protected void okPressed() {

        if (usePlatformData.getSelection()) {
            currentData.usePlatformData = true;
        }

        if (!currentData.isOpenedFromProject)
            prefStore.setValue(CompatibilityAnalyserPreferencesConstants.USEPLATFORMDATA_LAST_SELECTION,
                    usePlatformData.getSelection());

        if (syspath_table.getItemCount() > 0) {
            currentData.currentIncludes = getSelectedPlatformHdrPaths();
        }
        if (forced_table.getItemCount() > 0) {
            currentData.forcedHeaders = new ArrayList<String>();
            for (TableItem item : forced_table.getItems()) {
                if (!item.getForeground().equals(invalidColor))
                    currentData.forcedHeaders.add(item.getText());
            }
        }
        super.okPressed();
    }

    public void widgetDefaultSelected(SelectionEvent arg0) {

    }

    public void widgetSelected(SelectionEvent event) {

        if (event.widget == add_sys_button) {
            DirectoryDialog dirDialog = new DirectoryDialog(this.getShell());
            dirDialog.setFilterPath(epocRoot + "epoc32" + File.separator + "include");
            String newDir = dirDialog.open();
            if (newDir != null) {
                TableItem item = new TableItem(syspath_table, SWT.NONE);
                item.setText(0, newDir);
            }
            syspath_table.select(0);
            validateForcedHeaders();
            dialogChanged();
        } else if (event.widget == remove_all_sys_button) {
            syspath_table.removeAll();
            validateForcedHeaders();
            dialogChanged();
        } else if (event.widget == remove_sys_button) {
            syspath_table.remove(syspath_table.getSelectionIndices());
            syspath_table.select(0);
            validateForcedHeaders();
            dialogChanged();
        } else if (event.widget == forced_addBtn) {
            if (syspath_table.getItemCount() > 0) {
                openFilesListDialog();
            } else {
                openFilesListDialog();
            }
        } else if (event.widget == forced_removeBtn) {
            forced_table.remove(forced_table.getSelectionIndices());
            forced_table.select(0);
            dialogChanged();
        } else if (event.widget == forced_removeAllBtn) {
            forced_table.removeAll();
            dialogChanged();
        }
    }

    private void setHelp() {
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, HelpContextIDs.INCLUDES_PAGE);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(syspath_table, HelpContextIDs.INCLUDES_PAGE);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(forced_table, HelpContextIDs.INCLUDES_PAGE);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(usePlatformData, HelpContextIDs.INCLUDES_PAGE);
    }

    public void UpdateFilesList() {
        forced_table.select(0);
    }

    public void UpdatePage() {
        dialogChanged();
    }

    private void openFilesListDialog() {
        numOfFiles = new ArrayList<String>();
        displayFiles = new ArrayList<String>();
        children = new ArrayList<String>();
        subChildren = new ArrayList<String>();
        isMonitorCancelled = false;

        addDialog = new ShowFilesListDialog(Display.getCurrent().getActiveShell(), forced_table, this, "", true);
        ArrayList<String> paths = new ArrayList<String>();
        for (int i = 0; i < syspath_table.getItems().length; i++) {
            if (!paths.contains(syspath_table.getItem(i).getText(0)))
                paths.add(syspath_table.getItem(i).getText(0));
        }
        if (!paths.contains(epocRoot + "epoc32" + File.separator + "include"))
            paths.add(epocRoot + "epoc32" + File.separator + "include");

        allSysIncHdrPaths = paths.toArray(new String[paths.size()]);
        IRunnableWithProgress op = new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) {
                try {
                    int i = 1;
                    for (String path : allSysIncHdrPaths) {
                        absolutePath = FileMethods.convertForwardToBackwardSlashes(path);
                        monitor.beginTask("Getting files from " + absolutePath, allSysIncHdrPaths.length);
                        getFiles(absolutePath, monitor);
                        getFilesFromSubDirs(absolutePath, monitor);
                        monitor.worked(i++);
                    }
                    monitor.done();

                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        };

        try {
            IWorkbench wb = PlatformUI.getWorkbench();
            IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
            Shell shell = win != null ? win.getShell() : null;
            progDlg = new ProgressMonitorDialog(shell);
            progDlg.run(true, true, op);
            progDlg.setBlockOnOpen(true);
        } catch (InvocationTargetException err) {
            err.printStackTrace();
        } catch (InterruptedException err) {
            err.printStackTrace();
        }

        if (!isMonitorCancelled) {
            for (String name : numOfFiles)
                if (!isPreviouslySelected(name))
                    displayFiles.add(name);

            if (displayFiles.size() != 0) {
                Collections.sort(displayFiles);
                addDialog.children = children;
                addDialog.subChildren = subChildren;
                addDialog.open();
                addDialog.filesList.setItems(displayFiles.toArray(new String[displayFiles.size()]));
                addDialog.filesList.select(0);
            }
        }
        if (isMonitorCancelled) {
        } else if (displayFiles.size() == 0 && numOfFiles.size() != 0) {
            Runnable showMessageRunnable = new Runnable() {
                public void run() {
                    MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                            Messages.getString("HeaderFilesPage.CompatibilityAnalyser"), //$NON-NLS-1$
                            Messages.getString("HeaderFilesPage.hdrsAlreadyExists")); //$NON-NLS-1$
                }
            };
            Display.getDefault().asyncExec(showMessageRunnable);
        }

        else if (numOfFiles.size() == 0) {
            Runnable showMessageRunnable = new Runnable() {
                public void run() {
                    MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                            Messages.getString("HeaderFilesPage.CompatibilityAnalyser"), //$NON-NLS-1$
                            Messages.getString("HeaderFilesPage.NoHdrsExists")); //$NON-NLS-1$
                }
            };
            Display.getDefault().asyncExec(showMessageRunnable);
        } else {
            addDialog.fileNamesList = addDialog.filesList.getItems();
        }

    }

    /**
     * Get supported files from the given directory.
     * @param path
     * @param monitor
     */
    private void getFiles(String path, IProgressMonitor monitor) {
        File rootDir = new File(path);

        if (rootDir.isDirectory()) {
            String[] fileNames = rootDir.list(new FilenameFilter() {

                public boolean accept(File file, String name) {
                    File temp = new File(FileMethods.appendPathSeparator(file.getAbsolutePath()) + name);

                    if (temp.isFile() && CompatibilityAnalyserEngine.isSupportedType(name))
                        return true;

                    return false;
                }

            });

            if (fileNames == null)
                return;

            for (String name : fileNames) {
                if (monitor != null && monitor.isCanceled()) {
                    isMonitorCancelled = true;
                    numOfFiles.clear();
                    children.clear();
                    subChildren.clear();
                    monitor.done();
                    return;
                }

                if (!numOfFiles.contains(name))
                    numOfFiles.add(name);
                if (path.equalsIgnoreCase(absolutePath)) {
                    children.add(name);
                } else
                    subChildren.add(name);
            }
        }
    }

    /**
     * Get supported files from subdirectories of given directory 
     * @param path
     * @param monitor
     */
    private void getFilesFromSubDirs(String path, IProgressMonitor monitor) {
        File rootDir = new File(path);

        if (rootDir.isDirectory()) {
            String[] dirNames = rootDir.list(new FilenameFilter() {

                public boolean accept(File file, String name) {
                    File temp = new File(FileMethods.appendPathSeparator(file.getAbsolutePath()) + name);
                    if (temp.isDirectory())
                        return true;

                    return false;
                }

            });

            if (dirNames != null) {
                for (String name : dirNames) {
                    getFiles(FileMethods.appendPathSeparator(path) + name, monitor);
                    if (monitor != null && monitor.isCanceled()) {
                        isMonitorCancelled = true;
                        numOfFiles.clear();
                        children.clear();
                        subChildren.clear();
                        monitor.done();
                        return;
                    }
                }
                for (String name : dirNames) {
                    getFilesFromSubDirs(FileMethods.appendPathSeparator(path) + name, monitor);
                }
            }
        }
    }

    /**
     * Checks if the given file is already present in the forced headers list
     * @param fileName
     * @return
     */
    private boolean isPreviouslySelected(String fileName) {
        for (TableItem item : forced_table.getItems()) {
            if (item.getText().equalsIgnoreCase(fileName))
                return true;
        }
        return false;
    }

    /**
     * This method gets invoked when a system include path is added or removed.
     * The method fetches header files from all provided system include paths and
     * if files provided in Forced headers do not exist in this list, those files 
     * will be shown in Red color, meaning they will not be included during analysis.
     */
    private void validateForcedHeaders() {
        invalidHeadersCount = 0;

        if (forced_table.getItemCount() > 0) {
            numOfFiles = new ArrayList<String>();
            children = new ArrayList<String>();
            subChildren = new ArrayList<String>();

            ArrayList<String> paths = new ArrayList<String>();
            for (int i = 0; i < syspath_table.getItems().length; i++) {
                if (!paths.contains(syspath_table.getItem(i).getText(0)))
                    paths.add(syspath_table.getItem(i).getText(0));
            }
            if (!paths.contains(epocRoot + "epoc32" + File.separator + "include"))
                paths.add(epocRoot + "epoc32" + File.separator + "include");

            for (String s : paths) {
                getFiles(s, null);
                getFilesFromSubDirs(s, null);
            }

            for (TableItem item : forced_table.getItems()) {
                if (!numOfFiles.contains(item.getText())) {
                    item.setForeground(invalidColor);
                    item.setFont(invalidFile_Font);
                    invalidHeadersCount++;
                } else
                    item.setForeground(null);
            }
        }
    }

    public String[] getSelectedPlatformHdrPaths() {
        ArrayList<String> paths = new ArrayList<String>();
        for (TableItem item : syspath_table.getItems())
            if (!item.getForeground().equals(invalidColor))
                paths.add(item.getText(0));
        return paths.toArray(new String[0]);
    }
}