Posted to tcl by patthoyts at Thu Mar 05 22:47:36 GMT 2009view pretty

diff --git a/generic/ttk/ttkButton.c b/generic/ttk/ttkButton.c
index d901cc6..15548ea 100644
--- a/generic/ttk/ttkButton.c
+++ b/generic/ttk/ttkButton.c
@@ -11,8 +11,7 @@
 
 /* Bit fields for OptionSpec mask field:
  */
-#define STATE_CHANGED	 	(0x100)		/* -state option changed */
-#define DEFAULTSTATE_CHANGED	(0x200)		/* -default option changed */
+#define DEFAULTSTATE_CHANGED	(0x100)		/* -default option changed */
 
 /*------------------------------------------------------------------------
  * +++ Base resources for labels, buttons, checkbuttons, etc:
diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c
index d86e3f4..b775419 100644
--- a/generic/ttk/ttkEntry.c
+++ b/generic/ttk/ttkEntry.c
@@ -141,9 +141,8 @@ typedef struct {
 /*
  * Extra mask bits for Tk_SetOptions()
  */
-#define STATE_CHANGED	 	(0x100)	/* -state option changed */
-#define TEXTVAR_CHANGED	 	(0x200)	/* -textvariable option changed */
-#define SCROLLCMD_CHANGED	(0x400)	/* -xscrollcommand option changed */
+#define TEXTVAR_CHANGED	 	(0x100)	/* -textvariable option changed */
+#define SCROLLCMD_CHANGED	(0x200)	/* -xscrollcommand option changed */
 
 /*
  * Default option values:
diff --git a/generic/ttk/ttkTreeview.c b/generic/ttk/ttkTreeview.c
index a38ff68..06742c9 100644
--- a/generic/ttk/ttkTreeview.c
+++ b/generic/ttk/ttkTreeview.c
@@ -20,8 +20,6 @@ static const int HALO   		= 4;	/* separator */
 #define TTK_STATE_OPEN TTK_STATE_USER1
 #define TTK_STATE_LEAF TTK_STATE_USER2
 
