void wxTextEntry::SetSelection(long from, long to) { // in wx convention, (-1, -1) means the entire range but GTK+ translates -1 // (or any negative number for that matter) into last position so we need // to translate manually if ( from == -1 && to == -1 ) from = 0; // for compatibility with MSW, exchange from and to parameters so that the // insertion point is set to the start of the selection and not its end as // GTK+ does by default gtk_editable_select_region(GetEditable(), to, from); #ifndef __WXGTK3__ // avoid reported problem with RHEL 5 GTK+ 2.10 where selection is reset by // a clipboard callback, see #13277 if (gtk_check_version(2,12,0)) { GtkEntry* entry = GTK_ENTRY(GetEditable()); if (to < 0) to = entry->text_length; entry->selection_bound = to; } #endif }
bool GroupCell::SetEditableContent(wxString text) { if (GetEditable()) { GetEditable()->SetValue(text); return true; } else return false; }
void GroupCell::Hide(bool hide) { if (IsFoldable()) return; if (m_hide == hide) return; m_hide = hide; if ((m_groupType == GC_TYPE_TEXT) || (m_groupType == GC_TYPE_CODE)) GetEditable()->SetFirstLineOnly(m_hide); ResetSize(); GetEditable()->ResetSize(); }
bool wxTextEntry::DoAutoCompleteStrings(const wxArrayString& choices) { GtkEntry* const entry = (GtkEntry*)GetEditable(); wxCHECK_MSG(GTK_IS_ENTRY(entry), false, "auto completion doesn't work with this control"); GtkListStore * const store = gtk_list_store_new(1, G_TYPE_STRING); GtkTreeIter iter; #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for ( wxArrayString::const_iterator i = choices.begin(); i != choices.end(); ++i ) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, (const gchar *)i->utf8_str(), -1); } GtkEntryCompletion * const completion = gtk_entry_completion_new(); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); gtk_entry_completion_set_text_column(completion, 0); gtk_entry_set_completion(entry, completion); g_object_unref(completion); return true; }
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); }
void wxTextEntry::GetSelection(long *from, long *to) const { gint start, end; if ( gtk_editable_get_selection_bounds(GetEditable(), &start, &end) ) { // the output must always be in order, although in GTK+ it isn't if ( start > end ) { gint tmp = start; start = end; end = tmp; } } else // no selection { // for compatibility with MSW return the empty selection at cursor start = end = GetInsertionPoint(); } if ( from ) *from = start; if ( to ) *to = end; }
bool wxTextEntry::DoAutoCompleteStrings(const wxArrayString& choices) { GtkEntry* const entry = (GtkEntry*)GetEditable(); wxCHECK_MSG(GTK_IS_ENTRY(entry), false, "auto completion doesn't work with this control"); GtkListStore * const store = gtk_list_store_new(1, G_TYPE_STRING); GtkTreeIter iter; for ( wxArrayString::const_iterator i = choices.begin(); i != choices.end(); ++i ) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, (const gchar *)i->utf8_str(), -1); } GtkEntryCompletion * const completion = gtk_entry_completion_new(); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); gtk_entry_completion_set_text_column(completion, 0); gtk_entry_set_completion(entry, completion); g_object_unref(completion); return true; }
wxString wxTextEntry::DoGetValue() const { const wxGtkString value(gtk_editable_get_chars(GetEditable(), 0, -1)); return wxGTK_CONV_BACK_FONT(value, const_cast<wxTextEntry *>(this)->GetEditableWindow()->GetFont()); }
long wxTextEntry::GetLastPosition() const { // this can't be implemented for arbitrary GtkEditable so only do it for // GtkEntries GtkEntry * const entry = GTK_ENTRY(GetEditable()); return entry ? entry->text_length : - 1; }
void wxTextEntry::SetMaxLength(unsigned long len) { GtkEntry* const entry = (GtkEntry*)GetEditable(); if (!GTK_IS_ENTRY(entry)) return; gtk_entry_set_max_length(entry, len); }
void GroupCell::RemoveOutput() { DestroyOutput(); ResetSize(); m_height = GetEditable()->GetHeight(); m_output = NULL; m_lastInOutput = NULL; m_appendedCells = NULL; m_hide = false; }
long wxTextEntry::GetLastPosition() const { // this can't be implemented for arbitrary GtkEditable so only do it for // GtkEntries long pos = -1; GtkEntry* entry = (GtkEntry*)GetEditable(); if (GTK_IS_ENTRY(entry)) pos = gtk_entry_get_text_length(entry); return pos; }
void wxTextEntry::SetSelection(long from, long to) { // in wx convention, (-1, -1) means the entire range but GTK+ translates -1 // (or any negative number for that matter) into last position so we need // to translate manually if ( from == -1 && to == -1 ) from = 0; // for compatibility with MSW, exchange from and to parameters so that the // insertion point is set to the start of the selection and not its end as // GTK+ does by default gtk_editable_select_region(GetEditable(), to, from); }
void GroupCell::Hide(bool hide) { if (IsFoldable()) return; if (m_hide == hide) return; else { if (m_hide == false) { if ((m_groupType == GC_TYPE_TEXT) || (m_groupType == GC_TYPE_CODE)) GetEditable()->SetFirstLineOnly(true); m_hide = true; } else { if ((m_groupType == GC_TYPE_TEXT) || (m_groupType == GC_TYPE_CODE)) GetEditable()->SetFirstLineOnly(false); m_hide = false; } ResetSize(); GetEditable()->ResetSize(); } }
wxString GroupCell::ToString() { wxString str; if (GetEditable()) { str = m_input->ListToString(); if (m_output != NULL && !m_hide) { MathCell *tmp = m_output; while (tmp != NULL) { if (tmp->ForceBreakLineHere() && str.Length()>0) str += wxT("\n"); str += tmp->ToString(); tmp = tmp->m_nextToDraw; } } } return str; }
void wxTextEntry::SetMaxLength(unsigned long len) { GtkEntry * const entry = GTK_ENTRY(GetEditable()); if ( !entry ) return; gtk_entry_set_max_length(entry, len); // there is a bug in GTK+ 1.2.x: "changed" signal is emitted even if we had // tried to enter more text than allowed by max text length and the text // wasn't really changed // // to detect this and generate TEXT_MAXLEN event instead of TEXT_CHANGED // one in this case we also catch "insert_text" signal // // when max len is set to 0 we disconnect our handler as it means that we // shouldn't check anything any more if ( len ) { g_signal_connect ( entry, "insert_text", G_CALLBACK(wx_gtk_insert_text_callback), this ); } else // no max length { g_signal_handlers_disconnect_by_func ( entry, (gpointer)wx_gtk_insert_text_callback, this ); } }
void wxTextEntry::SetInsertionPoint(long pos) { gtk_editable_set_position(GetEditable(), pos); }
void wxTextEntry::SetEditable(bool editable) { gtk_editable_set_editable(GetEditable(), editable); }
bool wxTextEntry::IsEditable() const { return gtk_editable_get_editable(GetEditable()) != 0; }
wxString GroupCell::ToTeX(wxString imgDir, wxString filename, int *imgCounter) { wxString str; bool SuppressLeadingNewlines = true; // Now we might want to introduce some markdown: MarkDownTeX MarkDownParser; bool exportInput = true; wxConfig::Get()->Read(wxT("exportInput"), &exportInput); // pagebreak if (m_groupType == GC_TYPE_PAGEBREAK) { str = wxT("\\pagebreak\n"); SuppressLeadingNewlines = true; } // IMAGE CELLS else if (m_groupType == GC_TYPE_IMAGE && imgDir != wxEmptyString) { MathCell *copy = m_output->Copy(); (*imgCounter)++; wxString image = filename + wxString::Format(wxT("_%d"), *imgCounter); wxString file = imgDir + wxT("/") + image + wxT(".png"); Bitmap bmp; bmp.SetData(copy); if (!wxDirExists(imgDir)) wxMkdir(imgDir); if (bmp.ToFile(file).x>=0) { str << wxT("\\begin{figure}[htb]\n") << wxT(" \\begin{center}\n") << wxT(" \\includeimage{") << filename << wxT("_img/") << image << wxT("}\n") << wxT(" \\caption{") << PrepareForTeX(m_input->m_next->GetValue()) << wxT("}\n") << wxT(" \\end{center}\n") << wxT("\\end{figure}"); } } else if (m_groupType == GC_TYPE_IMAGE) str << wxT("\n\\vert|<<GRAPHICS>>|\n"); // CODE CELLS else if (m_groupType == GC_TYPE_CODE) { // Input cells if(exportInput) { str = wxT("\n\\noindent\n%%%%%%%%%%%%%%%\n") wxT("%%% INPUT:\n") wxT("\\begin{minipage}[t]{8ex}{\\color{red}\\bf\n") wxT("\\begin{verbatim}\n") + m_input->ToString() + wxT("\n\\end{verbatim}}\n\\end{minipage}"); if (m_input->m_next!=NULL) { wxString input = m_input->m_next->ToString(); #if wxUSE_UNICODE input.Replace(wxT("\x2212"), wxT("-")); // unicode minus sign input.Replace(wxT("\xDCB6"), wxT(" ")); // Some weird unicode space character #endif str += wxT("\n\\begin{minipage}[t]{\\textwidth}{\\color{blue}\n\\begin{verbatim}\n") + input + wxT("\n\\end{verbatim}}\n\\end{minipage}"); } str += wxT("\n"); } else str = wxEmptyString; if (m_output != NULL) { str += wxT("%%% OUTPUT:\n"); // Need to define labelcolor if this is Copy as LaTeX! if (imgCounter == NULL) str += wxT("\\definecolor{labelcolor}{RGB}{100,0,0}\n"); MathCell *tmp = m_output; bool mathMode = false; while (tmp != NULL) { if (tmp->GetType() == MC_TYPE_IMAGE || tmp->GetType() == MC_TYPE_SLIDE) { if (imgDir != wxEmptyString) { MathCell *copy = tmp->Copy(); (*imgCounter)++; wxString image = filename + wxString::Format(wxT("_%d"), *imgCounter); if (!wxDirExists(imgDir)) if (!wxMkdir(imgDir)) continue; // Do we want to output LaTeX animations? bool AnimateLaTeX=true; wxConfig::Get()->Read(wxT("AnimateLaTeX"), &AnimateLaTeX); if((tmp->GetType() == MC_TYPE_SLIDE)&&(AnimateLaTeX)) { SlideShow* src=(SlideShow *)tmp; str << wxT("\\begin{animateinline}{")+wxString::Format(wxT("%i"), src->GetFrameRate())+wxT("}\n"); for(int i=0;i<src->Length();i++) { wxString Frame = imgDir + wxT("/") + image + wxString::Format(wxT("_%i"), i); if((src->GetBitmap(i)).SaveFile(Frame+wxT(".png"))) str << wxT("\\includegraphics[width=.95\\linewidth,height=.80\\textheight,keepaspectratio]{")+Frame+wxT("}\n"); else str << wxT("\n\\verb|<<GRAPHICS>>|\n"); if(i<src->Length()-1) str << wxT("\\newframe"); } str << wxT("\\end{animateinline}"); } else { wxString file = imgDir + wxT("/") + image + wxT(".png"); Bitmap bmp; bmp.SetData(copy); if (bmp.ToFile(file).x>=0) str += wxT("\\includegraphics[width=.95\\linewidth,height=.80\\textheight,keepaspectratio]{") + filename + wxT("_img/") + image + wxT("}"); else str << wxT("\n\\verb|<<GRAPHICS>>|\n"); } } } else if (tmp->GetStyle() == TS_LABEL) { if(mathMode) str += wxT("\\end{math}\n\n\\begin{math}\\displaystyle\n"); else { str += wxT("\n\n\\begin{math}\\displaystyle\n"); mathMode=true; } str += wxT("\\parbox{8ex}{\\color{labelcolor}") + tmp->ToTeX() + wxT("}\n"); } else { if((tmp->GetStyle() == TS_DEFAULT)||(tmp->GetStyle() == TS_STRING)) { // We either got a bracket or a parenthesis or regular Text // that shouldn't be displayed as math. if((mathMode)&&(tmp->ToString().Length()>2)) { str += wxT("\\mbox{}"); str += wxT("\n\\end{math}\n"); mathMode = false; } } else { if(!mathMode) { str += wxT("\n\n\\begin{math}\\displaystyle\n"); mathMode = true; } } str += TexEscapeOutputCell(tmp->ToTeX()); } tmp = tmp->m_nextToDraw; } if(mathMode) { // Some invisible dummy content that keeps TeX happy if there really is // no output to display. str += wxT("\\mbox{}"); str += wxT("\n\\end{math}\n%%%%%%%%%%%%%%%\n"); } } } // TITLES, SECTIONS, SUBSECTIONS, SUBSUBSECTIONS, TEXT else if (GetEditable() != NULL && !m_hide) { str = GetEditable()->ListToTeX(); switch (GetEditable()->GetStyle()) { case TS_TITLE: str = wxT("\n\\pagebreak{}\n{\\Huge {\\sc ") + PrepareForTeX(str) + wxT("}}\n"); str += wxT("\\setcounter{section}{0}\n\\setcounter{subsection}{0}\n"); str += wxT("\\setcounter{figure}{0}\n\n"); break; case TS_SECTION: str = wxT("\n\\section{") + PrepareForTeX(str) + wxT("}\n\n"); break; case TS_SUBSECTION: str = wxT("\n\\subsection{") + PrepareForTeX(str) + wxT("}\n\n"); break; case TS_SUBSUBSECTION: str = wxT("\n\\subsubsection{") + PrepareForTeX(str) + wxT("}\n\n"); break; default: if (str.StartsWith(wxT("TeX:"))) str = str.Mid(5, str.Length()); else { str = PrepareForTeX(str); str = MarkDownParser.MarkDown(str); } break; } } return str; }
void GroupCell::Draw(CellParser& parser, wxPoint point, int fontsize) { double scale = parser.GetScale(); wxDC& dc = parser.GetDC(); if (m_width == -1 || m_height == -1) { RecalculateWidths(parser, fontsize); RecalculateSize(parser, fontsize); } if (DrawThisCell(parser, point)) { // draw a thick line for 'page break' // and return if (m_groupType == GC_TYPE_PAGEBREAK) { wxRect rect = GetRect(false); int y = rect.GetY(); wxPen pen(parser.GetColor(TS_CURSOR), 1, wxPENSTYLE_DOT); dc.SetPen(pen); dc.DrawLine(0, y , 10000, y); MathCell::Draw(parser, point, fontsize); return; } // // Paint background if we have a text cell // if (m_groupType == GC_TYPE_TEXT) { wxRect rect = GetRect(false); int y = rect.GetY(); if (m_height > 0 && m_width > 0 && y>=0) { wxBrush br(parser.GetColor(TS_TEXT_BACKGROUND)); dc.SetBrush(br); wxPen pen(parser.GetColor(TS_TEXT_BACKGROUND)); dc.SetPen(pen); dc.DrawRectangle(0, y , 10000, rect.GetHeight()); } } // // Draw input and output // SetPen(parser); wxPoint in(point); parser.Outdated(false); m_input->DrawList(parser, in, fontsize); if (m_groupType == GC_TYPE_CODE && m_input->m_next) parser.Outdated(((EditorCell *)(m_input->m_next))->ContainsChanges()); if (m_output != NULL && !m_hide) { MathCell *tmp = m_output; int drop = tmp->GetMaxDrop(); in.y += m_input->GetMaxDrop() + m_output->GetMaxCenter(); m_outputRect.y = in.y - m_output->GetMaxCenter(); m_outputRect.x = in.x; while (tmp != NULL) { if (!tmp->m_isBroken) { tmp->m_currentPoint.x = in.x; tmp->m_currentPoint.y = in.y; if (tmp->DrawThisCell(parser, in)) tmp->Draw(parser, in, MAX(tmp->IsMath() ? m_mathFontSize : m_fontSize, MC_MIN_SIZE)); if (tmp->m_nextToDraw != NULL) { if (tmp->m_nextToDraw->BreakLineHere()) { in.x = m_indent; in.y += drop + tmp->m_nextToDraw->GetMaxCenter(); if (tmp->m_bigSkip) in.y += MC_LINE_SKIP; drop = tmp->m_nextToDraw->GetMaxDrop(); } else in.x += (tmp->GetWidth() + MC_CELL_SKIP); } } else { if (tmp->m_nextToDraw != NULL && tmp->m_nextToDraw->BreakLineHere()) { in.x = m_indent; in.y += drop + tmp->m_nextToDraw->GetMaxCenter(); if (tmp->m_bigSkip) in.y += MC_LINE_SKIP; drop = tmp->m_nextToDraw->GetMaxDrop(); } } tmp = tmp->m_nextToDraw; } } parser.Outdated(false); MathCell *editable = GetEditable(); if (editable != NULL && editable->IsActive()) { dc.SetPen( *(wxThePenList->FindOrCreatePen(parser.GetColor(TS_ACTIVE_CELL_BRACKET), 2, wxPENSTYLE_SOLID))); // window linux, set a pen dc.SetBrush( *(wxTheBrushList->FindOrCreateBrush(parser.GetColor(TS_ACTIVE_CELL_BRACKET)))); //highlight c. } else { dc.SetPen( *(wxThePenList->FindOrCreatePen(parser.GetColor(TS_CELL_BRACKET), 1, wxPENSTYLE_SOLID))); // window linux, set a pen dc.SetBrush( *(wxTheBrushList->FindOrCreateBrush(parser.GetColor(TS_CELL_BRACKET)))); //highlight c. } if ((!m_hide) && (!m_hiddenTree)) { dc.SetBrush(*wxTRANSPARENT_BRUSH); } if (IsFoldable()) { // draw a square wxPoint *points = new wxPoint[4]; points[0].x = point.x - SCALE_PX(10, scale); points[0].y = point.y - m_center; points[1].x = point.x - SCALE_PX(10, scale); points[1].y = point.y - m_center + SCALE_PX(10, scale); points[2].x = point.x; points[2].y = point.y - m_center + SCALE_PX(10, scale); points[3].x = point.x; points[3].y = point.y - m_center; dc.DrawPolygon(4, points); delete [] points; } else { // draw a triangle and line wxPoint *points = new wxPoint[3]; points[0].x = point.x - SCALE_PX(10, scale); points[0].y = point.y - m_center; points[1].x = point.x - SCALE_PX(10, scale); points[1].y = point.y - m_center + SCALE_PX(10, scale); points[2].x = point.x; points[2].y = point.y - m_center; dc.DrawPolygon(3, points); delete [] points; // vertical dc.DrawLine(point.x - SCALE_PX(10, scale), point.y - m_center, point.x - SCALE_PX(10, scale), point.y - m_center + m_height); // bottom horizontal dc.DrawLine(point.x - SCALE_PX(10, scale), point.y - m_center + m_height, point.x - SCALE_PX(2, scale) , point.y - m_center + m_height); // middle horizontal if (m_groupType == GC_TYPE_CODE && m_output != NULL && !m_hide) { dc.DrawLine(point.x - SCALE_PX(6, scale), point.y - m_center + m_input->GetMaxHeight(), point.x - SCALE_PX(10, scale), point.y - m_center + m_input->GetMaxHeight()); } } UnsetPen(parser); } MathCell::Draw(parser, point, fontsize); }
wxString GroupCell::ToTeX(bool all, wxString imgDir, wxString filename, int *imgCounter) { wxString str; // pagebreak if (m_groupType == GC_TYPE_PAGEBREAK) { str = wxT("\\pagebreak\n"); } // IMAGE CELLS else if (m_groupType == GC_TYPE_IMAGE && imgDir != wxEmptyString) { MathCell *copy = m_output->Copy(false); (*imgCounter)++; wxString image = filename + wxString::Format(wxT("_%d.png"), *imgCounter); wxString file = imgDir + wxT("/") + image; Bitmap bmp; bmp.SetData(copy); if (!wxDirExists(imgDir)) wxMkdir(imgDir); if (bmp.ToFile(file)) { str << wxT("\\begin{figure}[htb]\n") << wxT(" \\begin{center}\n") << wxT(" \\includegraphics{") << filename << wxT("_img/") << image << wxT("}\n") << wxT(" \\caption{") << PrepareForTeX(m_input->m_next->GetValue()) << wxT("}\n") << wxT(" \\end{center}\n") << wxT("\\end{figure}"); } } else if (m_groupType == GC_TYPE_IMAGE) str << wxT("\n\\vert|<<GRAPHICS>>|\n"); // CODE CELLS else if (m_groupType == GC_TYPE_CODE) { // Input cells str = wxT("\n\\noindent\n%%%%%%%%%%%%%%%\n") wxT("%%% INPUT:\n") wxT("\\begin{minipage}[t]{8ex}{\\color{red}\\bf\n") wxT("\\begin{verbatim}\n") + m_input->ToString(false) + wxT("\n\\end{verbatim}}\n\\end{minipage}"); if (m_input->m_next!=NULL) { str += wxT("\n\\begin{minipage}[t]{\\textwidth}{\\color{blue}\n\\begin{verbatim}\n") + m_input->m_next->ToString(true) + wxT("\n\\end{verbatim}}\n\\end{minipage}"); } str += wxT("\n"); if (m_output != NULL) { str += wxT("%%% OUTPUT:\n"); // Need to define labelcolor if this is Copy as LaTeX! if (imgCounter == NULL) str += wxT("\\definecolor{labelcolor}{RGB}{100,0,0}\n"); str += wxT("\\begin{math}\\displaystyle\n"); MathCell *tmp = m_output; while (tmp != NULL) { if (tmp->GetType() == MC_TYPE_IMAGE || tmp->GetType() == MC_TYPE_SLIDE) { if (imgDir != wxEmptyString) { MathCell *copy = tmp->Copy(false); (*imgCounter)++; wxString image = filename + wxString::Format(wxT("_%d.png"), *imgCounter); wxString file = imgDir + wxT("/") + image; Bitmap bmp; bmp.SetData(copy); if (!wxDirExists(imgDir)) if (!wxMkdir(imgDir)) continue; if (bmp.ToFile(file)) str += wxT("\\includegraphics[width=9cm]{") + filename + wxT("_img/") + image + wxT("}"); } else str << wxT("\n\\verb|<<GRAPHICS>>|\n"); } else if (tmp->GetStyle() == TS_LABEL) { if (str.Right(13) != wxT("displaystyle\n")) str += wxT("\n\\end{math}\n\n\\begin{math}\\displaystyle\n"); str += wxT("\\parbox{8ex}{\\color{labelcolor}") + tmp->ToTeX(false) + wxT("}\n"); } else str += tmp->ToTeX(false); tmp = tmp->m_nextToDraw; } str += wxT("\n\\end{math}\n%%%%%%%%%%%%%%%\n"); } } // TITLES, SECTIONS, SUBSECTIONS, TEXT else if (GetEditable() != NULL && !m_hide) { str = GetEditable()->ToTeX(true); switch (GetEditable()->GetStyle()) { case TS_TITLE: str = wxT("\n\\pagebreak{}\n{\\Huge {\\sc ") + PrepareForTeX(str) + wxT("}}\n"); str += wxT("\\setcounter{section}{0}\n\\setcounter{subsection}{0}\n"); str += wxT("\\setcounter{figure}{0}\n\n"); break; case TS_SECTION: str = wxT("\n\\section{") + PrepareForTeX(str) + wxT("}\n\n"); break; case TS_SUBSECTION: str = wxT("\n\\subsection{") + PrepareForTeX(str) + wxT("}\n\n"); break; default: if (str.StartsWith(wxT("TeX:"))) str = str.Mid(5, str.Length()); else { str = PrepareForTeX(str); } break; } } return str + MathCell::ToTeX(all); }
long wxTextEntry::GetInsertionPoint() const { return gtk_editable_get_position(GetEditable()); }
void wxTextEntry::Paste() { gtk_editable_paste_clipboard(GetEditable()); }
void wxTextEntry::Cut() { gtk_editable_cut_clipboard(GetEditable()); }
void wxTextEntry::Copy() { gtk_editable_copy_clipboard(GetEditable()); }
void wxTextEntry::Remove(long from, long to) { gtk_editable_delete_text(GetEditable(), from, to); }