eclipse中的项目特定首选项页面

时间:2015-03-20 11:03:46

标签: java eclipse eclipse-plugin

首先,我按照这里的说明进行操作:

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();
            }
        });
    }

}

0 个答案:

没有答案