Parameter editing

These functions handle the parameter forms for the different types of objects.

Locations have only two text fields for name and description. The SDK docs aren�t very clear about when to free memory for text fields, but the example code seems to suggest the strategy followed here. «*»= Boolean EditLocFormHandleEvent (EventPtr e) Boolean handled=false; FormPtr frm; FieldPtr fld; Handle text; VoidPtr p;

CALLBACK_PROLOGUE;

switch (e->eType) case frmOpenEvent: frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,LocDesc); text=FldGetTextHandle(fld); if(!text) text=(Handle)MemHandleNew(4000); p=MemHandleLock((VoidHand)text); if(selItem->itemdata.loc.Desc != NULL) StrCopy(p,selItem->itemdata.loc.Desc); FldSetTextHandle(fld,text); if(FrmVisible(FrmGetActiveForm ())) FldEraseField (fld); FldDrawField (fld); MemHandleUnlock((VoidHand)text);

fld=GetObjectPtr(frm,LocName); text=FldGetTextHandle(fld); if(!text) text=(Handle)MemHandleNew(50); p=MemHandleLock((VoidHand)text); StrCopy(p,selItem->itemdata.loc.Name); FldSetTextHandle(fld,text); if(FrmVisible(FrmGetActiveForm())) FldEraseField(fld); FldDrawField(fld); MemHandleUnlock((VoidHand)text); EditUpdateScrollBar(LocDesc,ScrollEdit); FrmDrawForm(frm); FrmSetFocus(frm,FrmGetObjectIndex(frm,LocName)); handled=true; break;

case ctlSelectEvent: switch(e->data.ctlSelect.controlID) case OkButton: frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,LocDesc); text=FldGetTextHandle(fld); p=MemHandleLock((VoidHand)text); if(selItem->itemdata.loc.Desc != NULL) MemPtrFree(selItem->itemdata.loc.Desc); selItem->itemdata.loc.Desc=MemPtrNew(StrLen(p)+1); StrCopy(selItem->itemdata.loc.Desc,p); MemHandleUnlock((VoidHand)text);

fld=GetObjectPtr(frm,LocName); text=FldGetTextHandle(fld); p=MemHandleLock((VoidHand)text); if(selItem->itemdata.loc.Name != NULL) MemPtrFree(selItem->itemdata.loc.Name); selItem->itemdata.loc.Name=MemPtrNew(StrLen(p)+1); StrCopy(selItem->itemdata.loc.Name,p); MemHandleUnlock((VoidHand)text);

FrmGotoForm(MainForm); break; handled=true; break; case keyDownEvent: EditUpdateScrollBar(LocDesc,ScrollEdit); break; case fldChangedEvent: EditUpdateScrollBar(LocDesc,ScrollEdit); handled=true; break; default: break;

CALLBACK_EPILOGUE;

return handled; @

«*»= Boolean EditTextFormHandleEvent (EventPtr e) Boolean handled=false; FormPtr frm; FieldPtr fld; Handle text; VoidPtr p;

CALLBACK_PROLOGUE;

switch (e->eType) case frmOpenEvent: frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,TextEditField); text=FldGetTextHandle(fld); if(!text) text=(Handle)MemHandleNew(4000); p=MemHandleLock((VoidHand)text); if(selItem->itemdata.text.text != NULL) StrCopy(p,selItem->itemdata.text.text); FldSetTextHandle(fld,text); if(FrmVisible(FrmGetActiveForm ())) FldEraseField (fld); FldDrawField (fld); MemHandleUnlock((VoidHand)text); EditUpdateScrollBar(TextEditField,ScrollEdit); FrmDrawForm(frm); FrmSetFocus(frm,FrmGetObjectIndex(frm,TextEditField)); handled=true; break;

case ctlSelectEvent: switch(e->data.ctlSelect.controlID) case OkButton: frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,TextEditField); text=FldGetTextHandle(fld); p=MemHandleLock((VoidHand)text);

