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