aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src/launcher/forms/formtabs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/PalmOS/Src/launcher/forms/formtabs.cpp')
-rw-r--r--backends/PalmOS/Src/launcher/forms/formtabs.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/launcher/forms/formtabs.cpp b/backends/PalmOS/Src/launcher/forms/formtabs.cpp
new file mode 100644
index 0000000000..0dd3427c1a
--- /dev/null
+++ b/backends/PalmOS/Src/launcher/forms/formtabs.cpp
@@ -0,0 +1,242 @@
+#include <PalmOS.h>
+#include <CtlGlue.h>
+#include <FrmGlue.h>
+#include <LstGlue.h>
+
+#include "globals.h"
+#include "formTabs.h"
+
+TabType *TabNewTabs(UInt16 cnt) {
+ TabType *newP = new TabType;
+
+ newP->count = 0;
+ newP->width = 0;
+ newP->tabs = new TabDataType[cnt];
+
+ return newP;
+}
+
+void TabMoveUpObject(FormType *frmP, UInt16 objID, Coord amount) {
+ Coord x, y;
+ FrmGetObjectPosition(frmP, FrmGetObjectIndex(frmP, objID), &x, &y);
+ FrmSetObjectPosition(frmP, FrmGetObjectIndex(frmP, objID), x, y - amount);
+}
+
+void TabDeleteTabs(TabType *tabP) {
+ UInt16 cnt, num;
+ num = MemPtrSize(tabP->tabs) / sizeof(TabDataType);
+
+ for (cnt = 0; cnt < num; cnt++)
+ FrmDeleteForm(tabP->tabs[cnt].srcP);
+
+ delete tabP->tabs;
+ delete tabP;
+}
+
+Err TabAddContent(FormType **frmP, TabType *tabP, const Char *nameP, UInt16 rscID, TabProc *drawFunc) {
+ FormType *srcP;
+ UInt16 cnt;
+ void *objP, **dstP;
+ UInt16 objNum;
+ Coord x, y, w, h;
+ UInt16 id;
+ RectangleType r;
+
+ dstP = (void **)frmP;
+ srcP = FrmInitForm(rscID);
+
+ objNum = FrmGetNumberOfObjects(srcP);
+
+ // save tab data
+
+ // it's required to keep to source forms active
+ // while the tab form is not close for list data ptr (items text)
+ // TODO : fix this !
+ tabP->tabs[tabP->count].srcP = srcP;
+ tabP->tabs[tabP->count].first = FrmGetObjectId(srcP, 0);
+ tabP->tabs[tabP->count].last = FrmGetObjectId(srcP, objNum - 1);
+ tabP->tabs[tabP->count].drawFunc= drawFunc;
+ tabP->count++;
+ tabP->active = tabP->count;
+
+ // create tab
+ FntSetFont(stdFont);
+ x = 4 + tabP->width;
+ y = 16;
+ w = FntCharsWidth(nameP, StrLen(nameP)) + 6;
+ h = 12;
+ ControlType *addP = CtlNewControl(dstP, (FrmGetFormId(*frmP) + tabP->count), buttonCtl, nameP, x, y, w, h, stdFont, 0, true);
+ CtlGlueSetFrameStyle(addP, noButtonFrame);
+ tabP->width += w + 3;
+
+ // create tab content
+ for (cnt = 0; cnt < objNum; cnt++) {
+ objP = FrmGetObjectPtr(srcP, cnt);
+ id = FrmGetObjectId(srcP, cnt);
+ FrmGetObjectBounds(srcP, cnt, &r);
+ x = r.topLeft.x - 2;
+ y = r.topLeft.y + 30;
+ w = r.extent.x;
+ h = r.extent.y;
+
+ FrmSetObjectPosition(srcP, cnt, x, y);
+
+ switch (FrmGetObjectType(srcP, cnt)) {
+ case frmListObj: {
+ // HOWTO : to auto link the list to a popup trigger the listID must be popupID + 1 if popup id
+ // desn't exist the triggerID will be 0 and the list will be shown, but take care to not define
+ // ListID - 1 object if you want to show the list.
+ ListType *newP;
+ Char **itemsP = LstGlueGetItemsText((ListType *)objP);
+ FontID font = LstGlueGetFont((ListType *)objP);
+ UInt16 visible = LstGetVisibleItems((ListType *)objP);
+ UInt16 items = LstGetNumberOfItems((ListType *)objP);
+ UInt16 trigger = id - 1;
+ trigger = (FrmGetObjectIndex((FormType *)*dstP, trigger) != frmInvalidObjectId) ? trigger : 0;
+
+ LstNewList(dstP, id, x, y, w, h, font, visible, trigger);
+ newP = (ListType *)FrmGetObjectPtr((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+ LstSetListChoices(newP, itemsP, items);
+ FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+ break;
+ }
+ case frmFieldObj: {
+ FieldAttrType attr;
+ FontID font = FldGetFont((FieldType *)objP);
+ UInt16 maxChars = FldGetMaxChars((FieldType *)objP);
+ FldGetAttributes((FieldType *)objP, &attr);
+ FldNewField(dstP, id, x, y, w, h, font, maxChars, attr.editable, attr.underlined, attr.singleLine, attr.dynamicSize, (JustificationType)attr.justification, attr.autoShift, attr.hasScrollBar, attr.numeric);
+ FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+ break;
+ }
+ case frmControlObj: {
+ const Char *textP = CtlGetLabel((ControlType *)objP);
+ ControlStyleType style = CtlGlueGetControlStyle((ControlType *)objP);
+ FontID font = CtlGlueGetFont((ControlType *)objP);
+ ControlType *newP = CtlNewControl(dstP, id, style, textP, x, y, w, h, font, 0, true);
+ FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+ switch (style) {
+ case sliderCtl:
+ {
+ UInt16 min, max, page, val;
+ CtlGetSliderValues((ControlType *)objP, &min, &max, &page, &val);
+ CtlSetSliderValues(newP, &min, &max, &page, &val);
+ break;
+ }
+ }
+ break;
+ }
+ case frmLabelObj: {
+ const Char *textP = FrmGetLabel(srcP, id);
+ FontID font = FrmGlueGetLabelFont(srcP, id);
+ FrmNewLabel((FormType **)dstP, id, textP, x, y, font);
+ FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+ break;
+ }
+
+ case frmBitmapObj: {
+/* UInt16 family = id + 1;
+ FrmNewBitmap((FormType **)dstP, id, id, x, y);
+ //FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id));
+*/ break;
+ }
+ }
+ }
+
+ frmP = (FormType **)dstP; // save new form ptr
+ return errNone;
+}
+
+void TabSetActive(FormType *frmP, TabType *tabP, UInt16 num) {
+ UInt16 cnt, idx;
+ RectangleType r;
+ TabDataPtr dataP;
+
+ if (tabP->active == num)
+ return;
+
+ dataP = &tabP->tabs[tabP->active];
+
+ // hide active tab objects
+ if (tabP->active != tabP->count) {
+ for (cnt = dataP->first; cnt <= dataP->last; cnt++) {
+ if ((idx = FrmGetObjectIndex(frmP, cnt)) != frmInvalidObjectId)
+ FrmHideObject(frmP, idx);
+ }
+ }
+
+ // save active tab
+ tabP->active = num;
+ dataP = &tabP->tabs[num];
+
+ // draw tab limit
+ WinSetForeColor(UIColorGetTableEntryIndex(UIFormFill));
+ WinDrawLine(1, 14, 154,14);
+ WinDrawLine(1, 15, 154,15);
+ RctSetRectangle(&r, 1, 30, 154, 100);
+ WinDrawRectangle(&r, 0);
+ WinSetForeColor(UIColorGetTableEntryIndex(UIObjectFrame));
+ WinDrawLine(1, 28, 154,28);
+
+ // set tabs size
+ for (cnt = 0; cnt < tabP->count; cnt++) {
+ idx = FrmGetObjectIndex (frmP, (FrmGetFormId(frmP) + cnt + 1));
+
+ if (idx != frmInvalidObjectId) {
+ FrmGetObjectBounds(frmP, idx, &r);
+ r.topLeft.y = (num == cnt) ? 17 : 17;
+ r.extent.y = (num == cnt) ? 12 : 11;
+ FrmSetObjectBounds(frmP, idx, &r);
+
+ if (num == cnt) {
+ RGBColorType yellow = {0,255,192,0};
+
+ UInt8 line = /*(UIColorGetTableEntryIndex(UIFormFill) == UIColorGetTableEntryIndex(UIFieldTextHighlightBackground)) ?
+ WinRGBToIndex(&yellow) :*/
+ UIColorGetTableEntryIndex(UIFieldTextHighlightBackground);
+
+ r.topLeft.y -= 1;
+ WinSetForeColor(UIColorGetTableEntryIndex(UIObjectFrame));
+ WinDrawRectangleFrame(simpleFrame, &r);
+ WinSetForeColor(line);
+ WinDrawLine(r.topLeft.x, r.topLeft.y, r.topLeft.x + r.extent.x - 1, r.topLeft.y);
+ FrmShowObject(frmP, idx);
+
+ } else {
+ UInt8 frame = UIColorGetTableEntryIndex(UIObjectFrame);
+ RGBColorType light;
+ WinIndexToRGB(frame, &light);
+ light.r = (255 - light.r) > 72 ? light.r + 72 : 255;
+ light.g = (255 - light.g) > 72 ? light.g + 72 : 255;
+ light.b = (255 - light.b) > 72 ? light.b + 72 : 255;
+
+ WinSetForeColor(WinRGBToIndex(&light));
+ WinDrawRectangleFrame(simpleFrame, &r);
+ WinSetForeColor(frame);
+ WinDrawLine(r.topLeft.x - 1, r.topLeft.y + r.extent.y, r.topLeft.x + r.extent.x, r.topLeft.y + r.extent.y);
+ }
+
+ // round corner
+ WinSetForeColor(UIColorGetTableEntryIndex(UIFormFill));
+ if (OPTIONS_TST(kOptModeHiDensity)) {
+ WinSetCoordinateSystem(kCoordinatesNative);
+ WinDrawPixel((r.topLeft.x - 1) * 2, (r.topLeft.y - 1) * 2);
+ WinDrawPixel((r.topLeft.x + r.extent.x) * 2 + 1, (r.topLeft.y - 1) * 2);
+ WinSetCoordinateSystem(kCoordinatesStandard);
+
+ } else {
+ // TODO
+ }
+ }
+ }
+
+ // show objects
+ for (cnt = dataP->first; cnt <= dataP->last; cnt++) {
+ if ((idx = FrmGetObjectIndex(frmP, cnt)) != frmInvalidObjectId)
+ FrmShowObject(frmP, idx);
+ }
+
+ // post draw function
+ if (dataP->drawFunc)
+ (dataP->drawFunc)();
+}