diff --git a/forge-gui/src/main/java/forge/gui/match/controllers/CPicture.java b/forge-gui/src/main/java/forge/gui/match/controllers/CPicture.java
index 8f6ccc30d85..382acc8891e 100644
--- a/forge-gui/src/main/java/forge/gui/match/controllers/CPicture.java
+++ b/forge-gui/src/main/java/forge/gui/match/controllers/CPicture.java
@@ -17,7 +17,6 @@
*/
package forge.gui.match.controllers;
-import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
@@ -31,6 +30,7 @@ import forge.game.card.Card;
import forge.gui.CardPicturePanel;
import forge.gui.framework.ICDoc;
import forge.gui.match.views.VPicture;
+import forge.gui.toolbox.FMouseAdapter;
import forge.gui.toolbox.special.CardZoomer;
import forge.item.IPaperCard;
import forge.item.InventoryItem;
@@ -118,46 +118,23 @@ public enum CPicture implements ICDoc {
*
Displays the alternate image for applicable cards on mouse click.
*/
private void setMouseButtonListener() {
- this.picturePanel.addMouseListener(new MouseAdapter() {
- private final boolean[] buttonsDown = new boolean[4];
+ this.picturePanel.addMouseListener(new FMouseAdapter() {
+ @Override
+ public void onLeftClick(MouseEvent e) {
+ flipCard();
+ }
@Override
- public void mousePressed(final MouseEvent e) {
+ public void onMiddleMouseDown(MouseEvent e) {
if (isCardDisplayed()) {
- final int button = e.getButton();
- if (button < 1 || button > 3) {
- return;
- }
- this.buttonsDown[button] = true;
- if (this.buttonsDown[2] || (this.buttonsDown[1] && this.buttonsDown[3])) {
- zoomer.doMouseButtonZoom(currentCard, displayedState);
- }
+ CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(currentCard, displayedState);
}
}
@Override
- public void mouseReleased(final MouseEvent e) {
+ public void onMiddleMouseUp(MouseEvent e) {
if (isCardDisplayed()) {
- final int button = e.getButton();
- if (button < 1 || button > 3) {
- return;
- }
- if (!this.buttonsDown[button]) {
- return;
- }
- this.buttonsDown[button] = false;
-
- if (zoomer.isZoomerOpen()) {
- if (!this.buttonsDown[1] && !this.buttonsDown[2] && !this.buttonsDown[3]) {
- //don't stop zooming until all mouse buttons released
- zoomer.closeZoomer();
- }
- return; //don't handle click event below if zoom was open
- }
-
- if (button == 1) {
- flipCard();
- }
+ CardZoomer.SINGLETON_INSTANCE.closeZoomer();
}
}
});
@@ -219,10 +196,10 @@ public enum CPicture implements ICDoc {
}
private boolean isCurrentCardFlippable() {
- boolean isFlippableMorph =
- currentCard.isFaceDown() && isAuthorizedToViewFaceDownCard(currentCard);
- return (currentCard != null) &
- (currentCard.isDoubleFaced() || currentCard.isFlipCard() || isFlippableMorph);
+ if (currentCard == null) { return false; }
+
+ return currentCard.isDoubleFaced() || currentCard.isFlipCard() ||
+ (currentCard.isFaceDown() && isAuthorizedToViewFaceDownCard(currentCard));
}
/**
diff --git a/forge-gui/src/main/java/forge/gui/toolbox/FMouseAdapter.java b/forge-gui/src/main/java/forge/gui/toolbox/FMouseAdapter.java
index c4e37de8a0b..3b19641bed7 100644
--- a/forge-gui/src/main/java/forge/gui/toolbox/FMouseAdapter.java
+++ b/forge-gui/src/main/java/forge/gui/toolbox/FMouseAdapter.java
@@ -36,14 +36,14 @@ public abstract class FMouseAdapter extends MouseAdapter {
public void onMouseEnter(MouseEvent e) {}
public void onMouseExit(MouseEvent e) {}
-
+
/**
* Forge Mouse Adapter with infinite click tolerance (so long as mouse doesn't leave component)
*/
public FMouseAdapter() {
this(false);
}
-
+
public FMouseAdapter(boolean isCompDraggable0) {
isCompDraggable = isCompDraggable0;
}
@@ -52,25 +52,38 @@ public abstract class FMouseAdapter extends MouseAdapter {
private boolean hovered;
private Point mouseDownLoc;
private Point firstClickLoc;
- private int firstClickButton;
+ private int downButton, buttonsDown, firstClickButton;
private Component tempMotionListenerComp;
@Override
public final void mousePressed(final MouseEvent e) {
- switch (e.getButton()) {
- case 1:
- onLeftMouseDown(e);
- break;
- case 2:
- onMiddleMouseDown(e);
- break;
- case 3:
- onRightMouseDown(e);
- break;
+ final int button = e.getButton();
+ if (button < 1 || button > 3) {
+ return;
+ }
+ if (downButton == 0) {
+ downButton = button;
+ switch (button) {
+ case 1:
+ onLeftMouseDown(e);
+ break;
+ case 2:
+ onMiddleMouseDown(e);
+ break;
+ case 3:
+ onRightMouseDown(e);
+ break;
+ }
+ }
+
+ buttonsDown += button;
+ if (buttonsDown == 4 && downButton != 2) {
+ downButton = 2;
+ onMiddleMouseDown(e); //treat left and right together as equivalent of middle
}
mouseDownLoc = e.getLocationOnScreen();
-
+
//if component is draggable, ensure this adapter added as mouse motion listener to component while mouse down
if (isCompDraggable) {
tempMotionListenerComp = e.getComponent();
@@ -90,7 +103,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
if (firstClickLoc != null) {
//if first mouse down resulted in click and second mouse down with same button in close proximity,
//handle double click event (don't wait until second mouse up to improve responsiveness)
- if (e.getClickCount() % 2 == 0 && e.getButton() == firstClickButton &&
+ if (e.getClickCount() % 2 == 0 && downButton == firstClickButton &&
e.getLocationOnScreen().distance(firstClickLoc) <= 3) {
switch (firstClickButton) {
case 1:
@@ -108,7 +121,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
firstClickButton = 0;
}
}
-
+
@Override
public final void mouseDragged(MouseEvent e) {
//clear mouse down location if component begins being dragged
@@ -117,7 +130,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
resetMouseDownLoc();
}
if (tempMotionListenerComp == null) { //don't raise drag event if only a temporary motion listener
- switch (e.getButton()) {
+ switch (downButton) {
case 1:
onLeftMouseDragging(e);
break;
@@ -130,19 +143,19 @@ public abstract class FMouseAdapter extends MouseAdapter {
}
}
}
-
+
@Override
public final void mouseEntered(MouseEvent e) {
hovered = true;
onMouseEnter(e);
}
-
+
@Override
public final void mouseExited(MouseEvent e) {
hovered = false;
onMouseExit(e);
}
-
+
private void resetMouseDownLoc() {
mouseDownLoc = null;
if (tempMotionListenerComp != null) {
@@ -153,7 +166,17 @@ public abstract class FMouseAdapter extends MouseAdapter {
@Override
public final void mouseReleased(MouseEvent e) {
- switch (e.getButton()) {
+ int button = e.getButton();
+ if (button < 1 || button > 3 || downButton == 0) {
+ return;
+ }
+ buttonsDown -= button;
+ if (buttonsDown > 0) { return; } //don't handle mouse up until all mouse buttons up
+
+ button = downButton;
+ downButton = 0;
+
+ switch (button) {
case 1:
onLeftMouseUp(e);
break;
@@ -164,7 +187,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
onRightMouseUp(e);
break;
}
-
+
if (!hovered) { //reset mouse down location and don't handle click if mouse up outside component
resetMouseDownLoc();
}
@@ -173,13 +196,13 @@ public abstract class FMouseAdapter extends MouseAdapter {
if (mouseDownLoc != null) {
//if first click, cache button and mouse down location for determination of double click later
if (e.getClickCount() % 2 == 1) {
- firstClickButton = e.getButton();
+ firstClickButton = button;
firstClickLoc = mouseDownLoc;
}
resetMouseDownLoc();
- switch (e.getButton()) {
+ switch (button) {
case 1:
onLeftClick(e);
break;
@@ -192,7 +215,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
}
}
else if (isCompDraggable) { //handle drag drop if click not handled and component is draggable
- switch (e.getButton()) {
+ switch (button) {
case 1:
onLeftMouseDragDrop(e);
break;
@@ -205,7 +228,7 @@ public abstract class FMouseAdapter extends MouseAdapter {
}
}
}
-
+
@Override
public final void mouseClicked(MouseEvent e) {
//override mouseClicked as final to prevent it being used since it doesn't fire
diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java
index fa6fb6cc77c..c17a8bc8810 100644
--- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java
+++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java
@@ -25,6 +25,7 @@ import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import forge.ImageCache;
+import forge.game.card.Card;
import forge.gui.deckeditor.DeckProxy;
import forge.gui.framework.ILocalRepaint;
import forge.gui.match.controllers.CDetail;
@@ -37,6 +38,8 @@ import forge.gui.toolbox.FSkin.SkinFont;
import forge.gui.toolbox.FSkin.SkinImage;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.ItemManagerModel;
+import forge.gui.toolbox.special.CardZoomer;
+import forge.item.IPaperCard;
import forge.item.InventoryItem;
import forge.view.arcane.CardPanel;
@@ -88,11 +91,26 @@ public class ImageView extends ItemView {
@Override
public void onLeftDoubleClick(MouseEvent e) {
- if (hoveredItem != null && hoveredItem.selected) {
+ ItemInfo item = getItemAtPoint(e.getPoint());
+ if (item != null && item.selected) {
itemManager.activateSelectedItems();
}
}
+ @Override
+ public void onMiddleMouseDown(MouseEvent e) {
+ ItemInfo item = getItemAtPoint(e.getPoint());
+ if (item != null && item.item instanceof IPaperCard) {
+ Card card = Card.getCardForUi((IPaperCard) item.item);
+ CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(card);
+ }
+ }
+
+ @Override
+ public void onMiddleMouseUp(MouseEvent e) {
+ CardZoomer.SINGLETON_INSTANCE.closeZoomer();
+ }
+
@Override
public void onRightClick(MouseEvent e) {
selectItem(e);