1 /* JDesktopPane.java --
2    Copyright (C) 2002, 2004 Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 
39 package javax.swing;
40 
41 import gnu.java.lang.CPStringBuilder;
42 
43 import java.awt.Component;
44 import java.beans.PropertyVetoException;
45 
46 import javax.accessibility.Accessible;
47 import javax.accessibility.AccessibleContext;
48 import javax.accessibility.AccessibleRole;
49 import javax.swing.plaf.DesktopPaneUI;
50 
51 /**
52  * JDesktopPane is a container (usually for JInternalFrames) that simulates a
53  * desktop. Typically, the user will create JInternalFrames and place them in
54  * a JDesktopPane. The user can then interact with JInternalFrames like they
55  * usually would with JFrames. The actions (minimize, maximize, close, etc)
56  * are done by using a DesktopManager that is associated with the
57  * JDesktopPane.
58  */
59 public class JDesktopPane extends JLayeredPane implements Accessible
60 {
61   private static final long serialVersionUID = 766333777224038726L;
62 
63   /**
64    * This specifies that when dragged, a JInternalFrame should be completely
65    * visible.
66    *
67    * @specnote final since 1.5.0.
68    */
69   public static final int LIVE_DRAG_MODE = 0;
70 
71   /**
72    * This specifies that when dragged, a JInternalFrame should only be visible
73    * as an outline.
74    *
75    * @specnote final since 1.5.0.
76    */
77   public static final int OUTLINE_DRAG_MODE = 1;
78 
79   /** The selected frame in the JDesktopPane. */
80   private transient JInternalFrame selectedFrame;
81 
82   /** The JDesktopManager to use for acting on JInternalFrames. */
83   transient DesktopManager desktopManager;
84 
85   /** The drag mode used by the JDesktopPane. */
86   private transient int dragMode = LIVE_DRAG_MODE;
87 
88   /**
89    * Indicates if the dragMode property has been set by a client
90    * program or by the UI.
91    *
92    * @see #setUIProperty(String, Object)
93    * @see LookAndFeel#installProperty(JComponent, String, Object)
94    */
95   private boolean clientDragModeSet = false;
96 
97   /**
98    * Provides the accessibility features for the <code>JDesktopPane</code>
99    * component.
100    */
101   protected class AccessibleJDesktopPane extends AccessibleJComponent
102   {
103     private static final long serialVersionUID = 6079388927946077570L;
104 
105     /**
106      * Creates a new <code>AccessibleJDesktopPane</code> instance.
107      */
AccessibleJDesktopPane()108     protected AccessibleJDesktopPane()
109     {
110       // Nothing to do here.
111     }
112 
113     /**
114      * Returns the accessible role for the <code>JSlider</code> component.
115      *
116      * @return {@link AccessibleRole#DESKTOP_PANE}.
117      */
getAccessibleRole()118     public AccessibleRole getAccessibleRole()
119     {
120       return AccessibleRole.DESKTOP_PANE;
121     }
122   }
123 
124   /**
125    * Creates a new JDesktopPane object.
126    */
JDesktopPane()127   public JDesktopPane()
128   {
129     setLayout(null);
130     updateUI();
131   }
132 
133   /**
134    * This method returns the UI used with the JDesktopPane.
135    *
136    * @return The UI used with the JDesktopPane.
137    */
getUI()138   public DesktopPaneUI getUI()
139   {
140     return (DesktopPaneUI) ui;
141   }
142 
143   /**
144    * This method sets the UI used with the JDesktopPane.
145    *
146    * @param ui The UI to use with the JDesktopPane.
147    */
setUI(DesktopPaneUI ui)148   public void setUI(DesktopPaneUI ui)
149   {
150     super.setUI(ui);
151   }
152 
153   /**
154    * This method sets the drag mode to use with the JDesktopPane.
155    *
156    * @param mode The drag mode to use.
157    *
158    * @throws IllegalArgumentException If the drag mode given is not
159    *         LIVE_DRAG_MODE or OUTLINE_DRAG_MODE.
160    */
setDragMode(int mode)161   public void setDragMode(int mode)
162   {
163     if ((mode != LIVE_DRAG_MODE) && (mode != OUTLINE_DRAG_MODE))
164       throw new IllegalArgumentException("Drag mode not valid.");
165 
166     clientDragModeSet = true;
167 
168     // FIXME: Unsupported mode.
169     if (mode == OUTLINE_DRAG_MODE)
170       // throw new IllegalArgumentException("Outline drag modes are
171       // unsupported.");
172       mode = LIVE_DRAG_MODE;
173 
174     dragMode = mode;
175   }
176 
177   /**
178    * This method returns the drag mode used with the JDesktopPane.
179    *
180    * @return The drag mode used with the JDesktopPane.
181    */
getDragMode()182   public int getDragMode()
183   {
184     return dragMode;
185   }
186 
187   /**
188    * This method returns the DesktopManager used with the JDesktopPane.
189    *
190    * @return The DesktopManager to use with the JDesktopPane.
191    */
getDesktopManager()192   public DesktopManager getDesktopManager()
193   {
194     return desktopManager;
195   }
196 
197   /**
198    * This method sets the DesktopManager to use with the JDesktopPane.
199    *
200    * @param manager The DesktopManager to use with the JDesktopPane.
201    */
setDesktopManager(DesktopManager manager)202   public void setDesktopManager(DesktopManager manager)
203   {
204     desktopManager = manager;
205   }
206 
207   /**
208    * This method restores the UI used with the JDesktopPane to the default.
209    */
updateUI()210   public void updateUI()
211   {
212     setUI((DesktopPaneUI) UIManager.getUI(this));
213   }
214 
215   /**
216    * This method returns a String identifier that allows the UIManager to know
217    * which class will act as JDesktopPane's UI.
218    *
219    * @return A String identifier for the UI class to use.
220    */
getUIClassID()221   public String getUIClassID()
222   {
223     return "DesktopPaneUI";
224   }
225 
226   /**
227    * This method returns all JInternalFrames that are in the JDesktopPane.
228    *
229    * @return All JInternalFrames that are in the JDesktopPane.
230    */
getAllFrames()231   public JInternalFrame[] getAllFrames()
232   {
233     return getFramesFromComponents(getComponents());
234   }
235 
236   /**
237    * This method returns the currently selected frame in the JDesktopPane.
238    *
239    * @return The currently selected frame in the JDesktopPane.
240    */
getSelectedFrame()241   public JInternalFrame getSelectedFrame()
242   {
243     return selectedFrame;
244   }
245 
246   /**
247    * This method sets the selected frame in the JDesktopPane.
248    *
249    * @param frame The selected frame in the JDesktopPane.
250    */
setSelectedFrame(JInternalFrame frame)251   public void setSelectedFrame(JInternalFrame frame)
252   {
253     if (selectedFrame != null)
254       {
255         try
256           {
257             selectedFrame.setSelected(false);
258           }
259         catch (PropertyVetoException e)
260           {
261             // We do nothing when the attempt is vetoed.
262           }
263       }
264     selectedFrame = null;
265 
266     try
267       {
268         if (frame != null)
269           frame.setSelected(true);
270 
271         selectedFrame = frame;
272       }
273     catch (PropertyVetoException e)
274       {
275         // We do nothing when the attempt is vetoed.
276       }
277   }
278 
279   /**
280    * This method returns all the JInternalFrames in the given layer.
281    *
282    * @param layer The layer to grab frames in.
283    *
284    * @return All JInternalFrames in the given layer.
285    */
getAllFramesInLayer(int layer)286   public JInternalFrame[] getAllFramesInLayer(int layer)
287   {
288     return getFramesFromComponents(getComponentsInLayer(layer));
289   }
290 
291   /**
292    * This method always returns true to indicate that it is not transparent.
293    *
294    * @return true.
295    */
isOpaque()296   public boolean isOpaque()
297   {
298     return true;
299   }
300 
301   /**
302    * Returns an implementation-dependent string describing the attributes of
303    * this <code>JDesktopPane</code>.
304    *
305    * @return A string describing the attributes of this <code>JDesktopPane</code>
306    *         (never <code>null</code>).
307    */
paramString()308   protected String paramString()
309   {
310     String superParamStr = super.paramString();
311     CPStringBuilder sb = new CPStringBuilder();
312     sb.append(",isOptimizedDrawingPossible=");
313     sb.append(isOptimizedDrawingEnabled());
314     sb.append(",desktopManager=");
315     if (desktopManager != null)
316       sb.append(desktopManager);
317     return superParamStr + sb.toString();
318   }
319 
320   /**
321    * This method returns all the JInternalFrames in the given Component array.
322    *
323    * @param components An array to search for JInternalFrames in.
324    *
325    * @return An array of JInternalFrames found in the Component array.
326    */
getFramesFromComponents(Component[] components)327   private static JInternalFrame[] getFramesFromComponents(Component[] components)
328   {
329     int count = 0;
330 
331     for (int i = 0; i < components.length; i++)
332         if (components[i] instanceof JInternalFrame)
333           count++;
334 
335     JInternalFrame[] value = new JInternalFrame[count];
336     for (int i = 0, j = 0; i < components.length && j != count; i++)
337       if (components[i] instanceof JInternalFrame)
338         value[j++] = (JInternalFrame) components[i];
339     return value;
340   }
341 
342   /**
343    * Returns the object that provides accessibility features for this
344    * <code>JDesktopPane</code> component.
345    *
346    * @return The accessible context (an instance of
347    *     {@link AccessibleJDesktopPane}).
348    */
getAccessibleContext()349   public AccessibleContext getAccessibleContext()
350   {
351     if (accessibleContext == null)
352       accessibleContext = new AccessibleJDesktopPane();
353 
354     return accessibleContext;
355   }
356 
357   /**
358    * Helper method for
359    * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
360    *
361    * @param propertyName the name of the property
362    * @param value the value of the property
363    *
364    * @throws IllegalArgumentException if the specified property cannot be set
365    *         by this method
366    * @throws ClassCastException if the property value does not match the
367    *         property type
368    * @throws NullPointerException if <code>c</code> or
369    *         <code>propertyValue</code> is <code>null</code>
370    */
setUIProperty(String propertyName, Object value)371   void setUIProperty(String propertyName, Object value)
372   {
373     if (propertyName.equals("dragMode"))
374       {
375         if (! clientDragModeSet)
376           {
377             setDragMode(((Integer) value).intValue());
378             clientDragModeSet = false;
379           }
380       }
381     else
382       {
383         super.setUIProperty(propertyName, value);
384       }
385   }
386 }
387