jdk/src/solaris/classes/sun/awt/motif/MComponentPeer.java
changeset 1203 3e5496df0d2b
parent 1202 5a725d2f0daa
parent 1201 e87f9c042699
child 1211 b659a7cee935
--- a/jdk/src/solaris/classes/sun/awt/motif/MComponentPeer.java	Thu Sep 11 11:25:48 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1185 +0,0 @@
-/*
- * Copyright 1995-2008 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 java.awt.event.PaintEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.InputEvent;
-
-import sun.awt.*;
-import sun.awt.image.ToolkitImage;
-import sun.awt.image.SunVolatileImage;
-import java.awt.image.ImageProducer;
-import java.awt.image.ImageObserver;
-import java.awt.image.ColorModel;
-import java.awt.image.VolatileImage;
-
-import java.awt.dnd.DropTarget;
-import java.awt.dnd.peer.DropTargetPeer;
-
-import sun.java2d.SunGraphics2D;
-import sun.java2d.SurfaceData;
-
-import java.lang.reflect.Method;
-
-import java.util.logging.*;
-
-import sun.java2d.pipe.Region;
-
-
-public /* REMIND: should not be public */
-abstract class MComponentPeer implements ComponentPeer, DropTargetPeer, X11ComponentPeer {
-
-    private static final Logger log = Logger.getLogger("sun.awt.motif.MComponentPeer");
-    private static final Logger focusLog = Logger.getLogger("sun.awt.motif.focus.MComponentPeer");
-
-    Component   target;
-    long        pData;
-    long        jniGlobalRef;
-    protected X11GraphicsConfig graphicsConfig;
-    SurfaceData surfaceData;
-    int         oldWidth = -1;
-    int         oldHeight = -1;
-
-    private RepaintArea paintArea;
-
-    boolean isLayouting = false;
-    boolean paintPending = false;
-
-    protected boolean disposed = false;
-    private static int JAWT_LOCK_ERROR=0x00000001;
-    private static int JAWT_LOCK_CLIP_CHANGED=0x00000002;
-    private static int JAWT_LOCK_BOUNDS_CHANGED=0x00000004;
-    private static int JAWT_LOCK_SURFACE_CHANGED=0x00000008;
-    private int drawState = JAWT_LOCK_CLIP_CHANGED |
-    JAWT_LOCK_BOUNDS_CHANGED |
-    JAWT_LOCK_SURFACE_CHANGED;
-
-    /* These are the enumerated types in awt_p.h*/
-    static final int MOTIF_NA = 0 ;
-    static final int MOTIF_V1 = 1 ;
-    static final int MOTIF_V2 = 2 ;
-
-    private Font font;
-    private long backBuffer = 0;
-    private VolatileImage xBackBuffer = null;
-
-    static {
-        initIDs();
-    }
-
-    /* initialize the fieldIDs of fields that may be accessed from C */
-    private native static void initIDs();
-
-
-    /* This will return the last state of a window. ie the specific
-     * "gotcha" is that if you iconify a window its obscurity remains
-     * unchanged. Current use of this is just in user-initiated scrolling.
-     * If that use expands to more cases you may need to "and" this with
-     * the value of the iconic state of a Frame.
-     * Note that de-iconifying an X11 window DOES generate a new event
-     * correctly notifying you of the new visibility of the window
-     */
-    public boolean isObscured() {
-
-        Container container  = (target instanceof Container) ?
-            (Container)target : target.getParent();
-
-        if (container == null) {
-            return true;
-        }
-
-        Container parent;
-        while ((parent = container.getParent()) != null) {
-            container = parent;
-        }
-
-        if (container instanceof Window) {
-            MWindowPeer wpeer = (MWindowPeer)(container.getPeer());
-            if (wpeer != null) {
-                return (wpeer.winAttr.visibilityState !=
-                        MWindowAttributes.AWT_UNOBSCURED);
-            }
-        }
-        return true;
-    }
-
-    public boolean canDetermineObscurity() {
-        return true;
-    }
-
-    abstract void create(MComponentPeer parent);
-    void create(MComponentPeer parent, Object arg) {
-        create(parent);
-    }
-
-    void EFcreate(MComponentPeer parent, int x){}
-
-    native void pInitialize();
-    native void pShow();
-    native void pHide();
-    native void pEnable();
-    native void pDisable();
-    native void pReshape(int x, int y, int width, int height);
-    native void pDispose();
-    native void pMakeCursorVisible();
-    native Point pGetLocationOnScreen();
-    native Point pGetLocationOnScreen2(Window win, MWindowPeer wpeer);
-    native void pSetForeground(Color c);
-    native void pSetBackground(Color c);
-    private native void pSetFont(Font f);
-
-    //Added for bug 4175560
-    //Returns the native representation for the Color argument,
-    //using the given GraphicsConfiguration.
-    native int getNativeColor(Color clr, GraphicsConfiguration gc);
-
-    // Returns the parent of the component, without invoking client
-    // code. This must go through native code, because it invokes
-    // private methods in the java.awt package, which we cannot
-    // do from this package.
-    static native Container getParent_NoClientCode(Component component);
-
-    // Returns the parent of the component, without invoking client
-    // code. This must go through native code, because it invokes
-    // private methods in the java.awt package, which we cannot
-    // do from this package.
-    static native Component[] getComponents_NoClientCode(Container container);
-
-    void initialize() {
-        if (!target.isVisible()) {
-            hide();
-        }
-        Color c;
-        Font  f;
-        Cursor cursor;
-
-        pInitialize();
-
-        if ((c = target.getForeground()) != null) {
-            setForeground(c);
-        }
-        if ((c = target.getBackground()) != null) {
-            setBackground(c);
-        }
-        if ((f = target.getFont()) != null) {
-            setFont(f);
-        }
-        pSetCursor(target.getCursor());
-        if (!target.isEnabled()) {
-            disable();
-        }
-        Rectangle r = target.getBounds();
-        reshape(r.x, r.y, r.width, r.height);
-        if (target.isVisible()) {
-            show();
-        }
-
-        surfaceData = graphicsConfig.createSurfaceData(this);
-    }
-
-    public void init(Component target, Object arg) {
-        this.target = target;
-        this.paintArea = new RepaintArea();
-
-        Container parent = MToolkit.getNativeContainer(target);
-        MComponentPeer parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent);
-        create(parentPeer, arg);
-
-        initialize();
-    }
-
-    MComponentPeer(Component target, Object arg) {
-        init(target, arg);
-    }
-
-    MComponentPeer() {}
-
-    public void init(Component target) {
-        this.target = target;
-        this.paintArea = new RepaintArea();
-
-        Container parent = MToolkit.getNativeContainer(target);
-        MComponentPeer parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent);
-        create(parentPeer);
-
-        if (parent != null && parent instanceof ScrollPane) {
-            MScrollPanePeer speer = (MScrollPanePeer) parentPeer;
-            speer.setScrollChild(this);
-        }
-        initialize();
-    }
-
-    MComponentPeer(Component target) {
-        init(target);
-    }
-
-    protected void finalize() throws Throwable {
-        dispose();
-        super.finalize();
-    }
-
-    public void setForeground(Color c) {
-        pSetForeground(c);
-    }
-
-    public void setBackground(Color c) {
-        pSetBackground(c);
-    }
-
-    public void updateCursorImmediately() {
-        MGlobalCursorManager.getCursorManager().updateCursorImmediately();
-    }
-
-    public void setFont(Font f) {
-        ComponentPeer peer;
-        if (f == null) {
-            f = defaultFont;
-        }
-        pSetFont(f);
-        if ( target instanceof Container ) {
-            Container container = (Container) target;
-            int count = container.getComponentCount();
-            Component[] children = container.getComponents();
-            for (int i=0; i<count; i++) {
-                if ( children[i] != null ) {
-/*
-** note: recursion in the widget in pSetFont() has by now broken any
-**       children with different Fonts - so fix now:
-*/
-                    peer = children[i].getPeer();
-                    if (peer != null) {
-                        Font rightFont = children[i].getFont();
-                        if (!f.equals(rightFont)) {
-                            peer.setFont(rightFont);
-                        } else
-                            if (children[i] instanceof Container) {
-                                peer.setFont(f);
-                            }
-                    }
-                }
-            }
-        }
-
-        /*
-         * Keep a reference to the java.awt.Font object in order to
-         * preserve the XFontStructs which underlying widgets are using.
-         * Save this AFTER changing the widgets in order to keep the
-         * previous reference (if any) alive.
-         */
-        font = f;
-    }
-
-
-    public native void setTargetBackground(Color c);
-    public native void pSetCursor(Cursor c);
-    public native void pSetScrollbarBackground(Color c);
-    public native void pSetInnerForeground(Color c);
-
-    public boolean isFocusable() {
-        return false;
-    }
-
-    public SurfaceData getSurfaceData() {
-        return surfaceData;
-    }
-
-    public ColorModel getColorModel() {
-        return graphicsConfig.getColorModel();
-    }
-
-    public ColorModel getColorModel(int transparency) {
-        return graphicsConfig.getColorModel(transparency);
-    }
-
-    public int updatePriority() {
-        return Thread.NORM_PRIORITY;
-    }
-
-    public void repaint(long tm, int x, int y, int width, int height) {
-    }
-
-    public void paint(Graphics g) {
-        Dimension d = target.getSize();
-        if (g instanceof Graphics2D ||
-            g instanceof sun.awt.Graphics2Delegate) {
-            // background color is setup correctly, so just use clearRect
-            g.clearRect(0, 0, d.width, d.height);
-        } else {
-            // emulate clearRect
-            g.setColor(target.getBackground());
-            g.fillRect(0, 0, d.width, d.height);
-            g.setColor(target.getForeground());
-        }
-
-        target.paint(g);
-    }
-    public void print(Graphics g) {
-        Dimension d = target.getSize();
-        if (g instanceof Graphics2D ||
-            g instanceof sun.awt.Graphics2Delegate) {
-            // background color is setup correctly, so just use clearRect
-            g.clearRect(0, 0, d.width, d.height);
-        } else {
-            // emulate clearRect
-            g.setColor(target.getBackground());
-            g.fillRect(0, 0, d.width, d.height);
-            g.setColor(target.getForeground());
-        }
-
-        target.print(g);
-    }
-
-    public void coalescePaintEvent(PaintEvent e) {
-        Rectangle r = e.getUpdateRect();
-        paintArea.add(r, e.getID());
-
-        if (log.isLoggable(Level.FINEST)) {
-            switch(e.getID()) {
-              case PaintEvent.UPDATE:
-                  log.log(Level.FINEST, "coalescePaintEvent: UPDATE: add: x = " +
-                          r.x + ", y = " + r.y + ", width = " + r.width + ", height = " + r.height);
-                  return;
-              case PaintEvent.PAINT:
-                  log.log(Level.FINEST, "coalescePaintEvent: PAINT: add: x = " +
-                          r.x + ", y = " + r.y + ", width = " + r.width + ", height = " + r.height);
-                  return;
-            }
-        }
-    }
-
-    native void nativeHandleEvent(AWTEvent e);
-
-    /**
-     * Returns whether or not this component should be given focus on mouse click.
-     * Default implementation return whether or not this peer is "focusable"
-     * Descendants might want to override it to extend/restrict conditions at which this
-     * component should be focused by click (see MCanvasPeer and MPanelPeer)
-     */
-    protected boolean shouldFocusOnClick() {
-        return isFocusable();
-    }
-
-    /**
-     * Checks whether or not this component would be focused by native system if it would be allowed to do so.
-     * Currently it checks that it displayable, visible, enabled and focusable.
-     */
-    static boolean canBeFocusedByClick(Component component) {
-        if (component == null) {
-            return false;
-        } else {
-            return component.isDisplayable() && component.isVisible() && component.isEnabled() && component.isFocusable();
-        }
-    }
-
-    static Method requestFocusWithCause;
-
-    static void callRequestFocusInWindow(Component target, CausedFocusEvent.Cause cause) {
-        if (requestFocusWithCause == null) {
-            requestFocusWithCause = SunToolkit.getMethod(Component.class, "requestFocusInWindow", new Class[] {CausedFocusEvent.Cause.class});
-        }
-        if (requestFocusWithCause != null) {
-            try {
-                requestFocusWithCause.invoke(target, new Object[] {cause});
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public void handleEvent(AWTEvent e) {
-        int id = e.getID();
-
-        switch(id) {
-          case PaintEvent.PAINT:
-              // Got native painting
-              paintPending = false;
-              // Fallthrough to next statement
-          case PaintEvent.UPDATE:
-              // Skip all painting while layouting and all UPDATEs
-              // while waiting for native paint
-              if (!isLayouting && !paintPending) {
-                  paintArea.paint(target,false);
-              }
-              return;
-          case MouseEvent.MOUSE_PRESSED:
-              if (target == e.getSource() && !((InputEvent)e).isConsumed() && shouldFocusOnClick()
-                  && !target.isFocusOwner() && canBeFocusedByClick(target))
-              {
-                  callRequestFocusInWindow(target, CausedFocusEvent.Cause.MOUSE_EVENT);
-              }
-              break;
-          default:
-              break;
-        }
-
-        // Call the native code
-        nativeHandleEvent(e);
-    }
-
-    /* New API for 1.1 */
-    public Dimension getMinimumSize() {
-        return target.getSize();
-    }
-
-    /* New API for 1.1 */
-    public Dimension getPreferredSize() {
-        return getMinimumSize();
-    }
-
-    // Do nothing for heavyweight implementation
-    public void layout() {}
-
-    public Rectangle getBounds() {
-        return ((Component)target).getBounds();
-    }
-
-    public Object getTarget() {
-        return target;
-    }
-
-    public java.awt.Toolkit getToolkit() {
-        // XXX: bogus
-        return Toolkit.getDefaultToolkit();
-    }
-
-    // fallback default font object
-    final static Font defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12);
-
-    public synchronized Graphics getGraphics() {
-        if (!disposed) {
-            Component target = (Component) this.target;
-
-            /* Fix for bug 4746122. Color and Font shouldn't be null */
-            Color bgColor = target.getBackground();
-            if (bgColor == null) {
-                bgColor = SystemColor.window;
-            }
-            Color fgColor = target.getForeground();
-            if (fgColor == null) {
-                fgColor = SystemColor.windowText;
-            }
-            Font font = target.getFont();
-            if (font == null) {
-                font = defaultFont;
-            }
-            return new SunGraphics2D(surfaceData, fgColor, bgColor, font);
-        }
-
-        return null;
-    }
-
-    public Image createImage(ImageProducer producer) {
-        return new ToolkitImage(producer);
-    }
-
-    public Image createImage(int width, int height) {
-        return graphicsConfig.createAcceleratedImage(target, width, height);
-    }
-
-    public VolatileImage createVolatileImage(int width, int height) {
-        return new SunVolatileImage(target, width, height);
-    }
-
-    public boolean prepareImage(Image img, int w, int h, ImageObserver o) {
-        return getToolkit().prepareImage(img, w, h, o);
-    }
-
-    public int checkImage(Image img, int w, int h, ImageObserver o) {
-        return getToolkit().checkImage(img, w, h, o);
-    }
-
-    public FontMetrics getFontMetrics(Font font) {
-        return X11FontMetrics.getFontMetrics(font);
-    }
-
-    /*
-     * Subclasses should override disposeImpl() instead of dispose(). Client
-     * code should always invoke dispose(), never disposeImpl().
-     */
-    protected void disposeImpl() {
-        SurfaceData oldData = surfaceData;
-        surfaceData = null;
-        oldData.invalidate();
-        MToolkit.targetDisposedPeer(target, this);
-        pDispose();
-    }
-    public final void dispose() {
-        boolean call_disposeImpl = false;
-
-        if (!disposed) {
-            synchronized (this) {
-                SunToolkit.awtLock();
-                try {
-                    if (!disposed) {
-                        disposed = call_disposeImpl = true;
-                    }
-                } finally {
-                    SunToolkit.awtUnlock();
-                }
-            }
-        }
-
-        if (call_disposeImpl) {
-            disposeImpl();
-        }
-    }
-
-    native static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant,
-                                                                boolean temporary, boolean focusedWindowChangeAllowed,
-                                                                long time);
-    public boolean requestFocus
-    (Component lightweightChild, boolean temporary,
-         boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) {
-        if (processSynchronousLightweightTransfer((Component)target, lightweightChild, temporary,
-                                                  focusedWindowChangeAllowed, time)) {
-            return true;
-        } else {
-            if (focusLog.isLoggable(Level.FINER)) {
-                focusLog.log(Level.FINER, "Current native focused window " + getNativeFocusedWindow());
-            }
-            /**
-             * The problems with requests in non-focused window arise because shouldNativelyFocusHeavyweight
-             * checks that native window is focused while appropriate WINDOW_GAINED_FOCUS has not yet
-             * been processed - it is in EventQueue. Thus, SNFH allows native request and stores request record
-             * in requests list - and it breaks our requests sequence as first record on WGF should be the last focus
-             * owner which had focus before WLF. So, we should not add request record for such requests
-             * but store this component in mostRecent - and return true as before for compatibility.
-             */
-            Container parent = (target instanceof Container) ? ((Container)target) : (target.getParent());
-            // Search for parent window
-            while (parent != null && !(parent instanceof Window)) {
-                parent = getParent_NoClientCode(parent);
-            }
-            if (parent != null) {
-                Window parentWindow = (Window)parent;
-                // and check that it is focused
-                if (focusLog.isLoggable(Level.FINER)) {
-                    focusLog.log(Level.FINER, "Parent window " + parentWindow);
-                }
-                if (!parentWindow.isFocused() && getNativeFocusedWindow() == parentWindow) {
-                    // if it is not - skip requesting focus on Solaris
-                    // but return true for compatibility.
-                    return true;
-                } else if (getNativeFocusedWindow() != parentWindow) {
-                    WindowPeer wpeer = (WindowPeer)parentWindow.getPeer();
-                    boolean res = wpeer.requestWindowFocus();
-                    if (focusLog.isLoggable(Level.FINER)) {
-                        focusLog.log(Level.FINER, "Requested window focus: " + res);
-                    }
-                    // If parent window can be made focused and has been made focused(synchronously)
-                    // then we can proceed with children, otherwise we retreat.
-                    if (!(res && parentWindow.isFocused())) {
-                        focusLog.finer("Waiting for asynchronous processing of window focus request");
-                        KeyboardFocusManagerPeerImpl.removeLastFocusRequest(target);
-                        return false;
-                    }
-                }
-            }
-            return _requestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time, cause);
-        }
-    }
-
-    native boolean _requestFocus
-        (Component lightweightChild, boolean temporary,
-         boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause);
-
-    static native Window getNativeFocusedWindow();
-
-    /*
-     * Post an event to the event queue.
-     */
-    // NOTE: This method may be called by privileged threads.
-    //       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
-    void postEvent(AWTEvent event) {
-        MToolkit.postEvent(MToolkit.targetToAppContext(target), event);
-    }
-
-    /* Callbacks for window-system events to the frame
-     *
-     * NOTE: This method may be called by privileged threads.
-     *       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
-     */
-    void handleExpose(int x, int y, int w, int h) {
-        if ( !ComponentAccessor.getIgnoreRepaint(target) ) {
-            postEvent(new PaintEvent(target, PaintEvent.PAINT,
-                                     new Rectangle(x, y, w, h)));
-        }
-    }
-
-    /* Callbacks for window-system events to the frame
-     *
-     * NOTE: This method may be called by privileged threads.
-     *       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
-     */
-    void handleRepaint(int x, int y, int w, int h) {
-        if ( !ComponentAccessor.getIgnoreRepaint(target) ) {
-            postEvent(new PaintEvent(target, PaintEvent.UPDATE,
-                                     new Rectangle(x, y, w, h)));
-        }
-    }
-
-    /* Return the component's z-order position relative to
-     * other peer'd siblings (don't count lightweight siblings
-     * or siblings who don't yet have valid peers).
-     *
-     * NOTE: This method may be called by privileged threads.
-     *       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
-     */
-    public int getZOrderPosition_NoClientCode() {
-        // SECURITY: use _NoClientCode() methods, because we may
-        //           be running on a privileged thread
-        Container p = getParent_NoClientCode(target);
-        if (p != null) {
-            // SECURITY: use _NoClientCode() methods, because we may
-            //           be running on a privileged thread
-            Component children[] = getComponents_NoClientCode(p);
-            int i;
-            int index = 0;
-            for (i = 0; i < children.length; i++) {
-                if (children[i] == target) {
-                    return index;
-                } else {
-                    Object cpeer = MToolkit.targetToPeer(children[i]);
-                    if (cpeer != null &&
-                        !(cpeer instanceof java.awt.peer.LightweightPeer)) {
-                        index++;
-                    }
-                }
-            }
-        }
-        return -1;
-    }
-
-    /*
-     * drawXXX() methods are used to print the native components by
-     * rendering the Motif look ourselves.
-     * ToDo(aim): needs to query native motif for more accurate color
-     * information.
-     */
-    void draw3DOval(Graphics g, Color bg,
-                    int x, int y, int w, int h, boolean raised) {
-        Color c = g.getColor();
-        Color shadow = bg.darker();
-        Color highlight = bg.brighter();
-
-        g.setColor(raised ? highlight : shadow);
-        g.drawArc(x, y, w, h, 45, 180);
-        g.setColor(raised ? shadow : highlight);
-        g.drawArc(x, y, w, h, 225, 180);
-        g.setColor(c);
-    }
-    void draw3DRect(Graphics g, Color bg,
-                    int x, int y, int width, int height,
-                    boolean raised) {
-        Color c = g.getColor();
-        Color shadow = bg.darker();
-        Color highlight = bg.brighter();
-
-        g.setColor(raised ? highlight : shadow);
-        g.drawLine(x, y, x, y + height);
-        g.drawLine(x + 1, y, x + width - 1, y);
-        g.setColor(raised ? shadow : highlight);
-        g.drawLine(x + 1, y + height, x + width, y + height);
-        g.drawLine(x + width, y, x + width, y + height - 1);
-        g.setColor(c);
-    }
-    void drawScrollbar(Graphics g, Color bg, int thickness, int length,
-                       int min, int max, int val, int vis, boolean horizontal) {
-        Color c = g.getColor();
-        double f = (double)(length - 2*(thickness-1)) / Math.max(1, ((max - min) + vis));
-        int v1 = thickness + (int)(f * (val - min));
-        int v2 = (int)(f * vis);
-        int w2 = thickness-4;
-        int tpts_x[] = new int[3];
-        int tpts_y[] = new int[3];
-
-        if (length < 3*w2 ) {
-            v1 = v2 = 0;
-            if (length < 2*w2 + 2) {
-                w2 = (length-2)/2;
-            }
-        } else  if (v2 < 7) {
-            // enforce a minimum handle size
-            v1 = Math.max(0, v1 - ((7 - v2)>>1));
-            v2 = 7;
-        }
-
-        int ctr   = thickness/2;
-        int sbmin = ctr - w2/2;
-        int sbmax = ctr + w2/2;
-
-        // paint the background slightly darker
-        {
-            Color d = new Color((int) (bg.getRed()   * 0.85),
-                                (int) (bg.getGreen() * 0.85),
-                                (int) (bg.getBlue()  * 0.85));
-
-            g.setColor(d);
-            if (horizontal) {
-                g.fillRect(0, 0, length, thickness);
-            } else {
-                g.fillRect(0, 0, thickness, length);
-            }
-        }
-
-        // paint the thumb and arrows in the normal background color
-        g.setColor(bg);
-        if (v1 > 0) {
-            if (horizontal) {
-                g.fillRect(v1, 3, v2, thickness-3);
-            } else {
-                g.fillRect(3, v1, thickness-3, v2);
-            }
-        }
-
-        tpts_x[0] = ctr;        tpts_y[0] = 2;
-        tpts_x[1] = sbmin;      tpts_y[1] = w2;
-        tpts_x[2] = sbmax;      tpts_y[2] = w2;
-        if (horizontal) {
-            g.fillPolygon(tpts_y, tpts_x, 3);
-        } else {
-            g.fillPolygon(tpts_x, tpts_y, 3);
-        }
-
-        tpts_y[0] = length-2;
-        tpts_y[1] = length-w2;
-        tpts_y[2] = length-w2;
-        if (horizontal) {
-            g.fillPolygon(tpts_y, tpts_x, 3);
-        } else {
-            g.fillPolygon(tpts_x, tpts_y, 3);
-        }
-
-        Color highlight = bg.brighter();
-
-        // // // // draw the "highlighted" edges
-        g.setColor(highlight);
-
-        // outline & arrows
-        if (horizontal) {
-            g.drawLine(1, thickness, length - 1, thickness);
-            g.drawLine(length - 1, 1, length - 1, thickness);
-
-            // arrows
-            g.drawLine(1, ctr, w2, sbmin);
-            g.drawLine(length - w2, sbmin, length - w2, sbmax);
-            g.drawLine(length - w2, sbmin, length - 2, ctr);
-
-        } else {
-            g.drawLine(thickness, 1, thickness, length - 1);
-            g.drawLine(1, length - 1, thickness, length - 1);
-
-            // arrows
-            g.drawLine(ctr, 1, sbmin, w2);
-            g.drawLine(sbmin, length - w2, sbmax, length - w2);
-            g.drawLine(sbmin, length - w2, ctr, length - 2);
-        }
-
-        // thumb
-        if (v1 > 0) {
-            if (horizontal) {
-                g.drawLine(v1, 2, v1 + v2, 2);
-                g.drawLine(v1, 2, v1, thickness-3);
-            } else {
-                g.drawLine(2, v1, 2, v1 + v2);
-                g.drawLine(2, v1, thickness-3, v1);
-            }
-        }
-
-        Color shadow = bg.darker();
-
-        // // // // draw the "shadowed" edges
-        g.setColor(shadow);
-
-        // outline && arrows
-        if (horizontal) {
-            g.drawLine(0, 0, 0, thickness);
-            g.drawLine(0, 0, length - 1, 0);
-
-            // arrows
-            g.drawLine(w2, sbmin, w2, sbmax);
-            g.drawLine(w2, sbmax, 1, ctr);
-            g.drawLine(length-2, ctr, length-w2, sbmax);
-
-        } else {
-            g.drawLine(0, 0, thickness, 0);
-            g.drawLine(0, 0, 0, length - 1);
-
-            // arrows
-            g.drawLine(sbmin, w2, sbmax, w2);
-            g.drawLine(sbmax, w2, ctr, 1);
-            g.drawLine(ctr, length-2, sbmax, length-w2);
-        }
-
-        // thumb
-        if (v1 > 0) {
-            if (horizontal) {
-                g.drawLine(v1 + v2, 2, v1 + v2, thickness-2);
-                g.drawLine(v1, thickness-2, v1 + v2, thickness-2);
-            } else {
-                g.drawLine(2, v1 + v2, thickness-2, v1 + v2);
-                g.drawLine(thickness-2, v1, thickness-2, v1 + v2);
-            }
-        }
-        g.setColor(c);
-    }
-
-    public String toString() {
-        return getClass().getName() + "[" + target + "]";
-    }
-
-    /* New 1.1 API */
-    public void setVisible(boolean b) {
-        if (b) {
-            Dimension s = target.getSize();
-            oldWidth = s.width;
-            oldHeight = s.height;
-            pShow();
-        } else {
-            pHide();
-        }
-    }
-
-    /* New 1.1 API */
-    public void setEnabled(boolean b) {
-        if (b) {
-            pEnable();
-        } else {
-            pDisable();
-        }
-    }
-
-    /* New 1.1 API */
-    public Point getLocationOnScreen() {
-        synchronized (target.getTreeLock()) {
-            Component comp = target;
-            while (comp != null && !(comp instanceof Window)) {
-                comp = getParent_NoClientCode(comp);
-            }
-
-            // applets, embedded, etc - translate directly
-            if (comp == null || comp instanceof sun.awt.EmbeddedFrame) {
-                return pGetLocationOnScreen();
-            }
-
-            MWindowPeer wpeer = (MWindowPeer)(MToolkit.targetToPeer(comp));
-            if (wpeer == null) {
-                return pGetLocationOnScreen();
-            }
-            return pGetLocationOnScreen2((Window)comp, wpeer);
-        }
-    }
-
-    public int serialNum = 0;
-
-    /* Returns the native paint should be posted after setting new size
-     */
-    public boolean checkNativePaintOnSetBounds(int width, int height) {
-        return (width != oldWidth) || (height != oldHeight);
-    }
-
-    void setBounds(int x, int y, int width, int height) {
-        setBounds(x, y, width, height, SET_BOUNDS);
-    }
-
-    /* New 1.1 API */
-    public void setBounds(int x, int y, int width, int height, int op) {
-        if (disposed) return;
-
-        Container parent = getParent_NoClientCode(target);
-
-        // Should set paintPending before reshape to prevent
-        // thread race between PaintEvent and setBounds
-        // This part of the 4267393 fix proved to be unstable under solaris,
-        // dissabled due to regressions 4418155, 4486762, 4490079
-        paintPending = false; //checkNativePaintOnSetBounds(width, height);
-
-        // Note: it would be ideal to NOT execute this if it's
-        // merely a Move which is occurring.
-        if (parent != null && parent instanceof ScrollPane) {
-            MScrollPanePeer speer = (MScrollPanePeer)parent.getPeer();
-            if (!speer.ignore) {
-                pReshape(x, y, width, height);
-                speer.childResized(width, height);
-            }
-        } else {
-            pReshape(x, y, width, height);
-        }
-
-        if ((width != oldWidth) || (height != oldHeight)) {
-            SurfaceData oldData = surfaceData;
-            if (oldData != null) {
-                surfaceData = graphicsConfig.createSurfaceData(this);
-                oldData.invalidate();
-            }
-            oldWidth = width;
-            oldHeight = height;
-        }
-        validateSurface(width, height);
-        serialNum++;
-    }
-
-    void validateSurface(int width, int height) {
-        SunToolkit.awtLock();
-        try {
-            if (!disposed && (width != oldWidth || height != oldHeight)) {
-                SurfaceData oldData = surfaceData;
-                if (oldData != null) {
-                    surfaceData = graphicsConfig.createSurfaceData(this);
-                    oldData.invalidate();
-                }
-                oldWidth = width;
-                oldHeight = height;
-            }
-        } finally {
-            SunToolkit.awtUnlock();
-        }
-    }
-
-    public void beginValidate() {
-    }
-
-    native void restoreFocus();
-
-    public void endValidate() {
-        restoreFocus();
-    }
-
-    public void beginLayout() {
-        // Skip all painting till endLayout
-        isLayouting = true;
-    }
-
-    public void endLayout() {
-        if (!paintPending && !paintArea.isEmpty() &&
-            !((Component)target).getIgnoreRepaint()) {
-            // if not waiting for native painting repaint damaged area
-            postEvent(new PaintEvent((Component)target, PaintEvent.PAINT,
-                                     new Rectangle()));
-        }
-        isLayouting = false;
-    }
-
-    /**
-     * DEPRECATED:  Replaced by setVisible(boolean).
-     */
-    public void show() {
-        setVisible(true);
-    }
-
-    /**
-     * DEPRECATED:  Replaced by setVisible(boolean).
-     */
-    public void hide() {
-        setVisible(false);
-    }
-
-    /**
-     * DEPRECATED:  Replaced by setEnabled(boolean).
-     */
-    public void enable() {
-        setEnabled(true);
-    }
-
-    /**
-     * DEPRECATED:  Replaced by setEnabled(boolean).
-     */
-    public void disable() {
-        setEnabled(false);
-    }
-
-    /**
-     * DEPRECATED:  Replaced by setBounds(int, int, int, int).
-     */
-    public void reshape(int x, int y, int width, int height) {
-        setBounds(x, y, width, height);
-    }
-
-    /**
-     * DEPRECATED:  Replaced by getMinimumSize().
-     */
-    public Dimension minimumSize() {
-        return getMinimumSize();
-    }
-
-    /**
-     * DEPRECATED:  Replaced by getPreferredSize().
-     */
-    public Dimension preferredSize() {
-        return getPreferredSize();
-    }
-
-    /**
-     *
-     */
-
-    public void addDropTarget(DropTarget dt) {
-        if (MToolkit.useMotifDnD()) {
-            addNativeDropTarget(dt);
-        } else {
-            Component comp = target;
-            while(!(comp == null || comp instanceof java.awt.Window)) {
-                comp = getParent_NoClientCode(comp);
-            }
-
-            if (comp instanceof Window) {
-                MWindowPeer wpeer = (MWindowPeer)(comp.getPeer());
-                if (wpeer != null) {
-                    wpeer.addDropTarget();
-                }
-            }
-        }
-    }
-
-    /**
-     *
-     */
-
-    public void removeDropTarget(DropTarget dt) {
-        if (MToolkit.useMotifDnD()) {
-            removeNativeDropTarget(dt);
-        } else {
-            Component comp = target;
-            while(!(comp == null || comp instanceof java.awt.Window)) {
-                comp = getParent_NoClientCode(comp);
-            }
-
-            if (comp instanceof Window) {
-                MWindowPeer wpeer = (MWindowPeer)(comp.getPeer());
-                if (wpeer != null) {
-                    wpeer.removeDropTarget();
-                }
-            }
-        }
-    }
-
-    public void notifyTextComponentChange(boolean add){
-        Container parent = getParent_NoClientCode(target);
-        while(!(parent == null ||
-                parent instanceof java.awt.Frame ||
-                parent instanceof java.awt.Dialog)) {
-            parent = getParent_NoClientCode(parent);
-        }
-
-        if (parent instanceof java.awt.Frame ||
-            parent instanceof java.awt.Dialog) {
-            if (add)
-                ((MInputMethodControl)parent.getPeer()).addTextComponent((MComponentPeer)this);
-            else
-                ((MInputMethodControl)parent.getPeer()).removeTextComponent((MComponentPeer)this);
-        }
-    }
-
-    native void addNativeDropTarget(DropTarget dt);
-
-    native void removeNativeDropTarget(DropTarget dt);
-
-    public GraphicsConfiguration getGraphicsConfiguration() {
-        GraphicsConfiguration ret = graphicsConfig;
-        if (ret == null) {
-            ret = target.getGraphicsConfiguration();
-        }
-        return ret;
-    }
-
-    // Returns true if we are inside begin/endLayout and
-    // are waiting for native painting
-    public boolean isPaintPending() {
-        return paintPending && isLayouting;
-    }
-
-    public boolean handlesWheelScrolling() {
-        return false;
-    }
-
-    /**
-     * The following multibuffering-related methods delegate to our
-     * associated GraphicsConfig (X11 or GLX) to handle the appropriate
-     * native windowing system specific actions.
-     */
-
-    private native long getWindow(long pData);
-
-    public long getContentWindow() {
-        return getWindow(pData);
-    }
-
-    public void createBuffers(int numBuffers, BufferCapabilities caps)
-      throws AWTException
-    {
-        backBuffer = graphicsConfig.createBackBuffer(this, numBuffers, caps);
-        xBackBuffer = graphicsConfig.createBackBufferImage(target,
-                                                           backBuffer);
-    }
-
-    public void flip(int x1, int y1, int x2, int y2,
-                     BufferCapabilities.FlipContents flipAction)
-    {
-        if (backBuffer == 0) {
-            throw new IllegalStateException("Buffers have not been created");
-        }
-        graphicsConfig.flip(this, target, xBackBuffer,
-                            x1, y1, x2, y2, flipAction);
-    }
-
-    public Image getBackBuffer() {
-        if (backBuffer == 0) {
-            throw new IllegalStateException("Buffers have not been created");
-        }
-        return xBackBuffer;
-    }
-
-    public void destroyBuffers() {
-        graphicsConfig.destroyBackBuffer(backBuffer);
-        backBuffer = 0;
-        xBackBuffer = null;
-    }
-
-    /**
-     * @see java.awt.peer.ComponentPeer#isReparentSupported
-     */
-    public boolean isReparentSupported() {
-        return false;
-    }
-
-    /**
-     * @see java.awt.peer.ComponentPeer#reparent
-     */
-    public void reparent(ContainerPeer newNativeParent) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Applies the shape to the native component window.
-     * @since 1.7
-     */
-    public void applyShape(Region shape) {
-    }
-
-}