aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt9
-rw-r--r--src/game.cpp22
-rw-r--r--src/guiTextInputMenu.cpp228
-rw-r--r--src/guiTextInputMenu.h56
-rw-r--r--src/intlGUIEditBox.cpp1508
-rw-r--r--src/intlGUIEditBox.h178
6 files changed, 1 insertions, 2000 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0992ea176..f8aa75ea5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -444,7 +444,6 @@ set(minetest_SRCS
chat.cpp
hud.cpp
guiKeyChangeMenu.cpp
- guiTextInputMenu.cpp
guiFormSpecMenu.cpp
guiTable.cpp
guiPasswordChange.cpp
@@ -463,14 +462,6 @@ set(minetest_SRCS
drawscene.cpp
${minetest_SCRIPT_SRCS}
)
-
-if(USE_FREETYPE)
- set(minetest_SRCS
- ${minetest_SRCS}
- intlGUIEditBox.cpp
- )
-endif(USE_FREETYPE)
-
list(SORT minetest_SRCS)
# Server sources
diff --git a/src/game.cpp b/src/game.cpp
index c2ee7f311..9bbbb5ecf 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -31,7 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "guiPasswordChange.h"
#include "guiVolumeChange.h"
#include "guiFormSpecMenu.h"
-#include "guiTextInputMenu.h"
#include "tool.h"
#include "guiChatConsole.h"
#include "config.h"
@@ -2905,26 +2904,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
repeat_rightclick_timer = 0;
infostream<<"Ground right-clicked"<<std::endl;
- // Sign special case, at least until formspec is properly implemented.
- // Deprecated?
- if(meta && meta->getString("formspec") == "hack:sign_text_input"
- && !random_input
- && !input->isKeyDown(getKeySetting("keymap_sneak")))
- {
- infostream<<"Launching metadata text input"<<std::endl;
-
- // Get a new text for it
-
- TextDest *dest = new TextDestNodeMetadata(nodepos, &client);
-
- std::wstring wtext = narrow_to_wide(meta->getString("text"));
-
- (new GUITextInputMenu(guienv, guiroot, -1,
- &g_menumgr, dest,
- wtext))->drop();
- }
- // If metadata provides an inventory view, activate it
- else if(meta && meta->getString("formspec") != "" && !random_input
+ if(meta && meta->getString("formspec") != "" && !random_input
&& !input->isKeyDown(getKeySetting("keymap_sneak")))
{
infostream<<"Launching custom inventory view"<<std::endl;
diff --git a/src/guiTextInputMenu.cpp b/src/guiTextInputMenu.cpp
deleted file mode 100644
index 535bf497e..000000000
--- a/src/guiTextInputMenu.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
-Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-This program 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 Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#include "guiTextInputMenu.h"
-#include "debug.h"
-#include "serialization.h"
-#include "main.h" // for g_settings
-#include "settings.h"
-#include <string>
-#include <IGUICheckBox.h>
-#include <IGUIEditBox.h>
-#include <IGUIButton.h>
-#include <IGUIStaticText.h>
-#include <IGUIFont.h>
-
-#include "gettext.h"
-
-#if USE_FREETYPE
-#include "intlGUIEditBox.h"
-#endif
-
-GUITextInputMenu::GUITextInputMenu(gui::IGUIEnvironment* env,
- gui::IGUIElement* parent, s32 id,
- IMenuManager *menumgr,
- TextDest *dest,
- std::wstring initial_text
-):
- GUIModalMenu(env, parent, id, menumgr),
- m_dest(dest),
- m_initial_text(initial_text)
-{
-}
-
-GUITextInputMenu::~GUITextInputMenu()
-{
- removeChildren();
- if(m_dest)
- delete m_dest;
-}
-
-void GUITextInputMenu::removeChildren()
-{
- {
- gui::IGUIElement *e = getElementFromId(256);
- if(e != NULL)
- e->remove();
- }
- {
- gui::IGUIElement *e = getElementFromId(257);
- if(e != NULL)
- e->remove();
- }
-}
-
-void GUITextInputMenu::regenerateGui(v2u32 screensize)
-{
- std::wstring text;
-
- {
- gui::IGUIElement *e = getElementFromId(256);
- if(e != NULL)
- {
- text = e->getText();
- }
- else
- {
- text = m_initial_text;
- m_initial_text = L"";
- }
- }
-
- /*
- Remove stuff
- */
- removeChildren();
-
- /*
- Calculate new sizes and positions
- */
- core::rect<s32> rect(
- screensize.X/2 - 580/2,
- screensize.Y/2 - 300/2,
- screensize.X/2 + 580/2,
- screensize.Y/2 + 300/2
- );
-
- DesiredRect = rect;
- recalculateAbsolutePosition(false);
-
- v2s32 size = rect.getSize();
-
- /*
- Add stuff
- */
- {
- core::rect<s32> rect(0, 0, 300, 30);
- rect = rect + v2s32(size.X/2-300/2, size.Y/2-30/2-25);
- gui::IGUIElement *e;
- #if USE_FREETYPE
- if (g_settings->getBool("freetype")) {
- e = (gui::IGUIElement *) new gui::intlGUIEditBox(text.c_str(), true, Environment, this, 256, rect);
- e->drop();
- } else {
- e = Environment->addEditBox(text.c_str(), rect, true, this, 256);
- }
- #else
- e = Environment->addEditBox(text.c_str(), rect, true, this, 256);
- #endif
- Environment->setFocus(e);
-
- irr::SEvent evt;
- evt.EventType = EET_KEY_INPUT_EVENT;
- evt.KeyInput.Key = KEY_END;
- evt.KeyInput.PressedDown = true;
- evt.KeyInput.Char = 0;
- evt.KeyInput.Control = 0;
- evt.KeyInput.Shift = 0;
- e->OnEvent(evt);
- }
- {
- core::rect<s32> rect(0, 0, 140, 30);
- rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2+25);
- wchar_t* text = wgettext("Proceed");
- Environment->addButton(rect, this, 257,
- text);
- delete[] text;
- }
-}
-
-void GUITextInputMenu::drawMenu()
-{
- gui::IGUISkin* skin = Environment->getSkin();
- if (!skin)
- return;
- video::IVideoDriver* driver = Environment->getVideoDriver();
-
- video::SColor bgcolor(140,0,0,0);
- driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
-
- gui::IGUIElement::draw();
-}
-
-void GUITextInputMenu::acceptInput()
-{
- if(m_dest)
- {
- gui::IGUIElement *e = getElementFromId(256);
- if(e != NULL)
- {
- m_dest->gotText(e->getText());
- }
- delete m_dest;
- m_dest = NULL;
- }
-}
-
-bool GUITextInputMenu::OnEvent(const SEvent& event)
-{
- if(event.EventType==EET_KEY_INPUT_EVENT)
- {
- if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
- {
- quitMenu();
- return true;
- }
- if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
- {
- acceptInput();
- quitMenu();
- return true;
- }
- }
- if(event.EventType==EET_GUI_EVENT)
- {
- if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
- && isVisible())
- {
- if(!canTakeFocus(event.GUIEvent.Element))
- {
- dstream<<"GUITextInputMenu: Not allowing focus change."
- <<std::endl;
- // Returning true disables focus change
- return true;
- }
- }
- if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
- {
- switch(event.GUIEvent.Caller->getID())
- {
- case 257:
- acceptInput();
- quitMenu();
- // quitMenu deallocates menu
- return true;
- }
- }
- if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER)
- {
- switch(event.GUIEvent.Caller->getID())
- {
- case 256:
- acceptInput();
- quitMenu();
- // quitMenu deallocates menu
- return true;
- }
- }
- }
-
- return Parent ? Parent->OnEvent(event) : false;
-}
-
diff --git a/src/guiTextInputMenu.h b/src/guiTextInputMenu.h
deleted file mode 100644
index 2fa7ead9e..000000000
--- a/src/guiTextInputMenu.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-This program 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 Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#ifndef GUITEXTINPUTMENU_HEADER
-#define GUITEXTINPUTMENU_HEADER
-
-#include "irrlichttypes_extrabloated.h"
-#include "modalMenu.h"
-#include "guiFormSpecMenu.h"
-#include <string>
-
-class GUITextInputMenu : public GUIModalMenu
-{
-public:
- GUITextInputMenu(gui::IGUIEnvironment* env,
- gui::IGUIElement* parent, s32 id,
- IMenuManager *menumgr,
- TextDest *dest,
- std::wstring initial_text);
- ~GUITextInputMenu();
-
- void removeChildren();
- /*
- Remove and re-add (or reposition) stuff
- */
- void regenerateGui(v2u32 screensize);
-
- void drawMenu();
-
- void acceptInput();
-
- bool OnEvent(const SEvent& event);
-
-private:
- TextDest *m_dest;
- std::wstring m_initial_text;
-};
-
-#endif
-
diff --git a/src/intlGUIEditBox.cpp b/src/intlGUIEditBox.cpp
deleted file mode 100644
index 32cca4866..000000000
--- a/src/intlGUIEditBox.cpp
+++ /dev/null
@@ -1,1508 +0,0 @@
-// 11.11.2011 11:11 ValkaTR
-//
-// This is a copy of intlGUIEditBox from the irrlicht, but with a
-// fix in the OnEvent function, which doesn't allowed input of
-// other keyboard layouts than latin-1
-//
-// Characters like: ä ö ü õ ы й ю я ъ № € ° ...
-//
-// This fix is only needed for linux, because of a bug
-// in the CIrrDeviceLinux.cpp:1014-1015 of the irrlicht
-//
-// Also locale in the programm should not be changed to
-// a "C", "POSIX" or whatever, it should be set to "",
-// or XLookupString will return nothing for the international
-// characters.
-//
-// From the "man setlocale":
-//
-// On startup of the main program, the portable "C" locale
-// is selected as default. A program may be made
-// portable to all locales by calling:
-//
-// setlocale(LC_ALL, "");
-//
-// after program initialization....
-//
-
-// Copyright (C) 2002-2013 Nikolaus Gebhardt
-// This file is part of the "Irrlicht Engine".
-// For conditions of distribution and use, see copyright notice in irrlicht.h
-
-#include "intlGUIEditBox.h"
-
-#ifdef _IRR_COMPILE_WITH_GUI_
-
-#include "IGUISkin.h"
-#include "IGUIEnvironment.h"
-#include "IGUIFont.h"
-#include "IVideoDriver.h"
-//#include "rect.h"
-//#include "irrlicht/os.cpp"
-#include "porting.h"
-//#include "Keycodes.h"
-
-/*
- todo:
- optional scrollbars
- ctrl+left/right to select word
- double click/ctrl click: word select + drag to select whole words, triple click to select line
- optional? dragging selected text
- numerical
-*/
-
-namespace irr
-{
-namespace gui
-{
-
-//! constructor
-intlGUIEditBox::intlGUIEditBox(const wchar_t* text, bool border,
- IGUIEnvironment* environment, IGUIElement* parent, s32 id,
- const core::rect<s32>& rectangle)
- : IGUIEditBox(environment, parent, id, rectangle), MouseMarking(false),
- Border(border), OverrideColorEnabled(false), MarkBegin(0), MarkEnd(0),
- OverrideColor(video::SColor(101,255,255,255)), OverrideFont(0), LastBreakFont(0),
- Operator(0), BlinkStartTime(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0),
- WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false),
- PasswordChar(L'*'), HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER),
- CurrentTextRect(0,0,1,1), FrameRect(rectangle)
-{
- #ifdef _DEBUG
- setDebugName("intlintlGUIEditBox");
- #endif
-
- Text = text;
-
- if (Environment)
- Operator = Environment->getOSOperator();
-
- if (Operator)
- Operator->grab();
-
- // this element can be tabbed to
- setTabStop(true);
- setTabOrder(-1);
-
- IGUISkin *skin = 0;
- if (Environment)
- skin = Environment->getSkin();
- if (Border && skin)
- {
- FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
- FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
- FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
- FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
- }
-
- breakText();
-
- calculateScrollPos();
-}
-
-
-//! destructor
-intlGUIEditBox::~intlGUIEditBox()
-{
- if (OverrideFont)
- OverrideFont->drop();
-
- if (Operator)
- Operator->drop();
-}
-
-
-//! Sets another skin independent font.
-void intlGUIEditBox::setOverrideFont(IGUIFont* font)
-{
- if (OverrideFont == font)
- return;
-
- if (OverrideFont)
- OverrideFont->drop();
-
- OverrideFont = font;
-
- if (OverrideFont)
- OverrideFont->grab();
-
- breakText();
-}
-
-IGUIFont * intlGUIEditBox::getOverrideFont() const
-{
- return OverrideFont;
-}
-
-//! Get the font which is used right now for drawing
-IGUIFont* intlGUIEditBox::getActiveFont() const
-{
- if ( OverrideFont )
- return OverrideFont;
- IGUISkin* skin = Environment->getSkin();
- if (skin)
- return skin->getFont();
- return 0;
-}
-
-//! Sets another color for the text.
-void intlGUIEditBox::setOverrideColor(video::SColor color)
-{
- OverrideColor = color;
- OverrideColorEnabled = true;
-}
-
-video::SColor intlGUIEditBox::getOverrideColor() const
-{
- return OverrideColor;
-}
-
-//! Turns the border on or off
-void intlGUIEditBox::setDrawBorder(bool border)
-{
- Border = border;
-}
-
-//! Sets whether to draw the background
-void intlGUIEditBox::setDrawBackground(bool draw)
-{
-}
-
-//! Sets if the text should use the overide color or the color in the gui skin.
-void intlGUIEditBox::enableOverrideColor(bool enable)
-{
- OverrideColorEnabled = enable;
-}
-
-bool intlGUIEditBox::isOverrideColorEnabled() const
-{
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return OverrideColorEnabled;
-}
-
-//! Enables or disables word wrap
-void intlGUIEditBox::setWordWrap(bool enable)
-{
- WordWrap = enable;
- breakText();
-}
-
-
-void intlGUIEditBox::updateAbsolutePosition()
-{
- core::rect<s32> oldAbsoluteRect(AbsoluteRect);
- IGUIElement::updateAbsolutePosition();
- if ( oldAbsoluteRect != AbsoluteRect )
- {
- breakText();
- }
-}
-
-
-//! Checks if word wrap is enabled
-bool intlGUIEditBox::isWordWrapEnabled() const
-{
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return WordWrap;
-}
-
-
-//! Enables or disables newlines.
-void intlGUIEditBox::setMultiLine(bool enable)
-{
- MultiLine = enable;
-}
-
-
-//! Checks if multi line editing is enabled
-bool intlGUIEditBox::isMultiLineEnabled() const
-{
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return MultiLine;
-}
-
-
-void intlGUIEditBox::setPasswordBox(bool passwordBox, wchar_t passwordChar)
-{
- PasswordBox = passwordBox;
- if (PasswordBox)
- {
- PasswordChar = passwordChar;
- setMultiLine(false);
- setWordWrap(false);
- BrokenText.clear();
- }
-}
-
-
-bool intlGUIEditBox::isPasswordBox() const
-{
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return PasswordBox;
-}
-
-
-//! Sets text justification
-void intlGUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical)
-{
- HAlign = horizontal;
- VAlign = vertical;
-}
-
-
-//! called if an event happened.
-bool intlGUIEditBox::OnEvent(const SEvent& event)
-{
- if (IsEnabled)
- {
-
- switch(event.EventType)
- {
- case EET_GUI_EVENT:
- if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
- {
- if (event.GUIEvent.Caller == this)
- {
- MouseMarking = false;
- setTextMarkers(0,0);
- }
- }
- break;
- case EET_KEY_INPUT_EVENT:
- {
-#if defined(linux)
- // ################################################################
- // ValkaTR:
- // This part is the difference from the original intlGUIEditBox
- // It converts UTF-8 character into a UCS-2 (wchar_t)
- wchar_t wc = L'_';
- mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) );
-
- //printf( "char: %lc (%u) \r\n", wc, wc );
-
- SEvent irrevent(event);
- irrevent.KeyInput.Char = wc;
- // ################################################################
-
- if (processKey(irrevent))
- return true;
-#else
- if (processKey(event))
- return true;
-#endif // defined(linux)
-
- break;
- }
- case EET_MOUSE_INPUT_EVENT:
- if (processMouse(event))
- return true;
- break;
- default:
- break;
- }
- }
-
- return IGUIElement::OnEvent(event);
-}
-
-
-bool intlGUIEditBox::processKey(const SEvent& event)
-{
- if (!event.KeyInput.PressedDown)
- return false;
-
- bool textChanged = false;
- s32 newMarkBegin = MarkBegin;
- s32 newMarkEnd = MarkEnd;
-
- // control shortcut handling
-
- if (event.KeyInput.Control)
- {
- // german backlash '\' entered with control + '?'
- if ( event.KeyInput.Char == '\\' )
- {
- inputChar(event.KeyInput.Char);
- return true;
- }
-
- switch(event.KeyInput.Key)
- {
- case KEY_KEY_A:
- // select all
- newMarkBegin = 0;
- newMarkEnd = Text.size();
- break;
- case KEY_KEY_C:
- // copy to clipboard
- if (!PasswordBox && Operator && MarkBegin != MarkEnd)
- {
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- core::stringc s;
- s = Text.subString(realmbgn, realmend - realmbgn).c_str();
- Operator->copyToClipboard(s.c_str());
- }
- break;
- case KEY_KEY_X:
- // cut to the clipboard
- if (!PasswordBox && Operator && MarkBegin != MarkEnd)
- {
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- // copy
- core::stringc sc;
- sc = Text.subString(realmbgn, realmend - realmbgn).c_str();
- Operator->copyToClipboard(sc.c_str());
-
- if (IsEnabled)
- {
- // delete
- core::stringw s;
- s = Text.subString(0, realmbgn);
- s.append( Text.subString(realmend, Text.size()-realmend) );
- Text = s;
-
- CursorPos = realmbgn;
- newMarkBegin = 0;
- newMarkEnd = 0;
- textChanged = true;
- }
- }
- break;
- case KEY_KEY_V:
- if ( !IsEnabled )
- break;
-
- // paste from the clipboard
- if (Operator)
- {
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- // add new character
- const c8* p = Operator->getTextFromClipboard();
- if (p)
- {
- if (MarkBegin == MarkEnd)
- {
- // insert text
- core::stringw s = Text.subString(0, CursorPos);
- s.append(p);
- s.append( Text.subString(CursorPos, Text.size()-CursorPos) );
-
- if (!Max || s.size()<=Max) // thx to Fish FH for fix
- {
- Text = s;
- s = p;
- CursorPos += s.size();
- }
- }
- else
- {
- // replace text
-
- core::stringw s = Text.subString(0, realmbgn);
- s.append(p);
- s.append( Text.subString(realmend, Text.size()-realmend) );
-
- if (!Max || s.size()<=Max) // thx to Fish FH for fix
- {
- Text = s;
- s = p;
- CursorPos = realmbgn + s.size();
- }
- }
- }
-
- newMarkBegin = 0;
- newMarkEnd = 0;
- textChanged = true;
- }
- break;
- case KEY_HOME:
- // move/highlight to start of text
- if (event.KeyInput.Shift)
- {
- newMarkEnd = CursorPos;
- newMarkBegin = 0;
- CursorPos = 0;
- }
- else
- {
- CursorPos = 0;
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
- break;
- case KEY_END:
- // move/highlight to end of text
- if (event.KeyInput.Shift)
- {
- newMarkBegin = CursorPos;
- newMarkEnd = Text.size();
- CursorPos = 0;
- }
- else
- {
- CursorPos = Text.size();
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
- break;
- default:
- return false;
- }
- }
- // default keyboard handling
- else
- switch(event.KeyInput.Key)
- {
- case KEY_END:
- {
- s32 p = Text.size();
- if (WordWrap || MultiLine)
- {
- p = getLineFromPos(CursorPos);
- p = BrokenTextPositions[p] + (s32)BrokenText[p].size();
- if (p > 0 && (Text[p-1] == L'\r' || Text[p-1] == L'\n' ))
- p-=1;
- }
-
- if (event.KeyInput.Shift)
- {
- if (MarkBegin == MarkEnd)
- newMarkBegin = CursorPos;
-
- newMarkEnd = p;
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
- CursorPos = p;
- BlinkStartTime = porting::getTimeMs();
- }
- break;
- case KEY_HOME:
- {
-
- s32 p = 0;
- if (WordWrap || MultiLine)
- {
- p = getLineFromPos(CursorPos);
- p = BrokenTextPositions[p];
- }
-
- if (event.KeyInput.Shift)
- {
- if (MarkBegin == MarkEnd)
- newMarkBegin = CursorPos;
- newMarkEnd = p;
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
- CursorPos = p;
- BlinkStartTime = porting::getTimeMs();
- }
- break;
- case KEY_RETURN:
- if (MultiLine)
- {
- inputChar(L'\n');
- return true;
- }
- else
- {
- sendGuiEvent( EGET_EDITBOX_ENTER );
- }
- break;
- case KEY_LEFT:
-
- if (event.KeyInput.Shift)
- {
- if (CursorPos > 0)
- {
- if (MarkBegin == MarkEnd)
- newMarkBegin = CursorPos;
-
- newMarkEnd = CursorPos-1;
- }
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
-
- if (CursorPos > 0) CursorPos--;
- BlinkStartTime = porting::getTimeMs();
- break;
-
- case KEY_RIGHT:
- if (event.KeyInput.Shift)
- {
- if (Text.size() > (u32)CursorPos)
- {
- if (MarkBegin == MarkEnd)
- newMarkBegin = CursorPos;
-
- newMarkEnd = CursorPos+1;
- }
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
-
- if (Text.size() > (u32)CursorPos) CursorPos++;
- BlinkStartTime = porting::getTimeMs();
- break;
- case KEY_UP:
- if (MultiLine || (WordWrap && BrokenText.size() > 1) )
- {
- s32 lineNo = getLineFromPos(CursorPos);
- s32 mb = (MarkBegin == MarkEnd) ? CursorPos : (MarkBegin > MarkEnd ? MarkBegin : MarkEnd);
- if (lineNo > 0)
- {
- s32 cp = CursorPos - BrokenTextPositions[lineNo];
- if ((s32)BrokenText[lineNo-1].size() < cp)
- CursorPos = BrokenTextPositions[lineNo-1] + (s32)BrokenText[lineNo-1].size()-1;
- else
- CursorPos = BrokenTextPositions[lineNo-1] + cp;
- }
-
- if (event.KeyInput.Shift)
- {
- newMarkBegin = mb;
- newMarkEnd = CursorPos;
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
-
- }
- else
- {
- return false;
- }
- break;
- case KEY_DOWN:
- if (MultiLine || (WordWrap && BrokenText.size() > 1) )
- {
- s32 lineNo = getLineFromPos(CursorPos);
- s32 mb = (MarkBegin == MarkEnd) ? CursorPos : (MarkBegin < MarkEnd ? MarkBegin : MarkEnd);
- if (lineNo < (s32)BrokenText.size()-1)
- {
- s32 cp = CursorPos - BrokenTextPositions[lineNo];
- if ((s32)BrokenText[lineNo+1].size() < cp)
- CursorPos = BrokenTextPositions[lineNo+1] + BrokenText[lineNo+1].size()-1;
- else
- CursorPos = BrokenTextPositions[lineNo+1] + cp;
- }
-
- if (event.KeyInput.Shift)
- {
- newMarkBegin = mb;
- newMarkEnd = CursorPos;
- }
- else
- {
- newMarkBegin = 0;
- newMarkEnd = 0;
- }
-
- }
- else
- {
- return false;
- }
- break;
-
- case KEY_BACK:
- if ( !this->IsEnabled )
- break;
-
- if (Text.size())
- {
- core::stringw s;
-
- if (MarkBegin != MarkEnd)
- {
- // delete marked text
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- s = Text.subString(0, realmbgn);
- s.append( Text.subString(realmend, Text.size()-realmend) );
- Text = s;
-
- CursorPos = realmbgn;
- }
- else
- {
- // delete text behind cursor
- if (CursorPos>0)
- s = Text.subString(0, CursorPos-1);
- else
- s = L"";
- s.append( Text.subString(CursorPos, Text.size()-CursorPos) );
- Text = s;
- --CursorPos;
- }
-
- if (CursorPos < 0)
- CursorPos = 0;
- BlinkStartTime = porting::getTimeMs();
- newMarkBegin = 0;
- newMarkEnd = 0;
- textChanged = true;
- }
- break;
- case KEY_DELETE:
- if ( !this->IsEnabled )
- break;
-
- if (Text.size() != 0)
- {
- core::stringw s;
-
- if (MarkBegin != MarkEnd)
- {
- // delete marked text
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- s = Text.subString(0, realmbgn);
- s.append( Text.subString(realmend, Text.size()-realmend) );
- Text = s;
-
- CursorPos = realmbgn;
- }
- else
- {
- // delete text before cursor
- s = Text.subString(0, CursorPos);
- s.append( Text.subString(CursorPos+1, Text.size()-CursorPos-1) );
- Text = s;
- }
-
- if (CursorPos > (s32)Text.size())
- CursorPos = (s32)Text.size();
-
- BlinkStartTime = porting::getTimeMs();
- newMarkBegin = 0;
- newMarkEnd = 0;
- textChanged = true;
- }
- break;
-
- case KEY_ESCAPE:
- case KEY_TAB:
- case KEY_SHIFT:
- case KEY_F1:
- case KEY_F2:
- case KEY_F3:
- case KEY_F4:
- case KEY_F5:
- case KEY_F6:
- case KEY_F7:
- case KEY_F8:
- case KEY_F9:
- case KEY_F10:
- case KEY_F11:
- case KEY_F12:
- case KEY_F13:
- case KEY_F14:
- case KEY_F15:
- case KEY_F16:
- case KEY_F17:
- case KEY_F18:
- case KEY_F19:
- case KEY_F20:
- case KEY_F21:
- case KEY_F22:
- case KEY_F23:
- case KEY_F24:
- // ignore these keys
- return false;
-
- default:
- inputChar(event.KeyInput.Char);
- return true;
- }
-
- // Set new text markers
- setTextMarkers( newMarkBegin, newMarkEnd );
-
- // break the text if it has changed
- if (textChanged)
- {
- breakText();
- sendGuiEvent(EGET_EDITBOX_CHANGED);
- }
-
- calculateScrollPos();
-
- return true;
-}
-
-
-//! draws the element and its children
-void intlGUIEditBox::draw()
-{
- if (!IsVisible)
- return;
-
- const bool focus = Environment->hasFocus(this);
-
- IGUISkin* skin = Environment->getSkin();
- if (!skin)
- return;
-
- FrameRect = AbsoluteRect;
-
- // draw the border
-
- if (Border)
- {
- skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW),
- false, true, FrameRect, &AbsoluteClippingRect);
-
- FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
- FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
- FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
- FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
- }
- core::rect<s32> localClipRect = FrameRect;
- localClipRect.clipAgainst(AbsoluteClippingRect);
-
- // draw the text
-
- IGUIFont* font = OverrideFont;
- if (!OverrideFont)
- font = skin->getFont();
-
- s32 cursorLine = 0;
- s32 charcursorpos = 0;
-
- if (font)
- {
- if (LastBreakFont != font)
- {
- breakText();
- }
-
- // calculate cursor pos
-
- core::stringw *txtLine = &Text;
- s32 startPos = 0;
-
- core::stringw s, s2;
-
- // get mark position
- const bool ml = (!PasswordBox && (WordWrap || MultiLine));
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
- const s32 hlineStart = ml ? getLineFromPos(realmbgn) : 0;
- const s32 hlineCount = ml ? getLineFromPos(realmend) - hlineStart + 1 : 1;
- const s32 lineCount = ml ? BrokenText.size() : 1;
-
- // Save the override color information.
- // Then, alter it if the edit box is disabled.
- const bool prevOver = OverrideColorEnabled;
- const video::SColor prevColor = OverrideColor;
-
- if (Text.size())
- {
- if (!IsEnabled && !OverrideColorEnabled)
- {
- OverrideColorEnabled = true;
- OverrideColor = skin->getColor(EGDC_GRAY_TEXT);
- }
-
- for (s32 i=0; i < lineCount; ++i)
- {
- setTextRect(i);
-
- // clipping test - don't draw anything outside the visible area
- core::rect<s32> c = localClipRect;
- c.clipAgainst(CurrentTextRect);
- if (!c.isValid())
- continue;
-
- // get current line
- if (PasswordBox)
- {
- if (BrokenText.size() != 1)
- {
- BrokenText.clear();
- BrokenText.push_back(core::stringw());
- }
- if (BrokenText[0].size() != Text.size())
- {
- BrokenText[0] = Text;
- for (u32 q = 0; q < Text.size(); ++q)
- {
- BrokenText[0] [q] = PasswordChar;
- }
- }
- txtLine = &BrokenText[0];
- startPos = 0;
- }
- else
- {
- txtLine = ml ? &BrokenText[i] : &Text;
- startPos = ml ? BrokenTextPositions[i] : 0;
- }
-
-
- // draw normal text
- font->draw(txtLine->c_str(), CurrentTextRect,
- OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT),
- false, true, &localClipRect);
-
- // draw mark and marked text
- if (focus && MarkBegin != MarkEnd && i >= hlineStart && i < hlineStart + hlineCount)
- {
-
- s32 mbegin = 0, mend = 0;
- s32 lineStartPos = 0, lineEndPos = txtLine->size();
-
- if (i == hlineStart)
- {
- // highlight start is on this line
- s = txtLine->subString(0, realmbgn - startPos);
- mbegin = font->getDimension(s.c_str()).Width;
-
- // deal with kerning
- mbegin += font->getKerningWidth(
- &((*txtLine)[realmbgn - startPos]),
- realmbgn - startPos > 0 ? &((*txtLine)[realmbgn - startPos - 1]) : 0);
-
- lineStartPos = realmbgn - startPos;
- }
- if (i == hlineStart + hlineCount - 1)
- {
- // highlight end is on this line
- s2 = txtLine->subString(0, realmend - startPos);
- mend = font->getDimension(s2.c_str()).Width;
- lineEndPos = (s32)s2.size();
- }
- else
- mend = font->getDimension(txtLine->c_str()).Width;
-
- CurrentTextRect.UpperLeftCorner.X += mbegin;
- CurrentTextRect.LowerRightCorner.X = CurrentTextRect.UpperLeftCorner.X + mend - mbegin;
-
- // draw mark
- skin->draw2DRectangle(this, skin->getColor(EGDC_HIGH_LIGHT), CurrentTextRect, &localClipRect);
-
- // draw marked text
- s = txtLine->subString(lineStartPos, lineEndPos - lineStartPos);
-
- if (s.size())
- font->draw(s.c_str(), CurrentTextRect,
- OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_HIGH_LIGHT_TEXT),
- false, true, &localClipRect);
-
- }
- }
-
- // Return the override color information to its previous settings.
- OverrideColorEnabled = prevOver;
- OverrideColor = prevColor;
- }
-
- // draw cursor
-
- if (WordWrap || MultiLine)
- {
- cursorLine = getLineFromPos(CursorPos);
- txtLine = &BrokenText[cursorLine];
- startPos = BrokenTextPositions[cursorLine];
- }
- s = txtLine->subString(0,CursorPos-startPos);
- charcursorpos = font->getDimension(s.c_str()).Width +
- font->getKerningWidth(L"_", CursorPos-startPos > 0 ? &((*txtLine)[CursorPos-startPos-1]) : 0);
-
- if (focus && (porting::getTimeMs() - BlinkStartTime) % 700 < 350)
- {
- setTextRect(cursorLine);
- CurrentTextRect.UpperLeftCorner.X += charcursorpos;
-
- font->draw(L"_", CurrentTextRect,
- OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT),
- false, true, &localClipRect);
- }
- }
-
- // draw children
- IGUIElement::draw();
-}
-
-
-//! Sets the new caption of this element.
-void intlGUIEditBox::setText(const wchar_t* text)
-{
- Text = text;
- if (u32(CursorPos) > Text.size())
- CursorPos = Text.size();
- HScrollPos = 0;
- breakText();
-}
-
-
-//! Enables or disables automatic scrolling with cursor position
-//! \param enable: If set to true, the text will move around with the cursor position
-void intlGUIEditBox::setAutoScroll(bool enable)
-{
- AutoScroll = enable;
-}
-
-
-//! Checks to see if automatic scrolling is enabled
-//! \return true if automatic scrolling is enabled, false if not
-bool intlGUIEditBox::isAutoScrollEnabled() const
-{
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return AutoScroll;
-}
-
-
-//! Gets the area of the text in the edit box
-//! \return Returns the size in pixels of the text
-core::dimension2du intlGUIEditBox::getTextDimension()
-{
- core::rect<s32> ret;
-
- setTextRect(0);
- ret = CurrentTextRect;
-
- for (u32 i=1; i < BrokenText.size(); ++i)
- {
- setTextRect(i);
- ret.addInternalPoint(CurrentTextRect.UpperLeftCorner);
- ret.addInternalPoint(CurrentTextRect.LowerRightCorner);
- }
-
- return core::dimension2du(ret.getSize());
-}
-
-
-//! Sets the maximum amount of characters which may be entered in the box.
-//! \param max: Maximum amount of characters. If 0, the character amount is
-//! infinity.
-void intlGUIEditBox::setMax(u32 max)
-{
- Max = max;
-
- if (Text.size() > Max && Max != 0)
- Text = Text.subString(0, Max);
-}
-
-
-//! Returns maximum amount of characters, previously set by setMax();
-u32 intlGUIEditBox::getMax() const
-{
- return Max;
-}
-
-
-bool intlGUIEditBox::processMouse(const SEvent& event)
-{
- switch(event.MouseInput.Event)
- {
- case irr::EMIE_LMOUSE_LEFT_UP:
- if (Environment->hasFocus(this))
- {
- CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
- if (MouseMarking)
- {
- setTextMarkers( MarkBegin, CursorPos );
- }
- MouseMarking = false;
- calculateScrollPos();
- return true;
- }
- break;
- case irr::EMIE_MOUSE_MOVED:
- {
- if (MouseMarking)
- {
- CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
- setTextMarkers( MarkBegin, CursorPos );
- calculateScrollPos();
- return true;
- }
- }
- break;
- case EMIE_LMOUSE_PRESSED_DOWN:
- if (!Environment->hasFocus(this))
- {
- BlinkStartTime = porting::getTimeMs();
- MouseMarking = true;
- CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
- setTextMarkers(CursorPos, CursorPos );
- calculateScrollPos();
- return true;
- }
- else
- {
- if (!AbsoluteClippingRect.isPointInside(
- core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
- {
- return false;
- }
- else
- {
- // move cursor
- CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
-
- s32 newMarkBegin = MarkBegin;
- if (!MouseMarking)
- newMarkBegin = CursorPos;
-
- MouseMarking = true;
- setTextMarkers( newMarkBegin, CursorPos);
- calculateScrollPos();
- return true;
- }
- }
- default:
- break;
- }
-
- return false;
-}
-
-
-s32 intlGUIEditBox::getCursorPos(s32 x, s32 y)
-{
- IGUIFont* font = OverrideFont;
- IGUISkin* skin = Environment->getSkin();
- if (!OverrideFont)
- font = skin->getFont();
-
- const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1;
-
- core::stringw *txtLine=0;
- s32 startPos=0;
- x+=3;
-
- for (u32 i=0; i < lineCount; ++i)
- {
- setTextRect(i);
- if (i == 0 && y < CurrentTextRect.UpperLeftCorner.Y)
- y = CurrentTextRect.UpperLeftCorner.Y;
- if (i == lineCount - 1 && y > CurrentTextRect.LowerRightCorner.Y )
- y = CurrentTextRect.LowerRightCorner.Y;
-
- // is it inside this region?
- if (y >= CurrentTextRect.UpperLeftCorner.Y && y <= CurrentTextRect.LowerRightCorner.Y)
- {
- // we've found the clicked line
- txtLine = (WordWrap || MultiLine) ? &BrokenText[i] : &Text;
- startPos = (WordWrap || MultiLine) ? BrokenTextPositions[i] : 0;
- break;
- }
- }
-
- if (x < CurrentTextRect.UpperLeftCorner.X)
- x = CurrentTextRect.UpperLeftCorner.X;
-
- s32 idx = font->getCharacterFromPos(Text.c_str(), x - CurrentTextRect.UpperLeftCorner.X);
-
- // click was on or left of the line
- if (idx != -1)
- return idx + startPos;
-
- // click was off the right edge of the line, go to end.
- return txtLine->size() + startPos;
-}
-
-
-//! Breaks the single text line.
-void intlGUIEditBox::breakText()
-{
- IGUISkin* skin = Environment->getSkin();
-
- if ((!WordWrap && !MultiLine) || !skin)
- return;
-
- BrokenText.clear(); // need to reallocate :/
- BrokenTextPositions.set_used(0);
-
- IGUIFont* font = OverrideFont;
- if (!OverrideFont)
- font = skin->getFont();
-
- if (!font)
- return;
-
- LastBreakFont = font;
-
- core::stringw line;
- core::stringw word;
- core::stringw whitespace;
- s32 lastLineStart = 0;
- s32 size = Text.size();
- s32 length = 0;
- s32 elWidth = RelativeRect.getWidth() - 6;
- wchar_t c;
-
- for (s32 i=0; i<size; ++i)
- {
- c = Text[i];
- bool lineBreak = false;
-
- if (c == L'\r') // Mac or Windows breaks
- {
- lineBreak = true;
- c = ' ';
- if (Text[i+1] == L'\n') // Windows breaks
- {
- Text.erase(i+1);
- --size;
- }
- }
- else if (c == L'\n') // Unix breaks
- {
- lineBreak = true;
- c = ' ';
- }
-
- // don't break if we're not a multi-line edit box
- if (!MultiLine)
- lineBreak = false;
-
- if (c == L' ' || c == 0 || i == (size-1))
- {
- if (word.size())
- {
- // here comes the next whitespace, look if
- // we can break the last word to the next line.
- s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
- s32 worldlgth = font->getDimension(word.c_str()).Width;
-
- if (WordWrap && length + worldlgth + whitelgth > elWidth)
- {
- // break to next line
- length = worldlgth;
- BrokenText.push_back(line);
- BrokenTextPositions.push_back(lastLineStart);
- lastLineStart = i - (s32)word.size();
- line = word;
- }
- else
- {
- // add word to line
- line += whitespace;
- line += word;
- length += whitelgth + worldlgth;
- }
-
- word = L"";
- whitespace = L"";
- }
-
- whitespace += c;
-
- // compute line break
- if (lineBreak)
- {
- line += whitespace;
- line += word;
- BrokenText.push_back(line);
- BrokenTextPositions.push_back(lastLineStart);
- lastLineStart = i+1;
- line = L"";
- word = L"";
- whitespace = L"";
- length = 0;
- }
- }
- else
- {
- // yippee this is a word..
- word += c;
- }
- }
-
- line += whitespace;
- line += word;
- BrokenText.push_back(line);
- BrokenTextPositions.push_back(lastLineStart);
-}
-
-
-void intlGUIEditBox::setTextRect(s32 line)
-{
- core::dimension2du d;
-
- IGUISkin* skin = Environment->getSkin();
- if (!skin)
- return;
-
- IGUIFont* font = OverrideFont ? OverrideFont : skin->getFont();
-
- if (!font)
- return;
-
- // get text dimension
- const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1;
- if (WordWrap || MultiLine)
- {
- d = font->getDimension(BrokenText[line].c_str());
- }
- else
- {
- d = font->getDimension(Text.c_str());
- d.Height = AbsoluteRect.getHeight();
- }
- d.Height += font->getKerningHeight();
-
- // justification
- switch (HAlign)
- {
- case EGUIA_CENTER:
- // align to h centre
- CurrentTextRect.UpperLeftCorner.X = (FrameRect.getWidth()/2) - (d.Width/2);
- CurrentTextRect.LowerRightCorner.X = (FrameRect.getWidth()/2) + (d.Width/2);
- break;
- case EGUIA_LOWERRIGHT:
- // align to right edge
- CurrentTextRect.UpperLeftCorner.X = FrameRect.getWidth() - d.Width;
- CurrentTextRect.LowerRightCorner.X = FrameRect.getWidth();
- break;
- default:
- // align to left edge
- CurrentTextRect.UpperLeftCorner.X = 0;
- CurrentTextRect.LowerRightCorner.X = d.Width;
-
- }
-
- switch (VAlign)
- {
- case EGUIA_CENTER:
- // align to v centre
- CurrentTextRect.UpperLeftCorner.Y =
- (FrameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line;
- break;
- case EGUIA_LOWERRIGHT:
- // align to bottom edge
- CurrentTextRect.UpperLeftCorner.Y =
- FrameRect.getHeight() - lineCount*d.Height + d.Height*line;
- break;
- default:
- // align to top edge
- CurrentTextRect.UpperLeftCorner.Y = d.Height*line;
- break;
- }
-
- CurrentTextRect.UpperLeftCorner.X -= HScrollPos;
- CurrentTextRect.LowerRightCorner.X -= HScrollPos;
- CurrentTextRect.UpperLeftCorner.Y -= VScrollPos;
- CurrentTextRect.LowerRightCorner.Y = CurrentTextRect.UpperLeftCorner.Y + d.Height;
-
- CurrentTextRect += FrameRect.UpperLeftCorner;
-
-}
-
-
-s32 intlGUIEditBox::getLineFromPos(s32 pos)
-{
- if (!WordWrap && !MultiLine)
- return 0;
-
- s32 i=0;
- while (i < (s32)BrokenTextPositions.size())
- {
- if (BrokenTextPositions[i] > pos)
- return i-1;
- ++i;
- }
- return (s32)BrokenTextPositions.size() - 1;
-}
-
-
-void intlGUIEditBox::inputChar(wchar_t c)
-{
- if (!IsEnabled)
- return;
-
- if (c != 0)
- {
- if (Text.size() < Max || Max == 0)
- {
- core::stringw s;
-
- if (MarkBegin != MarkEnd)
- {
- // replace marked text
- const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
- const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;
-
- s = Text.subString(0, realmbgn);
- s.append(c);
- s.append( Text.subString(realmend, Text.size()-realmend) );
- Text = s;
- CursorPos = realmbgn+1;
- }
- else
- {
- // add new character
- s = Text.subString(0, CursorPos);
- s.append(c);
- s.append( Text.subString(CursorPos, Text.size()-CursorPos) );
- Text = s;
- ++CursorPos;
- }
-
- BlinkStartTime = porting::getTimeMs();
- setTextMarkers(0, 0);
- }
- }
- breakText();
- sendGuiEvent(EGET_EDITBOX_CHANGED);
- calculateScrollPos();
-}
-
-
-void intlGUIEditBox::calculateScrollPos()
-{
- if (!AutoScroll)
- return;
-
- // calculate horizontal scroll position
- s32 cursLine = getLineFromPos(CursorPos);
- setTextRect(cursLine);
-
- // don't do horizontal scrolling when wordwrap is enabled.
- if (!WordWrap)
- {
- // get cursor position
- IGUISkin* skin = Environment->getSkin();
- if (!skin)
- return;
- IGUIFont* font = OverrideFont ? OverrideFont : skin->getFont();
- if (!font)
- return;
-
- core::stringw *txtLine = MultiLine ? &BrokenText[cursLine] : &Text;
- s32 cPos = MultiLine ? CursorPos - BrokenTextPositions[cursLine] : CursorPos;
-
- s32 cStart = CurrentTextRect.UpperLeftCorner.X + HScrollPos +
- font->getDimension(txtLine->subString(0, cPos).c_str()).Width;
-
- s32 cEnd = cStart + font->getDimension(L"_ ").Width;
-
- if (FrameRect.LowerRightCorner.X < cEnd)
- HScrollPos = cEnd - FrameRect.LowerRightCorner.X;
- else if (FrameRect.UpperLeftCorner.X > cStart)
- HScrollPos = cStart - FrameRect.UpperLeftCorner.X;
- else
- HScrollPos = 0;
-
- // todo: adjust scrollbar
- }
-
- // vertical scroll position
- if (FrameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y + VScrollPos)
- VScrollPos = CurrentTextRect.LowerRightCorner.Y - FrameRect.LowerRightCorner.Y + VScrollPos;
-
- else if (FrameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y + VScrollPos)
- VScrollPos = CurrentTextRect.UpperLeftCorner.Y - FrameRect.UpperLeftCorner.Y + VScrollPos;
- else
- VScrollPos = 0;
-
- // todo: adjust scrollbar
-}
-
-//! set text markers
-void intlGUIEditBox::setTextMarkers(s32 begin, s32 end)
-{
- if ( begin != MarkBegin || end != MarkEnd )
- {
- MarkBegin = begin;
- MarkEnd = end;
- sendGuiEvent(EGET_EDITBOX_MARKING_CHANGED);
- }
-}
-
-//! send some gui event to parent
-void intlGUIEditBox::sendGuiEvent(EGUI_EVENT_TYPE type)
-{
- if ( Parent )
- {
- SEvent e;
- e.EventType = EET_GUI_EVENT;
- e.GUIEvent.Caller = this;
- e.GUIEvent.Element = 0;
- e.GUIEvent.EventType = type;
-
- Parent->OnEvent(e);
- }
-}
-
-//! Writes attributes of the element.
-void intlGUIEditBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const
-{
- // IGUIEditBox::serializeAttributes(out,options);
-
- out->addBool ("OverrideColorEnabled",OverrideColorEnabled );
- out->addColor ("OverrideColor", OverrideColor);
- // out->addFont("OverrideFont",OverrideFont);
- out->addInt ("MaxChars", Max);
- out->addBool ("WordWrap", WordWrap);
- out->addBool ("MultiLine", MultiLine);
- out->addBool ("AutoScroll", AutoScroll);
- out->addBool ("PasswordBox", PasswordBox);
- core::stringw ch = L" ";
- ch[0] = PasswordChar;
- out->addString("PasswordChar", ch.c_str());
- out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames);
- out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames);
-
- IGUIEditBox::serializeAttributes(out,options);
-}
-
-
-//! Reads attributes of the element
-void intlGUIEditBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
-{
- IGUIEditBox::deserializeAttributes(in,options);
-
- setOverrideColor(in->getAttributeAsColor("OverrideColor"));
- enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled"));
- setMax(in->getAttributeAsInt("MaxChars"));
- setWordWrap(in->getAttributeAsBool("WordWrap"));
- setMultiLine(in->getAttributeAsBool("MultiLine"));
- setAutoScroll(in->getAttributeAsBool("AutoScroll"));
- core::stringw ch = in->getAttributeAsStringW("PasswordChar");
-
- if (!ch.size())
- setPasswordBox(in->getAttributeAsBool("PasswordBox"));
- else
- setPasswordBox(in->getAttributeAsBool("PasswordBox"), ch[0]);
-
- setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames),
- (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames));
-
- // setOverrideFont(in->getAttributeAsFont("OverrideFont"));
-}
-
-
-} // end namespace gui
-} // end namespace irr
-
-#endif // _IRR_COMPILE_WITH_GUI_
diff --git a/src/intlGUIEditBox.h b/src/intlGUIEditBox.h
deleted file mode 100644
index e3ee15a30..000000000
--- a/src/intlGUIEditBox.h
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (C) 2002-2013 Nikolaus Gebhardt
-// This file is part of the "Irrlicht Engine".
-// For conditions of distribution and use, see copyright notice in irrlicht.h
-
-#ifndef __C_INTL_GUI_EDIT_BOX_H_INCLUDED__
-#define __C_INTL_GUI_EDIT_BOX_H_INCLUDED__
-
-#include "IrrCompileConfig.h"
-//#ifdef _IRR_COMPILE_WITH_GUI_
-
-#include "IGUIEditBox.h"
-#include "irrArray.h"
-#include "IOSOperator.h"
-
-namespace irr
-{
-namespace gui
-{
- class intlGUIEditBox : public IGUIEditBox
- {
- public:
-
- //! constructor
- intlGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* environment,
- IGUIElement* parent, s32 id, const core::rect<s32>& rectangle);
-
- //! destructor
- virtual ~intlGUIEditBox();
-
- //! Sets another skin independent font.
- virtual void setOverrideFont(IGUIFont* font=0);
-
- //! Gets the override font (if any)
- /** \return The override font (may be 0) */
- virtual IGUIFont* getOverrideFont() const;
-
- //! Get the font which is used right now for drawing
- /** Currently this is the override font when one is set and the
- font of the active skin otherwise */
- virtual IGUIFont* getActiveFont() const;
-
- //! Sets another color for the text.
- virtual void setOverrideColor(video::SColor color);
-
- //! Gets the override color
- virtual video::SColor getOverrideColor() const;
-
- //! Sets if the text should use the overide color or the
- //! color in the gui skin.
- virtual void enableOverrideColor(bool enable);
-
- //! Checks if an override color is enabled
- /** \return true if the override color is enabled, false otherwise */
- virtual bool isOverrideColorEnabled(void) const;
-
- //! Sets whether to draw the background
- virtual void setDrawBackground(bool draw);
-
- //! Turns the border on or off
- virtual void setDrawBorder(bool border);
-
- //! Enables or disables word wrap for using the edit box as multiline text editor.
- virtual void setWordWrap(bool enable);
-
- //! Checks if word wrap is enabled
- //! \return true if word wrap is enabled, false otherwise
- virtual bool isWordWrapEnabled() const;
-
- //! Enables or disables newlines.
- /** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired,
- instead a newline character will be inserted. */
- virtual void setMultiLine(bool enable);
-
- //! Checks if multi line editing is enabled
- //! \return true if mult-line is enabled, false otherwise
- virtual bool isMultiLineEnabled() const;
-
- //! Enables or disables automatic scrolling with cursor position
- //! \param enable: If set to true, the text will move around with the cursor position
- virtual void setAutoScroll(bool enable);
-
- //! Checks to see if automatic scrolling is enabled
- //! \return true if automatic scrolling is enabled, false if not
- virtual bool isAutoScrollEnabled() const;
-
- //! Gets the size area of the text in the edit box
- //! \return Returns the size in pixels of the text
- virtual core::dimension2du getTextDimension();
-
- //! Sets text justification
- virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical);
-
- //! called if an event happened.
- virtual bool OnEvent(const SEvent& event);
-
- //! draws the element and its children
- virtual void draw();
-
- //! Sets the new caption of this element.
- virtual void setText(const wchar_t* text);
-
- //! Sets the maximum amount of characters which may be entered in the box.
- //! \param max: Maximum amount of characters. If 0, the character amount is
- //! infinity.
- virtual void setMax(u32 max);
-
- //! Returns maximum amount of characters, previously set by setMax();
- virtual u32 getMax() const;
-
- //! Sets whether the edit box is a password box. Setting this to true will
- /** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x
- \param passwordBox: true to enable password, false to disable
- \param passwordChar: the character that is displayed instead of letters */
- virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*');
-
- //! Returns true if the edit box is currently a password box.
- virtual bool isPasswordBox() const;
-
- //! Updates the absolute position, splits text if required
- virtual void updateAbsolutePosition();
-
- //! Writes attributes of the element.
- virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const;
-
- //! Reads attributes of the element
- virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
-
- protected:
- //! Breaks the single text line.
- void breakText();
- //! sets the area of the given line
- void setTextRect(s32 line);
- //! returns the line number that the cursor is on
- s32 getLineFromPos(s32 pos);
- //! adds a letter to the edit box
- void inputChar(wchar_t c);
- //! calculates the current scroll position
- void calculateScrollPos();
- //! send some gui event to parent
- void sendGuiEvent(EGUI_EVENT_TYPE type);
- //! set text markers
- void setTextMarkers(s32 begin, s32 end);
-
- bool processKey(const SEvent& event);
- bool processMouse(const SEvent& event);
- s32 getCursorPos(s32 x, s32 y);
-
- bool MouseMarking;
- bool Border;
- bool OverrideColorEnabled;
- s32 MarkBegin;
- s32 MarkEnd;
-
- video::SColor OverrideColor;
- gui::IGUIFont *OverrideFont, *LastBreakFont;
- IOSOperator* Operator;
-
- u32 BlinkStartTime;
- s32 CursorPos;
- s32 HScrollPos, VScrollPos; // scroll position in characters
- u32 Max;
-
- bool WordWrap, MultiLine, AutoScroll, PasswordBox;
- wchar_t PasswordChar;
- EGUI_ALIGNMENT HAlign, VAlign;
-
- core::array< core::stringw > BrokenText;
- core::array< s32 > BrokenTextPositions;
-
- core::rect<s32> CurrentTextRect, FrameRect; // temporary values
- };
-
-
-} // end namespace gui
-} // end namespace irr
-
-//#endif // _IRR_COMPILE_WITH_GUI_
-#endif // __C_GUI_EDIT_BOX_H_INCLUDED__