home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 Mobile
/
Chip_Mobile_2001.iso
/
palm
/
hobby
/
ghardeno
/
ghardeno.EXE
/
Ghardeno.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-10-03
|
15KB
|
580 lines
/*
Ghardeno: Information Gardening for PalmOS
Copyright (C) 2000 Laurent Moussault
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <Common.h>
#include <System/SysAll.h>
#include <UI/UIAll.h>
#include "DBC.h"
#include "Resources.h"
#include "MyTable.h"
#include "Database.h"
#include "Ghardeno.h"
#define ghardenoAppID 'Grdn'
#define ghardenoDBType 'Data'
DmOpenRef GhardenoDB = 0;
char GhardenoDBName[] = "GhardenoDB";
Char CategoryNameBuffer[dmCategoryLength] = "";
void InitNewRecord (Char *p) {
FormType *f = 0;
REQUIRE(p != 0);
f = FrmGetActiveForm(); CHECK(f != 0);
DmSet(p,0,MemPtrSize(p),0);
/*
if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_checked))) {
DmSet(p,0,1,(*p&3)|4);
}
*/
if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_normalFont))) {
DmSet(p,0,1,(*p&4)|0);
} else if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_boldFont))) {
DmSet(p,0,1,(*p&4)|1);
} else if(FrmGetControlValue(f,FrmGetObjectIndex(f,id_largeFont))) {
DmSet(p,0,1,(*p&4)|2);
}
}
Err OpenDatabase(void)
{
UInt in = 0;
VoidHand h;
void *p;
UInt cn;
LocalID db;
LocalID ai;
AppInfoType *aip;
VoidHand vh;
Word at = 0;
GhardenoDB = DmOpenDatabaseByTypeCreator(ghardenoDBType,
ghardenoAppID,dmModeReadWrite );
if(!GhardenoDB) {
if(DmCreateDatabase(0,GhardenoDBName,ghardenoAppID,
ghardenoDBType,false ))
return 1;
GhardenoDB = DmOpenDatabaseByTypeCreator(ghardenoDBType,
ghardenoAppID,dmModeReadWrite );
CHECK(GhardenoDB != 0);
// Initialize the Database Global Info
if(DmOpenDatabaseInfo(GhardenoDB,&db,NULL,NULL,&cn,NULL))
return dmErrInvalidParam;
vh = DmNewHandle(GhardenoDB,sizeof(AppInfoType));
if(!vh)
return dmErrMemError;
ai = MemHandleToLocalID(vh);
DmDatabaseInfo(cn,db,0,&at,0,0,0,0,0,
0,0,0,0 );
at |= dmHdrAttrBackup;
DmSetDatabaseInfo(cn,db,NULL,&at,NULL,NULL,NULL,NULL,NULL,
&ai,NULL,NULL,NULL );
aip = (AppInfoPtr)MemHandleLock(vh);
CHECK(aip != NULL);
DmSet(aip,0,sizeof(AppInfoType),0);
CategoryInitialize(aip,id_categoryNames);
MemHandleUnlock(vh);
}
return 0;
}
int StartApplication (void) {
int e;
DbInit();
e = OpenDatabase();
if(e)
return e;
FrmGotoForm(id_ghardenoForm);
}
void LoadPreferences(MyTableType *t) {
PreferenceType p;
Word s = 0;
Word v = 0;
s = sizeof(PreferenceType);
v = PrefGetAppPreferences(ghardenoAppID,0,&p,&s,true);
if(v != noPreferenceFound) {
t->category = p.category;
t->positionInCategory = p.positionInCategory;
t->currentIndex = p.currentIndex;
t->isSelected = p.isSelected;
t->isEditing = p.isEditing;
}
}
void SavePreferences(MyTableType *t) {
PreferenceType p;
p.category = t->category;
p.positionInCategory = t->positionInCategory;
p.currentIndex = t->currentIndex;
p.isSelected = t->isSelected;
p.isEditing = t->isEditing;
PrefSetAppPreferences(ghardenoAppID,0,1,&p,sizeof(PreferenceType),true);
}
void InitGhardenoForm () {
FormType *f = NULL;
FieldType *fi = NULL;
VoidHand h = NULL;
VoidHand oh = NULL;
MyTableType *t;
ControlType *ct = 0;
UInt n, r;
int i;
//ListType *l = 0;
MtaInit();
f = FrmGetActiveForm(); CHECK(f);
//l = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryList)); CHECK(l);
//CategoryCreateList(GhardenoDB,l,0,true,true,1,id_editCategoryString,true);
fi = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_field)); CHECK(fi);
oh = (VoidHand)FldGetTextHandle(fi);
if(oh != NULL)
MemHandleFree(oh);
// Prepare the table-gadget
h = MtaNew(f,id_table,mtaRowNumber,GhardenoDB); CHECK(h != 0);
t = MemHandleLock(h);
MtaSetLoadRecordProcedure(t,DbLoadRecord);
LoadPreferences(t);
CategoryGetName(t->db,t->category,CategoryNameBuffer);
ct =FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryTrigger)); CHECK(ct != 0);
CategorySetTriggerLabel(ct,CategoryNameBuffer);
MtaFillTableFromTop(t,t->positionInCategory);
if(t->isSelected && t->isEditing) {
MtaEditSelectedRow(t);
}
// Dessin
//FrmHideObject(f,FrmGetObjectIndex(f,id_field));
FrmDrawForm(f);
MtaRedraw(t);
UpdateToolBar(t);
MemHandleUnlock (h);
}
void UpdateToolBar (MyTableType *t) {
VoidHand h = 0;
FormType *f = NULL;
Char *r;
ControlType *a[3];
ControlType *c, *de /*, *bu, *bd */;
int i;
REQUIRE(t != NULL);
f = FrmGetActiveForm(); CHECK(f);
a[0] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_normalFont));
a[1] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_boldFont));
a[2] = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_largeFont));
c = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_checked));
//bu = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_up));
//bd = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_down));
de = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_remove));
if(! t->isSelected) {
FrmSetControlGroupSelection(f,1,id_normalFont);
CtlSetValue(c,0);
//CtlSetEnabled(bu,false);
//CtlSetEnabled(bd,false);
CtlSetEnabled(de,false);
} else {
h = DmQueryRecord(t->db,t->currentIndex); CHECK(h != 0);
r = MemHandleLock(h);
CHECK(r != NULL);
for (i=0; i<3; i++) {
CtlSetEnabled(a[i],true);
CtlSetValue(a[i],i==(*r&3));
}
CtlSetEnabled(c,true);
CtlSetValue(c,*r&4);
//CtlSetEnabled(bu,true);
//CtlSetEnabled(bd,true);
CtlSetEnabled(de,true);
MemHandleUnlock(h);
}
}
Boolean toolBarHandleEvent(EventType *ev) {
Boolean result = false;
FormType *f;
Word ti;
VoidHand th = 0;
VoidHand h = 0;
MyTableType *t;
Char *r;
Boolean d = false;
REQUIRE(ev != 0);
f = FrmGetActiveForm(); CHECK(f != 0);
ti = FrmGetObjectIndex(f,id_table);
th = FrmGetGadgetData(f,ti); CHECK(th != 0);
t = MemHandleLock(th); CHECK(t != 0);
if(t->isSelected) {
h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
r = MemHandleLock(h); CHECK(r != 0);
switch(ev->data.ctlSelect.controlID) {
case id_checked:
if (FrmGetControlValue(f,FrmGetObjectIndex(f,id_checked)))
{
DmSet (r, 0, 1, (*r&3)|4);
CHECK (t->isSelected);
MtaUnselect (t);
MtaChangeSelectionIndex (t, t->currentIndex);
}
else
{
DmSet (r, 0, 1, *r&3);
}
MtaUpdateCurrentRow(t);
MtaRedraw(t);
result = true;
break;
case id_normalFont:
DmSet(r,0,1,(*r&4)|0);
MtaUpdateCurrentRow(t);
MtaRedraw(t);
result = true;
break;
case id_boldFont:
DmSet(r,0,1,(*r&4)|1);
MtaUpdateCurrentRow(t);
MtaRedraw(t);
result = true;
break;
case id_largeFont:
DmSet(r,0,1,(*r&4)|2);
MtaUpdateCurrentRow(t);
MtaRedraw(t);
result = true;
break;
}
MemHandleUnlock(h);
}
if(!result) {
switch(ev->data.ctlSelect.controlID) {
case id_new:
MtaNewRecord(t);
MtaEditSelectedRow(t);
MtaRedraw(t);
UpdateToolBar(t);
result = true;
break;
case id_remove:
if(t->isSelected) {
h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
r = MemHandleLock(h); CHECK(r != 0);
d = (FrmCustomAlert(id_deleteForm,&r[1],0,0) == 0);
MemHandleUnlock(h);
if(d) {
MtaDeleteCurrentRecord(t);
MtaRedraw(t);
UpdateToolBar(t);
}
}
result = true;
break;
case id_up:
MtaScrollUpOneRow(t);
MtaRedraw(t);
result = true;
break;
case id_down:
MtaScrollDownOneRow(t);
MtaRedraw(t);
result = true;
break;
}
}
MemHandleUnlock(th);
return result;
}
void HandleCategoryTrigger() {
FormType *f = 0;
VoidHand h = 0;
MyTableType *t = 0;
Boolean e = false;
//Char n[dmCategoryLength];
Char *n = 0;
ControlType *ct = 0;
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h != 0);
t = MemHandleLock(h); CHECK(t!= 0);
if(t->isSelected) {
MtaUnselect(t);
}
ct = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryTrigger)); CHECK(ct != 0);
n = (Char *)CtlGetLabel(ct); CHECK(n != 0);
e = CategorySelect(t->db,f,id_categoryTrigger,id_categoryList,true,
&t->category,n/*CategoryName*/,1,id_editCategoryString );
MtaFillTableFromTop(t,0);
MtaRedraw(t);
UpdateToolBar(t);
MemHandleUnlock(h);
}
Boolean ghardenoHandleEvent (EventType *ev) {
Boolean result = false;
FormType *f;
Word ti;
RectangleType b;
VoidHand h;
MyTableType *t;
FieldType *fi = NULL;
Char *r = 0;
Boolean d = false;
int dx = 0;
Word s = 0;
Char n[dmCategoryLength];
REQUIRE(ev != NULL);
switch (ev->eType) {
case frmOpenEvent:
InitGhardenoForm ();
result = true;
break;
case ctlSelectEvent:
if(ev->data.ctlSelect.controlID == id_categoryTrigger) {
//CHECK(ev->data.popSelect.priorSelection == t->category);
HandleCategoryTrigger();
result = true;
} else {
result = toolBarHandleEvent(ev);
}
break;
case menuEvent:
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
t = MemHandleLock(h); CHECK(t);
fi = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_field)); CHECK(fi);
switch(ev->data.menu.itemID) {
case id_newItem:
SndPlaySystemSound(sndClick);
MtaNewRecord(t);
MtaRedraw(t);
UpdateToolBar(t);
MtaEditSelectedRow(t);
result = true;
break;
case id_removeItem:
if(t->isSelected) {
h = DmQueryRecord(GhardenoDB,t->currentIndex); CHECK(h != 0);
r = MemHandleLock(h); CHECK(r != 0);
d = (FrmCustomAlert(id_deleteForm,&r[1],0,0) == 0);
MemHandleUnlock(h);
if(d) {
MtaDeleteCurrentRecord(t);
MtaRedraw(t);
UpdateToolBar(t);
}
}
result = true;
break;
case id_purge:
//SndPlaySystemSound(sndClick);
CategoryGetName(t->db,t->category,n);
if(t->category == dmAllCategories) {
d = (FrmCustomAlert(id_purgeAllForm,n,0,0) == 0);
} else {
d = (FrmCustomAlert(id_purgeForm,n,0,0) == 0);
}
if(d) {
t->categorySize -= DbPurgeStrokenItems(t->db,t->category);
if(t->isSelected) {
MtaUnselect(t);
}
MtaFillTableFromTop(t,0);
MtaRedraw(t);
UpdateToolBar(t);
}
result = true;
break;
case id_undo:
if(t->isEditing) {
FldUndo(fi);
result = true;
}
break;
case id_cut:
if(t->isEditing) {
FldCut(fi);
result = true;
}
break;
case id_copy:
if(t->isEditing) {
FldCopy(fi);
result = true;
}
break;
case id_paste:
if(t->isEditing) {
FldPaste(fi);
result = true;
}
break;
case id_selectAll:
if(t->isEditing) {
FldSetSelection(fi,0,FldGetTextLength(fi));
result = true;
}
break;
case id_keyboard:
SysKeyboardDialog(kbdDefault);
result = true;
break;
case id_graffiti:
SysGraffitiReferenceDialog(referenceDefault);
result = true;
break;
case id_preferences:
FrmAlert(id_preferencesForm);
result = true;
break;
case id_about:
FrmAlert(id_aboutForm);
result = true;
break;
}
MemPtrUnlock(t);
break;
case penDownEvent:
f = FrmGetActiveForm(); CHECK(f);
ti = FrmGetObjectIndex(f,id_table);
FrmGetObjectBounds (f,ti,&b);
if(RctPtInRectangle(ev->screenX,ev->screenY,&b)) {
h = FrmGetGadgetData(f,ti); CHECK(h);
t = MemHandleLock(h); CHECK(t);
result = MtaHandlePenDownEvent(t,ev);
MemHandleUnlock(h);
}
break;
case frmTitleSelectEvent:
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
t = MemHandleLock(h); CHECK(t);
if(t->isSelected) {
MtaUnselect(t);
MtaRedraw(t);
UpdateToolBar(t);
}
MemHandleUnlock(h);
result = true;
break;
case sclExitEvent:
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
t = MemHandleLock(h); CHECK(t);
MtaScrollTo(t,ev->data.sclExit.newValue);
MemHandleUnlock(h);
result = true;
break;
/*
case sclRepeatEvent:
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
t = MemHandleLock(h); CHECK(t);
dx = ev->data.sclRepeat.newValue - ev->data.sclRepeat.value;
while(dx < 0) {
MtaScrollUpOneRow(t);
MtaRedraw(t);
dx++;
}
while(dx > 0) {
MtaScrollDownOneRow(t);
MtaRedraw(t);
dx--;
}
//MtaScrollTo(t,ev->data.sclRepeat.newValue);
MemHandleUnlock(h);
// Warning: if we set 'result' to 'true' the scrollbar will scroll
// only once !
break;
*/
case keyDownEvent:
f = FrmGetActiveForm(); CHECK(f);
h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table)); CHECK(h);
t = MemHandleLock(h); CHECK(t);
if(ev->data.keyDown.chr == pageDownChr) {
MtaScrollDownOnePage(t);
MtaRedraw(t);
result = true;
} else if(ev->data.keyDown.chr == pageUpChr) {
MtaScrollUpOnePage(t);
MtaRedraw(t);
result = true;
}
MemHandleUnlock(h);
break;
}
return result;
}
Boolean ApplicationHandleEvent (EventType *ev) {
int id;
FormType *f;
Boolean result = false;
REQUIRE(ev != NULL);
if (ev->eType == frmLoadEvent) {
id = ev->data.frmLoad.formID;
f = FrmInitForm (id);
FrmSetActiveForm (f);
switch (id) {
case id_ghardenoForm:
FrmSetEventHandler (f, (FormEventHandlerPtr)ghardenoHandleEvent);
break;
}
result = true;
}
return result;
}
void EventLoop(void)
{
Word er;
EventType ev;
do {
EvtGetEvent (&ev, evtWaitForever);
if (! SysHandleEvent (&ev))
if (! MenuHandleEvent (0, &ev, &er))
if (! ApplicationHandleEvent (&ev))
FrmDispatchEvent (&ev);
} while (ev.eType != appStopEvent);
}
void StopApplication (void) {
FormType *f = FrmGetActiveForm();
VoidHand h = FrmGetGadgetData(f,FrmGetObjectIndex(f,id_table));
MyTableType *t = MemHandleLock(h);
SavePreferences(t);
//ListType * l = 0;
MtaCloseMyTable(t);
//l = FrmGetObjectPtr(f,FrmGetObjectIndex(f,id_categoryList)); CHECK(l);
//CategoryFreeList(GhardenoDB,l,true,id_editCategoryString);
MemHandleUnlock(h);
DmCloseDatabase(GhardenoDB);
}
DWord PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags) {
Word er;
if(cmd == sysAppLaunchCmdNormalLaunch) {
er = StartApplication();
if(er)
return er;
EventLoop();
StopApplication ();
}
return 0;
}