/*
 * Copyright (c) 2002, 2008, Oracle and/or its affiliates. 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.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package javax.swing.plaf.synth;

import java.awt.*;
import java.lang.ref.WeakReference;
import java.net.*;
import javax.swing.*;
import sun.awt.AppContext;
import sun.swing.plaf.synth.Paint9Painter;

/**
 * ImagePainter fills in the specified region using an Image. The Image
 * is split into 9 segments: north, north east, east, south east, south,
 * south west, west, north west and the center. The corners are defined
 * by way of an insets, and the remaining regions are either tiled or
 * scaled to fit.
 *
 * @author Scott Violet
 */
class ImagePainter extends SynthPainter {
    private static final StringBuffer CACHE_KEY =
                               new StringBuffer("SynthCacheKey");

    private Image image;
    private Insets sInsets;
    private Insets dInsets;
    private URL path;
    private boolean tiles;
    private boolean paintCenter;
    private Paint9Painter imageCache;
    private boolean center;

    private static Paint9Painter getPaint9Painter() {
        // A SynthPainter is created per <imagePainter>.  We want the
        // cache to be shared by all, and we don't use a static because we
        // don't want it to persist between look and feels.  For that reason
        // we use a AppContext specific Paint9Painter.  It's backed via
        // a WeakRef so that it can go away if the look and feel changes.
        synchronized(CACHE_KEY) {
            WeakReference<Paint9Painter> cacheRef =
                     (WeakReference<Paint9Painter>)AppContext.getAppContext().
                     get(CACHE_KEY);
            Paint9Painter painter;
            if (cacheRef == null || (painter = cacheRef.get()) == null) {
                painter = new Paint9Painter(30);
                cacheRef = new WeakReference<Paint9Painter>(painter);
                AppContext.getAppContext().put(CACHE_KEY, cacheRef);
            }
            return painter;
        }
    }

    ImagePainter(boolean tiles, boolean paintCenter,
                 Insets sourceInsets, Insets destinationInsets, URL path,
                 boolean center) {
        if (sourceInsets != null) {
            this.sInsets = (Insets)sourceInsets.clone();
        }
        if (destinationInsets == null) {
            dInsets = sInsets;
        }
        else {
            this.dInsets = (Insets)destinationInsets.clone();
        }
        this.tiles = tiles;
        this.paintCenter = paintCenter;
        this.imageCache = getPaint9Painter();
        this.path = path;
        this.center = center;
    }

    public boolean getTiles() {
        return tiles;
    }

    public boolean getPaintsCenter() {
        return paintCenter;
    }

    public boolean getCenter() {
        return center;
    }

    public Insets getInsets(Insets insets) {
        if (insets == null) {
            return (Insets)this.dInsets.clone();
        }
        insets.left = this.dInsets.left;
        insets.right = this.dInsets.right;
        insets.top = this.dInsets.top;
        insets.bottom = this.dInsets.bottom;
        return insets;
    }

    public Image getImage() {
        if (image == null) {
            image = new ImageIcon(path, null).getImage();
        }
        return image;
    }

    private void paint(SynthContext context, Graphics g, int x, int y, int w,
                       int h) {
        Image image = getImage();
        if (Paint9Painter.validImage(image)) {
            Paint9Painter.PaintType type;
            if (getCenter()) {
                type = Paint9Painter.PaintType.CENTER;
            }
            else if (!getTiles()) {
                type = Paint9Painter.PaintType.PAINT9_STRETCH;
            }
            else {
                type = Paint9Painter.PaintType.PAINT9_TILE;
            }
            int mask = Paint9Painter.PAINT_ALL;
            if (!getCenter() && !getPaintsCenter()) {
                mask |= Paint9Painter.PAINT_CENTER;
            }
            imageCache.paint(context.getComponent(), g, x, y, w, h,
                             image, sInsets, dInsets, type,
                             mask);
        }
    }


