blob: 29c7a2173a3af1c6062cfd6d65ea3a07a490af47 [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.internal.ui.palette.editparts;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IMemento;
import org.eclipse.draw2d.FocusEvent;
import org.eclipse.draw2d.FocusListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RangeModel;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.ExposeHelper;
import org.eclipse.gef.MouseWheelHelper;
import org.eclipse.gef.editparts.ViewportExposeHelper;
import org.eclipse.gef.editparts.ViewportMouseWheelHelper;
import org.eclipse.gef.internal.InternalImages;
import org.eclipse.gef.internal.ui.palette.PaletteColorUtil;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteTemplateEntry;
import org.eclipse.gef.ui.palette.PaletteViewerPreferences;
import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart;
import org.eclipse.gef.ui.palette.editparts.PaletteAnimator;
import org.eclipse.gef.ui.palette.editparts.PaletteEditPart;
/**
* EditPart for a PaletteDrawer
*
* @author Pratik Shah
*/
public class DrawerEditPart extends PaletteEditPart implements
IPinnableEditPart {
private static final String PROPERTY_EXPANSION_STATE = "expansion"; //$NON-NLS-1$
private static final String PROPERTY_PINNED_STATE = "pinned"; //$NON-NLS-1$
/**
* Constructor
*
* @param drawer
* The PaletteDrawer that this EditPart is representing
*/
public DrawerEditPart(PaletteDrawer drawer) {
super(drawer);
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
public IFigure createFigure() {
DrawerFigure fig = new DrawerFigure(getViewer().getControl()) {
IFigure buildTooltip() {
return createToolTip();
}
};
fig.setExpanded(getDrawer().isInitiallyOpen());
fig.setPinned(getDrawer().isInitiallyPinned());
fig.getCollapseToggle().addFocusListener(new FocusListener.Stub() {
public void focusGained(FocusEvent fe) {
getViewer().select(DrawerEditPart.this);
}
});
fig.getScrollpane().getContents()
.addLayoutListener(getPaletteAnimator());
return fig;
}
/**
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
*/
public Object getAdapter(Class key) {
if (key == ExposeHelper.class) {
ViewportExposeHelper helper = new ViewportExposeHelper(this);
helper.setMinimumFrameCount(6);
helper.setMargin(new Insets(PaletteScrollBar.BUTTON_HEIGHT, 0,
PaletteScrollBar.BUTTON_HEIGHT, 0));
return helper;
}
if (key == MouseWheelHelper.class)
return new ViewportMouseWheelHelper(this);
return super.getAdapter(key);
}
private PaletteAnimator getPaletteAnimator() {
return (PaletteAnimator) getViewer().getEditPartRegistry().get(
PaletteAnimator.class);
}
/**
* Convenience method that provides access to the PaletteDrawer that is the
* model.
*
* @return The model PaletteDrawer
*/
public PaletteDrawer getDrawer() {
return (PaletteDrawer) getPaletteEntry();
}
/**
* Convenience method to get the DrawerFigure for the model drawer.
*
* @return The DrawerFigure created in {@link #createFigure()}
*/
public DrawerFigure getDrawerFigure() {
return (DrawerFigure) getFigure();
}
/**
* @see org.eclipse.gef.GraphicalEditPart#getContentPane()
*/
public IFigure getContentPane() {
return getDrawerFigure().getContentPane();
}
public boolean isExpanded() {
return getDrawerFigure().isExpanded();
}
public boolean isPinnedOpen() {
return getDrawerFigure().isPinnedOpen();
}
/**
* @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#nameNeededInToolTip()
*/
protected boolean nameNeededInToolTip() {
return false;
}
/**
* @return <code>true</code> if the DrawerFigure can be pinned open. This is
* only true when the drawer is expanded and the auto-collapse
* strategy is
* <code>PaletteViewerPreferences.COLLAPSE_AS_NEEDED</code>.
*/
public boolean canBePinned() {
return getDrawerFigure().isPinShowing();
}
/**
* @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#createAccessible()
*/
protected AccessibleEditPart createAccessible() {
return new AccessibleGraphicalEditPart() {
public void getDescription(AccessibleEvent e) {
e.result = getPaletteEntry().getDescription();
}
public void getName(AccessibleEvent e) {
e.result = getPaletteEntry().getLabel();
}
public void getRole(AccessibleControlEvent e) {
e.detail = ACC.ROLE_TREE;
}
public void getState(AccessibleControlEvent e) {
super.getState(e);
e.detail |= isExpanded() ? ACC.STATE_EXPANDED
: ACC.STATE_COLLAPSED;
}
};
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
protected void refreshVisuals() {
getDrawerFigure().setToolTip(createToolTip());
ImageDescriptor img = getDrawer().getSmallIcon();
if (img == null && getDrawer().showDefaultIcon()) {
img = InternalImages.DESC_FOLDER_OPEN;
}
setImageDescriptor(img);
getDrawerFigure().setTitle(getPaletteEntry().getLabel());
getDrawerFigure().setLayoutMode(getLayoutSetting());
boolean showPin = getPreferenceSource().getAutoCollapseSetting() == PaletteViewerPreferences.COLLAPSE_AS_NEEDED;
getDrawerFigure().showPin(showPin);
Color background = getDrawer().getDrawerType().equals(
PaletteTemplateEntry.PALETTE_TYPE_TEMPLATE) ? PaletteColorUtil.WIDGET_LIST_BACKGROUND
: null;
getDrawerFigure().getScrollpane().setBackgroundColor(background);
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#register()
*/
protected void register() {
super.register();
getPaletteAnimator().addDrawer(this);
getFigure().addLayoutListener(getPaletteAnimator());
}
/**
* @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#restoreState(org.eclipse.ui.IMemento)
*/
public void restoreState(IMemento memento) {
setExpanded(new Boolean(memento.getString(PROPERTY_EXPANSION_STATE))
.booleanValue());
setPinnedOpen(new Boolean(memento.getString(PROPERTY_PINNED_STATE))
.booleanValue());
RangeModel rModel = getDrawerFigure().getScrollpane().getViewport()
.getVerticalRangeModel();
rModel.setMinimum(memento.getInteger(RangeModel.PROPERTY_MINIMUM)
.intValue());
rModel.setMaximum(memento.getInteger(RangeModel.PROPERTY_MAXIMUM)
.intValue());
rModel.setExtent(memento.getInteger(RangeModel.PROPERTY_EXTENT)
.intValue());
rModel.setValue(memento.getInteger(RangeModel.PROPERTY_VALUE)
.intValue());
super.restoreState(memento);
}
/**
* @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#saveState(org.eclipse.ui.IMemento)
*/
public void saveState(IMemento memento) {
memento.putString(PROPERTY_EXPANSION_STATE,
new Boolean(isExpanded()).toString());
memento.putString(PROPERTY_PINNED_STATE,
new Boolean(isPinnedOpen()).toString());
RangeModel rModel = getDrawerFigure().getScrollpane().getViewport()
.getVerticalRangeModel();
memento.putInteger(RangeModel.PROPERTY_MINIMUM, rModel.getMinimum());
memento.putInteger(RangeModel.PROPERTY_MAXIMUM, rModel.getMaximum());
memento.putInteger(RangeModel.PROPERTY_EXTENT, rModel.getExtent());
memento.putInteger(RangeModel.PROPERTY_VALUE, rModel.getValue());
super.saveState(memento);
}
/**
* Sets the expansion state of the DrawerFigure
*
* @param expanded
* <code>true</code> if the drawer is expanded; false otherwise.
*/
public void setExpanded(boolean expanded) {
getDrawerFigure().setExpanded(expanded);
}
/**
* @see org.eclipse.gef.ui.palette.editparts.PaletteEditPart#setImageInFigure(Image)
*/
protected void setImageInFigure(Image image) {
getDrawerFigure().setTitleIcon(image);
}
public void setPinnedOpen(boolean pinned) {
getDrawerFigure().setPinned(pinned);
}
/**
* @see org.eclipse.gef.EditPart#setSelected(int)
*/
public void setSelected(int value) {
super.setSelected(value);
getDrawerFigure().getCollapseToggle().requestFocus();
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#unregister()
*/
protected void unregister() {
getPaletteAnimator().removeDrawer(this);
super.unregister();
}
}