X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/overlaypages/FieldEditorOverlayPage.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/overlaypages/FieldEditorOverlayPage.java index 7564fe2..fd3fa65 100644 --- a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/overlaypages/FieldEditorOverlayPage.java +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/ui/overlaypages/FieldEditorOverlayPage.java @@ -9,6 +9,7 @@ * Berthold Daum *******************************************************************************/ package net.sourceforge.phpeclipse.ui.overlaypages; + import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -36,331 +37,366 @@ 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(); - } - }); - } + 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(); + } + }); + } }