001: /*
002: * Copyright 1995-2003 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.motif;
026:
027: import java.awt.*;
028: import java.awt.peer.*;
029:
030: import sun.awt.SunGraphicsCallback;
031:
032: class MPanelPeer extends MCanvasPeer implements PanelPeer {
033:
034: MPanelPeer() {
035: }
036:
037: MPanelPeer(Component target) {
038: super (target);
039: }
040:
041: MPanelPeer(Component target, Object arg) {
042: super (target, arg);
043: }
044:
045: public Insets getInsets() {
046: return new Insets(0, 0, 0, 0);
047: }
048:
049: public void paint(Graphics g) {
050: super .paint(g);
051: SunGraphicsCallback.PaintHeavyweightComponentsCallback
052: .getInstance().runComponents(
053: ((Container) target).getComponents(),
054: g,
055: SunGraphicsCallback.LIGHTWEIGHTS
056: | SunGraphicsCallback.HEAVYWEIGHTS);
057: }
058:
059: public void print(Graphics g) {
060: super .print(g);
061: SunGraphicsCallback.PrintHeavyweightComponentsCallback
062: .getInstance().runComponents(
063: ((Container) target).getComponents(),
064: g,
065: SunGraphicsCallback.LIGHTWEIGHTS
066: | SunGraphicsCallback.HEAVYWEIGHTS);
067: }
068:
069: public void setBackground(Color c) {
070: Component comp;
071: int i;
072:
073: Container cont = (Container) target;
074: synchronized (target.getTreeLock()) {
075: int n = cont.getComponentCount();
076: for (i = 0; i < n; i++) {
077: comp = cont.getComponent(i);
078: MComponentPeer peer = (MComponentPeer) MToolkit
079: .targetToPeer(comp);
080: if (peer != null) {
081: Color color = comp.getBackground();
082: if (color == null || color.equals(c)) {
083: peer.setBackground(c);
084: peer.pSetBackground(c);
085: }
086: if ((comp instanceof java.awt.List)
087: || (comp instanceof java.awt.TextArea)
088: || (comp instanceof java.awt.ScrollPane)) {
089: peer.pSetScrollbarBackground(c);
090: }
091: }
092: }
093: }
094: pSetBackground(c);
095: }
096:
097: public void setForeground(Color c) {
098: Component comp;
099: int i;
100:
101: Container cont = (Container) target;
102: synchronized (target.getTreeLock()) {
103: int n = cont.getComponentCount();
104: for (i = 0; i < n; i++) {
105: comp = cont.getComponent(i);
106: MComponentPeer peer = (MComponentPeer) MToolkit
107: .targetToPeer(comp);
108: if (peer != null) {
109: Color color = comp.getForeground();
110: if (color == null || color.equals(c)) {
111: peer.setForeground(c);
112: peer.pSetForeground(c);
113: }
114: if ((comp instanceof java.awt.List)
115: || (comp instanceof java.awt.TextArea)
116: || (comp instanceof java.awt.ScrollPane)) {
117: peer.pSetInnerForeground(c);
118: }
119: }
120: }
121: }
122: pSetForeground(c);
123: }
124:
125: /**
126: * DEPRECATED: Replaced by getInsets().
127: */
128: public Insets insets() {
129: return getInsets();
130: }
131:
132: /**
133: * Recursive method that handles the propagation of the displayChanged
134: * event into the entire hierarchy of peers.
135: * Unlike on win32, on X we don't worry about handling on-the-fly
136: * display settings changes, only windows being dragged across Xinerama
137: * screens. Thus, we only need to tell MCanvasPeers, not all
138: * MComponentPeers.
139: */
140: private void recursiveDisplayChanged(Component c, int screenNum) {
141: if (c instanceof Container) {
142: Component children[] = ((Container) c).getComponents();
143: for (int i = 0; i < children.length; ++i) {
144: recursiveDisplayChanged(children[i], screenNum);
145: }
146: }
147: ComponentPeer peer = c.getPeer();
148: if (peer != null && peer instanceof MCanvasPeer) {
149: MCanvasPeer mPeer = (MCanvasPeer) peer;
150: mPeer.displayChanged(screenNum);
151: }
152: }
153:
154: /*
155: * Often up-called from a MWindowPeer instance.
156: * Calls displayChanged() on all child canvas' peers.
157: * Recurses into Container children to ensure all canvases
158: * get the message.
159: */
160: public void displayChanged(int screenNum) {
161: // Don't do super call because MWindowPeer has already updated its GC
162:
163: Component children[] = ((Container) target).getComponents();
164:
165: for (int i = 0; i < children.length; i++) {
166: recursiveDisplayChanged(children[i], screenNum);
167: }
168: }
169:
170: protected boolean shouldFocusOnClick() {
171: // Return false if this container has children so in that case it won't
172: // be focused. Return true otherwise.
173: return ((Container) target).getComponentCount() == 0;
174: }
175:
176: private native void pEnsureIndex(ComponentPeer child, int index);
177:
178: private native void pRestack();
179:
180: private int restack(Container cont, int ind) {
181: for (int i = 0; i < cont.getComponentCount(); i++) {
182: Component comp = cont.getComponent(i);
183: if (!comp.isLightweight()) {
184: if (comp.getPeer() != null) {
185: pEnsureIndex(comp.getPeer(), ind++);
186: }
187: }
188: if (comp.isLightweight() && comp instanceof Container) {
189: ind = restack((Container) comp, ind);
190: }
191: }
192: return ind;
193: }
194:
195: /**
196: * @see java.awt.peer.ContainerPeer#restack
197: */
198: public void restack() {
199: Container cont = (Container) target;
200: restack(cont, 0);
201: pRestack();
202: }
203:
204: /**
205: * @see java.awt.peer.ContainerPeer#isRestackSupported
206: */
207: public boolean isRestackSupported() {
208: return true;
209: }
210: }
|