if(StrLen(p)>0) if(selItem->itemdata.text.text != NULL) MemPtrFree(selItem->itemdata.text.text);

selItem->itemdata.text.text=MemPtrNew(StrLen(p)+1); StrCopy(selItem->itemdata.text.text,p);

RecalcTextBox(currentSection,selItem); else DeleteItem(currentSection,selItem);

MemHandleUnlock((VoidHand)text); FrmGotoForm(MainForm); break; handled=true; break; case keyDownEvent: EditUpdateScrollBar(TextEditField,ScrollEdit); break; case fldChangedEvent: EditUpdateScrollBar(TextEditField,ScrollEdit); handled=true; break;

default: break;

CALLBACK_EPILOGUE;

return handled; @

The next set of functions handle the parameter forms.

Connections posess the following properties:

Line style

Use this to indicate different types of passages.

Forward arrow

For one way passages

«*»= Boolean ConnectionParamsHandleEvent (EventPtr e) Boolean handled=false; FormPtr frm; ControlPtr ar;

CALLBACK_PROLOGUE;

switch (e->eType) case frmOpenEvent: frm=FrmGetActiveForm(); FrmDrawForm(frm);

switch(selItem->itemdata.con.linetype) case LINE0: CtlSetValue(GetObjectPtr(frm,line0Button),1); break; case LINE1: CtlSetValue(GetObjectPtr(frm,line1Button),1); break; case LINE2: CtlSetValue(GetObjectPtr(frm,line2Button),1); break; case LINE3: CtlSetValue(GetObjectPtr(frm,line3Button),1); break; if(selItem->itemdata.con.flags & ARROW) CtlSetValue(GetObjectPtr(frm,ArrowButton),1); handled=true; break;

case ctlSelectEvent: switch(e->data.ctlSelect.controlID) case line0Button: selItem->itemdata.con.linetype=LINE0; break; case line1Button: selItem->itemdata.con.linetype=LINE1; break; case line2Button: selItem->itemdata.con.linetype=LINE2; break; case line3Button: selItem->itemdata.con.linetype=LINE3; break; case ArrowButton: frm=FrmGetActiveForm(); ar=GetObjectPtr(frm,ArrowButton); if(CtlGetValue(ar) != 0) selItem->itemdata.con.flags |= ARROW; else selItem->itemdata.con.flags &= ARROW; break; case OkButton: FrmGotoForm(MainForm); break; handled=true; break;

default: break;

CALLBACK_EPILOGUE;

return handled; @

«*»= Boolean LocParamsHandleEvent (EventPtr e) Boolean handled=false; FormPtr frm;

CALLBACK_PROLOGUE;

switch (e->eType) case frmOpenEvent: frm=FrmGetActiveForm(); FrmDrawForm(frm);

switch((selItem->itemdata.loc.flags & FONTMASK)»FONTSHIFT) case FONT0: CtlSetValue(GetObjectPtr(frm,font0Button),1); break; case FONT1: CtlSetValue(GetObjectPtr(frm,font1Button),1); break; case FONT2: CtlSetValue(GetObjectPtr(frm,font2Button),1); break; case FONT3: CtlSetValue(GetObjectPtr(frm,font3Button),1); break; if(selItem->itemdata.loc.flags & CIRCLE) CtlSetValue(GetObjectPtr(frm,circButton),1); else CtlSetValue(GetObjectPtr(frm,rectButton),1); handled=true; break;

case ctlSelectEvent: switch(e->data.ctlSelect.controlID) case circButton: selItem->itemdata.loc.flags|=CIRCLE; break; case rectButton: selItem->itemdata.loc.flags&= CIRCLE; break; case font0Button: selItem->itemdata.loc.flags&= FONTMASK; selItem->itemdata.loc.flags|=(FONT0«FONTSHIFT); break; case font1Button: selItem->itemdata.loc.flags&= FONTMASK; selItem->itemdata.loc.flags|=(FONT1«FONTSHIFT); break; case font2Button: selItem->itemdata.loc.flags&= FONTMASK; selItem->itemdata.loc.flags|=(FONT2«FONTSHIFT); break; case font3Button: selItem->itemdata.loc.flags&= FONTMASK; selItem->itemdata.loc.flags|=(FONT3«FONTSHIFT); break; case OkButton: FrmGotoForm(MainForm); break; handled=true; break;

