From 11fba919640b0754ce1b4c09937549c9d387db1d Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Wed, 5 May 2004 02:38:22 +0000 Subject: [PATCH] Fixed pause-related bug. Lord forgive me for mucking about in here so much, but now I've cleaned up the code that dicks with mouse listeners while paused and moved it into an inner class so that it's easier to understand. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3002 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../puzzle/client/PuzzleController.java | 63 ++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/java/com/threerings/puzzle/client/PuzzleController.java b/src/java/com/threerings/puzzle/client/PuzzleController.java index e9d70f2e8..93c079aa6 100644 --- a/src/java/com/threerings/puzzle/client/PuzzleController.java +++ b/src/java/com/threerings/puzzle/client/PuzzleController.java @@ -1,5 +1,5 @@ // -// $Id: PuzzleController.java,v 1.8 2004/04/30 00:02:21 ray Exp $ +// $Id: PuzzleController.java,v 1.9 2004/05/05 02:38:22 ray Exp $ package com.threerings.puzzle.client; @@ -10,7 +10,6 @@ import java.awt.event.KeyListener; import java.awt.event.KeyAdapter; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.util.ArrayList; @@ -155,27 +154,16 @@ public abstract class PuzzleController extends GameController // if we're moving focus to chat.. if (chatting) { - // don't let mouse clicks land on the board - final MouseHijacker jack = new MouseHijacker(_panel.getBoardView()); - - // ...enable "click to unchat" mode in the puzzle board view - MouseAdapter unpauser = new MouseAdapter() { - public void mousePressed (MouseEvent event) { - _panel.removeMouseListener(this); - _panel.getBoardView().removeMouseListener(this); - jack.release(); - setChatting(false); - } - }; - _panel.addMouseListener(unpauser); - _panel.getBoardView().addMouseListener(unpauser); + if (_unpauser != null) { + Log.warning("Huh? Already have a mouse unpauser?"); + _unpauser.release(); + } + _unpauser = new Unpauser(_panel); } else { - // if we were unpaused with a key event, blow away the hijacker - // business - MouseListener[] mousers = _panel.getMouseListeners(); - if (mousers.length == 1) { - mousers[0].mousePressed(null); + if (_unpauser != null) { + _unpauser.release(); + _unpauser = null; } } @@ -892,6 +880,39 @@ public abstract class PuzzleController extends GameController }); } + /** + * Catches clicks an unpauses, without passing the click through + * to the puzzle. + */ + class Unpauser extends MouseHijacker + { + public Unpauser (PuzzlePanel panel) + { + super(panel.getBoardView()); + _panel = panel; + panel.addMouseListener(_clicker); + panel.getBoardView().addMouseListener(_clicker); + } + + public Component release () + { + _panel.removeMouseListener(_clicker); + _panel.getBoardView().removeMouseListener(_clicker); + return super.release(); + } + + protected MouseAdapter _clicker = new MouseAdapter() { + public void mousePressed (MouseEvent event) { + setChatting(false); // this will call release + } + }; + + protected PuzzlePanel _panel; + } + + /** The mouse jockey for unpausing our puzzles. */ + protected Unpauser _unpauser; + /** Handles the sending of puzzle progress updates. We can't just * register an interval for this because sometimes the clock goes * backwards in time in windows and our intervals don't get called for