5 static void UnusedFunction()
14 a.OnEdit(null,null,0,0,0,0,0);
15 a.OnDisplay(null,0,0,0,0,0,0);
19 extern int __ecereVMethodID_class_OnEdit;
20 extern int __ecereVMethodID_class_OnDisplay;
21 extern int __ecereVMethodID_class_OnGetString;
22 extern int __ecereVMethodID_class_OnFree;
23 extern int __ecereVMethodID_class_OnCompare;
24 extern int __ecereVMethodID_class_OnCopy;
25 extern int __ecereVMethodID_class_OnSaveEdit;
27 //#define SHOW_METHODS
30 // *** THESE METHODS SHOULD BE IMPROVED UPON AND USED TO SET PROPERTIES FROM NOW ON ***
31 // (Other locations where this will be useful: JSON (DataValue version?), CodeEditor, ...)
32 // This takes in a value according to the any_object rules
34 void SetPropValue(Property prop, void * object, any_object value)
36 Class type = prop.dataTypeClass;
38 type = prop.dataTypeClass = eSystem_FindClass(prop._class.module, prop.dataTypeString);
40 if(type.type == normalClass || type.type == noHeadClass || type.type == structClass)
42 ((void (*)(void *, void *))(void *)prop.Set)(object, value);
44 // TOFIX: How to swiftly handle classes with base data type?
45 else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
47 ((void (*)(void *, double))(void *)prop.Set)(object, *(double *)value);
49 else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
51 ((void (*)(void *, float))(void *)prop.Set)(object, *(float *)value);
53 else if(type.typeSize == sizeof(int64))// || !strcmp(type.dataTypeString, "int64") || !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
55 ((void (*)(void *, int64))(void *)prop.Set)(object, *(int64 *)value);
57 else if(type.typeSize == sizeof(int))// || !strcmp(type.dataTypeString, "int") || !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
59 ((void (*)(void *, int))(void *)prop.Set)(object, *(int *)value);
61 else if(type.typeSize == sizeof(short int)) // || !strcmp(type.dataTypeString, "short") || !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || !strcmp(type.dataTypeString, "int16"))
63 ((void (*)(void *, short))(void *)prop.Set)(object, *(short *)value);
65 else if(type.typeSize == sizeof(byte))// || !strcmp(type.dataTypeString, "char") || !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
67 ((void (*)(void *, byte))(void *)prop.Set)(object, *(byte *)value);
71 ((void (*)(void *, void *))(void *)prop.Set)(object, value);
75 any_object GetPropValue(Property prop, Instance object)
79 Class type = prop.dataTypeClass;
82 type = prop.dataTypeClass = eSystem_FindClass(prop._class.module, prop.dataTypeString);
85 if(type.type == normalClass || type.type == noHeadClass || type.type == structClass)
87 return ((void*(*)())(void *)prop.Get)(object);
89 // TOFIX: How to swiftly handle classes with base data type?
90 else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
92 double d = ((double(*)(void *))(void *)prop.Get)(object);
95 else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
97 float f =((float(*)(void *))(void *)prop.Get)(object);
100 else if(type.typeSize == sizeof(int64))// || !strcmp(type.dataTypeString, "int64") || !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
102 return ((int64(*)(void *))(void *)prop.Get)(object);
104 else if(type.typeSize == sizeof(int))// || !strcmp(type.dataTypeString, "int") || !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
106 return ((int(*)(void *))(void *)prop.Get)(object);
108 else if(type.typeSize == sizeof(short int)) // || !strcmp(type.dataTypeString, "short") || !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || !strcmp(type.dataTypeString, "int16"))
110 return ((short(*)(void *))(void *)prop.Get)(object);
112 else if(type.typeSize == sizeof(byte))// || !strcmp(type.dataTypeString, "char") || !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
114 return ((byte(*)(void *))(void *)prop.Get)(object);
118 return ((int (*)(void *))(void *)prop.Get)(object);
125 void CopyProperty(Property prop, Instance dest, Instance src)
127 Class type = prop.dataTypeClass;
129 type = prop.dataTypeClass = eSystem_FindClass(prop._class.module, prop.dataTypeString);
131 if(type.type == structClass)
133 void * propData = new0 byte[type.structSize];
134 ((void (*)(void *, void *))(void *)prop.Get)(src, propData);
135 ((void (*)(void *, void *))(void *)prop.Set)(dest, propData);
138 else if(type.type == normalClass || type.type == noHeadClass)
140 // TOCHECK: Why was there a return here?
141 /*return */((void (*)(void *, void *))(void *)prop.Set)(dest, ((void*(*)(void *))(void *)prop.Get)(src));
143 // TOFIX: How to swiftly handle classes with base data type?
144 else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
146 ((void (*)(void *, double))(void *)prop.Set)(dest, ((double(*)(void *))(void *)prop.Get)(src));
148 else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
150 ((void (*)(void *, float))(void *)prop.Set)(dest, ((float(*)(void *))(void *)prop.Get)(src));
152 else if(type.typeSize == sizeof(int64))// || !strcmp(type.dataTypeString, "int64") || !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
154 ((void (*)(void *, int64))(void *)prop.Set)(dest, ((int64(*)(void *))(void *)prop.Get)(src));
156 else if(type.typeSize == sizeof(int))// || !strcmp(type.dataTypeString, "int") || !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
158 ((void (*)(void *, int))(void *)prop.Set)(dest, ((int(*)(void *))(void *)prop.Get)(src));
160 else if(type.typeSize == sizeof(short int)) // || !strcmp(type.dataTypeString, "short") || !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || !strcmp(type.dataTypeString, "int16"))
162 ((void (*)(void *, short))(void *)prop.Set)(dest, ((short(*)(void *))(void *)prop.Get)(src));
164 else if(type.typeSize == sizeof(byte))// || !strcmp(type.dataTypeString, "char") || !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
166 ((void (*)(void *, byte))(void *)prop.Set)(dest, ((byte(*)(void *))(void *)prop.Get)(src));
170 ((void (*)(void *, int))(void *)prop.Set)(dest, ((int (*)(void *))(void *)prop.Get)(src));
174 void GetProperty(Property prop, Instance object, DataValue value)
178 Class type = prop.dataTypeClass;
181 type = prop.dataTypeClass = eSystem_FindClass(prop._class.module, prop.dataTypeString);
183 if(prop._class.module.application == __thisModule &&
184 prop.dataTypeClass.module.application == ((Designer)GetActiveDesigner()).codeEditor.privateModule)
189 if(type.type == normalClass || type.type == noHeadClass || type.type == structClass)
191 value.p = ((void*(*)(void *))(void *)prop.Get)(object);
193 // TOFIX: How to swiftly handle classes with base data type?
194 else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
196 value.d = ((double(*)(void *))(void *)prop.Get)(object);
198 else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
200 value.f = ((float(*)(void *))(void *)prop.Get)(object);
202 else if(type.typeSize == sizeof(int64))// || !strcmp(type.dataTypeString, "int64") || !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
204 value.i64 = ((int64(*)(void *))(void *)prop.Get)(object);
206 else if(type.typeSize == sizeof(int))// || !strcmp(type.dataTypeString, "int") || !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
208 value.i = ((int(*)(void *))(void *)prop.Get)(object);
210 else if(type.typeSize == sizeof(short int)) // || !strcmp(type.dataTypeString, "short") || !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || !strcmp(type.dataTypeString, "int16"))
212 value.s = ((short(*)(void *))(void *)prop.Get)(object);
214 else if(type.typeSize == sizeof(byte))// || !strcmp(type.dataTypeString, "char") || !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
216 value.uc = ((byte(*)(void *))(void *)prop.Get)(object);
220 value.i = ((int (*)(void *))(void *)prop.Get)(object);
227 void SetProperty(Property prop, Instance object, DataValue value)
231 Class type = prop.dataTypeClass;
233 type = prop.dataTypeClass = eSystem_FindClass(prop._class.module, prop.dataTypeString);
235 if(type.type == normalClass || type.type == noHeadClass || type.type == structClass)
237 ((void (*)(void *, void *))(void *)prop.Set)(object, value);
239 // TOFIX: How to swiftly handle classes with base data type?
240 else if(type == class(double) || !strcmp(type.dataTypeString, "double"))
242 ((void (*)(void *, double))(void *)prop.Set)(object, value.d);
244 else if(type == class(float) || !strcmp(type.dataTypeString, "float"))
246 ((void (*)(void *, float))(void *)prop.Set)(object, value.f);
248 else if(type.typeSize == sizeof(int64))// || !strcmp(type.dataTypeString, "int64") || !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64"))
250 ((void (*)(void *, int64))(void *)prop.Set)(object, value.i64);
252 else if(type.typeSize == sizeof(int))// || !strcmp(type.dataTypeString, "int") || !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint"))
254 ((void (*)(void *, int))(void *)prop.Set)(object, value.i);
256 else if(type.typeSize == sizeof(short int)) // || !strcmp(type.dataTypeString, "short") || !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || !strcmp(type.dataTypeString, "int16"))
258 ((void (*)(void *, short))(void *)prop.Set)(object, value.s);
260 else if(type.typeSize == sizeof(byte))// || !strcmp(type.dataTypeString, "char") || !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte"))
262 ((void (*)(void *, byte))(void *)prop.Set)(object, value.uc);
266 ((void (*)(void *, int))(void *)prop.Set)(object, value.i);
271 static define sheetSelectionColor = Color { 170, 220, 255 };
272 static define sheetSelectionText = black;
277 borderStyle = sizable;
281 anchor = { left = 0, top = 0, bottom = 0 };
282 background = formColor;
286 dropBox.AddField(dropField);
287 properties.AddField(propertyName);
288 properties.AddField(propertyValue);
289 methods.AddField(methodName);
294 categories.Free(null);
300 anchor = { left = 0, top = 0, right = 0 };
302 bool NotifySelect(DropBox control, DataRow row, Modifiers keyFlags)
304 ObjectInfo selected = (ObjectInfo)(row ? row.tag : null);
305 ToolBox toolBox = ((IDEWorkSpace)parent).toolBox;
307 if(codeEditor && selected)
308 codeEditor.SelectObject(selected);
310 // TODO: Get containing class of object
311 toolBox.selectedClass = selected ? selected.oClass : null;
313 object = selected ? selected.instance : null;
316 ListProperties(true);
320 row = methods.currentRow;
322 strcpy(selectedMethod, ((CodeObject)row.GetData(methodName)).name);
326 if(selected && selected.instance && codeEditor)
330 int rowHeight = methods.rowHeight;
332 propertyValue.userData = (void *)selected.instance;
334 // Fill up the methods
338 for(_class = selected.instance._class; _class && _class.type != systemClass; _class = _class.base)
341 for(id = _class.base ? _class.base.vTblSize : 0; id<_class.vTblSize; id++)
344 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
346 if(method.type == virtualMethod && method.vid == id)
349 method.dataType = ProcessTypeString(method.dataTypeString, false);
351 type = method.dataType.thisClass ? typeEvent : typeMethod;
353 DataRow row = methods.AddRow();
354 CodeObject codeObject
356 eventsUp = (selected.oClass == selected) ? false : true;
360 overriden = codeEditor.FindMethod(method.name, &codeObject.function, null);
362 if(!codeObject.overriden || codeObject.overriden == 2)
363 codeEditor.FindCompatibleMethods(method, codeObject.compatible);
365 row.SetData(methodName, codeObject);
367 if(!strcmp(method.name, selectedMethod))
368 methods.currentRow = row;
376 methods.Sort(methodName, 1);
379 for(row = methods.firstRow; row; row = row.next)
381 CodeObject codeObject = row.GetData(methodName);
382 CreateButtons(codeObject, row.index * rowHeight, rowHeight, row);
389 DataField dropField { dataType = class(CodeObject) };
393 this, inactive = true, text = $"Properties", bevelOver = true, isRadio = true;
395 anchor = { left = 0, bottom = 3, right = 0.5 };
398 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
400 text = $"Properties";
401 button.font = { $"Tahoma", 8.25f, bold = true };
404 methods.visible = false;
405 methBtn.Activate(); // Ensure proper cycling (until tab order?)
406 properties.visible = true;
408 alphabetical.disabled = false;
409 categorized.disabled = false;
411 properties.Activate();
413 // ((IDEWorkSpace)master).SheetSelected(Properties);
420 this, inactive = true, bevelOver = true;
425 anchor = { bottom = 3, left = 0.5, right = 0 };
427 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
430 button.font = { $"Tahoma", 8.25f, bold = true };
433 properties.visible = false;
434 methBtn.Activate(); // Ensure proper cycling (until tab order?)
435 methods.visible = true;
437 alphabetical.disabled = true;
438 categorized.disabled = true;
442 // ((IDEWorkSpace)master).SheetSelected(Methods);
449 MenuPlacement editMenu { menu, text = $"Edit" };
450 Menu viewMenu { menu, text = $"View" };
455 this, anchor = { left = 0, right = 0, top = 50, bottom = 25 };
456 hasVertScroll = true, alwaysEdit = true, collapseControl = true, resizable = true;
457 background = viewsBackground;
458 foreground = viewsText;
459 selectionText = sheetSelectionText;
460 selectionColor = sheetSelectionColor;
462 bool NotifySelect(ListBox control, DataRow row, Modifiers keyFlags)
467 strcpy(selectedProp, (char *)row.GetData(propertyName));
468 selectedScroll = properties.scroll.y;
469 selectedScroll -= row.index * properties.rowHeight;
475 prop = ((PropertyInfo)row.GetData(propertyValue)).prop;
484 DataField propertyName { dataType = class(char *), width = 130 };
485 DataField propertyValue { dataType = class(PropertyInfo), width = 0, editable = true };
490 this, anchor = { left = 0, right = 0, top = 50, bottom = 25 };
491 hasVertScroll = true;
492 background = viewsBackground;
493 foreground = viewsText;
494 // alwaysEdit = true;
497 bool NotifyDoubleClick(ListBox control, int x, int y, Modifiers mods)
499 CodeObject object = control.GetData(methodName);
501 codeEditor.AddMethod(object.method);
505 bool NotifyRightClick(ListBox control, int x, int y, Modifiers mods)
507 CodeObject object = control.GetData(methodName);
511 if(object.overriden == 0)
513 MenuItem { menu, $"Override", o, enter, bold = true, NotifySelect = OverrideMethodSelected };
514 if(object.compatible.count)
516 Menu attachMenu { menu, $"Attach", a };
518 for(compatible = object.compatible.first; compatible; compatible = compatible.next)
520 ClassFunction function = compatible.data;
521 MenuItem { attachMenu, function.declarator.symbol.string, id = (int64)function, NotifySelect = AttachMethodSelected };
525 else if(object.overriden == 1)
527 MenuItem { menu, $"Go to", g, enter, bold = true, NotifySelect = GotoMethodSelected };
528 MenuItem { menu, $"Detach", d, d, NotifySelect = DetachMethodSelected };
529 MenuItem { menu, $"Delete", del, del, NotifySelect = DeleteMethodSelected };
531 else if(object.overriden == 2)
533 MenuItem { menu, $"Go to", g, enter, bold = true, NotifySelect = GotoMethodSelected };
534 MenuItem { menu, $"Detach", d, d, NotifySelect = DetachMethodSelected };
535 if(object.compatible.count > 1)
537 Menu attachMenu { menu, $"Reattach", r };
539 for(compatible = object.compatible.first; compatible; compatible = compatible.next)
541 ClassFunction function = compatible.data;
542 if(function != object.function)
544 MenuItem { attachMenu, function.declarator.symbol.string, id = (int64)function, NotifySelect = ReattachMethodSelected };
550 attachMethod = object.method;
551 popupMenu = PopupMenu { menu = menu, master = this, position =
553 x + control.absPosition.x - app.desktop.absPosition.x,
554 y + control.absPosition.y - app.desktop.absPosition.y
557 // popupMenu.Capture();
561 bool NotifyKeyDown(ListBox listBox, DataRow row, Key key, unichar ch)
565 CodeObject object = row.GetData(methodName);
566 switch((SmartKey)key)
569 if(!object.overriden)
570 listBox.NotifyDoubleClick(this, listBox, 0,0, 0);
572 codeEditor.GoToMethod(object.method.name);
576 object.deleteBtn.NotifyClicked(this, object.deleteBtn, 0,0,0);
577 else if(object.detachBtn)
578 object.detachBtn.NotifyClicked(this, object.detachBtn, 0,0,0);
582 object.attachBtn.NotifyPushed(this, object.attachBtn, 0,0,0);
586 object.detachBtn.NotifyClicked(this, object.detachBtn, 0,0,0);
594 DataField methodName { dataType = class(CodeObject) };
597 methBtn.font = { $"Tahoma", 8.25, bold = true };
598 methBtn.checked = true;
599 properties.visible = false;
602 propBtn.font = { $"Tahoma", 8.25f, bold = true };
603 propBtn.checked = true;
604 methods.visible = false;
605 text = $"Properties";
610 this, bevelOver = true, inactive = true, position = { 25, 25 }, size = { 24, 24 };
611 bitmap = { "<:ecere>elements/orderAscending.png" };
614 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
616 if(!alphabetical.checked)
618 alphabetical.checked = true;
619 categorized.checked = false;
621 ListProperties(true);
629 this, bevelOver = true, checked = true, inactive = true, position = { 0, 25 }, size = { 24, 24 };
630 bitmap = { "<:ecere>elements/orderCategorized.png" };
633 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
635 if(!categorized.checked)
637 categorized.checked = true;
638 alphabetical.checked = false;
640 ListProperties(true);
646 property CodeEditor codeEditor
650 if(codeEditor != value)
655 dropField.userData = codeEditor;
656 methodName.userData = codeEditor;
659 codeEditor.EnumerateObjects(this);
668 property SheetType sheetSelected
672 if(methBtn.checked != (value == SheetType::methods))
677 return methBtn.checked ? methods : properties;
681 bool OnClose(bool parentClosing)
691 bool OnKeyDown(Key key, unichar ch)
697 else if(key == escape)
699 Window activeClient = ide.activeClient;
701 activeClient.Activate();
703 ide.RepositionWindows(true);
708 bool OnKeyHit(Key key, unichar ch)
710 return properties.OnKeyHit(key, ch);
713 bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
715 if(active && codeEditor)
716 codeEditor.EnsureUpToDate();
720 void ListProperties(bool clear)
722 DataRow row = dropBox.currentRow;
723 ObjectInfo selected = row ? (ObjectInfo)row.tag : null;
726 bool categorized = this.categorized.checked;
727 bool currentRow = false;
728 char selectedProp[1024];
733 DataRow row = properties.currentRow;
736 DataRow propRow = row;
738 while(propRow && propRow.parent && !propRow.parent.isHeader)
739 propRow = row.parent;
741 propName = propRow.GetData(propertyName);
742 strcpy(this.selectedProp, propName);
743 selectedScroll = properties.scroll.y;
744 selectedScroll -= propRow.index * properties.rowHeight;
746 currentRow = this.selectedProp[0] ? true : false;
748 for(cat = categories.first; cat; cat = cat.next)
750 cat.collapsed = cat.row.collapsed;
754 // Preserve selected property (PropertySheetSelect will null it)
755 strcpy(selectedProp, this.selectedProp);
757 strcpy(this.selectedProp, selectedProp);
759 if(selected && selected.instance && codeEditor)
761 Instance test = eInstance_New(selected.instance._class);
765 // Put it in the same desktop window...
766 if(selected.classDefinition)
767 codeEditor.designer.PrepareTestObject(test);
769 // Fill up the properties
770 while(_class != selected.instance._class)
772 BitMember bitMember = null;
773 Class lastClass = _class;
776 for(_class = selected.instance._class; _class.base != lastClass && _class.base.type != systemClass && _class.inheritanceAccess != privateAccess; _class = _class.base);
778 for(propIt = _class.membersAndProperties.first; propIt; propIt = propIt.next)
780 if(propIt.isProperty)
782 Property prop = eClass_FindProperty(selected.instance._class, propIt.name, GetPrivateModule());
784 if(prop && prop.Set && prop.Get && prop.compiled && (!prop.category || strcmpi(prop.category, $"Deprecated")))
786 bool disabled = Code_IsPropertyDisabled(selected, prop.name);
788 Class dataType = prop.dataTypeClass;
790 dataType = prop.dataTypeClass = eSystem_FindClass(codeEditor.privateModule, prop.dataTypeString);
792 if(!strcmp(_class.name, "DesignerBase"))
794 bold = !disabled && Code_IsPropertyModified(test, selected, prop);
799 PropertyInfo info { prop, disabled, bold ? codeEditor.boldFont : codeEditor.normalFont };
800 char * name = prop.category ? prop.category : $"Misc";
801 Category category = categories.FindName(name, false);
803 // Hide properties like this for now..
804 if(name && !strcmp(name, "Private"))
812 category = Category { name = name };
813 categories.AddName(category);
815 if(!category.row && categorized)
817 PropertyInfo catInfo { null, false, null, name };
818 category.row = properties.AddRow();
819 category.row.SetData(propertyName, name );
820 category.row.SetData(propertyValue, catInfo);
821 category.row.isHeader = true;
822 category.row.collapsed = category.collapsed;
827 row = categorized ? category.row.FindRow((int64)prop) : properties.FindRow((int64)prop);
829 row = categorized ? category.row.AddRow() : properties.AddRow();
830 row.tag = (int64)prop;
833 row = categorized ? category.row.FindRow((int64)prop) : properties.FindRow((int64)prop);
835 row.SetData(propertyName, prop.name);
836 row.SetData(propertyValue, info);
838 if(clear && !strcmp(prop.name, this.selectedProp))
839 properties.currentRow = row;
841 if(!dataType.noExpansion && (dataType.type == structClass || dataType.type == normalClass || dataType.type == noHeadClass || dataType.type == bitClass))
846 row.collapsed = true;
848 for(member = dataType.membersAndProperties.first; member; member = member.next)
850 if(member.isProperty)
852 Property subProp = (Property)member;
853 if(!subProp.conversion && subProp.Get && subProp.Set)
856 PropertyInfo info { prop, disabled, bold ? codeEditor.boldFont : codeEditor.normalFont, null, null, subProp };
860 subRow = row.AddRow();
861 subRow.tag = (int64)subProp;
864 subRow = row.FindRow((int64)subProp);
866 subRow.SetData(propertyName, subProp.name);
867 subRow.SetData(propertyValue, info);
873 PropertyInfo info { prop, disabled, bold ? codeEditor.boldFont : codeEditor.normalFont, null, member, null };
876 subRow = row.AddRow();
877 subRow.tag = (int64)member;
880 subRow = row.FindRow((int64)member);
882 subRow.SetData(propertyName, member.name);
883 subRow.SetData(propertyValue, info);
887 DataMember subMember;
888 for(subMember = member.members.first; subMember; subMember = subMember.next)
891 PropertyInfo info { prop, disabled, bold ? codeEditor.boldFont : codeEditor.normalFont, null, subMember, null, member.offset };
894 subRow = row.AddRow();
895 subRow.tag = (int64)subMember;
898 subRow = row.FindRow((int64)subMember);
900 subRow.SetData(propertyName, subMember.name);
901 subRow.SetData(propertyValue, info);
912 // Sort alphabetically for now...
915 // properties.Sort(null, 1);
916 properties.Sort(propertyValue, 1);
917 if(!properties.currentRow)
921 for(_class = selected.instance._class; _class; _class = _class.base)
924 for(prop = _class.membersAndProperties.first; prop; prop = prop.next)
926 if(prop.isProperty && prop.Set && prop.Get && prop.compiled)
928 if(_class.defaultProperty && !strcmp(prop.name, _class.defaultProperty))
931 char * name = prop.category ? prop.category : $"Misc";
932 Category category = categories.FindName(name, false);
933 row = category ? (categorized ? category.row.FindRow((int64)prop) : properties.FindRow((int64)prop)) : null;
934 properties.currentRow = row;
943 properties.currentRow = properties.firstRow;
948 DataRow row = properties.currentRow;
949 properties.scroll.y = selectedScroll + row.index * properties.rowHeight;
955 void AddObject(ObjectInfo object, char * name, CodeObjectType type, bool select)
957 DataRow after = null;
959 CodeObject codeObject;
960 char * bitmap = null;
961 bool foundClass = false;
963 for(row = dropBox.firstRow; row; row = row.next)
965 CodeObject codeObject = row.GetData(null);
966 if(codeObject.object.oClass == object.oClass)
973 row = (DataRow)dropBox.AddRowAfter(after);
975 row.tag = (int64)object;
982 indent = (type == typeClass) ? 0 : 1;
985 if(type != typeClass)
986 bitmap = (char *)eClass_GetProperty(object.instance._class, "icon");
989 codeObject.bitmap = { bitmap };
990 AddResource(codeObject.bitmap);
993 row.SetData(null, codeObject);
997 this.object = object ? object.instance : null;
998 propertyValue.userData = object ? (void *)object.instance : null;
999 dropBox.SelectRow(row);
1003 void DeleteObject(ObjectInfo object)
1005 DataRow row = dropBox.FindRow((int64)object);
1008 CodeObject codeObject = row.GetData(null);
1010 if(codeObject.bitmap)
1011 RemoveResource(codeObject.bitmap);
1012 dropBox.DeleteRow(row);
1016 void SelectObject(ObjectInfo object)
1020 DataRow row = dropBox.FindRow((int64)object);
1021 this.object = object ? object.instance : null;
1022 propertyValue.userData = object ? (void *)object.instance : null;
1023 dropBox.SelectRow(row);
1027 void RenameObject(ObjectInfo object, char * name)
1029 DataRow row = dropBox.FindRow((int64)object);
1030 CodeObject codeObject = row.GetData(null);
1031 // Isn't this useless? Shouldn't it be after?
1032 codeObject.name = name;
1033 // row.SetData(null, codeObject); // Is this necessary?
1036 void DataBox::EditSetData(any_object setValue, bool closingDropDown)
1038 ((Sheet)master.master).SetData(setValue, this);
1041 void SetData(any_object setValue, DataBox dataBox)
1043 //PropertyInfo propertyPtr = row.GetData(null);
1044 PropertyInfo propertyPtr = properties.GetData(null);
1045 Property prop = propertyPtr ? propertyPtr.prop : null;
1046 Instance object = this.object;
1049 Class dataType = prop.dataTypeClass;
1051 dataType = prop.dataTypeClass = eSystem_FindClass(codeEditor.privateModule, prop.dataTypeString);
1052 if(propertyPtr.subMember)
1054 DataMember member = propertyPtr.subMember;
1055 Class subDataType = member.dataTypeClass;
1056 if(!member.dataTypeClass)
1057 subDataType = member.dataTypeClass = eSystem_FindClass(codeEditor.privateModule, member.dataTypeString);
1061 if(!subDataType.dataType)
1062 subDataType.dataType = ProcessTypeString(subDataType.dataTypeString, false);
1064 if(dataType.type == structClass)
1066 data = new0 byte[dataType.structSize];
1067 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1068 // CopyBytes((byte *)data + member.offset + propertyPtr.extraOffset, &setValue, subDataType.size);
1069 CopyBytes((byte *)data + member.offset + propertyPtr.extraOffset, (void *)setValue, subDataType.dataType.size);
1070 ((void (*)(void *, void *))(void *)prop.Set)(object, data);
1072 else if(dataType.type == normalClass || dataType.type == noHeadClass)
1077 if(dataType.type == bitClass)
1079 BitMember bitMember = (BitMember) member;
1082 DataValue value = { 0 };
1083 value.ui = ((uint (*)(void *))(void *)prop.Get)(object);
1084 value.ui &= ~ (uint)bitMember.mask;
1085 value.ui |= *(uint32 *)setValue << bitMember.pos;
1086 ((void (*)(void *, uint))(void *)prop.Set)(object, value.ui);
1091 // TODO: What does this handle?
1092 data = dataType.typeSize ? new0 byte[dataType.typeSize] : null;
1093 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1094 // CopyBytes((byte *)data + member.offset + propertyPtr.extraOffset, &setValue, subDataType.typeSize);
1095 CopyBytes((byte *)data + member.offset + propertyPtr.extraOffset, (void *)setValue, subDataType.dataType.size);
1096 // TODO: Support non 32 bit datatypes here
1097 ((void (*)(void *, void *))(void *)prop.Set)(object, data);
1101 if(data) ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType,&data);
1105 else if(propertyPtr.subProperty)
1107 Property subProperty = propertyPtr.subProperty;
1108 Class subDataType = subProperty.dataTypeClass;
1110 subDataType = subProperty.dataTypeClass = eSystem_FindClass(codeEditor.privateModule, subProperty.dataTypeString);
1115 if(dataType.type == structClass)
1117 data = new0 byte[dataType.structSize];
1118 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1119 ((void (*)(void *, uint))(void *)subProperty.Set)(data, *(uint32 *)setValue);
1120 ((void (*)(void *, void *))(void *)prop.Set)(object, data);
1122 else if(dataType.type == normalClass || dataType.type == noHeadClass)
1124 Instance current = (Instance)((void *(*)(void *))(void *)prop.Get)(object);
1125 Instance propObject = eInstance_New(dataType);
1126 CopyInstanceData(dataType, propObject, current);
1127 ((void (*)(void *, uint))(void *)subProperty.Set)(propObject, (uint32)setValue);
1128 ((void (*)(void *, void *))(void *)prop.Set)(object, propObject);
1132 data = dataType.typeSize ? new0 byte[dataType.typeSize] : null;
1133 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1134 ((void (*)(void *, uint))(void *)subProperty.Set)(data, (uint32)setValue);
1135 // TODO: Support not 32 bit data types here
1136 ((void (*)(void *, void *))(void *)prop.Set)(object, data);
1139 if(data) ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType,&data);
1145 SetPropValue(prop, object, (uint32)setValue);
1147 Code_FixProperty(propertyPtr.prop, object);
1149 properties.Update(null);
1150 dropBox.Update(null);
1151 codeEditor.designer.Update(null);
1152 codeEditor.Update(null); // patch for redraw bug if on top
1154 ListProperties(false);
1155 // DataRow values were changed by ListProperties, need to re-query
1156 propertyPtr = properties.GetData(null);
1158 dataBox.editor.font = { propertyPtr.font.faceName, propertyPtr.font.size, propertyPtr.font.bold };
1160 codeEditor.ModifyCode();
1164 bool SaveEdit(PropertyInfo propertyPtr, Instance object)
1166 codeEditor.designer.Update(null);
1167 codeEditor.Update(null); // patch for redraw bug if on top
1168 properties.Update(null);
1169 dropBox.Update(null);
1171 Code_FixProperty(propertyPtr.prop, object);
1172 ListProperties(false);
1174 codeEditor.ModifyCode();
1180 if(!propBtn.checked)
1182 propBtn.checked = true;
1183 propBtn.NotifyClicked(this, propBtn, 0,0,0);
1187 methBtn.checked = true;
1188 methBtn.NotifyClicked(this, methBtn, 0,0,0);
1192 bool AttachMethodSelected(MenuItem selection, Modifiers mods)
1194 ClassFunction function = (ClassFunction)selection.id;
1195 codeEditor.AttachMethod(attachMethod, function);
1199 bool ReattachMethodSelected(MenuItem selection, Modifiers mods)
1201 ClassFunction function = (ClassFunction)selection.id;
1202 CodeObject object = methods.GetData(methodName);
1203 codeEditor.ReAttachMethod(attachMethod, function);
1207 bool OverrideMethodSelected(MenuItem selection, Modifiers mods)
1209 ClassFunction function = (ClassFunction)selection.id;
1210 CodeObject object = methods.GetData(methodName);
1212 codeEditor.AddMethod(object.method);
1216 bool GotoMethodSelected(MenuItem selection, Modifiers mods)
1218 ClassFunction function = (ClassFunction)selection.id;
1219 CodeObject object = methods.GetData(methodName);
1221 codeEditor.GoToMethod(object.method.name);
1225 bool DetachMethodSelected(MenuItem selection, Modifiers mods)
1227 ClassFunction function = (ClassFunction)selection.id;
1228 CodeObject object = methods.GetData(methodName);
1230 codeEditor.DetachMethod(object.method, object.function, object.overriden);
1234 bool DeleteMethodSelected(MenuItem selection, Modifiers mods)
1236 ClassFunction function = (ClassFunction)selection.id;
1237 CodeObject object = methods.GetData(methodName);
1239 object.deleteBtn.NotifyClicked(this, object.deleteBtn, 0,0,0);
1243 bool AddMethodClicked(Button button, int x, int y, Modifiers mods)
1245 DataRow row = (DataRow)button.id;
1246 CodeObject object = row.GetData(methodName);
1247 codeEditor.AddMethod(object.method);
1251 void CreateButtons(CodeObject codeObject, int y, int h, DataRow row)
1253 BitmapResource bitmap;
1255 if(codeObject.overriden)
1257 if(codeObject.overriden == 1)
1259 codeObject.deleteBtn = Button
1261 methods, master = this,
1263 bitmap = { ":actions/delete.png", alphaBlend = true },
1264 anchor = { right = 16, top = y },
1268 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
1270 CodeObject codeObject = ((DataRow)button.id).GetData(null);
1271 bool confirmation = !Code_IsFunctionEmpty(codeObject.function, codeObject.method, codeEditor.selected);
1276 sprintf(title, $"Delete %s", codeObject.name);
1279 master = parent, type = okCancel, text = title,
1280 contents = $"Method still contains code. Are you sure you want to delete it?"
1282 confirmation = false;
1285 if(!confirmation && codeObject.function.attached.count)
1288 sprintf(title, $"Delete %s", codeObject.name);
1289 confirmation = true;
1292 master = parent, type = okCancel, text = title,
1293 contents = $"Other methods are still attached to this method. Are you sure you want to delete it?"
1295 confirmation = false;
1300 codeEditor.DeleteMethod(codeObject.function);
1305 incref codeObject.deleteBtn;
1306 codeObject.deleteBtn.Create();
1309 if(codeObject.overriden == 2 || !codeObject.function.attached.count)
1311 codeObject.detachBtn = Button
1314 master = methods.master,
1316 bitmap = { ":actions/detach.png" },
1317 anchor = { right = 0, top = y },
1321 bool NotifyClicked(Button button, int x, int y, Modifiers mods)
1323 DataRow row = (DataRow)button.id;
1324 CodeObject object = row.GetData(methodName);
1326 codeEditor.DetachMethod(object.method, object.function, object.overriden);
1330 incref codeObject.detachBtn;
1331 codeObject.detachBtn.Create();
1336 if(codeObject.compatible.count)
1338 codeObject.attachBtn = Button
1340 parent = methods, master = methods.master,
1342 bitmap = { ":actions/attach.png" },
1343 anchor = { right = 0, top = y },
1347 bool NotifyPushed(Button button, int x, int y, Modifiers mods)
1350 DataRow row = (DataRow)button.id;
1351 CodeObject object = row.GetData(methodName);
1353 PopupMenu popupMenu;
1357 for(compatible = object.compatible.first; compatible; compatible = compatible.next)
1359 ClassFunction function = compatible.data;
1360 MenuItem { menu, function.declarator.symbol.string, id = (int64)function, NotifySelect = AttachMethodSelected };
1362 attachMethod = object.method;
1364 popupMenu = PopupMenu
1366 master = this, menu = menu,
1369 button.absPosition.x - app.desktop.position.x,
1370 button.absPosition.y - app.desktop.position.y + button.size.h
1374 button.ReleaseCapture();
1375 popupMenu.Capture();
1379 incref codeObject.attachBtn;
1380 codeObject.attachBtn.Create();
1385 Method attachMethod;
1386 char selectedMethod[1024];
1387 CodeEditor codeEditor;
1389 char selectedProp[1024];
1393 static int String_OnCompare(char ** string1, char ** string2)
1396 if(*string1 && *string2)
1397 result = strcmpi(*string1, *string2);
1398 else if(!*string1 && *string2)
1400 else if(*string1 && !*string2)
1405 static void CopyInstanceData(Class dataType, Instance propObject, Instance current)
1408 for(_class = dataType; _class && _class.type != systemClass; _class = _class.base)
1411 for(member = _class.membersAndProperties.first; member; member = member.next)
1413 Class memberType = member.dataTypeClass;
1415 memberType = member.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, member.dataTypeString);
1416 if(member.isProperty)
1418 Property subProp = (Property) member;
1419 if(subProp.Get && subProp.Set)
1420 CopyProperty(subProp, propObject, current);
1422 else if(member.id > -1)
1425 // TOCHECK: I have serious doubts this works in many cases.
1426 ((void (*)(void *, void *, void *))(void *)memberType._vTbl[__ecereVMethodID_class_OnCopy])(memberType, (byte *)propObject + member.offset, (byte *)current + member.offset);
1428 memcpy((byte *)propObject + member.offset, (byte *)current + member.offset, member.memberOffset);
1434 class PropertyInfo : struct
1440 char * categoryName;
1441 DataMember subMember;
1442 Property subProperty;
1445 void OnDisplay(Surface surface, int x, int y, int width, Instance object, Alignment alignment, DataDisplayFlags displayFlags)
1447 Property prop = this.prop;
1449 surface.TextFont(font.font);
1452 surface.SetBackground(Color { 170, 170, 170 });
1453 surface.Area(0,0, x+width-1, y+100);
1455 else if(prop && prop.dataTypeString)
1457 Class dataType = prop.dataTypeClass;
1458 Module module = ((Designer)GetActiveDesigner()).codeEditor.privateModule;
1460 dataType = prop.dataTypeClass = eSystem_FindClass(module, prop.dataTypeString);
1462 if(dataType && prop.Get)
1464 void * dataPtr, * data = null, * subData = null;
1465 DataValue valueData, valueSubData;
1469 if(dataType.type == structClass)
1471 data = new0 byte[dataType.structSize];
1472 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1477 GetProperty(prop, object, &valueData);
1479 if(dataType.type == normalClass)
1480 dataPtr = valueData.p;
1482 dataPtr = &valueData;
1488 DataMember member = this.subMember;
1489 Class subDataType = member.dataTypeClass;
1491 subDataType = member.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, member.dataTypeString);
1494 if(dataType.type == bitClass)
1496 BitMember bitMember = (BitMember)member;
1497 bitValue = (valueData.i & bitMember.mask) >> bitMember.pos;
1498 dataPtr = &bitValue;
1501 dataPtr = (byte *)dataPtr + member.offset + this.extraOffset;
1503 dataType = subDataType;
1505 else if(this.subProperty)
1507 Property subProperty = this.subProperty;
1508 Class subDataType = subProperty.dataTypeClass;
1510 subDataType = subProperty.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, subProperty.dataTypeString);
1511 if(!subProperty.Get) subDataType = null;
1514 if(subDataType.type == structClass)
1516 subData = new0 byte[subDataType.structSize];
1517 ((void (*)(void *, void *))(void *)subProperty.Get)(dataPtr, subData);
1522 GetProperty(subProperty, dataPtr, &valueSubData);
1523 if(subDataType.type == normalClass)
1524 dataPtr = valueSubData.p;
1526 dataPtr = &valueSubData;
1529 dataType = subDataType;
1533 ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)dataType._vTbl[__ecereVMethodID_class_OnDisplay])(dataType, dataPtr, surface, x, y, width, null, alignment, displayFlags);
1541 Window OnEdit(DataBox dataBox, Window obsolete, int x, int y, int w, int h, void * unused)
1543 Window editData = null;
1544 Property prop = this.prop;
1546 dataBox.SetData = Sheet::EditSetData;
1547 if(prop && prop.dataTypeString && !this.disabled)
1549 Sheet propertyWindow = (Sheet)dataBox.master.master;
1550 Instance object = propertyWindow.object;
1551 Class dataType = prop.dataTypeClass;
1553 dataType = prop.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, prop.dataTypeString);
1555 if(dataType && prop.Get)
1557 void * dataPtr, * data = null, * subData = null;
1558 DataValue valueData, valueSubData;
1560 bool isEditBoxMultiLineContents = false;
1563 if(dataType.type == structClass)
1565 data = new0 byte[dataType.structSize];
1566 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1571 bool freeDataForm = false, freeDataTest = false;
1572 // Because contents property is broken for mutiline EditBox at the moment
1573 if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox") && ((EditBox)object).multiLine)
1575 isEditBoxMultiLineContents = true;
1576 dataType = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, "MultiLineString");
1577 valueData.p = ((EditBox)object).multiLineContents;
1578 dataBox.size.h = 3*(h-2);
1579 h = dataBox.clientSize.h;
1582 GetProperty(prop, object, &valueData);
1584 if(dataType.type == normalClass)
1585 dataPtr = valueData.p;
1587 dataPtr = &valueData;
1593 DataMember member = this.subMember;
1594 Class subDataType = member.dataTypeClass;
1596 subDataType = member.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, member.dataTypeString);
1599 if(dataType.type == bitClass)
1601 BitMember bitMember = (BitMember)member;
1602 bitValue = (valueData.i & bitMember.mask) >> bitMember.pos;
1603 dataPtr = &bitValue;
1606 dataPtr = (byte *)dataPtr + member.offset + this.extraOffset;
1608 dataType = subDataType;
1610 else if(this.subProperty)
1612 Property subProperty = this.subProperty;
1613 Class subDataType = subProperty.dataTypeClass;
1615 subDataType = subProperty.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, subProperty.dataTypeString);
1616 if(!subProperty.Get) subDataType = null;
1619 if(subDataType.type == structClass)
1621 subData = new0 byte[subDataType.structSize];
1622 ((void (*)(void *, void *))(void *)subProperty.Get)(dataPtr, subData);
1627 GetProperty(subProperty, dataPtr, &valueSubData);
1628 if(subDataType.type == normalClass)
1629 dataPtr = valueSubData.p;
1631 dataPtr = &valueSubData;
1634 dataType = subDataType;
1638 editData = ((Window (*)(void *, void *, DataBox, void *, int, int, int, int, void*))(void *)dataType._vTbl[__ecereVMethodID_class_OnEdit])(dataType, dataPtr, dataBox, obsolete, x, y, w, h, object /*unused*/);
1643 if(isEditBoxMultiLineContents)
1646 editData.font = { font.faceName, font.size, font.bold };
1647 if(eClass_IsDerived(editData._class, class(DropBox)))
1649 DropBox db = (DropBox)editData;
1650 db.selectionColor = sheetSelectionColor;
1651 db.selectionText = sheetSelectionText;
1653 else if(eClass_IsDerived(editData._class, class(EditBox)))
1655 EditBox eb = (EditBox)editData;
1656 eb.selectionColor = sheetSelectionColor;
1657 eb.selectionText = sheetSelectionText;
1664 int OnCompare(PropertyInfo data2)
1666 char * category1 = prop ? prop.category : categoryName;
1667 char * category2 = data2.prop ? data2.prop.category : data2.categoryName;
1670 if(!category1) category1 = $"Misc";
1671 if(!category2) category2 = $"Misc";
1675 // result = String::OnCompare((String)category1, (String)category2);
1676 result = String_OnCompare(&category1, &category2);
1681 if(subMember && !data2.subMember)
1685 else if(!subMember && data2.subMember)
1689 else if(subMember && data2.subMember)
1691 if(subMember.id < data2.subMember.id)
1693 else if(subMember.id > data2.subMember.id)
1698 else if(subProperty && !data2.subProperty)
1702 else if(!subProperty && data2.subProperty)
1706 else if(subProperty && data2.subProperty)
1708 if(subProperty.id < data2.subProperty.id)
1710 else if(subProperty.id > data2.subProperty.id)
1715 else if(prop && !data2.prop)
1717 else if(!prop && data2.prop)
1720 // result = ((String)prop.name).OnCompare(data2.prop.name);
1721 // result = String::OnCompare((String)prop.name, (String)data2.prop.name);
1722 result = String_OnCompare(&prop.name, &data2.prop.name);
1727 bool OnSaveEdit(Window editControl, void * unusedData)
1729 Property prop = this.prop;
1732 Sheet sheet = (Sheet)editControl.master.master.master;
1733 Instance object = sheet.object;
1734 Class mainDataType = prop.dataTypeClass;
1736 bool result = false;
1737 void * dataPtr, * data = null, * subData = null;
1738 void * propObject = null;
1739 DataValue valueData = { 0 }, valueSubData = { 0 };
1743 mainDataType = prop.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, prop.dataTypeString);
1744 dataType = mainDataType;
1746 // Because contents property is broken for mutiline EditBox at the moment
1747 if(!strcmp(prop.name, "contents") && !strcmp(prop._class.name, "EditBox") && ((EditBox)object).multiLine)
1748 dataType = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, "MultiLineString");
1750 // Prepare main prop
1751 if(dataType.type == structClass)
1753 data = new0 byte[dataType.structSize];
1754 if(this.subMember || this.subProperty)
1755 ((void (*)(void *, void *))(void *)prop.Get)(object, data);
1759 else if(dataType.type == normalClass || dataType.type == noHeadClass)
1761 dataPtr = &valueData;
1763 if(this.subMember || this.subProperty)
1766 Instance current = (Instance)((void *(*)(void *))(void *)prop.Get)(object);
1767 propObject = valueData.p = eInstance_New(dataType);
1768 CopyInstanceData(dataType, propObject, current);
1774 if(this.subMember || this.subProperty)
1775 GetProperty(prop, object, &valueData);
1777 dataPtr = &valueData;
1778 propObject = &valueData;
1784 DataMember member = this.subMember;
1785 Class subDataType = member.dataTypeClass;
1787 subDataType = member.dataTypeClass = eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, member.dataTypeString);
1790 if(dataType.type == bitClass)
1791 dataPtr = &bitValue;
1793 dataPtr = (byte *)dataPtr + member.offset + this.extraOffset;
1795 dataType = subDataType;
1797 else if(this.subProperty)
1799 Property subProperty = this.subProperty;
1800 Class subDataType = subProperty.dataTypeClass;
1803 subDataType = subProperty.dataTypeClass =
1804 eSystem_FindClass(((Designer)GetActiveDesigner()).codeEditor.privateModule, subProperty.dataTypeString);
1805 if(!subProperty.Get) subDataType = null;
1808 if(subDataType.type == structClass)
1810 subData = new0 byte[subDataType.structSize];
1814 dataPtr = &valueSubData;
1816 dataType = subDataType;
1821 if(((bool (*)(void *, void *, Window, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnSaveEdit])(dataType, dataPtr, editControl, null))
1823 if(mainDataType.type == bitClass && this.subMember)
1825 BitMember bitMember = (BitMember)this.subMember;
1826 valueData.ui &= ~ (uint)bitMember.mask;
1827 valueData.ui |= bitValue << bitMember.pos;
1829 if(this.subProperty)
1831 if(dataType.type == structClass)
1832 ((void (*)(void *, void *))(void *)this.subProperty.Set)(propObject, subData);
1833 else if(dataType.type == unitClass || dataType.type == enumClass || dataType.type == bitClass || dataType.type == systemClass)
1835 if(!strcmp(dataType.dataTypeString, "float"))
1836 ((void(*)(void *,float))(void *)this.subProperty.Set)(propObject, valueSubData.f);
1837 else if(!strcmp(dataType.dataTypeString, "double"))
1838 ((void(*)(void *,double))(void *)this.subProperty.Set)(propObject, valueSubData.d);
1839 else if(!strcmp(dataType.dataTypeString, "byte"))
1840 ((void(*)(void *,byte))(void *)this.subProperty.Set)(propObject, valueSubData.uc);
1841 else if(!strcmp(dataType.dataTypeString, "uint16"))
1842 ((void(*)(void *,uint16))(void *)this.subProperty.Set)(propObject, valueSubData.us);
1844 ((void (*)(void *, uint))(void *)this.subProperty.Set)(propObject, valueSubData.ui);
1847 ((void (*)(void *, void *))(void *)this.subProperty.Set)(propObject, valueSubData.p);
1849 if(mainDataType.type == structClass)
1850 ((void (*)(void *, void *))(void *)prop.Set)(object, data);
1851 else if(mainDataType.type == unitClass || mainDataType.type == enumClass || mainDataType.type == bitClass || mainDataType.type == systemClass)
1853 if(!strcmp(mainDataType.dataTypeString, "float"))
1854 ((void(*)(void *,float))(void *)prop.Set)(object, valueData.f);
1855 else if(!strcmp(mainDataType.dataTypeString, "double"))
1856 ((void(*)(void *,double))(void *)prop.Set)(object, valueData.d);
1857 else if(!strcmp(mainDataType.dataTypeString, "byte"))
1858 ((void(*)(void *,byte))(void *)prop.Set)(object, valueData.uc);
1859 else if(!strcmp(mainDataType.dataTypeString, "uint16"))
1860 ((void(*)(void *,uint16))(void *)prop.Set)(object, valueData.us);
1862 ((void (*)(void *, uint))(void *)prop.Set)(object, valueData.ui);
1865 ((void (*)(void *, void *))(void *)prop.Set)(object, valueData.p);
1869 if(data == dataPtr) ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, &data);
1870 if(subData == dataPtr) ((void (*)(void *, void *))(void *)dataType._vTbl[__ecereVMethodID_class_OnFree])(dataType, &subData);
1876 return sheet.SaveEdit(this, object);
1882 class Category : struct
1884 Category prev, next;