📄 datebook.c
字号:
*
***********************************************************************/
Int16 DatebookLoadPrefs (DatebookPreferenceType* prefsP)
{
UInt16 prefsSize;
Int16 prefsVersion = noPreferenceFound;
Boolean haveDefaultFont = false;
UInt32 defaultFont;
ErrNonFatalDisplayIf(!prefsP, "null prefP arg");
// Read the preferences / saved-state information. Fix-up if no prefs or older/newer version
prefsSize = sizeof (DatebookPreferenceType);
prefsVersion = PrefGetAppPreferences (sysFileCDatebook, datebookPrefID, prefsP, &prefsSize, true);
// If the preferences version is from a future release (as can happen when going back
// and syncing to an older version of the device), treat it the same as "not found" because
// it could be significantly different
if ( prefsVersion > datebookPrefsVersionNum )
prefsVersion = noPreferenceFound;
if ( prefsVersion == noPreferenceFound )
{
// Version 1 and 2 preferences
prefsP->dayStartHour = defaultDayStartHour;
prefsP->dayEndHour = defaultDayEndHour;
prefsP->alarmPreset.advance = defaultAlarmPresetAdvance;
prefsP->alarmPreset.advanceUnit = defaultAlarmPresetUnit;
prefsP->saveBackup = defaultSaveBackup;
prefsP->showTimeBars = defaultShowTimeBars;
prefsP->compressDayView = defaultCompressDayView;
prefsP->showTimedAppts = defaultShowTimedAppts;
prefsP->showUntimedAppts = defaultShowUntimedAppts;
prefsP->showDailyRepeatingAppts = defaultShowDailyRepeatingAppts;
// We need to set up the note font with a default value for the system.
FtrGet(sysFtrCreator, sysFtrDefaultFont, &defaultFont);
haveDefaultFont = true;
prefsP->v20NoteFont = (FontID)defaultFont;
}
if ((prefsVersion == noPreferenceFound) || (prefsVersion < datebookPrefsVersionNum))
{
// Version 3 preferences
prefsP->alarmSoundRepeatCount = defaultAlarmSoundRepeatCount;
prefsP->alarmSoundRepeatInterval = defaultAlarmSoundRepeatInterval;
prefsP->alarmSoundUniqueRecID = defaultAlarmSoundUniqueRecID;
prefsP->noteFont = prefsP->v20NoteFont; // 2.0 compatibility (BGT)
// Fix up the note font if we copied from older preferences.
if ((prefsVersion != noPreferenceFound) && (prefsP->noteFont == largeFont))
prefsP->noteFont = largeBoldFont;
if (!haveDefaultFont)
FtrGet(sysFtrCreator, sysFtrDefaultFont, &defaultFont);
prefsP->apptDescFont = (FontID)defaultFont;
}
if ((prefsVersion == noPreferenceFound) || (prefsVersion < datebookPrefsVersionNum))
{
// Version 4 preferences
prefsP->alarmSnooze = defaultAlarmSnooze;
}
return prefsVersion;
}
/***********************************************************************
*
* FUNCTION: DatebookSavePrefs
*
* DESCRIPTION: Saves the current preferences of the application.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* CALLED: from DatePref.c and Datebook.c
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vmk 12/9/97 Initial version
* rbb 4/23/99 Added alarmSnooze
*
***********************************************************************/
void DatebookSavePrefs (void)
{
DatebookPreferenceType prefs;
// Write the preferences / saved-state information.
prefs.dayStartHour = DayStartHour;
prefs.dayEndHour = DayEndHour;
prefs.alarmPreset = AlarmPreset;
prefs.saveBackup = SaveBackup;
prefs.showTimeBars = ShowTimeBars;
prefs.compressDayView = CompressDayView;
prefs.showTimedAppts = ShowTimedAppts;
prefs.showUntimedAppts = ShowUntimedAppts;
prefs.showDailyRepeatingAppts = ShowDailyRepeatingAppts;
prefs.alarmSoundRepeatCount = AlarmSoundRepeatCount;
prefs.alarmSoundRepeatInterval = AlarmSoundRepeatInterval;
prefs.alarmSoundUniqueRecID = AlarmSoundUniqueRecID;
prefs.apptDescFont = ApptDescFont;
prefs.noteFont = NoteFont;
prefs.alarmSnooze = AlarmSnooze;
// Clear reserved field so prefs don't look "different" just from stack garbage!
prefs.reserved = 0;
// Handle 2.0 backwards compatibility for fonts. (BGT)
prefs.v20NoteFont = stdFont;
// Write the state information.
PrefSetAppPreferences (sysFileCDatebook, datebookPrefID, datebookPrefsVersionNum,
&prefs, sizeof (DatebookPreferenceType), true);
}
/***********************************************************************
*
* FUNCTION: InitDatabase
*
* DESCRIPTION: This routine initializes the datebook database.
*
* PARAMETERS: datebase
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 10/19/95 Initial Revision
* grant 6/23/99 Set the backup bit.
*
***********************************************************************/
static void InitDatabase (DmOpenRef dbP)
{
ApptAppInfoInit (dbP);
// Set the backup bit. This is to aid syncs with non-Palm software.
SetDBBackupBit(dbP);
}
/***********************************************************************
*
* FUNCTION: SyncNotification
*
* DESCRIPTION: This routine is called when the datebook database is
* synchronized. This routine will sort the database
* and schedule the next alarm.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 6/6/95 Initial Revision
*
***********************************************************************/
static void SyncNotification (void)
{
UInt16 mode;
DmOpenRef dbP;
// Find the application's data file.
mode = dmModeReadWrite;
dbP = DmOpenDatabaseByTypeCreator(datebookDBType, sysFileCDatebook, mode);
if (!dbP) return;
// Resort the appointment database.
ApptSort (dbP);
// Remove any alarms from the attention manager queue
// that might be associated with items deleted during the hotsync.
UpdatePostedAlarms(PostHotsyncVerification);
// Reschedule the next alarm.
RescheduleAlarms (dbP);
DmCloseDatabase (dbP);
}
/***********************************************************************
*
* FUNCTION: SearchDraw
*
* DESCRIPTION: This routine draws the description, date, and time of
* an appointment found by the text search routine.
*
* PARAMETERS: apptRecP - pointer to an appointment record.
* x - draw position
* y - draw position
* width - maximum width to draw.
*
* RETURNED: nothing
*
* HISTORY:
* 04/18/95 art Created by Art Lamb
* 08/03/99 kwk Use WinDrawTruncChars to handle truncation.
* 11/14/00 CS Use PrefGetPreference instead of PrefGetPreferences.
*
***********************************************************************/
// DOLATER - these should be based on the screen width, not hard coded.
#define maxSearchRepeatDescWidth 100
#define maxSearchDateWidth 42
#define maxSearchTimeWidth 39
static void SearchDraw (ApptDBRecordPtr apptRecP, Int16 x, Int16 y,
Int16 width)
{
UInt16 i;
Char timeStr [timeStringLength];
Char dateStr [dateStringLength];
UInt16 len;
UInt16 maxDescWidth;
Coord drawX;
Char* ptr;
Char* desc;
Char* rscP;
MemHandle rscH;
DateFormatType dateFormat;
TimeFormatType timeFormat;
if (apptRecP->repeat)
maxDescWidth = maxSearchRepeatDescWidth;
else
maxDescWidth = width - maxSearchDateWidth - maxSearchTimeWidth;
// Draw the appointment's desciption.
desc = apptRecP->description;
ptr = StrChr(desc, linefeedChr);
len = (ptr == NULL ? StrLen(desc) : (UInt16)(ptr - desc));
WinDrawTruncChars (desc, len, x, y, maxDescWidth);
// If the event is repeating, draw the repeat type.
if (apptRecP->repeat)
{
rscH = DmGetResource (strRsc, repeatTypesStrID);
rscP = MemHandleLock (rscH);
for (i = 0; i < apptRecP->repeat->repeatType; i++)
rscP += StrLen(rscP) + 1;
x += (width - FntCharsWidth (rscP, StrLen (rscP)));
WinDrawChars (rscP, StrLen (rscP), x, y);
MemHandleUnlock (rscH);
}
// Draw the appointment's date and time.
else
{
// Get time and date formats from the system preferences.
dateFormat = (DateFormatType)PrefGetPreference(prefDateFormat);
timeFormat = (TimeFormatType)PrefGetPreference(prefTimeFormat);
if (TimeToInt (apptRecP->when->startTime) != apptNoTime)
{
TimeToAscii (apptRecP->when->startTime.hours,
apptRecP->when->startTime.minutes, timeFormat, timeStr);
len = StrLen (timeStr);
drawX = x + (width - FntCharsWidth (timeStr, len));
WinDrawChars (timeStr, len, drawX, y);
}
DateToAscii (apptRecP->when->date.month,
apptRecP->when->date.day,
apptRecP->when->date.year + firstYear,
dateFormat, dateStr);
len = StrLen (dateStr);
drawX = x + (width - FntCharsWidth (dateStr, len) - maxSearchTimeWidth);
WinDrawChars (dateStr, len, drawX, y);
}
}
/***********************************************************************
*
* FUNCTION: Search
*
* DESCRIPTION: This routine searchs the datebook database for records
* containing the string passed.
*
* PARAMETERS: findParams - text search parameter block
*
* RETURNED: nothing
*
* HISTORY:
* 04/18/95 art Created by Art Lamb.
* 05/27/99 jaq Two-pass process (future first)
* 08/03/99 kwk Use TxtFindString for source match length result.
* 10/21/99 jmp Made this routine a bit more like everyone else's.
*
***********************************************************************/
static void Search (FindParamsPtr findParams)
{
Err err;
UInt16 cardNo = 0;
UInt16 fieldNum;
UInt16 recordNum;
Char* desc;
Char* note;
Char* header;
Boolean done;
Boolean match;
MemHandle headerStringH;
LocalID dbID;
DateType date;
MemHandle recordH;
DmOpenRef dbP;
RectangleType r;
ApptDBRecordType apptRec;
DmSearchStateType searchInfo;
UInt16 matchLength;
UInt32 matchPos;
// Display the heading line.
headerStringH = DmGetResource(strRsc, findDatebookHeaderStrID);
header = MemHandleLock(headerStringH);
done = FindDrawHeader(findParams, header);
MemHandleUnlock(headerStringH);
DmReleaseResource(headerStringH);
if (done)
return;
// Find the application's data file.
err = DmGetNextDatabaseByTypeCreator (true, &searchInfo, datebookDBType,
sysFileCDatebook, true, &cardNo, &dbID);
if (err)
{
findParams->more = false;
return;
}
// Open the appointment database.
dbP = DmOpenDatabase(cardNo, dbID, findParams->dbAccesMode);
if (!dbP)
{
findParams->more = false;
return;
}
// Search the description and note fields for the "find" string.
recordNum = findParams->recordNum;
while (true)
{
// Because applications can take a long time to finish a find when
// the result may be on the screen or for other reasons, users like
// to be able to stop the find. Stop the find if an event is pending.
// This stops if the user does something with the device. Because
// this call slows down the search we perform it every so many
// records instead of every record. The response time should still
// be short without introducing much extra work to the search.
// Note that in the implementation below, if the next 16th record is
// secret the check doesn't happen. Generally this shouldn't be a
// problem since if most of the records are secret then the search
// won't take long anyways!
if ((recordNum & 0x000f) == 0 && // every 16th record
EvtSysEventAvail(true))
{
// Stop the search process.
findParams->more = true;
break;
}
recordH = DmQueryNextInCategory (dbP, &recordNum, dmAllCategories);
//Should we wrap around to repeating and past events?
if (! recordH)
{
findParams->more = false;
break;
}
ApptGetRecord (dbP, recordNum, &apptRec, &recordH);
// Search the description field, if a match is not found search the
// note field.
fieldNum = descSeacrchFieldNum;
desc = apptRec.description;
match = TxtFindString (desc, findParams->strToFind, &matchPos, &matchLength);
if (! match)
{
note = apptRec.note;
if (note)
{
fieldNum = noteSeacrchFieldNum;
match = TxtFindString (note, findParams->strToFind, &matchPos, &matchLength);
}
}
// If a match occurred in a repeating event, make sure there is
// a displayable occurrence of the event.
if (match && apptRec.repeat)
{
date = apptRec.when->date;
match = ApptNextRepeat (&apptRec, &date, true);
}
if (match)
{
// Add the match to the find paramter block, if there is no room to
// display the match the following function will return true.
done = FindSaveMatch (findParams, recordNum, matchPos, fieldNum, matchLength, cardNo, dbID);
if (done)
{
MemHandleUnlock (recordH);
break;
}
// Get the bounds of the region where we will draw the results.
FindGetLineBounds (findParams, &r);
// Display the appointment info.
SearchDraw (&apptRec, r.topLeft.x+1, r.topLeft.y, r.extent.x-2);
findParams->lineNumber++;
}
MemHandleUnlock (recordH);
recordNum++;
}
Exit:
DmCloseDatabase (dbP);
}
/***********************************************************************
*
* FUNCTION: GoToItem
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -