]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/textctrl.cpp
ignore clicks on a toolbar but outside any button
[wxWidgets.git] / src / gtk / textctrl.cpp
index 2cb16ddea1cc23bcb70f66297db64b93379c1d03..1c63ae186ea6967e14abacb3eec346d42b72a5b1 100644 (file)
@@ -41,6 +41,28 @@ extern bool g_isIdle;
 extern bool       g_blockEventsOnDrag;
 extern wxCursor   g_globalCursor;
 
+// ----------------------------------------------------------------------------
+// helpers
+// ----------------------------------------------------------------------------
+
+static void wxGtkTextInsert(GtkWidget *text,
+                            const wxTextAttr& attr,
+                            const char *txt,
+                            size_t len)
+{
+    GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont()
+                                   : NULL;
+
+    GdkColor *colFg = attr.HasTextColour() ? attr.GetTextColour().GetColor()
+                                           : NULL;
+
+    GdkColor *colBg = attr.HasBackgroundColour()
+                        ? attr.GetBackgroundColour().GetColor()
+                        : NULL;
+
+    gtk_text_insert( GTK_TEXT(text), font, colFg, colBg, txt, len );
+}
+
 // ----------------------------------------------------------------------------
 // "insert_text" for GtkEntry
 // ----------------------------------------------------------------------------
@@ -245,7 +267,7 @@ bool wxTextCtrl::Create( wxWindow *parent,
     }
 
     m_parent->DoAddChild( this );
-    
+
     m_focusWidget = m_text;
 
     PostCreation();
@@ -425,31 +447,20 @@ void wxTextCtrl::WriteText( const wxString &text )
     {
         // After cursor movements, gtk_text_get_point() is wrong by one.
         gtk_text_set_point( GTK_TEXT(m_text), GTK_EDITABLE(m_text)->current_pos );
-        
+
         // if we have any special style, use it
         if ( !m_defaultStyle.IsDefault() )
         {
-            GdkFont *font = m_defaultStyle.HasFont()
-                                ? m_defaultStyle.GetFont().GetInternalFont()
-                                : NULL;
-
-            GdkColor *colFg = m_defaultStyle.HasTextColour()
-                                ? m_defaultStyle.GetTextColour().GetColor()
-                                : NULL;
-
-            GdkColor *colBg = m_defaultStyle.HasBackgroundColour()
-                                ? m_defaultStyle.GetBackgroundColour().GetColor()
-                                : NULL;
-
             GetInsertionPoint();
-            gtk_text_insert( GTK_TEXT(m_text), font, colFg, colBg, txt, -1 );
+
+            wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen);
         }
         else // no style
         {
             gint len = GTK_EDITABLE(m_text)->current_pos;
             gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len );
         }
-        
+
         // Bring editable's cursor back uptodate.
         GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
     }
@@ -465,7 +476,7 @@ void wxTextCtrl::WriteText( const wxString &text )
         // Bring entry's cursor uptodate.
         gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
     }
-    
+
     m_modified = TRUE;
 }
 
@@ -780,9 +791,19 @@ void wxTextCtrl::SetSelection( long from, long to )
     gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
 }
 
-void wxTextCtrl::ShowPosition( long WXUNUSED(pos) )
+void wxTextCtrl::ShowPosition( long pos )
 {
-//    SetInsertionPoint( pos );
+    if (m_windowStyle & wxTE_MULTILINE)
+    {
+        GtkAdjustment *vp = GTK_TEXT(m_text)->vadj;
+        float totalLines =  (float) GetNumberOfLines();
+        long posX;
+        long posY;
+        PositionToXY(pos, &posX, &posY);
+        float posLine = (float) posY;
+        float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower;
+        gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p);
+    }
 }
 
 long wxTextCtrl::GetInsertionPoint() const
@@ -953,15 +974,22 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event )
 
     if ((key_event.KeyCode() == WXK_RETURN) && !(m_windowStyle & wxTE_MULTILINE))
     {
+        // This will invoke the dialog default action, such
+        // as the clicking the default button.
+    
         wxWindow *top_frame = m_parent;
         while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
             top_frame = top_frame->GetParent();
-        GtkWindow *window = GTK_WINDOW(top_frame->m_widget);
-
-        if (window->default_widget)
+        
+        if (top_frame && GTK_IS_WINDOW(top_frame->m_widget))
         {
-            gtk_widget_activate (window->default_widget);
-            return;
+            GtkWindow *window = GTK_WINDOW(top_frame->m_widget);
+
+            if (window->default_widget)
+            {
+                gtk_widget_activate (window->default_widget);
+                return;
+            }
         }
     }
 
@@ -986,7 +1014,7 @@ bool wxTextCtrl::SetFont( const wxFont &font )
 {
     wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 
-    if ( !wxWindowBase::SetFont(font) )
+    if ( !wxTextCtrlBase::SetFont(font) )
     {
         // font didn't change, nothing to do
         return FALSE;
@@ -1048,7 +1076,7 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
     if (!m_widget->window)
         return FALSE;
 
-    wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
+    wxColour sysbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE );
     if (sysbg.Red() == colour.Red() &&
         sysbg.Green() == colour.Green() &&
         sysbg.Blue() == colour.Blue())
@@ -1075,7 +1103,7 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
     return TRUE;
 }
 
-bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr &style )
+bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttrstyle )
 {
     /* VERY dirty way to do that - removes the required text and re-adds it
        with styling (FIXME) */
@@ -1109,19 +1137,13 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr &style )
         size_t txtlen = tmp.length();
 #endif
 
-        GdkFont *font = style.HasFont()
-                            ? style.GetFont().GetInternalFont()
-                            : NULL;
-
-        GdkColor *colFg = style.HasTextColour()
-                            ? style.GetTextColour().GetColor()
-                            : NULL;
-
-        GdkColor *colBg = style.HasBackgroundColour()
-                            ? style.GetBackgroundColour().GetColor()
-                            : NULL;
-
-        gtk_text_insert( GTK_TEXT(m_text), font, colFg, colBg, txt, txtlen );
+        // use the attributes from style which are set in it and fall back
+        // first to the default style and then to the text control default
+        // colours for the others
+        wxGtkTextInsert(m_text,
+                        wxTextAttr::Combine(style, m_defaultStyle, this),
+                        txt,
+                        txtlen);
 
         /* does not seem to help under GTK+ 1.2 !!!
         gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */