From fc76758197c8d46f631034cc473d647ba9760d05 Mon Sep 17 00:00:00 2001 From: cnjinhao Date: Sat, 31 Jan 2015 17:00:39 +0800 Subject: [PATCH] improve inputbox --- include/nana/gui/msgbox.hpp | 135 +++++- include/nana/gui/widgets/date_chooser.hpp | 5 +- source/gui/msgbox.cpp | 551 +++++++++++++++++++--- source/gui/widgets/date_chooser.cpp | 25 +- 4 files changed, 607 insertions(+), 109 deletions(-) diff --git a/include/nana/gui/msgbox.hpp b/include/nana/gui/msgbox.hpp index 6507ef01..ea60bcf6 100644 --- a/include/nana/gui/msgbox.hpp +++ b/include/nana/gui/msgbox.hpp @@ -1,7 +1,7 @@ /* * A Message Box Class * Nana C++ Library(http://www.nanapro.org) -* Copyright(C) 2003-2013 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 @@ -94,22 +94,133 @@ namespace nana class inputbox { - public: - inputbox(window, ::nana::string description, ::nana::string title = ::nana::string(), ::nana::string label = ::nana::string()); + struct abstract_content + { + virtual ~abstract_content() = default; - void set_modal(); - bool valid() const; - int get_int(int value, int begin, int last, int step); - double get_double(double value, double begin, double last, double step); - ::nana::string get_string(); + virtual const ::nana::string& label() const = 0; + virtual window create(window, unsigned label_px) = 0; + virtual unsigned fixed_pixels() const = 0; + }; + public: + class integer + : public abstract_content + { + struct implement; + public: + integer(::nana::string label, int init_value, int begin, int last, int step); + ~integer(); + + int value() const; + private: + //Implementation of abstract_content + const ::nana::string& label() const override; + window create(window, unsigned label_px) override; + unsigned fixed_pixels() const override; + private: + std::unique_ptr impl_; + }; + + class real + : public abstract_content + { + struct implement; + public: + real(::nana::string label, double init_value, double begin, double last, double step); + ~real(); + + double value() const; + private: + //Implementation of abstract_content + const ::nana::string& label() const override; + window create(window, unsigned label_px) override; + unsigned fixed_pixels() const override; + private: + std::unique_ptr impl_; + }; + + class text + : public abstract_content + { + struct implement; + public: + text(::nana::string label); + text(::nana::string label, std::vector<::nana::string>); + + ~text(); + + ::nana::string value() const; + private: + //Implementation of abstract_content + const ::nana::string& label() const override; + window create(window, unsigned label_px) override; + unsigned fixed_pixels() const override; + private: + std::unique_ptr impl_; + }; + + class date + : public abstract_content + { + struct implement; + public: + date(::nana::string label); + + ~date(); + + ::nana::string value() const; + int year() const; + int month() const; //[1, 12] + int day() const; //[1, 31] + unsigned fixed_pixels() const override; + private: + //Implementation of abstract_content + const ::nana::string& label() const override; + window create(window, unsigned label_px) override; + private: + std::unique_ptr impl_; + }; + + inputbox(window, ::nana::string description, ::nana::string title = ::nana::string()); + + template + bool show(Args&& ... args) + { + std::vector contents; + _m_fetch_args(contents, std::forward(args)...); + + if (contents.empty()) + return false; + + return _m_open(contents, false); + } + + template + bool show_modal(Args&& ... args) + { + std::vector contents; + _m_fetch_args(contents, std::forward(args)...); + + if (contents.empty()) + return false; + + return _m_open(contents, true); + } + private: + void _m_fetch_args(std::vector&); + + template + void _m_fetch_args(std::vector& contents, abstract_content& content, Args&&... args) + { + contents.push_back(&content); + _m_fetch_args(contents, std::forward(args)...); + } + + bool _m_open(std::vector&, bool modal); private: window owner_; - bool valid_input_; - bool modal_mode_; - ::nana::string description_; ::nana::string title_; - ::nana::string label_; }; }//end namespace nana diff --git a/include/nana/gui/widgets/date_chooser.hpp b/include/nana/gui/widgets/date_chooser.hpp index 5c9e3507..076ba51e 100644 --- a/include/nana/gui/widgets/date_chooser.hpp +++ b/include/nana/gui/widgets/date_chooser.hpp @@ -1,7 +1,7 @@ /* * A date chooser 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 @@ -43,7 +43,6 @@ namespace nana bool chose() const; nana::date read() const; void week_name(unsigned index, const nana::string&); - void month_name(unsigned index, const nana::string&); private: where _m_pos_where(graph_reference, const ::nana::point& pos); void _m_draw(graph_reference); @@ -64,7 +63,6 @@ namespace nana void mouse_up(graph_reference, const arg_mouse&) override; private: nana::string weekstr_[7]; - nana::string monthstr_[12]; widget * widget_; @@ -115,7 +113,6 @@ namespace nana bool chose() const; nana::date read() const; void weekstr(unsigned index, const nana::string&);/// //deprecated -//#include //deprecated #include #include #include #include +#include +#include +#include #include +#include #include #if defined(NANA_WINDOWS) #include @@ -471,53 +473,62 @@ namespace nana : public ::nana::form { public: - inputbox_window(window owner, const ::nana::string & desc, const ::nana::string& title, const ::nana::string& label, unsigned input_widget_size) + inputbox_window(window owner, const ::nana::string & desc, const ::nana::string& title, std::size_t contents, unsigned fixed_pixels) : form(owner, API::make_center(owner, 500, 300), appear::decorate<>()) { desc_.create(*this); desc_.format(true).caption(desc); auto desc_extent = desc_.measure(470); - desc_extent.height += 8; - - label_.create(*this); - label_.format(true).caption(label); - label_.text_align(::nana::align::left, ::nana::align_v::center); - auto label_extent = label_.measure(230); - label_extent.height += 8; btn_ok_.create(*this); - btn_ok_.i18n(i18n_eval("Nana.OK")); + btn_ok_.i18n(i18n_eval("OK")); btn_ok_.events().click([this]{ close(); valid_input_ = true; }); btn_cancel_.create(*this); - btn_cancel_.i18n(i18n_eval("Nana.Cancel")); + btn_cancel_.i18n(i18n_eval("Cancel")); btn_cancel_.events().click([this]{ close(); }); + unsigned height = 20 + desc_extent.height + 10 + 38; + place_.bind(*this); std::stringstream ss; - ss << "margin=10 vert >"; + ss << "margin=10 vert "; + height += 28 * contents; + + ss << ">>"; place_.div(ss.str().data()); place_["desc"] << desc_; - place_["label"] << label_; place_["buttons"] << btn_ok_ << btn_cancel_; - unsigned height = 20 + desc_extent.height + label_extent.height + 10 + 23; - size({ 500, height }); + if (desc_extent.width < 170) + desc_extent.width = 170; + + //Make sure the complete display of input extent + if (desc_extent.width < fixed_pixels) + desc_extent.width = fixed_pixels; + + size({ desc_extent.width + 20, height }); caption(title); } - void set_input(window handle) + void set_input(const std::vector& inputs) { - place_["input"] << handle; + std::size_t index = 0; + for (auto wd : inputs) + { + std::stringstream ss; + ss << "input_" << index++; + place_[ss.str().data()] << wd; + } place_.collocate(); show(); } @@ -528,88 +539,478 @@ namespace nana } private: ::nana::label desc_; - ::nana::label label_; ::nana::button btn_ok_; ::nana::button btn_cancel_; bool valid_input_{ false }; ::nana::place place_; }; - inputbox::inputbox(window owner, ::nana::string desc, ::nana::string title, ::nana::string label) - : owner_{ owner }, valid_input_{ false }, modal_mode_{false}, - description_(std::move(desc)), - title_(std::move(title)), - label_(std::move(label)) - {} - - void inputbox::set_modal() + //class integer + struct inputbox::integer::implement { - modal_mode_ = true; + int value; + int begin; + int last; + int step; + + ::nana::string label_text; + ::nana::panel dock; + ::nana::label label; + ::nana::spinbox spinbox; + }; + + inputbox::integer::integer(::nana::string label, int init_value, int begin, int last, int step) + : impl_(new implement) + { + auto impl = impl_.get(); + impl->value = init_value; + impl->begin = begin; + impl->last = last; + impl->step = step; + impl->label_text = std::move(label); } - bool inputbox::valid() const + //Instance for impl_ because implmenet is incomplete type at the point of declaration + inputbox::integer::~integer(){} + + int inputbox::integer::value() const { - return valid_input_; + return impl_->value; } - int inputbox::get_int(int value, int begin, int last, int step) + //Implementation of abstract_content + const ::nana::string& inputbox::integer::label() const { - int longest = (std::abs((begin < 0 ? begin * 10 : begin)) < std::abs(last < 0 ? last * 10 : last) ? last : begin); + return impl_->label_text; + } + + window inputbox::integer::create(window parent, unsigned label_px) + { + auto impl = impl_.get(); + impl->dock.create(parent); + + impl->label.create(impl->dock, rectangle{ 0, 0, label_px, 0 }); + impl->label.text_align(::nana::align::right, ::nana::align_v::center); + impl->label.caption(impl->label_text); + impl->label.format(true); + + //get the longest value + int longest = (std::abs((impl->begin < 0 ? impl->begin * 10 : impl->begin)) < std::abs(impl->last < 0 ? impl->last * 10 : impl->last) ? impl->last : impl->begin); std::wstringstream ss; ss << longest; paint::graphics graph{ ::nana::size{ 10, 10 } }; - auto input_widget_size = graph.text_extent_size(ss.str()).width + 34; - auto t1 = graph.typeface(); + auto value_px = graph.text_extent_size(ss.str()).width + 34; - inputbox_window inp_window(owner_, description_, title_, label_, input_widget_size); - ::nana::spinbox spinbox(inp_window); - spinbox.range(begin, last, step); - spinbox.set_accept_integer(); - inp_window.set_input(spinbox); - auto t2 = spinbox.typeface(); - if (modal_mode_) - inp_window.modality(); - else - API::wait_for(inp_window); + impl->spinbox.create(impl->dock, rectangle{ static_cast(label_px + 10), 0, value_px, 0 }); + impl->spinbox.range(impl->begin, impl->last, impl->step); + impl->spinbox.set_accept_integer(); - valid_input_ = inp_window.valid_input(); - return spinbox.to_int(); + //Workaround for no implementation of std::to_wstring by MinGW. + ss.str(L""); + ss.clear(); + ss << impl->value; + impl->spinbox.value(ss.str()); + + impl->dock.events().resized([impl, label_px, value_px](const ::nana::arg_resized& arg) + { + impl->label.size({ label_px, arg.height }); + impl->spinbox.size({ value_px, arg.height }); + }); + + impl->spinbox.events().destroy([impl] + { + impl->value = impl->spinbox.to_int(); + }); + + return impl->dock; } - double inputbox::get_double(double value, double begin, double last, double step) + unsigned inputbox::integer::fixed_pixels() const { - std::wstring longest; - for (auto i = begin; i < last; i += step) + return 0; + } + //end class integer + + + //class real + struct inputbox::real::implement + { + double value; + double begin; + double last; + double step; + + ::nana::string label_text; + ::nana::panel dock; + ::nana::label label; + ::nana::spinbox spinbox; + }; + + inputbox::real::real(::nana::string label, double init_value, double begin, double last, double step) + : impl_(new implement) + { + auto impl = impl_.get(); + impl->value = init_value; + impl->begin = begin; + impl->last = last; + impl->step = step; + impl->label_text = std::move(label); + } + + //Instance for impl_ because implmenet is incomplete type at the point of declaration + inputbox::real::~real(){} + + double inputbox::real::value() const + { + return impl_->value; + } + + //Implementation of abstract_content + const ::nana::string& inputbox::real::label() const + { + return impl_->label_text; + } + + window inputbox::real::create(window parent, unsigned label_px) + { + auto impl = impl_.get(); + impl->dock.create(parent); + + impl->label.create(impl->dock, rectangle{ 0, 0, label_px, 0 }); + impl->label.text_align(::nana::align::right, ::nana::align_v::center); + impl->label.caption(impl->label_text); + impl->label.format(true); + + //get the longest value + auto longest = (std::abs((impl->begin < 0 ? impl->begin * 10 : impl->begin)) < std::abs(impl->last < 0 ? impl->last * 10 : impl->last) ? impl->last : impl->begin); + std::wstringstream ss; + ss << longest; + paint::graphics graph{ ::nana::size{ 10, 10 } }; + auto value_px = graph.text_extent_size(ss.str()).width + 34; + + impl->spinbox.create(impl->dock, rectangle{ static_cast(label_px + 10), 0, value_px, 0 }); + impl->spinbox.range(impl->begin, impl->last, impl->step); + impl->spinbox.set_accept_real(); + + //Workaround for no implementation of std::to_wstring by MinGW. + ss.str(L""); + ss.clear(); + ss << impl->value; + impl->spinbox.value(ss.str()); + + impl->dock.events().resized([impl, label_px, value_px](const ::nana::arg_resized& arg) { - std::wstringstream ss; - ss << i; - auto str = ss.str(); - if (str.size() > longest.size()) - longest = str; + impl->label.size({ label_px, arg.height }); + impl->spinbox.size({ value_px, arg.height }); + }); + + impl->spinbox.events().destroy([impl] + { + impl->value = impl->spinbox.to_int(); + }); + + return impl->dock; + } + + unsigned inputbox::real::fixed_pixels() const + { + return 0; + } + //end class real + + + //class text + struct inputbox::text::implement + { + ::nana::string value; + std::vector< ::nana::string> options; + + ::nana::string label_text; + ::nana::panel dock; + ::nana::label label; + ::nana::combox combox; + ::nana::textbox textbox; + }; + + inputbox::text::text(::nana::string label) + : impl_(new implement) + { + impl_->label_text = std::move(label); + } + + inputbox::text::text(::nana::string label, std::vector<::nana::string> options) + : impl_(new implement) + { + impl_->options.swap(options); + impl_->label_text = std::move(label); + } + + //Instance for impl_ because implmenet is incomplete type at the point of declaration + inputbox::text::~text(){} + + ::nana::string inputbox::text::value() const + { + return impl_->value; + } + + //Implementation of abstract_content + const ::nana::string& inputbox::text::label() const + { + return impl_->label_text; + } + + window inputbox::text::create(window parent, unsigned label_px) + { + auto impl = impl_.get(); + impl->dock.create(parent); + + impl->label.create(impl->dock, rectangle{ 0, 0, label_px, 0 }); + impl->label.text_align(::nana::align::right, ::nana::align_v::center); + impl->label.caption(impl->label_text); + impl->label.format(true); + + unsigned value_px = 0; + if (impl->options.empty()) + { + impl->textbox.create(impl->dock, rectangle{ static_cast(label_px + 10), 0, 0, 0 }); + } + else + { + //get the longest value + paint::graphics graph{ ::nana::size{ 10, 10 } }; + for (auto & s : impl->options) + { + auto px = graph.text_extent_size(s).width; + if (px > value_px) + value_px = px; + } + value_px += 34; + + impl->combox.create(impl->dock, rectangle{ static_cast(label_px + 10), 0, value_px, 0 }); + + for (auto & s : impl->options) + impl->combox.push_back(s); } - paint::graphics graph{ ::nana::size{ 10, 10 } }; - auto input_widget_size = graph.text_extent_size(longest).width + 34; + impl->dock.events().resized([impl, label_px, value_px](const ::nana::arg_resized& arg) + { + impl->label.size({ label_px, arg.height }); + if (value_px) + impl->combox.size({ value_px, arg.height }); + else + impl->textbox.size({arg.width - label_px - 10, arg.height}); + }); - inputbox_window inp_window(owner_, description_, title_, label_, input_widget_size); - ::nana::spinbox spinbox(inp_window); - spinbox.range(begin, last, step); - spinbox.set_accept_real(); - inp_window.set_input(spinbox); - - if (modal_mode_) - inp_window.modality(); - else - API::wait_for(inp_window); - - valid_input_ = inp_window.valid_input(); - return spinbox.to_double(); + auto & wdg = (value_px ? static_cast(impl->combox) : static_cast(impl->textbox)); + wdg.events().destroy([&wdg, impl] + { + impl->value = wdg.caption(); + }); + return impl->dock; } - ::nana::string inputbox::get_string() + unsigned inputbox::text::fixed_pixels() const { - return{}; + return 0; + } + //end class text + + + //class date + struct inputbox::date::implement + { + int year; + int month; + int day; + + ::nana::string label_text; + ::nana::panel dock; + ::nana::label label; + ::nana::combox wdg_month; + ::nana::spinbox wdg_day; + ::nana::spinbox wdg_year; + }; + + inputbox::date::date(::nana::string label) + : impl_(new implement) + { + impl_->label_text = std::move(label); } + //Instance for impl_ because implmenet is incomplete type at the point of declaration + inputbox::date::~date(){} + + ::nana::string inputbox::date::value() const + { + std::wstringstream ss; + ss << impl_->month << L'-' << impl_->day << L", " << impl_->year; + return ss.str(); + } + + int inputbox::date::year() const + { + return impl_->year; + } + + int inputbox::date::month() const + { + return impl_->month; + } + int inputbox::date::day() const + { + return impl_->day; + } + + //Implementation of abstract_content + const ::nana::string& inputbox::date::label() const + { + return impl_->label_text; + } + + window inputbox::date::create(window parent, unsigned label_px) + { + auto impl = impl_.get(); + impl->dock.create(parent); + + impl->label.create(impl->dock, rectangle{ 0, 0, label_px, 0 }); + impl->label.text_align(::nana::align::right, ::nana::align_v::center); + impl->label.caption(impl->label_text); + impl->label.format(true); + + int left = static_cast(label_px + 10); + impl->wdg_month.create(impl->dock, rectangle{left, 0, 94, 0}); + + ::nana::internationalization i18n; + const char * monthstr[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; + for (auto i = std::begin(monthstr), end = std::end(monthstr); i != end; ++i) + impl->wdg_month.push_back(i18n(*i)); + + left += 104; + impl->wdg_day.create(impl->dock, rectangle{ left, 0, 38, 0 }); + impl->wdg_day.range(1, 31, 1); + impl->wdg_day.set_accept_integer(); + + left += 48; + impl->wdg_year.create(impl->dock, rectangle{left, 0, 50, 0}); + impl->wdg_year.range(1601, 9999, 1); + impl->wdg_year.set_accept_integer(); + + auto date = ::nana::date().read(); + impl->wdg_month.option(date.month - 1); + + std::wstringstream ss; + ss << date.day; + impl->wdg_day.value(ss.str()); + ss.str(L""); + ss.clear(); + ss << date.year; + impl->wdg_year.value(ss.str()); + + impl->dock.events().resized([impl, label_px](const ::nana::arg_resized& arg) + { + impl->label.size({ label_px, arg.height }); + auto sz = impl->wdg_month.size(); + sz.height = arg.height; + impl->wdg_month.size(sz); + + sz = impl->wdg_day.size(); + sz.height = arg.height; + impl->wdg_day.size(sz); + + sz = impl->wdg_year.size(); + sz.height = arg.height; + impl->wdg_year.size(sz); + }); + + impl->wdg_day.events().destroy([impl] + { + impl->day = impl->wdg_day.to_int(); + impl->month = impl->wdg_month.option() + 1; + }); + + impl->wdg_year.events().destroy([impl] + { + impl->year = impl->wdg_year.to_int(); + }); + + auto make_days = [impl] + { + int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + auto month = impl->wdg_month.option() + 1; + + if (2 == month) + { + auto year = impl->wdg_year.to_int(); + if (((0 == year % 4) && (year % 100)) || (0 == (year % 400))) + days[1] = 29; + } + + auto day = impl->wdg_day.to_int(); + impl->wdg_day.range(1, days[month - 1], 1); //It resets the current value of wdg_day + + if (day > days[month - 1]) + day = days[month - 1]; + + std::wstringstream ss; + ss << day; + impl->wdg_day.value(ss.str()); + }; + + impl->wdg_year.events().text_changed(make_days); + impl->wdg_month.events().selected(make_days); + + return impl->dock; + } + + unsigned inputbox::date::fixed_pixels() const + { + return 202; + } + //end class date + + + inputbox::inputbox(window owner, ::nana::string desc, ::nana::string title) + : owner_{ owner }, + description_(std::move(desc)), + title_(std::move(title)) + {} + + void inputbox::_m_fetch_args(std::vector&) + {} + + + bool inputbox::_m_open(std::vector& contents, bool modal) + { + unsigned label_px = 0, fixed_px = 0; + paint::graphics graph({ 5, 5 }); + for (auto p : contents) + { + auto px = graph.text_extent_size(p->label()).width; + if (px > label_px) + label_px = px; + + px = p->fixed_pixels(); + if (px > fixed_px) + fixed_px = px; + } + + if (label_px > 120) + label_px = 120; + + inputbox_window input_wd(owner_, description_, title_, contents.size(), label_px + 10 + fixed_px); + + std::vector inputs; + for (auto p : contents) + inputs.push_back(p->create(input_wd, label_px)); + + input_wd.set_input(inputs); + + if (modal) + input_wd.modality(); + else + API::wait_for(input_wd); + + return input_wd.valid_input(); + } //end class inputbox } diff --git a/source/gui/widgets/date_chooser.cpp b/source/gui/widgets/date_chooser.cpp index 0d25bccc..7ef18a10 100644 --- a/source/gui/widgets/date_chooser.cpp +++ b/source/gui/widgets/date_chooser.cpp @@ -1,7 +1,7 @@ /* * A date chooser 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 @@ -28,10 +28,7 @@ namespace nana : widget_(nullptr), chose_(false), page_(page::date), pos_(where::none) { const nana::string ws[] = {STR("S"), STR("M"), STR("T"), STR("W"), STR("T"), STR("F"), STR("S")}; - const nana::string ms[] = {STR("January"), STR("February"), STR("March"), STR("April"), STR("May"), STR("June"), STR("July"), STR("August"), STR("September"), STR("October"), STR("November"), STR("December")}; - for(int i = 0; i < 7; ++i) weekstr_[i] = ws[i]; - for(int i = 0; i < 12; ++i) monthstr_[i] = ms[i]; nana::date d; chdate_.year = chmonth_.year = d.read().year; @@ -60,12 +57,6 @@ namespace nana this->weekstr_[index] = str; } - void trigger::month_name(unsigned index, const nana::string& str) - { - if(0 <= index && index < 12) - this->monthstr_[index] = str; - } - trigger::where trigger::_m_pos_where(graph_reference graph, const ::nana::point& pos) { int xend = static_cast(graph.width()) - 1; @@ -132,6 +123,8 @@ namespace nana arrow.direction(::nana::direction::east); arrow.draw(graph, arrow_bgcolor, (pos_ == where::right_button ? color_.highlight : color_.normal), arrow_r, element_state::normal); + const char * monthstr[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; + if(graph.width() > 32 + border_size * 2) { std::stringstream ss; @@ -139,7 +132,7 @@ namespace nana nana::string str; if(page_ == page::date) { - str += monthstr_[chmonth_.month - 1]; + str += ::nana::internationalization()(monthstr[chmonth_.month - 1]); str += STR(" "); } str += nana::charset(ss.str()); @@ -313,11 +306,13 @@ namespace nana drawing_basis dbasis; _m_make_drawing_basis(dbasis, graph, refpos); + const char * monthstr[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; + ::nana::internationalization i18n; for(int y = 0; y < 3; ++y) for(int x = 0; x < 4; ++x) { int index = x + y * 4; - _m_draw_pos(dbasis, graph, x, y, monthstr_[index], true, (chmonth_.year == chdate_.year) && (index + 1 == chdate_.month)); + _m_draw_pos(dbasis, graph, x, y, i18n(monthstr[index]), true, (chmonth_.year == chdate_.year) && (index + 1 == chdate_.month)); } } @@ -663,11 +658,5 @@ namespace nana get_drawer_trigger().week_name(index, str); API::refresh_window(*this); } - - void date_chooser::monthstr(unsigned index, const nana::string& str) - { - get_drawer_trigger().month_name(index, str); - API::refresh_window(*this); - } //end class date_chooser }//end namespace nana