misc changes
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / overlaypages / FieldEditorOverlayPage.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/overlaypages/FieldEditorOverlayPage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/overlaypages/FieldEditorOverlayPage.java
new file mode 100644 (file)
index 0000000..54daa64
--- /dev/null
@@ -0,0 +1,365 @@
+/*******************************************************************************
+ * Copyright (c) 2003 Berthold Daum.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     Berthold Daum
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.overlaypages;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.IWorkbenchPropertyPage;
+/**
+ * @author Berthold Daum
+ */
+public abstract class FieldEditorOverlayPage extends FieldEditorPreferencePage
+    implements
+      IWorkbenchPropertyPage {
+  /**
+   * * Name of resource property for the selection of workbench or project
+   * settings **
+   */
+  public static final String USEPROJECTSETTINGS = "useProjectSettings"; //$NON-NLS-1$
+  private static final String FALSE = "false"; //$NON-NLS-1$
+  private static final String TRUE = "true"; //$NON-NLS-1$
+  private boolean fUseFileSettings = false;
+  // Stores all created field editors
+  private List editors = new ArrayList();
+  // Stores owning element of properties
+  private IAdaptable element;
+  // Additional buttons for property pages
+  private Button useWorkspaceSettingsButton, useProjectSettingsButton,
+      configureButton;
+  // Overlay preference store for property pages
+  private IPreferenceStore overlayStore;
+  // The image descriptor of this pages title image
+  private ImageDescriptor image;
+  // Cache for page id
+  private String pageId;
+  /**
+   * Constructor
+   * 
+   * @param style -
+   *            layout style
+   */
+  public FieldEditorOverlayPage(int style) {
+    super(style);
+  }
+  /**
+   * Constructor
+   * 
+   * @param style -
+   *            layout style
+   */
+  public FieldEditorOverlayPage(int style, boolean isFileSettings) {
+    super(style);
+    fUseFileSettings = isFileSettings;
+  }
+  /**
+   * Constructor
+   * 
+   * @param title -
+   *            title string
+   * @param style -
+   *            layout style
+   */
+  public FieldEditorOverlayPage(String title, int style) {
+    super(title, style);
+  }
+  public FieldEditorOverlayPage(String title, int style, boolean isFileSettings) {
+    super(title, style);
+    fUseFileSettings = isFileSettings;
+  }
+  /**
+   * Constructor
+   * 
+   * @param title -
+   *            title string
+   * @param image -
+   *            title image
+   * @param style -
+   *            layout style
+   */
+  public FieldEditorOverlayPage(String title, ImageDescriptor image, int style) {
+    super(title, image, style);
+    this.image = image;
+  }
+  /**
+   * Returns the id of the current preference page as defined in plugin.xml
+   * Subclasses must implement.
+   * 
+   * @return - the qualifier
+   */
+  protected abstract String getPageId();
+  /**
+   * Receives the object that owns the properties shown in this property page.
+   * 
+   * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
+   */
+  public void setElement(IAdaptable element) {
+    this.element = element;
+  }
+  /**
+   * Delivers the object that owns the properties shown in this property page.
+   * 
+   * @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
+   */
+  public IAdaptable getElement() {
+    return element;
+  }
+  /**
+   * Returns true if this instance represents a property page
+   * 
+   * @return - true for property pages, false for preference pages
+   */
+  public boolean isPropertyPage() {
+    return getElement() != null;
+  }
+  /**
+   * We override the addField method. This allows us to store each field editor
+   * added by subclasses in a list for later processing.
+   * 
+   * @see org.eclipse.jface.preference.FieldEditorPreferencePage#addField(org.eclipse.jface.preference.FieldEditor)
+   */
+  protected void addField(FieldEditor editor) {
+    editors.add(editor);
+    super.addField(editor);
+  }
+  /**
+   * We override the createControl method. In case of property pages we create
+   * a new PropertyStore as local preference store. After all control have been
+   * create, we enable/disable these controls.
+   * 
+   * @see org.eclipse.jface.preference.PreferencePage#createControl()
+   */
+  public void createControl(Composite parent) {
+    // Special treatment for property pages
+    if (isPropertyPage()) {
+      // Cache the page id
+      pageId = getPageId();
+      // Create an overlay preference store and fill it with properties
+      overlayStore = new PropertyStore((IResource) getElement(), super
+          .getPreferenceStore(), pageId);
+      // Set overlay store as current preference store
+    }
+    super.createControl(parent);
+    // Update state of all subclass controls
+    if (isPropertyPage())
+      updateFieldEditors();
+  }
+  /**
+   * We override the createContents method. In case of property pages we insert
+   * two radio buttons at the top of the page.
+   * 
+   * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+   */
+  protected Control createContents(Composite parent) {
+    if (isPropertyPage())
+      createSelectionGroup(parent);
+    return super.createContents(parent);
+  }
+  /**
+   * Creates and initializes a selection group with two choice buttons and one
+   * push button.
+   * 
+   * @param parent -
+   *            the parent composite
+   */
+  private void createSelectionGroup(Composite parent) {
+    Composite comp = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout(2, false);
+    layout.marginHeight = 0;
+    layout.marginWidth = 0;
+    comp.setLayout(layout);
+    comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    Composite radioGroup = new Composite(comp, SWT.NONE);
+    radioGroup.setLayout(new GridLayout());
+    radioGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    useWorkspaceSettingsButton = createRadioButton(radioGroup, Messages
+        .getString("OverlayPage.Use_Workspace_Settings")); //$NON-NLS-1$
+    if (fUseFileSettings) {
+      useProjectSettingsButton = createRadioButton(radioGroup, Messages
+          .getString("OverlayPage.Use_File_Settings")); //$NON-NLS-1$
+    } else {
+      useProjectSettingsButton = createRadioButton(radioGroup, Messages
+          .getString("OverlayPage.Use_Project_Settings")); //$NON-NLS-1$
+    }
+    configureButton = new Button(comp, SWT.PUSH);
+    configureButton.setText(Messages
+        .getString("OverlayPage.Configure_Workspace_Settings")); //$NON-NLS-1$
+    configureButton.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent e) {
+        configureWorkspaceSettings();
+      }
+    });
+    // Set workspace/project radio buttons
+    try {
+      String use = ((IResource) getElement())
+          .getPersistentProperty(new QualifiedName(pageId, USEPROJECTSETTINGS));
+      if (TRUE.equals(use)) {
+        useProjectSettingsButton.setSelection(true);
+        configureButton.setEnabled(false);
+      } else
+        useWorkspaceSettingsButton.setSelection(true);
+    } catch (CoreException e) {
+      useWorkspaceSettingsButton.setSelection(true);
+    }
+  }
+  /**
+   * Convenience method creating a radio button
+   * 
+   * @param parent -
+   *            the parent composite
+   * @param label -
+   *            the button label
+   * @return - the new button
+   */
+  private Button createRadioButton(Composite parent, String label) {
+    final Button button = new Button(parent, SWT.RADIO);
+    button.setText(label);
+    button.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent e) {
+        configureButton.setEnabled(button == useWorkspaceSettingsButton);
+        updateFieldEditors();
+      }
+    });
+    return button;
+  }
+  /**
+   * Returns in case of property pages the overlay store, in case of preference
+   * pages the standard preference store
+   * 
+   * @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
+   */
+  public IPreferenceStore getPreferenceStore() {
+    if (isPropertyPage())
+      return overlayStore;
+    return super.getPreferenceStore();
+  }
+  /*
+   * Enables or disables the field editors and buttons of this page
+   */
+  private void updateFieldEditors() {
+    // We iterate through all field editors
+    boolean enabled = useProjectSettingsButton.getSelection();
+    updateFieldEditors(enabled);
+  }
+  /**
+   * Enables or disables the field editors and buttons of this page Subclasses
+   * may override.
+   * 
+   * @param enabled -
+   *            true if enabled
+   */
+  protected void updateFieldEditors(boolean enabled) {
+    Composite parent = getFieldEditorParent();
+    Iterator it = editors.iterator();
+    while (it.hasNext()) {
+      FieldEditor editor = (FieldEditor) it.next();
+      editor.setEnabled(enabled, parent);
+    }
+  }
+  /**
+   * We override the performOk method. In case of property pages we copy the
+   * values in the overlay store into the property values of the selected
+   * project. We also save the state of the radio buttons.
+   * 
+   * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+   */
+  public boolean performOk() {
+    boolean result = super.performOk();
+    if (result && isPropertyPage()) {
+      // Save state of radiobuttons in project properties
+      IResource resource = (IResource) getElement();
+      try {
+        String value = (useProjectSettingsButton.getSelection()) ? TRUE : FALSE;
+        resource.setPersistentProperty(new QualifiedName(pageId,
+            USEPROJECTSETTINGS), value);
+      } catch (CoreException e) {
+      }
+    }
+    return result;
+  }
+  /**
+   * We override the performDefaults method. In case of property pages we
+   * switch back to the workspace settings and disable the field editors.
+   * 
+   * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+   */
+  protected void performDefaults() {
+    if (isPropertyPage()) {
+      useWorkspaceSettingsButton.setSelection(true);
+      useProjectSettingsButton.setSelection(false);
+      configureButton.setEnabled(true);
+      updateFieldEditors();
+    }
+    super.performDefaults();
+  }
+  /**
+   * Creates a new preferences page and opens it
+   * 
+   * @see com.bdaum.SpellChecker.preferences.SpellCheckerPreferencePage#configureWorkspaceSettings()
+   */
+  protected void configureWorkspaceSettings() {
+    try {
+      // create a new instance of the current class
+      IPreferencePage page = (IPreferencePage) this.getClass().newInstance();
+      page.setTitle(getTitle());
+      page.setImageDescriptor(image);
+      // and show it
+      showPreferencePage(pageId, page);
+    } catch (InstantiationException e) {
+      e.printStackTrace();
+    } catch (IllegalAccessException e) {
+      e.printStackTrace();
+    }
+  }
+  /**
+   * Show a single preference pages
+   * 
+   * @param id -
+   *            the preference page identification
+   * @param page -
+   *            the preference page
+   */
+  protected void showPreferencePage(String id, IPreferencePage page) {
+    final IPreferenceNode targetNode = new PreferenceNode(id, page);
+    PreferenceManager manager = new PreferenceManager();
+    manager.addToRoot(targetNode);
+    final PreferenceDialog dialog = new PreferenceDialog(getControl()
+        .getShell(), manager);
+    BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+      public void run() {
+        dialog.create();
+        dialog.setMessage(targetNode.getLabelText());
+        dialog.open();
+      }
+    });
+  }
+}