diff options
Diffstat (limited to 'backends/PalmOS/Src/launcher/forms/formCards.cpp')
-rw-r--r-- | backends/PalmOS/Src/launcher/forms/formCards.cpp | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/launcher/forms/formCards.cpp b/backends/PalmOS/Src/launcher/forms/formCards.cpp new file mode 100644 index 0000000000..1c22ea647a --- /dev/null +++ b/backends/PalmOS/Src/launcher/forms/formCards.cpp @@ -0,0 +1,378 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include <PalmOS.h> +#include <VFSMgr.h> +#include <PmPalmOSNVFS.h> + +#include "start.h" +#include "formTabs.h" +#include "forms.h" +#include "globals.h" + +typedef struct { + UInt16 volRefNum; + Char nameP[expCardInfoStringMaxLen+1]; + +} CardInfoType; + +static TabType *myTabP; +static UInt16 lastTab = 0; + +static void CardSlotFormExit(Boolean bSave); + +static void CardSlotFreeList() { + MemHandle cards = NULL; + MemHandle items = NULL; + + if (itemsText && itemsList) { + cards = MemPtrRecoverHandle(itemsList); + items = MemPtrRecoverHandle(itemsText); + + itemsText = NULL; + itemsList = NULL; + } + itemsType = ITEM_TYPE_UNKNOWN; + + if (items && cards) { + MemHandleUnlock(items); + MemHandleUnlock(cards); + MemHandleFree(items); + MemHandleFree(cards); + } +} + +static UInt16 CardSlotFillList(Boolean getRefNum = false) { + Err err; + UInt16 index; + UInt16 volRefNum; + UInt32 volIterator = vfsIteratorStart|vfsIncludePrivateVolumes; + UInt8 counter = 0; + UInt32 other = 1; + + MemHandle items = NULL; + MemHandle cards = NULL; + CardInfoType *cardsInfo; + + // retreive card infos + while (volIterator != vfsIteratorStop) { + err = VFSVolumeEnumerate(&volRefNum, &volIterator); + + if (!err) { + Char labelP[expCardInfoStringMaxLen+1]; + MemSet(labelP, expCardInfoStringMaxLen+1, 0); + err = VFSVolumeGetLabel(volRefNum, labelP, expCardInfoStringMaxLen+1); + + if (err || StrLen(labelP) == 0) { // if no label try to retreive card type + VolumeInfoType volInfo; + err = VFSVolumeInfo(volRefNum, &volInfo); + + if (!err) { + ExpCardInfoType info; + err = ExpCardInfo(volInfo.slotRefNum, &info); + StrCopy(labelP, info.deviceClassStr); + } + + if (err) // if err default name + StrPrintF(labelP,"Other Card %ld", other++); + } + + if (!cards) + cards = MemHandleNew(sizeof(CardInfoType)); + else + MemHandleResize(cards, MemHandleSize(cards) + sizeof(CardInfoType)); + + cardsInfo = (CardInfoType *)MemHandleLock(cards); + cardsInfo[counter].volRefNum = volRefNum; + StrCopy(cardsInfo[counter].nameP, labelP); + MemHandleUnlock(cards); + counter++; + } + } + + if (counter > 0) { + // set the list items ... + if (!getRefNum) { + for (index = 0; index < counter; index++) { + if (!items) + items = MemHandleNew(sizeof(Char *)); + else + MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); + + itemsText = (Char **)MemHandleLock(items); + itemsText[index] = cardsInfo[index].nameP; + MemHandleUnlock(items); + } + + // save globals + itemsText = (Char **)MemHandleLock(items); + itemsList = (void *)MemHandleLock(cards); + itemsType = ITEM_TYPE_CARD; + + // ... or just return a default volRefNum + } else { + UInt16 volRefNum; + + cardsInfo = (CardInfoType *)MemHandleLock(cards); + volRefNum = cardsInfo[0].volRefNum; // return the first volref + MemHandleUnlock(cards); + MemHandleFree(cards); + + return volRefNum; + } + + // no card found ? free old list in any or return invalid volref + } else { + if (!getRefNum) + CardSlotFreeList(); + else + return vfsInvalidVolRef; + } + + return counter; +} + +static void ConfigTabInit(Boolean update = false) { + ListPtr listP; + + UInt16 index; + Int16 selected = -1; + + UInt16 counter = CardSlotFillList(); + listP = (ListType *)GetObjectPtr(TabCardConfigSlotList); + + // itemsText can be NULL if counter = 0 + LstSetListChoices (listP, itemsText, counter); + if (counter > 0) { + CardInfoType *cardsInfo = (CardInfoType *)itemsList; + + for (index = 0; index < counter; index++) { + if (cardsInfo[index].volRefNum == gPrefs->card.volRefNum) { + selected = index; + break; + } + } + + LstSetSelection(listP, selected); + } + + if (!update) { + FieldType *fld1P; + Char *cacheP; + MemHandle cacheH; + + fld1P = (FieldType *)GetObjectPtr(TabCardConfigCacheSizeField); + cacheH = MemHandleNew(FldGetMaxChars(fld1P)+1); + cacheP = (Char *)MemHandleLock(cacheH); + StrIToA(cacheP, gPrefs->card.cacheSize / 1024); + MemHandleUnlock(cacheH); + + FldSetTextHandle(fld1P, cacheH); + CtlSetValue((ControlType *)GetObjectPtr(TabCardConfigCacheCheckbox), gPrefs->card.useCache); + CtlSetValue((ControlType *)GetObjectPtr(TabCardConfigLedCheckbox), gPrefs->card.showLED); + // update ? redraw the list + } else { + WinScreenLock(winLockCopy); + LstDrawList(listP); + WinScreenUnlock(); + } +} + +static UInt16 ConfigTabSave() { + ControlType *cckP[2]; + FieldType *fld1P; + ListPtr listP; + FormPtr frmP; + UInt16 updateCode = frmRedrawUpdateMS; + + cckP[0] = (ControlType *)GetObjectPtr(TabCardConfigCacheCheckbox); + cckP[1] = (ControlType *)GetObjectPtr(TabCardConfigLedCheckbox); + + gPrefs->card.useCache = CtlGetValue(cckP[0]); + gPrefs->card.showLED = CtlGetValue(cckP[1]); + + fld1P = (FieldType *)GetObjectPtr(TabCardConfigCacheSizeField); + frmP = FrmGetActiveForm(); + if (FldGetTextLength(fld1P) == 0 && CtlGetValue(cckP[0]) == 1) { + TabSetActive(frmP, myTabP, 0); + FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabCardConfigCacheSizeField)); + FrmCustomAlert(FrmWarnAlert,"You must specified a cache size.",0,0); + return 0; + } + gPrefs->card.cacheSize = StrAToI(FldGetTextPtr(fld1P)) * 1024; + + Int16 selected; + CardInfoType *cardsInfo = (CardInfoType *)itemsList; + + listP = (ListType *)GetObjectPtr(TabCardConfigSlotList); + selected = LstGetSelection(listP); + if (selected == -1) { + gPrefs->card.volRefNum = vfsInvalidVolRef; + } else if (gPrefs->card.volRefNum != cardsInfo[selected].volRefNum) { + updateCode = frmRedrawUpdateMSImport; + gPrefs->card.volRefNum = cardsInfo[selected].volRefNum; + } + + CardSlotCreateDirs(); + CardSlotFreeList(); + + return updateCode; +} + +static void GameListTabInit() { + CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox), gPrefs->card.moveDB); + CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListDeleteCheckbox), gPrefs->card.deleteDB); + CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListConfirmCheckbox), gPrefs->card.confirmMoveDB); +} + +static void GameListTabSave() { + ControlType *cckP[3]; + + cckP[0] = (ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox); + cckP[1] = (ControlType *)GetObjectPtr(TabCardGameListDeleteCheckbox); + cckP[2] = (ControlType *)GetObjectPtr(TabCardGameListConfirmCheckbox); + + gPrefs->card.moveDB = CtlGetValue(cckP[0]); + gPrefs->card.deleteDB = CtlGetValue(cckP[1]); + gPrefs->card.confirmMoveDB = CtlGetValue(cckP[2]); +} + +static void GameListTabDraw() { + ControlType *cck1P; + FormPtr frmP = FrmGetActiveForm(); + + cck1P = (ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox); + if (CtlGetValue(cck1P)) { + FrmShowObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListDeleteCheckbox)); + FrmShowObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListConfirmCheckbox)); + } else { + FrmHideObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListDeleteCheckbox)); + FrmHideObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListConfirmCheckbox)); + } +} + +static void CardSlotFormInit() { + TabType *tabP; + FormType *frmP = FrmGetActiveForm(); + + tabP = TabNewTabs(2); + TabAddContent(&frmP, tabP, "Cards", TabCardConfigForm); + TabAddContent(&frmP, tabP, "Game List", TabCardGameListForm, GameListTabDraw); + + ConfigTabInit(); + GameListTabInit(); + + FrmDrawForm(frmP); + TabSetActive(frmP, tabP, lastTab); + + myTabP = tabP; +} + +static void CardSlotFormSave() { + UInt16 updateCode; + updateCode = ConfigTabSave(); + if (!updateCode) return; + GameListTabSave(); + CardSlotCreateDirs(); + + TabDeleteTabs(myTabP); + FrmReturnToMain(updateCode); +} + +static void CardSlotFormCancel() { + CardSlotFreeList(); + TabDeleteTabs(myTabP); + FrmReturnToMain(); +} + +Boolean CardSlotFormHandleEvent(EventPtr eventP) { + FormPtr frmP = FrmGetActiveForm(); + Boolean handled = false; + + switch (eventP->eType) { + case frmOpenEvent: + CardSlotFormInit(); + handled = true; + break; + + case frmCloseEvent: + CardSlotFormCancel(); + handled = true; + break; + + case ctlSelectEvent: + switch (eventP->data.ctlSelect.controlID) + { + case (CardSlotForm + 1) : + case (CardSlotForm + 2) : + lastTab = (eventP->data.ctlSelect.controlID - CardSlotForm - 1); + TabSetActive(frmP, myTabP, lastTab); + break; + + case CardSlotOkButton: + CardSlotFormSave(); + break; + + case CardSlotCancelButton: + CardSlotFormCancel(); + break; + + case TabCardGameListMoveCheckbox: + GameListTabDraw(); + break; + } + handled = true; + break; + + default: + break; + } + + return handled; +} + +void CardSlotCreateDirs() { + if (gPrefs->card.volRefNum != vfsInvalidVolRef) { + VFSDirCreate(gPrefs->card.volRefNum, "/PALM"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Games"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Saved"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Audio"); + VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Mods"); + } +} + +void CardSlotFormUpdate() { + if (itemsType == ITEM_TYPE_CARD) { + CardSlotFreeList(); + ConfigTabInit(true); + } +} + +UInt16 parseCards() { + UInt16 volRefNum = CardSlotFillList(true); + CardSlotFreeList(); + return volRefNum; +} |