001: /*
002: * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025: package sun.awt.X11;
026:
027: import java.awt.*;
028: import java.awt.peer.*;
029:
030: import java.lang.reflect.Field;
031: import java.util.Vector;
032: import java.util.logging.*;
033: import sun.awt.SunToolkit;
034:
035: public class XMenuPeer extends XMenuItemPeer implements MenuPeer {
036:
037: /************************************************
038: *
039: * Data members
040: *
041: ************************************************/
042: private static Logger log = Logger
043: .getLogger("sun.awt.X11.XMenuPeer");
044:
045: /**
046: * Window that correspond to this menu
047: */
048: XMenuWindow menuWindow;
049:
050: /*
051: * Menu's fields & methods
052: */
053: private final static Field f_items;
054:
055: static {
056: f_items = SunToolkit.getField(Menu.class, "items");
057: }
058:
059: /************************************************
060: *
061: * Construction
062: *
063: ************************************************/
064: XMenuPeer(Menu target) {
065: super (target);
066: }
067:
068: /**
069: * This function is called when menu is bound
070: * to its container window. Creates submenu window
071: * that fills its items vector while construction
072: */
073: void setContainer(XBaseMenuWindow container) {
074: super .setContainer(container);
075: menuWindow = new XMenuWindow(this );
076: }
077:
078: /************************************************
079: *
080: * Implementaion of interface methods
081: *
082: ************************************************/
083:
084: /*
085: * From MenuComponentPeer
086: */
087:
088: /**
089: * Disposes menu window if needed
090: */
091: public void dispose() {
092: if (menuWindow != null) {
093: menuWindow.dispose();
094: }
095: super .dispose();
096: }
097:
098: /**
099: * Resets text metrics for this item, for its menu window
100: * and for all descendant menu windows
101: */
102: public void setFont(Font font) {
103: //TODO:We can decrease count of repaints here
104: //and get rid of recursion
105: resetTextMetrics();
106:
107: XMenuWindow menuWindow = getMenuWindow();
108: if (menuWindow != null) {
109: menuWindow.setItemsFont(font);
110: }
111:
112: repaintIfShowing();
113: }
114:
115: /*
116: * From MenuPeer
117: */
118: /**
119: * addSeparator routines are not used
120: * in peers. Shared code invokes addItem("-")
121: * for adding separators
122: */
123: public void addSeparator() {
124: if (log.isLoggable(Level.FINER))
125: log.finer("addSeparator is not implemented");
126: }
127:
128: public void addItem(MenuItem item) {
129: XMenuWindow menuWindow = getMenuWindow();
130: if (menuWindow != null) {
131: menuWindow.addItem(item);
132: } else {
133: if (log.isLoggable(Level.FINE)) {
134: log
135: .fine("Attempt to use XMenuWindowPeer without window");
136: }
137: }
138: }
139:
140: public void delItem(int index) {
141: XMenuWindow menuWindow = getMenuWindow();
142: if (menuWindow != null) {
143: menuWindow.delItem(index);
144: } else {
145: if (log.isLoggable(Level.FINE)) {
146: log
147: .fine("Attempt to use XMenuWindowPeer without window");
148: }
149: }
150: }
151:
152: /************************************************
153: *
154: * Access to target's fields
155: *
156: ************************************************/
157: Vector getTargetItems() {
158: try {
159: return (Vector) f_items.get(getTarget());
160: } catch (IllegalAccessException iae) {
161: iae.printStackTrace();
162: return null;
163: }
164: }
165:
166: /************************************************
167: *
168: * Overriden behaviour
169: *
170: ************************************************/
171: boolean isSeparator() {
172: return false;
173: }
174:
175: //Fix for 6180416: Shortcut keys are displayed against Menus on XToolkit
176: //Menu should always return null as shortcutText
177: String getShortcutText() {
178: return null;
179: }
180:
181: /************************************************
182: *
183: * Utility functions
184: *
185: ************************************************/
186:
187: /**
188: * Returns menu window of this menu or null
189: * it this menu has no container and so its
190: * window can't be created.
191: */
192: XMenuWindow getMenuWindow() {
193: return menuWindow;
194: }
195:
196: }
|