| /******************************************************************************* |
| * Copyright (c) 2001, 2007 Oracle 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: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| /** |
| * |
| */ |
| package org.eclipse.jst.pagedesigner.editpolicies; |
| |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.draw2d.Figure; |
| import org.eclipse.draw2d.Graphics; |
| import org.eclipse.draw2d.ToolbarLayout; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.ISelectionProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jst.pagedesigner.parts.ElementEditPart; |
| import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart; |
| |
| /** |
| * A menu bar for a specific element edit part |
| * |
| * @author cbateman |
| * |
| */ |
| public class ElementMenuBar extends Figure implements ISelectionProvider, ISelectionChangedListener |
| { |
| private ElementEditPart _hostPart; |
| /** |
| * Should always be accessed for use through getChildParts(). Not automatically |
| * allocated because of high probability that a host part will have no children of interest |
| */ |
| private Set _childParts; |
| private List _selectionListeners; |
| private IStructuredSelection _selection; |
| |
| /** |
| * @param hostPart |
| */ |
| public ElementMenuBar(ElementEditPart hostPart) |
| { |
| hostPart.getViewer().addSelectionChangedListener(this); |
| |
| _hostPart = hostPart; |
| ToolbarLayout layout = new ToolbarLayout(false); |
| layout.setSpacing(4); |
| setLayoutManager(layout); |
| } |
| |
| /** |
| * @return true if there are child parts in the menu |
| */ |
| public boolean hasChildParts() |
| { |
| return _childParts != null &&_childParts.size() > 0; |
| } |
| |
| /** |
| * |
| */ |
| public void dispose() |
| { |
| _hostPart.getViewer().removeSelectionChangedListener(this); |
| if (_childParts != null) |
| { |
| _childParts.clear(); |
| _childParts = null; |
| } |
| |
| if (_selectionListeners != null) |
| { |
| _selectionListeners.clear(); |
| _selectionListeners = null; |
| } |
| |
| _selection = null; |
| } |
| |
| /** |
| * @param editpart |
| */ |
| public void addNonVisualChild(NonVisualComponentEditPart editpart) |
| { |
| add(editpart.getFigure()); |
| getChildParts().add(editpart); |
| } |
| |
| /** |
| * Removes editpart from the list of non-visual edit parts that this menu |
| * bar is managing the visuals for. |
| * @param editpart |
| */ |
| public void removeNonVisualChild(final NonVisualComponentEditPart editpart) |
| { |
| // TODO: I have relaxed the checking to see if editpart is valid |
| // child because of the way ElementEditPart refreshes itself |
| // when the model changes. It's possible this will get called more |
| // than once for the same editpart argument |
| getChildParts().remove(editpart); |
| if (editpart.getFigure().getParent() == this) |
| { |
| remove(editpart.getFigure()); |
| } |
| } |
| |
| /** |
| * @return true if a member of the menu bar has edit part focus |
| */ |
| public boolean hasEditPartFocus() |
| { |
| for (Iterator it = getChildParts().iterator(); it.hasNext();) |
| { |
| EditPart editPart = (EditPart) it.next(); |
| |
| if (editPart.getSelected() == EditPart.SELECTED_PRIMARY) |
| { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| private Set getChildParts() |
| { |
| if (_childParts == null) |
| { |
| _childParts = new HashSet(); |
| } |
| |
| return _childParts; |
| } |
| |
| protected void paintChildren(Graphics graphics) |
| { |
| // force all children to paint with my alpha setting |
| graphics.setAlpha(getAlpha()); |
| //push the current state so it is what the children revert to |
| graphics.pushState(); |
| super.paintChildren(graphics); |
| // pop that state we pushed above |
| graphics.popState(); |
| } |
| |
| private int getAlpha() |
| { |
| return isEnabled() ? 255 : 75; |
| } |
| |
| public void addSelectionChangedListener(ISelectionChangedListener listener) { |
| List listeners = getSelectionListeners(); |
| |
| if (!listeners.contains(listener)) |
| { |
| listeners.add(listener); |
| } |
| } |
| |
| public ISelection getSelection() { |
| return _selection; |
| } |
| |
| public void removeSelectionChangedListener( |
| ISelectionChangedListener listener) { |
| getSelectionListeners().remove(listener); |
| } |
| |
| public void setSelection(ISelection selection) { |
| // no external selection change supported |
| } |
| |
| private List getSelectionListeners() |
| { |
| if (_selectionListeners == null) |
| { |
| _selectionListeners = new ArrayList(1); |
| } |
| |
| return _selectionListeners; |
| } |
| |
| private void fireSelectionChanged() |
| { |
| for (final Iterator it = _selectionListeners.iterator(); it.hasNext();) |
| { |
| ISelectionChangedListener listener = (ISelectionChangedListener) it.next(); |
| listener.selectionChanged(new SelectionChangedEvent(this, _selection)); |
| } |
| } |
| |
| public void selectionChanged(SelectionChangedEvent event) { |
| ISelection selection = event.getSelection(); |
| |
| if (selection instanceof IStructuredSelection) |
| { |
| // the number of selections we care about will be no bigger than the total number of selections |
| final List mySelections = new ArrayList(((IStructuredSelection)selection).size()); |
| |
| if (_childParts != null) |
| { |
| for (final Iterator it = ((IStructuredSelection)selection).iterator() |
| ; it.hasNext();) |
| { |
| Object selectedObj = it.next(); |
| if (_childParts.contains(selectedObj)) |
| { |
| mySelections.add(selectedObj); |
| } |
| } |
| } |
| |
| _selection = new StructuredSelection(mySelections); |
| |
| fireSelectionChanged(); |
| } |
| } |
| } |