blob: 8ef9e507b52837557cd7aa4fec580694d1e79a63 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.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.draw2d.rap.swt.SWT;
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;
}
}