Skip to content

Commit 12782d7

Browse files
committed
add enumeration for window identifiers to C and E code
add check for duplicate window identifiers when generating code change "window name" to "window identifier" add window indentifier validation update version to 0.10.0-beta add example E source to the manual
1 parent e17d2b9 commit 12782d7

File tree

9 files changed

+324
-52
lines changed

9 files changed

+324
-52
lines changed

Rebuild_manual.txt

Lines changed: 196 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,12 @@ struct Library *WindowBase = NULL,
279279
*IconBase = NULL;
280280
struct IntuitionBase *IntuitionBase = NULL;
281281

282-
//Window_3
282+
//window ids
283+
//this enumeration will contain all of the window ids contained in the
284+
//rebuild project.
285+
enum win { window_3_id = 3 };
286+
287+
//Window_3 gadgets
283288
//this enumeration should be used to access the main_gadgets array. the names
284289
//of the enumerations have the reaction gadget id's on the end so these names
285290
//will never change even if the design is update (eg another gadget added).
@@ -487,8 +492,9 @@ void window_3( void )
487492
main_gadgets[6] = 0;
488493

489494
//call the code to display the window
490-
//the window id is 3 and it has no menu structure.
491-
runWindow( window_object, 3, 0, main_gadgets );
495+
//the window id is window_3_id from the window ids enumeration and
496+
//it has no menu structure.
497+
runWindow( window_object, window_3_id, 0, main_gadgets );
492498

493499
if ( window_object ) DisposeObject( window_object );
494500
}
@@ -502,6 +508,193 @@ int main( int argc, char **argv )
502508
cleanup();
503509
}
504510

