📄 memomain.c
字号:
/******************************************************************************
*
* Copyright (c) 1995-2003 PalmSource, Inc. All rights reserved.
*
* File: MemoMain.c
*
* Release: Palm OS 5 SDK (68K) R3.
*
* Description:
* This is the Memo application's main module. This module
* starts the application, dispatches events, and stops
* the application.
*
*****************************************************************************/
#include <TextMgr.h>
#include <PrivateRecords.h>
#include <Menu.h>
#include <TxtGlue.h>
#include <SystemResources.h>
#include <Preferences.h>
#include <Category.h>
#include <ErrorMgr.h>
#include <NotifyMgr.h>
#include <UIResources.h>
#include <FeatureMgr.h>
#include <StringMgr.h>
#include <UIColor.h>
#include <Find.h>
#include <SysEvtMgr.h>
#include <FontSelect.h>
#include <Graffiti.h>
#include <PhoneLookup.h>
#include <AboutBox.h>
#include <SoundMgr.h>
#include <TraceMgr.h>
#include <PalmUtils.h>
#include "MemoDB.h"
#include "MemoRsc.h"
#include "MemoMain.h"
/***********************************************************************
*
* Internal Constants
*
***********************************************************************/
#define memoVersionNum 3
#define memoPrefsVersionNum 3
#define memoPrefID 0x00
#define newMemoSize 64
#define noRecordSelected 0xffff
#define noRecordSelectedID -1
// Update codes, used to determine how the to do list view should
// be redrawn.
#define updateRedrawAll 0x00
#define updateCategoryChanged 0x01
#define updateDisplayOptsChanged 0x02
#define updateFontChanged 0x04
//The listViewIndexStringSize is the size of the character array
//that holds the string representation of the index that is displayed to
//the left of the memo title in the list view. The string can have a
//range of 1 - 99,999 with the current value.
#define listViewIndexStringSize 7
/***********************************************************************
*
* Internal Structures
*
***********************************************************************/
typedef struct {
UInt16 topVisibleRecord;
UInt16 currentRecord;
UInt16 currentView;
UInt16 currentCategory;
FontID v20editFont;
UInt8 reserved1;
UInt16 editScrollPosition;
Boolean showAllCategories;
UInt8 reserved2;
UInt32 currentRecordID;
Boolean saveBackup;
// Version 2 preferences
FontID v20listFont;
// Version 3 preferences
FontID editFont;
FontID listFont;
} MemoPreferenceType;
typedef struct {
DmOpenRef db;
Char * categoryName;
UInt16 categoryIndex;
} AcceptBeamType;
/***********************************************************************
*
* Global variables
*
***********************************************************************/
static DmOpenRef MemoDB;
static char CategoryName [dmCategoryLength];
static UInt16 MemosInCategory;
static privateRecordViewEnum PrivateRecordVisualStatus;
static MenuBarPtr CurrentMenu;
// The following global variable are saved to a state file.
static UInt16 TopVisibleRecord = 0;
static UInt16 CurrentRecord = noRecordSelected;
static UInt16 CurrentView = ListView;
static UInt16 CurrentCategory = dmAllCategories;
static Boolean ShowAllCategories = true;
static FontID ListFont = stdFont;
static FontID EditFont = stdFont;
static UInt16 EditScrollPosition = 0;
static Boolean SaveBackup = true;
static Boolean InPhoneLookup = false;
static UInt16 TopRowPositionInCategory;
/***********************************************************************
*
* Internal Functions
*
***********************************************************************/
static Boolean EditViewDeleteRecord (void);
static void MemoLoadPrefs(UInt32* currentRecordID);
static void MemoSavePrefs(UInt16 scrollPosition);
static void ListViewDisplayMask (RectanglePtr bounds);
static Boolean ListViewUpdateDisplay (UInt16 updateCode);
static void RegisterLocaleChangingNotification(void);
/***********************************************************************
*
* FUNCTION: SetDBBackupBit
*
* DESCRIPTION: This routine sets the backup bit on the given database.
* This is to aid syncs with non Palm software.
* If no DB is given, open the app's default database and set
* the backup bit on it.
*
* PARAMETERS: dbP - the database to set backup bit,
* can be NULL to indicate app's default database
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* grant 4/1/99 Initial Revision
*
***********************************************************************/
void SetDBBackupBit(DmOpenRef dbP)
{
DmOpenRef localDBP;
LocalID dbID;
UInt16 cardNo;
UInt16 attributes;
// Open database if necessary. If it doesn't exist, simply exit (don't create it).
if (dbP == NULL)
{
localDBP = DmOpenDatabaseByTypeCreator (memoDBType, sysFileCMemo, dmModeReadWrite);
if (localDBP == NULL) return;
}
else
{
localDBP = dbP;
}
// now set the backup bit on localDBP
DmOpenDatabaseInfo(localDBP, &dbID, NULL, NULL, &cardNo, NULL);
DmDatabaseInfo(cardNo, dbID, NULL, &attributes, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
attributes |= dmHdrAttrBackup;
DmSetDatabaseInfo(cardNo, dbID, NULL, &attributes, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
// close database if necessary
if (dbP == NULL)
{
DmCloseDatabase(localDBP);
}
}
/***********************************************************************
*
* FUNCTION: CreateDefaultDatabase
*
* DESCRIPTION: This routine creates the default database from the
* saved image in a resource in the application.
*
* PARAMETERS: none
*
* RETURNED: 0 - if no error
* otherwise appropriate error value
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vivek 8/17/00 Initial Revision
*
***********************************************************************/
static Err CreateDefaultDatabase(void)
{
MemHandle resH;
DmOpenRef dbP;
Err error = errNone;
// Attempt to get our default data image and create our
// database.
resH = DmGet1Resource(sysResTDefaultDB, sysResIDDefaultDB);
if (resH)
{
error = DmCreateDatabaseFromImage(MemHandleLock(resH));
if (!error)
{
MemHandleUnlock(resH);
DmReleaseResource(resH);
// Set the bakcup bit on the newly created DB.
SetDBBackupBit(NULL);
}
}
// If there is no default data, or we had a problem creating it,
// then attempt to create an empty database.
if (!resH || error)
{
error = MemoGetDatabase (&dbP, dmModeReadWrite);
if (!error)
DmCloseDatabase(dbP);
}
return error;
}
/***********************************************************************
*
* FUNCTION: StartApplication
*
* DESCRIPTION: This routine opens the application's database, loads the
* saved-state information and initializes global variables.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
* grant 4/6/99 Moved code to set backup bit into SetDBBackupBit
* jmp 10/2/99 Call new MemoGetDataBase() to create database
* if it doesn't already exist.
*
***********************************************************************/
static UInt16 StartApplication (void)
{
Err err = 0;
UInt16 attr;
UInt16 mode;
UInt32 uniqueID;
UInt32 currentRecordID = 0;
Boolean recordFound = false;
#if EMULATION_LEVEL != EMULATION_NONE
RegisterLocaleChangingNotification();
#endif
// Determime if secret record should be shown.
PrivateRecordVisualStatus = (privateRecordViewEnum)PrefGetPreference (prefShowPrivateRecords);
if (PrivateRecordVisualStatus == hidePrivateRecords)
{
mode = dmModeReadWrite;
}
else
{
mode = dmModeReadWrite | dmModeShowSecret;
}
// Find the application's data file. If it doesn't exist, create it.
err = MemoGetDatabase (&MemoDB, mode);
if (err)
return err;
// Read the preferences.
MemoLoadPrefs(¤tRecordID);
// The file may have been synchronized since the last time we used it,
// check that the current record and the currrent category still
// exist. Also, if secret records are being hidden, check if the
// the current record is marked secret.
CategoryGetName (MemoDB, CurrentCategory, CategoryName);
if (*CategoryName == 0)
{
CurrentCategory = dmAllCategories;
ShowAllCategories = true;
}
if ( DmQueryRecord (MemoDB, CurrentRecord) != 0)
{
DmRecordInfo (MemoDB, CurrentRecord, &attr, &uniqueID, NULL);
recordFound = (uniqueID == currentRecordID) &&
((PrivateRecordVisualStatus == showPrivateRecords) ||
(!(attr & dmRecAttrSecret)));
}
if (! recordFound)
{
TopVisibleRecord = 0;
CurrentRecord = noRecordSelected;
CurrentView = ListView;
EditScrollPosition = 0;
}
if (ShowAllCategories)
MemosInCategory = DmNumRecordsInCategory (MemoDB, dmAllCategories);
else
MemosInCategory = DmNumRecordsInCategory (MemoDB, CurrentCategory);
return (err);
}
/***********************************************************************
*
* FUNCTION: StopApplication
*
* DESCRIPTION: This routine closes the application's database
* and saves the current state of the application.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
*
***********************************************************************/
static void StopApplication (void)
{
UInt16 scrollPosition = 0;
FormPtr frm;
FieldPtr fld;
// If we are in the "edit view", get the current scroll position.
if ((CurrentView == EditView) && (CurrentRecord != noRecordSelected))
{
frm = FrmGetFormPtr (EditView);
fld = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, EditMemoField));
scrollPosition = FldGetScrollPosition (fld);
}
// Close all open forms, this will force any unsaved data to
// be written to the database.
FrmCloseAllForms ();
// Write the preferences / saved-state information.
MemoSavePrefs(scrollPosition);
// Close the application's data file.
DmCloseDatabase (MemoDB);
}
/***********************************************************************
*
* FUNCTION: SyncNotification
*
* DESCRIPTION: This routine is an entry point of the memo application.
* It is called when the application's database is
* synchronized. This routine will resort the database.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 10/17/96 Initial Revision
* jmp 10/02/99 Changed call to DmOpenDatabaseByTypeCreator() to
* MemoGetDatabase().
*
***********************************************************************/
static void SyncNotification (void)
{
DmOpenRef dbP;
Err err;
// Find the application's data file.
err = MemoGetDatabase(&dbP, dmModeReadWrite);
if (err)
return;
// Resort the database.
MemoSort (dbP);
DmCloseDatabase (dbP);
}
/***********************************************************************
*
* FUNCTION: RegisterLocaleChangingNotification
*
* DESCRIPTION: Register for NotifyMgr notifications for locale chagning.
* DOLATER : This function and the one above can be rolled into one.
*
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* vivek 8/01/00 Initial Revision
*
***********************************************************************/
void RegisterLocaleChangingNotification(void)
{
UInt16 cardNo;
LocalID dbID;
Err err;
err = SysCurAppDatabase(&cardNo, &dbID);
ErrNonFatalDisplayIf(err != errNone, "can't get app db info");
if(err == errNone)
{
err = SysNotifyRegister(cardNo, dbID, sysNotifyLocaleChangedEvent,
NULL, sysNotifyNormalPriority, NULL);
#if EMULATION_LEVEL == EMULATION_NONE
ErrNonFatalDisplayIf((err != errNone) && (err != sysNotifyErrDuplicateEntry), "can't register");
#endif
}
return;
}
/***********************************************************************
*
* FUNCTION: RegisterData
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -