/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation 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: * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.preferences; import com.ibm.icu.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IntegerFieldEditor; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.internal.ui.wizards.dialogfields.Separator; public class ScalabilityPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { // Files with this number of lines will trigger scalability mode private IntegerFieldEditor fLinesToTrigger; private Button fEnableAll; private Button fReconciler; private Button fSyntaxColor; private Button fSemanticHighlighting; private Button fContentAssist; private Button fContentAssistAutoActivation; private Map<Object, String> fCheckBoxes= new HashMap<Object, String>(); /** * List of master/slave listeners when there's a dependency. * * @see #createDependency(Button, String, Control) */ private ArrayList<Object> fMasterSlaveListeners= new ArrayList<Object>(); public ScalabilityPreferencePage() { setPreferenceStore(PreferenceConstants.getPreferenceStore()); setDescription(PreferencesMessages.ScalabilityPreferencePage_description); } /** * Creates a button with the given label and sets the default configuration data. */ private Button createCheckButton( Composite parent, String label, String key ) { Button button = new Button( parent, SWT.CHECK | SWT.LEFT ); button.setText( label ); // FieldEditor GridData GridData data = new GridData(); button.setLayoutData( data ); fCheckBoxes.put(button, key); return button; } private void initFields() { IPreferenceStore prefs=getPreferenceStore(); Iterator<Object> iter= fCheckBoxes.keySet().iterator(); while (iter.hasNext()) { Button b= (Button) iter.next(); String key= fCheckBoxes.get(b); b.setSelection(prefs.getBoolean(key)); } // Update slaves iter= fMasterSlaveListeners.iterator(); while (iter.hasNext()) { SelectionListener listener= (SelectionListener)iter.next(); listener.widgetSelected(null); } fLinesToTrigger.setStringValue(Integer.toString(prefs.getInt(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES))); } /* * @see PreferencePage#createControl(Composite) */ @Override public void createControl(Composite parent) { super.createControl(parent); PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.SCALABILITY_PREFERENCE_PAGE); } /* * @see PreferencePage#createContents(Composite) */ @Override protected Control createContents(Composite parent) { initializeDialogUnits(parent); int nColumns= 1; Composite composite= new Composite(parent, SWT.NONE); GridLayout layout= new GridLayout(); layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth= 0; layout.numColumns= nColumns; composite.setLayout(layout); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; composite.setLayoutData( data ); createDetectionSettings(composite); new Separator().doFillIntoGrid(composite, nColumns); createScalabilityModeSettings(composite); new Separator().doFillIntoGrid(composite, nColumns); String noteTitle= PreferencesMessages.ScalabilityPreferencePage_note; String noteMessage= PreferencesMessages.ScalabilityPreferencePage_preferenceOnlyForNewEditors; Composite noteControl= createNoteComposite(JFaceResources.getDialogFont(), composite, noteTitle, noteMessage); GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan= 2; noteControl.setLayoutData(gd); initFields(); Dialog.applyDialogFont(composite); return composite; } /** * Creates composite group and sets the default layout data. * * @param parent * the parent of the new composite * @param numColumns * the number of columns for the new composite * @param labelText * the text label of the new composite * @return the newly-created composite */ private Composite createGroupComposite( Composite parent, int numColumns, String labelText ) { return ControlFactory.createGroup( parent, labelText, numColumns ); } /** * Create the view setting preferences composite widget */ private void createDetectionSettings( Composite parent ) { Composite group = createGroupComposite( parent, 1, PreferencesMessages.ScalabilityPreferencePage_detection_group_label ); createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_detection_label,PreferenceConstants.SCALABILITY_ALERT); Composite comp= new Composite(group, SWT.NONE); fLinesToTrigger = new IntegerFieldEditor( PreferenceConstants.SCALABILITY_NUMBER_OF_LINES, PreferencesMessages.ScalabilityPreferencePage_trigger_lines_label, comp); GridData data = (GridData)fLinesToTrigger.getTextControl( comp ).getLayoutData(); data.horizontalAlignment = GridData.BEGINNING; data.widthHint = convertWidthInCharsToPixels( 11 ); fLinesToTrigger.setPage( this ); fLinesToTrigger.setValidateStrategy( StringFieldEditor.VALIDATE_ON_KEY_STROKE ); fLinesToTrigger.setValidRange( 1, Integer.MAX_VALUE ); String minValue = Integer.toString( 1 ); String maxValue = Integer.toString( Integer.MAX_VALUE ); fLinesToTrigger.setErrorMessage( MessageFormat.format(PreferencesMessages.ScalabilityPreferencePage_error, new Object[] {minValue, maxValue}) ); fLinesToTrigger.load(); fLinesToTrigger.setPropertyChangeListener( new IPropertyChangeListener() { public void propertyChange( PropertyChangeEvent event ) { if ( event.getProperty().equals( FieldEditor.IS_VALID ) ) setValid( fLinesToTrigger.isValid() ); } } ); } /** * Create the view setting preferences composite widget */ private void createScalabilityModeSettings( Composite parent ) { Composite group = createGroupComposite( parent, 1, PreferencesMessages.ScalabilityPreferencePage_scalabilityMode_group_label ); fEnableAll = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_scalabilityMode_label, PreferenceConstants.SCALABILITY_ENABLE_ALL); fReconciler = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_reconciler_label, PreferenceConstants.SCALABILITY_RECONCILER); createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fReconciler, true); fSemanticHighlighting = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_semanticHighlighting_label, PreferenceConstants.SCALABILITY_SEMANTIC_HIGHLIGHT); createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fSemanticHighlighting, true); fSyntaxColor = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_syntaxColor_label, PreferenceConstants.SCALABILITY_SYNTAX_COLOR); createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fSyntaxColor, true); fContentAssist = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_contentAssist_label, PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST); createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fContentAssist, true); fContentAssistAutoActivation = createCheckButton(group, PreferencesMessages.ScalabilityPreferencePage_contentAssist_autoActivation, PreferenceConstants.SCALABILITY_CONTENT_ASSIST_AUTO_ACTIVATION); createDependency(fContentAssist, PreferenceConstants.SCALABILITY_PARSER_BASED_CONTENT_ASSIST, fContentAssistAutoActivation, true); createDependency(fEnableAll, PreferenceConstants.SCALABILITY_ENABLE_ALL, fContentAssistAutoActivation, false); } private static void indent(Control control, GridData masterLayoutData) { GridData gridData= new GridData(); gridData.horizontalIndent= masterLayoutData.horizontalIndent + 20; control.setLayoutData(gridData); } private void createDependency(final Button master, String masterKey, final Control slave, boolean indent) { if (indent) { indent(slave, (GridData)master.getLayoutData()); } boolean masterState= getPreferenceStore().getBoolean(masterKey); slave.setEnabled(!masterState); if (masterState) { ((Button)slave).setSelection(masterState); } SelectionListener listener= new SelectionListener() { public void widgetSelected(SelectionEvent e) { slave.setEnabled(!master.getSelection()); if (master.getSelection()) { ((Button)slave).setSelection(master.getSelection()); } } public void widgetDefaultSelected(SelectionEvent e) {} }; master.addSelectionListener(listener); fMasterSlaveListeners.add(listener); } /* * @see IWorkbenchPreferencePage#init(IWorkbench) */ public void init(IWorkbench workbench) { } /* * @see IPreferencePage#performOk() */ @Override public boolean performOk() { IPreferenceStore prefs= getPreferenceStore(); Iterator<Object> iter= fCheckBoxes.keySet().iterator(); while (iter.hasNext()) { Button b= (Button) iter.next(); String key= fCheckBoxes.get(b); prefs.setValue(key, b.getSelection()); } prefs.setValue(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES, fLinesToTrigger.getIntValue()); return super.performOk(); } /* * @see PreferencePage#performDefaults() */ @Override protected void performDefaults() { IPreferenceStore prefs= getPreferenceStore(); Iterator<Object> iter= fCheckBoxes.keySet().iterator(); while (iter.hasNext()) { Button b= (Button) iter.next(); String key= fCheckBoxes.get(b); b.setSelection(prefs.getDefaultBoolean(key)); } // Update slaves iter= fMasterSlaveListeners.iterator(); while (iter.hasNext()) { SelectionListener listener= (SelectionListener)iter.next(); listener.widgetSelected(null); } fLinesToTrigger.setStringValue(Integer.toString(prefs.getDefaultInt(PreferenceConstants.SCALABILITY_NUMBER_OF_LINES))); } }