/******************************************************************************* * 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 *******************************************************************************/ package org.eclipse.gef.ui.palette.customize; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.gef.palette.PaletteEntry; import org.eclipse.gef.palette.PaletteSeparator; import org.eclipse.gef.ui.palette.PaletteMessages; /** * This is a default implementation of the {@link EntryPage} interface. It displays the * entry's label, description and visible fields (and allows for their modification). It * is live in the sense that the model is updated with the changes immediately (on every * keystroke). * * @author Pratik Shah */ public class DefaultEntryPage implements EntryPage { private EntryPageContainer container; /** * This is the panel that is created by {@link #createControl(Composite, PaletteEntry)}. * It will be <code>null</code> if that method hasn't been invoked yet. */ private Composite panel; /** * This is the <code>PaletteEntry</code> that this page represents. It will be * <code>null</code> until {@link #createControl(Composite, PaletteEntry)} is invoked. */ private PaletteEntry entry; /** * Being live, this method is completely ignored. Model is updated with * every keystroke. So, there is no need to wait for this method to be called * to actually make the changes to the model. */ public final void apply() { } /** * @see org.eclipse.gef.ui.palette.customize.EntryPage#createControl(Composite, * PaletteEntry) */ public void createControl(Composite parent, PaletteEntry entry) { this.entry = entry; panel = new Composite(parent, SWT.NONE); panel.setFont(parent.getFont()); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; panel.setLayout(gridLayout); Control[] tablist = new Control[3]; createLabel(panel, SWT.NONE, PaletteMessages.NAME_LABEL); tablist[0] = createNameText(panel); createLabel(panel, SWT.NONE, PaletteMessages.DESCRIPTION_LABEL); tablist[1] = createDescText(panel); tablist[2] = createHiddenCheckBox(panel); panel.setTabList(tablist); } /** * Creates the <code>Text</code> where the description of the entry is to be displayed. * * @param panel The Composite in which the <code>Text</code> is to be created * @return The newly created <code>Text</code> */ protected Text createDescText(Composite panel) { String desc = entry.getDescription(); Text description = createText(panel, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL, desc); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 150; data.heightHint = description.computeTrim(0, 0, 10, FigureUtilities.getFontMetrics(description.getFont()).getHeight() * 2).height; description.setLayoutData(data); if (getPermission() >= PaletteEntry.PERMISSION_LIMITED_MODIFICATION) { description.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { handleDescriptionChanged(((Text)e.getSource()).getText()); } }); } return description; } /** * Creates the <code>Button</code> (CheckBox) for indicating the hidden status of the * entry. It initializes it with the current hidden state of entry. * * @param panel The Composite in which the Button is to be created * @return The newly created Button */ protected Button createHiddenCheckBox(Composite panel) { Button hidden = new Button(panel, SWT.CHECK); hidden.setFont(panel.getFont()); hidden.setText(PaletteMessages.HIDDEN_LABEL); hidden.setSelection(!entry.isVisible()); if (getPermission() == PaletteEntry.PERMISSION_NO_MODIFICATION) { hidden.setEnabled(false); } else { hidden.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleHiddenSelected(((Button)e.getSource()).getSelection()); } }); } return hidden; } /** * Creates a label * * @param panel The Composite in which the Label is to be created * @param style The stylebits for the Label * @param text The Label's text * @return Label - The newly created Label */ protected Label createLabel(Composite panel, int style, String text) { Label label = new Label(panel, style); label.setFont(panel.getFont()); label.setText(text); return label; } /** * Creates the Text where the name of the entry is to be displayed. * * @param panel The Composite in which the Text is to be created * @return Text - The newly created Text */ protected Text createNameText(Composite panel) { Text name = createText(panel, SWT.SINGLE | SWT.BORDER, entry.getLabel()); if (getPermission() >= PaletteEntry.PERMISSION_LIMITED_MODIFICATION) { name.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { handleNameChanged(((Text)e.getSource()).getText()); } }); } name.setVisible(true); return name; } /** * Creates a <code>Text</code>. This method is mainly a result of code-factoring. * * @param panel The Composite in which the Text is to be created * @param style The stylebits for the Text * @param text The text to be displayed in the Text * @return a text widget with griddata constraint */ protected Text createText(Composite panel, int style, String text) { if (getEntry() instanceof PaletteSeparator || getPermission() < PaletteEntry.PERMISSION_LIMITED_MODIFICATION) { style = style | SWT.READ_ONLY; } Text textBox = new Text(panel, style); textBox.setFont(panel.getFont()); if (text != null) textBox.setText(text); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 200; textBox.setLayoutData(data); return textBox; } /** * @see org.eclipse.gef.ui.palette.customize.EntryPage#getControl() */ public Control getControl() { return panel; } /** * Provides sub-classes with access to the entry this class is monitoring. * * @return PaletteEntry - The entry this class is monitoring */ protected PaletteEntry getEntry() { return entry; } /** * Sub-classes should override this method to provide appropriate error notification * messages. * * @return The message to be used when notifying listeners about a state change */ protected String getMessage() { return ""; //$NON-NLS-1$ } /** * @return The <code>EntryPageContainer</code> to which this page can report errors. */ protected EntryPageContainer getPageContainer() { return container; } /** * <p> * Updates the model with the change in the entry's description, and updates the state of * the page. * </p> * <p> * This method is invoked on every keystroke in the Text displaying the * description of the entry. * </p> * * @param text The new description */ protected void handleDescriptionChanged(String text) { getEntry().setDescription(text.trim()); } /** * <p> * Updates the model with the change in the entry's hidden state, and updates the state of * the page. * </p> * <p> * This method is invokes whenever the "Hidden" checkbox is selected. * </p> * * @param isChecked The new selection value */ protected void handleHiddenSelected(boolean isChecked) { getEntry().setVisible(!isChecked); } /** * <p> * Updates the model with the change in the entry's name, and updates the state of * the page. * </p> * <p> * This method is invoked on every keystroke in the Text displaying the * entry's name. * </p> * * @param text The new name */ protected void handleNameChanged(String text) { getEntry().setLabel(text.trim()); } /** * @return the user permission on the entry */ protected int getPermission() { return getEntry().getUserModificationPermission(); } /** * @see org.eclipse.gef.ui.palette.customize.EntryPage#setPageContainer(EntryPageContainer) */ public void setPageContainer(EntryPageContainer pageContainer) { container = pageContainer; } }