blob: 15fafef726515dc3c52adc62f1bcbb7a3749512f [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.widgets.Shell;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
/**
* A PaletteEntryFactory creates certain type of
* {@link org.eclipse.gef.palette.PaletteEntry PaletteEntries}.
*
* <p>
* This class only creates {@link org.eclipse.gef.palette.PaletteEntry
* PaletteEntries} in {@link org.eclipse.gef.palette.PaletteContainer
* PaletteContainers} and not directly in the
* {@link org.eclipse.gef.palette.PaletteRoot root}. It is recommended that
* sub-classes not do that either.
* </p>
*
* <p>
* To keep palette customization consistent across different types of editors,
* it is recommended that a new entry be created after the currently selected
* entry. If the new entry needs to be created inside the currently selected
* entry (i.e., if the currently selected entry is a
* <code>PaletteContainer</code>), it should be added as the last child. Look at
* {@link #determineContainerForNewEntry(PaletteEntry)} and
* {@link #determineIndexForNewEntry(PaletteContainer, PaletteEntry)} in this
* class and
* {@link org.eclipse.gef.ui.palette.customize.PaletteContainerFactory} to see
* what the general guidelines are for creating containers and leaf entries.
* </p>
*
* @author Pratik Shah
* @see org.eclipse.gef.ui.palette.PaletteCustomizer
* @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog
*/
public abstract class PaletteEntryFactory {
private String label;
private ImageDescriptor imageDescriptor;
/**
* This method is called when a new palette entry of the type supported by
* this <code>PaletteEntryFactory</code> is to be created.
*
* @param shell
* The <code>Shell</code> of the
* <code>PaletteCustomizerDialog</code>
* @param selected
* The <code>PaletteEntry</code> that was selected in the outline
* when this action was launched. Will never be <code>null</code>
* .
* @return PaletteEntry The newly created <code>PaletteEntry</code>
*/
public PaletteEntry createNewEntry(Shell shell, PaletteEntry selected) {
PaletteContainer parent = determineContainerForNewEntry(selected);
int index = determineIndexForNewEntry(parent, selected);
PaletteEntry entry = createNewEntry(shell);
parent.add(index, entry);
return entry;
}
/**
* Create the PaletteEntry
*
* @param shell
* The <code>Shell</code> of the
* <code>PaletteCustomizerDialog</code>; it can be used to create
* another warning or information dialog.
* @return The newly created entry
*/
protected abstract PaletteEntry createNewEntry(Shell shell);
/**
* This method is called by the <code>PaletteCustomizerDialog</code> to
* determine whether to enable or disable this action on the toolbar and the
* context menu.
* <P>
* This default implementation allows the creation of a new entry only in
* <code>PaletteContainer</code>s with the following user permission:
* <code>PERMISSION_FULL_MODIFICATION</code>
*
* @param selected
* The selected <code>PaletteEntry</code> (Will never be
* <code>null</code>)
* @return <code>true</code> if, given the current selection, this
* <code>PaletteEntryFactory</code> can create a new
* <code>PaletteEntry</code>
*/
public boolean canCreate(PaletteEntry selected) {
if (selected instanceof PaletteRoot)
return false;
PaletteContainer parent;
if (selected instanceof PaletteContainer)
parent = (PaletteContainer) selected;
else
parent = selected.getParent();
return parent.getUserModificationPermission() == PaletteEntry.PERMISSION_FULL_MODIFICATION
&& parent.acceptsType(determineTypeForNewEntry(selected));
}
/**
* Given the current selection, this method determines the parent for the
* new entry to be created.
*
* <p>
* Sub-classes may override this method.
* </p>
*
* @param selected
* The selected entry
* @return The parent of the new entry to be created
*/
protected PaletteContainer determineContainerForNewEntry(
PaletteEntry selected) {
if (selected instanceof PaletteContainer)
return (PaletteContainer) selected;
return selected.getParent();
}
/**
* Given the current selection, this method determines the type of the new
* entry to be created.
*
* <p>
* Sub-classes may override this method.
* </p>
*
* @param selected
* The selected entry
* @return The type of the new entry to be created
*/
protected Object determineTypeForNewEntry(PaletteEntry selected) {
return PaletteEntry.PALETTE_TYPE_UNKNOWN;
}
/**
* Calculates the index at which the new entry is to be created, given the
* current selection.
*
* <p>
* Sub-classes may override this method.
* </p>
*
* @param c
* The parent container
* @param selected
* The selected entry
* @return the index at which the new entry should be added in the given
* container (-1 indicates add at the end)
*/
protected int determineIndexForNewEntry(PaletteContainer c,
PaletteEntry selected) {
return c.getChildren().indexOf(selected) + 1;
}
/**
* @return <code>ImageDescriptor</code> used to create the image to
* represent this factory
*/
public ImageDescriptor getImageDescriptor() {
return imageDescriptor;
}
/**
* @return This factory's name
*/
public String getLabel() {
return label;
}
/**
* Sets the <code>ImageDescriptor</code> used to create the image to
* represent this factory
*
* @param imgDesc
* The new ImageDescriptor
*/
public void setImageDescriptor(ImageDescriptor imgDesc) {
imageDescriptor = imgDesc;
}
/**
* Sets this factory's name. It will be used to list this factory in the
* toolbar, context menu, etc.
*
* @param newLabel
* The new name for this factory
*/
public void setLabel(String newLabel) {
label = newLabel;
}
}