net.rim.ejde.internal.ui.preferences.WarningsPrefsPage.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.preferences.WarningsPrefsPage.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.preferences;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.rim.ejde.internal.core.ContextManager;
import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.core.IRIMMarker;
import net.rim.ejde.internal.model.preferences.WarningsPreferences;
import net.rim.ejde.internal.signing.BBSigningKeys;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.VMUtils;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.internal.ui.util.CoreUtility;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public class WarningsPrefsPage extends BasicPrefsPage {

    public static final String ID = "net.rim.ejde.internal.ui.preferences.DebugPrefsPage";

    static private final Logger _log = Logger.getLogger(WarningsPrefsPage.class);
    private Button _promptForDebugFileButton;
    private Button _promptForMissingDependenciesFileButton;
    private Map<String, List<String>> _keyTable;
    private Tree _checkTree;
    private Map<String, Boolean> _statusTable;

    @Override
    protected Control createContents(Composite parent) {
        Composite main = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 1;
        main.setLayout(layout);
        main.setLayoutData(new GridData(GridData.FILL_BOTH));

        Label warnLabel = new Label(main, SWT.NONE);
        warnLabel.setText(Messages.CodeSigningPrefsPage_SigningStatusLabel);

        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);

        _keyTable = populateKeyTable();

        _checkTree = new Tree(main, SWT.CHECK);
        _checkTree.setRedraw(false);
        _checkTree.setBackground(main.getBackground());
        _checkTree.setLayoutData(gridData);

        for (String root : _keyTable.keySet()) {
            TreeItem item = new TreeItem(_checkTree, SWT.NONE);
            item.setText(root);
            for (String vmName : _keyTable.get(root)) {
                TreeItem child = new TreeItem(item, SWT.NONE);
                child.setText(vmName);
            }
        }

        // Turn drawing back on!
        _checkTree.setRedraw(true);
        _checkTree.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                checkAllChildrens(_checkTree);
            }
        });
        gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        // gridData.verticalIndent = 10;

        _promptForDebugFileButton = new Button(main, SWT.CHECK);
        _promptForDebugFileButton.setText(Messages.DebugPrefsPage_WarnForDebugMsg);
        _promptForDebugFileButton.setToolTipText(Messages.DebugPrefsPage_WarnForDebugMsg);
        _promptForDebugFileButton.setLayoutData(gridData);

        _promptForMissingDependenciesFileButton = new Button(main, SWT.CHECK);
        _promptForMissingDependenciesFileButton.setText(Messages.SDKPrefsPage_WarnForMissingDependenciesMsg);
        _promptForMissingDependenciesFileButton.setToolTipText(Messages.SDKPrefsPage_WarnForMissingDependenciesMsg);
        _promptForMissingDependenciesFileButton.setLayoutData(gridData);

        initValues();

        return parent;
    }

    private Map<String, List<String>> populateKeyTable() {
        String id = null;
        _keyTable = new HashMap<String, List<String>>();

        Map<String, BBSigningKeys> signKeysTable = VMUtils.getSignKeysCache();
        for (IVMInstall vm : VMUtils.getInstalledBBVMs()) {
            VMUtils.addSignKeysToCache(vm);
        }
        signKeysTable = VMUtils.getSignKeysCache();
        for (String vmName : signKeysTable.keySet()) {
            BBSigningKeys keyObj = signKeysTable.get(vmName);
            for (int key : keyObj.getKeys()) {
                id = VMUtils.convertKeyToPreferenceLabel(Integer.valueOf(key), vmName);
                if (_keyTable.containsKey(id)) {
                    _keyTable.get(id).add(vmName);
                } else {
                    _keyTable.put(id, new ArrayList<String>());
                    _keyTable.get(id).add(vmName);
                }
            }
        }
        return _keyTable;
    }

    /**
     * This recursive method takes the Tree/TreeItem object as a parameter and check/uncheck all of its descendant children's
     * check boxes responds to their parent's checked status.
     *
     * @param item
     *            Object -- Tree/TreeItem
     */
    void checkAllChildrens(Object obj) {
        TreeItem[] children;
        if (obj instanceof Tree) {
            children = ((Tree) obj).getItems();
        } else if (obj instanceof TreeItem) {
            children = ((TreeItem) obj).getItems();
        } else {
            return;
        }
        for (TreeItem element : children) {
            TreeItem item = element;
            if (item.getParentItem() != null) {
                item.setChecked(item.getParentItem().getChecked());
            }
            checkAllChildrens(element);
        }
    }

    /**
     * Sets the selection state for the given key
     *
     * @param preferenceLabel
     *            the preference label as created by VMUtils
     * @param state
     *            the checked state
     */
    public void setSelection(String preferenceLabel, boolean state) {
        for (TreeItem item : _checkTree.getItems()) {
            if (item.getText().equals(preferenceLabel)) {
                item.setChecked(state);
                return;
            }
        }
    }

    @Override
    public boolean performOk() {
        storePrefValues();
        return true;
    }

    @Override
    protected void performDefaults() {
        initializeDefaults();
        checkAllChildrens(_checkTree);
        super.performDefaults();
    }

    private void initValues() {
        _statusTable = new HashMap<String, Boolean>();
        for (TreeItem item : _checkTree.getItems()) {
            _statusTable.put(item.getText(), Boolean.valueOf(item.getChecked()));
        }
        WarningsPreferences.getCodeSignWarnStatus(_statusTable);
        boolean status = false;
        for (TreeItem item : _checkTree.getItems()) {
            status = _statusTable.get(item.getText()).booleanValue();
            item.setChecked(status);
        }
        _promptForDebugFileButton.setSelection(WarningsPreferences.getPromptForMissingDebugFiles());
        _promptForMissingDependenciesFileButton
                .setSelection(WarningsPreferences.getPromptForMissingDependenciesFiles());
    }

    private void initializeDefaults() {
        Map<String, Boolean> statusTable = new HashMap<String, Boolean>();
        boolean status = false;
        for (TreeItem item : _checkTree.getItems()) {
            statusTable.put(item.getText(), Boolean.valueOf(item.getChecked()));
        }
        WarningsPreferences.setDefaultCodeSignWarnStatus(statusTable);
        for (TreeItem item : _checkTree.getItems()) {
            status = statusTable.get(item.getText()).booleanValue();
            item.setChecked(status);
        }
        _promptForDebugFileButton.setSelection(WarningsPreferences.getDefaultPromptForMissingDebugFiles());
        _promptForMissingDependenciesFileButton
                .setSelection(WarningsPreferences.getDefaultPromptForMissingDependenciesFiles());
    }

    private void storePrefValues() {
        Map<String, Boolean> currentStatusTable = new HashMap<String, Boolean>();
        boolean needBuild = false, givePrompt = ContextManager.getDefault().getPreferenceStore()
                .getBoolean(IConstants.PROMPT_FOR_BUILD_KEY);
        List<IMarker> problems = null;
        for (TreeItem item : _checkTree.getItems()) {
            Integer itemKey = VMUtils.convertPreferenceLabelToKey(item.getText());
            currentStatusTable.put(item.getText(), Boolean.valueOf(item.getChecked()));
            boolean oldCheckedValue = WarningsPreferences.getWarnStatus(item.getText());
            if (item.getChecked() && !oldCheckedValue) {
                if (problems == null) {
                    try {
                        problems = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot()
                                .findMarkers(IRIMMarker.CODE_SIGN_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE));
                    } catch (CoreException e) {
                        _log.error("Error Finding Workspace Markers", e);
                    }
                    if (problems == null) {
                        break;
                    }
                }
                List<IMarker> retainedProblems = new ArrayList<IMarker>();
                for (IMarker marker : problems) {
                    try {
                        Object key = marker.getAttribute(IRIMMarker.KEY);
                        if (key != null && key.equals(itemKey)) {
                            marker.delete();
                        } else {
                            retainedProblems.add(marker);
                        }
                    } catch (CoreException e) {
                        _log.error("Error Retrieving Key from marker", e);
                    }
                }
                problems = retainedProblems;
            } else if (!item.getChecked() && oldCheckedValue) {
                needBuild = true;
            }
        }

        WarningsPreferences.setCodeSignWarnStatus(currentStatusTable);
        WarningsPreferences.setPromptForMissingDebugFiles(_promptForDebugFileButton.getSelection());
        WarningsPreferences
                .setPromptForMissingDependenciesFiles(_promptForMissingDependenciesFileButton.getSelection());

        if (needBuild && givePrompt) {
            MessageDialog dialog = new MessageDialog(getShell(), Messages.CodeSigningPrefsPage_MessageDialogTitle2,
                    null, Messages.CodeSigningPrefsPage_MessageDialogMsg2, MessageDialog.QUESTION,
                    new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 2);
            int res = dialog.open();
            if (res == 0) {
                CoreUtility.getBuildJob(null).schedule();
            }
        }
    }
}