default: break;

CALLBACK_EPILOGUE;

return handled; @

«*»= Boolean TextParamsHandleEvent (EventPtr e) Boolean handled=false; FormPtr frm; UInt flags; FieldPtr fld; Handle text; VoidPtr p;

CALLBACK_PROLOGUE;

switch (e->eType) case frmOpenEvent: frm=FrmGetActiveForm(); switch((selItem->itemdata.text.flags & FONTMASK)»FONTSHIFT) case FONT0: CtlSetValue(GetObjectPtr(frm,font0Button),1); break; case FONT1: CtlSetValue(GetObjectPtr(frm,font1Button),1); break; case FONT2: CtlSetValue(GetObjectPtr(frm,font2Button),1); break; case FONT3: CtlSetValue(GetObjectPtr(frm,font3Button),1); break; flags=(selItem->itemdata.text.flags & TEXTANCHOR_XMASK)»TEXTANCHOR_XSHIFT; switch(flags) case TEXTANCHOR_LEFT: CtlSetValue(GetObjectPtr(frm,AnchorLeft),1); break; case TEXTANCHOR_CENTER: CtlSetValue(GetObjectPtr(frm,AnchorXCenter),1); break; case TEXTANCHOR_RIGHT: CtlSetValue(GetObjectPtr(frm,AnchorRight),1); break; flags=(selItem->itemdata.text.flags & TEXTANCHOR_YMASK)»TEXTANCHOR_YSHIFT; switch(flags) case TEXTANCHOR_TOP: CtlSetValue(GetObjectPtr(frm,AnchorTop),1); break; case TEXTANCHOR_CENTER: CtlSetValue(GetObjectPtr(frm,AnchorYCenter),1); break; case TEXTANCHOR_BOTTOM: CtlSetValue(GetObjectPtr(frm,AnchorBottom),1); break;

flags=(selItem->itemdata.text.flags & TEXTALIGN_MASK)»TEXTALIGN_SHIFT; switch(flags) case TEXTALIGN_LEFT: CtlSetValue(GetObjectPtr(frm,TAlignLeft),1); break; case TEXTALIGN_CENTER: CtlSetValue(GetObjectPtr(frm,TAlignCenter),1); break; case TEXTALIGN_RIGHT: CtlSetValue(GetObjectPtr(frm,TAlignRight),1); break;

fld=GetObjectPtr(frm,XOffsetField); text=FldGetTextHandle(fld); if(!text) text=(Handle)MemHandleNew(3); p=MemHandleLock((VoidHand)text); StrIToA(p,(Long)selItem->itemdata.text.xoffset); FldSetTextHandle(fld,text); MemHandleUnlock((VoidHand)text);

fld=GetObjectPtr(frm,YOffsetField); text=FldGetTextHandle(fld); if(!text) text=(Handle)MemHandleNew(3); p=MemHandleLock((VoidHand)text); StrIToA(p,(Long)selItem->itemdata.text.yoffset); FldSetTextHandle(fld,text); MemHandleUnlock((VoidHand)text);

FrmDrawForm(frm); handled=true; break;

case ctlSelectEvent: switch(e->data.ctlSelect.controlID) case font0Button: selItem->itemdata.text.flags&= FONTMASK; selItem->itemdata.text.flags|=(FONT0«FONTSHIFT); break; case font1Button: selItem->itemdata.text.flags&= FONTMASK; selItem->itemdata.text.flags|=(FONT1«FONTSHIFT); break; case font2Button: selItem->itemdata.text.flags&= FONTMASK; selItem->itemdata.text.flags|=(FONT2«FONTSHIFT); break; case font3Button: selItem->itemdata.text.flags&= FONTMASK; selItem->itemdata.text.flags|=(FONT3«FONTSHIFT); break;

