Java tutorial
/* * 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(); } } } }