/* * Copyright 2010 Inalogic® Inc. * * 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 or 3.0 * of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License along with this program. If not, see * * Authored by: Jay Taoko * */ #ifndef KEYBOARDHANDLER_H #define KEYBOARDHANDLER_H #include #include "Utils.h" #include "NuxGraphics/FontTexture.h" #if defined(NUX_OS_WINDOWS) #include "NuxGraphics/Events.h" #elif defined(NUX_OS_LINUX) #include "NuxGraphics/Events.h" #endif #include "NuxCore/Color.h" namespace nux { class GraphicsEngine; class BaseKeyboardHandler { public: enum eKeyEntryType { eAlphaNumeric, eDecimalNumber, eIntegerNumber, eHexadecimalNumber, eBinaryNumber }; BaseKeyboardHandler(); virtual ~BaseKeyboardHandler(); virtual long ProcessKey( unsigned long eventType /*event type*/, unsigned long keysym /*event keysym*/, unsigned long state /*event state*/, char character /*character*/, const Geometry &g); std::string GetTextLine() const { return m_textline; } unsigned int GetLength() const { return (unsigned int) m_textline.length(); } unsigned int GetCursorPosition() const { return m_caret; } bool QueueDraw() const { return m_need_redraw; } int GetPositionX() const { return m_text_positionx; } int GetPositionY() const { return m_text_positiony; } void SetText(const char *str); void SetText(const std::string &s); void ClearText(); void PlaceCaret(unsigned int cp); void MoveCursorAtStart(); void MoveCursorAtEnd(); void SetKeyEntryType(eKeyEntryType keytype); eKeyEntryType GetKeyEntryType(); void SetClipRegion(const Geometry &g); void GetTextSelection(int *start, int *end) const; int GetTextSelectionStart() const; int GetTextSelectionEnd() const; std::string GetSelectedText() const; void SelectAllText(); void UnselectAllText(); bool IsTextSelected(); void SetPrefix(std::string); // 0x865, 25 rad, 25 degree... void SetPostfix(std::string); void EnterFocus(); unsigned int NextWordPosition(unsigned int cp); unsigned int PrevWordPosition(unsigned int cp); void ResolveCaretPosition(int x, int y); void CaretAutoScroll(int x, int y, Geometry geo); void MouseDown(int x, int y); void MouseUp(int x, int y); void MouseDrag(int x, int y); //bool IsMouseDrag(); void SetFont(ObjectPtr Font); ObjectPtr GetFont() const; protected: ObjectPtr m_Font; std::string m_textline; int m_previous_cursor_position; bool m_need_redraw; int m_text_positionx; int m_text_positiony; Geometry m_clip_region; eKeyEntryType m_KeyType; int m_caret; //!< Caret position, in characters bool m_insert_mode; //!< If true, control is in insert mode. Else, overwrite mode. int m_selection_start; //!< Starting position of the selection. The caret marks the end. int m_first_visible_char; //!< First visible character in the edit control void DeleteSelectionText(); void InsertChar(unsigned int character); void AdjustCursorAndTextPosition(); bool m_entering_focus; bool m_mouse_drag; // m_mouse_inside_text_area Detects the fast transition of the mouse from inside the text area to outside bool m_mouse_inside_text_area; /*! When the caret reaches the left or right border of the control and there are more characters to reveals, the caret jumps back in the opposite direction by a number of pixel at the same moment when new characters are revealed. */ static int s_jump_offset_at_borders; static int s_cursor_width; }; } #endif // KEYBOARDHANDLER_H