Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

OgreTextBoxGuiElement.cpp

Go to the documentation of this file.
00001 /*-------------------------------------------------------------------------
00002 This source file is a part of OGRE
00003 (Object-oriented Graphics Rendering Engine)
00004 
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright © 2000-2002 The OGRE Team
00008 Also see acknowledgements in Readme.html
00009 
00010 This library is free software; you can redistribute it and/or modify it
00011 under the terms of the GNU Lesser General Public License (LGPL) as 
00012 published by the Free Software Foundation; either version 2.1 of the 
00013 License, or (at your option) any later version.
00014 
00015 This library is distributed in the hope that it will be useful, but 
00016 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
00017 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public 
00018 License for more details.
00019 
00020 You should have received a copy of the GNU Lesser General Public License 
00021 along with this library; if not, write to the Free Software Foundation, 
00022 Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA or go to
00023 http://www.gnu.org/copyleft/lesser.txt
00024 -------------------------------------------------------------------------*/
00025 
00026 #include "OgreActionEvent.h"
00027 #include "OgreTextBoxGuiElement.h"
00028 #include "OgreKeyEvent.h"
00029 #include "OgreInput.h"
00030 #include "OgreGuiManager.h"
00031 #include "OgreException.h"
00032 
00033 namespace Ogre {
00034 
00035     //---------------------------------------------------------------------
00036     String TextBoxGuiElement::msTypeName = "TextBox";
00037     TextBoxGuiElement::CmdBackPanel TextBoxGuiElement::msCmdBackPanel;
00038     TextBoxGuiElement::CmdTextArea TextBoxGuiElement::msCmdTextArea;
00039     //---------------------------------------------------------------------
00040     TextBoxGuiElement::TextBoxGuiElement(const String& name)
00041         : PanelGuiElement(name)
00042     {
00043         if (createParamDictionary("TextBoxGuiElement"))
00044         {
00045             addBaseParameters();
00046         }
00047 
00048         mActionOnReturn = false;
00049         setTransparent(true);
00050         mBackPanel = 0;
00051         mTextArea = 0;
00052         mChildrenProcessEvents = false;
00053     }
00054 
00055 
00056     //---------------------------------------------------------------------
00057     TextBoxGuiElement::~TextBoxGuiElement()
00058     {
00059     }
00060     //---------------------------------------------------------------------
00061     const String& TextBoxGuiElement::getTypeName(void) const
00062     {
00063         return msTypeName;
00064     }
00065     //---------------------------------------------------------------------
00066     void TextBoxGuiElement::addBaseParameters(void)
00067     {
00068         PanelGuiElement::addBaseParameters();
00069         ParamDictionary* dict = getParamDictionary();
00070 
00071         dict->addParameter(ParameterDef("back_panel", 
00072            "The template name of the panel to be used behind the text."
00073             , PT_STRING),
00074             &msCmdBackPanel);
00075         dict->addParameter(ParameterDef("text_area", 
00076            "The template name of the textArea to be used for the text."
00077             , PT_STRING),
00078             &msCmdTextArea);
00079 
00080     }
00081     //---------------------------------------------------------------------------------------------
00082     // Char height command object
00083     //
00084     String TextBoxGuiElement::CmdBackPanel::doGet( const void* target ) const
00085     {
00086         return static_cast< const TextBoxGuiElement* >( target )->getBackPanelName();
00087     }
00088     void TextBoxGuiElement::CmdBackPanel::doSet( void* target, const String& val )
00089     {
00090         std::vector<String> vec = val.split("\t\n ", 1);
00091 
00092         if (vec.size() < 2)
00093         {
00094             static_cast<TextBoxGuiElement*>(target)->setBackPanel(val, 5);
00095         }
00096         else
00097         {
00098             static_cast<TextBoxGuiElement*>(target)->setBackPanel(vec[0], StringConverter::parseInt(vec[1]));
00099         }
00100 
00101     }
00102     //---------------------------------------------------------------------------------------------
00103     String TextBoxGuiElement::CmdTextArea::doGet( const void* target ) const
00104     {
00105         return static_cast< const TextBoxGuiElement* >( target )->getTextAreaName();
00106     }
00107 
00108     //-----------------------------------------------------------------------
00109     void TextBoxGuiElement::CmdTextArea::doSet(void* target, const String& val)
00110     {
00111         std::vector<String> vec = val.split("\t\n ", 1);
00112 
00113 
00114         if (vec.size() < 2)
00115         {
00116             static_cast<TextBoxGuiElement*>(target)->setTextArea(val, String(""));
00117         }
00118         else
00119         {
00120             static_cast<TextBoxGuiElement*>(target)->setTextArea(vec[0], vec[1]);
00121         }
00122     }
00123 
00124     //-----------------------------------------------------------------------
00125     String TextBoxGuiElement::getTextAreaName() const
00126     {
00127         return mTextAreaTemplateName + " " + mCaption;
00128     }
00129     //---------------------------------------------------------------------------------------------
00130     String TextBoxGuiElement::getBackPanelName() const
00131     {
00132         return mBackPanelTemplateName;
00133     }
00134     
00135     //-----------------------------------------------------------------------
00136     void TextBoxGuiElement::setTextArea(const String& templateName, const String& name)
00137     {
00138         mTextAreaTemplateName = templateName;
00139         if (mTextArea)
00140         {
00141             removeChild(mTextArea->getName());
00142             GuiManager::getSingleton().destroyGuiElement(mTextArea);
00143             mTextArea = NULL;
00144         }
00145 
00146         mTextArea = static_cast<TextAreaGuiElement*>
00147             (GuiManager::getSingleton().createGuiElementFromTemplate(mTextAreaTemplateName, "", mName + "/textArea"));
00148 
00149         mCaption = name;
00150         setCaptionToTextArea();
00151 
00152         // do not make this cloneable, otherwise there will be 2 copies of it when it is cloned,
00153         // one copy when the children are copied, and another copy when setTextArea is set.
00154         mTextArea->setCloneable(false);
00155         mTextArea->setTop(0);
00156         mTextArea->setLeft(mTextArea->getSpaceWidth()/2);
00157 
00158         if (mBackPanel)
00159         {
00160 //          mBackPanel->setHeight(mTextArea->getCharHeight());
00161             mBackPanel->addChild(mTextArea);
00162         }
00163         else
00164         {
00165             // The textarea was created first, so add it to backpanel when backpanel is created
00166 
00167         }
00168     }
00169     //-----------------------------------------------------------------------
00170     void TextBoxGuiElement::setBackPanel(const String& templateName, int size)
00171     {
00172         mTextAreaSize = size;
00173         mBackPanelTemplateName = templateName;
00174         if (mBackPanel)
00175         {
00176             removeChild(mBackPanel->getName());
00177             GuiManager::getSingleton().destroyGuiElement(mBackPanel);
00178             mBackPanel = NULL;
00179         }
00180 
00181         mBackPanel = static_cast<GuiContainer*>
00182             (GuiManager::getSingleton().createGuiElementFromTemplate(mBackPanelTemplateName, "", mName + "/backPanel"));
00183 
00184         // do not make this cloneable, otherwise there will be 2 copies of it when it is cloned,
00185         // one copy when the children are copied, and another copy when setTextArea is set.
00186         mBackPanel->setCloneable(false);
00187         mBackPanel->setDimensions(getWidth(),getHeight());
00188         mBackPanel->setTop(0);
00189         mBackPanel->setLeft(0);
00190         mBackPanel->setWidth(getWidth());
00191 
00192         addChild(mBackPanel);
00193         if (mTextArea)
00194         {
00195 //          mBackPanel->setHeight(mTextArea->getCharHeight());
00196             mBackPanel->addChild(mTextArea);
00197         }
00198         else
00199         {
00200             // The BackPanel was created first, so add it to backpanel when textarea is created
00201 
00202         }
00203     }
00204 
00205   void TextBoxGuiElement::setCaption(const String& text)
00206   {
00207     mCaption = text;
00208     if (mTextArea != NULL)
00209             mTextArea->setCaption(text);
00210   }
00211 
00212   const String& TextBoxGuiElement::getCaption(void) const
00213   {
00214     if (mTextArea != NULL)
00215       return mTextArea->getCaption();
00216     return mCaption;
00217   }
00218 
00219 
00220     //---------------------------------------------------------------------------------------------
00221     void TextBoxGuiElement::setCaptionToTextArea() 
00222     {
00223         mTextArea->setCaption(mCaption);
00224     }
00225     //---------------------------------------------------------------------------------------------
00226     void TextBoxGuiElement::processEvent(InputEvent* e) 
00227     {
00228         PanelGuiElement::processEvent(e);
00229 
00230         if (mTextArea)
00231         {
00232             if (!e->isConsumed())
00233             {
00234                 switch(e->getID()) 
00235                 {
00236                 case KeyEvent::KE_KEY_PRESSED:
00237                     KeyEvent* ke = static_cast<KeyEvent*> (e);
00238 
00239                     switch (ke->getKey())
00240                     {
00241                     case KC_BACK :
00242                         mCaption = mCaption.substr(0,mCaption.length() -1);
00243                         setCaptionToTextArea();
00244                         break;
00245 
00246                     case KC_RETURN :
00247                         if (mActionOnReturn)
00248                         {
00249                             ActionEvent* ae = new ActionEvent(this, ActionEvent::AE_ACTION_PERFORMED, 0, 0, mName);
00250                             processActionEvent(ae);
00251                             delete ae;
00252                         }
00253                         // fall through
00254 
00255                     default : {
00256                         OgreChar newKey = ke->getKeyChar();
00257                         if (newKey != '\0')
00258                         {
00259                             Font* font = static_cast<Font*> (FontManager::getSingleton().getByName(mTextArea->getFontName()));
00260                             if (!font)
00261                                 Except( Exception::ERR_ITEM_NOT_FOUND, "Could not find font " + mTextArea->getFontName(),
00262                                     "TextBoxGuiElement::processEvent" );
00263                                         
00264                             if (font->getGlyphAspectRatio(newKey)*mTextArea->getCharHeight() + mTextArea->getWidth() < getWidth() - mTextArea->getSpaceWidth())
00265                             {
00266                                 mCaption += newKey;
00267                                 setCaptionToTextArea();
00268                             }
00269                         }
00270                         }
00271                         break;
00272                     }
00273                     break;
00274                 }
00275             }
00276         }
00277     }
00278 
00279 }
00280 

Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:22:52 2004