1 /*
2  * Copyright (c) 1997, 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 package com.sun.java.swing.plaf.motif;
27 
28 import java.awt.*;
29 import java.awt.event.*;
30 import javax.swing.*;
31 import javax.swing.event.*;
32 
33 import java.util.EventListener;
34 
35 import javax.swing.plaf.basic.*;
36 import javax.swing.border.*;
37 import javax.swing.plaf.*;
38 
39 
40 /**
41  * A Motif {@literal L&F} implementation of InternalFrame.
42  * <p>
43  * <strong>Warning:</strong>
44  * Serialized objects of this class will not be compatible with
45  * future Swing releases.  The current serialization support is appropriate
46  * for short term storage or RMI between applications running the same
47  * version of Swing.  A future release of Swing will provide support for
48  * long term persistence.
49  *
50  * @author Tom Ball
51  */
52 public class MotifInternalFrameUI extends BasicInternalFrameUI {
53 
54     Color color;
55     Color highlight;
56     Color shadow;
57     MotifInternalFrameTitlePane titlePane;
58 
59     /**
60      * As of Java 2 platform v1.3 this previously undocumented field is no
61      * longer used.
62      * Key bindings are now defined by the LookAndFeel, please refer to
63      * the key bindings specification for further details.
64      *
65      * @deprecated As of Java 2 platform v1.3.
66      */
67     @Deprecated
68     protected KeyStroke closeMenuKey;
69 
70 
71 /////////////////////////////////////////////////////////////////////////////
72 // ComponentUI Interface Implementation methods
73 /////////////////////////////////////////////////////////////////////////////
createUI(JComponent w)74     public static ComponentUI createUI(JComponent w)    {
75         return new MotifInternalFrameUI((JInternalFrame)w);
76     }
77 
MotifInternalFrameUI(JInternalFrame w)78     public MotifInternalFrameUI(JInternalFrame w)   {
79         super(w);
80     }
81 
installUI(JComponent c)82     public void installUI(JComponent c)   {
83         super.installUI(c);
84         setColors((JInternalFrame)c);
85     }
86 
installDefaults()87     protected void installDefaults() {
88         Border frameBorder = frame.getBorder();
89         frame.setLayout(internalFrameLayout = createLayoutManager());
90         if (frameBorder == null || frameBorder instanceof UIResource) {
91             frame.setBorder(new MotifBorders.InternalFrameBorder(frame));
92         }
93     }
94 
95 
installKeyboardActions()96     protected void installKeyboardActions(){
97       super.installKeyboardActions();
98       // We replace the
99       // we use JPopup in our TitlePane so need escape support
100       closeMenuKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
101     }
102 
103 
uninstallDefaults()104     protected void uninstallDefaults() {
105         LookAndFeel.uninstallBorder(frame);
106         frame.setLayout(null);
107         internalFrameLayout = null;
108     }
109 
getFrame()110     private JInternalFrame getFrame(){
111       return frame;
112     }
113 
createNorthPane(JInternalFrame w)114     public JComponent createNorthPane(JInternalFrame w) {
115         titlePane = new MotifInternalFrameTitlePane(w);
116         return titlePane;
117     }
118 
getMaximumSize(JComponent x)119     public Dimension getMaximumSize(JComponent x) {
120         return Toolkit.getDefaultToolkit().getScreenSize();
121     }
122 
uninstallKeyboardActions()123     protected void uninstallKeyboardActions(){
124       super.uninstallKeyboardActions();
125       if (isKeyBindingRegistered()){
126         JInternalFrame.JDesktopIcon di = frame.getDesktopIcon();
127         SwingUtilities.replaceUIActionMap(di, null);
128         SwingUtilities.replaceUIInputMap(di, JComponent.WHEN_IN_FOCUSED_WINDOW,
129                                          null);
130       }
131     }
132 
133     @SuppressWarnings("serial") // anonymous class
setupMenuOpenKey()134     protected void setupMenuOpenKey(){
135         super.setupMenuOpenKey();
136         ActionMap map = SwingUtilities.getUIActionMap(frame);
137         if (map != null) {
138             // BasicInternalFrameUI creates an action with the same name, we override
139             // it as MotifInternalFrameTitlePane has a titlePane ivar that shadows the
140             // titlePane ivar in BasicInternalFrameUI, making supers action throw
141             // an NPE for us.
142             map.put("showSystemMenu", new AbstractAction(){
143                 public void actionPerformed(ActionEvent e){
144                     titlePane.showSystemMenu();
145                 }
146                 public boolean isEnabled(){
147                     return isKeyBindingActive();
148                 }
149             });
150         }
151     }
152 
153     @SuppressWarnings("serial") // anonymous class
setupMenuCloseKey()154     protected void setupMenuCloseKey(){
155         ActionMap map = SwingUtilities.getUIActionMap(frame);
156         if (map != null) {
157             map.put("hideSystemMenu", new AbstractAction(){
158                 public void actionPerformed(ActionEvent e){
159                     titlePane.hideSystemMenu();
160                 }
161                 public boolean isEnabled(){
162                     return isKeyBindingActive();
163                 }
164             });
165         }
166 
167         // Set up the bindings for the DesktopIcon, it is odd that
168         // we install them, and not the desktop icon.
169         JInternalFrame.JDesktopIcon di = frame.getDesktopIcon();
170         InputMap diInputMap = SwingUtilities.getUIInputMap
171                           (di, JComponent.WHEN_IN_FOCUSED_WINDOW);
172         if (diInputMap == null) {
173             Object[] bindings = (Object[])UIManager.get
174                                           ("DesktopIcon.windowBindings");
175             if (bindings != null) {
176                 diInputMap = LookAndFeel.makeComponentInputMap(di, bindings);
177 
178                 SwingUtilities.replaceUIInputMap(di, JComponent.
179                                                WHEN_IN_FOCUSED_WINDOW,
180                                                diInputMap);
181             }
182         }
183         ActionMap diActionMap = SwingUtilities.getUIActionMap(di);
184         if (diActionMap == null) {
185             diActionMap = new ActionMapUIResource();
186             diActionMap.put("hideSystemMenu", new AbstractAction(){
187                 public void actionPerformed(ActionEvent e){
188                     JInternalFrame.JDesktopIcon icon = getFrame().
189                                      getDesktopIcon();
190                     MotifDesktopIconUI micon = (MotifDesktopIconUI)icon.
191                                                getUI();
192                     micon.hideSystemMenu();
193                 }
194                 public boolean isEnabled(){
195                     return isKeyBindingActive();
196                 }
197             });
198             SwingUtilities.replaceUIActionMap(di, diActionMap);
199         }
200     }
201 
202     /** This method is called when the frame becomes selected.
203       */
activateFrame(JInternalFrame f)204     protected void activateFrame(JInternalFrame f) {
205         super.activateFrame(f);
206         setColors(f);
207     }
208     /** This method is called when the frame is no longer selected.
209       */
deactivateFrame(JInternalFrame f)210     protected void deactivateFrame(JInternalFrame f) {
211         setColors(f);
212         super.deactivateFrame(f);
213     }
214 
setColors(JInternalFrame frame)215     void setColors(JInternalFrame frame) {
216         if (frame.isSelected()) {
217             color = UIManager.getColor("InternalFrame.activeTitleBackground");
218         } else {
219             color = UIManager.getColor("InternalFrame.inactiveTitleBackground");
220         }
221         highlight = color.brighter();
222         shadow = color.darker().darker();
223         titlePane.setColors(color, highlight, shadow);
224     }
225 }
226