Ticket #11986: 0001-Fixed-map-status-requireing-a-timeout-because-notify.patch

File 0001-Fixed-map-status-requireing-a-timeout-because-notify.patch, 6.1 KB (added by michael2402, 10 years ago)
  • src/org/openstreetmap/josm/gui/MapStatus.java

    From 06a3e8b2f4454246c4417e4365ed9806c2c6013a Mon Sep 17 00:00:00 2001
    From: Michael Zangl <michael.zangl@student.kit.edu>
    Date: Sat, 17 Oct 2015 16:21:08 +0200
    Subject: [PATCH] Fixed map status requireing a timeout because notify was not
     received.
    
    ---
     src/org/openstreetmap/josm/gui/MapStatus.java |   67 +++++++++++++------------
     1 file changed, 36 insertions(+), 31 deletions(-)
    
    diff --git a/src/org/openstreetmap/josm/gui/MapStatus.java b/src/org/openstreetmap/josm/gui/MapStatus.java
    index e969a42..b8db1a4 100644
    a b import java.util.Collection;  
    3232import java.util.ConcurrentModificationException;
    3333import java.util.List;
    3434import java.util.TreeSet;
     35import java.util.concurrent.BlockingQueue;
     36import java.util.concurrent.LinkedBlockingQueue;
    3537
    3638import javax.swing.AbstractAction;
    3739import javax.swing.BorderFactory;
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    347349
    348350        private MapFrame parent;
    349351
     352        private BlockingQueue<MouseState> incommingMouseState = new LinkedBlockingQueue<>();
     353
     354        private Point lastMousePos;
     355
    350356        Collector(MapFrame parent) {
    351357            this.parent = parent;
    352358        }
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    359365            registerListeners();
    360366            try {
    361367                for (;;) {
     368                    try {
     369                        final MouseState ms = incommingMouseState.take();
     370                        if (parent != Main.map)
     371                            return; // exit, if new parent.
    362372
    363                     final MouseState ms = new MouseState();
    364                     synchronized (this) {
    365                         // TODO Would be better if the timeout wasn't necessary
    366                         try {
    367                             wait(1000);
    368                         } catch (InterruptedException e) {
    369                             // Occurs frequently during JOSM shutdown, log set to trace only
    370                             Main.trace("InterruptedException in "+MapStatus.class.getSimpleName());
     373                        // Do nothing, if required data is missing
     374                        if (ms.mousePos == null || mv.center == null) {
     375                            continue;
    371376                        }
    372                         ms.modifiers = mouseState.modifiers;
    373                         ms.mousePos = mouseState.mousePos;
    374                     }
    375                     if (parent != Main.map)
    376                         return; // exit, if new parent.
    377377
    378                     // Do nothing, if required data is missing
    379                     if (ms.mousePos == null || mv.center == null) {
    380                         continue;
    381                     }
    382 
    383                     try {
    384378                        EventQueue.invokeAndWait(new CollectorWorker(ms));
    385379                    } catch (InterruptedException e) {
    386380                        // Occurs frequently during JOSM shutdown, log set to trace only
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    649643            });
    650644            return l;
    651645        }
     646
     647        /**
     648         * Called whenever the mouse position or modifiers changed.
     649         * @param mousePos The new mouse position. <code>null</code> if it did not change.
     650         * @param modifiers The new modifiers.
     651         */
     652        public synchronized void updateMousePosition(Point mousePos, int modifiers) {
     653            MouseState ms = new MouseState();
     654            if (mousePos == null) {
     655                ms.mousePos = lastMousePos;
     656            } else {
     657                lastMousePos = mousePos;
     658            }
     659            // remove mouse states that are in the queue. Our mouse state is newer.
     660            incommingMouseState.clear();
     661            incommingMouseState.offer(ms);
     662        }
    652663    }
    653664
    654665    /**
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    659670        private Point mousePos;
    660671        private int modifiers;
    661672    }
    662     /**
    663      * The last sent mouse movement event.
    664      */
    665     private transient MouseState mouseState = new MouseState();
    666673
    667674    private transient AWTEventListener awtListener = new AWTEventListener() {
    668675         @Override
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    670677            if (event instanceof InputEvent &&
    671678                    ((InputEvent) event).getComponent() == mv) {
    672679                synchronized (collector) {
    673                     mouseState.modifiers = ((InputEvent) event).getModifiersEx();
     680                    int modifiers = ((InputEvent) event).getModifiersEx();
     681                    Point mousePos = null;
    674682                    if (event instanceof MouseEvent) {
    675                         mouseState.mousePos = ((MouseEvent) event).getPoint();
     683                        mousePos = ((MouseEvent) event).getPoint();
    676684                    }
    677                     collector.notifyAll();
     685                    collector.updateMousePosition(mousePos, modifiers);
    678686                }
    679687            }
    680688        }
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    684692        @Override
    685693        public void mouseMoved(MouseEvent e) {
    686694            synchronized (collector) {
    687                 mouseState.modifiers = e.getModifiersEx();
    688                 mouseState.mousePos = e.getPoint();
    689                 collector.notifyAll();
     695                collector.updateMousePosition(e.getPoint(), e.getModifiersEx());
    690696            }
    691697        }
    692698
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    699705    private transient KeyAdapter keyAdapter = new KeyAdapter() {
    700706        @Override public void keyPressed(KeyEvent e) {
    701707            synchronized (collector) {
    702                 mouseState.modifiers = e.getModifiersEx();
    703                 collector.notifyAll();
     708                collector.updateMousePosition(null, e.getModifiersEx());
    704709            }
    705710        }
    706711