001 /* 002 * Copyright 2002-2004 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.progress; 017 018 import java.awt.Component; 019 import java.awt.Cursor; 020 import java.awt.event.KeyAdapter; 021 import java.awt.event.MouseAdapter; 022 import java.awt.event.MouseMotionAdapter; 023 024 import javax.swing.JPanel; 025 import javax.swing.JRootPane; 026 import javax.swing.SwingUtilities; 027 028 /** 029 * Support for showing a Busy Cursor during a long running process. 030 */ 031 public class BusyIndicator { 032 033 public static class BusyGlassPanel extends JPanel { 034 035 public static final Component INSTANCE = new BusyGlassPanel(); 036 037 public static Component instance() { 038 return INSTANCE; 039 } 040 041 public BusyGlassPanel() { 042 super.setOpaque(false); 043 super.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 044 super.addKeyListener((new KeyAdapter() { 045 })); 046 super.addMouseListener((new MouseAdapter() { 047 })); 048 super.addMouseMotionListener((new MouseMotionAdapter() { 049 })); 050 } 051 } 052 053 /** 054 * Runs the given <code>Runnable</code> while providing busy feedback 055 * using this busy indicator. 056 * 057 * @param component the display on which the busy feedback should be displayed. If the 058 * display is null, the Display for the current thread will be 059 * used. If there is no Display for the current thread, the 060 * runnable code will be executed and no busy feedback will be 061 * displayed. 062 * @param runnable the runnable for which busy feedback is to be shown 063 * 064 * @see #showWhile 065 */ 066 public static void showWhile(Component component, Runnable runnable) { 067 if (component != null) { 068 showAt(component); 069 } 070 try { 071 runnable.run(); 072 } 073 catch (RuntimeException x) { 074 x.printStackTrace(); 075 throw x; 076 } 077 catch (Error x) { 078 x.printStackTrace(); 079 throw x; 080 } 081 finally { 082 if (component != null) { 083 clearAt(component); 084 } 085 } 086 } 087 088 public static void showAt(Component component) { 089 JRootPane root = SwingUtilities.getRootPane(component); 090 if (root != null && root.isShowing()) { 091 root.setGlassPane(BusyGlassPanel.INSTANCE); 092 root.getGlassPane().setVisible(true); 093 } 094 } 095 096 public static void clearAt(Component component) { 097 JRootPane root = SwingUtilities.getRootPane(component); 098 if (root != null && root.isShowing()) { 099 root.getGlassPane().setVisible(false); 100 } 101 } 102 103 } 104