case AnchorLeft: selItem->itemdata.text.flags&= TEXTANCHOR_XMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_LEFT«TEXTANCHOR_XSHIFT); break; case AnchorXCenter: selItem->itemdata.text.flags&= TEXTANCHOR_XMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_CENTER«TEXTANCHOR_XSHIFT); break; case AnchorRight: selItem->itemdata.text.flags&= TEXTANCHOR_XMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_RIGHT«TEXTANCHOR_XSHIFT); break;

case AnchorTop: selItem->itemdata.text.flags&= TEXTANCHOR_YMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_TOP«TEXTANCHOR_YSHIFT); break; case AnchorYCenter: selItem->itemdata.text.flags&= TEXTANCHOR_YMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_CENTER«TEXTANCHOR_YSHIFT); break; case AnchorBottom: selItem->itemdata.text.flags&= TEXTANCHOR_YMASK; selItem->itemdata.text.flags|=(TEXTANCHOR_BOTTOM«TEXTANCHOR_YSHIFT); break;

case TAlignLeft: selItem->itemdata.text.flags&= TEXTALIGN_MASK; selItem->itemdata.text.flags|=(TEXTALIGN_LEFT«TEXTALIGN_SHIFT); break; case TAlignCenter: selItem->itemdata.text.flags&= TEXTALIGN_MASK; selItem->itemdata.text.flags|=(TEXTALIGN_CENTER«TEXTALIGN_SHIFT); break; case TAlignRight: selItem->itemdata.text.flags&= TEXTALIGN_MASK; selItem->itemdata.text.flags|=(TEXTALIGN_RIGHT«TEXTALIGN_SHIFT); break;

case OkButton: frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,XOffsetField); text=FldGetTextHandle(fld); p=MemHandleLock((VoidHand)text); selItem->itemdata.text.xoffset=StrAToI((char *)p); MemHandleUnlock((VoidHand)text); fld=GetObjectPtr(frm,YOffsetField); text=FldGetTextHandle(fld); p=MemHandleLock((VoidHand)text); selItem->itemdata.text.yoffset=StrAToI((char *)p); MemHandleUnlock((VoidHand)text); FrmGotoForm(MainForm); break; handled=true; break;

default: break;

CALLBACK_EPILOGUE;

return handled; @

«*»= void ScrollEditField(short lines) FieldPtr f; FormPtr frm;

frm=FrmGetActiveForm(); f=GetObjectPtr(frm,LocDesc);

if(lines<0) FldScrollField(f,-lines,up); else FldScrollField(f,lines,down);

static void EditUpdateScrollBar (int fieldid,int scrollid) Word scrollPos; Word textHeight; Word fieldHeight; Short maxValue; FieldPtr fld; ScrollBarPtr bar; FormPtr frm;

frm=FrmGetActiveForm(); fld=GetObjectPtr(frm,fieldid); bar=GetObjectPtr(frm,scrollid); FldGetScrollValues(fld,&scrollPos,&textHeight,&fieldHeight);

if (textHeight > fieldHeight) maxValue=textHeight - fieldHeight; else if(scrollPos) maxValue=scrollPos; else maxValue=0;

SclSetScrollBar (bar,scrollPos,0,maxValue,fieldHeight-1); @

Reallocates the section list from the current map. «*»= void updateSectionList() int i;

for(i=0;i<allocedSecNames;i++) MemPtrFree(sectionNames[i]); if(sectionNames != NULL) MemPtrFree(sectionNames);

sectionNames=MemPtrNew(currentMap->sectionNum*sizeof(char*)); allocedSecNames=currentMap->sectionNum;

for(i=0;i<currentMap->sectionNum;i++) sectionNames[i]=MemPtrNew(32); StrCopy(sectionNames[i],currentMap->sections[i].Name); @