#include <sys/stat.h>
#include <ctype.h>
+#include <gtk/gtk.h>
#include "wx/gtk/private.h"
+#include "wx/gtk/private/gtk2-compat.h"
// ----------------------------------------------------------------------------
// helpers
GtkJustification align;
switch (attr.GetAlignment())
{
- default:
- align = GTK_JUSTIFY_LEFT;
- break;
case wxTEXT_ALIGNMENT_RIGHT:
align = GTK_JUSTIFY_RIGHT;
break;
case wxTEXT_ALIGNMENT_CENTER:
align = GTK_JUSTIFY_CENTER;
break;
+ case wxTEXT_ALIGNMENT_JUSTIFIED:
+#ifdef __WXGTK3__
+ align = GTK_JUSTIFY_FILL;
+ break;
+#elif GTK_CHECK_VERSION(2,11,0)
// gtk+ doesn't support justify before gtk+-2.11.0 with pango-1.17 being available
// (but if new enough pango isn't available it's a mere gtk warning)
-#if GTK_CHECK_VERSION(2,11,0)
- case wxTEXT_ALIGNMENT_JUSTIFIED:
if (!gtk_check_version(2,11,0))
+ {
align = GTK_JUSTIFY_FILL;
- else
- align = GTK_JUSTIFY_LEFT;
- break;
+ break;
+ }
+ // fallthrough
#endif
+ default:
+ align = GTK_JUSTIFY_LEFT;
+ break;
}
g_snprintf(buf, sizeof(buf), "WXALIGNMENT %d", align);
if ( win->IgnoreTextUpdate() )
return;
- if (!win->m_hasVMT) return;
-
if ( win->MarkDirtyOnChange() )
win->MarkDirty();
}
}
-//-----------------------------------------------------------------------------
-// clipboard events: "copy-clipboard", "cut-clipboard", "paste-clipboard"
-//-----------------------------------------------------------------------------
-
-// common part of the event handlers below
-static void
-handle_text_clipboard_callback( GtkWidget *widget, wxTextCtrl *win,
- wxEventType eventType, const gchar * signal_name)
-{
- wxClipboardTextEvent event( eventType, win->GetId() );
- event.SetEventObject( win );
- if ( win->HandleWindowEvent( event ) )
- {
- // don't let the default processing to take place if we did something
- // ourselves in the event handler
- g_signal_stop_emission_by_name (widget, signal_name);
- }
-}
-
-extern "C" {
-static void
-gtk_copy_clipboard_callback( GtkWidget *widget, wxTextCtrl *win )
-{
- handle_text_clipboard_callback(
- widget, win, wxEVT_COMMAND_TEXT_COPY, "copy-clipboard" );
-}
-
-static void
-gtk_cut_clipboard_callback( GtkWidget *widget, wxTextCtrl *win )
-{
- handle_text_clipboard_callback(
- widget, win, wxEVT_COMMAND_TEXT_CUT, "cut-clipboard" );
-}
-
-static void
-gtk_paste_clipboard_callback( GtkWidget *widget, wxTextCtrl *win )
-{
- handle_text_clipboard_callback(
- widget, win, wxEVT_COMMAND_TEXT_PASTE, "paste-clipboard" );
-}
-}
-
//-----------------------------------------------------------------------------
// "mark_set"
//-----------------------------------------------------------------------------
SetUpdateFont(false);
m_text = NULL;
+ m_buffer = NULL;
m_showPositionOnThaw = NULL;
m_anonymousMarkList = NULL;
}
wxTextCtrl::~wxTextCtrl()
{
+ if (m_text)
+ GTKDisconnect(m_text);
+ if (m_buffer)
+ GTKDisconnect(m_buffer);
+
+ // this is also done by wxWindowGTK dtor, but has to be done here so our
+ // DoThaw() override is called
+ while (IsFrozen())
+ Thaw();
+
if (m_anonymousMarkList)
g_slist_free(m_anonymousMarkList);
}
GtkTextIter start, end;
// We create our wxUrl tag here for slight efficiency gain - we
- // don't have to check for the tag existance in callbacks,
+ // don't have to check for the tag existence in callbacks,
// hereby it's guaranteed to exist.
gtk_text_buffer_create_tag(m_buffer, "wxUrl",
"foreground", "blue",
}
- g_signal_connect (m_text, "copy-clipboard",
- G_CALLBACK (gtk_copy_clipboard_callback), this);
- g_signal_connect (m_text, "cut-clipboard",
- G_CALLBACK (gtk_cut_clipboard_callback), this);
- g_signal_connect (m_text, "paste-clipboard",
- G_CALLBACK (gtk_paste_clipboard_callback), this);
+ GTKConnectClipboardSignals(m_text);
m_cursor = wxCursor( wxCURSOR_IBEAM );
if ( IsMultiLine() )
{
- return gtk_text_view_get_editable(GTK_TEXT_VIEW(m_text));
+ return gtk_text_view_get_editable(GTK_TEXT_VIEW(m_text)) != 0;
}
else
{
}
else
{
+#ifdef __WXGTK3__
+ // no access to internal GdkWindows
+ return NULL;
+#else
return gtk_entry_get_text_window(GTK_ENTRY(m_text));
+#endif
}
}
void wxTextCtrl::DoApplyWidgetStyle(GtkRcStyle *style)
{
- gtk_widget_modify_style(m_text, style);
+ GTKApplyStyle(m_text, style);
}
void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
wxSize wxTextCtrl::DoGetBestSize() const
{
- // FIXME should be different for multi-line controls...
- wxSize ret( wxControl::DoGetBestSize() );
- wxSize best(80, ret.y);
- CacheBestSize(best);
- return best;
+ return DoGetSizeFromTextSize(80);
}
+wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+ wxASSERT_MSG( m_widget, wxS("GetSizeFromTextSize called before creation") );
+
+ wxSize tsize(xlen, 0);
+ int cHeight = GetCharHeight();
+
+ if ( IsSingleLine() )
+ {
+ if ( HasFlag(wxBORDER_NONE) )
+ {
+ tsize.y = cHeight;
+#ifdef __WXGTK3__
+ tsize.IncBy(9, 0);
+#else
+ tsize.IncBy(4, 0);
+#endif // GTK3
+ }
+ else
+ {
+ // default height
+ tsize.y = GTKGetPreferredSize(m_widget).y;
+ // Add the margins we have previously set, but only the horizontal border
+ // as vertical one has been taken account at GTKGetPreferredSize().
+ // Also get other GTK+ margins.
+ tsize.IncBy( GTKGetEntryMargins(GetEntry()).x, 0);
+ }
+ }
+
+ //multiline
+ else
+ {
+ // add space for vertical scrollbar
+ if ( m_scrollBar[1] && !(m_windowStyle & wxTE_NO_VSCROLL) )
+ tsize.IncBy(GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[1])).x + 3, 0);
+
+ // height
+ tsize.y = cHeight;
+ if ( ylen <= 0 )
+ {
+ tsize.y = 1 + cHeight * wxMax(wxMin(GetNumberOfLines(), 10), 2);
+ // add space for horizontal scrollbar
+ if ( m_scrollBar[0] && (m_windowStyle & wxHSCROLL) )
+ tsize.IncBy(0, GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[0])).y + 3);
+ }
+
+ if ( !HasFlag(wxBORDER_NONE) )
+ {
+ // hardcode borders, margins, etc
+ tsize.IncBy(5, 4);
+ }
+ }
+
+ // Perhaps the user wants something different from CharHeight, or ylen
+ // is used as the height of a multiline text.
+ if ( ylen > 0 )
+ tsize.IncBy(0, ylen - cHeight);
+
+ return tsize;
+}
+
+
// ----------------------------------------------------------------------------
// freeze/thaw
// ----------------------------------------------------------------------------
{
wxCHECK_RET(m_text != NULL, wxT("invalid text ctrl"));
- wxWindow::DoFreeze();
+ GTKFreezeWidget(m_text);
if ( HasFlag(wxTE_MULTILINE) )
{
- GTKFreezeWidget(m_text);
-
// removing buffer dramatically speeds up insertion:
g_object_ref(m_buffer);
GtkTextBuffer* buf_new = gtk_text_buffer_new(NULL);
GTK_TEXT_VIEW(m_text), m_showPositionOnThaw);
m_showPositionOnThaw = NULL;
}
-
- // and thaw the window
- GTKThawWidget(m_text);
}
- wxWindow::DoThaw();
+ GTKThawWidget(m_text);
}
// ----------------------------------------------------------------------------
gtk_text_iter_forward_to_tag_toggle(&end, tag);
// Native context menu is probably not desired on an URL.
- // Consider making this dependant on ProcessEvent(wxTextUrlEvent) return value
+ // Consider making this dependent on ProcessEvent(wxTextUrlEvent) return value
if(event.GetEventType() == wxEVT_RIGHT_DOWN)
event.Skip(false);