From 110f8a20abf19448786108edf1c01a411c9979db Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Tue, 18 Dec 2018 18:06:32 +0400 Subject: [PATCH] UI improved for mage dialogs: * added working popup hints for buttons and cards while user in choose mode; * fixed wrong windows position after tray icon clicks or mouse moves; * added big combobox's popups support (now users can select/choose items from outer space); --- .../java/mage/client/dialog/MageDialog.java | 84 ++++++++++++------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java b/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java index 513f4ede22c..334422f1bbb 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/MageDialog.java @@ -1,31 +1,19 @@ - - - /* - * MageDialog.java - * - * Created on 15-Dec-2009, 10:28:27 PM - */ package mage.client.dialog; -import java.awt.AWTEvent; -import java.awt.ActiveEvent; -import java.awt.Component; -import java.awt.EventQueue; -import java.awt.KeyboardFocusManager; -import java.awt.MenuComponent; -import java.awt.TrayIcon; +import mage.client.MageFrame; +import mage.client.util.SettingsManager; +import mage.client.util.gui.GuiDisplayUtil; +import org.apache.log4j.Logger; + +import javax.swing.*; +import java.awt.*; import java.awt.event.InvocationEvent; import java.awt.event.MouseEvent; import java.beans.PropertyVetoException; import java.lang.reflect.InvocationTargetException; import java.util.logging.Level; -import javax.swing.*; - -import mage.client.MageFrame; -import org.apache.log4j.Logger; /** - * * @author BetaSteward_at_googlemail.com */ public class MageDialog extends javax.swing.JInternalFrame { @@ -75,7 +63,7 @@ public class MageDialog extends javax.swing.JInternalFrame { this.toFront(); - if (modal){ + if (modal) { startModal(); } } @@ -105,6 +93,7 @@ public class MageDialog extends javax.swing.JInternalFrame { } private synchronized void startModal() { + // modal loop -- all mouse events must be ignored by other windows try { if (SwingUtilities.isEventDispatchThread()) { EventQueue theQueue = getToolkit().getSystemEventQueue(); @@ -115,18 +104,46 @@ public class MageDialog extends javax.swing.JInternalFrame { // https://github.com/magefree/mage/issues/584 - Let's hope this will fix the Linux window problem if (event.getSource() != null && event.getSource() instanceof TrayIcon && !(event instanceof InvocationEvent)) { - return; + dispatch = false; + //return; // JayDi85: users can move mouse over try icon to disable modal mode (it's a bug but can be used in the future) } + + // ignore mouse events outside from panel, only drag and move allowed -- as example: + // combobox's popup will be selectable outside + // cards and button hints will be works + Component popupComponent = null; + MouseEvent popupEvent = null; if (event instanceof MouseEvent && event.getSource() instanceof Component) { MouseEvent e = (MouseEvent) event; MouseEvent m = SwingUtilities.convertMouseEvent((Component) e.getSource(), e, this); - if (!this.contains(m.getPoint()) && e.getID() != MouseEvent.MOUSE_DRAGGED) { - dispatch = false; + + // disable all outer events (except some actions) + if (!this.contains(m.getPoint())) { + boolean allowedEvent = false; + + // need any mouse move (for hints) + if (e.getID() == MouseEvent.MOUSE_DRAGGED || e.getID() == MouseEvent.MOUSE_MOVED) { + allowedEvent = true; + } + + // need popup clicks and mouse wheel (for out of bound actions) + if (!allowedEvent) { + popupComponent = SwingUtilities.getDeepestComponentAt(e.getComponent(), e.getX(), e.getY()); // show root component (popups creates at root) + if (popupComponent != null && popupComponent.getClass().getName().contains("BasicComboPopup")) { + popupEvent = SwingUtilities.convertMouseEvent((Component) e.getSource(), e, popupComponent); + allowedEvent = true; + } + } + + dispatch = allowedEvent; } } if (dispatch) { - if (event instanceof ActiveEvent) { + if (popupEvent != null) { + // process outer popup events, it's must be FIRST check + popupComponent.dispatchEvent(popupEvent); + } else if (event instanceof ActiveEvent) { ((ActiveEvent) event).dispatch(); } else if (source instanceof Component) { ((Component) source).dispatchEvent(event); @@ -174,14 +191,21 @@ public class MageDialog extends javax.swing.JInternalFrame { java.util.logging.Logger.getLogger(MageDialog.class.getName()).log(Level.SEVERE, "setClosed(false) failed", ex); } MageFrame.getDesktop().remove(this); + } + public void makeWindowCentered() { + makeWindowCentered(this, getWidth(), getHeight()); + } + + public static void makeWindowCentered(Component component, int width, int height) { + Point centered = SettingsManager.instance.getComponentPosition(width, height); + component.setLocation(centered.x, centered.y); + GuiDisplayUtil.keepComponentInsideScreen(centered.x, centered.y, component); } /** * Used to set a tooltip text on icon and titel bar * - * used in {@link ExileZoneDialog} and {@link ShowCardsDialog} - * * @param text */ public void setTitelBarToolTip(final String text) { @@ -209,12 +233,12 @@ public class MageDialog extends javax.swing.JInternalFrame { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 394, Short.MAX_VALUE) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 394, Short.MAX_VALUE) ); layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 274, Short.MAX_VALUE) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 274, Short.MAX_VALUE) ); pack();