com.nokia.carbide.cdt.internal.builder.ui.SisFilesBlock.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cdt.internal.builder.ui.SisFilesBlock.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.cdt.internal.builder.ui;

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

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
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 com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
import com.nokia.carbide.cdt.builder.project.ISISBuilderInfo;
import com.nokia.carbide.cdt.internal.api.builder.SISBuilderInfo2;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDKFeatures;

/**
 * A composite that displays files in a table. Files can be 
 * added, removed, edited, moved up or down.
 */
public class SisFilesBlock {

    IProject project;

    /**
     * This block's control
     */
    private Composite fControl;

    /**
     * Files being displayed
     */
    private List<ISISBuilderInfo> fFiles = new ArrayList<ISISBuilderInfo>();

    /**
     * The main list control
     */
    private CheckboxTableViewer fFileList;

    // Action buttons
    private Button fAddButton;
    private Button fRemoveButton;
    private Button fEditButton;
    private Button fUpButton;
    private Button fDownButton;

    private boolean isEKA2 = false;

    private List<Button> sisInfoChangedListeners = new ArrayList<Button>();

    /** 
     * Content provider to show a list of files to be transferred
     */
    class FilesContentProvider implements IStructuredContentProvider {

        public Object[] getElements(Object input) {
            return fFiles.toArray();
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

    }

    /**
     * Label provider for files to transfer table.
     */
    class FilesLabelProvider extends LabelProvider implements ITableLabelProvider {

        /**
         * @see ITableLabelProvider#getColumnText(Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof ISISBuilderInfo) {
                ISISBuilderInfo file = (ISISBuilderInfo) element;
                switch (columnIndex) {
                case 0:
                    return ""; //$NON-NLS-1$
                case 1:
                    return ""; //$NON-NLS-1$
                case 2:
                    return getSisText(file);
                case 3:
                    return getSisxText(file);
                }
            }
            return element.toString();
        }

        /**
         * @see ITableLabelProvider#getColumnImage(Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        private String getSisText(ISISBuilderInfo file) {
            IPath unsignedSisPath = file.getUnsignedSISFullPath();
            if (unsignedSisPath != null) {
                return unsignedSisPath.lastSegment();
            }
            return file.getUnsignedSISFileName();
        }

        private String getSisxText(ISISBuilderInfo file) {
            if (file.getSigningType() == ISISBuilderInfo.DONT_SIGN) {
                return ""; //$NON-NLS-1$
            }
            IPath signedSisPath = file.getSignedSISFullPath();
            if (signedSisPath != null) {
                return signedSisPath.lastSegment();
            }
            return file.getSignedSISFileName();
        }
    }

    SisFilesBlock(IProject project) {
        this.project = project;
    }

    /**
     * Creates this block's control in the given control.
     * 
     * @param ancestor containing control
     */
    public void createControl(Composite ancestor) {

        Composite parent = new Composite(ancestor, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);
        Font font = ancestor.getFont();
        parent.setFont(font);
        fControl = parent;

        Table table = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setFont(font);

        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        table.setLayout(new TableLayout());

        TableColumn column1 = new TableColumn(table, SWT.NULL);
        column1.setText("Enabled");
        column1.pack();

        TableColumn column2 = new TableColumn(table, SWT.NULL);
        column2.setText("Partial upgrade");
        column2.pack();

        TableColumn column3 = new TableColumn(table, SWT.NULL);
        column3.setText("Unsigned SIS file");
        column3.setWidth(200);

        TableColumn column4 = new TableColumn(table, SWT.NULL);
        column4.setText("Signed SIS file");
        column4.setWidth(200);

        fFileList = new CheckboxTableViewer(table);
        fFileList.setLabelProvider(new FilesLabelProvider());
        fFileList.setContentProvider(new FilesContentProvider());

        fFileList.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent evt) {
                enableButtons();
            }
        });

