changeset 2240:7f6939857cca

Win: Added dw_window_set_color() support for Rich Edit based MLE controls. Added foreground and background color comboboxes and callbacks to dwtest.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 18 Jan 2021 23:43:54 +0000
parents 95ad22a4da2d
children 6f28c68642f5
files dwtest.c win/dw.c
diffstat 2 files changed, 154 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/dwtest.c	Fri Jan 15 19:22:27 2021 +0000
+++ b/dwtest.c	Mon Jan 18 23:43:54 2021 +0000
@@ -1202,6 +1202,113 @@
     return TRUE;
 }
 
+HWND color_combobox(void)
+{
+    HWND combobox = dw_combobox_new("DW_CLR_DEFAULT", 0);
+
+    dw_listbox_append(combobox, "DW_CLR_DEFAULT");
+    dw_listbox_append(combobox, "DW_CLR_BLACK");
+    dw_listbox_append(combobox, "DW_CLR_DARKRED");
+    dw_listbox_append(combobox, "DW_CLR_DARKGREEN");
+    dw_listbox_append(combobox, "DW_CLR_BROWN");
+    dw_listbox_append(combobox, "DW_CLR_DARKBLUE");
+    dw_listbox_append(combobox, "DW_CLR_DARKPINK");
+    dw_listbox_append(combobox, "DW_CLR_DARKCYAN");
+    dw_listbox_append(combobox, "DW_CLR_PALEGRAY");
+    dw_listbox_append(combobox, "DW_CLR_DARKGRAY");
+    dw_listbox_append(combobox, "DW_CLR_RED");
+    dw_listbox_append(combobox, "DW_CLR_GREEN");
+    dw_listbox_append(combobox, "DW_CLR_YELLOW");
+    dw_listbox_append(combobox, "DW_CLR_BLUE");
+    dw_listbox_append(combobox, "DW_CLR_PINK");
+    dw_listbox_append(combobox, "DW_CLR_CYAN");
+    dw_listbox_append(combobox, "DW_CLR_WHITE");
+    return combobox;
+}
+
+ULONG combobox_color(char *colortext)
+{
+    ULONG color = DW_CLR_DEFAULT;
+
+    if(strcmp(colortext, "DW_CLR_BLACK") == 0)
+        color = DW_CLR_BLACK;
+    else if(strcmp(colortext, "DW_CLR_DARKRED") == 0)
+        color = DW_CLR_DARKRED;
+    else if(strcmp(colortext, "DW_CLR_DARKGREEN") == 0)
+        color = DW_CLR_DARKGREEN;
+    else if(strcmp(colortext, "DW_CLR_BROWN") == 0)
+        color = DW_CLR_BROWN;
+    else if(strcmp(colortext, "DW_CLR_DARKBLUE") == 0)
+        color = DW_CLR_DARKBLUE;
+    else if(strcmp(colortext, "DW_CLR_DARKPINK") == 0)
+        color = DW_CLR_DARKPINK;
+    else if(strcmp(colortext, "DW_CLR_DARKCYAN") == 0)
+        color = DW_CLR_DARKCYAN;
+    else if(strcmp(colortext, "DW_CLR_PALEGRAY") == 0)
+        color = DW_CLR_PALEGRAY;
+    else if(strcmp(colortext, "DW_CLR_DARKGRAY") == 0)
+        color = DW_CLR_DARKGRAY;
+    else if(strcmp(colortext, "DW_CLR_RED") == 0)
+        color = DW_CLR_RED;
+    else if(strcmp(colortext, "DW_CLR_GREEN") == 0)
+        color = DW_CLR_GREEN;
+    else if(strcmp(colortext, "DW_CLR_YELLOW") == 0)
+        color = DW_CLR_YELLOW;
+    else if(strcmp(colortext, "DW_CLR_BLUE") == 0)
+        color = DW_CLR_BLUE;
+    else if(strcmp(colortext, "DW_CLR_PINK") == 0)
+        color = DW_CLR_PINK;
+    else if(strcmp(colortext, "DW_CLR_CYAN") == 0)
+        color = DW_CLR_CYAN;
+    else if(strcmp(colortext, "DW_CLR_WHITE") == 0)
+        color = DW_CLR_WHITE;
+
+    return color;
+}
+
+int DWSIGNAL mle_color_cb(HWND hwnd, int pos, void *data)
+{
+    HWND hbox = (HWND)data;
+    HWND mlefore = dw_window_get_data(hbox, "mlefore");
+    HWND mleback = dw_window_get_data(hbox, "mleback");
+    char colortext[101] = {0};
+    ULONG fore, back;
+
+    if(hwnd == mlefore)
+    {
+        dw_listbox_get_text(mlefore, pos, colortext, 100);
+        fore = combobox_color(colortext);
+    }
+    else
+    {
+        char *text = dw_window_get_text(mlefore);
+
+        if(text)
+        {
+            fore = combobox_color(text);
+            dw_free(text);
+        }
+    }
+    if(hwnd == mleback)
+    {
+        dw_listbox_get_text(mleback, pos, colortext, 100);
+        back = combobox_color(colortext);
+    }
+    else
+    {
+        char *text = dw_window_get_text(mleback);
+
+        if(text)
+        {
+            back = combobox_color(text);
+            dw_free(text);
+        }
+    }
+
+    dw_window_set_color(container_mle, fore, back);
+    return 0;
+}
+
 void container_add(void)
 {
     char *titles[4];
@@ -1215,16 +1322,36 @@
     CDATE date;
     unsigned long size, newpoint;
     HICN thisicon;
-    HWND checkbox;
+    HWND checkbox, mlefore, mleback, hbox;
 
     /* create a box to pack into the notebook page */
     containerbox = dw_box_new(DW_HORZ, 2);
-    dw_box_pack_start( notebookbox4, containerbox, 500, 200, TRUE, TRUE, 0);
+    dw_box_pack_start(notebookbox4, containerbox, 500, 200, TRUE, TRUE, 0);
 
     /* Add a word wrap checkbox */
-    checkbox = dw_checkbox_new("Word wrap", 0);
-    dw_box_pack_start( notebookbox4, checkbox, 100, -1, TRUE, FALSE, 1);
-    dw_checkbox_set(checkbox, TRUE);
+    {
+        HWND text;
+
+        hbox = dw_box_new(DW_HORZ, 0);
+
+        checkbox = dw_checkbox_new("Word wrap", 0);
+        dw_box_pack_start(hbox, checkbox, -1, -1, FALSE, TRUE, 1);
+        text = dw_text_new("Foreground:", 0);
+        dw_window_set_style(text, DW_DT_VCENTER, DW_DT_VCENTER);
+        dw_box_pack_start(hbox, text, -1, -1, FALSE, TRUE, 1);
+        mlefore = color_combobox();
+        dw_box_pack_start(hbox, mlefore, 150, -1, TRUE, FALSE, 1);
+        text = dw_text_new("Background:", 0);
+        dw_window_set_style(text, DW_DT_VCENTER, DW_DT_VCENTER);
+        dw_box_pack_start(hbox, text, -1, -1, FALSE, TRUE, 1);
+        mleback = color_combobox();
+        dw_box_pack_start(hbox, mleback, 150, -1, TRUE, FALSE, 1);
+        dw_checkbox_set(checkbox, TRUE);
+        dw_box_pack_start(notebookbox4, hbox, -1, -1, FALSE, FALSE, 1);
+
+        dw_window_set_data(hbox, "mlefore", DW_POINTER(mlefore));
+        dw_window_set_data(hbox, "mleback", DW_POINTER(mleback));
+    }
 
     /* now a container area under this box */
     container = dw_container_new(100, TRUE);
@@ -1288,7 +1415,7 @@
     dw_container_optimize(container);
 
     container_mle = dw_mle_new( 111 );
-    dw_box_pack_start( containerbox, container_mle, 500, 200, TRUE, TRUE, 0);
+    dw_box_pack_start(containerbox, container_mle, 500, 200, TRUE, TRUE, 0);
 
     mle_point = dw_mle_import(container_mle, "", -1);
     sprintf(buffer, "[%d]", mle_point);
@@ -1308,6 +1435,8 @@
     dw_signal_connect(container, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(container_select_cb), DW_POINTER(container_status));
     dw_signal_connect(container, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(column_click_cb), DW_POINTER(container_status));
     dw_signal_connect(checkbox, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(word_wrap_click_cb), DW_POINTER(container_mle));
+    dw_signal_connect(mlefore, DW_SIGNAL_LIST_SELECT, DW_SIGNAL_FUNC(mle_color_cb), DW_POINTER(hbox));
+    dw_signal_connect(mleback, DW_SIGNAL_LIST_SELECT, DW_SIGNAL_FUNC(mle_color_cb), DW_POINTER(hbox));
 }
 
 /* Beep every second */
