| /* |
| * Copyright 1995-2003 Sun Microsystems, Inc. All Rights Reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Sun designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Sun in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| * CA 95054 USA or visit www.sun.com if you need additional information or |
| * have any questions. |
| */ |
| package sun.awt.motif; |
| |
| import java.awt.*; |
| import java.awt.peer.*; |
| |
| import sun.awt.SunGraphicsCallback; |
| |
| class MPanelPeer extends MCanvasPeer implements PanelPeer { |
| |
| MPanelPeer() {} |
| |
| MPanelPeer(Component target) { |
| super(target); |
| } |
| |
| MPanelPeer(Component target, Object arg) { |
| super(target, arg); |
| } |
| |
| public Insets getInsets() { |
| return new Insets(0, 0, 0, 0); |
| } |
| |
| public void paint(Graphics g) { |
| super.paint(g); |
| SunGraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). |
| runComponents(((Container)target).getComponents(), g, |
| SunGraphicsCallback.LIGHTWEIGHTS | |
| SunGraphicsCallback.HEAVYWEIGHTS); |
| } |
| public void print(Graphics g) { |
| super.print(g); |
| SunGraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). |
| runComponents(((Container)target).getComponents(), g, |
| SunGraphicsCallback.LIGHTWEIGHTS | |
| SunGraphicsCallback.HEAVYWEIGHTS); |
| } |
| |
| public void setBackground(Color c) { |
| Component comp; |
| int i; |
| |
| Container cont = (Container) target; |
| synchronized(target.getTreeLock()) { |
| int n = cont.getComponentCount(); |
| for(i=0; i < n; i++) { |
| comp = cont.getComponent(i); |
| MComponentPeer peer = (MComponentPeer) MToolkit.targetToPeer(comp); |
| if (peer != null) { |
| Color color = comp.getBackground(); |
| if (color == null || color.equals(c)) { |
| peer.setBackground(c); |
| peer.pSetBackground(c); |
| } |
| if ((comp instanceof java.awt.List) || |
| (comp instanceof java.awt.TextArea) || |
| (comp instanceof java.awt.ScrollPane)) { |
| peer.pSetScrollbarBackground(c); |
| } |
| } |
| } |
| } |
| pSetBackground(c); |
| } |
| |
| public void setForeground(Color c) { |
| Component comp; |
| int i; |
| |
| Container cont = (Container) target; |
| synchronized(target.getTreeLock()) { |
| int n = cont.getComponentCount(); |
| for(i=0; i < n; i++) { |
| comp = cont.getComponent(i); |
| MComponentPeer peer = (MComponentPeer) MToolkit.targetToPeer(comp); |
| if (peer != null) { |
| Color color = comp.getForeground(); |
| if (color == null || color.equals(c)) { |
| peer.setForeground(c); |
| peer.pSetForeground(c); |
| } |
| if ((comp instanceof java.awt.List) || |
| (comp instanceof java.awt.TextArea) || |
| (comp instanceof java.awt.ScrollPane)) { |
| peer.pSetInnerForeground(c); |
| } |
| } |
| } |
| } |
| pSetForeground(c); |
| } |
| |
| /** |
| * DEPRECATED: Replaced by getInsets(). |
| */ |
| public Insets insets() { |
| return getInsets(); |
| } |
| |
| /** |
| * Recursive method that handles the propagation of the displayChanged |
| * event into the entire hierarchy of peers. |
| * Unlike on win32, on X we don't worry about handling on-the-fly |
| * display settings changes, only windows being dragged across Xinerama |
| * screens. Thus, we only need to tell MCanvasPeers, not all |
| * MComponentPeers. |
| */ |
| private void recursiveDisplayChanged(Component c, int screenNum) { |
| if (c instanceof Container) { |
| Component children[] = ((Container)c).getComponents(); |
| for (int i = 0; i < children.length; ++i) { |
| recursiveDisplayChanged(children[i], screenNum); |
| } |
| } |
| ComponentPeer peer = c.getPeer(); |
| if (peer != null && peer instanceof MCanvasPeer) { |
| MCanvasPeer mPeer = (MCanvasPeer)peer; |
| mPeer.displayChanged(screenNum); |
| } |
| } |
| |
| /* |
| * Often up-called from a MWindowPeer instance. |
| * Calls displayChanged() on all child canvas' peers. |
| * Recurses into Container children to ensure all canvases |
| * get the message. |
| */ |
| public void displayChanged(int screenNum) { |
| // Don't do super call because MWindowPeer has already updated its GC |
| |
| Component children[] = ((Container)target).getComponents(); |
| |
| for (int i = 0; i < children.length; i++) { |
| recursiveDisplayChanged(children[i], screenNum); |
| } |
| } |
| |
| protected boolean shouldFocusOnClick() { |
| // Return false if this container has children so in that case it won't |
| // be focused. Return true otherwise. |
| return ((Container)target).getComponentCount() == 0; |
| } |
| |
| private native void pEnsureIndex(ComponentPeer child, int index); |
| private native void pRestack(); |
| |
| private int restack(Container cont, int ind) { |
| for (int i = 0; i < cont.getComponentCount(); i++) { |
| Component comp = cont.getComponent(i); |
| if (!comp.isLightweight()) { |
| if (comp.getPeer() != null) { |
| pEnsureIndex(comp.getPeer(), ind++); |
| } |
| } |
| if (comp.isLightweight() && comp instanceof Container) { |
| ind = restack((Container)comp, ind); |
| } |
| } |
| return ind; |
| } |
| |
| /** |
| * @see java.awt.peer.ContainerPeer#restack |
| */ |
| public void restack() { |
| Container cont = (Container)target; |
| restack(cont, 0); |
| pRestack(); |
| } |
| |
| /** |
| * @see java.awt.peer.ContainerPeer#isRestackSupported |
| */ |
| public boolean isRestackSupported() { |
| return true; |
| } |
| } |