        fFileList.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                if (!fFileList.getSelection().isEmpty()) {
                    editFile();
                }
            }
        });

        fFileList.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent e) {
                ISISBuilderInfo file = (ISISBuilderInfo) e.getElement();
                file.setEnabled(e.getChecked());
            }
        });

        table.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {
                if (event.character == SWT.DEL && event.stateMask == 0) {
                    removeFiles();
                }
            }
        });

        Composite buttons = new Composite(parent, SWT.NULL);
        buttons.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false));
        buttons.setLayout(new GridLayout());
        buttons.setFont(font);

        fAddButton = createPushButton(buttons, "Add");
        fAddButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                addFile();
            }
        });

        fEditButton = createPushButton(buttons, "Edit");
        fEditButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                editFile();
            }
        });

        fRemoveButton = createPushButton(buttons, "Remove");
        fRemoveButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                removeFiles();
            }
        });

        fUpButton = createPushButton(buttons, "Move Up");
        fUpButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                moveFileUp();
                enableButtons();
            }
        });

        fDownButton = createPushButton(buttons, "Move Down");
        fDownButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                moveFileDown();
                enableButtons();
            }
        });

        enableButtons();
        fAddButton.setEnabled(true);
    }

    public void initData(ICarbideBuildConfiguration buildConfig) {
        // don't add the actual elements here
        List<ISISBuilderInfo> listCopy = new ArrayList<ISISBuilderInfo>();
        for (ISISBuilderInfo info : buildConfig.getSISBuilderInfoList()) {
            listCopy.add(new SISBuilderInfo2(info));
        }

        isEKA2 = buildConfig.getSDK().getSupportedFeatures().contains(ISymbianSDKFeatures.IS_EKA2);

        setFiles(listCopy);

        if (!isEKA2) {
            // hide the partial upgrade column
            fFileList.getTable().getColumn(1).setWidth(0);
        } else {
            fFileList.getTable().getColumn(1).setWidth(90);
        }
    }

    public boolean compareConfigurationSettings(ICarbideBuildConfiguration selectedConfig, boolean writeToConfig) {

        boolean settingsEqual = true;

        List<ISISBuilderInfo> existingSettings = selectedConfig.getSISBuilderInfoList();
        if (existingSettings.size() == fFiles.size()) {
            for (int i = 0; i < existingSettings.size(); i++) {
                if (!areSisBuilderInfosEqual(existingSettings.get(i), fFiles.get(i))) {
                    settingsEqual = false;
                    break;
                }
            }
        } else {
            settingsEqual = false;
        }

        if (!settingsEqual && writeToConfig) {
            existingSettings.clear();
            existingSettings.addAll(fFiles);
        }

        return settingsEqual;
    }

    private boolean areSisBuilderInfosEqual(ISISBuilderInfo info1, ISISBuilderInfo info2) {
        if (info1.getPKGFileString().compareTo(info2.getPKGFileString()) != 0) {
            return false;
        }

        if (info1.getUnsignedSISFileName().compareTo(info2.getUnsignedSISFileName()) != 0) {
            return false;
        }

        if (info1.getContentSearchLocation().compareTo(info2.getContentSearchLocation()) != 0) {
            return false;
        }

        if (info1.getAdditionalOptions().compareTo(info2.getAdditionalOptions()) != 0) {
            return false;
        }

        if (info1.getCertificate().compareTo(info2.getCertificate()) != 0) {
            return false;
        }

        if (info1.getKey().compareTo(info2.getKey()) != 0) {
            return false;
        }

        if (info1.getPassword().compareTo(info2.getPassword()) != 0) {
            return false;
        }

        if (info1.getSignedSISFileName().compareTo(info2.getSignedSISFileName()) != 0) {
            return false;
        }

        if (info1.isCreateStubFormat() != info2.isCreateStubFormat()) {
            return false;
        }

        if (info1.getSigningType() != info2.getSigningType()) {
            return false;
        }

        if (info1.isEnabled() != info2.isEnabled()) {
            return false;
        }

        if (info1 instanceof SISBuilderInfo2 && info2 instanceof SISBuilderInfo2) {
            if (((SISBuilderInfo2) info1).isPartialUpgrade() != ((SISBuilderInfo2) info2).isPartialUpgrade()) {
                return false;
            }
        }

        return true;
    }

    public void performDefaults() {
        setFiles(new ArrayList<ISISBuilderInfo>(0));
    }

    private void enableButtons() {
        int selectionCount = ((IStructuredSelection) fFileList.getSelection()).size();
        fEditButton.setEnabled(selectionCount == 1);
        fRemoveButton.setEnabled(selectionCount > 0);
        fUpButton.setEnabled(selectionCount == 1);
        fDownButton.setEnabled(selectionCount == 1);

        if (selectionCount == 1) {
            // disable move up/down if the selection is the first/last in the list
            ISISBuilderInfo selected = (ISISBuilderInfo) ((IStructuredSelection) fFileList.getSelection())
                    .getFirstElement();
            if (selected.equals(fFiles.get(0))) {
                fUpButton.setEnabled(false);
            }
            if (selected.equals(fFiles.get(fFiles.size() - 1))) {
                fDownButton.setEnabled(false);
            }
        }
    }

    protected Button createPushButton(Composite parent, String label) {
        Button button = new Button(parent, SWT.PUSH);
        button.setFont(parent.getFont());
        if (label != null) {
            button.setText(label);
        }
        button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        return button;
    }

    /**
     * Returns this block's control
     * 
     * @return control
     */
    public Control getControl() {
        return fControl;
    }

    /**
     * Sets the files to be displayed in this block
     * 
     * @param files files to be displayed
     */
    protected void setFiles(List<ISISBuilderInfo> files) {
        fFiles.clear();
        fFiles.addAll(files);

        Table table = fFileList.getTable();
        table.removeAll();

        fFileList.setInput(fFiles);
        fFileList.refresh();

        for (ISISBuilderInfo file : fFiles) {
            fFileList.setChecked(file, file.isEnabled());
        }

        if (isEKA2) {
            // initialize the cell editors
            for (int i = 0; i < fFiles.size(); i++) {
                addPartialUpgradeEditor(table, i);
            }
        }
    }

    private void addPartialUpgradeEditor(Table table, int rowIndex) {
        TableItem item = table.getItem(rowIndex);
        ISISBuilderInfo info = fFiles.get(rowIndex);

        final Button partialUpgradeCheckbox = new Button(table, SWT.CHECK | SWT.FLAT);
        partialUpgradeCheckbox.setBackground(table.getBackground());
        partialUpgradeCheckbox.pack();
        partialUpgradeCheckbox.setData(info);
        if (info instanceof SISBuilderInfo2) {
            partialUpgradeCheckbox.setSelection(((SISBuilderInfo2) info).isPartialUpgrade());
        }

        partialUpgradeCheckbox.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }

            public void widgetSelected(SelectionEvent e) {
                Object o = e.getSource();
                if (o != null && o instanceof Button) {
                    Object data = ((Button) o).getData();
                    if (data != null && data instanceof ISISBuilderInfo) {
                        ISISBuilderInfo info = (ISISBuilderInfo) data;
                        if (info instanceof SISBuilderInfo2) {
                            SISBuilderInfo2 info2 = (SISBuilderInfo2) info;
                            info2.setPartialUpgrade(!info2.isPartialUpgrade());
                        }
                    }
                }
            }

        });

        addSisInfoChangedListener(partialUpgradeCheckbox);

        partialUpgradeCheckbox.addDisposeListener(new DisposeListener() {

            public void widgetDisposed(DisposeEvent e) {
                removeSisInfoChangedListener(partialUpgradeCheckbox);
            }

        });

        final TableEditor partialUpgradeCellEditor = new TableEditor(table);
        partialUpgradeCellEditor.grabHorizontal = true;
        partialUpgradeCellEditor.setEditor(partialUpgradeCheckbox, item, 1);

        item.addDisposeListener(new DisposeListener() {

            public void widgetDisposed(DisposeEvent e) {
                partialUpgradeCellEditor.dispose();
                partialUpgradeCheckbox.dispose();
            }

        });
    }

    /**
     * Returns the files currently being displayed in this block
     * 
     * @return files currently being displayed in this block
     */
    public ISISBuilderInfo[] getFiles() {
        return (ISISBuilderInfo[]) fFiles.toArray(new ISISBuilderInfo[fFiles.size()]);
    }

    /**
     * Bring up a dialog that lets the user create a new file to transfer.
     */
    private void addFile() {
        SISBuilderInfo2 file = new SISBuilderInfo2(project);
        if (isEKA2) {
            file.setSigningType(ISISBuilderInfo.SELF_SIGN);
        }

        AddEditSisFileToBuildDialog dialog = new AddEditSisFileToBuildDialog(getShell(), file, project, isEKA2);
        dialog.setTitle("SIS Properties");
        if (dialog.open() != Window.OK) {
            return;
        }
        fFiles.add(file);
        fFileList.refresh();
        fFileList.setChecked(file, file.isEnabled());

        if (isEKA2) {
            addPartialUpgradeEditor(fFileList.getTable(), fFiles.size() - 1);
        }
    }

    private void editFile() {
        IStructuredSelection selection = (IStructuredSelection) fFileList.getSelection();
        ISISBuilderInfo file = (ISISBuilderInfo) selection.getFirstElement();
        if (file == null) {
            return;
        }
        AddEditSisFileToBuildDialog dialog = new AddEditSisFileToBuildDialog(getShell(), file, project, isEKA2);
        dialog.setTitle("SIS Properties");
        if (dialog.open() != Window.OK) {
            return;
        }
        fFileList.refresh(file);

        // update table checkbox
        if (file instanceof SISBuilderInfo2) {
            SISBuilderInfo2 sisInfo2 = (SISBuilderInfo2) file;
            for (Button button : sisInfoChangedListeners) {
                Object data = button.getData();
                if (data != null && data instanceof SISBuilderInfo2 && data.equals(sisInfo2)) {
                    button.setSelection(sisInfo2.isPartialUpgrade());
                }
            }
        }
    }

    private void removeFiles() {
        IStructuredSelection selection = (IStructuredSelection) fFileList.getSelection();
        ISISBuilderInfo[] files = new ISISBuilderInfo[selection.size()];
        Iterator iter = selection.iterator();
        int i = 0;
        while (iter.hasNext()) {
            files[i] = (ISISBuilderInfo) iter.next();
            i++;
        }
        removeFiles(files);
    }

    private void moveFileUp() {
        IStructuredSelection selection = (IStructuredSelection) fFileList.getSelection();
        ISISBuilderInfo file = (ISISBuilderInfo) selection.getFirstElement();
        int i;
        for (i = 0; i < fFiles.size(); i++) {
            if (fFiles.get(i).equals(file)) {
                fFiles.remove(i);
                fFiles.add(i - 1, file);
                fFileList.refresh();
                break;
            }
        }
    }

    private void moveFileDown() {
        IStructuredSelection selection = (IStructuredSelection) fFileList.getSelection();
        ISISBuilderInfo file = (ISISBuilderInfo) selection.getFirstElement();
        int i;
        for (i = 0; i < fFiles.size(); i++) {
            if (fFiles.get(i).equals(file)) {
                fFiles.remove(i);
                fFiles.add(i + 1, file);
                fFileList.refresh();
                break;
            }
        }
    }

    /**
     * Removes the given files from the table.
     * 
     * @param files
     */
    public void removeFiles(ISISBuilderInfo[] files) {
        for (int i = 0; i < files.length; i++) {
            fFiles.remove(files[i]);
        }
        fFileList.refresh();
    }

    protected Shell getShell() {
        return getControl().getShell();
    }

    private void addSisInfoChangedListener(Button listener) {
        if (!sisInfoChangedListeners.contains(listener)) {
            sisInfoChangedListeners.add(listener);
        }
    }

    private void removeSisInfoChangedListener(Button listener) {
        sisInfoChangedListeners.remove(listener);
    }
}