blob: e7a9978b37be5b574305f76d5f83f7fa69edd387 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1997-2004 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package com.sun.java.swing.plaf.motif;
27
28import java.awt.*;
29import java.awt.event.*;
30import javax.swing.*;
31import javax.swing.event.*;
32
33import java.util.EventListener;
34
35import javax.swing.plaf.basic.*;
36import javax.swing.border.*;
37import javax.swing.plaf.*;
38
39
40/**
41 * A Motif 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 */
52public 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/////////////////////////////////////////////////////////////////////////////
74 public static ComponentUI createUI(JComponent w) {
75 return new MotifInternalFrameUI((JInternalFrame)w);
76 }
77
78 public MotifInternalFrameUI(JInternalFrame w) {
79 super(w);
80 }
81
82 public void installUI(JComponent c) {
83 super.installUI(c);
84 setColors((JInternalFrame)c);
85 }
86
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
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
104 protected void uninstallDefaults() {
105 LookAndFeel.uninstallBorder(frame);
106 frame.setLayout(null);
107 internalFrameLayout = null;
108 }
109
110 private JInternalFrame getFrame(){
111 return frame;
112 }
113
114 public JComponent createNorthPane(JInternalFrame w) {
115 titlePane = new MotifInternalFrameTitlePane(w);
116 return titlePane;
117 }
118
119 public Dimension getMaximumSize(JComponent x) {
120 return Toolkit.getDefaultToolkit().getScreenSize();
121 }
122
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 protected void setupMenuOpenKey(){
134 super.setupMenuOpenKey();
135 ActionMap map = SwingUtilities.getUIActionMap(frame);
136 if (map != null) {
137 // BasicInternalFrameUI creates an action with the same name, we override
138 // it as MotifInternalFrameTitlePane has a titlePane ivar that shadows the
139 // titlePane ivar in BasicInternalFrameUI, making supers action throw
140 // an NPE for us.
141 map.put("showSystemMenu", new AbstractAction(){
142 public void actionPerformed(ActionEvent e){
143 titlePane.showSystemMenu();
144 }
145 public boolean isEnabled(){
146 return isKeyBindingActive();
147 }
148 });
149 }
150 }
151
152 protected void setupMenuCloseKey(){
153 ActionMap map = SwingUtilities.getUIActionMap(frame);
154 if (map != null) {
155 map.put("hideSystemMenu", new AbstractAction(){
156 public void actionPerformed(ActionEvent e){
157 titlePane.hideSystemMenu();
158 }
159 public boolean isEnabled(){
160 return isKeyBindingActive();
161 }
162 });
163 }
164
165 // Set up the bindings for the DesktopIcon, it is odd that
166 // we install them, and not the desktop icon.
167 JInternalFrame.JDesktopIcon di = frame.getDesktopIcon();
168 InputMap diInputMap = SwingUtilities.getUIInputMap
169 (di, JComponent.WHEN_IN_FOCUSED_WINDOW);
170 if (diInputMap == null) {
171 Object[] bindings = (Object[])UIManager.get
172 ("DesktopIcon.windowBindings");
173 if (bindings != null) {
174 diInputMap = LookAndFeel.makeComponentInputMap(di, bindings);
175
176 SwingUtilities.replaceUIInputMap(di, JComponent.
177 WHEN_IN_FOCUSED_WINDOW,
178 diInputMap);
179 }
180 }
181 ActionMap diActionMap = SwingUtilities.getUIActionMap(di);
182 if (diActionMap == null) {
183 diActionMap = new ActionMapUIResource();
184 diActionMap.put("hideSystemMenu", new AbstractAction(){
185 public void actionPerformed(ActionEvent e){
186 JInternalFrame.JDesktopIcon icon = getFrame().
187 getDesktopIcon();
188 MotifDesktopIconUI micon = (MotifDesktopIconUI)icon.
189 getUI();
190 micon.hideSystemMenu();
191 }
192 public boolean isEnabled(){
193 return isKeyBindingActive();
194 }
195 });
196 SwingUtilities.replaceUIActionMap(di, diActionMap);
197 }
198 }
199
200 /** This method is called when the frame becomes selected.
201 */
202 protected void activateFrame(JInternalFrame f) {
203 super.activateFrame(f);
204 setColors(f);
205 }
206 /** This method is called when the frame is no longer selected.
207 */
208 protected void deactivateFrame(JInternalFrame f) {
209 setColors(f);
210 super.deactivateFrame(f);
211 }
212
213 void setColors(JInternalFrame frame) {
214 if (frame.isSelected()) {
215 color = UIManager.getColor("InternalFrame.activeTitleBackground");
216 } else {
217 color = UIManager.getColor("InternalFrame.inactiveTitleBackground");
218 }
219 highlight = color.brighter();
220 shadow = color.darker().darker();
221 titlePane.setColors(color, highlight, shadow);
222 }
223}