511+
Here is the same example GUI design in E
512+
513+
OPT OSVERSION=37
514+
515+
MODULE 'reaction/reaction_macros',
516+
'reaction/reaction_lib',
517+
'window','classes/window',
518+
'gadgets/layout','layout',
519+
'libraries/gadtools','gadtools',
520+
'icon',
521+
'button','gadgets/button',
522+
'string','gadgets/string',
523+
'label','images/label',
524+
'images/bevel',
525+
'amigalib/boopsi',
526+
'exec',
527+
'intuition/intuition',
528+
'intuition/imageclass',
529+
'intuition/screens',
530+
'intuition/gadgetclass'
531+
532+
533+
->window ids
534+
ENUM WINLOGON_ID = 3
535+
536+
->winLogon gadgets
537+
ENUM LAYOUT_5, STRING_6, STRING_7, LAYOUT_8, BUTTON_9, BUTTON_10
538+
ENUM LAYOUT_5_ID = 5, STRING_6_ID = 6, STRING_7_ID = 7, LAYOUT_8_ID = 8,
539+
BUTTON_9_ID = 9, BUTTON_10_ID = 10
540+
541+
DEF gScreen=0,gVisInfo=0,gDrawInfo=0,gAppPort=0
542+
543+
PROC setup()
544+
IF (windowbase:=OpenLibrary('window.class',0))=NIL THEN Throw("LIB","win")
545+
IF (layoutbase:=OpenLibrary('gadgets/layout.gadget',0))=NIL THEN Throw("LIB","layo")
546+
IF (gadtoolsbase:=OpenLibrary('gadtools.library',0))=NIL THEN Throw("LIB","gadt")
547+
IF (iconbase:=OpenLibrary('icon.library',0))=NIL THEN Throw("LIB","icon")
548+
IF (buttonbase:=OpenLibrary('gadgets/button.gadget',0))=NIL THEN Throw("LIB","btn")
549+
IF (stringbase:=OpenLibrary('gadgets/string.gadget',0))=NIL THEN Throw("LIB","strn")
550+
IF (labelbase:=OpenLibrary('images/label.image',0))=NIL THEN Throw("LIB","labl")
551+
IF (gScreen:=LockPubScreen(NIL))=NIL THEN Raise("pub")
552+
IF (gVisInfo:=GetVisualInfoA(gScreen, [TAG_END]))=NIL THEN Raise("visi")
553+
IF (gDrawInfo:=GetScreenDrawInfo(gScreen))=NIL THEN Raise("dinf")
554+
IF (gAppPort:=CreateMsgPort())=NIL THEN Raise("port")
555+
ENDPROC
556+
557+
PROC cleanup()
558+
IF gVisInfo THEN FreeVisualInfo(gVisInfo)
559+
IF gDrawInfo THEN FreeScreenDrawInfo(gScreen,gDrawInfo)
560+
IF gAppPort THEN DeleteMsgPort(gAppPort)
561+
IF gScreen THEN UnlockPubScreen(NIL,gScreen)
562+
563+
IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
564+
IF iconbase THEN CloseLibrary(iconbase)
565+
IF windowbase THEN CloseLibrary(windowbase)
566+
IF layoutbase THEN CloseLibrary(layoutbase)
567+
IF buttonbase THEN CloseLibrary(buttonbase)
568+
IF stringbase THEN CloseLibrary(stringbase)
569+
IF labelbase THEN CloseLibrary(labelbase)
570+
ENDPROC
571+
572+
PROC runWindow(windowObject,windowId, menuStrip, winGadgets:PTR TO LONG) HANDLE
573+
DEF running=TRUE
574+
DEF win:PTR TO window,wsig,code,msg,sig,result
575+
576+
IF (win:=RA_OpenWindow(windowObject))
577+
GetAttr( WINDOW_SIGMASK, windowObject, {wsig} )
578+
IF menuStrip THEN SetMenuStrip( win, menuStrip )
579+
580+
WHILE running
581+
sig:=Wait(wsig)
582+
IF (sig AND (wsig))
583+
WHILE ((result:=RA_HandleInput(windowObject,{code}+2)) <> WMHI_LASTMSG)
584+
msg:=(result AND WMHI_CLASSMASK)
585+
SELECT msg
586+
CASE WMHI_CLOSEWINDOW
587+
running:=FALSE
588+
CASE WMHI_GADGETUP
589+
WriteF('gadget press\n')
590+
CASE WMHI_MENUPICK
591+
WriteF('menu pick\n')
592+
CASE WMHI_ICONIFY
593+
RA_Iconify(windowObject)
594+
CASE WMHI_UNICONIFY
595+
win:=RA_OpenWindow(windowObject)
596+
IF menuStrip THEN SetMenuStrip( win, menuStrip )
597+
ENDSELECT
598+
ENDWHILE
599+
ENDIF
600+
ENDWHILE
601+
ENDIF
602+
EXCEPT DO
603+
RA_CloseWindow(windowObject)
604+
ENDPROC
605+
606+
PROC winlogon() HANDLE
607+
DEF windowObject
608+
DEF mainGadgets[7]:ARRAY OF LONG
609+
610+
611+
windowObject:=WindowObject,
612+
WA_TITLE, 'Please log in...',
613+
WA_LEFT, 5,
614+
WA_TOP, 20,
615+
WA_WIDTH, 250,
616+
WA_HEIGHT, 80,
617+
WA_MINWIDTH, 150,
618+
WA_MINHEIGHT, 80,
619+
WA_MAXWIDTH, 8192,
620+
WA_MAXHEIGHT, 8192,
621+
WINDOW_APPPORT, gAppPort,
622+
WA_CLOSEGADGET, TRUE,
623+
WA_DEPTHGADGET, TRUE,
624+
WA_SIZEGADGET, TRUE,
625+
WA_DRAGBAR, TRUE,
626+
WINDOW_POSITION, WPOS_CENTERSCREEN,
627+
WINDOW_ICONTITLE, 'MyApp',
628+
WA_NOCAREREFRESH, TRUE,
629+
WA_IDCMP, IDCMP_GADGETDOWN OR IDCMP_GADGETUP OR IDCMP_CLOSEWINDOW,
630+
WINDOW_PARENTGROUP, VLayoutObject,
631+
LAYOUT_SPACEOUTER, TRUE,
632+
LAYOUT_DEFERLAYOUT, TRUE,
633+
LAYOUT_ADDCHILD, mainGadgets[LAYOUT_5]:=LayoutObject,
634+
GA_ID, LAYOUT_5_ID,
635+
LAYOUT_ORIENTATION, LAYOUT_ORIENT_VERT,
636+
LAYOUT_ADDCHILD, mainGadgets[STRING_6]:=StringObject,
637+
GA_ID, STRING_6_ID,
638+
GA_RELVERIFY, TRUE,
639+
GA_TABCYCLE, TRUE,
640+
STRINGA_MAXCHARS, 80,
641+
StringEnd,
642+
CHILD_LABEL, LabelObject,
643+
LABEL_TEXT, 'User name',
644+
LabelEnd,
645+
LAYOUT_ADDCHILD, mainGadgets[STRING_7]:=StringObject,
646+
GA_ID, STRING_7_ID,
647+
GA_RELVERIFY, TRUE,
648+
GA_TABCYCLE, TRUE,
649+
STRINGA_MAXCHARS, 80,
650+
StringEnd,
651+
CHILD_LABEL, LabelObject,
652+
LABEL_TEXT, 'Password',
653+
LabelEnd,
654+
LAYOUT_ADDCHILD, mainGadgets[LAYOUT_8]:=LayoutObject,
655+
GA_ID, LAYOUT_8_ID,
656+
LAYOUT_ORIENTATION, LAYOUT_ORIENT_HORIZ,
657+
LAYOUT_ADDCHILD, mainGadgets[BUTTON_9]:=ButtonObject,
658+
GA_ID, BUTTON_9_ID,
659+
GA_TEXT, 'OK',
660+
GA_RELVERIFY, TRUE,
661+
GA_TABCYCLE, TRUE,
662+
BUTTON_TEXTPEN, 1,
663+
BUTTON_BACKGROUNDPEN, 0,
664+
BUTTON_FILLTEXTPEN, 1,
665+
BUTTON_FILLPEN, 3,
666+
ButtonEnd,
667+
LAYOUT_ADDCHILD, mainGadgets[BUTTON_10]:=ButtonObject,
668+
GA_ID, BUTTON_10_ID,
669+
GA_TEXT, 'Cancel',
670+
GA_RELVERIFY, TRUE,
671+
GA_TABCYCLE, TRUE,
672+
BUTTON_TEXTPEN, 1,
673+
BUTTON_BACKGROUNDPEN, 0,
674+
BUTTON_FILLTEXTPEN, 1,
675+
BUTTON_FILLPEN, 3,
676+
ButtonEnd,
677+
LayoutEnd,
678+
LayoutEnd,
679+
LayoutEnd,
680+
WindowEnd
681+
mainGadgets[6]:=0
682+
683+
runWindow(windowObject,WINLOGON_ID,NIL,mainGadgets)
684+
685+
EXCEPT DO
686+
IF windowObject THEN DisposeObject(windowObject);
687+
ENDPROC
688+
689+
PROC main() HANDLE
690+
setup()
691+
692+
winlogon()
693+
694+
EXCEPT DO
695+
cleanup()
696+
ENDPROC
697+
505698

