void wxTextEntry::WriteText(const wxString& value) { GtkEditable * const edit = GetEditable(); // remove the selection if there is one and suppress the text change event // generated by this: we only want to generate one event for this change, // not two { EventsSuppressor noevents(this); gtk_editable_delete_selection(edit); } // insert new text at the cursor position gint len = gtk_editable_get_position(edit); gtk_editable_insert_text ( edit, wxGTK_CONV_FONT(value, GetEditableWindow()->GetFont()), -1, // text: length: compute it using strlen() &len // will be updated to position after the text end ); // and move cursor to the end of new text gtk_editable_set_position(edit, len); }
// Notice we don't check here the font. It is supposed to be OK before the call. void wxTextMeasure::DoGetTextExtent(const wxString& string, wxCoord *width, wxCoord *height, wxCoord *descent, wxCoord *externalLeading) { if ( !m_context ) { if ( width ) *width = 0; if ( height ) *height = 0; return; } // Set layout's text const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(string, GetFont()); if ( !dataUTF8 ) { // hardly ideal, but what else can we do if conversion failed? wxLogLastError(wxT("GetTextExtent")); return; } pango_layout_set_text(m_layout, dataUTF8, -1); if ( m_dc ) { // in device units pango_layout_get_pixel_size(m_layout, width, height); } else // win { // the logical rect bounds the ink rect PangoRectangle rect; pango_layout_get_extents(m_layout, NULL, &rect); *width = PANGO_PIXELS(rect.width); *height = PANGO_PIXELS(rect.height); } if (descent) { PangoLayoutIter *iter = pango_layout_get_iter(m_layout); int baseline = pango_layout_iter_get_baseline(iter); pango_layout_iter_free(iter); *descent = *height - PANGO_PIXELS(baseline); } if (externalLeading) { // No support for MSW-like "external leading" in Pango. *externalLeading = 0; } }
bool wxTextMeasure::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths, double scaleX) { if ( !m_layout ) return wxTextMeasureBase::DoGetPartialTextExtents(text, widths, scaleX); // Set layout's text const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(text, GetFont()); if ( !dataUTF8 ) { // hardly ideal, but what else can we do if conversion failed? wxLogLastError(wxT("GetPartialTextExtents")); return false; } pango_layout_set_text(m_layout, dataUTF8, -1); // Calculate the position of each character based on the widths of // the previous characters // Code borrowed from Scintilla's PlatGTK PangoLayoutIter *iter = pango_layout_get_iter(m_layout); PangoRectangle pos; pango_layout_iter_get_cluster_extents(iter, NULL, &pos); size_t i = 0; while (pango_layout_iter_next_cluster(iter)) { pango_layout_iter_get_cluster_extents(iter, NULL, &pos); int position = PANGO_PIXELS(pos.x); widths[i++] = position; } const size_t len = text.length(); while (i < len) widths[i++] = PANGO_PIXELS(pos.x + pos.width); pango_layout_iter_free(iter); return true; }