1   /*
2    * Scope: a generic MVC framework.
3    * Copyright (c) 2000-2002, The Scope team
4    * All rights reserved.
5    *
6    *
7    * Redistribution and use in source and binary forms, with or without
8    * modification, are permitted provided that the following conditions
9    * are met:
10   *
11   * Redistributions of source code must retain the above copyright
12   * notice, this list of conditions and the following disclaimer.
13   *
14   * Redistributions in binary form must reproduce the above copyright
15   * notice, this list of conditions and the following disclaimer in the
16   * documentation and/or other materials provided with the distribution.
17   *
18   * Neither the name "Scope" nor the names of its contributors
19   * may be used to endorse or promote products derived from this software
20   * without specific prior written permission.
21   *
22   *
23   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26   * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
27   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34   *
35   *
36   * $Id: AWTUtilities.java,v 1.7 2002/09/13 17:04:38 ludovicc Exp $
37   */
38  package org.scopemvc.view.awt;
39  
40  
41  import java.awt.Component;
42  import java.awt.Dimension;
43  import java.awt.Point;
44  import java.awt.Rectangle;
45  import java.awt.Toolkit;
46  import java.awt.Window;
47  import org.apache.commons.logging.Log;
48  import org.apache.commons.logging.LogFactory;
49  import org.scopemvc.core.View;
50  import org.scopemvc.util.Debug;
51  
52  /***
53   * <P>
54   *
55   * Utilities dependent on Java AWT and Scope core packages only. </P>
56   *
57   * @author <A HREF="mailto:smeyfroi@users.sourceforge.net">Steve Meyfroidt</A>
58   * @created 05 September 2002
59   * @version $Revision: 1.7 $ $Date: 2002/09/13 17:04:38 $
60   */
61  public final class AWTUtilities {
62  
63      private static final Log LOG = LogFactory.getLog(AWTUtilities.class);
64  
65      private AWTUtilities() { }
66  
67      /***
68       * Find the next View from a Component upwards in the java.awt.Component
69       * containment hierarchy that has a parent Controller that it can issue
70       * Controls to.
71       *
72       * @param inComponent The Component to find a Controller for
73       * @return The parent View bound to a non-null Controller
74       */
75      public static View findControlIssuer(Component inComponent) {
76          Component parent = inComponent;
77          while (parent != null) {
78              if (parent instanceof View) {
79                  if (((View) parent).getController() != null) {
80                      return (View) parent;
81                  }
82              }
83              parent = parent.getParent();
84          }
85          if (LOG.isInfoEnabled()) {
86              LOG.warn("findControlIssuer: no Control Issuer for component: " + inComponent);
87          }
88          return null;
89      }
90  
91  
92      // --------------------------------- Window positioning
93  
94      /***
95       * Center a window on the screen
96       *
97       * @param inWindow The Window to center
98       */
99      public static void centreOnScreen(Window inWindow) {
100         if (inWindow == null) {
101             throw new IllegalArgumentException();
102         }
103 
104         Rectangle centredBounds = getCenteredBounds(inWindow.getSize());
105         inWindow.setLocation(centredBounds.x, centredBounds.y);
106     }
107 
108 
109     /***
110      * Center a window on a parent Window if showing, or if not assume position
111      * of parent is (0, 0)
112      *
113      * @param inParent The parent Window used as reference if it's visible
114      * @param inWindow The Window to center
115      */
116     public static void centreOnWindow(Window inParent, Window inWindow) {
117         if (inParent == null) {
118             throw new IllegalArgumentException("Can't centre on a null parent.");
119         }
120         if (inWindow == null) {
121             throw new IllegalArgumentException("Can't centre a null Window.");
122         }
123 
124         Dimension parentSize = inParent.getSize();
125         Dimension windowSize = inWindow.getSize();
126         Point parentLocation = new Point(0, 0);
127         if (inParent.isShowing()) {
128             parentLocation = inParent.getLocationOnScreen();
129         }
130 
131         int x = parentLocation.x + parentSize.width / 2 - windowSize.width / 2;
132         int y = parentLocation.y + parentSize.height / 2 - windowSize.height / 2;
133 
134         inWindow.setLocation(x, y);
135     }
136 
137 
138     /***
139      * Make sure window fits on the screeen
140      *
141      * @param inWindow The Window to fit on the screen
142      */
143     public static void fitOnScreen(Window inWindow) {
144         Dimension fullScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
145         Dimension screenSize = new Dimension(fullScreenSize.width, fullScreenSize.height);
146         Dimension windowSize = inWindow.getSize();
147         Point windowLocation = inWindow.getLocation();
148 
149         if (LOG.isDebugEnabled()) {
150             LOG.debug("fitOnScreen: screenSize: " + screenSize);
151             LOG.debug("fitOnScreen: windowSize: " + windowSize);
152             LOG.debug("fitOnScreen: windowLocation: " + windowLocation);
153         }
154 
155         Dimension newWindowSize = new Dimension(windowSize);
156         Point newWindowLocation = new Point(windowLocation);
157 
158         if (windowLocation.x < 0) {
159             newWindowLocation.x = 0;
160         }
161 
162         if (windowLocation.y < 0) {
163             newWindowLocation.y = 0;
164         }
165 
166         if (newWindowLocation.x + windowSize.width > screenSize.width) {
167             if (LOG.isDebugEnabled()) {
168                 LOG.debug("fitOnScreen: too wide");
169             }
170             // First try to reposition window
171             newWindowLocation.x = windowLocation.x - (windowLocation.x + windowSize.width - screenSize.width);
172             if (LOG.isDebugEnabled()) {
173                 LOG.debug("fitOnScreen: reposition: location: " + newWindowLocation);
174             }
175             // Then resize it
176             if (newWindowLocation.x < 0) {
177                 newWindowSize.width += newWindowLocation.x;
178                 newWindowLocation.x = 0;
179                 if (LOG.isDebugEnabled()) {
180                     LOG.debug("fitOnScreen: reposition: size: " + newWindowSize);
181                 }
182             }
183         }
184 
185         if (newWindowLocation.y + windowSize.height > screenSize.height) {
186             // First try to reposition window
187             newWindowLocation.y = windowLocation.y - (windowLocation.y + windowSize.height - screenSize.height);
188             // Then resize it
189             if (newWindowLocation.y < 0) {
190                 newWindowSize.height += newWindowLocation.y;
191                 newWindowLocation.y = 0;
192             }
193         }
194 
195         if (LOG.isDebugEnabled()) {
196             LOG.debug("fitOnScreen: newWindowSize: " + newWindowSize);
197             LOG.debug("fitOnScreen: newWindowLocation: " + newWindowLocation);
198         }
199 
200         inWindow.setSize(newWindowSize);
201         inWindow.setLocation(newWindowLocation);
202     }
203 
204 
205     private static Rectangle getCenteredBounds(Dimension inWindowSize) {
206         if (Debug.ON) {
207             Debug.assertTrue(inWindowSize != null);
208         }
209 
210         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
211 
212         int x = screenSize.width / 2 - inWindowSize.width / 2;
213         int y = screenSize.height / 2 - inWindowSize.height / 2;
214 
215         return new Rectangle(x, y, inWindowSize.width, inWindowSize.height);
216     }
217 }
218 
This page was automatically generated by Maven