Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2007 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> - bug 75886 *******************************************************************************/ package org.eclipse.team.internal.ui.dialogs; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.dialogs.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.*; import org.eclipse.jface.resource.*; import org.eclipse.jface.util.*; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.team.internal.ui.*; public class PreferencePageContainerDialog extends TrayDialog implements IPreferencePageContainer, IPageChangeProvider { private PreferencePage[] pages; private PreferencePage currentPage; private Composite fTitleArea; private Label fTitleImage; private CLabel fMessageLabel; private String fMessage; private Color fNormalMsgAreaBackground; private Image fErrorMsgImage; private Button fOkButton; private ListenerList pageChangedListeners = new ListenerList(); /** * The Composite in which a page is shown. */ private Composite fPageContainer; /** * The minimum page size; 200 by 200 by default. * * @see #setMinimumPageSize(Point) */ private Point fMinimumPageSize = new Point(200, 200); private TabFolder tabFolder; private Map pageMap = new HashMap(); /** * Must declare our own images as the JFaceResource images will not be created unless * a property/preference dialog has been shown */ protected static final String PREF_DLG_TITLE_IMG = "preference_page_container_image";//$NON-NLS-1$ protected static final String PREF_DLG_IMG_TITLE_ERROR = "preference_page_container_title_error_image";//$NON-NLS-1$ static { ImageRegistry reg = TeamUIPlugin.getPlugin().getImageRegistry(); reg.put(PREF_DLG_TITLE_IMG, ImageDescriptor.createFromFile(PreferenceDialog.class, "images/pref_dialog_title.gif"));//$NON-NLS-1$ reg.put(PREF_DLG_IMG_TITLE_ERROR, ImageDescriptor.createFromFile(Dialog.class, "images/message_error.gif"));//$NON-NLS-1$ } public PreferencePageContainerDialog(Shell shell, PreferencePage[] pages) { super(shell); this.pages = pages; } /** * @see Dialog#okPressed() */ protected void okPressed() { for (int i = 0; i < pages.length; i++) { PreferencePage page = pages[i]; page.performOk(); } handleSave(); super.okPressed(); } /** * Sets the title for this dialog. * @param title the title. */ public void setTitle(String title) { Shell shell = getShell(); if ((shell != null) && !shell.isDisposed()) { shell.setText(title); } } /** * @see Dialog#createDialogArea(Composite) */ protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); ((GridLayout) composite.getLayout()).numColumns = 1; createDescriptionArea(composite); if (isSinglePage()) { createSinglePageArea(composite, pages[0]); } else { createMultiplePageArea(composite); } // Build the separator line Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; separator.setLayoutData(gd); setTitle(TeamUIMessages.PreferencePageContainerDialog_6); applyDialogFont(parent); composite.addHelpListener(new HelpListener() { public void helpRequested(HelpEvent e) { currentPage.performHelp(); } }); return composite; } private void createMultiplePageArea(Composite composite) { // create a tab folder for the page tabFolder = new TabFolder(composite, SWT.NONE); tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); for (int i = 0; i < pages.length; i++) { PreferencePage page = pages[i]; // text decoration options TabItem tabItem = new TabItem(tabFolder, SWT.NONE); tabItem.setText(page.getTitle());// tabItem.setControl(createPageArea(tabFolder, page)); pageMap.put(tabItem, page); } tabFolder.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updatePageSelection(); } }); updatePageSelection(); } protected void updatePageSelection() { TabItem[] items = tabFolder.getSelection(); if (items.length == 1) { currentPage = (PreferencePage) pageMap.get(items[0]); updateMessage(); } firePageChanged(new PageChangedEvent(this, currentPage)); } private boolean isSinglePage() { return pages.length == 1; } /* * Create the page contents for a single preferences page */ private void createSinglePageArea(Composite composite, PreferencePage page) { createPageArea(composite, page); currentPage = page; updateMessage(); } private Control createPageArea(Composite composite, PreferencePage page) { // Build the Page container fPageContainer = createPageContainer(composite); fPageContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); page.setContainer(this); page.createControl(fPageContainer); return fPageContainer; } private void createDescriptionArea(Composite composite) { // Build the title area and separator line Composite titleComposite = new Composite(composite, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; titleComposite.setLayout(layout); titleComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createMessageArea(titleComposite); Label titleBarSeparator = new Label(titleComposite, SWT.HORIZONTAL | SWT.SEPARATOR); GridData gd = new GridData(GridData.FILL_HORIZONTAL); titleBarSeparator.setLayoutData(gd); } /** * Creates the dialog's title area. * * @param parent the SWT parent for the title area composite * @return the created title area composite */ private Composite createMessageArea(Composite parent) { // Create the title area which will contain // a title, message, and image. fTitleArea = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; layout.numColumns = 2; // Get the colors for the title area Display display = parent.getDisplay(); Color bg = JFaceColors.getBannerBackground(display); Color fg = JFaceColors.getBannerForeground(display); GridData layoutData = new GridData(GridData.FILL_BOTH); fTitleArea.setLayout(layout); fTitleArea.setLayoutData(layoutData); fTitleArea.setBackground(bg); // Message label fMessageLabel = new CLabel(fTitleArea, SWT.LEFT); fMessageLabel.setBackground(bg); fMessageLabel.setForeground(fg); fMessageLabel.setText(" ");//$NON-NLS-1$ fMessageLabel.setFont(JFaceResources.getBannerFont()); final IPropertyChangeListener fontListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (JFaceResources.BANNER_FONT.equals(event.getProperty()) || JFaceResources.DIALOG_FONT.equals(event.getProperty())) { updateMessage(); } } }; fMessageLabel.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { JFaceResources.getFontRegistry().removeListener(fontListener); } }); JFaceResources.getFontRegistry().addListener(fontListener); GridData gd = new GridData(GridData.FILL_BOTH); fMessageLabel.setLayoutData(gd); // Title image fTitleImage = new Label(fTitleArea, SWT.LEFT); fTitleImage.setBackground(bg); fTitleImage.setImage(TeamUIPlugin.getPlugin().getImageRegistry().get(PREF_DLG_TITLE_IMG)); gd = new GridData(); gd.horizontalAlignment = GridData.END; fTitleImage.setLayoutData(gd); updateMessage(); return fTitleArea; } /** * Creates the inner page container. */ private Composite createPageContainer(Composite parent) { Composite result = new Composite(parent, SWT.NULL); FillLayout layout = new FillLayout(); layout.marginHeight = 5; layout.marginWidth = 5; result.setLayout(layout); return result; } /** * Sets the minimum page size. * * @param size the page size encoded as * <code>new Point(width,height)</code> */ public void setMinimumPageSize(Point size) { fMinimumPageSize.x = size.x; fMinimumPageSize.y = size.y; } /** * Display the given error message. The currently displayed message * is saved and will be redisplayed when the error message is set * to <code>null</code>. * * @param errorMessage the errorMessage to display or <code>null</code> */ public void setErrorMessage(String errorMessage) { if (errorMessage == null) { if (fMessageLabel.getImage() != null) { // we were previously showing an error fMessageLabel.setBackground(fNormalMsgAreaBackground); fMessageLabel.setImage(null); fTitleImage.setImage(TeamUIPlugin.getPlugin().getImageRegistry().get(PREF_DLG_TITLE_IMG)); fTitleArea.layout(true); } // show the message setMessage(fMessage); } else { fMessageLabel.setText(errorMessage); if (fMessageLabel.getImage() == null) { // we were not previously showing an error // lazy initialize the error background color and image if (fErrorMsgImage == null) { fErrorMsgImage = TeamUIPlugin.getPlugin().getImageRegistry().get(PREF_DLG_IMG_TITLE_ERROR); } // show the error fNormalMsgAreaBackground = fMessageLabel.getBackground(); fMessageLabel.setBackground(JFaceColors.getErrorBackground(fMessageLabel.getDisplay())); fMessageLabel.setImage(fErrorMsgImage); fTitleImage.setImage(null); fTitleArea.layout(true); } } } /** * Set the message text. If the message line currently displays an error, * the message is stored and will be shown after a call to clearErrorMessage * @param newMessage */ public void setMessage(String newMessage) { fMessage = newMessage; if (fMessage == null) { fMessage = "";//$NON-NLS-1$ } if (fMessageLabel.getImage() == null) { // we are not showing an error fMessageLabel.setText(fMessage); } } /** * @see IPreferencePageContainer#updateMessage() */ public void updateMessage() { if (currentPage != null) { String pageMessage = currentPage.getMessage(); String pageErrorMessage = currentPage.getErrorMessage(); // Adjust the font if (pageMessage == null && pageErrorMessage == null) fMessageLabel.setFont(JFaceResources.getBannerFont()); else fMessageLabel.setFont(JFaceResources.getDialogFont()); // Set the message and error message if (pageMessage == null) { if (isSinglePage()) { setMessage(TeamUIMessages.PreferencePageContainerDialog_6); } else { //remove mnemonic see bug 75886 String title = currentPage.getTitle(); title = title.replaceAll("&", "");//$NON-NLS-1$ //$NON-NLS-2$ setMessage(title); } } else { setMessage(pageMessage); } setErrorMessage(pageErrorMessage); } } /** * @see IPreferencePageContainer#getPreferenceStore() */ public IPreferenceStore getPreferenceStore() { return null; } /** * @see IPreferencePageContainer#updateButtons() */ public void updateButtons() { if (fOkButton != null) { boolean isValid = true; for (int i = 0; i < pages.length; i++) { PreferencePage page = pages[i]; if (!page.isValid()) { isValid = false; break; } } fOkButton.setEnabled(isValid); } } /** * @see IPreferencePageContainer#updateTitle() */ public void updateTitle() { updateMessage(); } /** * @see Dialog#createButtonsForButtonBar(Composite) */ protected void createButtonsForButtonBar(Composite parent) { fOkButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * Save the values specified in the pages. * <p> * The default implementation of this framework method saves all * pages of type <code>PreferencePage</code> (if their store needs saving * and is a <code>PreferenceStore</code>). * </p> * <p> * Subclasses may override. * </p> */ protected void handleSave() { // Save now in case tbe workbench does not shutdown cleanly for (int i = 0; i < pages.length; i++) { PreferencePage page = pages[i]; IPreferenceStore store = page.getPreferenceStore(); if (store != null && store.needsSaving() && store instanceof IPersistentPreferenceStore) { try { ((IPersistentPreferenceStore) store).save(); } catch (IOException e) { Utils.handle(e); } } } } public void addPageChangedListener(final IPageChangedListener listener) { pageChangedListeners.add(listener); } public Object getSelectedPage() { return currentPage; } public void removePageChangedListener(IPageChangedListener listener) { pageChangedListeners.remove(listener); } private void firePageChanged(final PageChangedEvent event) { Object[] listeners = pageChangedListeners.getListeners(); for (int i = 0; i < listeners.length; i++) { final IPageChangedListener l = (IPageChangedListener) listeners[i]; SafeRunnable.run(new SafeRunnable() { public void run() { l.pageChanged(event); } }); } } }