/*=============================================================================# # Copyright (c) 2005-2016 Stephan Wahlbrink (WalWare.de) 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: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.statet.nico.ui.console; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IActionBars; import org.eclipse.ui.texteditor.IUpdate; /** * Manages activation of actions for different controls * (based on FocusIn/FocusOut event) in a view. * * For compatibility with old action framework. */ public class MultiActionHandler implements Listener, ISelectionChangedListener { private class ActionWrapper extends Action { private final Map<Widget, IAction> fWidgetActionMap= new HashMap<>(); ActionWrapper() { } public void update() { boolean enabled = false; if (fActiveWidget != null) { final IAction action = fWidgetActionMap.get(fActiveWidget); if (action != null) { if (action instanceof IUpdate) { ((IUpdate) action).update(); } enabled = action.isEnabled(); } } setEnabled(enabled); } @Override public void runWithEvent(final Event event) { if (fActiveWidget != null) { final IAction action = fWidgetActionMap.get(fActiveWidget); if (action != null) { action.runWithEvent(event); } } } } private Widget fActiveWidget; private final List<Widget> fKnownWidgets= new ArrayList<>(); private final Map<String, ActionWrapper> fActions= new HashMap<>(); MultiActionHandler() { } private ActionWrapper getActionWrapper(final String id) { ActionWrapper wrapper = fActions.get(id); if (wrapper == null) { wrapper = new ActionWrapper(); fActions.put(id, wrapper); } return wrapper; } public void addGlobalAction(final Widget widget, final String globalId, final IAction action) { final ActionWrapper wrapper = getActionWrapper(globalId); wrapper.fWidgetActionMap.put(widget, action); addWidget(widget); } public void addCommandAction(final Widget widget, final String commandId, final IAction action) { } private void addWidget(final Widget widget) { if (!fKnownWidgets.contains(widget)) { widget.addListener(SWT.FocusIn, this); widget.addListener(SWT.FocusOut, this); fKnownWidgets.add(widget); } } public void registerActions(final IActionBars bars) { for (final String id : fActions.keySet()) { bars.setGlobalActionHandler(id, fActions.get(id)); } } @Override public void handleEvent(final Event event) { switch (event.type) { case SWT.FocusIn: fActiveWidget = event.widget; updateEnabledState(); break; case SWT.FocusOut: fActiveWidget = null; updateEnabledState(); break; default: break; } } @Override public void selectionChanged(final SelectionChangedEvent event) { updateEnabledState(); } void updateEnabledState() { for (final ActionWrapper wrapper : fActions.values()) { wrapper.update(); } } public void dispose() { fActiveWidget = null; fActions.clear(); fKnownWidgets.clear(); } }