/* * Copyright 2009-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.codehaus.groovy.eclipse.preferences; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPersistentPreferenceStore; 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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbenchPropertyPage; import org.eclipse.ui.preferences.ScopedPreferenceStore; public abstract class FieldEditorOverlayPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage { // Stores all created field editors private final List<FieldEditor> editors = new ArrayList<FieldEditor>(); // 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; public FieldEditorOverlayPage(final int style) { super(style); } public FieldEditorOverlayPage(final String title, final int style) { super(title, style); } public FieldEditorOverlayPage(final String title, final ImageDescriptor image, final 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(final 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) */ @Override protected void addField(final 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() */ @Override public void createControl(final 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 = createPreferenceStore(); // Set overlay store as current preference store } super.createControl(parent); } private IPreferenceStore createPreferenceStore() { @SuppressWarnings("cast") IProject proj = (IProject) getElement().getAdapter(IProject.class); return preferenceStore(proj); } protected IPersistentPreferenceStore preferenceStore(IProject proj) { return new ScopedPreferenceStore(new ProjectScope(proj), "org.codehaus.groovy.eclipse.preferences"); } /** * 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) */ @Override protected Control createContents(final 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(final Composite parent) { final Composite comp = new Composite(parent, SWT.NONE); final GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; comp.setLayout(layout); comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Composite radioGroup = new Composite(comp, SWT.NONE); radioGroup.setLayout(new GridLayout()); radioGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } /** * 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() */ @Override public IPreferenceStore getPreferenceStore() { if (isPropertyPage()) return overlayStore; return super.getPreferenceStore(); } /** * 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 final IPreferencePage page = this.getClass().newInstance(); page.setTitle(getTitle()); page.setImageDescriptor(image); // and show it showPreferencePage(pageID, page); } catch (final InstantiationException e) { e.printStackTrace(); } catch (final IllegalAccessException e) { e.printStackTrace(); } } /** * Show a single preference pages * * @param id the preference page identification * @param page the preference page */ private void showPreferencePage(final String id, final IPreferencePage page) { final IPreferenceNode targetNode = new PreferenceNode(id, page); final 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(); } }); } }