/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.editor; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.teiid.designer.ui.common.actions.AbstractAction; /** * DiagramToolBarManager Class designed to provide specific management of diagram specific toobar actions. This includes special * wiring so an action can ask for a specific tool item which may be in focuse when pressed. This is to get around the * "part activation" problem of selection events being fired on a re-focused part. AddTransformationSourceAction needed to respond * to selected objects outside a diagram when the button action (ToolItem) was pressed. * * @since 8.0 */ public class DiagramToolBarManager extends ToolBarManager { ActionContributionItem focusedToolItem; public DiagramToolBarManager( ToolBar paneToolBar ) { super(paneToolBar); // Required to provide actions the ability to know that it's item may // have been selected paneToolBar.addMouseMoveListener(new MouseMoveListener() { @Override public void mouseMove( MouseEvent e ) { Point thisPoint = new Point(e.x, e.y); setFocusedToolItem(thisPoint); } }); // Required to flush the focusedToolItem when entering or exiting the toolbar paneToolBar.addMouseTrackListener(new MouseTrackAdapter() { @Override public void mouseEnter( MouseEvent e ) { focusedToolItem = null; } @Override public void mouseExit( MouseEvent e ) { focusedToolItem = null; } }); } void setFocusedToolItem( Point currentPoint ) { focusedToolItem = getActionContributionItem(currentPoint); } public void resetFocusedToolItem() { focusedToolItem = null; } public ActionContributionItem getFocusedToolItem() { return focusedToolItem; } public ActionContributionItem getActionContributionItem( AbstractAction theAction ) { if (getControl() != null && getControl().getItemCount() > 0) { IContributionItem[] items = getItems(); IContributionItem toolItem = null; ActionContributionItem nextACI = null; AbstractAction nextAction = null; for (int i = 0; i < getControl().getItems().length; i++) { toolItem = items[i]; nextACI = (ActionContributionItem)toolItem; nextAction = (AbstractAction)nextACI.getAction(); if (nextAction.equals(theAction)) { return nextACI; } } } return null; } public ActionContributionItem getActionContributionItem( Point somePoint ) { int itemIndex = getToolItemIndex(somePoint); if (itemIndex < 0) return null; return getActionContributionItem(itemIndex); } public AbstractAction getAction( int toolItemIndex ) { if (toolItemIndex >= 0) { IContributionItem[] items = getItems(); if (toolItemIndex < items.length) return (AbstractAction)((ActionContributionItem)items[toolItemIndex]).getAction(); } return null; } public ToolItem getToolItem( Point point ) { if (getControl() != null && getControl().getItemCount() > 0) { ToolItem toolItem = null; for (int i = 0; i < getControl().getItems().length; i++) { toolItem = getControl().getItem(i); if (toolItem != null && toolItem.getBounds().contains(point)) { return toolItem; } } } return null; } public ActionContributionItem getActionContributionItem( int toolItemIndex ) { if (getControl() != null && getControl().getItemCount() > 0 && toolItemIndex >= 0) { IContributionItem[] items = getItems(); ActionContributionItem nextACI = null; if (items[toolItemIndex] instanceof ActionContributionItem) { nextACI = (ActionContributionItem)items[toolItemIndex]; return nextACI; } } return null; } public int getToolItemIndex( Point point ) { if (getControl() != null && getControl().getItemCount() > 0) { ToolItem toolItem = null; for (int i = 0; i < getControl().getItems().length; i++) { toolItem = getControl().getItem(i); if (toolItem != null && toolItem.getBounds().contains(point)) { return i; } } } return -1; } @Override protected void relayout( ToolBar toolBar, int oldCount, int newCount ) { toolBar.layout(); Composite parent = toolBar.getParent(); parent.layout(); if (parent.getParent() != null) parent.getParent().layout(); } }