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