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

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.compatibilityanalyser.ui.dialogs.RenameDialog.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: Dialog used to specify baseline file name, if it is different from the current file name.
*
*/
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.operation.IRunnableWithProgress;
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.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.nokia.s60tools.compatibilityanalyser.data.BaselineProfile;
import com.nokia.s60tools.compatibilityanalyser.data.BaselineSdkData;
import com.nokia.s60tools.compatibilityanalyser.model.CompatibilityAnalyserEngine;
import com.nokia.s60tools.compatibilityanalyser.resources.Messages;
import com.nokia.s60tools.compatibilityanalyser.ui.wizards.FeedbackHandler;
import com.nokia.s60tools.compatibilityanalyser.utils.BaselineProfileUtils;
import com.nokia.s60tools.compatibilityanalyser.utils.FileMethods;

/**
 * This dialog gets launched when "Set baseline name..." button is selected
 * in Header Files Selection page, of Analysis wizard.  
 *
 */
public class RenameDialog extends Dialog implements SelectionListener, ModifyListener {

    private Button buttonOK;
    private Button buttonCancel;
    private Text baselineFile_Txt;
    private Shell shell;
    private FeedbackHandler feedbackHandler;
    private Button currentFile_Browse;
    private Button baselineFile_Browse;
    private String currentFile = "";
    private String baselineFile = "";
    private Text currentFile_Txt;
    private String given_currentFile;
    private String given_baselineFile;

    private BaselineProfile baseProfile;
    private ArrayList<String> currentHeaderFiles;
    private ArrayList<String> fileNamesList;
    private ArrayList<String> filesList;
    private ShowAllFilesListDialog filesDialog;
    private String currentPath;
    private ArrayList<String> children;
    private ArrayList<String> subChildren;
    private ArrayList<String> headerDirectories;
    private ProgressMonitorDialog progDlg;
    private boolean isMonitorCancelled;

    public RenameDialog(Shell parent, int style, String currentFile, String baseFile, FeedbackHandler fh) {
        super(parent, style);
        this.feedbackHandler = fh;

        if (currentFile != null)
            this.currentFile = currentFile;
        if (baseFile != null)
            this.baselineFile = baseFile;
    }

