| /******************************************************************************* |
| * Copyright (c) 2001, 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 |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.ui.internal.preferences.ui; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.core.runtime.preferences.DefaultScope; |
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
| import org.eclipse.core.runtime.preferences.IPreferencesService; |
| import org.eclipse.core.runtime.preferences.IScopeContext; |
| import org.eclipse.jface.dialogs.ControlEnableState; |
| 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.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.swt.widgets.Label; |
| import org.eclipse.swt.widgets.TabFolder; |
| import org.eclipse.swt.widgets.TabItem; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.wst.sse.core.internal.tasks.TaskScanningScheduler; |
| import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys; |
| import org.eclipse.wst.sse.ui.internal.Logger; |
| import org.eclipse.wst.sse.ui.internal.SSEUIMessages; |
| import org.eclipse.wst.sse.ui.internal.SSEUIPlugin; |
| import org.eclipse.wst.sse.ui.internal.editor.IHelpContextIds; |
| import org.eclipse.wst.sse.ui.internal.preferences.TabFolderLayout; |
| import org.osgi.service.prefs.BackingStoreException; |
| |
| public class TaskTagPreferencePage extends PropertyPreferencePage { |
| |
| private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$ |
| // Remember the last displayed tab for convenience |
| private static final String TASK_TAG_LAST_TAB = "task-tag-last-tab"; //$NON-NLS-1$ |
| |
| private int detectionRequested = 0; |
| |
| private Button fEnableCheckbox = null; |
| |
| private boolean fEnableTaskTags = true; |
| |
| private boolean fOriginalEnableTaskTags = true; |
| |
| private IPreferencesService fPreferencesService = null; |
| |
| private Button fRedetectButton; |
| |
| private SelectionListener fTabEnablementListener; |
| |
| private TabFolder fTabFolder; |
| private IPreferenceTab[] fTabs = null; |
| |
| public TaskTagPreferencePage() { |
| super(); |
| fPreferencesService = Platform.getPreferencesService(); |
| } |
| |
| protected void contributeButtons(Composite parent) { |
| if (getElement() == null) { |
| ((GridLayout) parent.getLayout()).numColumns += 2; |
| fRedetectButton = new Button(parent, SWT.PUSH); |
| fRedetectButton.setText(SSEUIMessages.TaskTagPreferencePage_32); //$NON-NLS-1$ |
| fRedetectButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_FILL)); |
| fRedetectButton.setEnabled(true); |
| fRedetectButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| Job redetectJob = new Job(SSEUIMessages.TaskTagPreferenceTab_27) { //$NON-NLS-1$ |
| public Object getAdapter(Class adapter) { |
| return null; |
| } |
| |
| protected IStatus run(IProgressMonitor monitor) { |
| TaskScanningScheduler.refresh(); |
| return Status.OK_STATUS; |
| } |
| }; |
| redetectJob.schedule(); |
| } |
| }); |
| Label spacer = new Label(parent, SWT.NONE); |
| spacer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER)); |
| } |
| super.contributeButtons(parent); |
| } |
| |
| protected Control createCommonContents(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridLayout compositeLayout = new GridLayout(); |
| compositeLayout.marginLeft = 0; |
| compositeLayout.marginRight = 0; |
| composite.setLayout(compositeLayout); |
| |
| IScopeContext[] preferenceScopes = createPreferenceScopes(); |
| fOriginalEnableTaskTags = fEnableTaskTags = fPreferencesService.getBoolean(getPreferenceNodeQualifier(), TaskTagPreferenceKeys.TASK_TAG_ENABLE, false, preferenceScopes); |
| fEnableCheckbox = new Button(composite, SWT.CHECK); |
| fEnableCheckbox.setSelection(fEnableTaskTags); |
| fEnableCheckbox.setText(SSEUIMessages.TaskTagPreferenceTab_31); //$NON-NLS-1$ |
| fEnableCheckbox.setSelection(fEnableTaskTags); |
| fEnableCheckbox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_END, false, false, 1, 1)); |
| |
| fTabFolder = new TabFolder(composite, SWT.NONE); |
| fTabFolder.setLayout(new TabFolderLayout()); |
| fTabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); |
| |
| TabItem taskItem = new TabItem(fTabFolder, SWT.NONE); |
| MainTab mainTab = new MainTab(this, fPreferencesService, preferenceScopes); |
| taskItem.setText(mainTab.getTitle()); |
| final Control taskTagsControl = mainTab.createContents(fTabFolder); |
| taskItem.setControl(taskTagsControl); |
| |
| TabItem exclusionItem = new TabItem(fTabFolder, SWT.NONE); |
| ExclusionsTab exclusionsTab = new ExclusionsTab(this, fPreferencesService, preferenceScopes); |
| exclusionItem.setText(exclusionsTab.getTitle()); |
| final Control exclusionControl = exclusionsTab.createContents(fTabFolder); |
| exclusionItem.setControl(exclusionControl); |
| |
| fTabs = new IPreferenceTab[]{mainTab, exclusionsTab}; |
| |
| fTabEnablementListener = new SelectionAdapter() { |
| ControlEnableState[] lastEnableStates = null; |
| |
| public void widgetSelected(SelectionEvent e) { |
| fEnableTaskTags = fEnableCheckbox.getSelection(); |
| if (fEnableTaskTags) { |
| if (lastEnableStates != null) { |
| for (int i = 0; i < lastEnableStates.length; i++) { |
| if (lastEnableStates[i] != null) { |
| lastEnableStates[i].restore(); |
| } |
| } |
| lastEnableStates = null; |
| fTabFolder.redraw(); |
| } |
| } |
| else if (lastEnableStates == null) { |
| lastEnableStates = new ControlEnableState[fTabs.length + 1]; |
| lastEnableStates[0] = ControlEnableState.disable(taskTagsControl); |
| lastEnableStates[1] = ControlEnableState.disable(exclusionControl); |
| if (fRedetectButton != null) { |
| lastEnableStates[2] = ControlEnableState.disable(fRedetectButton); |
| } |
| } |
| } |
| }; |
| fTabEnablementListener.widgetSelected(null); |
| fEnableCheckbox.addSelectionListener(fTabEnablementListener); |
| |
| // restore last selected tab |
| int activeTab = new DefaultScope().getNode(getPreferenceNodeQualifier()).getInt(TASK_TAG_LAST_TAB, 0); |
| if (activeTab > 0) { |
| fTabFolder.setSelection(activeTab); |
| } |
| |
| SSEUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.PREFWEBX_TASKTAGS_HELPID); |
| return composite; |
| } |
| |
| protected String getPreferenceNodeQualifier() { |
| return TaskTagPreferenceKeys.TASK_TAG_NODE; |
| } |
| |
| protected String getPreferencePageID() { |
| return "org.eclipse.wst.sse.ui.preferences.tasktags";//$NON-NLS-1$ |
| |
| } |
| |
| protected String getProjectSettingsKey() { |
| return TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT; |
| } |
| |
| protected String getPropertyPageID() { |
| return "org.eclipse.wst.sse.ui.project.properties.tasktags";//$NON-NLS-1$ |
| } |
| |
| public String getTitle() { |
| return SSEUIMessages.TaskTagPreferenceTab_20; //$NON-NLS-1$ |
| } |
| |
| public void init(IWorkbench workbench) { |
| } |
| |
| public void performApply() { |
| super.performApply(); |
| save(); |
| |
| for (int i = 0; i < fTabs.length; i++) { |
| fTabs[i].performApply(); |
| } |
| |
| promptForRedetectIfNecessary(); |
| } |
| |
| public void performDefaults() { |
| super.performDefaults(); |
| IEclipsePreferences defaultPreferences = createPreferenceScopes()[1].getNode(getPreferenceNodeQualifier()); |
| fEnableTaskTags = defaultPreferences.getBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, false); |
| fEnableCheckbox.setSelection(fEnableTaskTags); |
| for (int i = 0; i < fTabs.length; i++) { |
| fTabs[i].performDefaults(); |
| } |
| fTabEnablementListener.widgetSelected(null); |
| if (_debugPreferences) { |
| System.out.println("Loading defaults in " + getClass().getName()); //$NON-NLS-1$ |
| } |
| } |
| |
| public boolean performOk() { |
| boolean ok = super.performOk(); |
| save(); |
| |
| for (int i = 0; i < fTabs.length; i++) { |
| fTabs[i].performOk(); |
| } |
| |
| promptForRedetectIfNecessary(); |
| |
| // save last tab (use Default scope since it won't be persisted) |
| new DefaultScope().getNode(getPreferenceNodeQualifier()).putInt(TASK_TAG_LAST_TAB, fTabFolder.getSelectionIndex()); |
| |
| IScopeContext[] contexts = createPreferenceScopes(); |
| // remove project-specific information if it's not enabled |
| if (getProject() != null && !isElementSettingsEnabled()) { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT); |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_CONTENTTYPES_IGNORED); |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES); |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_TAGS); |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " (" + true + ") in scope " + contexts[0].getName() + ":" + contexts[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| contexts[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_ENABLE); |
| } |
| for (int i = 0; i < contexts.length; i++) { |
| try { |
| contexts[i].getNode(getPreferenceNodeQualifier()).flush(); |
| } |
| catch (BackingStoreException e) { |
| Logger.logException("problem saving preference settings to scope " + contexts[i].getName(), e); //$NON-NLS-1$ |
| } |
| } |
| |
| return ok; |
| } |
| |
| |
| private void promptForRedetectIfNecessary() { |
| if (detectionRequested > 0) { |
| MessageDialog dialog = new MessageDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SSEUIMessages.TaskTagPreferenceTab_22, PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getImage(), SSEUIMessages.TaskTagPreferenceTab_23, MessageDialog.QUESTION, new String[]{SSEUIMessages.TaskTagPreferenceTab_24, SSEUIMessages.TaskTagPreferenceTab_25, SSEUIMessages.TaskTagPreferenceTab_26}, 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ |
| int button = dialog.open(); |
| if (button == 0) { |
| Job redetectJob = new Job(SSEUIMessages.TaskTagPreferenceTab_27) { //$NON-NLS-1$ |
| public Object getAdapter(Class adapter) { |
| return null; |
| } |
| |
| protected IStatus run(IProgressMonitor monitor) { |
| if (getProject() == null) { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + ": rescanning all"); //$NON-NLS-1$ |
| } |
| TaskScanningScheduler.refresh(); |
| } |
| else { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + ": rescanning " + getProject()); //$NON-NLS-1$ |
| } |
| TaskScanningScheduler.refresh(getProject()); |
| } |
| return Status.OK_STATUS; |
| } |
| }; |
| redetectJob.schedule(500); |
| } |
| detectionRequested = 0; |
| } |
| } |
| |
| void requestRedetection() { |
| detectionRequested++; |
| } |
| |
| private void save() { |
| if (fEnableTaskTags != fOriginalEnableTaskTags) { |
| requestRedetection(); |
| } |
| fOriginalEnableTaskTags = fEnableTaskTags; |
| |
| IScopeContext[] preferenceScopes = createPreferenceScopes(); |
| IEclipsePreferences defaultPreferences = preferenceScopes[1].getNode(getPreferenceNodeQualifier()); |
| boolean defaultEnable = defaultPreferences.getBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, false); |
| if (fEnableTaskTags == defaultEnable) { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_ENABLE); |
| } |
| else { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_ENABLE + " \"" + fEnableTaskTags + "\" in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(TaskTagPreferenceKeys.TASK_TAG_ENABLE, fEnableTaskTags); |
| } |
| if (getProject() != null && isElementSettingsEnabled()) { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " (" + true + ") in scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| preferenceScopes[0].getNode(getPreferenceNodeQualifier()).putBoolean(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT, true); |
| } |
| else { |
| if (_debugPreferences) { |
| System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT + " from scope " + preferenceScopes[0].getName() + ":" + preferenceScopes[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| preferenceScopes[0].getNode(getPreferenceNodeQualifier()).remove(TaskTagPreferenceKeys.TASK_TAG_PER_PROJECT); |
| } |
| try { |
| fPreferencesService.getRootNode().flush(); |
| } |
| catch (BackingStoreException e) { |
| // log it, there is no recovery |
| Logger.logException(e); |
| } |
| } |
| } |