7c621ea6e274a6e1019391753b791795483050f6
[sdk] / ide / src / designer / Designer.ec
1 import "ide"
2
3 class Designer : DesignerBase
4 {
5    ~Designer()
6    {
7       if(GetActiveDesigner() == this)
8       {
9          SetActiveDesigner(null);
10       }
11       if(classDesigner)
12          delete classDesigner;
13    }
14
15    // *** DesignerBase Implementation ***
16
17    void ModifyCode()
18    {
19       codeEditor.ModifyCode();
20    }
21
22    void UpdateProperties()
23    {
24       codeEditor.DesignerModifiedObject();
25    }
26
27    void CodeAddObject(Instance instance, ObjectInfo * object)
28    {
29       codeEditor.AddObject(instance, object);
30    }
31
32    void SheetAddObject(ObjectInfo object)
33    {
34       codeEditor.sheet.AddObject(object, object.name, typeData, true); //className, true);
35    }
36
37    void AddToolBoxClass(Class _class)
38    {
39       ((IDEWorkSpace)master).toolBox.AddControl(_class);
40    }
41
42    void AddDefaultMethod(Instance instance, Instance classInstance)
43    {
44       Class _class = instance._class;
45       int minID = MAXINT;
46       Method defaultMethod = null;
47
48       for( ; _class; _class = _class.base)
49       {
50          Method method;
51          int minID = MAXINT;
52          for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
53          {
54             if(method.type == virtualMethod)
55             {
56                if(!method.dataType)
57                   method.dataType = ProcessTypeString(method.dataTypeString, false);
58                if(method.vid < minID && (instance == classInstance || (method.dataType.thisClass && eClass_IsDerived(classInstance._class, method.dataType.thisClass.registered))))
59                {
60                   defaultMethod = method;
61                   minID = method.vid;
62                }
63             }
64          }
65          if(defaultMethod)
66             break;
67       }
68       codeEditor.AddMethod(defaultMethod);
69    }
70
71    bool ObjectContainsCode(ObjectInfo object)
72    {
73       // Confirmation if control contains code
74       if(object.instCode)
75       {
76          MembersInit members;
77          if(object.instCode.members)
78          {
79             for(members = object.instCode.members->first; members; members = members.next)
80             {
81                if(members.type == methodMembersInit)
82                {
83                   //if(!Code_IsFunctionEmpty(members.function))
84                   {
85                      return true;
86                   }
87                }
88             }
89          }
90       }
91       return false;
92    }
93
94    void DeleteObject(ObjectInfo object)
95    {
96       if(codeEditor)
97          codeEditor.DeleteObject(object);
98    }
99
100    void RenameObject(ObjectInfo object, char * name)
101    {
102       if(object && (name || !object.classDefinition))
103          codeEditor.RenameObject(object, name);
104    }
105
106    bool FindObject(Instance * object, char * string)
107    {
108       ObjectInfo classObject;
109       for(classObject = codeEditor.classes.first; classObject; classObject = classObject.next)
110       {
111          ObjectInfo check;
112          if(classObject.name && !strcmp(string, classObject.name))
113          {
114             *object = classObject.instance;
115             break;
116          }
117          for(check = classObject.instances.first; check; check = check.next)
118          {
119             if(check.name && !strcmp(string, check.name))
120             {
121                *object = check.instance;
122                break;
123             }
124          }
125          if(check)
126             return true;
127       }
128       return false;
129    }
130
131    void SelectObjectFromDesigner(ObjectInfo object)
132    {
133       codeEditor.SelectObjectFromDesigner(object);
134    }
135
136    borderStyle = sizable;
137    isActiveClient = true;
138    hasVertScroll = true;
139    hasHorzScroll = true;
140    hasClose = true;
141    hasMaximize = true;
142    hasMinimize = true;
143    text = $"Designer";
144    menu = Menu { };
145    anchor = Anchor { left = 300, right = 150, top = 0, bottom = 0 };
146
147    ToolBox toolBox;
148    CodeEditor codeEditor;
149
150    Menu fileMenu { menu, $"File", f };
151    MenuItem fileSaveItem
152    {
153       fileMenu, $"Save", s, ctrlS;
154       bool NotifySelect(MenuItem selection, Modifiers mods)
155       {
156          return codeEditor.MenuFileSave(selection, mods);
157       }
158    };
159    MenuItem fileSaveAsItem
160    {
161       fileMenu, $"Save As...", a;
162       bool NotifySelect(MenuItem selection, Modifiers mods)
163       {
164          return codeEditor.MenuFileSaveAs(selection, mods);
165       }
166
167    };
168
169    bool OnClose(bool parentClosing)
170    {
171       if(!parentClosing)
172       {
173          if(codeEditor && !codeEditor.closing)
174          {
175             if(!codeEditor.visible)
176             {
177                if(!codeEditor.Destroy(0))
178                   return false;
179                else
180                   codeEditor = null;
181             }
182             else
183             {
184                visible = false;
185                return false;
186             }
187          }
188       }
189       return true;
190    }
191
192    bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
193    {
194       if(active)
195       {
196          codeEditor.EnsureUpToDate();
197          codeEditor.fixCaret = true;
198          /*
199          if(classDesigner)
200             classDesigner.Activate();
201          */
202       }
203       return true;
204    }
205
206    bool OnKeyHit(Key key, unichar ch)
207    {
208       return codeEditor.sheet.OnKeyHit(key, ch);
209    }
210
211    watch(modifiedDocument)
212    {
213       fileSaveItem.disabled = !modifiedDocument && codeEditor.fileName;
214    };
215
216    // *** METHODS ACCESSED FROM PROPERTY SHEET/TOOLBOX/CODE EDITOR ***
217    void Reset()
218    {
219       if(classDesigner)
220       {
221          classDesigner.Reset();
222          classDesigner.SelectObject(null, null);
223          classDesigner.Destroy(0);
224          delete classDesigner;
225       }
226    }
227
228    void FillToolBox()
229    {
230       if(this && classDesigner)
231          classDesigner.ListToolBoxClasses(this);
232    }
233
234    void SelectObject(ObjectInfo object, Instance instance)
235    {
236       ClassDesignerBase classDesigner = this.classDesigner;
237 #ifdef _DEBUG
238       if(instance && instance._class.module.application != codeEditor.privateModule)
239          printf("warning: SelectObject: instance._class.module.application != codeEditor.privateModule\n");
240 #endif
241       if(!classDesigner || !instance || classDesigner._class != (Class)eInstance_GetDesigner(instance))
242       {
243          if(classDesigner)
244          {
245             classDesigner.SelectObject(null, null);
246             classDesigner.Destroy(0);
247             classDesigner = null;
248             delete this.classDesigner;
249          }
250          if(instance)
251          {
252             this.classDesigner = classDesigner = eInstance_New(eInstance_GetDesigner(instance));
253             incref classDesigner;
254             //if(!classDesigner.parent)
255             {
256                classDesigner.parent = this;
257                classDesigner.anchor = Anchor { left = 0, right = 0, top = 0, bottom = 0 };
258             }
259             classDesigner.Create();
260          }
261       }
262       // Call class editor SelectObject
263       if(classDesigner)
264          classDesigner.SelectObject(object, instance);
265    }
266
267    void AddObject()
268    {
269       // Call class editor AddObject
270       if(classDesigner)
271          classDesigner.AddObject();
272       if(visible)
273          Activate();
274       else
275          codeEditor.Activate();
276    }
277
278    void CreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
279    {
280       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
281
282       // Call class editor CreateObject
283       if(designerClass)
284          designerClass.CreateObject(this, instance, object, isClass, iclass);
285    }
286
287    void ::PostCreateObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
288    {
289       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
290
291       // Call class editor PostCreateObject
292       if(designerClass)
293          designerClass.PostCreateObject(instance, object, isClass, iclass);
294    }
295
296    void ::DroppedObject(Instance instance, ObjectInfo object, bool isClass, Instance iclass)
297    {
298       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
299
300       // Call class editor PostCreateObject
301       if(designerClass)
302          designerClass.DroppedObject(instance, object, isClass, iclass);
303    }
304
305    void PrepareTestObject(Instance instance)
306    {
307       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
308       if(designerClass)
309          designerClass.PrepareTestObject(this, instance);
310    }
311
312    void ::DestroyObject(Instance instance)
313    {
314       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
315       if(designerClass)
316          designerClass.DestroyObject(instance);
317    }
318
319    void ::FixProperty(Property prop, Instance instance)
320    {
321       subclass(ClassDesignerBase) designerClass = eInstance_GetDesigner(instance);
322       if(designerClass)
323          designerClass.FixProperty(prop, instance);
324    }
325 }