📄 preferencepage.java
字号:
/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Sebastian Davids <sdavids@gmx.de> - Fix for bug 38729 - [Preferences] * NPE PreferencePage isValid. *******************************************************************************/package org.eclipse.jface.preference;import org.eclipse.jface.dialogs.Dialog;import org.eclipse.jface.dialogs.DialogPage;import org.eclipse.jface.dialogs.IDialogConstants;import org.eclipse.jface.resource.ImageDescriptor;import org.eclipse.jface.resource.JFaceResources;import org.eclipse.jface.util.IPropertyChangeListener;import org.eclipse.jface.util.PropertyChangeEvent;import org.eclipse.swt.SWT;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.graphics.Font;import org.eclipse.swt.graphics.Point;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.swt.widgets.Event;import org.eclipse.swt.widgets.Label;/** * Abstract base implementation for all preference page implementations. * <p> * Subclasses must implement the <code>createControl</code> framework * method to supply the page's main control. * </p> * <p> * Subclasses should extend the <code>doComputeSize</code> framework * method to compute the size of the page's control. * </p> * <p> * Subclasses may override the <code>performOk</code>, <code>performApply</code>, * <code>performDefaults</code>, <code>performCancel</code>, and <code>performHelp</code> * framework methods to react to the standard button events. * </p> * <p> * Subclasses may call the <code>noDefaultAndApplyButton</code> framework * method before the page's control has been created to suppress * the standard Apply and Defaults buttons. * </p> */public abstract class PreferencePage extends DialogPage implements IPreferencePage { /** * Preference store, or <code>null</code>. */ private IPreferenceStore preferenceStore; /** * Valid state for this page; <code>true</code> by default. * * @see #isValid */ private boolean isValid = true; /** * Body of page. */ private Control body; /** * Whether this page has the standard Apply and Defaults buttons; * <code>true</code> by default. * * @see #noDefaultAndApplyButton */ private boolean createDefaultAndApplyButton = true; /** * Standard Defaults button, or <code>null</code> if none. * This button has id <code>DEFAULTS_ID</code>. */ private Button defaultsButton = null; /** * The container this preference page belongs to; <code>null</code> * if none. */ private IPreferencePageContainer container = null; /** * Standard Apply button, or <code>null</code> if none. * This button has id <code>APPLY_ID</code>. */ private Button applyButton = null; /** * Description label. * * @see #createDescriptionLabel(Composite) */ private Label descriptionLabel; /** * Caches size of page. */ private Point size = null; /** * Creates a new preference page with an empty title and no image. */ protected PreferencePage() { this(""); //$NON-NLS-1$ } /** * Creates a new preference page with the given title and no image. * * @param title the title of this preference page */ protected PreferencePage(String title) { super(title); } /** * Creates a new abstract preference page with the given title and image. * * @param title the title of this preference page * @param image the image for this preference page, * or <code>null</code> if none */ protected PreferencePage(String title, ImageDescriptor image) { super(title, image); } /** * Computes the size for this page's UI control. * <p> * The default implementation of this <code>IPreferencePage</code> * method returns the size set by <code>setSize</code>; if no size * has been set, but the page has a UI control, the framework * method <code>doComputeSize</code> is called to compute the size. * </p> * * @return the size of the preference page encoded as * <code>new Point(width,height)</code>, or * <code>(0,0)</code> if the page doesn't currently have any UI component */ public Point computeSize() { if (size != null) { return size; } Control control = getControl(); if (control != null) { size = doComputeSize(); return size; } return new Point(0, 0); } /** * Contributes additional buttons to the given composite. * <p> * The default implementation of this framework hook method does * nothing. Subclasses should override this method to contribute buttons * to this page's button bar. For each button a subclass contributes, * it must also increase the parent's grid layout number of columns * by one; that is, * <pre> * ((GridLayout) parent.getLayout()).numColumns++); * </pre> * </p> * * @param parent the button bar */ protected void contributeButtons(Composite parent) { } /** * Creates and returns the SWT control for the customized body * of this preference page under the given parent composite. * <p> * This framework method must be implemented by concrete subclasses. Any * subclass returning a <code>Composite</code> object whose <code>Layout</code> * has default margins (for example, a <code>GridLayout</code>) are expected to * set the margins of this <code>Layout</code> to 0 pixels. * </p> * * @param parent the parent composite * @return the new control */ protected abstract Control createContents(Composite parent); /** * The <code>PreferencePage</code> implementation of this * <code>IDialogPage</code> method creates a description label * and button bar for the page. It calls <code>createContents</code> * to create the custom contents of the page. * <p> * If a subclass that overrides this method creates a <code>Composite</code> * that has a layout with default margins (for example, a <code>GridLayout</code>) * it is expected to set the margins of this <code>Layout</code> to 0 pixels. */ public void createControl(Composite parent){ GridData gd; Composite content = new Composite(parent, SWT.NONE); setControl(content); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; content.setLayout(layout); //Apply the font on creation for backward compatibility applyDialogFont(content); // initialize the dialog units initializeDialogUnits(content); descriptionLabel = createDescriptionLabel(content); if (descriptionLabel != null) { descriptionLabel.setLayoutData(new GridData( GridData.FILL_HORIZONTAL)); } body = createContents(content); if (body != null) { // null is not a valid return value but support graceful failure body.setLayoutData(new GridData(GridData.FILL_BOTH)); } Composite buttonBar = new Composite(content, SWT.NONE); layout = new GridLayout(); layout.numColumns = 0; layout.marginHeight = 0; layout.marginWidth = 0; layout.makeColumnsEqualWidth = false; buttonBar.setLayout(layout); gd = new GridData(GridData.HORIZONTAL_ALIGN_END); buttonBar.setLayoutData(gd); contributeButtons(buttonBar); if (createDefaultAndApplyButton) { layout.numColumns = layout.numColumns + 2; String[] labels = JFaceResources.getStrings(new String[] { "defaults", "apply" }); //$NON-NLS-2$//$NON-NLS-1$ int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); defaultsButton = new Button(buttonBar, SWT.PUSH); defaultsButton.setText(labels[0]); Dialog.applyDialogFont(defaultsButton); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); Point minButtonSize = defaultsButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); data.widthHint = Math.max(widthHint, minButtonSize.x); defaultsButton.setLayoutData(data); defaultsButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { performDefaults(); } }); applyButton = new Button(buttonBar, SWT.PUSH); applyButton.setText(labels[1]); Dialog.applyDialogFont(applyButton); data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); minButtonSize = applyButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); data.widthHint = Math.max(widthHint, minButtonSize.x); applyButton.setLayoutData(data); applyButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { performApply(); } }); applyButton.setEnabled(isValid()); applyDialogFont(buttonBar); } else { /* Check if there are any other buttons on the button bar. * If not, throw away the button bar composite. Otherwise * there is an unusually large button bar. */ if (buttonBar.getChildren().length < 1) { buttonBar.dispose(); } } } /** * Apply the dialog font to the composite and it's children * if it is set. Subclasses may override if they wish to * set the font themselves. * @param composite */ protected void applyDialogFont(Composite composite) { Dialog.applyDialogFont(composite); } /** * Creates and returns an SWT label under the given composite. * * @param parent the parent composite * @return the new label */ protected Label createDescriptionLabel(Composite parent) { Label result = null; String description = getDescription(); if (description != null) { result = new Label(parent, SWT.WRAP); result.setFont(parent.getFont()); result.setText(description); } return result; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -