/* * Copyright 2002-2007 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.X11; import java.awt.*; import java.awt.peer.*; import sun.awt.SunGraphicsCallback; public class XPanelPeer extends XCanvasPeer implements PanelPeer { XEmbeddingContainer embedder = null; //new XEmbeddingContainer(); /** * Embeds the given window into container using XEmbed protocol */ public void xembed(long window) { if (embedder != null) { embedder.add(window); } } XPanelPeer() {} XPanelPeer(XCreateWindowParams params) { super(params); } XPanelPeer(Component target) { super(target); } void postInit(XCreateWindowParams params) { super.postInit(params); if (embedder != null) { embedder.install(this); } } 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); ComponentPeer peer = comp.getPeer(); if (peer != null) { Color color = comp.getBackground(); if (color == null || color.equals(c)) { peer.setBackground(c); } } } } super.setBackground(c); } public void setForeground(Color c) { setForegroundForHierarchy((Container) target, c); } private void setForegroundForHierarchy(Container cont, Color c) { synchronized(target.getTreeLock()) { int n = cont.getComponentCount(); for(int i=0; i < n; i++) { Component comp = cont.getComponent(i); Color color = comp.getForeground(); if (color == null || color.equals(c)) { ComponentPeer cpeer = comp.getPeer(); if (cpeer != null) { cpeer.setForeground(c); } if (cpeer instanceof LightweightPeer && comp instanceof Container) { setForegroundForHierarchy((Container) comp, c); } } } } } /** * DEPRECATED: Replaced by getInsets(). */ public Insets insets() { return getInsets(); } /* * This method is called from XWindowPeer.displayChanged, when * the window this Panel is on is moved to the new screen, or * display mode is changed. * * The notification is propagated to the child Canvas components. * Top-level windows and other Panels are notified too as their * peers are subclasses of XCanvasPeer. */ public void displayChanged(int screenNum) { super.displayChanged(screenNum); displayChanged((Container)target, screenNum); } /* * Recursively iterates through all the HW and LW children * of the container and calls displayChanged() for HW peers. * Iteration through children peers only is not enough as the * displayChanged notification may not be propagated to HW * components inside LW containers, see 4452373 for details. */ private static void displayChanged(Container target, int screenNum) { Component children[] = ((Container)target).getComponents(); for (Component child : children) { ComponentPeer cpeer = child.getPeer(); if (cpeer instanceof XCanvasPeer) { ((XCanvasPeer)cpeer).displayChanged(screenNum); } else if (child instanceof Container) { displayChanged((Container)child, screenNum); } } } public void dispose() { if (embedder != null) { embedder.deinstall(); } super.dispose(); } 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; } }