Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'archive/org.eclipse.qvt.declarative.editor.imp.runtime/src/org/eclipse/imp/preferences/ProjectPreferencesTab.java')
-rw-r--r--archive/org.eclipse.qvt.declarative.editor.imp.runtime/src/org/eclipse/imp/preferences/ProjectPreferencesTab.java499
1 files changed, 499 insertions, 0 deletions
diff --git a/archive/org.eclipse.qvt.declarative.editor.imp.runtime/src/org/eclipse/imp/preferences/ProjectPreferencesTab.java b/archive/org.eclipse.qvt.declarative.editor.imp.runtime/src/org/eclipse/imp/preferences/ProjectPreferencesTab.java
new file mode 100644
index 000000000..08ca5ed92
--- /dev/null
+++ b/archive/org.eclipse.qvt.declarative.editor.imp.runtime/src/org/eclipse/imp/preferences/ProjectPreferencesTab.java
@@ -0,0 +1,499 @@
+/*******************************************************************************
+* Copyright (c) 2007 IBM Corporation.
+* 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:
+* Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
+*******************************************************************************/
+
+package org.eclipse.imp.preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.imp.preferences.PreferencesUtilities.PreferenceChangeListener;
+import org.eclipse.imp.preferences.fields.BooleanFieldEditor;
+import org.eclipse.imp.preferences.fields.ColorFieldEditor;
+import org.eclipse.imp.preferences.fields.ComboFieldEditor;
+import org.eclipse.imp.preferences.fields.FontFieldEditor;
+import org.eclipse.imp.preferences.fields.RadioGroupFieldEditor;
+import org.eclipse.imp.preferences.fields.StringFieldEditor;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+import org.osgi.service.prefs.Preferences;
+
+public abstract class ProjectPreferencesTab extends PreferencesTab {
+ protected List<Link> detailsLinks = new ArrayList<Link>();
+
+ protected IProject fProject = null;
+
+ protected Combo selectedProjectCombo;
+
+ public ProjectPreferencesTab(IPreferencesService prefService, boolean noDetails) {
+ super(IPreferencesService.PROJECT_LEVEL, noDetails);
+ this.fPrefService = prefService;
+ fPrefUtils = new PreferencesUtilities(prefService);
+ }
+
+ @Override
+ public Composite createTabContents(TabbedPreferencesPage page, final TabFolder tabFolder) {
+ fPrefPage = page;
+
+ int numColumns= getNoDetails() ? 1 : 2;
+
+ GridLayout layout = null;
+
+ final Composite composite= new Composite(tabFolder, SWT.NONE);
+ composite.setFont(tabFolder.getFont());
+ final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gd.widthHint= 0;
+ gd.heightHint= SWT.DEFAULT;
+ gd.horizontalSpan= 1;
+ composite.setLayoutData(gd);
+
+ layout = new GridLayout();
+ layout.numColumns = numColumns;
+ composite.setLayout(layout);
+
+ // The "tab" on the tab folder
+ fTabItem = new TabItem(tabFolder, SWT.NONE);
+ fTabItem.setText("Project");
+ fTabItem.setControl(composite);
+ PreferencesTab.TabSelectionListener listener =
+ new PreferencesTab.TabSelectionListener(fPrefPage, fTabItem);
+ tabFolder.addSelectionListener(listener);
+
+ /*
+ * Add the elements relating to preferences fields and their associated "details" links.
+ */
+ fFields = createFields(page, composite);
+
+
+ // Clear some space
+ PreferencesUtilities.fillGridPlace(composite, numColumns);
+
+ // Disable the details links since no project is selected at the start
+ for (int i = 0; i < detailsLinks.size(); i++) {
+ ((Link)detailsLinks.get(i)).setEnabled(false);
+ }
+
+ PreferencesUtilities.fillGridPlace(composite, 2);
+
+ // Being newly loaded, the fields may be displayed with some
+ // indication that they have been modified. This should reset
+ // that marking.
+ clearModifiedMarksOnLabels();
+
+ /*
+ * Put in the elements related to selecting a project
+ */
+ Group groupHolder = new Group(composite, SWT.SHADOW_ETCHED_IN);
+ groupHolder.setText("Project selection");
+ groupHolder.setLayout(new GridLayout(2, false));
+ groupHolder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label projLabel= new Label(groupHolder, SWT.LEFT);
+ projLabel.setText("Project:");
+
+ selectedProjectCombo= new Combo(groupHolder, SWT.DROP_DOWN | SWT.READ_ONLY);
+ final Combo projCombo= selectedProjectCombo;
+ IProject[] pluginProjects= ResourcesPlugin.getWorkspace().getRoot().getProjects();
+
+ projCombo.add("none selected");
+ for(int i= 0; i < pluginProjects.length; i++) {
+ projCombo.add(pluginProjects[i].getName());
+ }
+ projCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) { }
+
+ public void widgetSelected(SelectionEvent e) {
+ String projName= projCombo.getText();
+ ProjectPreferencesTab.this.fPrefService.setProjectName(projName);
+ }
+ });
+ projCombo.setSize(150, 24);
+ Label pad = new Label(groupHolder, SWT.NONE);
+
+ // Clear these here in case there are any saved from a previous interaction with the page
+ // (assuming that we should start each new page with no project selected)
+ fPrefService.clearPreferencesAtLevel(IPreferencesService.PROJECT_LEVEL);
+
+ addProjectSelectionListener(composite);
+
+ PreferencesUtilities.fillGridPlace(composite, 3);
+
+ /*
+ * Put explanatory notes toward the bottom
+ * (not sure whether WRAP is helpful here; can manually
+ * wrap text in labels with '\n')
+ */
+
+ final Composite bottom = new Composite(composite, SWT.BOTTOM | SWT.WRAP);
+ layout = new GridLayout();
+ bottom.setLayout(layout);
+ bottom.setLayoutData(new GridData(SWT.BOTTOM));
+
+ Label bar = new Label(bottom, SWT.WRAP);
+ GridData data = new GridData();
+ data.verticalAlignment = SWT.WRAP;
+ bar.setLayoutData(data);
+ bar.setText("Preferences are shown here only when a project is selected.\n\n" +
+ "Preferences shown with a white background are set on this level.\n\n" +
+ "Preferences shown with a colored background are inherited from a\nhigher level.\n\n" +
+ Markings.MODIFIED_NOTE + "\n\n" +
+ Markings.TAB_ERROR_NOTE);
+
+ PreferencesUtilities.fillGridPlace(bottom, 1);
+
+ /*
+ * Put Restore Defaults and Apply buttons at the very bottom,
+ * disabled if (as expected) there is no project selected and
+ * the tab is otherwise mainly disabled
+ */
+ fButtons = fPrefUtils.createDefaultAndApplyButtons(composite, this);
+ if (fPrefService.getProject() == null) {
+ for (int i = 0; i < fButtons.length; i++)
+ fButtons[i].setEnabled(false);
+ }
+ return composite;
+ }
+
+
+ private void addProjectSelectionListener(Composite composite)
+ {
+ fPrefService.addProjectSelectionListener(new ProjectSelectionListener(composite));
+ }
+
+
+
+ private class ProjectSelectionListener implements PreferencesService.IProjectSelectionListener
+ {
+ Composite composite = null;
+ IEclipsePreferences.IPreferenceChangeListener currentListener = null;
+
+ ProjectSelectionListener(Composite composite) {
+ this.composite = composite;
+ }
+
+ /**
+ * Notification that a project was selected for inclusion in the preferences hierarchy.
+ * The given event must not be <code>null</code>.
+ *
+ * @param event an event specifying the details about the new node
+ * @see IEclipsePreferences.NodeChangeEvent
+ * @see IEclipsePreferences#addNodeChangeListener(IEclipsePreferences.INodeChangeListener)
+ * @see IEclipsePreferences#removeNodeChangeListener(IEclipsePreferences.INodeChangeListener)
+ */
+ public void selection(IPreferencesService.ProjectSelectionEvent event) {
+ addressProjectSelection(event, composite);
+ }
+ }
+
+
+ protected List<PreferenceChangeListener> currentListeners = new ArrayList<PreferenceChangeListener>();
+ protected List<IEclipsePreferences> currentListenerNodes = new ArrayList<IEclipsePreferences>();
+
+
+ protected void addressProjectSelection(IPreferencesService.ProjectSelectionEvent event, Composite composite) {
+ // TODO: Override in subtype with a real implementation
+// System.err.println("ProjectPreferencesTab.addressProjectSelection(..): unimplemented");
+
+ // SMS 20 Jun 2007
+ // Adding code from JikesPG project tab implementation to try
+ // to flesh out a skeleton (field-independent) implementation)
+ // just to see what there may be of that
+ boolean haveCurrentListeners = false;
+
+ Preferences oldeNode = event.getPrevious();
+ Preferences newNode = event.getNew();
+
+ if (oldeNode == null && newNode == null) {
+ // This is what happens for some reason when you clear the project selection.
+ // Nothing, really, to do in this case ...
+ return;
+ }
+
+ // If oldeNode is not null, we want to remove any preference-change listeners from it
+ if (oldeNode != null && oldeNode instanceof IEclipsePreferences && haveCurrentListeners) {
+ removeProjectPreferenceChangeListeners();
+ haveCurrentListeners = false;
+ } else {
+ // Print an advisory message if you want to
+ }
+
+ // If we have a new project preferences node, then do various things
+ // to set up the project's preferences
+ if (newNode != null && newNode instanceof IEclipsePreferences) {
+ // If the containing composite is not disposed, then set the fields' values
+ // and make them enabled and editable (as appropriate to the type of field)
+
+ if (!composite.isDisposed()) {
+ // Note: Where there are toggles between fields, it is a good idea to set the
+ // properties of the dependent field here according to the values they should have
+ // based on the independent field. There should be listeners to take care of
+ // that sort of adjustment once the tab is established, but when properties are
+ // first initialized here, the properties may not always be set correctly through
+ // the toggle. I'm not entirely sure why that happens, except that there may be
+ // a race condition between the setting of the dependent values by the listener
+ // and the setting of those values here. If the values are set by the listener
+ // first (which might be surprising, but may be possible) then they will be
+ // overwritten by values set here--so the values set here should be consistent
+ // with what the listener would set.
+
+ // Used in setting enabled and editable status
+// boolean enabledState = false;
+
+ // Example:
+// // Pretend field1 is a boolean field (checkbox)
+// prefUtils.setField(field1, field1.getHolder());
+// field1.getChangeControl().setEnabled(true);
+//
+// // Pretend field2 is a text-based field
+// prefUtils.setField(field2, field2.getHolder());
+// // field2 enabled iff field1 not checked
+// enabledState = !field1.getBooleanValue();
+// field2.getTextControl().setEditable(enabledState);
+// field2.getTextControl().setEnabled(enabledState);
+// field2.setEnabled(enabledState, field2.getParent());
+
+ // And so on for other fields
+
+ clearModifiedMarksOnLabels();
+ }
+
+ // Add property change listeners
+ // Example
+// if (field1.getHolder() != null) addProjectPreferenceChangeListeners(field1, PreferenceConstants.P_FIELD_1, field1.getHolder());
+// if (field2.getHolder() != null) addProjectPreferenceChangeListeners(fieldw, PreferenceConstants.P_FIELD_2, field2.getHolder());
+ // And so on for other fields ...
+
+ haveCurrentListeners = true;
+ }
+
+ // Or if we don't have a new project preferences node ...
+ if (newNode == null || !(newNode instanceof IEclipsePreferences)) {
+ // May happen when the preferences page is first brought up, or
+ // if we allow the project to be deselected
+
+ // Clear the preferences from the store
+ fPrefService.clearPreferencesAtLevel(IPreferencesService.PROJECT_LEVEL);
+
+ // Disable fields and make them non-editable
+ if (!composite.isDisposed()) {
+ // Example:
+// field1.getChangeControl().setEnabled(false);
+//
+// field2.getTextControl(field2.getHolder()).setEnabled(false);
+// field2.getTextControl(field2.getHolder()).setEditable(false);
+ }
+
+ // Remove listeners
+ removeProjectPreferenceChangeListeners();
+ haveCurrentListeners = false;
+ }
+ }
+
+
+
+ protected void addProjectPreferenceChangeListeners(BooleanFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ PreferencesUtilities.BooleanPreferenceChangeListener listener =
+ fPrefUtils.new BooleanPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+
+ protected void addProjectPreferenceChangeListeners(FontFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ PreferencesUtilities.FontPreferenceChangeListener listener =
+ fPrefUtils.new FontPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+
+ protected void addProjectPreferenceChangeListeners(ColorFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ PreferencesUtilities.ColorPreferenceChangeListener listener =
+ fPrefUtils.new ColorPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+
+ protected void addProjectPreferenceChangeListeners(ComboFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ PreferencesUtilities.ComboPreferenceChangeListener listener =
+ fPrefUtils.new ComboPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+
+ protected void addProjectPreferenceChangeListeners(RadioGroupFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ PreferencesUtilities.RadioGroupPreferenceChangeListener listener =
+ fPrefUtils.new RadioGroupPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+ protected void addProjectPreferenceChangeListeners(StringFieldEditor field, String key, Composite composite)
+ {
+ IEclipsePreferences[] nodes = fPrefService.getNodesForLevels();
+ for (int i = IPreferencesService.PROJECT_INDEX; i < nodes.length; i++) {
+ if (nodes[i] != null) {
+ // SMS 31 Oct 2006
+ //ProjectPreferenceChangeListener listener = new ProjectPreferenceChangeListener(field, key, composite);
+ PreferencesUtilities.StringPreferenceChangeListener listener =
+ fPrefUtils.new StringPreferenceChangeListener(field, key, composite);
+ nodes[i].addPreferenceChangeListener(listener);
+ currentListeners.add(listener);
+ currentListenerNodes.add(nodes[i]);
+ } else {
+ //System.err.println("ProjectPreferencesTab.addPropertyChangeListeners(..): no listener added at level = " + i + "; node at that level is null");
+ }
+ }
+ }
+
+
+
+ protected void removeProjectPreferenceChangeListeners()
+ {
+ // Remove all listeners from their respective nodes
+ for (int i = 0; i < currentListeners.size(); i++) {
+ ((IEclipsePreferences) currentListenerNodes.get(i)).removePreferenceChangeListener(
+ ((IEclipsePreferences.IPreferenceChangeListener)currentListeners.get(i)));
+ }
+ // Clear the lists
+ currentListeners = new ArrayList<PreferenceChangeListener>();
+ currentListenerNodes = new ArrayList<IEclipsePreferences>();
+ }
+
+
+ // SMS 20 Nov 2007:
+ protected void setProjectSelectionValidator(
+ ContainerSelectionDialog dialog, boolean validateForPluginProject, boolean validateForIDEProject)
+ {
+// dialog.setValidator(new ValidationUtils.ProjectSelectionValidator());
+ }
+
+
+ public void performApply()
+ {
+ if (fPrefService.getProject() == null) {
+ // No preferences node into which to store anything
+ clearModifiedMarksOnLabels(); // just in case fields still show modified
+ return;
+ }
+ for (int i = 0; i < fFields.length; i++) {
+ fFields[i].store();
+ fFields[i].clearModifiedMarkOnLabel();
+ }
+ }
+
+
+ public boolean performCancel() {
+ // Nullify the project in any case
+ fPrefService.setProject(null);
+ return true;
+ }
+
+
+ public void performDefaults() {
+ if (fPrefService.getProject() == null) {
+ // If no project set then there's no preferences
+ // file from which to load anything
+ return;
+ }
+
+ // Clear all preferences for this page at this level;
+ // "default" values will be set by inheritance from a higher level
+ PreferencesInitializer initializer = fPrefPage.getPreferenceInitializer();
+ initializer.clearPreferencesOnLevel(IPreferencesService.PROJECT_LEVEL);
+
+ for (int i = 0; i < fFields.length; i++) {
+ fFields[i].loadWithInheritance();
+ }
+ }
+
+
+ public boolean performOk()
+ {
+ if (fPrefService.getProject() != null) {
+ // Store each field
+ for (int i = 0; i < fFields.length; i++) {
+ fFields[i].store();
+ }
+ } else {
+ // Clear preferences because we're closing up dialog;
+ // note that a project preferences node will exist, if only
+ // in a leftover state, even when no project is selected
+ fPrefService.clearPreferencesAtLevel(IPreferencesService.PROJECT_LEVEL);
+ //return true;
+ }
+
+ // Nullify the project in any case
+ fPrefService.setProject(null);
+
+ return true;
+ }
+}

Back to the top