static void MainFormDrawCurrentDisplayInfo(AppContext* appContext) { WinPushDrawState(); SetBackColorRGB(appContext, WHITE_Packed); ClearRectangle(0, 0, appContext->screenWidth, appContext->screenHeight - FRM_RSV_H - 1); DrawDisplayInfo(appContext->currDispInfo, appContext->firstDispLine, 0, 0, appContext->dispLinesCount); SetScrollbarState(appContext->currDispInfo, appContext->dispLinesCount, appContext->firstDispLine); WinPopDrawState(); }
static void MainFormDrawLookupStatus(AppContext* appContext, FormType* form) { WinPushDrawState(); SetGlobalBackColor(appContext); UInt16 statusBarStartY=appContext->screenHeight-lookupStatusBarHeight; ClearRectangle(0, statusBarStartY, appContext->screenWidth, lookupStatusBarHeight); WinDrawLine(0, statusBarStartY-3, appContext->screenWidth, statusBarStartY-3); const char* text=GetConnectionStatusText(appContext); Assert(text); UInt16 textLen=StrLen(text); WinDrawTruncChars(text, textLen, 1, statusBarStartY+1, appContext->screenWidth - 14); WinPopDrawState(); }
static void MainFormDisplayAbout(AppContext* appContext) { UInt16 currentY=0; WinPushDrawState(); SetGlobalBackColor(appContext); ClearRectangle(0, currentY, appContext->screenWidth, appContext->screenHeight - currentY - FRM_RSV_H - 1); HideScrollbar(); currentY+=7; FntSetFont(largeFont); DrawCenteredString(appContext, "ArsLexis iNoah", currentY); currentY+=16; #ifdef INTERNAL_BUILD DrawCenteredString(appContext, "Ver 1.1 (internal)", currentY); #else #ifdef DEBUG DrawCenteredString(appContext, "Ver 1.1 (debug)", currentY); #else DrawCenteredString(appContext, "Ver 1.1", currentY); #endif // DEBUG #endif // INTERNAL_BUILD currentY+=20; FntSetFont(boldFont); DrawCenteredString(appContext, "Copyright \251 ArsLexis", currentY); currentY+=24; FntSetFont(largeFont); DrawCenteredString(appContext, "http://www.arslexis.com", currentY); currentY+=24; FntSetFont(stdFont); #ifdef UNLOCKED DrawCenteredString(appContext, "Registered PalmSource version", currentY); #else if (0==StrLen(appContext->prefs.regCode)) { DrawCenteredString(appContext, "Unregistered", currentY); currentY+=14; #ifdef DEMO_HANDANGO DrawCenteredString(appContext, "Buy at: www.handango.com/purchase", currentY); currentY+=14; DrawCenteredString(appContext, " Product ID: 101763", currentY); #else #ifdef DEMO_PALMGEAR DrawCenteredString(appContext, "Buy at: www.palmgear.com?53831", currentY); #else DrawCenteredString(appContext, "Buy at: www.arslexis.com/buy.html", currentY); #endif #endif } else { DrawCenteredString(appContext, "Registered version", currentY); } #endif // UNLOCKED WinPopDrawState(); }
void PrivDrawCell(void* table, Int16 row, Int16 column, RectanglePtr bounds) { char string[50]; FontID font = stdFont; if (g_CurrentRow != row) { if (g_CurrentMemHandle) { MemHandleUnlock(g_CurrentMemHandle); g_CurrentMemHandle = NULL; } } if (g_CurrentMemHandle == NULL) { Err err = GetSMSRecord(g_SmsDb, g_SelectedCategory, row + g_CurrentPage * TABLE_PAGE_SIZE, g_CurrentRecord, g_CurrentMemHandle, true); if (err) return; g_CurrentRow = row; } switch(column) { case 0: StrCopy(string, ""); if (g_SelectedCategory == CAT_INBOX) { if (IsRecordRead(&g_CurrentRecord)) { StrCopy(string, ""); } else { font = symbolFont; StrCopy(string, "\020"); } } else if (g_SelectedCategory == CAT_SENT) { if (IsRecordRequestReport(&g_CurrentRecord)) { font = symbolFont; if (IsRecordDelivered(&g_CurrentRecord)) { StrCopy(string, "\026"); } else { StrCopy(string, "\024"); } } } break; case 1: StrNCopy(string, g_CurrentRecord.personName, 48); if (StrLen(string) == 0) { StrNCopy(string, g_CurrentRecord.phoneNumber, 48); } break; case 2: StrNCopy(string, g_CurrentRecord.content, 48); break; case 3: { DateTimeType smsDatetime; TimSecondsToDateTime(g_CurrentRecord.time, &smsDatetime); UInt32 nowSeconds = TimGetSeconds(); DateTimeType nowDatetime; TimSecondsToDateTime(nowSeconds, &nowDatetime); if ((nowDatetime.year == smsDatetime.year) && (nowDatetime.month == smsDatetime.month) && (nowDatetime.day == smsDatetime.day)) { TimeToAscii(smsDatetime.hour, smsDatetime.minute, tfColon24h, string); } else { StrCopy(string, DayOfWeekInChinese[DayOfWeek(smsDatetime.month, smsDatetime.day, smsDatetime.year)]); DateTemplateToAscii(" ^3z-^0z", smsDatetime.month, smsDatetime.day, smsDatetime.year, string + 2, 47); } MemHandleUnlock(g_CurrentMemHandle); g_CurrentMemHandle = NULL; } break; default: StrCopy(string, ""); } WinPushDrawState(); RGBColorType foreColor, backColor; foreColor.index = 0; backColor.index = 0; if ((row == g_CurrentSelection) && (column != 0)) { foreColor.r = 255; foreColor.g = 255; foreColor.b = 255; backColor.r = 10; backColor.g = 36; backColor.b = 106; } else if (row % 2 == 0) { backColor.r = 255; backColor.g = 255; backColor.b = 255; foreColor.r = 0; foreColor.g = 0; foreColor.b = 0; } else { backColor.r = 220; backColor.g = 220; backColor.b = 220; foreColor.r = 0; foreColor.g = 0; foreColor.b = 0; } WinSetForeColorRGB(&foreColor, NULL); WinSetTextColorRGB(&foreColor, NULL); WinSetBackColorRGB(&backColor, NULL); WinSetUnderlineMode(noUnderline); FntSetFont(font); Int16 width = bounds->extent.x - 2; Int16 len = StrLen(string); Boolean noFit = false; FntCharsInWidth(string, &width, &len, &noFit); UInt16 x = bounds->topLeft.x; UInt16 y = bounds->topLeft.y; bounds->topLeft.x += - 1; bounds->topLeft.y += 0; bounds->extent.x += 2; bounds->extent.y += 0; WinEraseRectangle(bounds, 0); WinDrawGrayLine( bounds->topLeft.x + bounds->extent.x - 2, bounds->topLeft.y, bounds->topLeft.x + bounds->extent.x - 2, bounds->topLeft.y + bounds->extent.y);// - 2); WinDrawChars(string, len, x, y); WinPopDrawState(); }
/* ** TrackXferDone */ static void TrackXferDone(DynamicButtonType* btn) { RectangleType bounds[5], frame, popFrame, popShadowFrame; Boolean penDown, on_button; Int16 x, y, clicked_on = 0; Int16 state = 1; Int16 i = 0; WinHandle offscreenH = NULL; FormType* frm = FrmGetActiveForm(); const UInt16 listIdx = FrmGetObjectIndex(frm, XferDoneList); ListType* list = FrmGetObjectPtr(frm, listIdx); UInt16 width = 0, choices = 0; Err err = errNone; Char str[48]; Int16 n = 0; /* Save the old drawing context */ WinPushDrawState(); /* This should match the XferDoneButton bounds */ FrmGetObjectBounds(frm, FrmGetObjectIndex(frm, btn->id), &bounds[0]); /* Invert the done button */ SelectAndDrawButton(btn, true); SndPlaySystemSound(sndClick); /* Set the status of each menu pick */ for (; i < 4; i++) d.xfer.status[i] = 0x00; if (xferGotoIsAlways) d.xfer.status[0] = TRACKXFERDONE_ALWAYS; else if (xferGotoIsNever) d.xfer.status[0] = TRACKXFERDONE_NEVER; else if (p.flags&PFLAGS_XFER_GOTO) d.xfer.status[0] = TRACKXFERDONE_CHECKED; if (xferCompleteIsAlways) d.xfer.status[1] = TRACKXFERDONE_ALWAYS; else if (xferCompleteIsNever) d.xfer.status[1] = TRACKXFERDONE_NEVER; else if (d.xfer.complete) d.xfer.status[1] = TRACKXFERDONE_CHECKED; if (!d.linker_available) d.xfer.status[2] = TRACKXFERDONE_NEVER; else if (p.flags&PFLAGS_XFER_BACKLINK) d.xfer.status[2] = TRACKXFERDONE_CHECKED; if (p.flags&PFLAGS_XFER_DELETE) d.xfer.status[3] = TRACKXFERDONE_CHECKED; for (i = 0; i < 4; ++i) { if (!(d.xfer.status[i] & TRACKXFERDONE_NEVER)) { d.xfer.choice_map[choices] = i; ++choices; /* calculate list width */ SysCopyStringResource(str, XferMenuOptionsStrings + i); n = FntCharsWidth(str, StrLen(str)); width = Max(width, n); } } LstSetDrawFunction(list, XferDoneListDrawFunc); LstSetListChoices(list, 0, choices); LstSetHeight(list, Min(choices, 10)); FrmGetObjectBounds(frm, listIdx, &frame); frame.topLeft.y = 144 - frame.extent.y - 1; /* -1 to compensate for white border */ frame.extent.x = width + 15 + 6; FrmSetObjectBounds(frm, listIdx, &frame); WinGetFramesRectangle(popupFrame, &frame, &popFrame); WinGetFramesRectangle(rectangleFrame, &popFrame, &popShadowFrame); for (i = 0; i < choices; ++i) RctSetRectangle(&bounds[i+1], frame.topLeft.x, frame.topLeft.y + 10 * i, frame.extent.x, 10); /* Save the bits of the whole menu */ offscreenH = WinSaveBits(&popShadowFrame, &err); if (err) abort(); /* None selected */ LstSetSelection(list, -1); FrmShowObject(frm, listIdx); WinEraseRectangle(&popShadowFrame, 0); LstDrawList(list); WinEraseRectangleFrame(rectangleFrame, &frame); WinDrawRectangleFrame(popupFrame, &frame); do { EvtGetPen(&x, &y, &penDown); if (!state || !RctPtInRectangle(x, y, &bounds[state-1])) { on_button = false; for (i = 1; i <= choices + 1; i++) { if ((state != i) && RctPtInRectangle(x, y, &bounds[i-1])) { /* Invert the new state */ LstSetSelection(list, i - 2); LstDrawList(list); WinEraseRectangleFrame(rectangleFrame, &frame); WinDrawRectangleFrame(popupFrame, &frame); SelectAndDrawButton(btn, i == 1); state = i; on_button = true; } } if (state && !on_button) { /* Moved off the current button */ LstSetSelection(list, -1); LstDrawList(list); WinEraseRectangleFrame(rectangleFrame, &frame); WinDrawRectangleFrame(popupFrame, &frame); if (state == 1) SelectAndDrawButton(btn, false); state = 0; } } } while (penDown); FrmHideObject(frm, listIdx); LstEraseList(list); /* Restore the framed rect */ WinRestoreBits(offscreenH, popShadowFrame.topLeft.x, popShadowFrame.topLeft.y); /* Unselect the button */ SelectAndDrawButton(btn, false); /* Finish up if we just tapped the button */ if (RctPtInRectangle(x, y, &bounds[0])) { FinishXferMode(); /* Restore the old draw state */ WinPopDrawState(); return; } /* Change the setting for goto or delete */ for (i = 1; i <= choices; i++) { if (RctPtInRectangle(x, y, &bounds[i])) { clicked_on = i; break; } } if (clicked_on) clicked_on = d.xfer.choice_map[clicked_on-1] + 1; switch (clicked_on) { case 1: /* Goto */ if (d.xfer.status[0] & TRACKXFERDONE_CHECKED) p.flags &= ~PFLAGS_XFER_GOTO; else if (!d.xfer.status[0]) p.flags |= PFLAGS_XFER_GOTO; break; case 2: /* Complete */ if (d.xfer.status[1] & TRACKXFERDONE_CHECKED) d.xfer.complete = false; else if (!d.xfer.status[1]) d.xfer.complete = true; break; case 3: /* BackLink */ if (d.xfer.status[2] & TRACKXFERDONE_CHECKED) p.flags &= ~PFLAGS_XFER_BACKLINK; else if (!d.xfer.status[2]) { p.flags |= PFLAGS_XFER_BACKLINK; p.flags &= ~PFLAGS_XFER_DELETE; /* No delete if backlink */ } break; case 4: /* Delete */ if (d.xfer.status[3] & TRACKXFERDONE_CHECKED) p.flags &= ~PFLAGS_XFER_DELETE; else if (!d.xfer.status[3]) { p.flags |= PFLAGS_XFER_DELETE; p.flags &= ~PFLAGS_XFER_BACKLINK; /* No backlink if delete */ } break; } /* Click and redraw the button */ if (clicked_on) { DrawXferDoneButton(btn); DynBtnDraw(btn); if (d.xfer.status[clicked_on-1] & TRACKXFERDONE_ALWAYS) SndPlaySystemSound(sndWarning); else SndPlaySystemSound(sndClick); } /* Restore the old draw state */ WinPopDrawState(); }
/* ** DrawPlugButton */ void DrawPlugButton(DynamicButtonType* btn) { Char str[48], str2[48]; Int16 i = -1; WinHandle oldH = WinSetDrawWindow(btn->content.bmpW); /* Set up draw state */ WinPushDrawState(); WinSetBackColor(0); /* otherwise the pixels will not count as "off" */ if (d.xfer.pluglistH && ((i = GetCurrentXferAppListIndex()) != -1)) { BitmapType* bmp = NULL; BitmapTypeV3* bmpV3 = NULL; WinHandle tmpH = NULL; Coord x, y; UInt32 depth; Err err = errNone; /* Hi-res 1-bpp-bug-workaround, part 1 */ if (d.hires && !d.sonyClie) { /* Create a new temporary bitmap with screen depth */ BmpGetDimensions(btn->bmp, &x, &y, NULL); WinScreenMode(winScreenModeGet, NULL, NULL, &depth, NULL); bmp = BmpCreate(x, y, depth, NULL, &err); if (err) abort(); /* ...make it a double density bitmap */ bmpV3 = BmpCreateBitmapV3(bmp, kDensityDouble, BmpGetBits(bmp), NULL); /* ...and create a temporary window */ tmpH = WinCreateBitmapWindow((BitmapType*) bmpV3, &err); if (err) abort(); /* Draw to temporary window for the time being... */ WinSetDrawWindow(tmpH); /* ...and set the right foreground color */ WinSetForeColor(WinRGBToIndex(&black)); } /* Get the plugin icon and draw it */ DrawPlugBitmap(i, boogerID_button, 0, 0); /* Hi-res 1-bpp-bug-workaround, part 2 */ if (d.hires && !d.sonyClie) { /* Copy the icon to the actual button */ WinSetDrawWindow(btn->content.bmpW); WinPaintBitmap(WinGetBitmap(tmpH), 0, 0); /* Clean up */ if (tmpH) WinDeleteWindow(tmpH, false); if (bmpV3) BmpDelete((BitmapType*) bmpV3); if (bmp) BmpDelete(bmp); } /* Load "goto" behavior */ GetPlugString(i, boogerID_gotobehavior, str); if (StrChr(str, 'n')) xferGotoSetNever(); else if (StrChr(str, 'a')) xferGotoSetAlways(); else xferGotoClear(); /* Load "completion" behaviour ("completion" is never on by default (yet)) */ GetPlugString(i, boogerID_completebehavior, str2); if (StrChr(str2, 'a')) xferCompleteSetAlways(); else if (StrChr(str2, 'o')) xferCompleteClear(); else xferCompleteSetNever(); } else { DrawBitmap(XferNoAppBitmap, 0, 0); xferGotoClear(); xferCompleteClear(); } /* Restore old draw window & state */ WinPopDrawState(); WinSetDrawWindow(oldH); }
/* Save the device's colors before drawing, so can later restore to original when done drawing record; OS 3.5 or greater will use the good APIs */ void SaveDrawState_OS35( void ) { WinPushDrawState(); }