首先,我按照这里的说明进行操作:
Project specific preference page in Eclipse RCP application
但我仍然无法在Eclipse中创建项目特定的首选项页面。
此外,我需要访问工作区中所有现有项目的所有自定义首选项值。我该如何访问它?
我的尝试:
我在plugin.xml中添加了以下扩展名:
<extension point="org.eclipse.ui.propertyPages">
<page class="com.test.PropertiesPage"
id="com.test.projectPropertiesPage" name="%appHandle">
<enabledWhen>
<and>
<instanceof
value="org.eclipse.core.resources.IFile">
</instanceof>
<adapt type="org.eclipse.core.resources.IResource" >
<test property="org.eclipse.core.resources.projectNature"
value="com.test.runtime.nature" />
</adapt>
</and>
</enabledWhen>
</page>
</extension>
在我的插件源代码中,我添加了类:com.test.PropertiesPage(following this tutorial)。但是首选项页面没有加载或没有出现。在这种情况下我能做些什么?
public abstract class PropertiesPage extends PropertyPage {
/*** Name of resource property for the selection of workbench or project settings ***/
public static final String USEPROJECTSETTINGS = "Use Project Settings"; //$NON-NLS-1$
private static final String FALSE = "false"; //$NON-NLS-1$
private static final String TRUE = "true"; //$NON-NLS-1$
// Additional buttons for property pages
private Button useWorkspaceSettingsButton,
useProjectSettingsButton,
configureButton;
// Overlay preference store for property pages
private PropertyStore propertyStore;
// The image descriptor of this pages title image
private ImageDescriptor image;
// Cache for page id
private String pageId;
// Container for subclass controls
private Composite contents;
/**
* Constructor
*/
public PropertiesPage() {
super();
}
/**
* Constructor
* @param title - title string
*/
public PropertiesPage(String title) {
super();
setTitle(title);
}
/**
* Constructor
* @param title - title string
* @param image - title image
*/
public PropertiesPage(String title, ImageDescriptor image) {
super();
setTitle(title);
setImageDescriptor(image);
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();
/**
* 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 need to implement createContents method. In case of property pages we insert two radio buttons
* and a push button at the top of the page. Below this group we create a new composite for the contents
* created by subclasses.
*
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents(Composite parent) {
if (isPropertyPage())
createSelectionGroup(parent);
contents = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
contents.setLayout(layout);
contents.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return contents;
}
/**
* 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("Use workspace setting")); //$NON-NLS-1$
useProjectSettingsButton = createRadioButton(radioGroup, Messages.getString("Use project setting")); //$NON-NLS-1$
configureButton = new Button(comp, SWT.PUSH);
configureButton.setText(Messages.getString("Configure workspace setting")); //$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);
setControlsEnabled();
}
});
return button;
}
/**
* In case of property pages we create a new PropertyStore as local overlay store.
* After all controls 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
propertyStore =
new PropertyStore(
(IResource) getElement(),
super.getPreferenceStore(),
pageId);
// Set overlay store as current preference store
}
super.createControl(parent);
// Update enablement of all subclass controls
if (isPropertyPage())
setControlsEnabled();
}
/*
* Returns in case of property pages the overlay store - otherwise the standard preference store
* @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
*/
public IPreferenceStore getPreferenceStore() {
if (isPropertyPage())
return propertyStore;
return super.getPreferenceStore();
}
/**
* Enables or disables the controls of this page
*/
private void setControlsEnabled() {
boolean enabled = useProjectSettingsButton.getSelection();
setControlsEnabled(enabled);
}
/**
* Enables or disables the controls of this page
* Subclasses may override.
*
* @param enabled - true if controls shall be enabled
*/
protected void setControlsEnabled(boolean enabled) {
setControlsEnabled(contents, enabled);
}
/**
* Enables or disables a tree of controls starting at the specified root.
* We spare tabbed notebooks and pagebooks to allow for user navigation.
*
* @param root - the root composite
* @param enabled - true if controls shall be enabled
*/
private void setControlsEnabled(Composite root, boolean enabled) {
Control[] children = root.getChildren();
for (int i = 0; i < children.length; i++) {
Control child = children[i];
if (!(child instanceof CTabFolder) && !(child instanceof TabFolder) && !(child instanceof PageBook))
child.setEnabled(enabled);
if (child instanceof Composite)
setControlsEnabled((Composite) child, enabled);
}
}
/**
* We override the performOk method. In case of property pages
* we 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 page controls.
*
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
protected void performDefaults() {
if (isPropertyPage()) {
useWorkspaceSettingsButton.setSelection(true);
useProjectSettingsButton.setSelection(false);
configureButton.setEnabled(true);
setControlsEnabled();
}
super.performDefaults();
}
/**
* Creates a new preferences page and opens it
*/
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();
}
});
}
}