package com.xored.glance.internal.ui; import com.google.dart.tools.ui.omni.OmniBoxControlContribution; import com.xored.glance.internal.ui.search.SearchManager; import org.eclipse.jface.bindings.Binding; import org.eclipse.jface.bindings.BindingManager; import org.eclipse.jface.bindings.keys.KeySequence; import org.eclipse.jface.bindings.keys.KeyStroke; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.keys.BindingService; import org.eclipse.ui.internal.keys.WorkbenchKeyboard; import org.eclipse.ui.keys.IBindingService; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds; import java.util.List; import java.util.Map; @SuppressWarnings("restriction") public class GlanceEventDispatcher { public static final String GLANCE_CTX = "com.xored.glance.ui.context"; public static final String TEXT_EDITOR_CTX = "org.eclipse.ui.textEditorScope"; public static final String WINDOW_CTX = "org.eclipse.ui.contexts.window"; public static final String NEXT_COMMAND = "com.xored.glance.ui.nextResult"; public static final String PREV_COMMAND = "com.xored.glance.ui.prevResult"; public static final String FOCUS_COMMAND = "com.xored.glance.commands.focus"; public static final String CLOSE_COMMAND = "com.xored.glance.commands.close"; public static final String CLEAR_COMMAND = "com.xored.glance.commands.clearHistory"; public static final String OMNI_FOCUS_COMMAND = "com.google.dart.tools.ui.omnibox"; public static GlanceEventDispatcher INSTANCE = new GlanceEventDispatcher(); private final BindingManager bindingManager; private GlanceEventDispatcher() { bindingManager = ((BindingService) PlatformUI.getWorkbench().getService(IBindingService.class)).getBindingManager(); } public void dispatchKeyPressed(Event event) { @SuppressWarnings("unchecked") List<Object> potentialKeyStrokes = WorkbenchKeyboard.generatePossibleKeyStrokes(event); if (potentialKeyStrokes.isEmpty()) { return; } String commandID = getBindCommand(KeySequence.getInstance((KeyStroke) potentialKeyStrokes.get(0))); if (commandID == null) { return; } else if (FOCUS_COMMAND.equals(commandID)) { // SearchManager.getIntance().sourceFocus(); // in case someone has a key binding already } else if (NEXT_COMMAND.equals(commandID) || IWorkbenchActionDefinitionIds.FIND_NEXT.equals(commandID)) { SearchManager.getIntance().findNext(); event.doit = false; } else if (PREV_COMMAND.equals(commandID) || IWorkbenchActionDefinitionIds.FIND_PREVIOUS.equals(commandID)) { SearchManager.getIntance().findPrevious(); event.doit = false; } else if (CLOSE_COMMAND.equals(commandID)) { SearchManager.getIntance().close(); event.doit = false; } else if (CLEAR_COMMAND.equals(commandID)) { SearchManager.getIntance().clearHistory(); event.doit = false; } else if (IWorkbenchCommandConstants.EDIT_SELECT_ALL.equals(commandID)) { SearchManager.getIntance().selectAll(); event.doit = false; } else if (ITextEditorActionDefinitionIds.SMART_ENTER.equals(commandID)) { // on linux we have to deal with this SearchManager.getIntance().findPrevious(); event.doit = false; } else if (OMNI_FOCUS_COMMAND.equals(commandID)) { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); OmniBoxControlContribution control = OmniBoxControlContribution.getControlForWindow(window); if (control != null) { SearchManager.getIntance().close(); control.giveFocus(); } event.doit = false; } } public String getBindCommand(KeySequence keySequence) { Map<?, ?> map = bindingManager.getActiveBindingsDisregardingContext(); List<?> bindings = (List<?>) map.get(keySequence); if (bindings != null) { for (Object obj : bindings) { Binding binding = (Binding) obj; String ctx = binding.getContextId(); if (GLANCE_CTX.equals(ctx) || TEXT_EDITOR_CTX.equals(ctx) || WINDOW_CTX.equals(ctx)) { return binding.getParameterizedCommand().getId(); } } } return null; } }