/******************************************************************************* * Copyright (c) 2004, 2010 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.preferences; import java.util.Arrays; import java.util.List; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.ICDebugConfiguration; import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; import org.eclipse.cdt.debug.internal.ui.dialogfields.CheckedListDialogField; import org.eclipse.cdt.debug.internal.ui.dialogfields.DialogField; import org.eclipse.cdt.debug.internal.ui.dialogfields.IListAdapter; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import com.ibm.icu.text.MessageFormat; /** * The "Debugger Types" preference page. */ public class DebuggerTypesPage extends PreferencePage implements IWorkbenchPreferencePage { protected static String[] fgButtonLabels = new String[] { PreferenceMessages.getString( "DebuggerTypesPage.0" ), PreferenceMessages.getString( "DebuggerTypesPage.1" ), PreferenceMessages.getString( "DebuggerTypesPage.2" ) }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ /** * Comment for DebuggerTypesPage. */ class DebuggerTypesDialogField extends CheckedListDialogField { public DebuggerTypesDialogField() { super( new IListAdapter() { public void customButtonPressed( DialogField field, int index ) { } public void selectionChanged( DialogField field ) { } }, fgButtonLabels, new DebuggerTypeLabelProvider() ); } public Control[] doFillIntoGrid( Composite parent, int nColumns ) { PixelConverter converter = new PixelConverter( parent ); assertEnoughColumns( nColumns ); Control list = getListControl( parent ); GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.verticalAlignment = GridData.FILL; gd.grabExcessVerticalSpace = true; gd.horizontalSpan = nColumns - 2; gd.widthHint = converter.convertWidthInCharsToPixels( 50 ); gd.heightHint = converter.convertHeightInCharsToPixels( 6 ); list.setLayoutData( gd ); Composite buttons = getButtonBox( parent ); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = false; gd.verticalAlignment = GridData.FILL; gd.grabExcessVerticalSpace = true; gd.horizontalSpan = 1; buttons.setLayoutData( gd ); return new Control[]{ list, buttons }; } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.ui.dialogfields.CheckedListDialogField#getManagedButtonState(org.eclipse.jface.viewers.ISelection, int) */ protected boolean getManagedButtonState( ISelection sel, int index ) { // Enable/disable the "Default" button if ( index == 2 && sel instanceof IStructuredSelection ) { Object o = ((IStructuredSelection)sel).getFirstElement(); return o != null && isChecked( o ); } return super.getManagedButtonState( sel, index ); } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.ui.dialogfields.CheckedListDialogField#managedButtonPressed(int) */ protected boolean managedButtonPressed( int index ) { if ( index == 2 ) { List list = getSelectedElements(); if ( !list.isEmpty() ) setDefault( ((ICDebugConfiguration)list.get( 0 )).getID() ); else setDefault( null ); refresh(); } return super.managedButtonPressed( index ); } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.ui.dialogfields.ListDialogField#getListStyle() */ protected int getListStyle() { return SWT.BORDER + SWT.SINGLE + SWT.H_SCROLL + SWT.V_SCROLL; } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.ui.dialogfields.CheckedListDialogField#doCheckStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent) */ protected void doCheckStateChanged( CheckStateChangedEvent e ) { super.doCheckStateChanged( e ); ICDebugConfiguration dc = (ICDebugConfiguration)e.getElement(); if ( dc.getID().equals( getDefault() ) && !e.getChecked() ) { List list = getCheckedElements(); setDefault( ( list.size() > 0 ) ? ((ICDebugConfiguration)list.get( 0 )).getID() : null ); refresh(); } else if ( e.getChecked() && getDefault() == null ) { setDefault( ((ICDebugConfiguration)e.getElement()).getID() ); refresh(); } } /* (non-Javadoc) * @see org.eclipse.cdt.debug.internal.ui.dialogfields.CheckedListDialogField#checkAll(boolean) */ public void checkAll( boolean state ) { super.checkAll( state ); List list = getCheckedElements(); setDefault( ( list.size() > 0 ) ? ((ICDebugConfiguration)list.get( 0 )).getID() : null ); refresh(); } } /** * Comment for DebuggerTypesPage. */ class DebuggerTypeLabelProvider extends LabelProvider { public String getText( Object element ) { if ( element instanceof ICDebugConfiguration ) { ICDebugConfiguration dc = (ICDebugConfiguration)element; String label = dc.getName(); if ( dc.getID().equals( getDefault() ) ) label += MessageFormat.format( " ({0})", new String[] { PreferenceMessages.getString( "DebuggerTypesPage.3" ) } ); //$NON-NLS-1$ //$NON-NLS-2$ return label; } return super.getText( element ); } } private DebuggerTypesDialogField fListField; private IWorkbench fWorkbench; private String fDefault; /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) */ protected Control createContents( Composite parent ) { Font font = parent.getFont(); Composite comp = new Composite( parent, SWT.NONE ); GridLayout topLayout = new GridLayout(); topLayout.numColumns = 3; comp.setLayout( topLayout ); GridData gd = new GridData( GridData.FILL_BOTH ); comp.setLayoutData( gd ); comp.setFont( font ); Label viewerLabel = new Label( comp, SWT.LEFT ); viewerLabel.setText( PreferenceMessages.getString( "DebuggerTypesPage.4" ) ); //$NON-NLS-1$ gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL ); gd.horizontalSpan = 3; viewerLabel.setLayoutData( gd ); viewerLabel.setFont( font ); fListField = new DebuggerTypesDialogField(); fListField.setCheckAllButtonIndex( 0 ); fListField.setUncheckAllButtonIndex( 1 ); Dialog.applyDialogFont( comp ); fListField.doFillIntoGrid( comp, 3 ); initialize(); getWorkbench().getHelpSystem().setHelp( comp, ICDebugHelpContextIds.DEBUGGER_TYPES_PAGE ); return comp; } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ public void init( IWorkbench workbench ) { fWorkbench = workbench; } private IWorkbench getWorkbench() { return fWorkbench; } private void initialize() { ICDebugConfiguration dc = CDebugCorePlugin.getDefault().getDefaultDebugConfiguration(); setDefault( ( dc != null ) ? dc.getID() : null ); fListField.addElements( Arrays.asList( CDebugCorePlugin.getDefault().getDebugConfigurations() ) ); fListField.setCheckedElements( Arrays.asList( CDebugCorePlugin.getDefault().getActiveDebugConfigurations() ) ); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performOk() */ public boolean performOk() { CDebugCorePlugin.getDefault().saveDefaultDebugConfiguration( getDefault() ); List elements = fListField.getElements(); elements.removeAll( fListField.getCheckedElements() ); CDebugCorePlugin.getDefault().saveFilteredDebugConfigurations( (ICDebugConfiguration[])elements.toArray( new ICDebugConfiguration[elements.size()] ) ); return super.performOk(); } protected String getDefault() { return fDefault; } protected void setDefault( String defaultConfiguration ) { fDefault = defaultConfiguration; } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performDefaults() */ protected void performDefaults() { fListField.setCheckedElements( Arrays.asList( CDebugCorePlugin.getDefault().getDefaultActiveDebugConfigurations() ) ); ICDebugConfiguration defaultConfiguration = CDebugCorePlugin.getDefault().getDefaultDefaultDebugConfiguration(); if ( defaultConfiguration != null ) { setDefault( defaultConfiguration.getID() ); } else { List list = fListField.getCheckedElements(); if ( !list.isEmpty() ) { setDefault( ((ICDebugConfiguration)list.get( 0 )).getID() ); } } fListField.refresh(); super.performDefaults(); } }