/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.red.nattable.configs; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.grid.GridRegion; import org.eclipse.nebula.widgets.nattable.layer.LabelStack; import org.eclipse.nebula.widgets.nattable.selection.action.SelectCellAction; import org.eclipse.nebula.widgets.nattable.selection.config.DefaultSelectionBindings; import org.eclipse.nebula.widgets.nattable.selection.config.DefaultSelectionLayerConfiguration; import org.eclipse.nebula.widgets.nattable.style.DisplayMode; import org.eclipse.nebula.widgets.nattable.ui.NatEventData; import org.eclipse.nebula.widgets.nattable.ui.action.IMouseAction; import org.eclipse.nebula.widgets.nattable.ui.action.NoOpMouseAction; import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry; import org.eclipse.nebula.widgets.nattable.ui.matcher.IMouseEventMatcher; import org.eclipse.nebula.widgets.nattable.ui.matcher.KeyEventMatcher; import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; /** * @author Michal Anglart * */ public class SelectionLayerConfiguration extends DefaultSelectionLayerConfiguration { @Override protected void addSelectionUIBindings() { addConfiguration(new SelectionBindings()); } private static class SelectionBindings extends DefaultSelectionBindings { @Override public void configureUiBindings(final UiBindingRegistry uiBindingRegistry) { super.configureUiBindings(uiBindingRegistry); // we're having handlers for cut/copy/paste; we don't want this // action to run when our handler is not enabled uiBindingRegistry.unregisterKeyBinding(new KeyEventMatcher(SWT.MOD1, 'c')); } @Override protected void configureBodyMouseClickBindings(final UiBindingRegistry uiBindingRegistry) { final IMouseAction action = new SelectCellAction(); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyLeftClick(SWT.NONE), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyLeftClick(SWT.MOD2), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyLeftClick(SWT.MOD1), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyLeftClick(SWT.MOD2 | SWT.MOD1), action); // following alters default behavior: when user clicks with RMP the selection will also // be set (if it was not clicked on already selected cell) uiBindingRegistry.registerMouseDownBinding(bodyRightClickOnSelected(SWT.NONE), new NoOpMouseAction()); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyRightClick(SWT.NONE), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyRightClick(SWT.MOD2), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyRightClick(SWT.MOD1), action); uiBindingRegistry.registerMouseDownBinding(MouseEventMatcher.bodyRightClick(SWT.MOD2 | SWT.MOD1), action); } } private static IMouseEventMatcher bodyRightClickOnSelected(final int mask) { return new CellSelectedMouseEventMatcher(mask, GridRegion.BODY, MouseEventMatcher.RIGHT_BUTTON); } private static class CellSelectedMouseEventMatcher extends MouseEventMatcher { public CellSelectedMouseEventMatcher(final int stateMask, final String regionName, final int button) { super(stateMask, regionName, button); } @Override public boolean matches(final NatTable natTable, final MouseEvent event, final LabelStack regionLabels) { final NatEventData eventData = NatEventData.createInstanceFromEvent(event); final String displayMode = natTable.getDisplayModeByPosition(eventData.getColumnPosition(), eventData.getRowPosition()); return super.matches(natTable, event, regionLabels) && (displayMode.equals(DisplayMode.SELECT) || displayMode.equals(DisplayMode.SELECT_HOVER)); } } }