📄 datepref.c
字号:
/******************************************************************************
*
* Copyright (c) 1995-2003 PalmSource, Inc. All rights reserved.
*
* File: DatePref.c
*
* Release: Palm OS 5 SDK (68K) R3.
*
* Description:
* This module contains the routines that handle the Datebook
* applications's preferences.
*
*****************************************************************************/
#include <PalmOS.h>
#include "Datebook.h"
#define numRepeats 5
#define numPlayEverys 4
#define defaultRepeatsLevel 3
#define defaultPlayEveryLevel 2
// Max len of sound trigger label placeholder
#define soundTriggerLabelLen 32
/***********************************************************************
*
* Protoypes
*
**********************************************************************/
static void SetSoundLabel(FormPtr formP, const char* labelP);
static void FreeAll(void);
/***********************************************************************
*
* Global variables
*
**********************************************************************/
// Number of times to remind the person
static UInt16 RepeatCountMappings [numRepeats] =
{
1, 2, 3, 5, 10
};
// How many seconds between repeats
static UInt16 RepeatIntervalMappings [numPlayEverys] =
{
1, 5, 10, 30
};
// Placeholder for sound trigger label
static Char * soundTriggerLabelP;
// handle to the list containing names and DB info of MIDI tracks.
// Each entry is of type SndMidiListItemType.
static MemHandle gMidiListH;
// number of entries in the MIDI list
static UInt16 gMidiCount;
// The following global variable are only valid while editng the datebook's
// preferences.
static UInt16 PrefDayStartHour;
static UInt16 PrefDayEndHour;
// The following globals are for the repeat rates of the alarms preferences.
static UInt16 PrefSoundRepeatCount; // number of times to repeat alarm sound
static UInt16 PrefSoundRepeatInterval; // interval between repeat sounds, in seconds
// The following globals are for the repeat rates of the alarms preferences.
static UInt32 PrefSoundUniqueRecID; // Alarm sound MIDI file unique ID record identifier
/***********************************************************************
*
* FUNCTION: GetObjectPtr
*
* DESCRIPTION: This routine returns a pointer to an object in the current
* form.
*
* PARAMETERS: formId - id of the form to display
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
*
***********************************************************************/
static void * GetObjectPtr (UInt16 objectID)
{
FormPtr frm;
frm = FrmGetActiveForm ();
return (FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, objectID)));
}
/***********************************************************************
*
* FUNCTION: MidiPickListDrawItem
*
* DESCRIPTION: Draw a midi list item.
*
* PARAMETERS: itemNum - which shortcut to draw
* bounds - bounds in which to draw the text
* unusedP - pointer to data (not used)
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vnk 8/8/97 Initial version
* trev 8/14/97 Ported to dateBook App
* frigino 8/18/97 Modified to truncate items in list with ...
*
***********************************************************************/
static void MidiPickListDrawItem (Int16 itemNum, RectanglePtr bounds,
Char **unusedP)
{
#pragma unused (unusedP)
Char * itemTextP;
Int16 itemTextLen;
Int16 itemWidth;
SndMidiListItemType* listP;
ErrNonFatalDisplayIf(itemNum >= gMidiCount, "index out of bounds");
// Bail out if MIDI sound list is empty
if (gMidiListH == NULL)
return;
listP = MemHandleLock(gMidiListH);
itemTextP = listP[itemNum].name;
// Truncate the item with an ellipsis if it doesnt fit in the list width.
// Get the item text length
itemTextLen = StrLen(itemTextP);
// Get the width of the text
itemWidth = FntCharsWidth(itemTextP, itemTextLen);
// Does it fit?
if (itemWidth <= bounds->extent.x)
{
// Draw entire item text as is
WinDrawChars(itemTextP, itemTextLen, bounds->topLeft.x, bounds->topLeft.y);
}
else
{
// We're going to truncate the item text
Boolean ignored;
char ellipsisChar = chrEllipsis;
// Set the new max item width
itemWidth = bounds->extent.x - FntCharWidth(ellipsisChar);
// Find the item length that fits in the bounds minus the ellipsis
FntCharsInWidth(itemTextP, &itemWidth, &itemTextLen, &ignored);
// Draw item text that fits
WinDrawChars(itemTextP, itemTextLen, bounds->topLeft.x, bounds->topLeft.y);
// Draw ellipsis char
WinDrawChars(&ellipsisChar, 1, bounds->topLeft.x + itemWidth, bounds->topLeft.y);
}
// Unlock list items
MemPtrUnlock(listP);
}
/***********************************************************************
*
* FUNCTION: CreateMidiPickList
*
* DESCRIPTION: Create a list of midi sounds available.
*
* PARAMETERS: formP -- the form that owns the list to contain the panel list
* objIndex -- the index of the list within the form
* funcP -- item draw function
*
* RETURNED: panelCount and panelIDsP are set
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vmk 8/8/97 Initial version
* trev 8/14/97 Ported to dateBook App
* frigino 8/20/97 Added maximum widening of MIDI sound list
*
***********************************************************************/
static void CreateMidiPickList(FormType *formP, UInt16 objIndex, ListDrawDataFuncPtr funcP)
{
SndMidiListItemType* midiListP;
UInt16 i;
UInt16 listWidth;
UInt16 maxListWidth;
Boolean bSuccess;
RectangleType formBounds, listBounds;
ListPtr listP;
// Load list of midi record entries
bSuccess = SndCreateMidiList(sysFileCSystem, false, &gMidiCount, &gMidiListH);
if ( !bSuccess )
{
gMidiListH = 0;
gMidiCount = 0;
return;
}
listP = FrmGetObjectPtr(formP, objIndex);
// Now set the list to hold the number of sounds found. There
// is no array of text to use.
LstSetListChoices(listP, NULL, gMidiCount);
// Now resize the list to the number of panel found
LstSetHeight (listP, gMidiCount);
// Because there is no array of text to use, we need a function
// to interpret the panelIDsP list and draw the list items.
LstSetDrawFunction(listP, funcP);
// Make the list as wide as possible to display the full sound names
// when it is popped winUp.
// Lock MIDI sound list
midiListP = MemHandleLock(gMidiListH);
// Initialize max width
maxListWidth = 0;
// Iterate through each item and get its width
for (i = 0; i < gMidiCount; i++)
{
// Get the width of this item
listWidth = FntCharsWidth(midiListP[i].name, StrLen(midiListP[i].name));
// If item width is greater that max, swap it
if (listWidth > maxListWidth)
{
maxListWidth = listWidth;
}
}
// Unlock MIDI sound list
MemPtrUnlock(midiListP);
// Set list width to max width + left margin
FrmGetObjectBounds(formP, objIndex, &listBounds);
listBounds.extent.x = maxListWidth + 2;
// Get pref dialog window extent
FrmGetFormBounds(FrmGetActiveForm(), &formBounds);
// Make sure width is not more than window extent
if (listBounds.extent.x > formBounds.extent.x)
{
listBounds.extent.x = formBounds.extent.x;
}
// Move list left if it doesnt fit in window
if (listBounds.topLeft.x + listBounds.extent.x > formBounds.extent.x)
{
listBounds.topLeft.x = formBounds.extent.x - listBounds.extent.x;
}
FrmSetObjectBounds(formP, objIndex, &listBounds);
}
/***********************************************************************
*
* FUNCTION: FreeMidiPickList
*
* DESCRIPTION: Free the list of midi sounds available.
*
* PARAMETERS: none
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vmk 8/11/97 Initial version
* trev 08/14/97 Ported to dateBook App
*
***********************************************************************/
static void FreeMidiPickList(void)
{
if ( gMidiListH )
{
MemHandleFree(gMidiListH);
gMidiListH = 0;
gMidiCount = 0;
}
}
/***********************************************************************
*
* FUNCTION: MapToPosition
*
* DESCRIPTION: Map a value to it's position in an array. If the passed
* value is not found in the mappings array, a default
* mappings item will be returned.
*
* PARAMETERS: value - value to look for
*
* RETURNED: position value found in
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* kcr 9/13/95 Initial Revision
* frigino 8/21/97 Converted all params to UInt16
*
***********************************************************************/
static UInt16 MapToPosition (UInt16* mappingArray, UInt16 value,
UInt16 mappings, UInt16 defaultItem)
{
UInt16 i;
i = 0;
while (mappingArray[i] != value && i < mappings)
i++;
if (i >= mappings)
return defaultItem;
return i;
} // end of MapToPosition
/***********************************************************************
*
* FUNCTION: PreferencesUpdateScrollers
*
* DESCRIPTION: This routine updates the day-start and day-end time
* scrollers
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 8/3/95 Initial Revision
*
***********************************************************************/
static void PreferencesUpdateScrollers ()
{
FormPtr frm;
UInt16 upIndex;
UInt16 downIndex;
// Update the start time scrollers.
frm = FrmGetActiveForm ();
upIndex = FrmGetObjectIndex (frm, PreferStartUpButton);
downIndex = FrmGetObjectIndex (frm, PreferStartDownButton);
FrmUpdateScrollers (frm, upIndex, downIndex,
PrefDayStartHour<23, PrefDayStartHour>0);
// Update the end time scrollers.
upIndex = FrmGetObjectIndex (frm, PreferEndUpButton);
downIndex = FrmGetObjectIndex (frm, PreferEndDownButton);
FrmUpdateScrollers (frm, upIndex, downIndex,
PrefDayEndHour<23, PrefDayEndHour>0);
}
/***********************************************************************
*
* FUNCTION: PreferencesAlarmOnOff
*
* DESCRIPTION: This routine shows or hides the alarm preset ui object.
* It is call when the alarm preset check box is turn on
* or off.
*
* PARAMETERS: on - true to show alarm preset ui, false to hide.
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 8/3/95 Initial Revision
*
***********************************************************************/
static void PreferencesAlarmPresetOnOff (Boolean on)
{
UInt16 fldIndex;
UInt16 ctlIndex;
Char * textP;
Char * label;
MemHandle textH;
FormPtr frm;
ListPtr lst;
FieldPtr fld;
ControlPtr ctl;
frm = FrmGetActiveForm ();
fld = GetObjectPtr (PreferAlarmField);
fldIndex = FrmGetObjectIndex (frm, PreferAlarmField);
ctlIndex = FrmGetObjectIndex (frm, PreferAlarmUnitTrigger);
if (on)
{
// Set the value of the alarm advance field.
textH = FldGetTextHandle (fld);
if (textH) MemHandleFree (textH);
textH = MemHandleNew (maxAdvanceFieldLen);
textP = MemHandleLock (textH);
StrIToA (textP, defaultAlarmAdvance);
MemPtrUnlock (textP);
FldSetTextHandle (fld, textH);
// Set the alarm advance unit of measure (minutes, hours, or days).
lst = GetObjectPtr (PreferAlarmList);
LstSetSelection (lst, defaultAdvanceUnit);
label = LstGetSelectionText (lst, defaultAdvanceUnit);
ctl = GetObjectPtr (PreferAlarmUnitTrigger);
CtlSetLabel (ctl, label);
// Show the alarm advance ui objects.
FrmShowObject (frm, fldIndex);
FrmShowObject (frm, ctlIndex);
FrmSetFocus (frm, fldIndex);
}
else
{
FrmSetFocus (frm, noFocus);
FldFreeMemory (fld);
// Hide the alarm advance ui objects.
FrmHideObject (frm, fldIndex);
FrmHideObject (frm, ctlIndex);
}
}
/***********************************************************************
*
* FUNCTION: PreferencesDrawTime
*
* DESCRIPTION: This routine draw the time passed at the location specified.
*
* PARAMETERS: hour - hour to draw, minutes is assumed to be zero
* isStartTime - true if we're drawing the start time
*
* RETURNED: nothing
*
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 9/7/95 Initial Revision
*
***********************************************************************/
static void PreferencesDrawTime (UInt8 hour, Boolean isStartTime)
{
Char str[timeStringLength];
UInt16 id;
UInt16 len;
UInt16 index;
Int16 x, y;
FontID curFont;
FormPtr frm;
RectangleType r;
// Compute the drawing bounds.
if (isStartTime)
id = PreferStartUpButton;
else
id = PreferEndUpButton;
frm = FrmGetActiveForm ();
index = FrmGetObjectIndex (frm, id);
FrmGetObjectPosition (frm, index, &x, &y);
r.topLeft.x = x - dayRangeTimeWidth - 5;
r.topLeft.y = y + 2;
r.extent.x = dayRangeTimeWidth;
r.extent.y = dayRangeTimeHeight;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -