palm-os-sdk/PalmOne/PIM/Samples/PIMExp/Src/ContactsForm.c

280 lines
7.6 KiB
C

#include <PalmOS.h>
#include <PalmOSGlue.h>
#include "PIMExp.h"
#include "PIMExp_Rsc.h"
#include "AddressDB.h"
#include "AddrDefines.h"
#include "palmOneCreators.h"
#include "Hs.h"
static UInt16 gCurrentRecIndex = 0;
static DmOpenRef gContactsDBRef = 0;
static Boolean gEditMode = false;
extern UInt16 TonesLibRefNum;
Boolean ContactsFormHandleEvent(EventType * eventP);
Err PrvGetContactsDBRef(DmOpenRef *dbRef);
Err PrvFillContactsInfoInFields(AddrDBRecordPtr recP);
Err PrvDisplayFirstContact();
Err PrvDisplayPrevContact();
Err PrvDisplayNextContact();
Err PrvSaveCurrentContact();
extern void * GetObjectPtr(UInt16 objectID);
extern Err SetFieldTextFromStr(UInt16 fieldID, Char *stringPtr, Boolean redraw);
extern Err GetFieldTextFromStr(UInt16 fieldID, Char *stringPtr);
extern void PrvEnableEditableField(UInt16 fieldID);
Boolean ContactsFormHandleEvent(EventType * eventP)
{
Boolean handled = false;
FormType * frmP;
DmOpenRef dbRef;
switch (eventP->eType)
{
case menuEvent:
return false;
case frmOpenEvent:
frmP = FrmGetActiveForm();
FrmDrawForm(frmP);
gEditMode = false;
PrvDisplayFirstContact();
handled = true;
break;
case frmUpdateEvent:
break;
case ctlSelectEvent:
{
if (eventP->data.ctlSelect.controlID == resButtonPrevContact)
{
if (gEditMode) PrvSaveCurrentContact();
PrvDisplayPrevContact();
handled = true;
}
else if (eventP->data.ctlSelect.controlID == resButtonNextContact)
{
if (gEditMode) PrvSaveCurrentContact();
PrvDisplayNextContact();
handled = true;
}
else if (eventP->data.ctlSelect.controlID == resButtonContactEditMode)
{
PrvEnableEditableField(resFieldLastName);
PrvEnableEditableField(resFieldFirstName);
PrvEnableEditableField(resFieldCompany);
PrvEnableEditableField(resFieldWork);
PrvEnableEditableField(resFieldHome);
PrvEnableEditableField(resFieldMobile);
gEditMode = true;
handled = true;
}
break;
}
case frmCloseEvent:
if (gEditMode) PrvSaveCurrentContact();
PrvGetContactsDBRef(&dbRef);
DmCloseDatabase(dbRef);
break;
}
return handled;
}
Err PrvGetContactsDBRef(DmOpenRef *dbRef)
{
if (!gContactsDBRef)
{
gContactsDBRef = DmOpenDatabaseByTypeCreator('DATA', kPalmOneCreatorIDContacts, dmModeReadWrite);
if (!gContactsDBRef)
{
FrmCustomAlert(CustomAlert, "Can't open Contacts DB", 0, 0);
return DmGetLastErr();
}
}
*dbRef = gContactsDBRef;
return errNone;
}
Err PrvDisplayFirstContact()
{
DmOpenRef dbRef = 0;
AddrDBRecordType addrRec;
MemHandle recH = 0;
PrvGetContactsDBRef(&dbRef); // Can use AddrDBGetDatabase
// but remember to modify source
// code to use new creator ID 'PAdd'
gCurrentRecIndex = 0;
if (!DmNumRecords(dbRef)) return errNone;
AddrDBGetRecord(dbRef, gCurrentRecIndex, &addrRec, &recH);
PrvFillContactsInfoInFields(&addrRec);
MemHandleUnlock(recH);
return errNone;
}
Err PrvDisplayPrevContact()
{
DmOpenRef dbRef = 0;
AddrDBRecordType addrRec;
MemHandle recH = 0;
PrvGetContactsDBRef(&dbRef); // Can use AddrDBGetDatabase
// but remember to modify source
// code to use new creator ID 'PAdd'
if (gCurrentRecIndex)
{
gCurrentRecIndex--;
AddrDBGetRecord(dbRef, gCurrentRecIndex, &addrRec, &recH);
PrvFillContactsInfoInFields(&addrRec);
MemHandleUnlock(recH);
}
return errNone;
}
Err PrvDisplayNextContact()
{
DmOpenRef dbRef = 0;
AddrDBRecordType addrRec;
MemHandle recH = 0;
PrvGetContactsDBRef(&dbRef); // Can use AddrDBGetDatabase
// but remember to modify source
// code to use new creator ID 'PAdd'
if (gCurrentRecIndex < ((Int32)(DmNumRecords(dbRef)) - 1))
{
gCurrentRecIndex++;
AddrDBGetRecord(dbRef, gCurrentRecIndex, &addrRec, &recH);
PrvFillContactsInfoInFields(&addrRec);
MemHandleUnlock(recH);
}
return errNone;
}
Err PrvFillContactsInfoInFields(AddrDBRecordPtr recP)
{
CharPtr ringToneName = NULL;
UInt16 maxLength = 32;
Err error;
error = TonesLibOpen (TonesLibRefNum);
if (error !=errNone)
return error;
if (recP->fields[name]) SetFieldTextFromStr(resFieldLastName, recP->fields[name], true);
else SetFieldTextFromStr(resFieldLastName, " ", true);
if (recP->fields[firstName])SetFieldTextFromStr(resFieldFirstName, recP->fields[firstName], true);
else SetFieldTextFromStr(resFieldFirstName, " ", true);
if (recP->fields[company]) SetFieldTextFromStr(resFieldCompany, recP->fields[company], true);
else SetFieldTextFromStr(resFieldCompany, " ", true);
if (recP->fields[phone1]) SetFieldTextFromStr(resFieldWork, recP->fields[phone1], true);
else SetFieldTextFromStr(resFieldWork, " ", true);
if (recP->fields[phone2]) SetFieldTextFromStr(resFieldHome, recP->fields[phone2], true);
else SetFieldTextFromStr(resFieldHome, " ", true);
if (recP->fields[phone3]) SetFieldTextFromStr(resFieldMobile, recP->fields[phone3], true);
else SetFieldTextFromStr(resFieldMobile, " ", true);
// changed 2.0
if (recP->rel2blobInfo.ringtoneInfo.id)
{
ringToneName = MemPtrNew(maxLength);
error = TonesLibGetToneName(TonesLibRefNum, recP->rel2blobInfo.ringtoneInfo, ringToneName, maxLength);
if (error == errNone)
SetFieldTextFromStr(resFieldRingTone, ringToneName, true);
MemPtrFree(ringToneName);
}
else
SetFieldTextFromStr(resFieldRingTone, " ", true);
//
return errNone;
}
Err PrvSaveCurrentContact()
{
DmOpenRef dbRef = 0;
AddrDBRecordType addrRec;
MemHandle recH = 0;
UInt16 dirtyRecIndex = gCurrentRecIndex;
AddrDBRecordFlags recFlags;
Char phnStr1[12], phnStr2[12], phnStr3[12];
MemSet(&recFlags, sizeof(AddrDBRecordFlags), 0);
PrvGetContactsDBRef(&dbRef);
AddrDBGetRecord(dbRef, dirtyRecIndex, &addrRec, &recH);
MemHandleUnlock(recH);
if ((recFlags.bits.name = FldDirty(GetObjectPtr(resFieldLastName))))
GetFieldTextFromStr(resFieldLastName, addrRec.fields[name]);
if ((recFlags.bits.firstName = FldDirty(GetObjectPtr(resFieldFirstName))))
GetFieldTextFromStr(resFieldFirstName, addrRec.fields[firstName]);
if ((recFlags.bits.company = FldDirty(GetObjectPtr(resFieldCompany))))
GetFieldTextFromStr(resFieldCompany, addrRec.fields[company]);
if ((recFlags.bits.phone1 = FldDirty(GetObjectPtr(resFieldWork))))
{
GetFieldTextFromStr(resFieldWork, phnStr1);
addrRec.fields[phone1] = phnStr1;
}
if ((recFlags.bits.phone2 = FldDirty(GetObjectPtr(resFieldHome))))
{
GetFieldTextFromStr(resFieldHome, phnStr2);
addrRec.fields[phone2] = phnStr2;
}
if ((recFlags.bits.phone3 = FldDirty(GetObjectPtr(resFieldMobile))))
{
GetFieldTextFromStr(resFieldMobile, phnStr3);
addrRec.fields[phone3] = phnStr3;
}
if (recFlags.bits.name | recFlags.bits.firstName | recFlags.bits.company |
recFlags.bits.phone1 | recFlags.bits.phone2 | recFlags.bits.phone3)
AddrDBChangeRecord(dbRef, &dirtyRecIndex, &addrRec, recFlags, false);
return errNone;
}