1 /*      _______   __   __   __   ______   __   __   _______   __   __
2  *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
3  *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
4  *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
5  *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
6  * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
7  * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
8  *
9  * Copyright (c) 2004 - 2008 Olof Naess�n and Per Larsson
10  *
11  *
12  * Per Larsson a.k.a finalman
13  * Olof Naess�n a.k.a jansem/yakslem
14  *
15  * Visit: http://guichan.sourceforge.net
16  *
17  * License: (BSD)
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions
20  * are met:
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in
25  *    the documentation and/or other materials provided with the
26  *    distribution.
27  * 3. Neither the name of Guichan nor the names of its contributors may
28  *    be used to endorse or promote products derived from this software
29  *    without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
37  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
38  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  */
43 
44 /*
45  * For comments regarding functions please see the header file.
46  */
47 
48 #include "guichan/widgets/tab.hpp"
49 
50 #include "guichan/font.hpp"
51 #include "guichan/graphics.hpp"
52 #include "guichan/widgets/button.hpp"
53 #include "guichan/widgets/label.hpp"
54 #include "guichan/widgets/tabbedarea.hpp"
55 
56 namespace gcn
57 {
Tab()58     Tab::Tab()
59             :mHasMouse(false),
60             mTabbedArea(NULL)
61     {
62         mLabel = new Label();
63         mLabel->setPosition(4, 4);
64         add(mLabel);
65 
66         addMouseListener(this);
67     }
68 
~Tab()69     Tab::~Tab()
70     {
71         delete mLabel;
72     }
73 
adjustSize()74     void Tab::adjustSize()
75     {
76         setSize(mLabel->getWidth() + 8,
77                 mLabel->getHeight() + 8);
78 
79         if (mTabbedArea != NULL)
80         {
81             mTabbedArea->adjustTabPositions();
82         }
83     }
84 
setTabbedArea(TabbedArea * tabbedArea)85     void Tab::setTabbedArea(TabbedArea* tabbedArea)
86     {
87         mTabbedArea = tabbedArea;
88     }
89 
getTabbedArea()90     TabbedArea* Tab::getTabbedArea()
91     {
92         return mTabbedArea;
93     }
94 
setCaption(const std::string & caption)95     void Tab::setCaption(const std::string& caption)
96     {
97         mLabel->setCaption(caption);
98         mLabel->adjustSize();
99         adjustSize();
100     }
101 
getCaption() const102     const std::string& Tab::getCaption() const
103     {
104         return mLabel->getCaption();
105     }
106 
draw(Graphics * graphics)107     void Tab::draw(Graphics *graphics)
108     {
109         const Color &faceColor = getBaseColor();
110         const int alpha = getBaseColor().a;
111         Color highlightColor = faceColor + 0x303030;
112         highlightColor.a = alpha;
113         Color shadowColor = faceColor - 0x303030;
114         shadowColor.a = alpha;
115 
116         Color borderColor;
117         Color baseColor;
118 
119         if ((mTabbedArea != NULL && mTabbedArea->isTabSelected(this))
120             || mHasMouse)
121         {
122             // Draw a border.
123             graphics->setColor(highlightColor);
124             graphics->drawLine(0, 0, getWidth() - 1, 0);
125             graphics->drawLine(0, 1, 0, getHeight() - 1);
126             graphics->setColor(shadowColor);
127             graphics->drawLine(getWidth() - 1, 1, getWidth() - 1, getHeight() - 1);
128 
129             borderColor = highlightColor;
130             baseColor = getBaseColor();
131         }
132         else
133         {
134             // Draw a border.
135             graphics->setColor(shadowColor);
136             graphics->drawLine(0, 0, getWidth() - 1, 0);
137             graphics->drawLine(0, 1, 0, getHeight() - 1);
138             graphics->drawLine(getWidth() - 1, 1, getWidth() - 1, getHeight() - 1);
139 
140             baseColor = getBaseColor() - 0x151515;
141             baseColor.a = alpha;
142         }
143 
144         // Push a clip area so the other drawings don't need to worry
145         // about the border.
146         graphics->pushClipArea(Rectangle(1, 1, getWidth() - 2, getHeight() - 1));
147         const Rectangle currentClipArea = graphics->getCurrentClipArea();
148 
149         graphics->setColor(baseColor);
150         graphics->fillRectangle(Rectangle(0,
151                                           0,
152                                           currentClipArea.width,
153                                           currentClipArea.height));
154 
155         drawChildren(graphics);
156 
157         if (mTabbedArea != NULL
158             && mTabbedArea->isFocused()
159             && mTabbedArea->isTabSelected(this))
160         {
161             graphics->setColor(Color(0x000000));
162             graphics->drawRectangle(Rectangle(2,
163                                               2,
164                                               currentClipArea.width - 4,
165                                               currentClipArea.height - 4));
166         }
167 
168         graphics->popClipArea();
169     }
170 
mouseEntered(MouseEvent & mouseEvent)171     void Tab::mouseEntered(MouseEvent& mouseEvent)
172     {
173         mHasMouse = true;
174     }
175 
mouseExited(MouseEvent & mouseEvent)176     void Tab::mouseExited(MouseEvent& mouseEvent)
177     {
178         mHasMouse = false;
179     }
180 }
181 
182