/*******************************************************************************
* Copyright (c) 2012, 2013 Original authors 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:
* 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
* @see "org.eclipse.swt.events.MouseEvent.stateMask"
* @param eventRegion
* {@linkplain org.eclipse.nebula.widgets.nattable.grid.GridRegion}
* @param button
* @see org.eclipse.swt.events.MouseEvent#button
* {@link MouseEventMatcher#LEFT_BUTTON},
* {@link MouseEventMatcher#RIGHT_BUTTON} can be used for convenience
*/
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);
}
}