1/*
2 * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26
27package com.sun.java.swing.plaf.windows;
28
29import javax.swing.DefaultDesktopManager;
30import javax.swing.JInternalFrame;
31import javax.swing.JLayeredPane;
32import java.awt.Component;
33import java.awt.Container;
34import java.awt.Dimension;
35import java.beans.PropertyVetoException;
36import java.util.Vector;
37import java.lang.ref.WeakReference;
38
39/**
40 * This class implements a DesktopManager which more closely follows
41 * the MDI model than the DefaultDesktopManager.  Unlike the
42 * DefaultDesktopManager policy, MDI requires that the selected
43 * and activated child frames are the same, and that that frame
44 * always be the top-most window.
45 * <p>
46 * The maximized state is managed by the DesktopManager with MDI,
47 * instead of just being a property of the individual child frame.
48 * This means that if the currently selected window is maximized
49 * and another window is selected, that new window will be maximized.
50 *
51 * @see javax.swing.DefaultDesktopManager
52 * @author Thomas Ball
53 */
54@SuppressWarnings("serial") // JDK-implementation class
55public class WindowsDesktopManager extends DefaultDesktopManager
56        implements java.io.Serializable, javax.swing.plaf.UIResource {
57
58    /* The frame which is currently selected/activated.
59     * We store this value to enforce MDI's single-selection model.
60     */
61    private WeakReference<JInternalFrame> currentFrameRef;
62
63    public void activateFrame(JInternalFrame f) {
64        JInternalFrame currentFrame = currentFrameRef != null ?
65            currentFrameRef.get() : null;
66        try {
67            super.activateFrame(f);
68            if (currentFrame != null && f != currentFrame) {
69                // If the current frame is maximized, transfer that
70                // attribute to the frame being activated.
71                if (!currentFrame.isClosed() && currentFrame.isMaximum() &&
72                    (f.getClientProperty("JInternalFrame.frameType") !=
73                    "optionDialog") ) {
74                    //Special case.  If key binding was used to select next
75                    //frame instead of minimizing the icon via the minimize
76                    //icon.
77                    if (!currentFrame.isIcon()) {
78                        currentFrame.setMaximum(false);
79                        if (f.isMaximizable()) {
80                            if (!f.isMaximum()) {
81                                f.setMaximum(true);
82                            } else if (f.isMaximum() && f.isIcon()) {
83                                f.setIcon(false);
84                            } else {
85                                f.setMaximum(false);
86                            }
87                        }
88                    }
89                }
90                if (currentFrame.isSelected()) {
91                    currentFrame.setSelected(false);
92                }
93            }
94
95            if (!f.isSelected()) {
96                f.setSelected(true);
97            }
98        } catch (PropertyVetoException e) {}
99        if (f != currentFrame) {
100            currentFrameRef = new WeakReference<JInternalFrame>(f);
101        }
102    }
103
104}
105