ecere/gui/ListBox: Support for auto sizing a field to the largest value for this...
authorJerome St-Louis <jerome@ecere.com>
Wed, 1 Aug 2012 04:13:31 +0000 (00:13 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 1 Aug 2012 04:13:31 +0000 (00:13 -0400)
ecere/locale/ecere.pot
ecere/src/gui/controls/ListBox.ec

index fa2aa68..f20470e 100644 (file)
@@ -43,14 +43,14 @@ msgstr "Alt+"
 #: ./src/gui/controls/DropBox.ec:168
 #: ./src/gui/controls/EditBox.ec:739
 #: ./src/gui/controls/Label.ec:47
-#: ./src/gui/controls/ListBox.ec:946
-#: ./src/gui/controls/ListBox.ec:979
-#: ./src/gui/controls/ListBox.ec:980
+#: ./src/gui/controls/ListBox.ec:951
 #: ./src/gui/controls/ListBox.ec:984
-#: ./src/gui/controls/ListBox.ec:1011
-#: ./src/gui/controls/ListBox.ec:1012
-#: ./src/gui/controls/ListBox.ec:1013
-#: ./src/gui/controls/ListBox.ec:1014
+#: ./src/gui/controls/ListBox.ec:985
+#: ./src/gui/controls/ListBox.ec:989
+#: ./src/gui/controls/ListBox.ec:1016
+#: ./src/gui/controls/ListBox.ec:1017
+#: ./src/gui/controls/ListBox.ec:1018
+#: ./src/gui/controls/ListBox.ec:1019
 #: ./src/gui/controls/Picture.ec:19
 #: ./src/gui/controls/Picture.ec:39
 #: ./src/gui/controls/ScrollBar.ec:82
@@ -115,17 +115,17 @@ msgstr "August"
 #: ./src/gui/controls/EditBox.ec:741
 #: ./src/gui/controls/EditBox.ec:742
 #: ./src/gui/controls/Label.ec:18
-#: ./src/gui/controls/ListBox.ec:928
-#: ./src/gui/controls/ListBox.ec:967
-#: ./src/gui/controls/ListBox.ec:975
-#: ./src/gui/controls/ListBox.ec:976
-#: ./src/gui/controls/ListBox.ec:977
-#: ./src/gui/controls/ListBox.ec:978
-#: ./src/gui/controls/ListBox.ec:1009
-#: ./src/gui/controls/ListBox.ec:1010
+#: ./src/gui/controls/ListBox.ec:933
+#: ./src/gui/controls/ListBox.ec:972
+#: ./src/gui/controls/ListBox.ec:980
+#: ./src/gui/controls/ListBox.ec:981
+#: ./src/gui/controls/ListBox.ec:982
+#: ./src/gui/controls/ListBox.ec:983
+#: ./src/gui/controls/ListBox.ec:1014
 #: ./src/gui/controls/ListBox.ec:1015
-#: ./src/gui/controls/ListBox.ec:1016
 #: ./src/gui/controls/ListBox.ec:1020
+#: ./src/gui/controls/ListBox.ec:1021
+#: ./src/gui/controls/ListBox.ec:1025
 #: ./src/gui/controls/ScrollBar.ec:84
 #: ./src/gui/controls/ScrollBar.ec:88
 #: ./src/gui/controls/ScrollBar.ec:99
@@ -586,7 +586,7 @@ msgid "Please enter a name."
 msgstr "Please enter a name."
 
 #: ./src/gui/controls/DropBox.ec:98
-#: ./src/gui/controls/ListBox.ec:929
+#: ./src/gui/controls/ListBox.ec:934
 msgid "Private"
 msgstr "Private"
 
index 2840e7f..2c00882 100644 (file)
@@ -160,6 +160,41 @@ public:
       }
    }
 
+   void AutoSize()
+   {
+      if(listBox && dataType)
+      {
+         Display display = listBox.display;
+         Font boldFont = listBox.boldFont.font;
+         Font font = listBox.fontObject;
+         DataRow row;
+         int width = 0;
+         for(row = listBox.firstRow; row; row = row.next)
+         {
+            ListBoxCell cell;
+            uint i;
+            for(i = 0, cell = row.cells.first; i != index; i++, cell = cell.next);
+            if(cell && cell.isSet && dataType)
+            {
+               static char tempString[4096];
+               String string;
+               int tw = 0;
+               if(dataType.type == normalClass || dataType.type == noHeadClass)
+                  string = (char *)dataType._vTbl[__ecereVMethodID_class_OnGetString](dataType, cell.data[0], tempString, userData, null);
+               else
+                  string = (char *)dataType._vTbl[__ecereVMethodID_class_OnGetString](dataType, cell.data, tempString, userData, null);
+               if(string)
+                  display.FontExtent(row.header ? boldFont : font, string, strlen(string), &tw, null);
+               else
+                  display.FontExtent(row.header ? boldFont : font, "", 0, &tw, null);
+               if(tw > width) width = tw;
+            }
+         }
+         if(width)
+            property::width = width;
+      }
+   }
+
 private:
    DataField()
    {
@@ -995,6 +1030,7 @@ public:
                size.h = rowHeight;
                NotifyPushed = HeaderPushed;
                NotifyClicked = HeaderClicked;
+               NotifyDoubleClick = HeaderDoubleClicked;
                NotifyReleased = HeaderReleased;
                NotifyMouseMove = HeaderMouseMove;
             };
@@ -1126,6 +1162,7 @@ public:
                alignment = addedField.alignment;
                NotifyPushed = HeaderPushed;
                NotifyClicked = HeaderClicked;
+               NotifyDoubleClick = HeaderDoubleClicked;
                NotifyReleased = HeaderReleased;
                NotifyMouseMove = HeaderMouseMove;
             };
@@ -2868,6 +2905,32 @@ private:
       return true;
    }
 
+   bool HeaderDoubleClicked(Button control, int x, int y, Modifiers mods)
+   {
+      if(style.resizable)
+      {
+         DataField field = (DataField)control.id;
+         if(field)
+         {
+            if(x < RESIZE_BORDER && field.prev)
+               field = field.prev;
+            else if(x >= control.clientSize.w - RESIZE_BORDER);
+            else
+               field = null;
+         }
+         else
+         {
+            if(x < RESIZE_BORDER && fields.last)
+               field = fields.last;
+            else
+               field = null;
+         }
+         if(field)
+            field.AutoSize();
+      }
+      return false;
+   }
+
    watch(visible)
    {
       if(style.freeSelect)
@@ -2962,11 +3025,10 @@ private:
                      // Should always be as many cells in the row as fields in the listbox
                      if(cell && cell.isSet && field.dataType)
                      {
-                        Bitmap icon = null;
-                        char tempString[1024];
+                        static char tempString[4096];
                         char * string;
                         int tw, th;
-                        if(field.dataType.type == normalClass || field.dataType.type == noHeadClass)
+                        if(field.dataType.type == normalClass || field.dataType.type == noHeadClass)
                            string = (char *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString](field.dataType, cell.data[0], tempString, field.userData, null);
                         else
                            string = (char *)field.dataType._vTbl[__ecereVMethodID_class_OnGetString](field.dataType, cell.data, tempString, field.userData, null);