12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/*
4bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Copyright (C) 1997-2010, International Business Machines Corporation and    *
6bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * others. All Rights Reserved.                                                *
7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpackage com.ibm.icu.dev.demo.holiday;
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Color;
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Dimension;
13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Font;
14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.FontMetrics;
15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Graphics;
16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Insets;
17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.awt.Panel;
18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/**
20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Various graphical borders. The border itself is a Panel so that it can
21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * contain other Components (i.e. it borders something). You use the
22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * HolidayBorderPanel like any other Panel: you set the layout that you prefer and
23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * add Components to it. Beware that a null layout does not obey the insets
24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * of the panel so if you use null layouts, adjust your measurements to
25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * handle the border by calling insets().
26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @author  Andy Clark, Taligent Inc.
28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @version 1.0
29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpublic class HolidayBorderPanel extends Panel {
31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * For serialization
33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private static final long serialVersionUID = 4669213306492461159L;
35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Constants
36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Solid border. */
38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int SOLID = 0;
39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** A raised border. */
40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int RAISED = 1;
41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** A lowered border. */
42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int LOWERED = 2;
43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** An etched in border. */
44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int IN = 3;
45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** An etched out border. */
46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int OUT = 4;
47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Left alignment. */
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int LEFT = 0;
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Center alignment. */
51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int CENTER = 1;
52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Right alignment. */
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int RIGHT = 2;
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default style (IN). */
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_STYLE = IN;
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness (10). */
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_THICKNESS = 10;
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness for solid borders (4). */
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_SOLID_THICKNESS = 4;
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness for raised borders (2). */
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_RAISED_THICKNESS = 2;
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness for lowered borders (2). */
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_LOWERED_THICKNESS = 2;
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness for etched-in borders (10). */
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_IN_THICKNESS = 10;
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default thickness for etched-out borders (10). */
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_OUT_THICKNESS = 10;
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default gap between border and contained component (5). */
70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_GAP = 5;
71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default color (black). Applies to SOLID and etched borders. */
72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static Color DEFAULT_COLOR = Color.black;
73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default font (TimesRoman,PLAIN,14). Only applies to etched borders. */
75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static Font DEFAULT_FONT = new Font("TimesRoman", Font.PLAIN, 14);
76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /** Default alignment (LEFT). Only applies to etched borders. */
77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public final static int DEFAULT_ALIGNMENT = LEFT;
78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    // Data
80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private int style;
81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private int thickness;
82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private int gap;
83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private Color color;
84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private Font font;
86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private String text;
87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private int alignment;
88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructor. Makes default border.
91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel() {
93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // initialize data
95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        style       = DEFAULT_STYLE;
96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        thickness   = DEFAULT_THICKNESS;
97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        gap         = DEFAULT_GAP;
98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        color       = DEFAULT_COLOR;
99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        text        = null;
101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        font        = DEFAULT_FONT;
102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        alignment   = DEFAULT_ALIGNMENT;
103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructor. Makes an etched IN border with given text caption.
108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param text  Text caption
110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel(String text) {
112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this();
113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        style = IN;
115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.text = text;
116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructor. Makes SOLID border with color and thickness given.
120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param color     The color for the border.
122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param thickness The thickness of the border.
123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel(Color color, int thickness) {
125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this();
126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        style = SOLID;
128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.color = color;
129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.thickness = thickness;
130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructor. Makes a border of the given style with the default
134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * thickness for that style.
135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param style The style for this border.
137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel(int style) {
139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this();
140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // set thickness appropriate to this style
142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch (style) {
143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case SOLID: thickness = DEFAULT_SOLID_THICKNESS; break;
144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case RAISED: thickness = DEFAULT_RAISED_THICKNESS; break;
145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case LOWERED: thickness = DEFAULT_LOWERED_THICKNESS; break;
146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case IN: thickness = DEFAULT_IN_THICKNESS; break;
147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case OUT: thickness = DEFAULT_OUT_THICKNESS; break;
148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            default:
149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                thickness = DEFAULT_THICKNESS;
150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.style = style;
153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Constructor. Makes border with given style and thickness.
157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param style     The style for this border.
159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param thickness The thickness for this border.
160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel(int style, int thickness) {
162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this();
163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.style = style;
165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.thickness = thickness;
166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the insets of this panel..
170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Insets getInsets() {
172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int adjustment = 0;
173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // adjust for text string
175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (style == IN || style == OUT) {
176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            if (text != null && text.length() > 0) {
177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                try {
178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // set font and get info
179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int height = getGraphics().getFontMetrics(font).getHeight();
180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (height > thickness)
181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        adjustment = height - thickness;
182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                catch (Exception e) {
184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // nothing: just in case there is no graphics context
185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    //   at the beginning.
186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    System.out.print("");
187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // return appropriate insets
192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int dist = thickness + gap;
193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return new Insets(dist + adjustment, dist, dist, dist);
194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the style of the border
198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param style The new style.
200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setStyle(int style) {
202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // set the style and re-layout the panel
204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.style = style;
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        doLayout();
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        repaint();
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the style of the border
213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getStyle() {
215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return style;
217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the thickness of the border.
221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param thickness The new thickness
223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setThickness(int thickness) {
225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (thickness > 0) {
227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            this.thickness = thickness;
228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            doLayout();
229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            repaint();
230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the thickness of the border.
237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getThickness() {
239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return thickness;
241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the gap between the border and the contained Component.
245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param gap The new gap, in pixels.
247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setGap(int gap) {
249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (gap > -1) {
251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            this.gap = gap;
252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            doLayout();
253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            repaint();
254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the gap between the border and the contained Component.
261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getGap() {
263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return gap;
265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the current color for SOLID borders and the caption text
269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * color for etched borders.
270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param color The new color.
272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setColor(Color color) {
274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.color = color;
276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (style == SOLID || style == IN || style == OUT)
277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            repaint();
278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the current color for SOLID borders and the caption
284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * text color for etched borders.
285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Color getColor() {
287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return color;
289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the font. Only applies to etched borders.
293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setTextFont(Font font) {
295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // set font
297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (font != null) {
298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            this.font = font;
299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            if (style == IN || style == OUT) {
300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                doLayout();
301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                repaint();
302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                }
303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the font of the text. Only applies to etched borders.
310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public Font getTextFont() {
312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return font;
314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the text. Only applies to etched borders.
318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param text  The new text.
320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setText(String text) {
322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.text = text;
324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (style == IN || style == OUT) {
325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            doLayout();
326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            repaint();
327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the text. Only applies to etched borders.
334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String getText() {
336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return text;
338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Sets the text alignment. Only applies to etched borders.
342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param alignment The new alignment.
344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public HolidayBorderPanel setAlignment(int alignment) {
346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.alignment = alignment;
348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (style == IN || style == OUT) {
349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            doLayout();
350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            repaint();
351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return this;
354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Gets the text alignment.
358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public int getAlignment() {
360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return alignment;
362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Repaints the border.
366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     *
367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * @param g The graphics context.
368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void paint(Graphics g) {
370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // get current dimensions
372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        Dimension size = getSize();
373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int width = size.width;
374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int height = size.height;
375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // set colors
377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        Color light = getBackground().brighter().brighter().brighter();
378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        Color dark = getBackground().darker().darker().darker();
379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // Draw border
381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch (style) {
382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case RAISED:    // 3D Border (in or out)
383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case LOWERED:
384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                Color topleft = null;
385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                Color bottomright = null;
386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // set colors
388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (style == RAISED) {
389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    topleft = light;
390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    bottomright = dark;
391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                else {
393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    topleft = dark;
394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    bottomright = light;
395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // draw border
398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setColor(topleft);
399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                for (int i = 0; i < thickness; i++) {
400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawLine(i, i, width - i - 2, i);
401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawLine(i, i + 1, i, height - i - 1);
402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setColor(bottomright);
404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                for (int i = 0; i < thickness; i++) {
405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawLine(i + 1, height - i - 1, width - i - 1, height - i - 1);
406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawLine(width - i - 1, i, width - i - 1, height - i - 2);
407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                break;
409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case IN:    // Etched Border (in or out)
411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case OUT:
412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int adjust1 = 0;
413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int adjust2 = 0;
414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // set font and get info
416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                Font oldfont = g.getFont();
417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setFont(font);
418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                FontMetrics fm = g.getFontMetrics();
419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int ascent = fm.getAscent();
420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // set adjustment
422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (style == IN)
423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjust1 = 1;
424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                else
425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    adjust2 = 1;
426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // Calculate adjustment for text
428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int adjustment = 0;
429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (text != null && text.length() > 0) {
430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (ascent > thickness)
431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        adjustment = (ascent - thickness) / 2;
432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // The adjustment is there so that we always draw the
435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // light rectangle first. Otherwise, your eye picks up
436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // the discrepancy where the light rect. passes over
437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // the darker rect.
438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int x = thickness / 2;
439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int y = thickness / 2 + adjustment;
440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int w = width - thickness - 1;
441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                int h = height - thickness - 1 - adjustment;
442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // draw rectangles
444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setColor(light);
445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.drawRect(x + adjust1, y + adjust1, w, h);
446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setColor(dark);
447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.drawRect(x + adjust2, y + adjust2, w, h);
448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                // draw text, if applicable
450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                if (text != null && text.length() > 0) {
451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // calculate drawing area
452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int fontheight = fm.getHeight();
453bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int strwidth = fm.stringWidth(text);
454bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
455bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int textwidth = width - 2 * (thickness + 5);
456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    if (strwidth > textwidth)
457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        strwidth = textwidth;
458bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
459bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // calculate offset for alignment
460bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    int offset;
461bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    switch (alignment) {
462bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        case CENTER:
463bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            offset = (width - strwidth) / 2;
464bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            break;
465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        case RIGHT:
466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            offset = width - strwidth - thickness - 5;
467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            break;
468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        case LEFT:
469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        default: // assume left alignment if invalid
470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            offset = thickness + 5;
471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                            break;
472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                        }
473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // clear drawing area and set clipping region
475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.clearRect(offset - 5, 0, strwidth  + 10, fontheight);
476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.clipRect(offset, 0, strwidth, fontheight);
477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // draw text
479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.setColor(color);
480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawString(text, offset, ascent);
481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    // restore old clipping area
483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.clipRect(0, 0, width, height);
484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    }
485bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
486bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setFont(oldfont);
487bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                break;
488bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
489bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case SOLID:
490bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            default: // assume SOLID
491bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                g.setColor(color);
492bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                for (int i = 0; i < thickness; i++)
493bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                    g.drawRect(i, i, width - 2 * i - 1, height - 2 * i - 1);
494bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
495bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
496bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
497bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
498bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    /**
499bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Returns the settings of this HolidayBorderPanel instance as a string.
500bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
501bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public String toString() {
502bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        StringBuffer str = new StringBuffer("HolidayBorderPanel[");
503bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
504bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // style
505bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("style=");
506bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch (style) {
507bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case SOLID: str.append("SOLID"); break;
508bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case RAISED: str.append("RAISED"); break;
509bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case LOWERED: str.append("LOWERED"); break;
510bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case IN: str.append("IN"); break;
511bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case OUT: str.append("OUT"); break;
512bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            default: str.append("unknown");
513bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
514bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
515bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
516bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // thickness
517bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("thickness=");
518bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(thickness);
519bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
520bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
521bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // gap
522bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("gap=");
523bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(gap);
524bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
525bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
526bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // color
527bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(color);
528bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
529bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
530bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // font
531bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(font);
532bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
533bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
534bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // text
535bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("text=");
536bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(text);
537bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append(",");
538bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
539bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // alignment
540bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("alignment=");
541bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        switch (alignment) {
542bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case LEFT: str.append("LEFT"); break;
543bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case CENTER: str.append("CENTER"); break;
544bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            case RIGHT: str.append("RIGHT"); break;
545bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            default: str.append("unknown");
546bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            }
547bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
548bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        str.append("]");
549bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
550bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        return str.toString();
551bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
552bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
553bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
554bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
555