| #pragma once |
| |
| #ifndef TNZ_TEXTFIELD_INCLUDED |
| #define TNZ_TEXTFIELD_INCLUDED |
| |
| #include "tw/tw.h" |
| #include "tw/textlistener.h" |
| |
| #undef DVAPI |
| #undef DVVAR |
| #ifdef TWIN_EXPORTS |
| #define DVAPI DV_EXPORT_API |
| #define DVVAR DV_EXPORT_VAR |
| #else |
| #define DVAPI DV_IMPORT_API |
| #define DVVAR DV_IMPORT_VAR |
| #endif |
| |
| #ifdef WIN32 |
| #pragma warning(push) |
| #pragma warning(disable : 4251) |
| #endif |
| |
| class DVAPI TTextField : public TWidget, public TTextListener { |
| public: |
| class Action { |
| public: |
| virtual ~Action() {} |
| virtual void sendCommand(std::wstring) = 0; |
| }; |
| |
| class Listener { |
| public: |
| virtual void onKeyPressed(int key){}; |
| virtual void onFocusChange(bool on){}; |
| virtual ~Listener() {} |
| }; |
| |
| protected: |
| std::wstring m_text, m_oldText; |
| int m_pos; |
| int m_sel0, m_sel1; |
| int m_off; |
| bool m_mouseDown; |
| int xToIndex(int x); |
| |
| std::vector<Action *> m_actions; |
| std::vector<Action *> m_commitActions; |
| Listener *m_listener; |
| |
| void updateOffset(); |
| |
| public: |
| TTextField(TWidget *parent, std::string name = "textfield"); |
| ~TTextField(); |
| |
| virtual void commit() {} |
| |
| void draw(); |
| void keyDown(int, TUINT32, const TPoint &); |
| void onDrop(std::wstring s); |
| |
| void leftButtonDoubleClick(const TMouseEvent &e); |
| |
| void leftButtonDown(const TMouseEvent &e); |
| void leftButtonDrag(const TMouseEvent &e); |
| void leftButtonUp(const TMouseEvent &e); |
| |
| std::wstring getText() const; |
| void setText(std::wstring s); |
| void setText(std::string s); |
| |
| |
| void select(int s0, int s1); |
| void selectAll(); |
| |
| void addAction(Action *action); |
| void addCommitAction(Action *action); |
| void setListener(Listener *listener); |
| |
| void onFocusChange(bool status); |
| FocusHandling getFocusHandling() const { return LISTEN_TO_FOCUS; } |
| |
| virtual void pasteText(std::wstring text); |
| virtual std::wstring copyText(); |
| virtual std::wstring cutText(); |
| |
| virtual void drawFieldText(const TPoint &origin, std::wstring text); |
| |
| #ifndef MACOSX |
| |
| |
| bool getCaret(TPoint &p, int &height); |
| #endif |
| |
| |
| |
| |
| int m_dy; |
| |
| virtual void sendCommand(); |
| virtual void sendCommitCommand(); |
| }; |
| |
| |
| |
| template <class T> |
| class TTextFieldAction : public TTextField::Action { |
| typedef void (T::*Method)(std::wstring text); |
| T *m_target; |
| Method m_method; |
| |
| public: |
| TTextFieldAction(T *target, Method method) |
| : m_target(target), m_method(method) {} |
| void sendCommand(std::wstring s) { (m_target->*m_method)(s); } |
| }; |
| |
| template <class T> |
| void tconnect(TTextField *fld, T *target, void (T::*method)(std::wstring s)) { |
| fld->addCommitAction(new TTextFieldAction<T>(target, method)); |
| } |
| |
| |
| |
| class DVAPI TNumField : public TTextField { |
| public: |
| class Event { |
| public: |
| TNumField *m_field; |
| double m_value; |
| enum Reason { KeyPressed, FocusChange, ReturnPressed }; |
| Reason m_reason; |
| Event(TNumField *field) |
| : m_field(field), m_value(field->getValue()), m_reason(KeyPressed) {} |
| }; |
| |
| class Action { |
| public: |
| virtual ~Action() {} |
| virtual void sendCommand(const Event &ev) = 0; |
| }; |
| |
| private: |
| double m_minValue, m_maxValue; |
| std::vector<Action *> m_numActions; |
| bool m_isInteger; |
| int m_precision; |
| |
| protected: |
| double m_value; |
| virtual void valueToText(); |
| virtual void textToValue(); |
| |
| void sendCommand(); |
| |
| public: |
| TNumField(TWidget *parent, std::string name = "numfield"); |
| ~TNumField(); |
| |
| void keyDown(int, TUINT32, const TPoint &); |
| |
| bool getIsInteger() const { return m_isInteger; } |
| void setIsInteger(bool isInteger); |
| |
| void setRange(double minValue, double maxValue); |
| void getRange(double &minValue, double &maxValue); |
| |
| void setPrecision(int precision) { m_precision = precision; } |
| int getPrecision() { return m_precision; } |
| |
| double getValue() const { return m_value; } |
| void setValue(double value); |
| |
| |
| void addAction(Action *action); |
| |
| void onFocusChange(bool status); |
| void pasteText(std::wstring text); |
| }; |
| |
| template <class T> |
| class TNumFieldAction : public TNumField::Action { |
| T *m_target; |
| typedef void (T::*Method)(const TNumField::Event &e); |
| Method m_method; |
| |
| public: |
| TNumFieldAction(T *target, Method method) |
| : m_target(target), m_method(method) {} |
| void sendCommand(const TNumField::Event &e) { (m_target->*m_method)(e); } |
| }; |
| |
| template <class T> |
| void tconnect(TNumField *nf, T *target, |
| void (T::*method)(const TNumField::Event &e)) { |
| nf->addAction(new TNumFieldAction<T>(target, method)); |
| } |
| |
| |
| |
| class TMeasuredValue; |
| |
| class DVAPI TMeasuredValueField : public TTextField { |
| public: |
| class Action { |
| public: |
| virtual ~Action() {} |
| virtual void sendCommand(TMeasuredValueField *field) = 0; |
| }; |
| |
| private: |
| TMeasuredValue *m_value; |
| std::vector<Action *> m_actions; |
| |
| public: |
| TMeasuredValueField(TWidget *parent, std::string name = "numfield"); |
| ~TMeasuredValueField(); |
| |
| void setMeasure(std::string name); |
| |
| TMeasuredValue *getMeasuredValue() const { return m_value; } |
| |
| void setValue(double v); |
| double getValue() const; |
| |
| void addAction(Action *action); |
| |
| |
| |
| |
| void commit(); |
| }; |
| |
| template <class T> |
| class TMeasuredValueFieldAction : public TMeasuredValueField::Action { |
| typedef void (T::*Method)(TMeasuredValueField *fld); |
| T *m_target; |
| Method m_method; |
| |
| public: |
| TMeasuredValueFieldAction(T *target, Method method) |
| : m_target(target), m_method(method) {} |
| void sendCommand(TMeasuredValueField *fld) { (m_target->*m_method)(fld); } |
| }; |
| |
| template <class T> |
| void tconnect(TMeasuredValueField *fld, T *target, |
| void (T::*method)(TMeasuredValueField *fld)) { |
| fld->addAction(new TMeasuredValueFieldAction<T>(target, method)); |
| } |
| |
| #ifdef WIN32 |
| #pragma warning(pop) |
| #endif |
| |
| #endif |