| /**************************************************************************** |
| * Copyright (c) 2000, 2005 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 |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.ide.dialogs; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IWorkspaceDescription; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.Preferences; |
| 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.util.IPropertyChangeListener; |
| import org.eclipse.jface.util.PropertyChangeEvent; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| 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.ui.IWorkbenchPreferencePage; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.WorkbenchEncoding; |
| import org.eclipse.ui.dialogs.PreferenceLinkArea; |
| import org.eclipse.ui.ide.IDEEncoding; |
| import org.eclipse.ui.ide.dialogs.ResourceEncodingFieldEditor; |
| import org.eclipse.ui.internal.ide.IDEInternalPreferences; |
| import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; |
| import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; |
| import org.eclipse.ui.internal.ide.IIDEHelpContextIds; |
| import org.eclipse.ui.internal.ide.LineDelimiterEditor; |
| import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; |
| |
| /** |
| * The IDEWorkspacePreferencePage is the page used to set IDE-specific preferences settings |
| * related to workspace. |
| |
| *Note:This class extends from PreferencePage,and there's no WorkspacePreferencePage class. |
| *Hence when the IDE settings doesn't appear in this preference page, this page will be empty. |
| */ |
| public class IDEWorkspacePreferencePage extends PreferencePage |
| implements IWorkbenchPreferencePage{ |
| |
| private Button autoBuildButton; |
| |
| private Button autoSaveAllButton; |
| |
| private IntegerFieldEditor saveInterval; |
| |
| private Button autoRefreshButton; |
| |
| private ResourceEncodingFieldEditor encodingEditor; |
| |
| private LineDelimiterEditor lineSeparatorEditor; |
| |
| //A boolean to indicate if the user settings were cleared. |
| private boolean clearUserSettings = false; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.preference.PreferencePage |
| */ |
| protected Control createContents(Composite parent) { |
| |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, |
| IIDEHelpContextIds.WORKSPACE_PREFERENCE_PAGE); |
| |
| Composite composite = createComposite(parent); |
| |
| PreferenceLinkArea area = new PreferenceLinkArea(composite, SWT.NONE, |
| "org.eclipse.ui.preferencePages.Startup", IDEWorkbenchMessages.IDEWorkspacePreferencePage_WorkbenchPreference_relatedLink,//$NON-NLS-1$ |
| (IWorkbenchPreferenceContainer) getContainer(),null); |
| |
| GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); |
| area.getControl().setLayoutData(data); |
| |
| Label space = new Label(composite,SWT.NONE); |
| space.setLayoutData(new GridData()); |
| |
| createAutoBuildPref(composite); |
| createSaveAllBeforeBuildPref(composite); |
| |
| createSpace(composite); |
| createSaveIntervalGroup(composite); |
| createSpace(composite); |
| createAutoRefreshControls(composite); |
| |
| Composite lower = new Composite(composite,SWT.NONE); |
| GridLayout lowerLayout = new GridLayout(); |
| lowerLayout.numColumns = 2; |
| lowerLayout.makeColumnsEqualWidth = true; |
| lower.setLayout(lowerLayout); |
| |
| lower.setLayoutData(new GridData( |
| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); |
| |
| createEncodingEditorControls(lower); |
| createLineSeparatorEditorControls(lower); |
| applyDialogFont(composite); |
| |
| return composite; |
| } |
| |
| protected void createSaveAllBeforeBuildPref(Composite composite) { |
| autoSaveAllButton = new Button(composite, SWT.CHECK); |
| autoSaveAllButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_savePriorToBuilding); |
| autoSaveAllButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_savePriorToBuildingToolTip); |
| autoSaveAllButton.setSelection(getIDEPreferenceStore().getBoolean( |
| IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD)); |
| } |
| |
| protected void createAutoBuildPref(Composite composite) { |
| autoBuildButton = new Button(composite, SWT.CHECK); |
| autoBuildButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_autobuild); |
| autoBuildButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_autobuildToolTip); |
| autoBuildButton.setSelection(ResourcesPlugin.getWorkspace() |
| .isAutoBuilding()); |
| } |
| |
| /** |
| * Create a composite that contains entry fields specifying save interval |
| * preference. |
| * |
| * @param composite the Composite the group is created in. |
| */ |
| private void createSaveIntervalGroup(Composite composite) { |
| Composite groupComposite = new Composite(composite, SWT.LEFT); |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 2; |
| groupComposite.setLayout(layout); |
| GridData gd = new GridData(); |
| gd.horizontalAlignment = GridData.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| groupComposite.setLayoutData(gd); |
| |
| saveInterval = new IntegerFieldEditor( |
| IDEInternalPreferences.SAVE_INTERVAL, IDEWorkbenchMessages.WorkbenchPreference_saveInterval, |
| groupComposite); |
| |
| // @issue we should drop our preference constant and let clients use |
| // core's pref. ours is not up-to-date anyway if someone changes this |
| // interval directly thru core api. |
| saveInterval.setPreferenceStore(getIDEPreferenceStore()); |
| saveInterval.setPage(this); |
| saveInterval.setTextLimit(Integer.toString( |
| IDEInternalPreferences.MAX_SAVE_INTERVAL).length()); |
| saveInterval.setErrorMessage(NLS.bind(IDEWorkbenchMessages.WorkbenchPreference_saveIntervalError, new Integer(IDEInternalPreferences.MAX_SAVE_INTERVAL))); |
| saveInterval |
| .setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE); |
| saveInterval.setValidRange(1, IDEInternalPreferences.MAX_SAVE_INTERVAL); |
| |
| IWorkspaceDescription description = ResourcesPlugin.getWorkspace() |
| .getDescription(); |
| long interval = description.getSnapshotInterval() / 60000; |
| saveInterval.setStringValue(Long.toString(interval)); |
| |
| saveInterval.setPropertyChangeListener(new IPropertyChangeListener() { |
| |
| public void propertyChange(PropertyChangeEvent event) { |
| if (event.getProperty().equals(FieldEditor.IS_VALID)) |
| setValid(saveInterval.isValid()); |
| } |
| }); |
| |
| } |
| |
| /** |
| * Create the Refresh controls |
| * |
| * @param parent |
| */ |
| private void createAutoRefreshControls(Composite parent) { |
| |
| this.autoRefreshButton = new Button(parent, SWT.CHECK); |
| this.autoRefreshButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_RefreshButtonText); |
| this.autoRefreshButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_RefreshButtonToolTip); |
| |
| boolean autoRefresh = ResourcesPlugin.getPlugin() |
| .getPluginPreferences().getBoolean( |
| ResourcesPlugin.PREF_AUTO_REFRESH); |
| this.autoRefreshButton.setSelection(autoRefresh); |
| } |
| |
| /** |
| * Create a composite that contains the encoding controls |
| * |
| * @param parent |
| */ |
| private void createEncodingEditorControls(Composite parent){ |
| Composite encodingComposite = new Composite(parent,SWT.NONE); |
| encodingComposite.setLayout(new GridLayout()); |
| encodingComposite.setLayoutData(new GridData( |
| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); |
| |
| encodingEditor = new ResourceEncodingFieldEditor(IDEWorkbenchMessages.WorkbenchPreference_encoding, encodingComposite, ResourcesPlugin |
| .getWorkspace().getRoot()); |
| |
| encodingEditor.setPage(this); |
| encodingEditor.load(); |
| encodingEditor.setPropertyChangeListener(new IPropertyChangeListener() { |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) |
| */ |
| public void propertyChange(PropertyChangeEvent event) { |
| if (event.getProperty().equals(FieldEditor.IS_VALID)) |
| setValid(encodingEditor.isValid()); |
| |
| } |
| }); |
| } |
| |
| /** |
| * Create a composite that contains the line delimiter controls |
| * |
| * @param parent |
| */ |
| private void createLineSeparatorEditorControls(Composite parent){ |
| Composite lineComposite = new Composite(parent,SWT.NONE); |
| lineComposite.setLayout(new GridLayout()); |
| lineComposite.setLayoutData(new GridData( |
| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); |
| |
| lineSeparatorEditor = new LineDelimiterEditor(lineComposite); |
| lineSeparatorEditor.doLoad(); |
| } |
| /** |
| * Returns the IDE preference store. |
| * @return the preference store. |
| */ |
| protected IPreferenceStore getIDEPreferenceStore() { |
| return IDEWorkbenchPlugin.getDefault().getPreferenceStore(); |
| } |
| |
| /** |
| * Creates a tab of one horizontal spans. |
| * |
| * @param parent |
| * the parent in which the tab should be created |
| */ |
| protected static void createSpace(Composite parent) { |
| Label vfiller = new Label(parent, SWT.LEFT); |
| GridData gridData = new GridData(); |
| gridData = new GridData(); |
| gridData.horizontalAlignment = GridData.BEGINNING; |
| gridData.grabExcessHorizontalSpace = false; |
| gridData.verticalAlignment = GridData.CENTER; |
| gridData.grabExcessVerticalSpace = false; |
| vfiller.setLayoutData(gridData); |
| } |
| |
| /** |
| * Creates the composite which will contain all the preference controls for |
| * this page. |
| * |
| * @param parent |
| * the parent composite |
| * @return the composite for this page |
| */ |
| protected Composite createComposite(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| composite.setLayout(layout); |
| composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL |
| | GridData.HORIZONTAL_ALIGN_FILL)); |
| return composite; |
| } |
| |
| public void init(org.eclipse.ui.IWorkbench workbench) { |
| //no-op |
| } |
| |
| /** |
| * The default button has been pressed. |
| */ |
| protected void performDefaults() { |
| |
| // core holds onto this preference. |
| boolean autoBuild = ResourcesPlugin.getPlugin().getPluginPreferences() |
| .getDefaultBoolean(ResourcesPlugin.PREF_AUTO_BUILDING); |
| autoBuildButton.setSelection(autoBuild); |
| |
| IPreferenceStore store = getIDEPreferenceStore(); |
| autoSaveAllButton |
| .setSelection(store |
| .getDefaultBoolean(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD)); |
| saveInterval.loadDefault(); |
| |
| |
| boolean autoRefresh = ResourcesPlugin.getPlugin() |
| .getPluginPreferences().getDefaultBoolean( |
| ResourcesPlugin.PREF_AUTO_REFRESH); |
| autoRefreshButton.setSelection(autoRefresh); |
| |
| clearUserSettings = true; |
| |
| List encodings = WorkbenchEncoding.getDefinedEncodings(); |
| Collections.sort(encodings); |
| encodingEditor.loadDefault(); |
| lineSeparatorEditor.loadDefault(); |
| |
| super.performDefaults(); |
| } |
| |
| /** |
| * The user has pressed Ok. Store/apply this page's values appropriately. |
| */ |
| public boolean performOk() { |
| // set the workspace auto-build flag |
| IWorkspaceDescription description = ResourcesPlugin.getWorkspace() |
| .getDescription(); |
| if (autoBuildButton.getSelection() != ResourcesPlugin.getWorkspace() |
| .isAutoBuilding()) { |
| try { |
| description.setAutoBuilding(autoBuildButton.getSelection()); |
| ResourcesPlugin.getWorkspace().setDescription(description); |
| } catch (CoreException e) { |
| IDEWorkbenchPlugin.log( |
| "Error changing auto build workspace setting.", e//$NON-NLS-1$ |
| .getStatus()); |
| } |
| } |
| |
| IPreferenceStore store = getIDEPreferenceStore(); |
| |
| // store the save all prior to build setting |
| store.setValue(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD, |
| autoSaveAllButton.getSelection()); |
| |
| // store the workspace save interval |
| // @issue we should drop our preference constant and let clients use |
| // core's pref. ours is not up-to-date anyway if someone changes this |
| // interval directly thru core api. |
| long oldSaveInterval = description.getSnapshotInterval() / 60000; |
| long newSaveInterval = new Long(saveInterval.getStringValue()) |
| .longValue(); |
| if (oldSaveInterval != newSaveInterval) { |
| try { |
| description.setSnapshotInterval(newSaveInterval * 60000); |
| ResourcesPlugin.getWorkspace().setDescription(description); |
| store.firePropertyChangeEvent( |
| IDEInternalPreferences.SAVE_INTERVAL, new Integer( |
| (int) oldSaveInterval), new Integer( |
| (int) newSaveInterval)); |
| } catch (CoreException e) { |
| IDEWorkbenchPlugin.log( |
| "Error changing save interval preference", e //$NON-NLS-1$ |
| .getStatus()); |
| } |
| } |
| |
| Preferences preferences = ResourcesPlugin.getPlugin() |
| .getPluginPreferences(); |
| |
| boolean autoRefresh = autoRefreshButton.getSelection(); |
| preferences.setValue(ResourcesPlugin.PREF_AUTO_REFRESH, autoRefresh); |
| |
| if (clearUserSettings) |
| IDEEncoding.clearUserEncodings(); |
| encodingEditor.store(); |
| lineSeparatorEditor.store(); |
| return super.performOk(); |
| } |
| |
| } |