blob: 56cb2686d400ef7d6a75d3ce40166f6e411142b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2020 Original authors and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.ui.matcher;
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.swt.events.MouseEvent;
public class MouseEventMatcher implements IMouseEventMatcher {
public static final int LEFT_BUTTON = 1;
public static final int RIGHT_BUTTON = 3;
private final int stateMask;
private final String regionName;
private final int button;
public MouseEventMatcher() {
this(0, null, 0);
}
public MouseEventMatcher(String eventRegionName) {
this(0, eventRegionName, 0);
}
public MouseEventMatcher(String eventRegion, int button) {
this(0, eventRegion, button);
}
public MouseEventMatcher(int stateMask, String eventRegion) {
this(stateMask, eventRegion, 0);
}
/**
* Constructor
*
* @param stateMask
* the state of the keyboard modifier keys and mouse masks at the
* time the event was generated.
* @param eventRegion
* the grid region in which the mouse event should be matched
* @param button
* the button that was pressed or released, e.g.
* {@link MouseEventMatcher#LEFT_BUTTON},
* {@link MouseEventMatcher#RIGHT_BUTTON}
*
* @see org.eclipse.swt.events.MouseEvent#stateMask
* @see org.eclipse.nebula.widgets.nattable.grid.GridRegion
* @see org.eclipse.swt.events.MouseEvent#button
*/
public MouseEventMatcher(int stateMask, String eventRegion, int button) {
this.stateMask = stateMask;
this.regionName = eventRegion;
this.button = button;
}
@Override
public boolean matches(NatTable natTable, MouseEvent event,
LabelStack regionLabels) {
if (regionLabels == null) {
return false;
}
boolean stateMaskMatches;
if (this.stateMask != 0) {
stateMaskMatches = (event.stateMask == this.stateMask) ? true : false;
} else {
stateMaskMatches = event.stateMask == 0;
}
boolean eventRegionMatches;
if (this.regionName != null) {
eventRegionMatches = regionLabels.hasLabel(this.regionName);
} else {
eventRegionMatches = true;
}
boolean buttonMatches = this.button != 0 ? (this.button == event.button) : true;
return stateMaskMatches && eventRegionMatches && buttonMatches;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MouseEventMatcher other = (MouseEventMatcher) obj;
if (this.button != other.button)
return false;
if (this.regionName == null) {
if (other.regionName != null)
return false;
} else if (!this.regionName.equals(other.regionName))
return false;
if (this.stateMask != other.stateMask)
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.button;
result = prime * result + ((this.regionName == null) ? 0 : this.regionName.hashCode());
result = prime * result + this.stateMask;
return result;
}
public int getStateMask() {
return this.stateMask;
}
public String getEventRegion() {
return this.regionName;
}
public int getButton() {
return this.button;
}
public static MouseEventMatcher columnHeaderLeftClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.COLUMN_HEADER, LEFT_BUTTON);
}
public static MouseEventMatcher columnHeaderRightClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.COLUMN_HEADER, RIGHT_BUTTON);
}
public static MouseEventMatcher rowHeaderLeftClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.ROW_HEADER, LEFT_BUTTON);
}
public static MouseEventMatcher rowHeaderRightClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.ROW_HEADER, RIGHT_BUTTON);
}
public static MouseEventMatcher bodyLeftClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.BODY, LEFT_BUTTON);
}
public static MouseEventMatcher bodyRightClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.BODY, RIGHT_BUTTON);
}
public static MouseEventMatcher columnGroupHeaderLeftClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.COLUMN_GROUP_HEADER, LEFT_BUTTON);
}
public static MouseEventMatcher columnGroupHeaderRightClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.COLUMN_GROUP_HEADER, RIGHT_BUTTON);
}
public static MouseEventMatcher rowGroupHeaderLeftClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.ROW_GROUP_HEADER, LEFT_BUTTON);
}
public static MouseEventMatcher rowGroupHeaderRightClick(int mask) {
return new MouseEventMatcher(mask, GridRegion.ROW_GROUP_HEADER, RIGHT_BUTTON);
}
}