1 namespace gui::controls;
6 extern int __ecereVMethodID_class_OnGetString;
7 extern int __ecereVMethodID_class_OnGetDataFromString;
8 extern int __ecereVMethodID_class_OnCompare;
9 extern int __ecereVMethodID_class_OnSerialize;
10 extern int __ecereVMethodID_class_OnUnserialize;
11 extern int __ecereVMethodID_class_OnFree;
12 extern int __ecereVMethodID_class_OnEdit;
13 extern int __ecereVMethodID_class_OnCopy;
14 extern int __ecereVMethodID_class_OnDisplay;
15 extern int __ecereVMethodID_class_OnSaveEdit;
18 public class DataBox : CommonControl
37 virtual void SetData(any_object newData, bool closingDropDown)
39 //((void (*)(void *, void *, void *))(void *)type._vTbl[__ecereVMethodID_class_OnCopy])(type, data, newData);
43 if(type.type == normalClass || type.type == noHeadClass)
45 if(((void **)data)[0])
46 ((void (*)(void *, void *))(void *)type._vTbl[__ecereVMethodID_class_OnFree])(type, ((void **)data)[0]);
47 ((void **)data)[0] = newData;
51 // Free old data first
52 ((void (*)(void *, void *))(void *)type._vTbl[__ecereVMethodID_class_OnFree])(type, data);
53 ((void (*)(void *, void *, void *))(void *)type._vTbl[__ecereVMethodID_class_OnCopy])(type, data, newData);
57 NotifyChanged(master, this, closingDropDown);
61 bool SaveData() // TODO: Clear this up, along with Saving DataBox
63 bool (* onSaveEdit)(void *, void *, Window, void *) = (void *)type._vTbl[__ecereVMethodID_class_OnSaveEdit];
64 if(editor && (!onSaveEdit || onSaveEdit(type, data, editor, null)))
67 NotifyChanged(master, this, false);
76 NotifyModified(master);
93 virtual bool Window::NotifyModified();
94 virtual bool Window::NotifyChanged(DataBox dataBox, bool closingDropDown);
95 virtual void OnConfigure(Window editor);
100 watch(background) { if(editor) editor.background = background; };
101 watch(foreground) { if(editor) editor.foreground = foreground; };
102 //watch(selectionColor) { if(editor) editor.selectionColor = selectionColor; };
103 //watch(selectionText) { if(editor) editor.selectionText = selectionText; };
104 watch(opacity) { if(editor) editor.opacity = opacity; };
108 // Right now for read-only DataBoxes the only reason we'd want to create an editor is for autoSize purposes, when using the default EditBox editor that supports it.
109 // ( A tweak for enum classes is in typeEdit.ec, as the base class editor invokes it )
110 if(type/* && (!readOnly || (autoSize && type._vTbl[__ecereVMethodID_class_OnEdit] == class(Instance)._vTbl[__ecereVMethodID_class_OnEdit]))*/ &&
111 (type.type == normalClass || type.type == noHeadClass || data))
113 // IMPORTANT FIX: If keepEditor is true, we were passing editor rather than the editor's current master
114 editor = ((Window (*)(void *, void *, DataBox, void *, int, int, int, int, void*))(void *)type._vTbl[__ecereVMethodID_class_OnEdit])(type,
115 (type.type == normalClass || type.type == noHeadClass) ? (data ? (*(void **)data) : null) : data,
116 this, (keepEditor && editor) ? editor.master : this, 0, 0, clientSize.w, clientSize.h, fieldData);// null);
117 if(editor && readOnly && !eClass_IsDerived(editor._class, class(EditBox)) &&
118 !(autoSize && type._vTbl[__ecereVMethodID_class_OnEdit] == class(Instance)._vTbl[__ecereVMethodID_class_OnEdit]))
126 // editor.anchor = { 0, 0, 0, 0 };
127 editor.background = background;
128 editor.foreground = foreground;
129 editor.opacity = opacity;
130 if(eClass_IsDerived(editor._class, class(EditBox)))
132 ((EditBox)editor).readOnly = readOnly;
134 ((EditBox)editor).autoSize = autoSize;
135 ((EditBox)editor).clickThrough = true;
137 else if(eClass_IsDerived(editor._class, class(Button)) && autoSize)
142 // TODO: Should returning 0 from OnPostCreate cancel creation?
150 void OnRedraw(Surface surface)
152 if(type && data && (!editor || !editor.created || editor.anchor.left)) // ColorDropBox lets part of the DataBox show
154 char tempString[1024];
155 if(type._vTbl[__ecereVMethodID_class_OnDisplay] == class(Instance)._vTbl[__ecereVMethodID_class_OnDisplay])
160 if(type.type == noHeadClass || type.type == normalClass)
161 s = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, *(void **)this.data, tempString, fieldData, null);
163 s = ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, this.data, tempString, fieldData, null);
165 stringValue = CopyString(s);
168 ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)class(String)._vTbl[__ecereVMethodID_class_OnDisplay])(class(String), stringValue, surface, 3, 1, clientSize.w, fieldData, type.defaultAlignment, 0);
172 if(type.type == noHeadClass || type.type == normalClass)
173 ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)type._vTbl[__ecereVMethodID_class_OnDisplay])(type, *(void **)this.data, surface, 3, 1, clientSize.w, fieldData, type.defaultAlignment, 0);
175 ((void (*)(void *, void *, void *, int, int, int, void *, uint, uint))(void *)type._vTbl[__ecereVMethodID_class_OnDisplay])(type, this.data, surface, 3, 1, clientSize.w, fieldData, type.defaultAlignment, 0);
183 CommonControl::OnDestroy();
186 void OnPosition(int x, int y, int width, int height)
189 editor.OnPosition(editor.position.x, editor.position.y, editor.size.w, editor.size.h);
192 bool OnKeyHit(Key key, unichar ch)
194 return editor ? editor.OnKeyHit(key, ch) : true;
197 bool OnKeyDown(Key key, unichar ch)
199 if((SmartKey)key == enter)
204 else if((SmartKey)key == escape)
209 return editor ? editor.OnKeyDown(key, ch) : true;
212 void OnChildResized(Window child, int x, int y, int w, int h)
214 if(!inAutoSize && autoSize == true)
217 clientSize = { w, h };
223 public class SavingDataBox : DataBox
225 class_property(icon) = "<:ecere>controls/dataBox.png";
227 bool OnActivate(bool active, Window previous, bool * goOnWithActivation, bool direct)
229 if(!active && editor && !editor.modalSlave)
237 bool OnKeyDown(Key key, unichar ch)
239 if((SmartKey)key == enter)
242 // Force Refresh on Enter if SaveData didn't do it
246 return DataBox::OnKeyDown(key, ch);
249 bool OnResizing(int * w, int * h)
254 display.FontExtent(fontObject, " ", 1, null, &spaceH);
258 *w = spaceH * 80 / 14;