/* Like a messge dialog, with an input field */ pghandle pgInputDialog(const char *title, const char *message, pghandle deftxt) { pghandle wToolbar,wField,wOk,wCancel,from; pghandle str = 0; /* New context for us! */ pgEnterContext(); /* Create the important widgets */ pgDialogBox(title); wToolbar = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, 0); wField = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, 0); pgNewWidget(PG_WIDGET_LABEL,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_ALL, PG_WP_TEXT,pgNewString(message), 0); wField = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wField); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, PG_WP_SIDE,PG_S_ALL, /* Only set the property if nonzero */ deftxt ? PG_WP_TEXT : 0,deftxt, 0); /* buttons */ wCancel = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_CANCEL), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_CANCEL), PG_WP_IMAGE,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL_MASK), 0); wOk = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_OK), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_OK), PG_WP_IMAGE,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK_MASK), 0); /* Run */ pgFocus(wField); for (;;) { from = pgGetEvent()->from; if (from == wOk) { /* Make a copy, because the one used in PG_WP_TEXT is deleted * automatically by the field widget on deletion. */ str = pgDup(pgGetWidget(wField,PG_WP_TEXT)); /* Send it back up to the caller's context */ pgChangeContext(str,-1); break; } else if (from == wCancel) break; } pgLeaveContext(); return str; }
/* Options Dialog */ int btnDialog(struct pgEvent *btnevt) { struct pgEvent evt; pghandle wSampleTB,wOk,wCancel,wSetFont,wOptionBox,wTB; pghandle w24hour,wSeconds,wColon,wWeekDay,wDay,wMonth,wYear; struct clockData oldData; /* Save data in case of cancel */ oldData = currentClock; /* Top-level widgets */ pgEnterContext(); pgDialogBox("Clock Preferences"); wTB = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, 0); wSampleTB = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); wOptionBox = pgNewWidget(PG_WIDGET_BOX,0,0); pgNewWidget(PG_WIDGET_SCROLL,PG_DERIVE_BEFORE,wOptionBox); pgSetWidget(PGDEFAULT, PG_WP_BIND,wOptionBox, 0); /* Options */ w24hour = pgNewWidget(PG_WIDGET_CHECKBOX,PG_DERIVE_INSIDE,wOptionBox); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("24-hour clock"), PG_WP_ON,currentClock.enable24hour, 0); wSeconds = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show seconds"), PG_WP_ON,currentClock.enableSeconds, 0); wColon = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Flash colon"), PG_WP_ON,currentClock.flashColon, 0); wSetFont = pgNewWidget(PG_WIDGET_BUTTON,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Set Font"), PG_WP_SIDE,PG_S_TOP, 0); wWeekDay = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show weekday"), PG_WP_ON,currentClock.enableWeekDay, 0); wDay = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show day"), PG_WP_ON,currentClock.enableDay, 0); wMonth = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show month"), PG_WP_ON,currentClock.enableMonth, 0); wYear = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show year"), PG_WP_ON,currentClock.enableYear, /* Give the last one PG_S_ALL to avoid extra margin at the * bottom of wCheckBoxBox */ PG_WP_SIDE,PG_S_ALL, 0); /* Buttons */ wCancel = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wTB); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_CANCEL), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_CANCEL), PG_WP_BITMAP,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL_MASK), 0); wOk = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wTB); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_OK), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_OK), PG_WP_BITMAP,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK_MASK), 0); /* Sample clock */ currentClock.wClock = pgNewWidget(PG_WIDGET_FLATBUTTON,PG_DERIVE_INSIDE, wSampleTB); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_ALL, 0); /* Run the dialog */ for (;;) { mungeSettings(); /* New settings take effect */ evt = *pgGetEvent(); /* Wait for an event */ /* Set Font */ if (evt.from == wSetFont) { pghandle fNew, fOld; fNew = pgFontPicker("Set Clock Font"); if (fNew) { fOld = currentClock.fClockFont; /* Send new font handle to the main context */ pgChangeContext(fNew,-1); /* Select new one, delete old one * (unless this was the original font we entered with. * Then, keep it around because we might cancel this dialog) */ currentClock.fClockFont = fNew; if (fOld != oldData.fClockFont) pgDelete(fOld); } } /* Cancel - revert everything */ else if (evt.from == wCancel) { currentClock = oldData; break; } /* Done. Revert widget, delete old font */ else if (evt.from == wOk) { if (oldData.fClockFont != currentClock.fClockFont) pgDelete(oldData.fClockFont); currentClock.wClock = oldData.wClock; break; } /* Set various flags */ else if (evt.from == wColon) currentClock.flashColon ^= 1; else if (evt.from == w24hour) currentClock.enable24hour ^= 1; else if (evt.from == wSeconds) currentClock.enableSeconds ^= 1; else if (evt.from == wWeekDay) currentClock.enableWeekDay ^= 1; else if (evt.from == wDay) currentClock.enableDay ^= 1; else if (evt.from == wMonth) currentClock.enableMonth ^= 1; else if (evt.from == wYear) currentClock.enableYear ^= 1; } storeSettings(); pgLeaveContext(); mungeSettings(); return 0; }