    // SynthPainter
    public void paintArrowButtonBackground(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintArrowButtonBorder(SynthContext context,
                                       Graphics g, int x, int y,
                                       int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintArrowButtonForeground(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h,
                                           int direction) {
        paint(context, g, x, y, w, h);
    }

    // BUTTON
    public void paintButtonBackground(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintButtonBorder(SynthContext context,
                                  Graphics g, int x, int y,
                                  int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // CHECK_BOX_MENU_ITEM
    public void paintCheckBoxMenuItemBackground(SynthContext context,
                                                Graphics g, int x, int y,
                                                int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintCheckBoxMenuItemBorder(SynthContext context,
                                            Graphics g, int x, int y,
                                            int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // CHECK_BOX
    public void paintCheckBoxBackground(SynthContext context,
                                        Graphics g, int x, int y,
                                        int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintCheckBoxBorder(SynthContext context,
                                    Graphics g, int x, int y,
                                    int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // COLOR_CHOOSER
    public void paintColorChooserBackground(SynthContext context,
                                            Graphics g, int x, int y,
                                            int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintColorChooserBorder(SynthContext context,
                                        Graphics g, int x, int y,
                                        int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // COMBO_BOX
    public void paintComboBoxBackground(SynthContext context,
                                        Graphics g, int x, int y,
                                        int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintComboBoxBorder(SynthContext context,
                                        Graphics g, int x, int y,
                                        int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // DESKTOP_ICON
    public void paintDesktopIconBackground(SynthContext context,
                                        Graphics g, int x, int y,
                                        int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintDesktopIconBorder(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // DESKTOP_PANE
    public void paintDesktopPaneBackground(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintDesktopPaneBorder(SynthContext context,
                                       Graphics g, int x, int y,
                                       int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // EDITOR_PANE
    public void paintEditorPaneBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintEditorPaneBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // FILE_CHOOSER
    public void paintFileChooserBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintFileChooserBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // FORMATTED_TEXT_FIELD
    public void paintFormattedTextFieldBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintFormattedTextFieldBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // INTERNAL_FRAME_TITLE_PANE
    public void paintInternalFrameTitlePaneBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintInternalFrameTitlePaneBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // INTERNAL_FRAME
    public void paintInternalFrameBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintInternalFrameBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // LABEL
    public void paintLabelBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintLabelBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // LIST
    public void paintListBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintListBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // MENU_BAR
    public void paintMenuBarBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintMenuBarBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // MENU_ITEM
    public void paintMenuItemBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintMenuItemBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // MENU
    public void paintMenuBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintMenuBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // OPTION_PANE
    public void paintOptionPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintOptionPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // PANEL
    public void paintPanelBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintPanelBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // PANEL
    public void paintPasswordFieldBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintPasswordFieldBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // POPUP_MENU
    public void paintPopupMenuBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintPopupMenuBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // PROGRESS_BAR
    public void paintProgressBarBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintProgressBarBackground(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintProgressBarBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintProgressBarBorder(SynthContext context,
                                       Graphics g, int x, int y,
                                       int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintProgressBarForeground(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // RADIO_BUTTON_MENU_ITEM
    public void paintRadioButtonMenuItemBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintRadioButtonMenuItemBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // RADIO_BUTTON
    public void paintRadioButtonBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintRadioButtonBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // ROOT_PANE
    public void paintRootPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintRootPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // SCROLL_BAR
    public void paintScrollBarBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarBorder(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SCROLL_BAR_THUMB
    public void paintScrollBarThumbBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarThumbBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SCROLL_BAR_TRACK
    public void paintScrollBarTrackBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarTrackBackground(SynthContext context,
                                              Graphics g, int x, int y,
                                              int w, int h, int orientation) {
         paint(context, g, x, y, w, h);
     }

    public void paintScrollBarTrackBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollBarTrackBorder(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SCROLL_PANE
    public void paintScrollPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintScrollPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // SEPARATOR
    public void paintSeparatorBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSeparatorBackground(SynthContext context,
                                         Graphics g, int x, int y,
                                         int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSeparatorBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSeparatorBorder(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSeparatorForeground(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SLIDER
    public void paintSliderBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderBackground(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderBorder(SynthContext context,
                                  Graphics g, int x, int y,
                                  int w, int h, int orientation) {
         paint(context, g, x, y, w, h);
     }

    // SLIDER_THUMB
    public void paintSliderThumbBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderThumbBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SLIDER_TRACK
    public void paintSliderTrackBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderTrackBackground(SynthContext context,
                                           Graphics g, int x, int y,
                                           int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSliderTrackBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }


    public void paintSliderTrackBorder(SynthContext context,
                                       Graphics g, int x, int y,
                                       int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SPINNER
    public void paintSpinnerBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSpinnerBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // SPLIT_PANE_DIVIDER
    public void paintSplitPaneDividerBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSplitPaneDividerBackground(SynthContext context,
                                                Graphics g, int x, int y,
                                                int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSplitPaneDividerForeground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintSplitPaneDragDivider(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // SPLIT_PANE
    public void paintSplitPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintSplitPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TABBED_PANE
    public void paintTabbedPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TABBED_PANE_TAB_AREA
    public void paintTabbedPaneTabAreaBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabAreaBackground(SynthContext context,
                                                 Graphics g, int x, int y,
                                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabAreaBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabAreaBorder(SynthContext context,
                                             Graphics g, int x, int y,
                                             int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // TABBED_PANE_TAB
    public void paintTabbedPaneTabBackground(SynthContext context, Graphics g,
                                         int x, int y, int w, int h,
                                         int tabIndex) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabBackground(SynthContext context, Graphics g,
                                             int x, int y, int w, int h,
                                             int tabIndex, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabBorder(SynthContext context, Graphics g,
                                         int x, int y, int w, int h,
                                         int tabIndex) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneTabBorder(SynthContext context, Graphics g,
                                         int x, int y, int w, int h,
                                         int tabIndex, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // TABBED_PANE_CONTENT
    public void paintTabbedPaneContentBackground(SynthContext context,
                                         Graphics g, int x, int y, int w,
                                         int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTabbedPaneContentBorder(SynthContext context, Graphics g,
                                         int x, int y, int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TABLE_HEADER
    public void paintTableHeaderBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTableHeaderBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TABLE
    public void paintTableBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTableBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TEXT_AREA
    public void paintTextAreaBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTextAreaBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TEXT_PANE
    public void paintTextPaneBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTextPaneBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TEXT_FIELD
    public void paintTextFieldBackground(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTextFieldBorder(SynthContext context,
                                      Graphics g, int x, int y,
                                      int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TOGGLE_BUTTON
    public void paintToggleButtonBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToggleButtonBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TOOL_BAR
    public void paintToolBarBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarBackground(SynthContext context,
                                       Graphics g, int x, int y,
                                       int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarBorder(SynthContext context,
                                   Graphics g, int x, int y,
                                   int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // TOOL_BAR_CONTENT
    public void paintToolBarContentBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarContentBackground(SynthContext context,
                                              Graphics g, int x, int y,
                                              int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarContentBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarContentBorder(SynthContext context,
                                          Graphics g, int x, int y,
                                          int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // TOOL_DRAG_WINDOW
    public void paintToolBarDragWindowBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarDragWindowBackground(SynthContext context,
                                                 Graphics g, int x, int y,
                                                 int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarDragWindowBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolBarDragWindowBorder(SynthContext context,
                                             Graphics g, int x, int y,
                                             int w, int h, int orientation) {
        paint(context, g, x, y, w, h);
    }

    // TOOL_TIP
    public void paintToolTipBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintToolTipBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TREE
    public void paintTreeBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTreeBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // TREE_CELL
    public void paintTreeCellBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTreeCellBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintTreeCellFocus(SynthContext context,
                                   Graphics g, int x, int y,
                                   int w, int h) {
        paint(context, g, x, y, w, h);
    }

    // VIEWPORT
    public void paintViewportBackground(SynthContext context,
                                     Graphics g, int x, int y,
                                     int w, int h) {
        paint(context, g, x, y, w, h);
    }

    public void paintViewportBorder(SynthContext context,
                                 Graphics g, int x, int y,
                                 int w, int h) {
        paint(context, g, x, y, w, h);
    }
}