--- a/win/dw.c	Fri Jan 15 19:22:27 2021 +0000
+++ b/win/dw.c	Mon Jan 18 23:43:54 2021 +0000
@@ -5852,6 +5852,25 @@
          thisbox->cinfo.back = back;
       }
    }
+#ifdef RICHEDIT
+   else if (_tcsnicmp(tmpbuf, RICHEDIT_CLASS, _tcslen(RICHEDIT_CLASS)+1) == 0 ||
+            _tcsnicmp(tmpbuf, MSFTEDIT_CLASS, _tcslen(MSFTEDIT_CLASS)+1) == 0)
+   {
+        ULONG _fore = _internal_color(fore);
+        ULONG _back = _internal_color(back);
+        CHARFORMAT cf;
+
+        SendMessage(handle, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf);
+        cf.cbSize = sizeof(cf);
+        cf.dwMask = CFM_COLOR;
+        cf.dwEffects = 0;
+        cf.crTextColor = RGB(DW_RED_VALUE(_fore), DW_GREEN_VALUE(_fore), DW_BLUE_VALUE(_fore)); 
+        SendMessage(handle, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf);
+
+        SendMessage(handle, EM_SETBKGNDCOLOR, (back == DW_CLR_DEFAULT || back == DW_RGB_TRANSPARENT) ? 1 : 0, 
+                    RGB(DW_RED_VALUE(_back), DW_GREEN_VALUE(_back), DW_BLUE_VALUE(_back)));
+   }
+#endif
 
    if(cinfo || (cinfo = _dw_window_new_cinfo(handle, TRUE)))
    {