00001
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifdef DEBUG
00031 static char rcsid[] = "$Id: gtalk.c,v 1.40 2004/04/10 20:25:52 clavelei Exp clavelei $";
00032 static char * GetCharEncoding(void);
00033 #endif
00034
00035 #define ALLOW_ACCESS_TO_INTERNALS_OF_LISTS // very dirty, en attendant que pilrc permette hascrollbar pour les listes $$
00036
00037 #include <PalmOS.h>
00038 #include <PalmCompatibility.h>
00039 #include <string.h>
00040 #include <stdio.h>
00041 #include "gtalkRsc.h"
00042 #include "latlong.h"
00043 #include "MathLib.h"
00044 #include "gpslib.h"
00045 #include "gtalk.h"
00046 #include "route.h"
00047 #include "gpsutil.h"
00048 #include "log.h"
00049 #include "map.h"
00050 #include "gpsio.h"
00051 #include "memo.h"
00052 #include "dbio.h"
00053 #include "track.h"
00054 #include <LstGlue.h>
00055 #include <TxtGlue.h>
00056
00057
00058 #define ourMinVersion sysMakeROMVersion(3,0,0,sysROMStageRelease,0)
00059 #define MaxDBNames 10
00060
00061 PrefType Prefs =
00062 { DispWpt, dmAllCategories, 0, Alpha, metric, DMM, 0, WGS84Index, 0, DBVersion, GIIPlus, 10,
00063 dmAllCategories, dmAllCategories, dmAllCategories, false, 0, WptDBName, RteDBName, TrkDBName, 0
00064 };
00065 int DebugLevel;
00066 const char *DistanceUnitNames[] = { "km", "nm", "mi" };
00067 char *BeamTypes[] = { "Un", "Wp", "Rt", "Tk" };
00068 EditWptMode EditMode;
00069 Semicircle_Type ReferencePt = { 0, 0 };
00070 char ReferencePtName[32] = "";
00071
00072
00073 UInt CurrentRecordIndex,
00074 CurrentRouteIndex,
00075 *CurrentCategory;
00076
00077 UInt New,
00078 Replaced,
00079 Sent;
00080 char gbuf1[512],
00081 gbuf2[128],
00082
00083 search_buf[6];
00084
00085
00086 Semicircle_Type CurrentWGS84Pos;
00087 Boolean MustCallGpslibTicks = 0;
00088 Boolean OnlyNews,
00089 Furuno,
00090 CompactTracks = 0;
00091 Boolean MainListDirty = 1;
00092 DmOpenRef CurrentDB,
00093 WptDB,
00094 TrkDB,
00095 RteDB,
00096 LogDB;
00097
00098 static UInt lastrecordindex,
00099 lastitemnum = -2;
00100 static ULong CurrentRecordID;
00101 static char CategoryName[dmCategoryLength];
00102 static WinHandle SymbolsWH;
00103
00104
00105 static Boolean MainFormHandleEvent (EventPtr e);
00106 static Boolean ApplicationHandleEvent (EventPtr e);
00107 static Word StartApplication (void);
00108 static void StopApplication (void);
00109 static void EventLoop (void);
00110 DWord PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags);
00111 static Err OpenOrCreateDB (DmOpenRef * DBP, char *DBName, ULong DBType, ULong creator);
00112 static void UpdateMainForm (void);
00113 static void AlarmProc (void);
00114 static Err RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags);
00115 #ifdef SELECT
00116 static Boolean CatFormHandleEvent (EventPtr e);
00117 static Err RecSetSecret (DmOpenRef * DBP, UInt16 index, Boolean value);
00118 #endif
00119 static void NewDB (void);
00120 static UInt16 FindDBNames(UInt32 type, UInt32 creator, char * namep,Int16 * matched, char * bufp, char ** bufpp,UInt16 bufpsize);
00121 static Err SwitchDB(DmOpenRef * DBP, char *DBName, ULong DBType);
00122 static void ChangeDB (void);
00123 #ifdef DEBUG
00124 static void SetDebug (void);
00125 #endif
00126
00127 #ifdef EXPORT
00128 static void ExportWpt (void);
00129
00130
00137 static void
00138 ExportWpt ()
00139 {
00140 UInt i,
00141 l,
00142 pos = 0;
00143 Custom_Wpt_Type wpt;
00144 FormPtr fp = NULL;
00145 double latitude,
00146 longitude;
00147 char *p;
00148
00149 fp = FrmInitForm (ExportForm);
00150 FrmDrawForm (fp);
00151
00152 memo_open ("GPilotS waypoints\n");
00153 for (i = DmNumRecordsInCategory (WptDB, Prefs.wptcategory); i > 0; i--)
00154 {
00155 DmQueryNextInCategory (WptDB, &pos, Prefs.wptcategory);
00156 IndexToCustomWpt (pos, WptDB, &wpt);
00157 pos++;
00158 SemiToDegre (&wpt.posn, &latitude, &longitude);
00159 p = DegreToChars (latitude, 0, Prefs.displaymode);
00160 l = StrPrintF (gbuf1, "W\t%s\t%s\t", wpt.ident, p);
00161 p = DegreToChars (longitude, 1, Prefs.displaymode);
00162 l += StrPrintF (gbuf1 + l, "%s\t%s\t%s", p, DToA (wpt.alt, 0, 0), wpt.cmnt);
00163 memo_write (gbuf1);
00164 }
00165 memo_close (NULL);
00166 FrmEraseForm (fp);
00167 FrmDeleteForm (fp);
00168 }
00169 #endif
00170
00171
00181 void
00182 DrawSymbol (unsigned int lid, int x, int y)
00183 {
00184 #define SymbH 14 // height
00185 #define SymbW 16 // width
00186 #define SymbO 2 // y offset
00187 RectangleType rect = { {lid * SymbW, SymbO}, {SymbW, SymbH} };
00188
00189 if (SymbolsWH)
00190 WinCopyRectangle (SymbolsWH, WinGetDrawWindow (), &rect, x - SymbW / 2, y - SymbH / 2,
00191 scrCopy);
00192 }
00193
00194
00195 #if 0
00196 GetWptName (Custom_Wpt_Type * wp, char *Header)
00197 {
00198 UInt i;
00199
00200 for (i = 1; i < 100; i++)
00201 {
00202 StrNCopySafe (wp->ident, Header, sizeof (wp->ident));
00203 StrIToA (&name[4], i);
00204 if (SearchWptByName (name, 1, 1) < 0)
00205 break;
00206 }
00207 StrNCopySafe (wp.ident, name, sizeof (wp.ident));
00208 }
00209 #endif
00210
00211
00225 Int
00226 CompareWpt (void *p1, void *p2, Int other,
00227 SortRecordInfoPtr sp1, SortRecordInfoPtr sp2, VoidHand aph)
00228 {
00229 Int c,b1,b2;
00230
00231 Custom_Wpt_Type wpt1,
00232 wpt2;
00233
00234 PtrToCustomWpt (p1, &wpt1);
00235 PtrToCustomWpt (p2, &wpt2);
00236 switch (Prefs.wptsortcrit)
00237 {
00238 case Lat:
00239 c = wpt1.posn.lat > wpt2.posn.lat ? 1 : wpt1.posn.lat == wpt2.posn.lat ? 0 : -1;
00240 break;
00241
00242 case Lon:
00243 c = wpt1.posn.lon > wpt2.posn.lon ? 1 : wpt1.posn.lon == wpt2.posn.lon ? 0 : -1;
00244 break;
00245
00246 case Dist:
00247 c = DistComp (wpt1.posn.lat, wpt1.posn.lon, wpt2.posn.lat, wpt2.posn.lon, ReferencePt.lat,
00248 ReferencePt.lon);
00249 break;
00250
00251 case Symbol:
00252 if (wpt1.smbl == wpt2.smbl)
00253 c = StrCompare (wpt1.ident, wpt2.ident);
00254 else
00255 c = wpt1.smbl > wpt2.smbl ? 1 : -1;
00256 break;
00257
00258 case Alt:
00259 c = wpt1.alt > wpt2.alt ? 1 : wpt1.alt == wpt2.alt ? 0 : -1;
00260 break;
00261
00262 case Bear:
00263 b1 = Bearing (ReferencePt.lat, ReferencePt.lon, wpt1.posn.lat, wpt1.posn.lon);
00264 b2 = Bearing (ReferencePt.lat, ReferencePt.lon, wpt2.posn.lat, wpt2.posn.lon);
00265 c = b1 > b2 ? 1 :b1 ==b2 ? 0 : -1;
00266 break;
00267
00268 case Alpha:
00269 default:
00270 c = StrCompare (wpt1.ident, wpt2.ident);
00271 }
00272 return c;
00273 }
00274
00275
00285 void
00286 SortWpts (WptSortCritType s)
00287 {
00288 FormPtr fp = NULL;
00289
00290 if (Prefs.wptsortcrit == s)
00291 return;
00292 Prefs.wptsortcrit = s == Current ? Prefs.wptsortcrit : s;
00293 fp = FrmInitForm (SortForm);
00294 FrmDrawForm (fp);
00295 DmQuickSort (WptDB, (DmComparF *) & CompareWpt, 0);
00296 FrmEraseForm (fp);
00297 FrmDeleteForm (fp);
00298 MainListDirty = 1;
00299 }
00300
00301
00311 long
00312 SearchWptByName (char *name, Boolean exact, Boolean all)
00313 {
00314 ObjectHandle RecH;
00315
00316 Custom_Wpt_Type wp;
00317 UInt i,
00318 c = 0;
00319 Boolean stop = 0;
00320
00321 while ((RecH =
00322 (ObjectHandle) DmQueryNextInCategory (WptDB, &c,
00323 all ? dmAllCategories : Prefs.wptcategory))
00324 && !stop)
00325 {
00326 c++;
00327
00328 HandleToCustomWpt (RecH, &wp);
00329 i = sizeof (wp.ident);
00330 if (exact)
00331 {
00332 for (; wp.ident[i - 1] == ' '; i--)
00333 if (i == 0)
00334 break;
00335 i = max (i, StrLen (name));
00336 }
00337 if (StrNCaselessCompare (wp.ident, name, min (i, StrLen (name))) == 0)
00338 stop = 1;
00339
00340 if (stop)
00341 break;
00342 }
00343 if (stop)
00344 return (c - 1);
00345 else
00346 return (-1);
00347 }
00348
00349 #define XName 1
00350 #define XCmnt 48
00351 #define XBear 105
00352 #define XSymb 136
00353 #define XEnd 150
00354
00366 void
00367 MainListDraw (Int16 itemNum, RectanglePtr bounds, CharPtr * itemsText)
00368 {
00369 VoidHand RecH = NULL;
00370 Custom_Wpt_Type wpt;
00371 Custom_Rte_Hdr_Type rth;
00372 Object *TRecP;
00373 LocalFormatID wptformat;
00374 Object *objp;
00375 Err error;
00376 char *p;
00377 int i,
00378 l;
00379 double latitude,
00380 longitude;
00381 double d;
00382
00383 debug (GTALKDBG_INFOS, ("MainListDraw(): itemNum=%d", itemNum));
00384 if (*CurrentCategory == dmAllCategories)
00385 {
00386 RecH = DmQueryRecord (CurrentDB, (UInt) itemNum);
00387 lastrecordindex = itemNum + 1;
00388 }
00389 else
00390 {
00391 if (itemNum == (lastitemnum + 1))
00392 {
00393 RecH = DmQueryNextInCategory (CurrentDB, &lastrecordindex, *CurrentCategory);
00394 }
00395 else
00396 {
00397 lastrecordindex = 0;
00398 error =
00399 DmSeekRecordInCategory (CurrentDB, &lastrecordindex, itemNum, dmSeekForward,
00400 *CurrentCategory);
00401 RecH = DmQueryRecord (CurrentDB, lastrecordindex);
00402 }
00403 lastitemnum = itemNum;
00404 lastrecordindex++;
00405 }
00406 error = DmGetLastErr ();
00407
00408 if (RecH)
00409 {
00410 switch (Prefs.todisplay)
00411 {
00412 case DispWpt:
00413
00414
00415
00416 wptformat = HandleToCustomWpt ((ObjectHandle) RecH, &wpt);
00417 DrawCharsInWidth (wpt.ident, XName, bounds->topLeft.y, XCmnt - XName, 0);
00418 switch (Prefs.wptsortcrit)
00419 {
00420 case Dist:
00421 case Bear:
00422 d = Distance (ReferencePt.lat, ReferencePt.lon, wpt.posn.lat, wpt.posn.lon,
00423 Prefs.distunit);
00424 l = StrPrintF (gbuf1, "%s %s", DToA (d, 0, 2), DistanceUnitNames[Prefs.distunit]);
00425 DrawCharsInWidth (gbuf1, XCmnt, bounds->topLeft.y, XBear - XCmnt, 1);
00426 i = Bearing (ReferencePt.lat, ReferencePt.lon, wpt.posn.lat, wpt.posn.lon);
00427 l = StrPrintF (gbuf1, "%d °", i);
00428 DrawCharsInWidth (gbuf1, XBear, bounds->topLeft.y, XSymb - XBear, 1);
00429 break;
00430 case Alpha:
00431 case Symbol:
00432 DrawCharsInWidth (wpt.cmnt, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00433 break;
00434 case Lat:
00435 SemiToDegre (&wpt.posn, &latitude, &longitude);
00436 translate (FromWGS84, &latitude, &longitude, Prefs.datum);
00437 p = DegreToChars (latitude, 0, Prefs.displaymode);
00438 DrawCharsInWidth (p, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00439 break;
00440 case Lon:
00441 SemiToDegre (&wpt.posn, &latitude, &longitude);
00442 translate (FromWGS84, &latitude, &longitude, Prefs.datum);
00443 p = DegreToChars (longitude, 1, Prefs.displaymode);
00444 DrawCharsInWidth (p, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00445 break;
00446 case Alt:
00447 l = StrPrintF (gbuf1, "%s m", DToA (wpt.alt, 0, 0));
00448 DrawCharsInWidth (gbuf1, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 1);
00449 break;
00450 default:
00451 }
00452 #ifdef SELECT
00453 if (Prefs.selectmode)
00454 {
00455 FontID fnt = FntSetFont (symbol11Font);
00456
00457 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00458 WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00459 else
00460 WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00461 FntSetFont (fnt);
00462 }
00463 else
00464 #endif
00465 {
00466 if ((wptformat == G103Type) || (wptformat == Garmin107Type))
00467 {
00468 BitmapPtr BitP;
00469 VoidHand BitH = DmGetResource ('Tbmp', SymbolTypeTosmbl (wpt.smbl) + DotBMID);
00470 if (BitH)
00471 {
00472 BitP = MemHandleLock (BitH);
00473 WinDrawBitmap ( BitP, bounds->extent.x-13, bounds->topLeft.y-1);
00474 MemHandleUnlock (BitH);
00475 DmReleaseResource (BitH);
00476 }
00477 }
00478 else DrawSymbol (symb_gid2lid (wpt.smbl), bounds->extent.x - 5, bounds->topLeft.y + 7);
00479 }
00480 break;
00481
00482 case DispTrk:
00483 TRecP = MemHandleLock (RecH);
00484 if (lastrecordindex == Prefs.PermTrackIndex)
00485 WinDrawChars ("*", 1, XName, bounds->topLeft.y);
00486 l = XName + FntCharWidth ('*');
00487 DrawCharsInWidth (TRecP->d.CustTrkHdr.name, l, bounds->topLeft.y, XBear - l, 0);
00488 l = StrPrintF (gbuf1, "%d %spts", (int) TrkptsInTrkDB (RecH),
00489 TRecP->d.CustTrkHdr.type == CompactTrkPt ? "c-" : " ");
00490 DrawCharsInWidth (gbuf1, XBear, bounds->topLeft.y, XEnd - XBear, 0);
00491 MemHandleUnlock (RecH);
00492 #ifdef SELECT
00493 if (Prefs.selectmode)
00494 {
00495 FontID fnt = FntSetFont (symbol11Font);
00496
00497 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00498 WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00499 else
00500 WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00501 FntSetFont (fnt);
00502 }
00503 #endif
00504 break;
00505
00506 case DispRte:
00507 objp = MemHandleLock (RecH);
00508 PtrToCustomRteHdr (objp, &rth);
00509 StrIToA (gbuf1, (long) (rth.nmbr));
00510 StrNCat (gbuf1, " : ", sizeof (gbuf1));
00511 if (rth.cmnt[0] && StrNCompare (rth.cmnt, "________", 8))
00512 StrNCatSafe (gbuf1, rth.cmnt, sizeof (gbuf1), sizeof (rth.cmnt));
00513 else if (ObjectsInRec (RecH) > 1)
00514 {
00515 PtrToCustomWpt ((void *) objp + OffsetOfObjectInRec (RecH, 1), &wpt);
00516 StrNCatSafe (gbuf1, wpt.ident, sizeof (gbuf1), sizeof (wpt.ident));
00517 StrNCatSafe (gbuf1, " to ", sizeof (gbuf1), 4);
00518 PtrToCustomWpt ((void *) objp + OffsetOfObjectInRec (RecH, ObjectsInRec (RecH) - 1),
00519 &wpt);
00520 StrNCatSafe (gbuf1, wpt.ident, sizeof (gbuf1), sizeof (wpt.ident));
00521 }
00522
00523
00524 DrawCharsInWidth (gbuf1, bounds->topLeft.x + XName, bounds->topLeft.y, XBear - XName,
00525 0);
00526 l = StrPrintF (gbuf1, "(%d pts)", (int) WptsInRteDB (RecH));
00527
00528 DrawCharsInWidth (gbuf1, bounds->topLeft.x + XBear, bounds->topLeft.y, XEnd - XBear, 0);
00529 MemHandleUnlock (RecH);
00530 #ifdef SELECT
00531 if (Prefs.selectmode)
00532 {
00533 FontID fnt = FntSetFont (symbol11Font);
00534 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00535 WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00536 else
00537 WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00538 FntSetFont (fnt);
00539 }
00540 #endif
00541
00542 case DispUnknown:
00543 }
00544
00545 }
00546 else
00547 WinDrawChars ("******", 6, bounds->topLeft.x, bounds->topLeft.y);
00548
00549 }
00550
00551
00552
00561 int
00562 SetReferencePt (UInt index, Boolean ask)
00563 {
00564 int r = 0;
00565 Custom_Wpt_Type wpt;
00566
00567 IndexToCustomWpt (index, WptDB, &wpt);
00568 SysCopyStringResource (gbuf1, StrWptRefFormat);
00569 StrPrintF (gbuf2, gbuf1, wpt.ident);
00570 if (!ask || FrmCustomAlert (ConfID, gbuf2, " ", " "))
00571 {
00572 ReferencePt.lat = wpt.posn.lat;
00573 ReferencePt.lon = wpt.posn.lon;
00574 StrNCopySafe (ReferencePtName, wpt.ident, sizeof (ReferencePtName));
00575 DmRecordInfo (WptDB, index, NULL, &Prefs.refptuid, NULL);
00576 r = 1;
00577 }
00578 return (r);
00579 }
00580
00581
00590 static void
00591 UpdateScrollBar (ListPtr LstPtr, Word ScrollId)
00592 {
00593 ScrollBarPtr scrollp = GetObjPtr (ScrollId);
00594 Word currentPosition,
00595 textHeight,
00596 fieldHeight,
00597 maxValue;
00598
00599
00600 textHeight=LstGetNumberOfItems (LstPtr);
00601 fieldHeight=LstGetVisibleItems (LstPtr);
00602 currentPosition=LstGlueGetTopItem (LstPtr);
00603 if (textHeight > fieldHeight)
00604 maxValue = textHeight - fieldHeight;
00605 else if (currentPosition)
00606 maxValue = currentPosition;
00607 else
00608 maxValue = 0;
00609 SclSetScrollBar (scrollp, currentPosition, 0, maxValue, fieldHeight - 1);
00610 }
00611
00612
00623 static void
00624 ScrollLines (ListPtr LstPtr,Word ScrollId, int numLinesToScroll, Boolean redraw)
00625 {
00626
00627 if (numLinesToScroll < 0)
00628 LstScrollList(LstPtr, winUp, -numLinesToScroll );
00629 else
00630 LstScrollList (LstPtr, winDown, numLinesToScroll );
00631
00632 UpdateScrollBar (LstPtr,ScrollId);
00633 }
00634
00635
00644 static void
00645 UpdateMainForm ()
00646 {
00647
00648 UInt RecordsNumber;
00649 Boolean AtTop = 0,
00650 fit;
00651 Word pos = -2;
00652 ListPtr LstPtr = (ListPtr) GetObjPtr (MainListID);
00653 FormPtr frm = FrmGetActiveForm ();
00654 static ItemToDisplay PrevDisplay = -1;
00655 static UInt PrevCategory = dmAllCategories;
00656 static Boolean selmode = 0;
00657 Int16 width,length;
00658
00659 debug_in (GTALKDBG_CALLS, ("->UpdateMainForm()"));
00660 if ((Prefs.todisplay != PrevDisplay) || ((CurrentDB != WptDB)&&(CurrentDB != TrkDB)&&(CurrentDB != RteDB))
00661 #ifdef SELECT
00662 || (Prefs.selectmode != selmode)
00663 #endif
00664 )
00665 {
00666 switch (Prefs.todisplay)
00667 {
00668 default:
00669 Prefs.todisplay = DispWpt;
00670
00671 case DispWpt:
00672 CurrentDB = WptDB;
00673 CurrentCategory = &Prefs.wptcategory;
00674 #ifdef SELECT
00675 if (Prefs.selectmode)
00676 FrmSetMenu (frm, MainSelMenuID);
00677 else
00678 #endif
00679 FrmSetMenu (frm, MainMenuID);
00680 MainListDirty = 1;
00681 break;
00682
00683 case DispTrk:
00684 CurrentDB = TrkDB;
00685 CurrentCategory = &Prefs.trkcategory;
00686 #ifdef SELECT
00687 if (Prefs.selectmode)
00688 FrmSetMenu (frm, MainSelMenuID2);
00689 else
00690 #endif
00691 FrmSetMenu (frm, MainMenuID2);
00692 MainListDirty = 1;
00693 break;
00694
00695 case DispRte:
00696
00697 CurrentDB = RteDB;
00698 CurrentCategory = &Prefs.rtecategory;
00699 #ifdef SELECT
00700 if (Prefs.selectmode)
00701 FrmSetMenu (frm, MainSelMenuID3);
00702 else
00703 #endif
00704 FrmSetMenu (frm, MainMenuID3);
00705 MainListDirty = 1;
00706 break;
00707
00708
00709 }
00710 PrevDisplay = Prefs.todisplay;
00711 selmode = Prefs.selectmode;
00712 AtTop = 1;
00713
00714 debug (GTALKDBG_INFOS, ("UpdateMainForm(): ToDisplay changed to %d", Prefs.todisplay));
00715 }
00716 else
00717 {
00718 if (*CurrentCategory != PrevCategory)
00719 {
00720 debug (GTALKDBG_INFOS,
00721 ("UpdateMainForm(): cat changed from %d to %d", PrevCategory, *CurrentCategory));
00722 MainListDirty = 1;
00723 if ((*CurrentCategory != dmAllCategories) && (PrevCategory != dmAllCategories))
00724 AtTop = 1;
00725 }
00726 }
00727 PrevCategory = *CurrentCategory;
00728 if (MainListDirty)
00729 {
00730 debug (GTALKDBG_INFOS, ("UpdateMainForm(): MainListDirty=1"));
00731 if((Prefs.todisplay==DispWpt)&&(Prefs.wptsortcrit==Alpha)){
00732 ShowObject (MainSearchID);
00733 ShowObject (MainFdSearchID);
00734 }
00735 else {
00736 HideObject (MainSearchID);
00737 HideObject (MainFdSearchID);
00738 }
00739 CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
00740 CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
00741
00742 RecordsNumber = DmNumRecordsInCategory (CurrentDB, *CurrentCategory);
00743 length=StrPrintF (gbuf1, "%s",
00744 Prefs.todisplay == DispWpt ? Prefs.CurWptDBName:
00745 Prefs.todisplay == DispTrk ? Prefs.CurTrkDBName:
00746 Prefs.CurRteDBName);
00747 width=80;
00748
00749 FntCharsInWidth (gbuf1, &width, &length, &fit);
00750 gbuf1[length]=0;
00751 FrmCopyTitle (frm, gbuf1);
00752 length=StrPrintF (gbuf1, "%d %s", RecordsNumber,
00753 Prefs.todisplay == DispWpt ? "Waypoint(s)" :
00754 Prefs.todisplay == DispTrk ? "Track(s)" : "Route(s)");
00755 HideObject (MainLabelID);
00756 FrmCopyLabel (frm, MainLabelID,gbuf1);
00757 ShowObject (MainLabelID);
00758 LstSetListChoices (LstPtr, NULL, RecordsNumber);
00759 pos = RecIdToPosition (CurrentDB, *CurrentCategory, CurrentRecordID, NULL);
00760 LstSetSelection (LstPtr, pos);
00761 debug (GTALKDBG_INFOS, ("UpdateMainForm(): before if (pos"));
00762 if (pos != -1)
00763 {
00764
00765 LstMakeItemVisible (LstPtr, LstGetSelection (LstPtr));
00766 }
00767 else
00768 LstSetTopItem (LstPtr, 0);
00769 debug (GTALKDBG_INFOS, ("UpdateMainForm(): before LstDrawList"));
00770 if (FrmVisible (frm))
00771 LstDrawList (LstPtr);
00772 UpdateScrollBar (LstPtr,MainScrollID);
00773 }
00774 debug_out (GTALKDBG_CALLS,
00775 ("<-UpdateMainForm(), AtTop=%d, pos=%d, %s", AtTop, pos,
00776 MainListDirty ? "updated" : "unchanged"));
00777 MainListDirty = 0;
00778 }
00779
00780
00788 static Boolean
00789 MainFormHandleEvent (EventPtr e)
00790 {
00791 Boolean handled = false,
00792 Edited;
00793 static FormPtr frm;
00794 UInt category,
00795 itemNum,
00796 windex,
00797 d,
00798 t;
00799 static ListPtr LstPtr;
00800 VoidHand RecH;
00801 VoidHand ResH;
00802 Err error;
00803 BitmapPtr BitP;
00804 #ifdef SELECT
00805 Int16 x,
00806 y;
00807 #endif
00808
00809 if (e->eType != nilEvent) debug_in (GTALKDBG_CALLS, ("->MainFormHandleEvent(%s)", e->eType > LASTVALIDEVTNAME ?StrIToA(gbuf1,e->eType):EvtNames[e->eType]));
00810 switch (e->eType)
00811 {
00812 case frmOpenEvent:
00813 frm = FrmGetActiveForm ();
00814 LstPtr = (ListPtr) (GetObjPtr (MainListID));
00815 LstPtr->attr.hasScrollBar =1;
00816 LstSetDrawFunction (LstPtr, &MainListDraw);
00817
00818 UpdateMainForm ();
00819 SymbolsWH = WinCreateOffscreenWindow (2400, 17, screenFormat, &error);
00820 if (SymbolsWH)
00821 {
00822 ResH = DmGetResource ('Tbmp', SymbolsBMID);
00823 if (ResH)
00824 {
00825 WinHandle CurWH = WinGetDrawWindow ();
00826 BitP = MemHandleLock (ResH);
00827 WinSetDrawWindow (SymbolsWH);
00828 WinDrawBitmap (BitP, 0, 0);
00829 MemHandleUnlock (ResH);
00830 WinSetDrawWindow (CurWH);
00831 DmReleaseResource (ResH);
00832 }
00833 }
00834 else
00835 FrmCustomAlert (ErrorID, "Can't create window (error ", StrIToA (gbuf1, error), ")");
00836 if (RecIdToPosition (WptDB, dmAllCategories, Prefs.refptuid, &windex) >= 0)
00837 SetReferencePt (windex, 0);
00838 else
00839 {
00840 StrNCopySafe (ReferencePtName, "??????", sizeof (ReferencePtName));
00841 ReferencePt.lat = 0;
00842 ReferencePt.lon = 0;
00843 }
00844 FrmSetFocus (frm, FrmGetObjectIndex (frm, MainFdSearchID));
00845 FrmDrawForm (frm);
00846
00847
00848 search_buf[0] = OnlyNews = 0;
00849 #ifdef NEWSERIALMGR
00850 GpslibSetSerialPort (Prefs.portid);
00851 #endif
00852 handled = true;
00853 break;
00854
00855 case frmCloseEvent:
00856 if(SymbolsWH)WinDeleteWindow (SymbolsWH, 0);
00857 break;
00858
00859 case winEnterEvent:
00860 if ((e->data.winEnter.enterWindow == FrmGetWindowHandle (frm)) && FrmVisible (frm))
00861 UpdateMainForm ();
00862 break;
00863
00864 case lstSelectEvent:
00865 if (e->data.lstSelect.listID == MainListID)
00866 {
00867 RectangleType r;
00868
00869 EditMode = EditWpt;
00870 itemNum = e->data.lstSelect.selection;
00871 CurrentRecordIndex = 0;
00872 (void) DmSeekRecordInCategory (CurrentDB, &CurrentRecordIndex, itemNum, dmSeekForward,
00873 *CurrentCategory);
00874 CurrentRecordID = GetRecordID (CurrentDB, CurrentRecordIndex);
00875 #ifdef SELECT
00876 EvtGetPen (&x, &y, &Edited);
00877 GetObjectBounds (MainListID, &r);
00878 if ((x > XSymb + 4) && (x < XSymb + 14))
00879 {
00880
00881 RecSetSecret (CurrentDB, CurrentRecordIndex,
00882 !RecIsSecret (CurrentDB, CurrentRecordIndex));
00883 MainListDirty = 1;
00884 UpdateMainForm ();
00885 handled = true;
00886 break;
00887 }
00888 #endif
00889 switch (Prefs.todisplay)
00890 {
00891 case DispWpt:
00892 #ifndef SKIPEDIT
00893 FrmPopupForm (EditForm);
00894
00895 #endif
00896 break;
00897 case DispTrk:
00898 FrmPopupForm (TrackForm);
00899 break;
00900 case DispRte:
00901 CurrentRouteIndex = CurrentRecordIndex;
00902 FrmPopupForm (RouteForm);
00903 default:
00904 }
00905 handled = true;
00906 }
00907 break;
00908
00909 case menuEvent:
00910 MenuEraseStatus (NULL);
00911 search_buf[0] = 0;
00912 switch (e->data.menu.itemID)
00913 {
00914 case MenuWptID:
00915 Prefs.todisplay = DispWpt;
00916 break;
00917
00918 case MenuRteID:
00919 Prefs.todisplay = DispRte;
00920 break;
00921
00922 case MenuTrkID:
00923 Prefs.todisplay = DispTrk;
00924 break;
00925
00926 #ifdef SELECT
00927 case MenuSelID:
00928 Prefs.selectmode = !Prefs.selectmode;
00929 break;
00930 #endif
00931
00932 case MenuViewID:
00933 if (Prefs.todisplay == DispTrk)
00934 {
00935 MapFlags.AllowedOps = MapOpMapTrack;
00936 }
00937 else
00938 {
00939 MapFlags.AllowedOps = MapOpWptDisp;
00940 Prefs.PermTrackIndex = 0;
00941 MapFlags.DrawWpts = 1;
00942 }
00943 FrmPopupForm (MapForm);
00944 break;
00945
00946 case MenuNavID:
00947 MapFlags.AllowedOps = MapOpActiveRte | MapOpTrack;
00948 FrmPopupForm (MapForm);
00949 break;
00950
00951 #ifdef EXPORT
00952 case MenuExportID:
00953 ExportWpt ();
00954 break;
00955 #endif
00956
00957 case MenuLatID:
00958 SortWpts (Lat);
00959 break;
00960
00961 case MenuLonID:
00962 SortWpts (Lon);
00963 break;
00964
00965 case MenuNameID:
00966 SortWpts (Alpha);
00967 break;
00968
00969 case MenuSymbID:
00970 SortWpts (Symbol);
00971 break;
00972
00973 case MenuDistID:
00974 SortWpts (Dist);
00975 break;
00976
00977 case MenuAltID:
00978 SortWpts (Alt);
00979 break;
00980
00981 case MenuBearID:
00982 SortWpts (Bear);
00983 break;
00984
00985 case MenuNewDBID:
00986 NewDB();
00987 MainListDirty = 1;
00988 break;
00989
00990 case MenuPrefID:
00991 d = Prefs.distunit;
00992 SetPreferences ();
00993
00994 MainListDirty = 1;
00995 break;
00996
00997 case MenuAboutID:
00998 FrmAlert (idAbout);
00999 break;
01000
01001 case MenuDeleteID:
01002 CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
01003 #ifdef SELECT
01004 if (Prefs.selectmode)
01005 {
01006 SysCopyStringResource (gbuf1, StrRmSelItemsID);
01007 CategoryName[0] = 0;
01008 }
01009 else
01010 #endif
01011 SysCopyStringResource (gbuf1, StrRemoveItemsID);
01012 if (FrmCustomAlert (ConfID, gbuf1, CategoryName, " ?"))
01013 {
01014 d = 0;
01015 for (t = DmNumRecordsInCategory (CurrentDB, *CurrentCategory); t > 0; t--)
01016 {
01017 RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory);
01018 #ifdef SELECT
01019 if (Prefs.selectmode)
01020 {
01021 if (RecIsSecret (CurrentDB, d))
01022 DmRemoveRecord (CurrentDB, d);
01023 else
01024 d++;
01025 }
01026 else
01027 #endif
01028
01029 DmRemoveRecord (CurrentDB, d);
01030 }
01031 MainListDirty = 1;
01032 }
01033 break;
01034
01035 #ifdef SELECT
01036 case MenuSelAllID:
01037 d = 0;
01038 while ((RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory)))
01039 RecSetSecret (CurrentDB, d++, 1);
01040 MainListDirty = 1;
01041 break;
01042
01043 case MenuUnSelAllID:
01044 d = 0;
01045 while ((RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory)))
01046 RecSetSecret (CurrentDB, d++, 0);
01047 MainListDirty = 1;
01048 break;
01049
01050 case MenuCatID:
01051 FrmPopupForm (CategoryForm);
01052 break;
01053 #endif
01054
01055 case MenuDBID:
01056 ChangeDB();
01057 MainListDirty = 1;
01058 break;
01059
01060 case MenuNewID:
01061 EditMode = NewWpt;
01062 OnlyNews = 0;
01063 if (Prefs.todisplay == DispWpt)
01064 #ifndef SKIPEDIT
01065 FrmPopupForm (EditForm)
01066 #endif
01067 ;
01068 else
01069 {
01070 #ifdef GRAPHICALROUTEEDIT
01071 CurrentRouteIndex = 0;
01072 MapFlags.DrawRtes = 1;
01073 MapFlags.AllowedOps = MapOpRteNew | MapOpWptDisp;
01074 FrmPopupForm (MapForm);
01075 #else
01076 FrmPopupForm (EditRouteForm);
01077 #endif
01078 }
01079 break;
01080
01081 case MenuNewFRID:
01082 EditMode = FromRefWpt;
01083
01084 FrmPopupForm (EditRefForm);
01085 break;
01086
01087 case MenuMarkID:
01088 GpsOp = gpsGetPosition;
01089 FrmPopupForm (ProgressForm);
01090 break;
01091
01092 case MenuTimeID:
01093 GpsOp = gpsGetTime;
01094 FrmPopupForm (ProgressForm);
01095 break;
01096
01097 case MenuCheckID:
01098 GpsOp = gpsGetInfos;
01099 FrmPopupForm (ProgressForm);
01100 break;
01101
01102 case MenuHostID:
01103 FrmPopupForm (HostForm);
01104 break;
01105
01106 case MenuUploadID:
01107 #ifdef SELECT
01108 if (Prefs.selectmode)
01109 {
01110 GpsOp = gpsUpload;
01111 FrmPopupForm (ProgressForm);
01112 }
01113 else
01114 #endif
01115 FrmPopupForm (UploadForm);
01116 break;
01117
01118 case MenuDownNewID:
01119 OnlyNews = 1;
01120 case MenuDownloadID:
01121 FrmPopupForm (DownloadForm);
01122 break;
01123
01124 #ifdef EVENTS
01125 case MenuLogEventsID:
01126 GpsOp = gpsEnableAsyncEvts;
01127
01128 FrmPopupForm (ProgressForm);
01129 break;
01130 #endif
01131
01132
01133
01134
01135
01136 }
01137 UpdateMainForm ();
01138 handled = true;
01139 break;
01140
01141 case sclRepeatEvent:
01142 ScrollLines (LstPtr,MainScrollID,e->data.sclRepeat.newValue - e->data.sclRepeat.value, false);
01143 break;
01144
01145 case ctlSelectEvent:
01146 search_buf[0] = 0;
01147 switch (e->data.ctlSelect.controlID)
01148 {
01149 case MainCatPopupID:
01150 category = *CurrentCategory;
01151 Edited =
01152 CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, true,
01153 CurrentCategory, CategoryName, 1, 0);
01154 if (category != *CurrentCategory)
01155 {
01156 UpdateMainForm ();
01157 }
01158 break;
01159 }
01160 handled = true;
01161 break;
01162
01163 case ctlRepeatEvent:
01164 switch (e->data.ctlSelect.controlID)
01165 {
01166
01167 }
01168 break;
01169
01170 case keyDownEvent:
01171 switch (e->data.keyDown.chr)
01172 {
01173 case pageUpChr:
01174
01175 ScrollLines (LstPtr,MainScrollID,1-LstGetVisibleItems (LstPtr) , false);
01176 handled = true;
01177 break;
01178 case pageDownChr:
01179
01180 ScrollLines (LstPtr,MainScrollID,LstGetVisibleItems (LstPtr)- 1 , false);
01181 handled = true;
01182 break;
01183 #ifdef DEBUG
01184 case '.':
01185 SetDebug ();
01186
01187 handled = true;
01188 break;
01189 #endif
01190 default:
01191 if ((Prefs.todisplay == DispWpt) && (e->data.keyDown.chr))
01192 {
01193 long l;
01194 char c = e->data.keyDown.chr;
01195 if (c == backspaceChr)
01196 {
01197 if (StrLen (search_buf) > 0)
01198 search_buf[StrLen (search_buf) - 1] = 0;
01199 else
01200 SndPlaySystemSound (sndError);
01201 }
01202 else
01203 StrNCatSafe (search_buf, &c, sizeof (search_buf), 1);
01204
01205 if (StrLen (search_buf))
01206 {
01207 l = SearchWptByName (search_buf, 0, 0);
01208 if (l >= 0)
01209 {
01210 CurrentRecordIndex = l;
01211 CurrentRecordID = GetRecordID (CurrentDB, CurrentRecordIndex);
01212
01213 LstSetSelection (LstPtr,
01214 DmPositionInCategory (CurrentDB, CurrentRecordIndex,
01215 *CurrentCategory));
01216 }
01217 else
01218 {
01219 SndPlaySystemSound (sndError);
01220 if (StrLen (search_buf) > 0)
01221 search_buf[StrLen (search_buf) - 1] = 0;
01222 }
01223 }
01224 else
01225 LstSetSelection (LstPtr, -1);
01226 }
01227 }
01228 break;
01229
01230 default:
01231 break;
01232 }
01233 if (e->eType != nilEvent) debug_out (GTALKDBG_CALLS, ("<-MainFormHandleEvent(%s)=%d", e->eType > LASTVALIDEVTNAME ?StrIToA(gbuf1,e->eType):EvtNames[e->eType], handled));
01234
01235 return handled;
01236 }
01237
01238
01245 void
01246 SetPreferences ()
01247 {
01248 Err error;
01249 FormPtr previousForm = FrmGetActiveForm ();
01250 FormPtr frm = FrmInitForm (PrefForm);
01251 ControlPtr DupPtr,
01252 PopupOffsetPtr,
01253 PopupUnitPtr,
01254 PopupDispPtr,
01255 PopupGPSPtr,
01256 PopupLogPtr,
01257 PopupSerPtr,
01258 PopupWptPtr,
01259 PopupRtePtr,
01260 PopupTrkPtr,
01261 LoosePtr;
01262 Int16 offset = Prefs.utcoffset,
01263 i,
01264 j,matched;
01265 unsigned int index;
01266 ListPtr LstOffsetPtr,
01267 LstUnitPtr,
01268 LstDispPtr,
01269 LstGPSPtr,
01270 LstDatumPtr,
01271 LstLogPtr,
01272 LstSerPtr,
01273 LstWptPtr,
01274 LstRtePtr,
01275 LstTrkPtr;
01276 static const UInt LogIntervals[] =
01277 { 5, 10, 15, 20, 30, 40, 50, 60, 120, 180, 300, 600, 900, 1200 };
01278 char *DatumNames[nDatums];
01279 #ifdef NEWSERIALMGR
01280 SerialDevInfo DevInfos;
01281 #endif
01282 char * WptNames[MaxDBNames],
01283 * RteNames[MaxDBNames],
01284 * TrkNames[MaxDBNames];
01285
01286 FrmSetActiveForm (frm);
01287
01288 LstOffsetPtr = (ListPtr) (GetObjPtr (PrefListID));
01289 LstUnitPtr = (ListPtr) (GetObjPtr (PrefUnitListID));
01290 LstDispPtr = (ListPtr) (GetObjPtr (PrefDispListID));
01291 LstGPSPtr = (ListPtr) (GetObjPtr (PrefGPSListID));
01292 LstLogPtr = (ListPtr) (GetObjPtr (PrefLogListID));
01293 LstWptPtr = (ListPtr) (GetObjPtr (PrefWptListID));
01294 LstRtePtr = (ListPtr) (GetObjPtr (PrefRteListID));
01295 LstTrkPtr = (ListPtr) (GetObjPtr (PrefTrkListID));
01296 #ifdef NEWSERIALMGR
01297 LstSerPtr = (ListPtr) (GetObjPtr (PrefSerListID));
01298 #endif
01299 DupPtr = GetObjPtr (PrefDupID);
01300 #ifdef LOOSE
01301 LoosePtr=GetObjPtr (PrefLooseID);
01302 #endif
01303 PopupOffsetPtr = (ControlPtr) (GetObjPtr (PrefPopupID));
01304 PopupUnitPtr = (ControlPtr) (GetObjPtr (PrefPopUnitID));
01305 PopupDispPtr = (ControlPtr) (GetObjPtr (PrefPopDispID));
01306 PopupGPSPtr = (ControlPtr) (GetObjPtr (PrefGPSPopID));
01307 PopupLogPtr = (ControlPtr) (GetObjPtr (PrefPopLogID));
01308 PopupWptPtr = (ControlPtr) (GetObjPtr (PrefWptPopID));
01309 PopupRtePtr = (ControlPtr) (GetObjPtr (PrefRtePopID));
01310 PopupTrkPtr = (ControlPtr) (GetObjPtr (PrefTrkPopID));
01311 #ifdef NEWSERIALMGR
01312 PopupSerPtr = (ControlPtr) (GetObjPtr (PrefSerPopID));
01313 #endif
01314 for (i = 0; i < nDatums; i++)
01315 DatumNames[i] = gDatum[i].name;
01316 LstDatumPtr = (ListPtr) (GetObjPtr (PrefDatumListID));
01317 LstSetListChoices (LstDatumPtr, DatumNames, nDatums);
01318 LstSetSelection (LstDatumPtr, Prefs.datum);
01319 LstMakeItemVisible (LstDatumPtr, Prefs.datum);
01320 CtlSetLabel (GetObjPtr (PrefDatumPopupID), DatumNames[Prefs.datum]);
01321
01322 if ((offset < -12) || (offset > 13))
01323 offset = 0;
01324 index = -offset + 13;
01325 LstSetSelection (LstOffsetPtr, index);
01326 LstMakeItemVisible (LstOffsetPtr, index);
01327 CtlSetLabel (PopupOffsetPtr, LstGetSelectionText (LstOffsetPtr, index));
01328
01329 LstSetSelection (LstUnitPtr, Prefs.distunit);
01330
01331 CtlSetLabel (PopupUnitPtr, LstGetSelectionText (LstUnitPtr, Prefs.distunit));
01332
01333 if (Prefs.displaymode > DDD)
01334 Prefs.displaymode = DDD;
01335 LstSetSelection (LstDispPtr, Prefs.displaymode);
01336 CtlSetLabel (PopupDispPtr, LstGetSelectionText (LstDispPtr, Prefs.displaymode));
01337
01338 if (Prefs.emulatedgps > GPS76)
01339 Prefs.emulatedgps = GIIPlus;
01340 LstSetSelection (LstGPSPtr, Prefs.emulatedgps);
01341 CtlSetLabel (PopupGPSPtr, LstGetSelectionText (LstGPSPtr, Prefs.emulatedgps));
01342
01343 for (i = (sizeof (LogIntervals) / sizeof (UInt)) - 1; i >= 0; i--)
01344 if (Prefs.loginterval == LogIntervals[i])
01345 break;
01346 if (i < 0)
01347 i = 0;
01348 LstSetSelection (LstLogPtr, i);
01349 LstMakeItemVisible (LstLogPtr, i);
01350 CtlSetLabel (PopupLogPtr, LstGetSelectionText (LstLogPtr, i));
01351
01352 #ifdef NEWSERIALMGR
01353 i = GetSerialDevsInfos (&DevInfos);
01354 for (j = i - 1; j; j--)
01355 if (Prefs.portid == DevInfos.u[j].serDevCreator)
01356 break;
01357
01358 LstSetHeight (LstSerPtr, min (i, 6));
01359 LstSetListChoices (LstSerPtr, DevInfos.serDevPortInfoStr, i);
01360 LstSetSelection (LstSerPtr, j);
01361
01362 CtlSetLabel (PopupSerPtr, DevInfos.serDevPortInfoStr[j]);
01363 #endif
01364 CtlSetValue (DupPtr, Prefs.allowduplicate);
01365 #ifdef LOOSE
01366 CtlSetValue (LoosePtr, Prefs.looseprotocol);
01367 #endif
01368
01369 i=FindDBNames(WptDBType,GPilotSID,Prefs.CurWptDBName,&matched,gbuf1,WptNames,MaxDBNames);
01370 LstSetHeight (LstWptPtr, min (i, 6));
01371 LstSetListChoices (LstWptPtr, WptNames, i );
01372 LstSetSelection (LstWptPtr,matched);
01373 CtlSetLabel (PopupWptPtr,WptNames[matched]);
01374
01375 i=FindDBNames(RteDBType,GPilotSID,Prefs.CurRteDBName,&matched,WptNames[i-1]+StrLen(WptNames[i-1])+1,RteNames,MaxDBNames);
01376 LstSetHeight (LstRtePtr, min (i, 6));
01377 LstSetListChoices (LstRtePtr, RteNames, i );
01378 LstSetSelection (LstRtePtr,matched);
01379 CtlSetLabel (PopupRtePtr,RteNames[matched]);
01380
01381 i=FindDBNames(TrkDBType,GPilotSID,Prefs.CurTrkDBName,&matched,RteNames[i-1]+StrLen(RteNames[i-1])+1,TrkNames,MaxDBNames);
01382 LstSetHeight (LstTrkPtr, min (i, 6));
01383 LstSetListChoices (LstTrkPtr, TrkNames, i );
01384 LstSetSelection (LstTrkPtr,matched);
01385 CtlSetLabel (PopupTrkPtr,TrkNames[matched]);
01386
01387 ErrFatalDisplayIf ((TrkNames[i-1]+StrLen(TrkNames[i-1])+1) >= (gbuf1+sizeof(gbuf1)), "Buffer overflow in SetPreferences");
01388
01389 if (FrmDoDialog (frm) == PrefBtOKID)
01390 {
01391 Prefs.utcoffset = -(LstGetSelection (LstOffsetPtr) - 13);
01392 Prefs.allowduplicate = CtlGetValue (DupPtr);
01393 #ifdef LOOSE
01394 Prefs.looseprotocol = CtlGetValue (LoosePtr);
01395 #endif
01396 Prefs.distunit = LstGetSelection (LstUnitPtr);
01397 Prefs.displaymode = LstGetSelection (LstDispPtr);
01398 Prefs.emulatedgps = LstGetSelection (LstGPSPtr);
01399 Prefs.loginterval = LogIntervals[LstGetSelection (LstLogPtr)];
01400 Prefs.datum = LstGetSelection (LstDatumPtr);
01401 error = SwitchDB(&WptDB,WptNames[LstGetSelection (LstWptPtr)], WptDBType);
01402 if(!error)StrNCopySafe (Prefs.CurWptDBName,WptNames[LstGetSelection (LstWptPtr)] , dmDBNameLength);
01403 error = SwitchDB(&RteDB,RteNames[LstGetSelection (LstRtePtr)], RteDBType);
01404 if(!error)StrNCopySafe (Prefs.CurRteDBName,RteNames[LstGetSelection (LstRtePtr)] , dmDBNameLength);
01405 error = SwitchDB(&TrkDB,TrkNames[LstGetSelection (LstTrkPtr)], TrkDBType);
01406 if(!error)StrNCopySafe (Prefs.CurTrkDBName,TrkNames[LstGetSelection (LstTrkPtr)] , dmDBNameLength);
01407 #ifdef NEWSERIALMGR
01408 Prefs.portid = DevInfos.u[LstGetSelection (LstSerPtr)].serDevCreator;
01409 GpslibSetSerialPort (Prefs.portid);
01410 #endif
01411 }
01412 FrmSetActiveForm (previousForm);
01413 FrmDeleteForm (frm);
01414 }
01415
01416
01431 static UInt16 FindDBNames(UInt32 type, UInt32 creator, char * namep,Int16 * matched, char * bufp, char ** bufpp,UInt16 bufpsize){
01432 DmSearchStateType state;
01433 UInt16 card,i=0;
01434 LocalID currentDBid = 0;
01435 Err error;
01436 char name[dmDBNameLength];
01437 UInt16 l=0;
01438
01439 name[0]=0;
01440 error = DmGetNextDatabaseByTypeCreator(true, &state,type ,creator , false, &card, ¤tDBid);
01441 while (!error && currentDBid) {
01442 if (i>=bufpsize)break;
01443 error=DmDatabaseInfo ( card, currentDBid,name , NULL, NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
01444 if (bufpp)bufpp[i]=bufp+l;
01445 if (bufp)l+=StrPrintF(bufp+l,"%s",name);
01446 l++;
01447 if (namep&&matched)if (!StrCompare(namep,name))*matched=i;
01448
01449 i++;
01450 error = DmGetNextDatabaseByTypeCreator( false, &state,type ,creator,false , &card, ¤tDBid);
01451 }
01452 return(i);
01453 }
01454
01455
01467 static Err SwitchDB(DmOpenRef * DBP, char *DBName, ULong DBType){
01468 Err error;
01469 DmOpenRef olddb;
01470
01471 olddb=*DBP;
01472 error = OpenOrCreateDB (DBP,DBName, DBType, GPilotSID);
01473 if (!error) {
01474 DmCloseDatabase (olddb);
01475 *CurrentCategory=dmAllCategories;
01476 MainListDirty = 1;
01477 }
01478 else {
01479 if (error!=dmErrAlreadyExists) FrmCustomAlert (ErrorID, "Error ", StrIToA (gbuf2, error), " when opening data base");
01480 *DBP=olddb;
01481 }
01482 return(error);
01483 }
01484
01485
01493 static void NewDB (){
01494 FieldPtr FdPtr;
01495 Err error;
01496 DmOpenRef *curdbp,olddb;
01497 FormPtr previousForm = FrmGetActiveForm ();
01498 FormPtr frm = FrmInitForm (NewDBForm);
01499 UInt32 type;
01500 char *name;
01501
01502 switch (Prefs.todisplay)
01503 {
01504 case DispWpt:
01505 curdbp=&WptDB;
01506 type=WptDBType;
01507 name=Prefs.CurWptDBName;
01508 break;
01509 case DispTrk:
01510 curdbp = &TrkDB;
01511 type=TrkDBType;
01512 name=Prefs.CurTrkDBName;
01513 break;
01514 case DispRte:
01515 curdbp = &RteDB;
01516 type=RteDBType;
01517 name=Prefs.CurRteDBName;
01518 break;
01519 default:
01520 return;
01521 }
01522 olddb=*curdbp;
01523 FrmSetActiveForm (frm);
01524 if (FrmDoDialog (frm) == NewDBBtOKID)
01525 {
01526 FdPtr = GetObjPtr (NewDBFDNameID);
01527 error = SwitchDB(curdbp,FldGetTextPtr (FdPtr), type);
01528 if (!error) {
01529 StrNCopySafe (name,FldGetTextPtr (FdPtr) , dmDBNameLength);
01530 }
01531 }
01532 FrmSetActiveForm (previousForm);
01533 FrmDeleteForm (frm);
01534 }
01535
01536
01544 static void ChangeDB (){
01545
01546 Err error=0;
01547 DmOpenRef curdb,newdb;
01548 FormPtr previousForm = FrmGetActiveForm ();
01549 FormPtr frm = FrmInitForm (ChangeDBForm);
01550 UInt32 type;
01551 UInt16 i, matched,category,index,c,moved=0;
01552 char *name;
01553 ListPtr LstWptPtr;
01554 ControlPtr PopupWptPtr;
01555 char * Names[MaxDBNames];
01556 MemHandle oldH,RecH;
01557
01558 FrmSetActiveForm (frm);
01559 LstWptPtr = (ListPtr) (GetObjPtr (ChangeDBListID));
01560 PopupWptPtr = (ControlPtr) (GetObjPtr (ChangeDBPopupID));
01561 category = *CurrentCategory;
01562
01563 switch (Prefs.todisplay)
01564 {
01565 case DispWpt:
01566 curdb=WptDB;
01567 type=WptDBType;
01568 name=Prefs.CurWptDBName;
01569 break;
01570 case DispTrk:
01571 curdb = TrkDB;
01572 type=TrkDBType;
01573 name=Prefs.CurTrkDBName;
01574 break;
01575 case DispRte:
01576 curdb = RteDB;
01577 type=RteDBType;
01578 name=Prefs.CurRteDBName;
01579 break;
01580 default:
01581 return;
01582 }
01583
01584 i=FindDBNames(type,GPilotSID,name,&matched,gbuf1,Names,MaxDBNames);
01585 LstSetHeight (LstWptPtr, min (i, 6));
01586 LstSetListChoices (LstWptPtr, Names, i );
01587 LstSetSelection (LstWptPtr,matched);
01588 CtlSetLabel (PopupWptPtr,Names[matched]);
01589
01590 FrmSetActiveForm (frm);
01591 if (FrmDoDialog (frm) == ChangeDBBtOKID)
01592 if(LstGetSelection (LstWptPtr)!=matched) {
01593 error = OpenOrCreateDB (&newdb,Names[LstGetSelection (LstWptPtr)], type, GPilotSID);
01594 if (!error){
01595 c = 0;
01596 while ((RecH = DmQueryNextInCategory (curdb, &c, category)))
01597 {
01598 #ifdef SELECT
01599 if (RecIsSecret (curdb, c))
01600 {
01601 error= DmDetachRecord (curdb, c, &oldH);
01602 index=dmMaxRecordIndex;
01603 error|=DmAttachRecord (newdb, &index, oldH, NULL);
01604 if (error){
01605 DmAttachRecord (curdb, &index, oldH, NULL);
01606 break;
01607 }
01608 else moved++;
01609 }
01610 else
01611 #endif
01612 c++;
01613 }
01614 }
01615 DmCloseDatabase (newdb);
01616 }
01617 StrPrintF (gbuf1, "Error %d, %d records moved",error,moved);
01618 if (error)FrmCustomAlert (ErrorID,gbuf1," ", " ");
01619 FrmSetActiveForm (previousForm);
01620 FrmDeleteForm (frm);
01621 }
01622
01623
01631 static void
01632 AlarmProc (void)
01633 {
01634
01635 SndPlaySystemSound (sndClick);
01636 }
01637
01638
01646 static Boolean
01647 ApplicationHandleEvent (EventPtr e)
01648 {
01649 FormPtr frm;
01650 Word formId;
01651 Boolean handled = false;
01652
01653 if (e->eType == frmLoadEvent)
01654 {
01655 formId = e->data.frmLoad.formID;
01656 frm = FrmInitForm (formId);
01657 FrmSetActiveForm (frm);
01658
01659 switch (formId)
01660 {
01661 case MainForm:
01662 FrmSetEventHandler (frm, MainFormHandleEvent);
01663 break;
01664 #ifndef SKIPEDIT
01665 case EditForm:
01666 case EditRefForm:
01667 FrmSetEventHandler (frm, EditFormHandleEvent);
01668 break;
01669 #endif
01670 case DownloadForm:
01671 FrmSetEventHandler (frm, DownloadFormHandleEvent);
01672 break;
01673 case UploadForm:
01674 FrmSetEventHandler (frm, UploadFormHandleEvent);
01675 break;
01676 case ProgressForm:
01677 FrmSetEventHandler (frm, ProgressFormHandleEvent);
01678 break;
01679 case TrackForm:
01680 FrmSetEventHandler (frm, TrackFormHandleEvent);
01681 break;
01682 case RouteForm:
01683 FrmSetEventHandler (frm, RouteFormHandleEvent);
01684 break;
01685 case HostForm:
01686 FrmSetEventHandler (frm, HostFormHandleEvent);
01687 break;
01688 #ifndef GRAPHICALROUTEEDIT
01689 case EditRouteForm:
01690 FrmSetEventHandler (frm, RteEditFormHandleEvent);
01691 break;
01692 #endif
01693 case MapForm:
01694 FrmSetEventHandler (frm, MapFormHandleEvent);
01695 break;
01696 #ifdef SELECT
01697 case CategoryForm:
01698 FrmSetEventHandler (frm, CatFormHandleEvent);
01699 break;
01700 #endif
01701 }
01702 handled = true;
01703 }
01704 return handled;
01705 }
01706
01707
01718 static Err
01719 OpenOrCreateDB (DmOpenRef * DBP, char *DBName, ULong DBType, ULong creator)
01720 {
01721 Err error = 0;
01722 VoidHand h;
01723 UInt cardNo;
01724 LocalID dbID;
01725 LocalID appinfoID;
01726 AppInfoType *appInfoP;
01727 UInt32 type,cr;
01728
01729 *DBP=NULL;
01730
01731 cardNo=type=cr=0;
01732 dbID= DmFindDatabase (cardNo, DBName);
01733 if(dbID) error = DmDatabaseInfo (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL,&type , &cr);
01734 if ((type==DBType)&&(cr==creator)) *DBP=DmOpenDatabase ( cardNo, dbID,dmModeReadWrite | dmModeShowSecret );
01735 if (!*DBP)
01736 {
01737 if ((error = DmCreateDatabase (cardNo, DBName, creator, DBType, false)))
01738 return error;
01739
01740 dbID= DmFindDatabase (cardNo, DBName);
01741 *DBP =DmOpenDatabase ( cardNo, dbID, dmModeReadWrite | dmModeShowSecret);
01742 }
01743 if (DmOpenDatabaseInfo (*DBP, &dbID, NULL, NULL, &cardNo, NULL))
01744 return dmErrInvalidParam;
01745 if (DmDatabaseInfo
01746 (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appinfoID, NULL, NULL, NULL))
01747 return dmErrInvalidParam;
01748 if (appinfoID == 0)
01749 {
01750 h = DmNewHandle (*DBP, sizeof (AppInfoType));
01751 if (!h)
01752 return dmErrMemError;
01753 appinfoID = MemHandleToLocalID (h);
01754 DmSetDatabaseInfo (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appinfoID, NULL,
01755 NULL, NULL);
01756 appInfoP = MemLocalIDToLockedPtr (appinfoID, cardNo);
01757 DmSet (appInfoP, 0, sizeof (AppInfoType), 0);
01758 CategoryInitialize (appInfoP, localizedAppInfo);
01759 MemPtrUnlock (appInfoP);
01760 }
01761 return (error);
01762 }
01763
01764
01765
01766
01767
01768
01776 static Word
01777 StartApplication (void)
01778 {
01779 Err error;
01780 Word prefsSize = sizeof (Prefs);
01781
01782 PrefGetAppPreferences (GPilotSID, GPilotSPrefID, &Prefs, &prefsSize, true);
01783 error = OpenOrCreateDB (&WptDB, Prefs.CurWptDBName, WptDBType, GPilotSID);
01784 error |= OpenOrCreateDB (&TrkDB, Prefs.CurTrkDBName, TrkDBType, GPilotSID);
01785 error |= OpenOrCreateDB (&RteDB, Prefs.CurRteDBName, RteDBType, GPilotSID);
01786 #ifdef EVENTS
01787 error |= OpenOrCreateDB (&LogDB, LogDBName, LogDBType, GPilotSID);
01788 #endif
01789 if (error)
01790 return (error);
01791 error = SysLibFind (MathLibName, &MathLibRef);
01792 if (error)
01793 {
01794 error = SysLibLoad (LibType, MathLibCreator, &MathLibRef);
01795 if (!error)
01796 {
01797 error = MathLibOpen (MathLibRef, MathLibVersion);
01798 ErrFatalDisplayIf (error, "Can't open MathLib");
01799 }
01800 else
01801 {
01802 FrmCustomAlert (ErrorID, "MathLib missing", " ", " ");
01803 return (error);
01804 }
01805 }
01806 SetMathLibRef (MathLibRef);
01807 FrmGotoForm (MainForm);
01808 return 0;
01809 }
01810
01811
01818 static void
01819 StopApplication (void)
01820 {
01821 UInt usecount;
01822 Err error;
01823
01824 debug_in (GTALKDBG_CALLS, ("->StopApplication()"));
01825
01826 PrefSetAppPreferences (GPilotSID, GPilotSPrefID, 2, &Prefs, sizeof (Prefs), true);
01827 FrmSaveAllForms ();
01828 FrmCloseAllForms ();
01829 GPSEndOfOperation ();
01830 if (WptDB)DmCloseDatabase (WptDB);
01831 if (TrkDB)DmCloseDatabase (TrkDB);
01832 if (RteDB)DmCloseDatabase (RteDB);
01833 #ifdef EVENTS
01834 if (LogDB)DmCloseDatabase (LogDB);
01835 #endif
01836
01837 debug_close ();
01838 error = MathLibClose (MathLibRef, &usecount);
01839 ErrFatalDisplayIf (error, "Can't close MathLib");
01840 if (usecount == 0)
01841 SysLibRemove (MathLibRef);
01842 }
01843
01844
01851 static void
01852 EventLoop (void)
01853 {
01854 Word err;
01855 EventType e;
01856
01857 do
01858 {
01859 if (MustCallGpslibTicks)
01860 EvtGetEvent (&e, sysTicksPerSecond / 20);
01861 else
01862 EvtGetEvent (&e, evtWaitForever);
01863 if (!SysHandleEvent (&e))
01864 if (!MenuHandleEvent (NULL, &e, &err))
01865 if (!ApplicationHandleEvent (&e))
01866 FrmDispatchEvent (&e);
01867 }
01868 while (e.eType != appStopEvent);
01869 }
01870
01871
01881 DWord
01882 PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags)
01883 {
01884 Err err = 0;
01885 Boolean appIsActive = launchFlags & sysAppLaunchFlagSubCall;
01886
01887 err = RomVersionCompatible (ourMinVersion, launchFlags);
01888 if (err)
01889 return err;
01890 if (cmd == sysAppLaunchCmdNormalLaunch)
01891 {
01892 err = StartApplication ();
01893 if (err)
01894 return err;
01895 EventLoop ();
01896 StopApplication ();
01897 }
01898 else if ((cmd == sysAppLaunchCmdAlarmTriggered) && appIsActive)
01899 {
01900 AlarmProc ();
01901 ((SysAlarmTriggeredParamType *) cmdPBP)->purgeAlarm = 1;
01902 }
01903 #ifdef BEAM
01904 else if (cmd == sysAppLaunchCmdExgReceiveData)
01905 {
01906 ExgSocketPtr sockp = (ExgSocketPtr) cmdPBP;
01907 DmOpenRef DB = NULL;
01908
01909
01910 if (!StrCompare (sockp->name, BeamTypes[DispWpt]))
01911 {
01912 if (!appIsActive)
01913 DB = DmOpenDatabaseByTypeCreator (WptDBType, GPilotSID, dmModeReadWrite);
01914 else
01915 DB = WptDB;
01916 }
01917 else if (!StrCompare (sockp->name, BeamTypes[DispRte]))
01918 {
01919 if (!appIsActive)
01920 DB = DmOpenDatabaseByTypeCreator (RteDBType, GPilotSID, dmModeReadWrite);
01921 else
01922 DB = RteDB;
01923 }
01924
01925 else if (!StrCompare (sockp->name, BeamTypes[DispTrk]))
01926 {
01927 if (!appIsActive)
01928 DB = DmOpenDatabaseByTypeCreator (TrkDBType, GPilotSID, dmModeReadWrite);
01929 else
01930 DB = TrkDB;
01931 }
01932
01933 else
01934 err = -1;
01935
01936 if (!err)
01937 err = BeamReceive (sockp, DB);
01938 if (!appIsActive && DB)
01939 DmCloseDatabase (DB);
01940 if (appIsActive)
01941 MainListDirty = 1;
01942 }
01943 #endif
01944 return err;
01945 }
01946
01947
01956 static Err
01957 RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags)
01958 {
01959 UInt32 romVersion;
01960 FtrGet (sysFtrCreator, sysFtrNumROMVersion, &romVersion);
01961 if (romVersion < requiredVersion)
01962 {
01963 if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
01964 (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
01965 {
01966 FrmAlert (OSUnsupportedID);
01967 if (romVersion < 0x02000000)
01968 {
01969
01970 AppLaunchWithCommand (sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
01971 }
01972 }
01973 return (sysErrRomIncompatible);
01974 }
01975 return 0;
01976 }
01977
01978 #ifdef SELECT
01979
01987 static Boolean
01988 CatFormHandleEvent (EventPtr e)
01989 {
01990 Boolean handled = false;
01991 FormPtr frm;
01992 UInt c;
01993 static UInt category,
01994 newcategory;
01995 MemHandle RecH;
01996
01997 frm = FrmGetActiveForm ();
01998 switch (e->eType)
01999 {
02000 case frmOpenEvent:
02001 frm = FrmGetActiveForm ();
02002 category = newcategory = *CurrentCategory;
02003 if (category == dmAllCategories)
02004 category = dmUnfiledCategory;
02005 CategoryGetName (CurrentDB, category, CategoryName);
02006 CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
02007 FrmDrawForm (frm);
02008 handled = true;
02009 break;
02010
02011 case frmCloseEvent:
02012 break;
02013
02014 case ctlSelectEvent:
02015 switch (e->data.ctlSelect.controlID)
02016 {
02017 case CatBtOKID:
02018 c = 0;
02019 while ((RecH = DmQueryNextInCategory (CurrentDB, &c, category)))
02020 {
02021 if (RecIsSecret (CurrentDB, c))
02022 {
02023 SetCategory (CurrentDB, c, newcategory);
02024 RecSetSecret (CurrentDB, c, 0);
02025 }
02026 c++;
02027 }
02028 MainListDirty = 1;
02029
02030 case CatBtCancelID:
02031 FrmReturnToForm (0);
02032 break;
02033
02034 case MainCatPopupID:
02035 CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, false, &newcategory,
02036 CategoryName, 1, 0);
02037 break;
02038 }
02039 handled = true;
02040 break;
02041
02042 default:
02043 break;
02044 }
02045
02046 return handled;
02047 }
02048
02049
02059 Boolean
02060 RecIsSecret (DmOpenRef * DBP, UInt16 index)
02061 {
02062 UInt attributes;
02063 DmRecordInfo (DBP, index, &attributes, NULL, NULL);
02064 return (attributes & dmRecAttrSecret);
02065 }
02066
02067
02077 static Err
02078 RecSetSecret (DmOpenRef * DBP, UInt16 index, Boolean value)
02079 {
02080 UInt attributes;
02081 Err error;
02082
02083 error = DmRecordInfo (DBP, index, &attributes, NULL, NULL);
02084 if (error)
02085 return (error);
02086 if (value)
02087 attributes |= dmRecAttrSecret;
02088 else
02089 attributes &= ~dmRecAttrSecret;
02090 error = DmSetRecordInfo (DBP, index, &attributes, NULL);
02091 return (error);
02092 }
02093
02094 #endif
02095
02096
02104 Err SetBackupBit (DmOpenRef * DBP) {
02105 UInt16 cardNo, attributes;
02106 LocalID dbID;
02107 Err err;
02108
02109 err=DmOpenDatabaseInfo (DBP, &dbID, NULL, NULL, &cardNo, NULL);
02110
02111 err|=DmDatabaseInfo ( cardNo, dbID,NULL , &attributes, NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
02112 if (!err){
02113 attributes|=dmHdrAttrBackup;
02114 err=DmSetDatabaseInfo ( cardNo, dbID, NULL, &attributes,NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
02115 }
02116 return(err);
02117 }
02118
02119
02120 #ifdef DEBUG
02121 static char * GetCharEncoding(){
02122 UInt32 encoding;
02123
02124 if (FtrGet(sysFtrCreator, sysFtrNumEncoding, &encoding) != 0) encoding = charEncodingPalmLatin;
02125 return(TxtGlueEncodingName(encoding));
02126 }
02127
02128
02136 static void
02137 SetDebug ()
02138 {
02139 FormPtr previousForm = FrmGetActiveForm ();
02140 FormPtr frm = FrmInitForm (DebugForm);
02141 ControlPtr ControlP;
02142 UInt16 i, gpslib_level, gpsutil_level;
02143
02144 FrmSetActiveForm (frm);
02145
02146
02147
02148
02149
02150
02151
02152 if (FrmDoDialog (frm) == DebugBtOKID)
02153 {
02154 gpslib_level= gpsutil_level=DebugLevel=0;
02155 for (i = 0; i < 8; i++)
02156 {
02157 ControlP = GetObjPtr (DbgGpsl1ID - i);
02158 gpslib_level += CtlGetValue (ControlP) << i;
02159 }
02160 for (i = 0; i < 8; i++)
02161 {
02162 ControlP = GetObjPtr (DbgGpsu1ID - i);
02163 gpsutil_level += CtlGetValue (ControlP) << i;
02164 }
02165 for (i = 0; i < 8; i++)
02166 {
02167 ControlP = GetObjPtr (Dbg1ID - i);
02168 DebugLevel += CtlGetValue (ControlP) << i;
02169 }
02170 if (gpslib_level+gpsutil_level+DebugLevel) debug_open ();
02171 else debug_close();
02172 if (gpslib_level) GpslibSetDebugLevel (gpslib_level, log_write);
02173 if (gpsutil_level) GpsutilSetDebugLevel (gpsutil_level, log_write);
02174 if(DebugLevel){
02175 debug (DebugLevel, ("%s, debug level = %d", rcsid, DebugLevel));
02176 debug (DebugLevel, ("Char encoding : %s",GetCharEncoding()));
02177 }
02178 }
02179 FrmSetActiveForm (previousForm);
02180 FrmDeleteForm (frm);
02181 }
02182
02183 #endif