-#define STATE_CHANGED	 	(0x100)	/* item state option changed */
-
 /*------------------------------------------------------------------------
  * +++ Tree items.
  *
diff --git a/generic/ttk/ttkWidget.c b/generic/ttk/ttkWidget.c
index 57b0d38..c1b7f06 100644
--- a/generic/ttk/ttkWidget.c
+++ b/generic/ttk/ttkWidget.c
@@ -454,6 +454,7 @@ int TtkWidgetConstructorObjCmd(
 
     Tcl_Release(corePtr);
 
+    UpdateLayout(interp, corePtr);
     SizeChanged(corePtr);
     Tk_MakeWindowExist(tkwin);
 
@@ -483,16 +484,27 @@ Ttk_Layout TtkWidgetGetLayout(
     Tcl_Interp *interp, Ttk_Theme themePtr, void *recordPtr)
 {
     WidgetCore *corePtr = recordPtr;
+    Ttk_Layout layout;
+    Tcl_DString ds;
     const char *styleName = 0;
 
+    Tcl_DStringInit(&ds);
     if (corePtr->styleObj)
     	styleName = Tcl_GetString(corePtr->styleObj);
 
-    if (!styleName || *styleName == '\0')
+    if (!styleName || *styleName == '\0') {
     	styleName = corePtr->widgetSpec->className;
+	if (corePtr->state & TTK_STATE_READONLY) {
+	    Tcl_DStringAppend(&ds, "Readonly.", -1);
+	    Tcl_DStringAppend(&ds, styleName, -1);
+	    styleName = Tcl_DStringValue(&ds);
+	}
+    }
 
-    return Ttk_CreateLayout(interp, themePtr, styleName,
+    layout = Ttk_CreateLayout(interp, themePtr, styleName,
 	recordPtr, corePtr->optionTable, corePtr->tkwin);
+    Tcl_DStringFree(&ds);
+    return layout;
 }
 
 /*
@@ -682,6 +694,10 @@ Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], void *recordPtr)
 	    SizeChanged(corePtr);
 	}
 
+	if (mask & STATE_CHANGED) {
+	    UpdateLayout(interp, corePtr);
+	}
+
 	TtkRedisplayWidget(corePtr);
 	result = Tcl_NewObj();
     }
@@ -727,6 +743,10 @@ int TtkWidgetStateCommand(
     corePtr->state = Ttk_ModifyState(corePtr->state, &spec);
     changed = corePtr->state ^ oldState;
 
+    if (changed) {
+	UpdateLayout(interp, corePtr);
+    }
+
     TtkRedisplayWidget(corePtr);
 
     Tcl_SetObjResult(interp,
diff --git a/generic/ttk/ttkWidget.h b/generic/ttk/ttkWidget.h
index b7b4c5d..9a0a394 100644
--- a/generic/ttk/ttkWidget.h
+++ b/generic/ttk/ttkWidget.h
@@ -20,6 +20,7 @@
 #define READONLY_OPTION 	0x1
 #define STYLE_CHANGED   	0x2
 #define GEOMETRY_CHANGED	0x4
+#define STATE_CHANGED	 	0x8	/* -state option changed */
 
 /*
  * Core widget elements
diff --git a/library/ttk/vistaTheme.tcl b/library/ttk/vistaTheme.tcl
index 76f3e3e..4ac15e4 100644
--- a/library/ttk/vistaTheme.tcl
+++ b/library/ttk/vistaTheme.tcl
@@ -51,6 +51,12 @@ namespace eval ttk::theme::vista {
 
         # Combobox
 	ttk::style configure TCombobox -padding 2
+	ttk::style map TCombobox \
+	    -selectbackground [list !focus SystemWindow] \
+	    -selectforeground [list !focus SystemWindowText] \
+	    -foreground	[list {readonly focus} SystemHighlightText] \
+	    -focusfill	[list {readonly focus} SystemHighlight] \
+	    ;
         ttk::style element create Combobox.field vsapi \
             COMBOBOX 2 {{} 1}
         ttk::style element create Combobox.border vsapi \
@@ -67,20 +73,30 @@ namespace eval ttk::theme::vista {
                 }
             }
         }
+	ttk::style map Readonly.TCombobox -foreground {} -focusfill {} \
+            -selectbackground {} -selectforeground {}
+        ttk::style element create Combobox.readonlyborder vsapi \
+            COMBOBOX 5 {disabled 4 pressed 3 active 2 hover 2 {} 1}
+        ttk::style element create Combobox.readonlyarrow vsapi \
+            COMBOBOX 6 {disabled 4 {} 1}
+        ttk::style layout Readonly.TCombobox {
+            Combobox.readonlyborder -sticky nswe -border 0 -children {
+                Combobox.readonlyarrow -side right -sticky ns
+                Combobox.padding -expand 1 -sticky nswe -children {
+                    focus -expand 1 -sticky nswe -children {
+                        Combobox.textarea -sticky nswe
+                    }
+                }
+            }
+        }
         # Vista.Combobox droplist frame
         ttk::style element create ComboboxPopdownFrame.background vsapi\
-            LISTBOX 3 {disabled 4 active 3 focus 2 {} 1}
+            LISTBOX 3 {disabled 4 active 3 focus 2 {} 1} -padding 2
         ttk::style layout ComboboxPopdownFrame {
             ComboboxPopdownFrame.background -sticky news -border 1 -children {
                 ComboboxPopdownFrame.padding -sticky news
             }
         }
-	ttk::style map TCombobox \
-	    -selectbackground [list !focus SystemWindow] \
-	    -selectforeground [list !focus SystemWindowText] \
-	    -foreground	[list {readonly focus} SystemHighlightText] \
-	    -focusfill	[list {readonly focus} SystemHighlight] \
-	    ;
 
         # Entry
         ttk::style configure TEntry -padding {1 1 1 1} ;# Needs lookup