506699
8. Tooltype settings
507700

cSourceGen.e

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ OPT MODULE,LARGE
88
EXPORT OBJECT cSrcGen OF srcGen
99
ENDOBJECT
1010

11+
ENUM ENUM_IDS, ENUM_IDENTS, ENUM_IDXS
12+
1113
PROC create(fser:PTR TO fileStreamer, libsused:PTR TO CHAR,definitionOnly,useIds) OF cSrcGen
1214
SUPER self.create(fser,libsused,definitionOnly,useIds)
1315
self.type:=CSOURCE_GEN
@@ -20,17 +22,21 @@ PROC create(fser:PTR TO fileStreamer, libsused:PTR TO CHAR,definitionOnly,useIds
2022
self.indent:=0
2123
ENDPROC
2224

23-
PROC createEnum(windowName:PTR TO CHAR, listObjects:PTR TO stdlist, ids) OF cSrcGen
25+
PROC createEnum(enumName:PTR TO CHAR, listObjects:PTR TO stdlist, enumType) OF cSrcGen
2426
DEF n=0, j
2527
DEF listObject:PTR TO reactionObject
2628
DEF tempStr[255]:STRING
2729

2830
self.write('enum ')
29-
IF ids
30-
StringF(tempStr,'\s_id { ',windowName)
31-
ELSE
32-
StringF(tempStr,'\s_idx { ',windowName)
33-
ENDIF
31+
SELECT enumType
32+
CASE ENUM_IDS
33+
StringF(tempStr,'\s_id { ',enumName)
34+
CASE ENUM_IDXS
35+
StringF(tempStr,'\s_idx { ',enumName)
36+
CASE ENUM_IDENTS
37+
StringF(tempStr,'\s { ',enumName)
38+
ENDSELECT
39+
3440
LowerStr(tempStr)
3541
self.write(tempStr)
3642
n:=0
@@ -47,12 +53,13 @@ PROC createEnum(windowName:PTR TO CHAR, listObjects:PTR TO stdlist, ids) OF cSrc
4753
ENDIF
4854
listObject:=listObjects.item(j)
4955
listObject.gadindex:=j
56+
5057
StrCopy(tempStr,listObject.ident)
5158
LowerStr(tempStr)
5259
self.write(tempStr)
5360
n:=n+StrLen(tempStr)
5461

55-
IF ids
62+
IF (enumType=ENUM_IDS) OR (enumType=ENUM_IDENTS)
5663
StringF(tempStr,'_id = \d',listObject.id)
5764
self.write(tempStr)
5865
n:=n+StrLen(tempStr)
@@ -62,13 +69,14 @@ PROC createEnum(windowName:PTR TO CHAR, listObjects:PTR TO stdlist, ids) OF cSrc
6269
self.writeLine(' };')
6370
ENDPROC
6471

65-
PROC genHeader(screenObject:PTR TO screenObject,rexxObject:PTR TO rexxObject, windowNames:PTR TO stringlist, windowLayouts:PTR TO stdlist, sharedPort) OF cSrcGen
72+
PROC genHeader(screenObject:PTR TO screenObject,rexxObject:PTR TO rexxObject, windowItems:PTR TO stdlist, windowLayouts:PTR TO stdlist, sharedPort) OF cSrcGen
6673
DEF tempStr[200]:STRING
6774
DEF menuItem:PTR TO menuItem
6875
DEF itemName[200]:STRING
6976
DEF commKey[10]:STRING
7077
DEF itemType
7178
DEF hasarexx,i,j,n
79+
DEF windowObject:PTR TO reactionObject
7280
DEF layoutObject:PTR TO reactionObject
7381
DEF listObjects:PTR TO stdlist
7482
DEF listObject:PTR TO reactionObject
@@ -181,8 +189,9 @@ PROC genHeader(screenObject:PTR TO screenObject,rexxObject:PTR TO rexxObject, wi
181189
self.writeLine('')
182190
ENDIF
183191

184-
FOR i:=0 TO windowNames.count()-1
185-
StrCopy(tempStr,windowNames.item(i))
192+
FOR i:=0 TO windowItems.count()-1
193+
windowObject:=windowItems.item(i)
194+
StrCopy(tempStr,windowObject.ident)
186195
LowerStr(tempStr)
187196
self.write('void ')
188197
self.write(tempStr)
@@ -533,14 +542,24 @@ PROC genHeader(screenObject:PTR TO screenObject,rexxObject:PTR TO rexxObject, wi
533542

534543
NEW listObjects.stdlist(20)
535544
self.writeLine('')
536-
FOR i:=0 TO windowNames.count()-1
545+
FOR i:=0 TO windowItems.count()-1
546+
windowObject:=windowItems.item(i)
547+
listObjects.add(windowObject)
548+
ENDFOR
549+
self.writeLine('//window ids')
550+
self.createEnum('win',listObjects,ENUM_IDENTS)
551+
self.writeLine('')
552+
553+
listObjects.clear()
554+
FOR i:=0 TO windowItems.count()-1
537555
layoutObject:=windowLayouts.item(i)
556+
windowObject:=windowItems.item(i)
538557
listObjects.clear()
539558
layoutObject.findObjectsByType(listObjects,-1)
540-
StringF(tempStr,'//\s',windowNames.item(i))
559+
StringF(tempStr,'//\s gadgets',windowObject.ident)
541560
self.writeLine(tempStr)
542-
self.createEnum(windowNames.item(i),listObjects,FALSE)
543-
IF self.useIds THEN self.createEnum(windowNames.item(i),listObjects,TRUE)
561+
self.createEnum(windowObject.ident,listObjects,ENUM_IDXS)
562+
IF self.useIds THEN self.createEnum(windowObject.ident,listObjects,ENUM_IDS)
544563
ENDFOR
545564
END listObjects
546565
self.writeLine('')
@@ -877,7 +896,7 @@ PROC genWindowHeader(count, windowObject:PTR TO windowObject, menuObject:PTR TO
877896
DEF listStr
878897
DEF drawlist:PTR TO drawlist
879898

880-
StrCopy(tempStr,windowObject.name)
899+
StrCopy(tempStr,windowObject.ident)
881900
LowerStr(tempStr)
882901
self.write('void ')
883902
self.write(tempStr)
@@ -1075,10 +1094,14 @@ PROC genWindowFooter(count, windowObject:PTR TO windowObject, menuObject:PTR TO
10751094
DEF reactionObject:PTR TO reactionObject
10761095
DEF listStr
10771096
DEF tempStr[200]:STRING
1097+
DEF windowName[200]:STRING
10781098
DEF i
10791099

10801100
StringF(tempStr,' main_gadgets[\d] = 0;',count)
10811101
self.writeLine(tempStr)
1102+
1103+
StrCopy(windowName,windowObject.ident)
1104+
LowerStr(windowName)
10821105

10831106
IF self.definitionOnly
10841107
self.writeLine('}')
@@ -1088,10 +1111,10 @@ PROC genWindowFooter(count, windowObject:PTR TO windowObject, menuObject:PTR TO
10881111

10891112
self.writeLine('')
10901113
IF menuObject.menuItems.count()>0
1091-
StringF(tempStr,' runWindow( window_object, \d, menu_strip, main_gadgets );',windowObject.id)
1114+
StringF(tempStr,' runWindow( window_object, \s_id, menu_strip, main_gadgets );',windowName)
10921115
self.writeLine(tempStr)
10931116
ELSE
1094-
StringF(tempStr,' runWindow( window_object, \d, 0, main_gadgets );',windowObject.id)
1117+
StringF(tempStr,' runWindow( window_object, \s_id, 0, main_gadgets );',windowName)
10951118
self.writeLine(tempStr)
10961119
ENDIF
10971120
self.writeLine('')
@@ -1192,7 +1215,7 @@ PROC genFooter(windowObject:PTR TO windowObject, rexxObject:PTR TO rexxObject) O
11921215
ENDIF
11931216

11941217

1195-
StringF(tempStr,' \s',windowObject.name)
1218+
StringF(tempStr,' \s',windowObject.ident)
11961219
LowerStr(tempStr)
11971220
StrAdd(tempStr,'();')
11981221
self.writeLine(tempStr)

0 commit comments

Comments
 (0)