BlockingGlassPane.java
001 /*
002  *  Copyright 1994-2009 Sun Microsystems, Inc. All Rights Reserved.
003  *  Under BSD licence, LGPL compatible.
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  From Sun forums:
011  *  <a href="http://forums.sun.com/thread.jspa?threadID=294121&forumID=57">
012  *  Swing [Archive] - Block JFrame and JDialog with JGlassPane</a>
013  *
014  *  Retrieved by Thomas Heitz - 03 july 2009.
015  *
016  *  $Id$
017  */
018 
019 package gate.swing;
020 
021 import java.awt.*;
022 import java.awt.event.*;
023 import javax.swing.*;
024 
025 /**
026  * A Panel that can be blocked.
027  <br>
028  * Just set an instance of this class as the glassPane
029  * of your JFrame and call <code>block()</code> as needed.
030  */
031 @SuppressWarnings("serial")
032 public class BlockingGlassPane extends JPanel {
033 
034   private int        blockCount = 0;
035   private BlockMouse blockMouse = new BlockMouse();
036   private BlockKeys  blockKeys  = new BlockKeys();
037 
038   /**
039    * Constructor.
040    */
041   public BlockingGlassPane() {
042     setVisible(false);
043     setOpaque (false);
044 
045     addMouseListener(blockMouse);
046   }
047 
048   /**
049    * Start or end blocking.
050    *
051    @param block   should blocking be started or ended
052    */
053   public void block(boolean block) {
054     if (block) {
055       if (blockCount == 0) {
056         setVisible(true);
057 
058         setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
059 
060         FocusManager.getCurrentManager().addKeyEventDispatcher(blockKeys);
061       }
062       blockCount++;
063     else {
064       blockCount--;
065       if (blockCount == 0) {
066         FocusManager.getCurrentManager().removeKeyEventDispatcher(blockKeys);
067 
068         setCursor(Cursor.getDefaultCursor());
069 
070         setVisible(false);
071       }
072     }
073   }
074 
075   /**
076    * Test if this glasspane is blocked.
077    *
078    @return    <code>true</code> if currently blocked
079    */
080   public boolean isBlocked() {
081     return blockCount > 0;
082   }
083 
084   /**
085    * The key dispatcher to block the keys.
086    */
087   private class BlockKeys implements KeyEventDispatcher {
088     @Override
089     public boolean dispatchKeyEvent(KeyEvent ev) {
090       Component source = ev.getComponent();
091       if (source != null &&
092           SwingUtilities.isDescendingFrom(source, getParent())) {
093         Toolkit.getDefaultToolkit().beep();
094         ev.consume();
095         return true;
096       }
097       return false;
098     }
099   }
100 
101   /**
102    * The mouse listener used to block the mouse.
103    */
104   private class BlockMouse extends MouseAdapter {
105     @Override
106     public void mouseClicked(MouseEvent ev) {
107       Toolkit.getDefaultToolkit().beep();
108     }
109   }
110 }