+// ----------------------------------------------------------------------------
+// flags handling
+// ----------------------------------------------------------------------------
+
+void wxTextCtrl::GTKSetEditable()
+{
+    gboolean editable = !HasFlag(wxTE_READONLY);
+    if ( IsSingleLine() )
+        gtk_editable_set_editable(GTK_EDITABLE(m_text), editable);
+    else
+        gtk_text_view_set_editable(GTK_TEXT_VIEW(m_text), editable);
+}
+
+void wxTextCtrl::GTKSetVisibility()
+{
+    // VZ: shouldn't we assert if wxTE_PASSWORD is set for multiline control?
+    if ( IsSingleLine() )
+        gtk_entry_set_visibility(GTK_ENTRY(m_text), !HasFlag(wxTE_PASSWORD));
+}
+
+void wxTextCtrl::GTKSetWrapMode()
+{
+    // no wrapping in single line controls
+    if ( !IsMultiLine() )
+        return;
+
+    // translate wx wrapping style to GTK+
+    GtkWrapMode wrap;
+    if ( HasFlag( wxTE_DONTWRAP ) )
+        wrap = GTK_WRAP_NONE;
+    else if ( HasFlag( wxTE_CHARWRAP ) )
+        wrap = GTK_WRAP_CHAR;
+    else if ( HasFlag( wxTE_WORDWRAP ) )
+        wrap = GTK_WRAP_WORD;
+    else // HasFlag(wxTE_BESTWRAP) always true as wxTE_BESTWRAP == 0
+    {
+        // GTK_WRAP_WORD_CHAR seems to be new in GTK+ 2.4
+#ifdef __WXGTK24__
+        if ( !gtk_check_version(2,4,0) )
+        {
+            wrap = GTK_WRAP_WORD_CHAR;
+        }
+        else
+#endif // __WXGTK24__
+        wrap = GTK_WRAP_WORD;
+    }
+
+    gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), wrap );
+}
+
+void wxTextCtrl::GTKSetJustification()
+{
+    if ( IsMultiLine() )
+    {
+        GtkJustification just;
+        if ( HasFlag(wxTE_RIGHT) )
+            just = GTK_JUSTIFY_RIGHT;
+        else if ( HasFlag(wxTE_CENTRE) )
+            just = GTK_JUSTIFY_CENTER;
+        else // wxTE_LEFT == 0
+            just = GTK_JUSTIFY_LEFT;
+
+        gtk_text_view_set_justification(GTK_TEXT_VIEW(m_text), just);
+    }
+    else // single line
+    {
+#ifdef __WXGTK24__
+        // gtk_entry_set_alignment was introduced in gtk+-2.3.5
+        if (!gtk_check_version(2,4,0))
+        {
+            gfloat align;
+            if ( HasFlag(wxTE_RIGHT) )
+                align = 1.0;
+            else if ( HasFlag(wxTE_CENTRE) )
+                align = 0.5;
+            else // single line
+                align = 0.0;
+
+            gtk_entry_set_alignment(GTK_ENTRY(m_text), align);
+        }
+#endif // __WXGTK24__
+    }
+
+}
+
+void wxTextCtrl::SetWindowStyleFlag(long style)
+{
+    long styleOld = GetWindowStyleFlag();
+
+    wxTextCtrlBase::SetWindowStyleFlag(style);
+
+    if ( (style & wxTE_READONLY) != (styleOld & wxTE_READONLY) )
+        GTKSetEditable();
+
+    if ( (style & wxTE_PASSWORD) != (styleOld & wxTE_PASSWORD) )
+        GTKSetVisibility();
+
+    static const long flagsWrap = wxTE_WORDWRAP | wxTE_CHARWRAP | wxTE_DONTWRAP;
+    if ( (style & flagsWrap) != (styleOld & flagsWrap) )
+        GTKSetWrapMode();
+
+    static const long flagsAlign = wxTE_LEFT | wxTE_CENTRE | wxTE_RIGHT;
+    if ( (style & flagsAlign) != (styleOld & flagsAlign) )
+        GTKSetJustification();
+}
+
+// ----------------------------------------------------------------------------
+// control value
+// ----------------------------------------------------------------------------
+