### Eclipse Workspace Patch 1.0 #P org.eclipse.gef Index: src/org/eclipse/gef/ui/palette/PaletteContextMenuProvider.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteContextMenuProvider.java,v retrieving revision 1.28 diff -u -r1.28 PaletteContextMenuProvider.java --- src/org/eclipse/gef/ui/palette/PaletteContextMenuProvider.java 30 Mar 2005 21:27:02 -0000 1.28 +++ src/org/eclipse/gef/ui/palette/PaletteContextMenuProvider.java 4 Apr 2008 15:14:57 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2008 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 @@ -13,8 +13,9 @@ import org.eclipse.jface.action.IMenuManager; import org.eclipse.gef.ContextMenuProvider; -import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart; +import org.eclipse.gef.EditPart; import org.eclipse.gef.ui.actions.GEFActionConstants; +import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart; /** * Provides the context menu for a palette. @@ -51,12 +52,14 @@ public void buildContextMenu(IMenuManager menu) { GEFActionConstants.addStandardActionGroups(menu); - Object selectedPart = getPaletteViewer().getSelectedEditParts().get(0); - if (selectedPart instanceof DrawerEditPart - && ((DrawerEditPart)selectedPart).canBePinned()) { - menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, - new PinDrawerAction((DrawerEditPart)selectedPart)); - } + EditPart selectedPart = (EditPart) getPaletteViewer() + .getSelectedEditParts().get(0); + IPinnableEditPart pinnablePart = (IPinnableEditPart) selectedPart + .getAdapter(IPinnableEditPart.class); + if (pinnablePart != null && pinnablePart.canBePinned()) { + menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, + new PinDrawerAction(pinnablePart)); + } menu.appendToGroup(GEFActionConstants.GROUP_VIEW, new LayoutAction( getPaletteViewer().getPaletteViewerPreferences())); menu.appendToGroup(GEFActionConstants.GROUP_VIEW, new ChangeIconSizeAction( Index: src/org/eclipse/gef/ui/palette/PinDrawerAction.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PinDrawerAction.java,v retrieving revision 1.9 diff -u -r1.9 PinDrawerAction.java --- src/org/eclipse/gef/ui/palette/PinDrawerAction.java 30 Mar 2005 21:27:02 -0000 1.9 +++ src/org/eclipse/gef/ui/palette/PinDrawerAction.java 4 Apr 2008 15:14:57 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2008 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 @@ -13,15 +13,17 @@ import org.eclipse.jface.action.Action; import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart; +import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart; /** - * An action that can be used to pin the given drawer open. + * An action that can be used to pin the given pinnable palette editpart (drawer + * or stack) open. * * @author Pratik Shah */ public class PinDrawerAction extends Action { -private DrawerEditPart drawer; +private IPinnableEditPart pinnableEditPart; /** * Constructor @@ -29,19 +31,32 @@ * @param drawer The EditPart for the drawer that this action pins/unpins */ public PinDrawerAction (DrawerEditPart drawer) { - this.drawer = drawer; + this.pinnableEditPart = drawer; setChecked(drawer.isPinnedOpen()); setEnabled(drawer.isExpanded()); setText(PaletteMessages.PINNED); } /** - * Toggles the pinned open status of the drawer. + * Constructor + * + * @param pinnableEditPart the pinnable palette editpart + * @since 3.4 + */ +public PinDrawerAction(IPinnableEditPart pinnableEditPart) { + this.pinnableEditPart = pinnableEditPart; + setChecked(pinnableEditPart.isPinnedOpen()); + setEnabled(pinnableEditPart.isExpanded()); + setText(PaletteMessages.PINNED); +} + +/** + * Toggles the pinned open status of the pinnable palette editpart. * * @see org.eclipse.jface.action.Action#run() */ public void run() { - drawer.setPinnedOpen(!drawer.isPinnedOpen()); + pinnableEditPart.setPinnedOpen(!pinnableEditPart.isPinnedOpen()); } } Index: src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackFigure.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackFigure.java,v retrieving revision 1.1 diff -u -r1.1 PinnablePaletteStackFigure.java --- src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackFigure.java 1 Apr 2008 16:28:49 -0000 1.1 +++ src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackFigure.java 4 Apr 2008 15:14:57 -0000 @@ -16,7 +16,6 @@ import org.eclipse.swt.graphics.Color; -import org.eclipse.draw2d.AbstractHintLayout; import org.eclipse.draw2d.AbstractLayout; import org.eclipse.draw2d.Animation; import org.eclipse.draw2d.BorderLayout; @@ -130,53 +129,55 @@ } /** - * Layout manager for the palette stack figure that handles the layout of the - * headerFigure, expandablePane, and - * pinFigure when in list or details layout mode. + * Layout manager for the palette stack header figure that handles the layout of + * the headerFigure (pinFigure, + * arrowFigure, and the active tool figure) when in list or + * details layout mode. */ -private class PaletteStackListLayout - extends AbstractHintLayout { +private class HeaderListLayout + extends StackLayout { protected boolean isSensitiveVertically(IFigure container) { return false; } protected Dimension calculatePreferredSize(IFigure parent, int wHint, int hHint) { - Dimension headerSize = headerFigure.getPreferredSize(wHint, hHint); - - if (((PinnablePaletteStackFigure) parent).isExpanded()) { - Dimension paneSize = expandablePane.getPreferredSize(wHint, hHint); - return new Dimension(Math.max(headerSize.width, paneSize.width), - headerSize.height + paneSize.height); + if (isExpanded()) { + Dimension pinSize = pinFigure.getSize(); + Dimension preferredSize = super.calculatePreferredSize(parent, wHint + - pinSize.width, hHint); + preferredSize.width += pinSize.width; + return preferredSize; } else { - return headerSize; + return super.calculatePreferredSize(parent, wHint, hHint); } } public void layout(IFigure parent) { - Rectangle clientArea = Rectangle.SINGLETON; - parent.getClientArea(clientArea); - int wHint = clientArea.width; - int hHint = -1; - - Rectangle rect = new Rectangle(); - rect.setSize(headerFigure.getPreferredSize(wHint, hHint)); - rect.setLocation(clientArea.getTopLeft()); - headerFigure.setBounds(rect); - - if (((PinnablePaletteStackFigure) parent).isExpanded()) { - rect.translate(0, rect.height); - rect.setSize(expandablePane.getPreferredSize(wHint, hHint)); - expandablePane.setBounds(rect); - - rect.setSize(pinFigure.getPreferredSize()); - rect.setLocation(headerFigure.getBounds().right() - - rect.getSize().width, headerFigure.getBounds().getCenter().y - - (rect.getSize().height / 2)); - pinFigure.setBounds(rect); + Rectangle r = parent.getClientArea(); + List children = parent.getChildren(); + IFigure child; + + Dimension pinSize = isExpanded() ? pinFigure.getPreferredSize() + : EMPTY_DIMENSION; + + for (int i = 0; i < children.size(); i++) { + child = (IFigure) children.get(i); + if (child == arrowFigure) { + Rectangle.SINGLETON.setBounds(r); + Rectangle.SINGLETON.width = 11; + child.setBounds(Rectangle.SINGLETON); + } else if (child == pinFigure) { + Rectangle.SINGLETON.setSize(pinSize); + Rectangle.SINGLETON.setLocation(r.right() - pinSize.width, r + .getCenter().y + - (pinSize.height / 2)); + child.setBounds(Rectangle.SINGLETON); + } else { + child.setBounds(r.getResized(-pinSize.width, 0)); + } } - } } @@ -193,7 +194,7 @@ } public void layout(IFigure parent) { - if (((PinnablePaletteStackFigure) parent).isExpanded()) { + if (isExpanded()) { headerFigure.setBounds(headerBoundsLayoutHint); Rectangle paneBounds = parent.getClientArea(); @@ -295,6 +296,7 @@ headerFigure.add(arrowFigure); pinFigure = new PinFigure(); + pinFigure.setBorder(new MarginBorder(0, 0, 0, 2)); expandablePane = new Figure(); @@ -336,8 +338,8 @@ .getTopRight().getTranslated(-1, 1)); g.drawLine(headerBounds.getBottomLeft().getTranslated(1, 0), headerBounds.getTopLeft().getTranslated(1, 1)); - g.drawLine(headerBounds.getBottomRight().getTranslated(-1, 0), - headerBounds.getTopRight().getTranslated(-1, 1)); + g.drawLine(headerBounds.getBottomRight().getTranslated(-2, 0), + headerBounds.getTopRight().getTranslated(-2, 1)); g.drawLine(pinAreaBounds.getTopLeft().getTranslated(0, 1), pinAreaBounds.getTopRight().getTranslated(-1, 1)); @@ -350,10 +352,10 @@ points.addPoint(headerBounds.getTopLeft().getTranslated(0, 2)); points.addPoint(headerBounds.getTopLeft().getTranslated(1, 1)); points.addPoint(headerBounds.getTopLeft().getTranslated(2, 0)); - points.addPoint(headerBounds.getTopRight().getTranslated(-2, 0)); - points.addPoint(headerBounds.getTopRight().getTranslated(-1, 1)); - points.addPoint(headerBounds.getTopRight().getTranslated(0, 2)); - points.addPoint(headerBounds.getBottomRight()); + points.addPoint(headerBounds.getTopRight().getTranslated(-3, 0)); + points.addPoint(headerBounds.getTopRight().getTranslated(-2, 1)); + points.addPoint(headerBounds.getTopRight().getTranslated(-1, 2)); + points.addPoint(headerBounds.getBottomRight().getTranslated(-1, 0)); points.addPoint(pinAreaBounds.getTopRight().getTranslated(-1, 0)); points.addPoint(paneBounds.getBottomRight().getTranslated(-1, -1)); points.addPoint(paneBounds.getBottomLeft().getTranslated(0, -1)); @@ -368,9 +370,9 @@ g.drawPoint(pt.x, pt.y); pt = headerBounds.getTopLeft().getTranslated(1, 0); g.drawPoint(pt.x, pt.y); - pt = headerBounds.getTopRight().getTranslated(-1, 0); + pt = headerBounds.getTopRight().getTranslated(-2, 0); g.drawPoint(pt.x, pt.y); - pt = headerBounds.getTopRight().getTranslated(0, 1); + pt = headerBounds.getTopRight().getTranslated(-1, 1); g.drawPoint(pt.x, pt.y); } else { @@ -427,6 +429,19 @@ return isExpanded() && pinFigure.getModel().isSelected(); } +/** + * Pins or unpins the stack. The stack can be pinned open only when it is + * expanded. Attempts to pin it when it is collapsed will do nothing. + * + * @param pinned + * true if the stack is to be pinned + */ +public void setPinned(boolean pinned) { + if (isExpanded()) { + pinFigure.setSelected(pinned); + } +} + public void setExpanded(boolean value) { arrowFigure.setSelected(value); if (!value) { @@ -448,31 +463,13 @@ if (newLayoutMode == PaletteViewerPreferences.LAYOUT_LIST || newLayoutMode == PaletteViewerPreferences.LAYOUT_DETAILS) { - headerFigure.setLayoutManager(new StackLayout() { - - public void layout(IFigure figure) { - Rectangle r = figure.getClientArea(); - List children = figure.getChildren(); - IFigure child; - for (int i = 0; i < children.size(); i++) { - child = (IFigure) children.get(i); - if (child == arrowFigure) { - Rectangle.SINGLETON.setBounds(r); - Rectangle.SINGLETON.width = 11; - child.setBounds(Rectangle.SINGLETON); - } else { - child.setBounds(r); - } - } - } - }); + headerFigure.setLayoutManager(new HeaderListLayout()); expandablePane.setLayoutManager(new ToolbarLayout()); expandablePane.setBorder(new MarginBorder(1, 0, 1, 0)); - setLayoutManager(new PaletteStackListLayout()); + setLayoutManager(new ToolbarLayout()); } else { - headerFigure.setLayoutManager(new BorderLayout()); if (activeToolFigure != null) { headerFigure.setConstraint(activeToolFigure, BorderLayout.CENTER); @@ -482,7 +479,7 @@ setLayoutManager(new PaletteStackIconLayout()); // account for space used by pin figure - expandablePane.setBorder(new MarginBorder(18, 2, 2, 2)); + expandablePane.setBorder(new MarginBorder(18, 0, 0, 0)); if (layoutMode == PaletteViewerPreferences.LAYOUT_COLUMNS) { expandablePane.setLayoutManager(new ColumnsLayout()); @@ -515,12 +512,18 @@ if (isExpanded()) { if (expandablePane.getParent() != this) { add(expandablePane); - add(pinFigure); + + if (layoutMode == PaletteViewerPreferences.LAYOUT_LIST + || layoutMode == PaletteViewerPreferences.LAYOUT_DETAILS) { + headerFigure.add(pinFigure); + } else { + add(pinFigure); + } } } else { if (expandablePane.getParent() == this) { remove(expandablePane); - remove(pinFigure); + pinFigure.getParent().remove(pinFigure); } } } Index: src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackEditPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackEditPart.java,v retrieving revision 1.1 diff -u -r1.1 PinnablePaletteStackEditPart.java --- src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackEditPart.java 1 Apr 2008 16:28:49 -0000 1.1 +++ src/org/eclipse/gef/internal/ui/palette/editparts/PinnablePaletteStackEditPart.java 4 Apr 2008 15:14:57 -0000 @@ -23,6 +23,7 @@ import org.eclipse.gef.palette.PaletteStack; import org.eclipse.gef.palette.ToolEntry; import org.eclipse.gef.ui.palette.PaletteViewer; +import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart; import org.eclipse.gef.ui.palette.editparts.PaletteEditPart; /** @@ -35,7 +36,7 @@ */ public class PinnablePaletteStackEditPart extends PaletteEditPart - implements IPaletteStackEditPart { + implements IPaletteStackEditPart, IPinnableEditPart { // listen to see if active tool is changed in the palette private PaletteListener paletteListener = new PaletteListener() { @@ -200,11 +201,27 @@ } public void openMenu() { - getStackFigure().setExpanded(true); + setExpanded(true); +} + +public void setExpanded(boolean value) { + getStackFigure().setExpanded(value); } public boolean isExpanded() { return getStackFigure().isExpanded(); } +public boolean canBePinned() { + return isExpanded(); +} + +public boolean isPinnedOpen() { + return getStackFigure().isPinnedOpen(); +} + +public void setPinnedOpen(boolean pinned) { + getStackFigure().setPinned(pinned); +} + } Index: src/org/eclipse/gef/internal/ui/palette/editparts/GroupEditPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/GroupEditPart.java,v retrieving revision 1.11 diff -u -r1.11 GroupEditPart.java --- src/org/eclipse/gef/internal/ui/palette/editparts/GroupEditPart.java 1 Apr 2008 16:28:49 -0000 1.11 +++ src/org/eclipse/gef/internal/ui/palette/editparts/GroupEditPart.java 4 Apr 2008 15:14:56 -0000 @@ -10,9 +10,11 @@ *******************************************************************************/ package org.eclipse.gef.internal.ui.palette.editparts; +import org.eclipse.draw2d.Border; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.LayoutManager; +import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.gef.internal.ui.palette.PaletteColorUtil; @@ -24,6 +26,12 @@ extends PaletteEditPart { +/** Scrollpane border constant for icon and column layout mode **/ +private static final Border SCROLL_PANE_BORDER = new MarginBorder(2, 2, 2, 2); + +/** Scrollpane border constant for list and details layout mode **/ +private static final Border SCROLL_PANE_LIST_BORDER = new MarginBorder(2, 0, 2, 0); + private int cachedLayout = -1; public GroupEditPart(PaletteContainer group) { @@ -51,13 +59,16 @@ LayoutManager manager; if (layout == PaletteViewerPreferences.LAYOUT_COLUMNS) { manager = new ColumnsLayout(); + getContentPane().setBorder(SCROLL_PANE_BORDER); } else if (layout == PaletteViewerPreferences.LAYOUT_ICONS) { PaletteContainerFlowLayout flow = new PaletteContainerFlowLayout(); flow.setMajorSpacing(0); flow.setMinorSpacing(0); manager = flow; + getContentPane().setBorder(SCROLL_PANE_BORDER); } else { manager = new ToolbarLayout(); + getContentPane().setBorder(SCROLL_PANE_LIST_BORDER); } getContentPane().setLayoutManager(manager); } Index: src/org/eclipse/gef/internal/ui/palette/editparts/ToolEntryEditPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/ToolEntryEditPart.java,v retrieving revision 1.31 diff -u -r1.31 ToolEntryEditPart.java --- src/org/eclipse/gef/internal/ui/palette/editparts/ToolEntryEditPart.java 1 Apr 2008 16:28:49 -0000 1.31 +++ src/org/eclipse/gef/internal/ui/palette/editparts/ToolEntryEditPart.java 4 Apr 2008 15:14:57 -0000 @@ -42,6 +42,7 @@ import org.eclipse.gef.palette.PaletteStack; import org.eclipse.gef.palette.ToolEntry; import org.eclipse.gef.ui.palette.PaletteViewerPreferences; +import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart; import org.eclipse.gef.ui.palette.editparts.PaletteEditPart; public class ToolEntryEditPart @@ -207,6 +208,18 @@ super(paletteEntry); } +public Object getAdapter(Class key) { + if (key == IPinnableEditPart.class) { + if ((getParent() instanceof PinnablePaletteStackEditPart) + && ((PinnablePaletteStackEditPart) getParent()).canBePinned() + && ((PaletteStack) getParent().getModel()).getActiveEntry().equals( + getModel())) { + return getParent(); + } + } + return super.getAdapter(key); +} + protected AccessibleEditPart createAccessible() { return new AccessibleGraphicalEditPart () { public void getDescription(AccessibleEvent e) { @@ -445,11 +458,15 @@ static Rectangle getSelectionRectangle(int layoutMode, DetailedLabelFigure labelFigure) { Rectangle rect = Rectangle.SINGLETON; - rect.setBounds(labelFigure.getBounds()); + rect.setBounds(labelFigure.getClientArea()); if (layoutMode == PaletteViewerPreferences.LAYOUT_LIST || layoutMode == PaletteViewerPreferences.LAYOUT_DETAILS) { + rect.x -= 5; + rect.y -= 2; rect.width = labelFigure.getPreferredSize().width + 17; - rect.x += 11; + rect.height += 4; + } else { + rect.expand(2, 2); } rect.intersect(labelFigure.getBounds().getExpanded(-1, -1)); return rect; Index: src/org/eclipse/gef/internal/ui/palette/editparts/DrawerFigure.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/DrawerFigure.java,v retrieving revision 1.42 diff -u -r1.42 DrawerFigure.java --- src/org/eclipse/gef/internal/ui/palette/editparts/DrawerFigure.java 1 Apr 2008 16:28:49 -0000 1.42 +++ src/org/eclipse/gef/internal/ui/palette/editparts/DrawerFigure.java 4 Apr 2008 15:14:56 -0000 @@ -60,8 +60,10 @@ protected static final Color FG_COLOR = FigureUtilities.mixColors( PaletteColorUtil.WIDGET_NORMAL_SHADOW, PaletteColorUtil.WIDGET_BACKGROUND); -/** Scrollpane border constant **/ -protected static final Border SCROLL_PANE_BORDER = new MarginBorder(2, 0, 2, 0); +/** Scrollpane border constant for icon and column layout mode **/ +protected static final Border SCROLL_PANE_BORDER = new MarginBorder(2, 2, 2, 2); +/** Scrollpane border constant for list and details layout mode **/ +protected static final Border SCROLL_PANE_LIST_BORDER = new MarginBorder(2, 0, 2, 0); /** Title margin border constant **/ protected static final Border TITLE_MARGIN_BORDER = new MarginBorder(4, 2, 2, 2); /** Toggle button border constant**/ @@ -335,7 +337,6 @@ scrollpane.setContents(new Figure()); scrollpane.getContents().setOpaque(true); scrollpane.getContents().setBackgroundColor(PaletteColorUtil.WIDGET_LIST_BACKGROUND); - scrollpane.getContents().setBorder(SCROLL_PANE_BORDER); } IFigure buildTooltip() { @@ -465,13 +466,16 @@ LayoutManager manager; if (layoutMode == PaletteViewerPreferences.LAYOUT_COLUMNS) { manager = new ColumnsLayout(); + getContentPane().setBorder(SCROLL_PANE_BORDER); } else if (layoutMode == PaletteViewerPreferences.LAYOUT_ICONS) { PaletteContainerFlowLayout fl = new PaletteContainerFlowLayout(); fl.setMinorSpacing(0); fl.setMajorSpacing(0); manager = fl; + getContentPane().setBorder(SCROLL_PANE_BORDER); } else { manager = new ToolbarLayout(); + getContentPane().setBorder(SCROLL_PANE_LIST_BORDER); } getContentPane().setLayoutManager(manager); } Index: src/org/eclipse/gef/internal/ui/palette/editparts/DrawerEditPart.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/editparts/DrawerEditPart.java,v retrieving revision 1.27 diff -u -r1.27 DrawerEditPart.java --- src/org/eclipse/gef/internal/ui/palette/editparts/DrawerEditPart.java 1 Apr 2008 16:28:49 -0000 1.27 +++ src/org/eclipse/gef/internal/ui/palette/editparts/DrawerEditPart.java 4 Apr 2008 15:14:56 -0000 @@ -35,6 +35,7 @@ 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; @@ -44,7 +45,7 @@ * @author Pratik Shah */ public class DrawerEditPart - extends PaletteEditPart + extends PaletteEditPart implements IPinnableEditPart { private static final String PROPERTY_EXPANSION_STATE = "expansion"; //$NON-NLS-1$ @@ -128,18 +129,10 @@ return getDrawerFigure().getContentPane(); } -/** - * Returns the expansion state of the drawer - * @return true if the drawer is expanded; false otherwise - */ public boolean isExpanded() { return getDrawerFigure().isExpanded(); } -/** - * Returns true if the drawer is pinned open. - * @return boolean - */ public boolean isPinnedOpen() { return getDrawerFigure().isPinnedOpen(); } @@ -264,10 +257,6 @@ getDrawerFigure().setTitleIcon(image); } -/** - * Sets the drawer's pinned state to the specified value. - * @param pinned true if the drawer should be pinned when opened - */ public void setPinnedOpen(boolean pinned) { getDrawerFigure().setPinned(pinned); } Index: src/org/eclipse/gef/ui/parts/PaletteViewerKeyHandler.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/ui/parts/PaletteViewerKeyHandler.java,v retrieving revision 1.32 diff -u -r1.32 PaletteViewerKeyHandler.java --- src/org/eclipse/gef/ui/parts/PaletteViewerKeyHandler.java 1 Apr 2008 16:28:49 -0000 1.32 +++ src/org/eclipse/gef/ui/parts/PaletteViewerKeyHandler.java 4 Apr 2008 15:14:57 -0000 @@ -23,11 +23,13 @@ import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart; import org.eclipse.gef.internal.ui.palette.editparts.GroupEditPart; import org.eclipse.gef.internal.ui.palette.editparts.IPaletteStackEditPart; +import org.eclipse.gef.internal.ui.palette.editparts.PaletteStackEditPart; +import org.eclipse.gef.internal.ui.palette.editparts.PinnablePaletteStackEditPart; import org.eclipse.gef.internal.ui.palette.editparts.TemplateEditPart; import org.eclipse.gef.internal.ui.palette.editparts.ToolEntryEditPart; +import org.eclipse.gef.palette.PaletteEntry; import org.eclipse.gef.palette.PaletteStack; import org.eclipse.gef.ui.palette.PaletteViewer; -import org.eclipse.gef.ui.palette.editparts.PaletteEditPart; /** * KeyHandler for the {@link org.eclipse.gef.ui.palette.PaletteViewer Palette}. @@ -64,9 +66,15 @@ return result && isExpandedDrawer(getFocusEditPart()); } -private boolean acceptOpenContextMenu(KeyEvent event) { +private boolean acceptExpandStack(KeyEvent event) { return event.keyCode == SWT.ARROW_DOWN && (event.stateMask & SWT.ALT) > 0 - && isContextMenu(getFocusEditPart()); + && isCollapsedStack(getFocusEditPart()); +} + +private boolean acceptCollapseStack(KeyEvent event) { + return event.keyCode == SWT.ARROW_UP + && (event.stateMask & SWT.ALT) > 0 + && isExpandedStack(getFocusEditPart()); } private boolean acceptSetFocusOnDrawer(KeyEvent event) { @@ -88,12 +96,21 @@ if (isCollapsedDrawer(palettePart)) { navList.add(palettePart); return; - } else if (stackPart instanceof IPaletteStackEditPart - && stackPart.getChildren().contains(palettePart)) { - // we only want to add the top level item to the navlist - if (((PaletteStack)((PaletteEditPart)stackPart).getModel()) - .getActiveEntry().equals(palettePart.getModel())) - navList.add(palettePart); + } else if (stackPart instanceof PaletteStackEditPart + && stackPart.getChildren().contains(palettePart)) { + // we only want to add the top level item to the navlist + if (((PaletteStack) stackPart.getModel()).getActiveEntry().equals( + palettePart.getModel())) + navList.add(palettePart); + } else if (stackPart instanceof PinnablePaletteStackEditPart + && stackPart.getChildren().contains(palettePart)) { + // we only want to add the top level item to the navlist unless + // the palette stack is expanded + if (((PinnablePaletteStackEditPart) stackPart).isExpanded() + || ((PaletteStack) stackPart.getModel()).getActiveEntry() + .equals(palettePart.getModel())) { + navList.add(palettePart); + } } else if ((palettePart instanceof ToolEntryEditPart || palettePart instanceof DrawerEditPart || palettePart instanceof TemplateEditPart)) { @@ -173,11 +190,25 @@ } /** - * Returns true if the passed - * Editpart's parent contains a context menu, false otherwise. + * Returns true if the passed focusPart is a collapsed pinnable + * palette stack, false otherwise. + */ +boolean isCollapsedStack(EditPart focusPart) { + EditPart parent = focusPart.getParent(); + return parent instanceof PaletteStackEditPart + || (parent instanceof PinnablePaletteStackEditPart + && !((PinnablePaletteStackEditPart) parent).isExpanded()); +} + +/** + * Returns true if the passed focusPart is an expanded pinnable + * palette stack, false otherwise. */ -boolean isContextMenu(EditPart part) { - return part.getParent() instanceof IPaletteStackEditPart; +boolean isExpandedStack(EditPart focusPart) { + EditPart parent = focusPart.getParent(); + return parent instanceof PaletteStackEditPart + || (parent instanceof PinnablePaletteStackEditPart + && ((PinnablePaletteStackEditPart) parent).isExpanded()); } /** @@ -193,11 +224,15 @@ if (acceptCollapseDrawer(event)) { collapseDrawer(); return true; - } - if (acceptOpenContextMenu(event)) { - openContextMenu(); + } + if (acceptExpandStack(event)) { + expandStack(); return true; } + if (acceptCollapseStack(event)) { + collapseStack(event); + return true; + } if (acceptIntoExpandedDrawer(event)) { if (navigateIntoExpandedDrawer(event)) return true; @@ -232,8 +267,13 @@ protected void navigateTo(EditPart part, KeyEvent event) { if (part == null) return; - getViewer().select(part); - getViewer().reveal(part); + if (part instanceof IPaletteStackEditPart) { + PaletteEntry activeEntry = ((PaletteStack) part.getModel()) + .getActiveEntry(); + part = (EditPart) getViewer().getEditPartRegistry().get(activeEntry); + } + getViewer().select(part); + getViewer().reveal(part); } private boolean navigateToDrawer(KeyEvent event) { @@ -272,8 +312,12 @@ return false; } -private void openContextMenu() { +private void expandStack() { ((IPaletteStackEditPart)getFocusEditPart().getParent()).openMenu(); } +private void collapseStack(KeyEvent event) { + ((PinnablePaletteStackEditPart)getFocusEditPart().getParent()).setExpanded(false); + navigateTo(getFocusEditPart().getParent(), event); +} } Index: src/org/eclipse/gef/ui/palette/editparts/IPinnableEditPart.java =================================================================== RCS file: src/org/eclipse/gef/ui/palette/editparts/IPinnableEditPart.java diff -N src/org/eclipse/gef/ui/palette/editparts/IPinnableEditPart.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/gef/ui/palette/editparts/IPinnableEditPart.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2008 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.editparts; + +/** + * This interface is used to identify and work with a pinnable palette editpart + * (e.g. drawers, stacks). + * + * @author crevells + * @since 3.4 + */ +public interface IPinnableEditPart { + +/** + * Returns true if the palette editpart is pinned open. + * + * @return boolean + */ +public boolean isPinnedOpen(); + +/** + * @return true if the palette editpart can be pinned open. + */ +public boolean canBePinned(); + +/** + * Sets the palette editpart's pinned state to the specified value. + * + * @param pinned + * true if the palette editpart should be pinned when + * opened + */ +public void setPinnedOpen(boolean pinned); + +/** + * Returns the expansion state of the palette editpart + * + * @return true if the palette editpart is expanded; false + * otherwise + */ +public boolean isExpanded(); + +}