1 /* 2 * Copyright (c) 1997, 2004, 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 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 ///////////////////////////////////////////////////////////////////////////// 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 }