#include #define TEXT_AREA 100 #define FONTS_NUM 2 struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct DiskFontBase *DiskfontBase; #ifdef ISUP_RUNTIME struct Library *iSupBase; #else struct Device *ConsoleDevice; struct IOStdReq ConsoleMsg; #endif struct TextAttr Attribute[2]; struct TextFont *Font[2]; struct Window *window[2]; struct TextArea *textarea[2]; UBYTE Title[2][40] = { "Sample Topaz 8 Text Area", "Sample Helvetica 13 Text Area" }; BOOL LoadFonts() { extern struct TextFont *OpenFont(), *OpenDiskFont(); USHORT i; /* Just change these attributes to get new fonts in the text areas, */ /* they will adapt to any font (as long as it's left->right one) */ Attribute[0].ta_Name = "topaz.font"; Attribute[0].ta_YSize = 8; Attribute[1].ta_Name = "helvetica.font"; Attribute[1].ta_YSize = 13; for(i=0; itf_YSize!=Attribute[i].ta_YSize) ) { if (!(Font[i]=OpenDiskFont(&Attribute[i]))) { DisplayBeep(NULL); return(FALSE); } } } return(TRUE); } VOID main(argc, argv) LONG argc; char **argv; { extern struct IntuiMessage *GetMsg(); extern struct Window *OpenStdWindow(); UBYTE rc = 0; LONG class; USHORT mouse_x, mouse_y, area; APTR address; struct IntuiMessage *message; struct Window *w; if ( !(GfxBase = (struct Library *)OpenLibrary("graphics.library", 0)) || !(IntuitionBase = (struct Library *)OpenLibrary("intuition.library", 0)) || !(DiskfontBase = (struct Library *)OpenLibrary("diskfont.library", 0)) #ifdef ISUP_RUNTIME || !(iSupBase = (struct Library *)OpenLibrary("isup.library", 0)) #else || !(!OpenDevice("console.device", -1, &ConsoleMsg, 0) && (ConsoleDevice=ConsoleMsg.io_Device)) #endif ) goto MAIN_DONE; window[0] = OpenStdWindow(Title[0], 0x1F, 15,20,350,150, NULL); window[1] = OpenStdWindow(Title[1], 0x17, 35,43,350,150, NULL); ModifyIDCMP(window[0], CLOSEWINDOW | GADGETDOWN | NEWSIZE); ModifyIDCMP(window[1], GADGETDOWN | NEWSIZE); if (!LoadFonts()) { rc = 20; goto MAIN_DONE; } if (!window[0]) { rc = 30; goto MAIN_DONE; } if (!window[1]) { rc = 40; goto MAIN_DONE; } /* Prepare the windows for text areas. Set the colors (already done) */ /* and the fonts. Note that we leave a little room around the text */ /* areas: this is safer in case some character have fancy kerning - */ /* for instance 'u' as -1 in Times 18 and will come out of the area */ /* by one pixel towards the left if it appears first on a line. */ SetFont(window[0]->RPort, Font[0]); SetFont(window[1]->RPort, Font[1]); textarea[0]=OpenTextArea(window[0], 6,12,(USHORT)(window[0]->Width-11),(USHORT)(window[0]->Height-15), TEXT_AREA, -1, 0); textarea[1]=OpenTextArea(window[1], 6,12,(USHORT)(window[1]->Width-11),(USHORT)(window[1]->Height-15), TEXT_AREA, -1, 0); if (!textarea[0] || !textarea[1]) { rc = 50; goto MAIN_DONE; } /* Place some text in the text areas. You should ALWAYS place some */ /* text in a text area. They are returned with 0 acitves lines, and */ /* must have at least one line to be usable. If no text is wanted */ /* upon startup, you MUST use the following: */ /* AddTextAreaLine(myarea, -1, ""); */ AddTextAreaLine(textarea[0], -1, "This font is non proportional.", LN_PARAGRAPH_BEGIN); RefreshTextArea(textarea[0]); AddTextAreaLine(textarea[1], -1, "This font is proportional.", LN_PARAGRAPH_BEGIN); AddTextAreaLine(textarea[1], -1, "Try typing some text and scrolling around!", LN_PARAGRAPH_BEGIN); RefreshTextArea(textarea[1]); /* Force editing into the second area with some fake mouse coords */ /* that will posiion the cursor at the end of the text. */ /* We come back from here whenever the user does anything else then */ /* editing (clicking somewhere outside the area, pulling a menu or */ /* anything else), and the message that caused the exit will be left */ /* on our port transparently. How's that? */ EditTextArea(textarea[1], 1000, 1000); FOREVER { /* DO NOT take this as an example for a good control loop!! */ /* I just dont have time make the windows share their port. */ Wait( (window[0]? (1<UserPort->mp_SigBit) : 0) | (window[1]? (1<UserPort->mp_SigBit) : 0) ); while ( (message=(window[0]? GetMsg(window[0]->UserPort) : NULL)) || (message=(window[1]? GetMsg(window[1]->UserPort) : NULL)) ) { class = message->Class; address = message->IAddress; mouse_x = message->MouseX; mouse_y = message->MouseY; w = message->IDCMPWindow; ReplyMsg(message); /* Get the right window pointer back. */ /* This is screwy, but... it works (sight!) */ area = (w==window[0]? 0 : 1); switch(class) { case CLOSEWINDOW: goto MAIN_DONE; case GADGETDOWN: /* here we go to the actual editing. As you can */ /* see, it's not too complicated. */ if (((struct Gadget *)address)->GadgetID==TEXT_AREA) EditTextArea(textarea[area], mouse_x, mouse_y); break; case NEWSIZE: SetPointerNum(w, WAIT_POINTER); RemakeStdWindow(w, Title[area]); textarea[area]->Width = w->Width- 11; textarea[area]->Height = w->Height-15; RethinkTextArea(textarea[area], 0); SetPointerNum(w, WBENCH_POINTER); EditTextArea(textarea[area], -1, -1); break; } } } MAIN_DONE: for (area=0; area<2; area++) { if (textarea[area]) CloseTextArea(textarea[area]); if (window[area]) CloseStdWindow(window[area]); } #ifdef ISUP_RUNTIME if (iSupBase) CloseLibrary(iSupBase); #else if (ConsoleDevice) CloseDevice(&ConsoleMsg); #endif if (DiskfontBase) CloseLibrary(DiskfontBase); if (IntuitionBase) CloseLibrary(IntuitionBase); if (GfxBase) CloseLibrary(GfxBase); exit(rc); }