diff --git a/include/nana/gui/widgets/combox.hpp b/include/nana/gui/widgets/combox.hpp index fdc22ac9..640a8060 100644 --- a/include/nana/gui/widgets/combox.hpp +++ b/include/nana/gui/widgets/combox.hpp @@ -29,7 +29,7 @@ namespace nana combox & widget; arg_combox(combox& wdg) - : widget(wdg) + : widget{ wdg } {} }; @@ -40,7 +40,8 @@ namespace nana struct combox_events : public general_events { - basic_event selected; + basic_event selected; + basic_event text_changed; }; class drawer_impl; diff --git a/include/nana/gui/widgets/skeletons/textbase.hpp b/include/nana/gui/widgets/skeletons/textbase.hpp index 3c1cae59..6bdcf105 100644 --- a/include/nana/gui/widgets/skeletons/textbase.hpp +++ b/include/nana/gui/widgets/skeletons/textbase.hpp @@ -1,7 +1,7 @@ /* * A textbase class implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -511,6 +511,9 @@ namespace skeletons _m_first_change(); changed_ = true; } + + if (evt_agent_) + evt_agent_->text_changed(); } private: std::deque text_cont_; diff --git a/include/nana/gui/widgets/skeletons/textbase_export_interface.hpp b/include/nana/gui/widgets/skeletons/textbase_export_interface.hpp index 6f474721..eeda5b45 100644 --- a/include/nana/gui/widgets/skeletons/textbase_export_interface.hpp +++ b/include/nana/gui/widgets/skeletons/textbase_export_interface.hpp @@ -1,7 +1,7 @@ /* * Definitions of textbase export interfaces * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -25,6 +25,7 @@ namespace nana{ namespace widgets virtual ~textbase_event_agent_interface() = default; virtual void first_change() = 0; ///< An event for the text first change after text has been opened or stored. + virtual void text_changed() = 0; ///< An event for the change of text. }; }//end namespace skeletons }//end namespace widgets diff --git a/include/nana/gui/widgets/spinbox.hpp b/include/nana/gui/widgets/spinbox.hpp index 29bee2f8..6c273bdb 100644 --- a/include/nana/gui/widgets/spinbox.hpp +++ b/include/nana/gui/widgets/spinbox.hpp @@ -17,10 +17,27 @@ namespace nana { + class spinbox; + + struct arg_spinbox + { + spinbox & widget; + + arg_spinbox(spinbox& wdg) + : widget{ wdg } + {} + }; + namespace drawerbase { namespace spinbox { + struct spinbox_events + : public general_events + { + basic_event text_changed; + }; + /// Declaration of internal spinbox implementation class implementation; @@ -58,7 +75,7 @@ namespace nana /// Spinbox Widget class spinbox - : public widget_object + : public widget_object { public: /// Constructs a spinbox. @@ -83,6 +100,7 @@ namespace nana /// Gets the spined value ::nana::string value() const; + void value(const ::nana::string&); int to_int() const; double to_double() const; diff --git a/include/nana/gui/widgets/textbox.hpp b/include/nana/gui/widgets/textbox.hpp index 83a7eab4..266a1ffd 100644 --- a/include/nana/gui/widgets/textbox.hpp +++ b/include/nana/gui/widgets/textbox.hpp @@ -40,14 +40,16 @@ namespace nana : public general_events { basic_event first_change; + basic_event text_changed; }; class event_agent : public widgets::skeletons::textbase_event_agent_interface { public: - event_agent(::nana::textbox& wdg); + event_agent(::nana::textbox&); void first_change() override; + void text_changed() override; private: ::nana::textbox & widget_; }; @@ -57,7 +59,7 @@ namespace nana : public drawer_trigger { public: - typedef widgets::skeletons::text_editor text_editor; + using text_editor = widgets::skeletons::text_editor; drawer(); text_editor * editor(); diff --git a/source/gui/widgets/combox.cpp b/source/gui/widgets/combox.cpp index 57ce2d26..7dbc5f6d 100644 --- a/source/gui/widgets/combox.cpp +++ b/source/gui/widgets/combox.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace nana { @@ -23,6 +24,24 @@ namespace nana { namespace combox { + class event_agent + : public widgets::skeletons::textbase_event_agent_interface + { + public: + event_agent(::nana::combox& wdg) + : widget_{wdg} + {} + + void first_change() override{} //empty, because combox does not have this event. + + void text_changed() override + { + widget_.events().text_changed.emit(::nana::arg_combox{ widget_ }); + } + private: + ::nana::combox & widget_; + }; + struct item : public float_listbox::item_interface { @@ -84,6 +103,9 @@ namespace nana editor_->multi_lines(false); editable(false); graph_ = &graph; + + evt_agent_.reset(new event_agent{ static_cast(wd) }); + editor_->textbase().set_event_agent(evt_agent_.get()); } void detached() @@ -508,7 +530,7 @@ namespace nana bool image_enabled_{ false }; unsigned image_pixels_{ 16 }; widgets::skeletons::text_editor * editor_{ nullptr }; - + std::unique_ptr evt_agent_; struct state_type { bool focused; diff --git a/source/gui/widgets/spinbox.cpp b/source/gui/widgets/spinbox.cpp index c33483c5..648fec07 100644 --- a/source/gui/widgets/spinbox.cpp +++ b/source/gui/widgets/spinbox.cpp @@ -21,6 +21,24 @@ namespace nana { namespace spinbox { + class event_agent + : public widgets::skeletons::textbase_event_agent_interface + { + public: + event_agent(::nana::spinbox& wdg) + : widget_{ wdg } + {} + + void first_change() override{} //empty, because spinbox does not have this event. + + void text_changed() override + { + widget_.events().text_changed.emit(::nana::arg_spinbox{ widget_ }); + } + private: + ::nana::spinbox & widget_; + }; + enum class buttons { none, increase, decrease @@ -32,6 +50,8 @@ namespace nana virtual ~range_interface() = default; virtual std::wstring value() const = 0; + virtual bool value(const std::wstring&) = 0; + virtual bool check_value(const std::wstring&) const = 0; virtual void spin(bool increase) = 0; }; @@ -51,6 +71,31 @@ namespace nana return ss.str(); } + bool value(const std::wstring& value_str) override + { + std::wstringstream ss; + ss << value_str; + + T v; + ss >> v; + if (begin_ <= v && v <= last_) + { + value_ = v; + return true; + } + return false; + } + + bool check_value(const std::wstring& value_str) const override + { + std::wstringstream ss; + ss << value_str; + + T v; + ss >> v; + return (begin_ <= v && v <= last_); + } + void spin(bool increase) override { if (increase) @@ -97,6 +142,27 @@ namespace nana return texts_[pos_]; } + bool value(const std::wstring& value_str) override + { + auto i = std::find(texts_.cbegin(), texts_.cend(), value_str); + if (i != texts_.cend()) + { + pos_ = i - texts_.cbegin(); + return true; + } + return false; + } + + bool check_value(const std::wstring& str) const override + { + for (auto & s : texts_) + { + if (s.find(str) != s.npos) + return true; + } + return false; + } + void spin(bool increase) override { if (texts_.empty()) @@ -147,6 +213,15 @@ namespace nana auto scheme = static_cast<::nana::widgets::skeletons::text_editor_scheme*>(API::dev::get_scheme(wd)); editor_ = new ::nana::widgets::skeletons::text_editor(wd, graph, scheme); editor_->multi_lines(false); + editor_->set_accept([this](::nana::char_t ch) + { + auto str = editor_->text(); + str += ch; + return range_->check_value(str); + }); + + evt_agent_.reset(new event_agent(static_cast(wdg))); + editor_->textbase().set_event_agent(evt_agent_.get()); if (!range_) range_.reset(new range_numeric(0, 100, 1)); @@ -171,6 +246,15 @@ namespace nana return range_->value(); } + bool value(const ::nana::string& value_str) + { + if (!range_->value(value_str)) + return false; + + _m_text(); + return true; + } + void set_range(std::unique_ptr ptr) { range_.swap(ptr); @@ -344,6 +428,7 @@ namespace nana private: ::nana::paint::graphics * graph_{nullptr}; ::nana::widgets::skeletons::text_editor * editor_{nullptr}; + std::unique_ptr evt_agent_; buttons spin_stated_{ buttons::none }; std::unique_ptr range_; ::nana::timer timer_; @@ -511,6 +596,16 @@ namespace nana return{}; } + void spinbox::value(const ::nana::string& s) + { + internal_scope_guard lock; + if (handle()) + { + if (get_drawer_trigger().impl()->value(s)) + API::refresh_window(handle()); + } + } + int spinbox::to_int() const { //std::stoi is not defined by MinGW diff --git a/source/gui/widgets/textbox.cpp b/source/gui/widgets/textbox.cpp index 142e1444..cc064328 100644 --- a/source/gui/widgets/textbox.cpp +++ b/source/gui/widgets/textbox.cpp @@ -27,7 +27,12 @@ namespace nana{ namespace drawerbase { { widget_.events().first_change.emit(::nana::arg_textbox{ widget_ }); } - // + + void event_agent::text_changed() + { + widget_.events().text_changed.emit(::nana::arg_textbox{ widget_ }); + } + //end class event_agent //class draweer drawer::drawer() diff --git a/source/internationalization.cpp b/source/internationalization.cpp index d070d0cd..2b868a87 100644 --- a/source/internationalization.cpp +++ b/source/internationalization.cpp @@ -145,14 +145,8 @@ namespace nana { static std::shared_ptr data_ptr; if (!data_ptr) - { data_ptr = std::make_shared(); - //Initialize the predefined language text - auto & table = data_ptr->table; - table["Nana.OK"].assign(L"OK"); - table["Nana.Cancel"].assign(L"Cancel"); - } return data_ptr; }