diff --git a/source/gui/widgets/skeletons/text_editor.cpp b/source/gui/widgets/skeletons/text_editor.cpp index bde7e746..eceda23e 100644 --- a/source/gui/widgets/skeletons/text_editor.cpp +++ b/source/gui/widgets/skeletons/text_editor.cpp @@ -314,7 +314,13 @@ namespace nana{ namespace widgets if (pos.y > static_cast(textbase.lines())) pos.y = static_cast(textbase.lines()); - pos.x = editor_._m_pixels_by_char(textbase.getline(pos.y), pos.x) + editor_.text_area_.area.x; + std::unique_ptr mask_str; + if (editor_.mask_char_) + mask_str.reset(new nana::string(textbase.getline(pos.y).size(), editor_.mask_char_)); + + auto & lnstr = editor_.mask_char_ ? *mask_str : textbase.getline(pos.y); + + pos.x = editor_._m_pixels_by_char(lnstr, pos.x) + editor_.text_area_.area.x; int pos_y = static_cast((pos.y - editor_.points_.offset.y) * editor_.line_height() + editor_._m_text_top_base()); int pos_x = static_cast(pos.x - editor_.points_.offset.x); @@ -327,7 +333,13 @@ namespace nana{ namespace widgets nana::upoint res{ 0, static_cast(_m_textline_from_screen(scrpos.y)) }; //Convert the screen point to text caret point - const string_type& lnstr = editor_.textbase_.getline(res.y); + const string_type& real_str = editor_.textbase_.getline(res.y); + + std::unique_ptr mask_str; + if (editor_.mask_char_) + mask_str.reset(new nana::string(real_str.size(), editor_.mask_char_)); + + auto & lnstr = (editor_.mask_char_ ? *mask_str : real_str); if (lnstr.size() > 0) { scrpos.x += (editor_.points_.offset.x - editor_.text_area_.area.x); @@ -737,17 +749,24 @@ namespace nana{ namespace widgets nana::point scrpos; if (0 != pos.x) { + nana::string str; for (auto & sec : mtr.line_sections) { std::size_t chsize = sec.end - sec.begin; + str.clear(); + if (editor_.mask_char_) + str.append(chsize, editor_.mask_char_); + else + str.append(sec.begin, sec.end); + if (pos.x < chsize) { - scrpos.x = editor_._m_pixels_by_char(nana::string(sec.begin, sec.end), pos.x); + scrpos.x = editor_._m_pixels_by_char(str, pos.x); break; } else if (pos.x == chsize) { - scrpos.x = editor_._m_text_extent_size(nana::string(sec.begin, sec.end).data(), sec.end - sec.begin).width; + scrpos.x = editor_._m_text_extent_size(str.data(), sec.end - sec.begin).width; break; } else @@ -773,13 +792,19 @@ namespace nana{ namespace widgets return{ 0, static_cast(primary) }; //First of all, find the text of secondary. - auto str = mtr.line_sections[secondary]; + auto real_str = mtr.line_sections[secondary]; + + std::unique_ptr mask_str; + if (editor_.mask_char_) + mask_str.reset(new nana::string(real_str.end - real_str.begin, editor_.mask_char_)); + + const ::nana::char_t * str = (editor_.mask_char_ ? mask_str->data() : real_str.begin); std::vector reordered; unicode_bidi bidi; - bidi.linestr(str.begin, str.end - str.begin, reordered); + bidi.linestr(str, real_str.end - real_str.begin, reordered); - nana::upoint res(static_cast(str.begin - mtr.line_sections.front().begin), static_cast(primary)); + nana::upoint res(static_cast(real_str.begin - mtr.line_sections.front().begin), static_cast(primary)); scrpos.x -= editor_.text_area_.area.x; if (scrpos.x < 0) scrpos.x = 0; @@ -793,7 +818,7 @@ namespace nana{ namespace widgets std::unique_ptr pxbuf(new unsigned[len]); res.x += editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, _m_is_right_text(ent)); - res.x += static_cast(ent.begin - str.begin); + res.x += static_cast(ent.begin - str); return res; } scrpos.x -= str_px; @@ -2760,18 +2785,17 @@ namespace nana{ namespace widgets } } - void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& linestr, bool if_mask) const + void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& str, bool if_mask) const { ::nana::point text_pos{ text_area_.area.x - points_.offset.x, top }; const int xend = text_area_.area.x + static_cast(text_area_.area.width); + std::unique_ptr mask_str; if (if_mask && mask_char_) - { - nana::string maskstr; - maskstr.append(linestr.size(), mask_char_); - graph_.string(text_pos, maskstr, clr); - return; - } + mask_str.reset(new nana::string(str.size(), mask_char_)); + + + auto & linestr = (if_mask && mask_char_ ? *mask_str : str); unicode_bidi bidi; std::vector reordered;