]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/textctrl.cpp
missing commit
[wxWidgets.git] / src / gtk / textctrl.cpp
index dcfe229e2205afa3b3cc169f0e5ceb64f106a717..10a90eaad78622c769de2343fc33f5984a2ad886 100644 (file)
@@ -461,6 +461,25 @@ au_check_range(GtkTextIter *s,
 //-----------------------------------------------------------------------------
 
 extern "C" {
+
+// Normal version used for detecting IME input and generating appropriate
+// events for it.
+void
+wx_insert_text_callback(GtkTextBuffer* buffer,
+                        GtkTextIter* WXUNUSED(end),
+                        gchar *text,
+                        gint WXUNUSED(len),
+                        wxTextCtrl *win)
+{
+    if ( win->GTKOnInsertText(text) )
+    {
+        // If we already handled the new text insertion, don't do it again.
+        g_signal_stop_emission_by_name (buffer, "insert_text");
+    }
+}
+
+
+// And an "after" version used for detecting URLs in the text.
 static void
 au_insert_text_callback(GtkTextBuffer * WXUNUSED(buffer),
                         GtkTextIter *end,
@@ -787,12 +806,19 @@ bool wxTextCtrl::Create( wxWindow *parent,
             gtk_text_buffer_get_end_iter(m_buffer, &end);
             au_check_range(&start, &end);
         }
+
+        // Also connect a normal (not "after") signal handler for checking for
+        // the IME-generated input.
+        g_signal_connect(m_buffer, "insert_text",
+                         G_CALLBACK(wx_insert_text_callback), this);
     }
     else // single line
     {
         // do the right thing with Enter presses depending on whether we have
         // wxTE_PROCESS_ENTER or not
         GTKSetActivatesDefault();
+
+        GTKConnectInsertTextSignal(GTK_ENTRY(m_text));
     }
 
 
@@ -815,6 +841,30 @@ GtkEntry *wxTextCtrl::GetEntry() const
     return GTK_ENTRY(m_text);
 }
 
+int wxTextCtrl::GTKIMFilterKeypress(GdkEventKey* event) const
+{
+#if GTK_CHECK_VERSION(2, 22, 0)
+    if ( gtk_check_version(2, 12, 0) == 0 )
+    {
+        if ( IsSingleLine() )
+        {
+            return wxTextEntry::GTKIMFilterKeypress(event);
+        }
+        else
+        {
+            return gtk_text_view_im_context_filter_keypress(
+                        GTK_TEXT_VIEW(m_text),
+                        event
+                    );
+        }
+    }
+#else // GTK+ < 2.22
+    wxUnusedVar(event);
+#endif // GTK+ 2.22+
+
+    return FALSE;
+}
+
 // ----------------------------------------------------------------------------
 // flags handling
 // ----------------------------------------------------------------------------
@@ -1291,26 +1341,6 @@ bool wxTextCtrl::Enable( bool enable )
     return true;
 }
 
-// wxGTK-specific: called recursively by Enable,
-// to give widgets an opportunity to correct their colours after they
-// have been changed by Enable
-void wxTextCtrl::OnEnabled(bool WXUNUSED(enable))
-{
-    // If we have a custom background colour, we use this colour in both
-    // disabled and enabled mode, or we end up with a different colour under the
-    // text.
-    wxColour oldColour = GetBackgroundColour();
-    if (oldColour.IsOk())
-    {
-        // Need to set twice or it'll optimize the useful stuff out
-        if (oldColour == * wxWHITE)
-            SetBackgroundColour(*wxBLACK);
-        else
-            SetBackgroundColour(*wxWHITE);
-        SetBackgroundColour(oldColour);
-    }
-}
-
 void wxTextCtrl::MarkDirty()
 {
     m_modified = true;
@@ -1588,7 +1618,7 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event )
     {
         if ( HasFlag(wxTE_PROCESS_ENTER) )
         {
-            wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
+            wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId);
             event.SetEventObject(this);
             event.SetString(GetValue());
             if ( HandleWindowEvent(event) )
@@ -1832,12 +1862,24 @@ wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
 
     if ( IsSingleLine() )
     {
-        // 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);
+        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
@@ -1851,17 +1893,21 @@ wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
         tsize.y = cHeight;
         if ( ylen <= 0 )
         {
-            tsize.y = cHeight * wxMax(wxMin(GetNumberOfLines(), 10), 2);
+            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);
         }
 
-        // hardcode borders, margins, etc
-        tsize.IncBy(5, 5);
+        if ( !HasFlag(wxBORDER_NONE) )
+        {
+            // hardcode borders, margins, etc
+            tsize.IncBy(5, 4);
+        }
     }
 
-    // Perhaps the user wants something different from CharHeight
+    // 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);
 
@@ -1993,7 +2039,7 @@ bool wxTextCtrl::GTKProcessEvent(wxEvent& event) const
 wxVisualAttributes
 wxTextCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
 {
-    return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true);
+    return GetDefaultAttributesFromGTKWidget(gtk_entry_new(), true);
 }
 
 #endif // wxUSE_TEXTCTRL