    public void open() {
        Shell parent = getParent();
        shell = new Shell(parent, SWT.CLOSE | SWT.TITLE | SWT.APPLICATION_MODAL | SWT.BORDER);
        shell.setSize(400, 190);
        shell.setLocation(500, 300);
        shell.setLayout(new GridLayout(2, false));
        shell.setText(Messages.getString("RenameDialog.Rename"));

        GridData griddata = new GridData(GridData.FILL_HORIZONTAL);
        griddata.horizontalSpan = 2;
        griddata.horizontalAlignment = GridData.FILL;

        Label currentFile_Lbl = new Label(shell, SWT.NULL);
        currentFile_Lbl.setText("Current file");
        currentFile_Lbl.setLayoutData(griddata);

        currentFile_Txt = new Text(shell, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
        currentFile_Txt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        currentFile_Txt.addModifyListener(this);

        currentFile_Browse = new Button(shell, SWT.PUSH);
        currentFile_Browse.setText("Browse...");
        currentFile_Browse.addSelectionListener(this);

        Label baselineFile_Lbl = new Label(shell, SWT.NULL);
        baselineFile_Lbl.setText(Messages.getString("RenameDialog.PleaseProvideCorrespondingFileNameInBaseline"));
        baselineFile_Lbl.setToolTipText(Messages.getString("RenameDialog.ProvideTheOriginalFileNameInBaseline"));
        baselineFile_Lbl.setLayoutData(griddata);

        baselineFile_Txt = new Text(shell, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
        baselineFile_Txt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        baselineFile_Txt.addModifyListener(this);

        baselineFile_Browse = new Button(shell, SWT.PUSH);
        baselineFile_Browse.setText("Browse...");
        baselineFile_Browse.addSelectionListener(this);

        GridData griddata2 = new GridData(GridData.FILL_HORIZONTAL);
        griddata2.horizontalSpan = 2;
        griddata2.verticalIndent = 4;
        Composite btnComp = new Composite(shell, SWT.NONE);
        btnComp.setLayout(new GridLayout(2, false));
        btnComp.setLayoutData(griddata2);

        GridData d1 = new GridData(GridData.FILL_HORIZONTAL);
        d1.widthHint = 100;
        d1.horizontalAlignment = SWT.END;
        buttonOK = new Button(btnComp, SWT.PUSH);
        buttonOK.setText(Messages.getString("RenameDialog.Ok"));
        buttonOK.setLayoutData(d1);
        buttonOK.addSelectionListener(this);

        GridData d2 = new GridData(GridData.FILL_HORIZONTAL);
        d2.widthHint = 100;
        d2.horizontalAlignment = SWT.BEGINNING;
        buttonCancel = new Button(btnComp, SWT.PUSH);
        buttonCancel.setText(Messages.getString("RenameDialog.Cancel"));
        buttonCancel.setLayoutData(d2);
        buttonCancel.addSelectionListener(this);

        currentFile_Txt.setText(currentFile);
        baselineFile_Txt.setText(baselineFile);

        shell.open();

    }

    public void setBaselineProfile(String baseProfileName) {
        Object obj = BaselineProfileUtils.getBaselineProfileData(baseProfileName);

        if (obj == null || !(obj instanceof BaselineProfile)) {
            return;
        } else {
            this.baseProfile = (BaselineProfile) obj;
        }

    }

    public void setCurrentFiles(String[] currentFiles) {
        this.currentHeaderFiles = new ArrayList<String>();
        if (currentFiles != null) {
            for (String s : currentFiles)
                currentHeaderFiles.add(s);
        }
    }

    public void widgetDefaultSelected(SelectionEvent arg0) {
    }

    public void widgetSelected(SelectionEvent e) {
        if (e.widget == buttonOK) {
            given_currentFile = currentFile_Txt.getText();
            given_baselineFile = baselineFile_Txt.getText();
            if (shell != null)
                shell.close();

            feedbackHandler.UpdateFilesList();
        } else if (e.widget == buttonCancel) {
            if (shell != null)
                shell.close();
        } else if (e.widget == currentFile_Browse) {
            String title = null;
            if (currentHeaderFiles.size() == 0)
                return;
            else if (currentHeaderFiles.size() == 1)
                title = new String("List of files in " + currentHeaderFiles.get(0) + " directory");
            else
                title = new String("List of files from all current Header directory");

            filesDialog = new ShowAllFilesListDialog(this.shell, title, currentFile_Txt);
            getFilesFromAllPaths(currentHeaderFiles);
            updateButtons();
        } else if (e.widget == baselineFile_Browse) {
            if (baseProfile != null) {
                CompatibilityAnalyserEngine engine = new CompatibilityAnalyserEngine();
                BaselineSdkData baseSdkData = engine.readBaselineSdkData(baseProfile);
                if (baseSdkData != null) {
                    ArrayList<String> baseHeaderDirs = new ArrayList<String>();
                    for (String s : baseSdkData.baselineHeaderDir)
                        baseHeaderDirs.add(s);

                    String title = null;
                    if (baseHeaderDirs.size() == 0)
                        return;
                    else if (baseHeaderDirs.size() == 1)
                        title = new String("List of files in " + baseHeaderDirs.get(0) + " directory");
                    else
                        title = new String("List of files from all baseline Header directory");

                    filesDialog = new ShowAllFilesListDialog(this.shell, title, baselineFile_Txt);
                    getFilesFromAllPaths(baseHeaderDirs);
                }

            }

            updateButtons();
        }
    }

    public String[] getSelectedNames() {
        return new String[] { given_currentFile, given_baselineFile };
    }

    public void modifyText(ModifyEvent e) {
        if (e.widget == currentFile_Txt || e.widget == baselineFile_Txt) {
            if (currentFile_Txt.getText().length() == 0 || baselineFile_Txt.getText().length() == 0)
                buttonOK.setEnabled(false);
            else
                buttonOK.setEnabled(true);
        }
    }

    private void getFilesFromAllPaths(ArrayList<String> headerDirs) {
        headerDirectories = headerDirs;
        if (headerDirs == null || headerDirs.size() == 0 || filesDialog == null)
            return;

        isMonitorCancelled = false;
        fileNamesList = new ArrayList<String>();
        filesList = new ArrayList<String>();
        children = new ArrayList<String>();
        subChildren = new ArrayList<String>();

        IRunnableWithProgress op = new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) {
                try {
                    int i = 1;
                    for (String path : headerDirectories) {
                        currentPath = FileMethods.convertForwardToBackwardSlashes(path);
                        monitor.beginTask("Getting files from " + currentPath, headerDirectories.size());
                        getAndSetFiles(currentPath, monitor);
                        processSubDirs(currentPath, 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) {
            Collections.sort(filesList);
            filesDialog.children = children;
            filesDialog.subChildren = subChildren;
            filesDialog.open();
            filesDialog.filesList.setItems(filesList.toArray(new String[filesList.size()]));
        }

        if (isMonitorCancelled) {
            //System.out.println("Cancelled the process");
        } else if ((filesDialog.filesList == null || filesDialog.filesList.getItemCount() == 0)
                && fileNamesList.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 (fileNamesList.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
            filesDialog.fileNamesList = filesDialog.filesList.getItems();
    }

    private void getAndSetFiles(String path, IProgressMonitor monitor) {
        if (path == null)
            return;

        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() && isSupportedType(name))
                        return true;
                    return false;
                }

            });

            if (fileNames == null || fileNames.length == 0)
                return;

            for (String name : fileNames) {
                if (monitor != null && monitor.isCanceled()) {
                    isMonitorCancelled = true;
                    fileNamesList.clear();
                    filesList.clear();
                    children.clear();
                    subChildren.clear();
                    monitor.done();
                    return;
                }
                if (!fileNamesList.contains(name.toLowerCase())) {
                    fileNamesList.add(name.toLowerCase());
                    filesList.add(name);
                }
                if (path.equalsIgnoreCase(currentPath))
                    children.add(name);
                else
                    subChildren.add(name);
            }
        }
    }

    private void processSubDirs(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) {
                    getAndSetFiles(FileMethods.appendPathSeparator(path) + name, monitor);
                    if (monitor != null && monitor.isCanceled()) {
                        isMonitorCancelled = true;
                        fileNamesList.clear();
                        filesList.clear();
                        children.clear();
                        subChildren.clear();
                        monitor.done();
                        return;
                    }
                }
                for (String name : dirNames) {
                    processSubDirs(FileMethods.appendPathSeparator(path) + name, monitor);
                }
            }
        }
    }

    private boolean isSupportedType(String name) {
        if (name.endsWith(Messages.getString("HeaderAnalyserEngine.h"))
                || name.endsWith(Messages.getString("HeaderAnalyserEngine.hrh"))
                || name.endsWith(Messages.getString("HeaderAnalyserEngine.rsg"))
                || name.endsWith(Messages.getString("HeaderAnalyserEngine.mbg")))
            return true;
        else
            return false;
    }

    private void updateButtons() {
        if (!currentFile_Txt.getText().equals("") && !baselineFile_Txt.getText().equals("")) {
            buttonOK.setEnabled(true);
        } else
            buttonOK.setEnabled(false);
    }

}