001: /*
002: * @(#)GFramePeer.java 1.16 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.awt.gtk;
029:
030: import sun.awt.peer.FramePeer;
031: import java.awt.*;
032: import java.awt.event.*;
033: import java.awt.image.*;
034: import sun.awt.image.ImageRepresentation;
035:
036: /*
037: * Warning :
038: * Two versions of this file exist in this workspace.
039: * One for Personal Basis, and one for Personal Profile.
040: * Don't edit the wrong one !!!
041: */
042:
043: /**
044: * GFramePeer.java
045: *
046: * @author Nicholas Allen
047: */
048:
049: class GFramePeer extends GWindowPeer implements FramePeer,
050: ImageObserver {
051: private static native void initIDs();
052:
053: private static int defaultLeftBorder = 6;
054: private static int defaultRightBorder = 6;
055: private static int defaultTopBorder = 19;
056: private static int defaultBottomBorder = 6;
057: static {
058: initIDs();
059: }
060:
061: GFramePeer(GToolkit toolkit, Frame target) {
062: super (toolkit, target);
063: setTitle(target.getTitle());
064: setResizable(target.isResizable());
065: state = target.getState();
066: topBorder = defaultTopBorder;
067: leftBorder = defaultLeftBorder;
068: bottomBorder = defaultBottomBorder;
069: rightBorder = defaultRightBorder;
070: setIconImage(target.getIconImage());
071: }
072:
073: protected native void create();
074:
075: protected native void setTitleNative(byte[] title);
076:
077: public void setTitle(String title) {
078: if (title != null)
079: setTitleNative(stringToNulMultiByte(title));
080: }
081:
082: public void setState(int state) {
083: if (target.isVisible()) {
084: setStateNative(state);
085: }
086: this .state = state;
087: }
088:
089: private native void setStateNative(int state);
090:
091: public int getState() {
092: return state;
093: }
094:
095: private native void setIconImageNative(
096: GdkImageRepresentation gdkImageRep);
097:
098: public void setIconImage(Image img) {
099: if (img != null && img instanceof GdkImage) {
100: if (((GdkImage) img).isComplete())
101: imageUpdate(img, ALLBITS, 0, 0, 0, 0);
102: else
103: toolkit.prepareImage(img, 20, 20, this );
104: }
105: }
106:
107: public void setMenuBar(MenuBar mb) {
108: GMenuBarPeer peer = (GMenuBarPeer) toolkit
109: .getMenuComponentPeer(mb);
110: setMenuBarNative(peer);
111: }
112:
113: private native void setMenuBarNative(GMenuBarPeer peer);
114:
115: public void show() {
116: // If we are making this frame visible in the iconic state then we need to make sure
117: // the WM_HINTS property is set to IconicState or NormalState prior to making the frame visible.
118: // Unfortunately, this is very much dependant on X implementation and as Gtk does not
119: // provide us with a well designed or high level API, and misses out this functionality completely,
120: // this is the only way of getting around it.
121:
122: setWMStateHints(state == Frame.ICONIFIED);
123: super .show();
124: }
125:
126: /** Sets the WM_STATE property on the window to IconicState. This is clalled prior to showing
127: the window in order to make sure it is shown as a visible icon and not in the normal state
128: as Gtk would normally do. */
129:
130: private native void setWMStateHints(boolean iconic);
131:
132: private void postWindowIconified() {
133: state = Frame.ICONIFIED;
134: GToolkit.postEvent(new WindowEvent((Window) target,
135: WindowEvent.WINDOW_ICONIFIED));
136: }
137:
138: private void postWindowDeiconified() {
139: state = Frame.NORMAL;
140: GToolkit.postEvent(new WindowEvent((Window) target,
141: WindowEvent.WINDOW_DEICONIFIED));
142: }
143:
144: /** Calculates the insets using any values appropriate (such as borders). */
145:
146: Insets calculateInsets() {
147: return new Insets(topBorder + menuBarHeight, leftBorder,
148: bottomBorder, rightBorder);
149: }
150:
151: /** Sets up border values to some sensible values for this window. */
152:
153: void initBorders() {
154: topBorder = defaultTopBorder;
155: leftBorder = defaultLeftBorder;
156: bottomBorder = defaultBottomBorder;
157: rightBorder = defaultRightBorder;
158: }
159:
160: /** Sets the default border values to be used for future windows. */
161:
162: void setDefaultBorders(int top, int left, int bottom, int right) {
163: defaultTopBorder = top;
164: defaultLeftBorder = left;
165: defaultBottomBorder = bottom;
166: defaultRightBorder = right;
167: }
168:
169: public boolean imageUpdate(Image img, int infoflags, int x, int y,
170: int width, int height) {
171: if ((infoflags & (ALLBITS | FRAMEBITS)) > 0) {
172: if (img instanceof GdkImage) {
173: ImageRepresentation ir = ((GdkImage) img).getImageRep();
174: if (ir instanceof GdkImageRepresentation)
175: setIconImageNative((GdkImageRepresentation) ir);
176: }
177: return false;
178: }
179: if ((infoflags & (ABORT | ERROR)) > 0)
180: return false;
181: return true;
182: }
183:
184: private int menuBarHeight;
185: /* Stores the state of this frame (whether it is iconified or not). */
186:
187: private int state;
188: }
|