📄 rcp2c.c
字号:
{
mpotszEmit[0] = szRCFieldBA16;
mpotszEmit[1] = szRCControlBA16;
mpotszEmit[2] = szRCListBA16;
mpotszEmit[3] = szRCTableBA16;
mpotszEmit[4] = szRCFormBitMapBA16;
mpotszEmit[8] = szRCFormLabelBA16;
mpotszEmit[14] = szRCSliderControlBA16;
mpotszEmit[15] = szRCGraphicalControlBA16;
}
}
/*-----------------------------------------------------------------------------
| CbFromLt
|
| Return emitted size of the form item. if fText then include the
| length of the associated item text
-------------------------------------------------------------WESC------------*/
int
CbFromLt(RCFORMOBJLIST * plt,
int fText)
{
int cb;
RCFORMOBJECT *pobj;
char *pchText;
cb = 0;
pobj = (vfLE32 ? &PBAFIELD32(plt, u.object) : &PBAFIELD16(plt, u.object));
pchText = NULL;
cb =
CbEmitStruct(pobj->ptr, mpotszEmit[PBAFIELD(plt, objectType)],
&pchText, fFalse);
switch (PBAFIELD(plt, objectType))
{
case frmListObj:
pchText = NULL;
if (PBAFIELD(pobj->list, numItems)) // RMa add Test for case : List with NO item
cb +=
PBAFIELD(pobj->list, numItems) * 4 + PBAFIELD(pobj->list,
cbListItems);
break;
case frmTableObj:
pchText = NULL;
cb += PBAFIELD(pobj->table, numColumns) *
CbStruct(szRCTABLECOLUMNATTR) + PBAFIELD(pobj->table, numRows) *
CbStruct(szRCTABLEROWATTR) + PBAFIELD(pobj->table, numColumns) *
PBAFIELD(pobj->table, numRows) * CbStruct(szRCTABLEPADDING);
;
break;
}
if (fText && pchText != NULL)
cb += strlen(pchText) + 1;
/*
* padding
*/
if (vfLE32)
cb = (cb + 3) & ~3;
else
{
if (cb & 1)
cb++;
}
return cb;
}
/*-----------------------------------------------------------------------------
| DumpForm
-------------------------------------------------------------WESC------------*/
void
DumpForm(FRM * pfrm)
{
int cbDirectory;
int clt;
int ilt;
RCFORMOBJLIST lt;
int ib;
int il;
OpenOutput(kPalmResType[kFormRscType], PBAFIELD(pfrm, form.formId)); /* RMa "tFRM" */
clt = PBAFIELD(pfrm, form.numObjects);
if (vfLE32)
Assert(PlexGetCount(&PBAFIELD32(pfrm, pllt)) == clt);
else
Assert(PlexGetCount(&PBAFIELD16(pfrm, pllt)) == clt);
if (vfLE32)
CbEmitStruct(&PBAFIELD32(pfrm, form), szRCFORM, NULL, fTrue);
else
CbEmitStruct(&PBAFIELD16(pfrm, form), szRCFORM, NULL, fTrue);
cbDirectory = CbEmitStruct(<, szRCFORMOBJLIST, NULL, fFalse) * clt;
ib = IbOut() + cbDirectory;
for (ilt = 0; ilt < clt; ilt++)
{
int cb;
if (vfLE32)
lt = *(RCFORMOBJLIST *) PlexGetElementAt(&PBAFIELD32(pfrm, pllt), ilt);
else
lt = *(RCFORMOBJLIST *) PlexGetElementAt(&PBAFIELD16(pfrm, pllt), ilt);
cb = CbFromLt(<, 1);
SETBAFIELD(lt, u.ibobj, ib);
if (BAFIELD(lt, objectType) == frmSliderObj)
SETBAFIELD(lt, objectType, frmControlObj);
if (BAFIELD(lt, objectType) == frmGraphicalControlObj)
SETBAFIELD(lt, objectType, frmControlObj);
ib += cb;
CbEmitStruct(<, szRCFORMOBJLIST, NULL, fTrue);
}
/*
* now dump the controls themselves
*/
for (ilt = 0; ilt < clt; ilt++)
{
int cbLt;
char *pchText;
RCFORMOBJECT *pobj;
RCFORMOBJLIST *plt;
PadBoundary();
if (vfLE32)
plt = PlexGetElementAt(&PBAFIELD32(pfrm, pllt), ilt);
else
plt = PlexGetElementAt(&PBAFIELD16(pfrm, pllt), ilt);
// pobj = &plt->u.object;
pobj = (vfLE32 ? &PBAFIELD32(plt, u.object) : &PBAFIELD16(plt, u.object));
cbLt = CbFromLt(plt, 0);
pchText = NULL;
CbEmitStruct(pobj->ptr, mpotszEmit[PBAFIELD(plt, objectType)],
&pchText, fTrue);
switch (PBAFIELD(plt, objectType))
{
case frmListObj:
pchText = NULL; /* we dump it ourselves */
if (PBAFIELD(pobj->list, numItems)) // RMa add Test for case : List with NO item
{
for (il = 0; il < PBAFIELD(pobj->list, numItems); il++)
DumpBytes(rgbZero, sizeof(unsigned long));
DumpBytes(PBAFIELD(pobj->list, itemsText),
PBAFIELD(pobj->list, cbListItems));
}
break;
case frmTableObj:
{
RCTABLECOLUMNATTR colattr;
RCTABLEROWATTR rwattr;
int irw;
int icol;
memset(&colattr, 0, sizeof(colattr));
SETBAFIELD(colattr, spacing, 1); /* ?? */
for (icol = 0; icol < PBAFIELD(pobj->table, numColumns); icol++)
{
SETBAFIELD(colattr, width, PBAFIELD(pobj->table, rgdxcol[icol]));
CbEmitStruct(&colattr, szRCTABLECOLUMNATTR, NULL, fTrue);
}
memset(&rwattr, 0, sizeof(rwattr));
rwattr.height = 0x0b; /* ?? */
rwattr.usable = 1;
rwattr.selectable = 1;
for (irw = 0; irw < PBAFIELD(pobj->table, numRows); irw++)
{
CbEmitStruct(&rwattr, szRCTABLEROWATTR, NULL, fTrue);
}
/*
* emit bogus padding
*/
for (irw = 0;
irw < PBAFIELD(pobj->table, numRows) * PBAFIELD(pobj->table,
numColumns);
irw++)
CbEmitStruct(NULL, szRCTABLEPADDING, NULL, fTrue);
break;
}
}
if (pchText != NULL)
{
PadBoundary();
DumpBytes(pchText, strlen(pchText) + 1);
}
}
PadBoundary();
CloseOutput();
}
BOOL
FIdFormObject(FormObjectKind kind,
BOOL fIncludeLabels)
{
switch (kind)
{
case frmFieldObj:
case frmControlObj:
case frmGraphicalControlObj:
case frmListObj:
case frmTableObj:
case frmScrollbarObj:
case frmSliderObj:
case frmGadgetObj:
return fTrue;
case frmLabelObj:
return fIncludeLabels;
case frmTitleObj:
case frmPopupObj:
case frmLineObj:
case frmFrameObj:
case frmRectangleObj:
case frmGraffitiStateObj:
case frmBitmapObj:
return fFalse;
}
Assert(fFalse);
return fFalse;
}
/*
* Grrr, the PalmOS developers could have been intelligent created a common header
* for all form objects
*/
int
IdFromObj(RCFORMOBJECT * pobj,
FormObjectKind kind)
{
switch (kind)
{
case frmFieldObj:
// return pobj->field->id;
return PBAFIELD(pobj->field, id);
case frmControlObj:
case frmGraphicalControlObj:
return PBAFIELD(pobj->control, id);
case frmListObj:
return PBAFIELD(pobj->list, id);
case frmTableObj:
return PBAFIELD(pobj->table, id);
case frmScrollbarObj:
return pobj->scrollbar->id;
case frmGadgetObj:
return pobj->gadget->id;
case frmLabelObj:
return PBAFIELD(pobj->label, id);
case frmSliderObj:
return PBAFIELD(pobj->slider, id);
case frmTitleObj:
case frmPopupObj:
case frmLineObj:
case frmFrameObj:
case frmRectangleObj:
case frmGraffitiStateObj:
case frmBitmapObj:
Assert(fFalse);
return -1;
}
Assert(fFalse);
return fFalse;
}
/*-----------------------------------------------------------------------------
| AddObject
|
| Add an object (item) to the current form
-------------------------------------------------------------WESC------------*/
VOID
AddObject(RCFORMOBJECT * pobj,
FormObjectKind kind)
{
RCFORMOBJLIST lt;
int iobj;
// if (vpfrm->form.numObjects > cobjMax)
//ErrorLine("Too many objects in current form");
if (vfCheckDupes && FIdFormObject(kind, fTrue))
{
for (iobj = 0; iobj < PBAFIELD(vpfrm, form.numObjects); iobj++)
{
RCFORMOBJLIST *plt;
if (vfLE32)
plt = PlexGetElementAt(&PBAFIELD32(vpfrm, pllt), iobj);
else
plt = PlexGetElementAt(&PBAFIELD16(vpfrm, pllt), iobj);
if (FIdFormObject(PBAFIELD(plt, objectType), fTrue) &&
IdFromObj(pobj,
kind) ==
IdFromObj((vfLE32 ? &PBAFIELD32(plt, u.object) :
&PBAFIELD16(plt, u.object)), PBAFIELD(plt, objectType)))
{
/*
* dupe labels are ok
*/
if (!
(kind == frmLabelObj && PBAFIELD(plt, objectType) == frmLabelObj))
WarningLine
("Duplicate form object id (error is on the previous line)");
break;
}
}
}
SETBAFIELD(lt, objectType, kind);
SETBAFIELD(lt, u.object, *pobj);
if (vfLE32)
{
PlexAddElement(&PBAFIELD32(vpfrm, pllt), <);
PBAFIELD32(vpfrm, form.numObjects)++;
}
else
{
PlexAddElement(&PBAFIELD16(vpfrm, pllt), <);
PBAFIELD16(vpfrm, form.numObjects)++;
}
}
/*-----------------------------------------------------------------------------
| FreeLt
|
| Frees stuff pointed to by lt (Doesn't free lt itself)
-------------------------------------------------------------WESC------------*/
VOID
FreeLt(RCFORMOBJLIST * plt)
{
char *pchText;
CbEmitStruct(PBAFIELD(plt, u.object.ptr),
mpotszEmit[PBAFIELD(plt, objectType)], &pchText, fFalse);
if (pchText != NULL)
free(pchText);
if (PBAFIELD(plt, objectType) == frmTableObj)
// free(plt->u.object.table->rgdxcol);
free(PBAFIELD(PBAFIELD(plt, u.object.table), rgdxcol));
free(PBAFIELD(plt, u.object.ptr));
}
/*-----------------------------------------------------------------------------
| FreeFrm
-------------------------------------------------------------WESC------------*/
void
FreeFrm(FRM * pfrm)
{
int ilt, count;
if (vfLE32)
{
count = PlexGetCount(&PBAFIELD32(pfrm, pllt));
for (ilt = 0; ilt < count; ilt++)
FreeLt(PlexGetElementAt(&PBAFIELD32(pfrm, pllt), ilt));
PlexFree(&PBAFIELD32(pfrm, pllt));
}
else
{
count = PlexGetCount(&PBAFIELD16(pfrm, pllt));
for (ilt = 0; ilt < count; ilt++)
FreeLt(PlexGetElementAt(&PBAFIELD16(pfrm, pllt), ilt));
PlexFree(&PBAFIELD16(pfrm, pllt));
}
}
void
FreeRcpfile(RCPFILE * prcpf)
{
int ifrm;
if (prcpf != NULL)
{
for (ifrm = 0; ifrm < PlexGetCount(&prcpf->plfrm); ifrm++)
FreeFrm((FRM *) PlexGetElementAt(&prcpf->plfrm, ifrm));
PlexFree(&prcpf->plfrm);
}
iidMenuMac = 0;
iidAlertMac = 0;
iidStringMac = 0;
iidAISMac = 0;
idAutoMac = idAutoInit;
FreeFontMem();
}
/*-----------------------------------------------------------------------------
| FParseObjects
|
| Parse the objects (items) in a form
-------------------------------------------------------------WESC------------*/
BOOL
FParseObjects()
{
RCFORMOBJECT obj;
RW rwSav;
ITM itm;
int icol;
FormObjectKind fok;
/*
* add objects to object table until we see a rwEnd
*/
while (FGetTok(&tok))
{
fok = (FormObjectKind) - 1;
// memset(&itm, 0, sizeof(ITM)); // Already done in ParseItm
switch (rwSav = tok.rw)
{
case rwEnd:
return fTrue;
case rwTTL: /* Yuck, should just do this in FORM line! */
while (FGetTok(&tok)) // RMa add support for form title on hex format
{
// we have a constant?
if (tok.lex.lt == ltConst)
{
char tmpBuffer[255];
int i = 0;
if (tok.lex.val > 0xff)
ErrorLine("HEX data must be BYTE (0..255)");
do
{
tmpBuffer[i] = tok.lex.val;
if (tmpBuffer[i] == 0)
break;
i++;
if (i >= 255)
{
tmpBuffer[i] = 0;
break;
}
} while (FGetTok(&tok));
obj.title = calloc(1, sizeof(RCFORMTITLE));
obj.title->text = strdup((char *)tmpBuffer);
break;
}
// we have a string?
else if (tok.lex.lt == ltStr)
{
UngetTok();
ParseItm(&itm, ifText, if2Null, if3Null);
obj.title = calloc(1, sizeof(RCFORMTITLE));
obj.title->text = itm.text;
break;
}
}
fok = frmTitleObj;
break;
case rwBTN: /* button */
ParseItm(&itm,
ifText | ifId | ifRc | ifUsable | ifEnabled | ifFont |
ifAnchor | ifFrame | ifBigMargin,
if2Graphical | if2BitmapID | if2SelectedBitmapID, if3Null);
goto Control;
case rwPBN: /* pushbutton */
ParseItm(&itm,
ifText | ifId | ifRc | ifUsable | ifEnabled | ifFont |
ifA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -