sdk: const correctness
[sdk] / ide / src / designer / Sheet.ec
index 4567b17..0fc943f 100644 (file)
@@ -268,6 +268,9 @@ void SetProperty(Property prop, Instance object, DataValue value)
    }
 }
 
+static define sheetSelectionColor = Color { 170, 220, 255 };
+static define sheetSelectionText = black;
+
 class Sheet : Window
 {
    text = $"Sheet";
@@ -435,7 +438,7 @@ class Sheet : Window
          categorized.disabled = true;
 
          methods.Activate();
-                       
+
          // ((IDEWorkSpace)master).SheetSelected(Methods);
          return true;
       }
@@ -453,6 +456,8 @@ class Sheet : Window
       hasVertScroll = true, alwaysEdit = true, collapseControl = true, resizable = true;
       background = viewsBackground;
       foreground = viewsText;
+      selectionText = sheetSelectionText;
+      selectionColor = sheetSelectionColor;
 
       bool NotifySelect(ListBox control, DataRow row, Modifiers keyFlags)
       {
@@ -493,7 +498,7 @@ class Sheet : Window
       {
          CodeObject object = control.GetData(methodName);
          if(object)
-            codeEditor.AddMethod(object.method);   
+            codeEditor.AddMethod(object.method);
          return false;
       }
 
@@ -624,7 +629,7 @@ class Sheet : Window
       this, bevelOver = true, checked = true, inactive = true, position = { 0, 25 }, size = { 24, 24 };
       bitmap = { "<:ecere>elements/orderCategorized.png" };
       // isRadio = true;
-      
+
       bool NotifyClicked(Button button, int x, int y, Modifiers mods)
       {
          if(!categorized.checked)
@@ -649,7 +654,7 @@ class Sheet : Window
             dropBox.Clear();
             dropField.userData = codeEditor;
             methodName.userData = codeEditor;
-            
+
             if(codeEditor)
                codeEditor.EnumerateObjects(this);
           }
@@ -692,9 +697,9 @@ class Sheet : Window
       else if(key == escape)
       {
          Window activeClient = ide.activeClient;
-         if(activeClient) 
+         if(activeClient)
             activeClient.Activate();
-         else 
+         else
             ide.RepositionWindows(true);
       }
       return true;
@@ -716,7 +721,7 @@ class Sheet : Window
    {
       DataRow row = dropBox.currentRow;
       ObjectInfo selected = row ? (ObjectInfo)row.tag : null;
-      
+
       //int scroll = 0;
       bool categorized = this.categorized.checked;
       bool currentRow = false;
@@ -732,7 +737,7 @@ class Sheet : Window
             char * propName;
             while(propRow && propRow.parent && !propRow.parent.isHeader)
                propRow = row.parent;
-            
+
             propName = propRow.GetData(propertyName);
             strcpy(this.selectedProp, propName);
             selectedScroll = properties.scroll.y;
@@ -775,7 +780,7 @@ class Sheet : Window
                if(propIt.isProperty)
                {
                   Property prop = eClass_FindProperty(selected.instance._class, propIt.name, GetPrivateModule());
-                  
+
                   if(prop && prop.Set && prop.Get && prop.compiled && (!prop.category || strcmpi(prop.category, $"Deprecated")))
                   {
                      bool disabled = Code_IsPropertyDisabled(selected, prop.name);
@@ -786,17 +791,17 @@ class Sheet : Window
 
                      if(!strcmp(_class.name, "DesignerBase"))
                         disabled = true;
-                     bold = !disabled && Code_IsPropertyModified(test, selected, prop);                           
+                     bold = !disabled && Code_IsPropertyModified(test, selected, prop);
 
                      if(dataType)
                      {
                         DataRow row;
                         PropertyInfo info { prop, disabled, bold ? codeEditor.boldFont : codeEditor.normalFont };
-                        char * name = prop.category ? prop.category : $"Misc";
+                        const char * name = prop.category ? prop.category : $"Misc";
                         Category category = categories.FindName(name, false);
 
                         // Hide properties like this for now..
-                        if(name && !strcmp(name, "Private")) 
+                        if(name && !strcmp(name, "Private"))
                         {
                            delete info;
                            continue;
@@ -836,7 +841,7 @@ class Sheet : Window
                         if(!dataType.noExpansion && (dataType.type == structClass || dataType.type == normalClass || dataType.type == noHeadClass || dataType.type == bitClass))
                         {
                            DataMember member;
-                           
+
                            if(clear)
                               row.collapsed = true;
 
@@ -857,7 +862,7 @@ class Sheet : Window
                                     }
                                     else
                                        subRow = row.FindRow((int64)subProp);
-                                    
+
                                     subRow.SetData(propertyName, subProp.name);
                                     subRow.SetData(propertyValue, info);
                                  }
@@ -912,7 +917,7 @@ class Sheet : Window
             if(!properties.currentRow)
             {
                bool found = false;
-               
+
                for(_class = selected.instance._class; _class; _class = _class.base)
                {
                   Property prop;
@@ -923,12 +928,12 @@ class Sheet : Window
                         if(_class.defaultProperty && !strcmp(prop.name, _class.defaultProperty))
                         {
                            DataRow row;
-                           char * name = prop.category ? prop.category : $"Misc";
+                           const char * name = prop.category ? prop.category : $"Misc";
                            Category category = categories.FindName(name, false);
                            row = category ? (categorized ? category.row.FindRow((int64)prop) : properties.FindRow((int64)prop)) : null;
                            properties.currentRow = row;
                            found = true;
-                           break;                                                                                                                              
+                           break;
                         }
                      }
                   }
@@ -947,7 +952,7 @@ class Sheet : Window
       }
    }
 
-   void AddObject(ObjectInfo object, char * name, CodeObjectType type, bool select)
+   void AddObject(ObjectInfo object, const char * name, CodeObjectType type, bool select)
    {
       DataRow after = null;
       DataRow row;
@@ -966,10 +971,10 @@ class Sheet : Window
       }
 
       row = (DataRow)dropBox.AddRowAfter(after);
-      
+
       row.tag = (int64)object;
 
-      codeObject = 
+      codeObject =
       {
          object = object;
          name = name;
@@ -984,7 +989,7 @@ class Sheet : Window
          codeObject.bitmap = { bitmap };
          AddResource(codeObject.bitmap);
       }
-      
+
       row.SetData(null, codeObject);
 
       if(select)
@@ -1001,7 +1006,7 @@ class Sheet : Window
       if(row)
       {
          CodeObject codeObject = row.GetData(null);
-     
+
          if(codeObject.bitmap)
             RemoveResource(codeObject.bitmap);
          dropBox.DeleteRow(row);
@@ -1019,7 +1024,7 @@ class Sheet : Window
       }
    }
 
-   void RenameObject(ObjectInfo object, char * name)
+   void RenameObject(ObjectInfo object, const char * name)
    {
       DataRow row = dropBox.FindRow((int64)object);
       CodeObject codeObject = row.GetData(null);
@@ -1040,7 +1045,7 @@ class Sheet : Window
       Property prop = propertyPtr ? propertyPtr.prop : null;
       Instance object = this.object;
       if(prop)
-      {   
+      {
          Class dataType = prop.dataTypeClass;
          if(!dataType)
             dataType = prop.dataTypeClass = eSystem_FindClass(codeEditor.privateModule, prop.dataTypeString);
@@ -1138,7 +1143,7 @@ class Sheet : Window
          else
          {
             SetPropValue(prop, object, (uint32)setValue);
-         }      
+         }
          Code_FixProperty(propertyPtr.prop, object);
 
          properties.Update(null);
@@ -1204,7 +1209,7 @@ class Sheet : Window
       ClassFunction function = (ClassFunction)selection.id;
       CodeObject object = methods.GetData(methodName);
       if(object)
-         codeEditor.AddMethod(object.method);   
+         codeEditor.AddMethod(object.method);
       return true;
    }
 
@@ -1239,14 +1244,14 @@ class Sheet : Window
    {
       DataRow row = (DataRow)button.id;
       CodeObject object = row.GetData(methodName);
-      codeEditor.AddMethod(object.method);   
+      codeEditor.AddMethod(object.method);
       return true;
    }
 
    void CreateButtons(CodeObject codeObject, int y, int h, DataRow row)
    {
       BitmapResource bitmap;
-      
+
       if(codeObject.overriden)
       {
          if(codeObject.overriden == 1)
@@ -1271,7 +1276,7 @@ class Sheet : Window
                      sprintf(title, $"Delete %s", codeObject.name);
                      if(MessageBox
                         {
-                           master = parent, type = okCancel, text = title, 
+                           master = parent, type = okCancel, text = title,
                            contents = $"Method still contains code. Are you sure you want to delete it?"
                         }.Modal() == ok)
                         confirmation = false;
@@ -1303,7 +1308,7 @@ class Sheet : Window
 
          if(codeObject.overriden == 2 || !codeObject.function.attached.count)
          {
-            codeObject.detachBtn = Button 
+            codeObject.detachBtn = Button
             {
                methods,
                master = methods.master,
@@ -1348,7 +1353,7 @@ class Sheet : Window
                   PopupMenu popupMenu;
 
                   Menu menu { };
-                  
+
                   for(compatible = object.compatible.first; compatible; compatible = compatible.next)
                   {
                      ClassFunction function = compatible.data;
@@ -1357,8 +1362,8 @@ class Sheet : Window
                   attachMethod = object.method;
 
                   popupMenu = PopupMenu
-                  { 
-                     master = this, menu = menu, 
+                  {
+                     master = this, menu = menu,
                      position =
                      {
                         button.absPosition.x - app.desktop.position.x,
@@ -1385,7 +1390,7 @@ class Sheet : Window
    int selectedScroll;
 }
 
-static int String_OnCompare(char ** string1, char ** string2)
+static int String_OnCompare(const char ** string1, const char ** string2)
 {
    int result = 0;
    if(*string1 && *string2)
@@ -1404,7 +1409,7 @@ static void CopyInstanceData(Class dataType, Instance propObject, Instance curre
    {
       DataMember member;
       for(member = _class.membersAndProperties.first; member; member = member.next)
-      {               
+      {
          Class memberType = member.dataTypeClass;
          if(!memberType)
             memberType = member.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, member.dataTypeString);
@@ -1414,12 +1419,12 @@ static void CopyInstanceData(Class dataType, Instance propObject, Instance curre
             if(subProp.Get && subProp.Set)
                CopyProperty(subProp, propObject, current);
          }
-         else
+         else if(member.id > -1)
          {
             if(memberType)
                // TOCHECK: I have serious doubts this works in many cases.
                ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCopy])(memberType, (byte *)propObject + member.offset, (byte *)current + member.offset);
-            else if(member.memberOffset)
+            else
                memcpy((byte *)propObject + member.offset, (byte *)current + member.offset, member.memberOffset);
          }
       }
@@ -1432,7 +1437,7 @@ public:
    Property prop;
    bool disabled;
    FontResource font;
-   char * categoryName;
+   const char * categoryName;
    DataMember subMember;
    Property subProperty;
    uint extraOffset;
@@ -1443,7 +1448,7 @@ public:
 
       surface.TextFont(font.font);
       if(disabled)
-      {  
+      {
          surface.SetBackground(Color { 170, 170, 170 });
          surface.Area(0,0, x+width-1, y+100);
       }
@@ -1453,13 +1458,13 @@ public:
          Module module = ((Designer)GetActiveDesigner()).codeEditor.privateModule;
          if(!dataType)
             dataType = prop.dataTypeClass = eSystem_FindClass(module, prop.dataTypeString);
-         
+
          if(dataType && prop.Get)
          {
             void * dataPtr, * data = null, * subData = null;
             DataValue valueData, valueSubData;
             uint64 bitValue;
-            
+
             // Get main prop
             if(dataType.type == structClass)
             {
@@ -1476,7 +1481,7 @@ public:
                else
                   dataPtr = &valueData;
             }
-            
+
             // Get sub prop
             if(this.subMember)
             {
@@ -1537,7 +1542,7 @@ public:
    {
       Window editData = null;
       Property prop = this.prop;
-      
+
       dataBox.SetData = Sheet::EditSetData;
       if(prop && prop.dataTypeString && !this.disabled)
       {
@@ -1552,7 +1557,8 @@ public:
             void * dataPtr, * data = null, * subData = null;
             DataValue valueData, valueSubData;
             uint64 bitValue;
-            
+            bool isEditBoxMultiLineContents = false;
+
             // Get main prop
             if(dataType.type == structClass)
             {
@@ -1562,13 +1568,25 @@ public:
             }
             else
             {
-               GetProperty(prop, object, &valueData);
+               bool freeDataForm = false, freeDataTest = false;
+               // Because contents property is broken for mutiline EditBox at the moment
+               if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox") && ((EditBox)object).multiLine)
+               {
+                  isEditBoxMultiLineContents = true;
+                  dataType = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, "MultiLineString");
+                  valueData.p = ((EditBox)object).multiLineContents;
+                  dataBox.size.h = 3*(h-2);
+                  h = dataBox.clientSize.h;
+               }
+               else
+                  GetProperty(prop, object, &valueData);
+
                if(dataType.type == normalClass)
                   dataPtr = valueData.p;
                else
                   dataPtr = &valueData;
             }
-            
+
             // Get sub prop
             if(this.subMember)
             {
@@ -1622,7 +1640,22 @@ public:
             delete data;
             delete subData;
 
+            if(isEditBoxMultiLineContents)
+               delete valueData.p;
+
             editData.font = { font.faceName, font.size, font.bold };
+            if(eClass_IsDerived(editData._class, class(DropBox)))
+            {
+               DropBox db = (DropBox)editData;
+               db.selectionColor = sheetSelectionColor;
+               db.selectionText = sheetSelectionText;
+            }
+            else if(eClass_IsDerived(editData._class, class(EditBox)))
+            {
+               EditBox eb = (EditBox)editData;
+               eb.selectionColor = sheetSelectionColor;
+               eb.selectionText = sheetSelectionText;
+            }
          }
       }
       return editData;
@@ -1630,16 +1663,15 @@ public:
 
    int OnCompare(PropertyInfo data2)
    {
-      char * category1 = prop ? prop.category : categoryName;
-      char * category2 = data2.prop ? data2.prop.category : data2.categoryName;
+      const char * category1 = prop ? prop.category : categoryName;
+      const char * category2 = data2.prop ? data2.prop.category : data2.categoryName;
       int result;
 
       if(!category1) category1 = $"Misc";
       if(!category2) category2 = $"Misc";
-      
+
       if(!prop)
       {
-         // result = String::OnCompare((String)category1, (String)category2);
          result = String_OnCompare(&category1, &category2);
       }
       else
@@ -1686,7 +1718,7 @@ public:
          else
             // result = ((String)prop.name).OnCompare(data2.prop.name);
             // result = String::OnCompare((String)prop.name, (String)data2.prop.name);
-            result = String_OnCompare(&prop.name, &data2.prop.name);
+            result = String_OnCompare((const char **)&prop.name, (const char **)&data2.prop.name);
       }
       return result;
    }
@@ -1709,7 +1741,11 @@ public:
          if(!mainDataType)
             mainDataType = prop.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, prop.dataTypeString);
          dataType = mainDataType;
-         
+
+         // Because contents property is broken for mutiline EditBox at the moment
+         if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox") && ((EditBox)object).multiLine)
+            dataType = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, "MultiLineString");
+
          // Prepare main prop
          if(dataType.type == structClass)
          {
@@ -1722,7 +1758,7 @@ public:
          else if(dataType.type == normalClass || dataType.type == noHeadClass)
          {
             dataPtr = &valueData;
-            
+
             if(this.subMember || this.subProperty)
             {
                Class _class;
@@ -1733,14 +1769,14 @@ public:
          }
          else
          {
-            
+
             if(this.subMember || this.subProperty)
                GetProperty(prop, object, &valueData);
-            
+
             dataPtr = &valueData;
             propObject = &valueData;
          }
-         
+
          // Prepare sub prop
          if(this.subMember)
          {
@@ -1761,9 +1797,9 @@ public:
          {
             Property subProperty = this.subProperty;
             Class subDataType = subProperty.dataTypeClass;
-            
+
             if(!subDataType)
-               subDataType = subProperty.dataTypeClass = 
+               subDataType = subProperty.dataTypeClass =
                   eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, subProperty.dataTypeString);
             if(!subProperty.Get) subDataType = null;
             if(subDataType)
@@ -1793,7 +1829,7 @@ public:
                {
                   if(dataType.type == structClass)
                      ((void (*)(void *, void *))(void *)this.subProperty.Set)(propObject, subData);
-                  else if(dataType.type == unitClass || dataType.type == enumClass || dataType.type == bitClass)
+                  else if(dataType.type == unitClass || dataType.type == enumClass || dataType.type == bitClass || dataType.type == systemClass)
                   {
                      if(!strcmp(dataType.dataTypeString, "float"))
                         ((void(*)(void *,float))(void *)this.subProperty.Set)(propObject, valueSubData.f);
@@ -1803,15 +1839,15 @@ public:
                         ((void(*)(void *,byte))(void *)this.subProperty.Set)(propObject, valueSubData.uc);
                      else if(!strcmp(dataType.dataTypeString, "uint16"))
                         ((void(*)(void *,uint16))(void *)this.subProperty.Set)(propObject, valueSubData.us);
-                     else 
+                     else
                         ((void (*)(void *, uint))(void *)this.subProperty.Set)(propObject, valueSubData.ui);
                   }
                   else
-                     ((void (*)(void *, uint))(void *)this.subProperty.Set)(propObject, valueSubData.ui);
+                     ((void (*)(void *, void *))(void *)this.subProperty.Set)(propObject, valueSubData.p);
                }
                if(mainDataType.type == structClass)
                   ((void (*)(void *, void *))(void *)prop.Set)(object, data);
-               else if(mainDataType.type == unitClass || mainDataType.type == enumClass || mainDataType.type == bitClass)
+               else if(mainDataType.type == unitClass || mainDataType.type == enumClass || mainDataType.type == bitClass || mainDataType.type == systemClass)
                {
                   if(!strcmp(mainDataType.dataTypeString, "float"))
                      ((void(*)(void *,float))(void *)prop.Set)(object, valueData.f);
@@ -1825,7 +1861,7 @@ public:
                      ((void (*)(void *, uint))(void *)prop.Set)(object, valueData.ui);
                }
                else
-                  ((void (*)(void *, uint))(void *)prop.Set)(object, valueData.ui);
+                  ((void (*)(void *, void *))(void *)prop.Set)(object, valueData.p);
 
                result = true;
             }
@@ -1845,7 +1881,7 @@ public:
 class Category : struct
 {
    Category prev, next;
-   char * name;
+   const char * name;
    DataRow row;
    bool collapsed;
 };