home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 August / macformat-027.iso / mac / Shareware City / Developers / Oberon⁄F / Samples / Mod / MacEditor (.txt) < prev    next >
Encoding:
Oberon Document  |  1994-06-07  |  22.3 KB  |  596 lines  |  [oODC/obnF]

  1. Documents.StdDocumentDesc
  2. Documents.DocumentDesc
  3. Containers.ViewDesc
  4. Views.ViewDesc
  5. Stores.StoreDesc
  6. Documents.ModelDesc
  7. Containers.ModelDesc
  8. Models.ModelDesc
  9. Stores.ElemDesc
  10. TextViews.StdViewDesc
  11. TextViews.ViewDesc
  12. TextModels.StdModelDesc
  13. TextModels.ModelDesc
  14. TextModels.AttributesDesc
  15. Geneva
  16. TextRulers.StdRulerDesc
  17. TextRulers.RulerDesc
  18. TextRulers.StdStyleDesc
  19. TextRulers.StyleDesc
  20. TextRulers.AttributesDesc
  21. DevCommanders.StdViewDesc
  22. DevCommanders.ViewDesc
  23. Geneva
  24. MODULE SamplesMacEditor;    (* Sample Macintosh Application mf/od*)
  25. (* This Sample Text Editor shows how to use MacOberon to develop a standalone Mac Application.
  26.     Some parts are taken from the new Inside Mac Toolbox Essentiels, so you have to lookup
  27.     there, if you have some specific questions about the code.
  28.     This application does NOT show how you SHOULD program to Mac, it's only intended as
  29.     a sample for the use of MacOberon!
  30.     Because we use the MacOberon Compiler, this application needs also at least an 68020 processor.
  31.     Click the following commands to compile, link and launch the application:
  32.  DevCompiler.Compile
  33.  DevLinker.Link ":Samples:MacEditor" +SamplesMacEditor >SamplesMacEditor
  34.     Read MakeMacApp.Doc for more information about how to create Macintosh standalone
  35.     applications using MacOberon. ( Write.Open MakeMacApp.Doc )
  36. IMPORT
  37.     SYSTEM,
  38.     MacTypes, QuickDraw := MacQuickDraw, MemoryMgr := MacMemoryMgr, FileMgr := MacFileMgr,
  39.     FontMgr := MacFontMgr, MenuMgr := MacMenuMgr, WindowMgr := MacWindowMgr,
  40.     TextEdit := MacTextEdit, DialogMgr := MacDialogMgr, PrintingMgr := MacPrintingMgr,
  41.     ControlMgr := MacControlMgr, EventMgr := MacEventMgr, DeskMgr := MacDeskMgr,
  42.     OSUtils := MacOSUtils, GestaltMgr := MacGestaltMgr;
  43. CONST
  44.     UNTAGGED = 1;
  45.     CALLBACK = 2;
  46.     (* Apple Menu *)    
  47.         mApple=256; 
  48.         iAbout=1;
  49.     (* File Menu *)
  50.         mFile=257; 
  51.         iNew=1;
  52.         iOpen=2;
  53.         iClose=3;
  54.         iSave=5;
  55.         iPageSetUp=7;
  56.         iPrint=8;
  57.         iQuit=10;
  58.     (* Edit Menu *)
  59.         mEdit=258;
  60.         iCut=3;
  61.         iCopy=4;
  62.         iPaste=5;
  63.         iClear=6;
  64.         iSelectAll=8;
  65.     (* Font Menus *)
  66.         mFont=259;
  67.         mSize=260;
  68.     (* Alerts *)
  69.         aAbout=1000;
  70.     (* Controls *)
  71.         rVScroll=128;
  72.     DocRec = RECORD [UNTAGGED]        (* Datatype for our documents *)
  73.         data : TextEdit.TEHandle;
  74.         vScrollBar : ControlMgr.ControlHandle;
  75.     END;
  76.     DocPtr = POINTER TO DocRec;
  77.     wcount: SHORTINT;    (* Application Window Number *)
  78.     gPrint : PrintingMgr.THPrint;    (* global Printhandle *)
  79. (***************************************************************)
  80. (* Two general routines for adjusting rectangles of the textwindows *)
  81.     PROCEDURE GetTERect(window : WindowMgr.WindowPtr; VAR teRect : QuickDraw.Rect);
  82.     BEGIN
  83.         teRect:=window.portRect;
  84.         QuickDraw.InsetRect(teRect, 4 ,4 );
  85.         DEC(teRect.right, 15);
  86.         DEC(teRect.bottom, 15);
  87.     END GetTERect;
  88.     PROCEDURE AdjustViewRect(docTE : TextEdit.TEHandle);
  89.     BEGIN
  90.         docTE.viewRect.bottom:=(((docTE.viewRect.bottom-docTE.viewRect.top) DIV docTE.lineHeight) *
  91.             docTE.lineHeight) + docTE.viewRect.top;
  92.     END AdjustViewRect;
  93. (***************************************************************)
  94. (* Creates and returns a new TextEdit window *)
  95.     PROCEDURE NewWindow() : WindowMgr.WindowPtr;
  96.     VAR 
  97.         winTitle: MacTypes.Str255;
  98.         wbounds, tbounds: QuickDraw.Rect;
  99.         window: WindowMgr.WindowPtr;
  100.         text: TextEdit.TEHandle;
  101.         newDoc : DocPtr;
  102.         info : FontMgr.FontInfo;
  103.     BEGIN    
  104.         wbounds.top:= QuickDraw.globals.screenBits.bounds.top+40+10*(wcount MOD 10);    (* Open new window *)
  105.         wbounds.left:=QuickDraw.globals.screenBits.bounds.left+20+10*(wcount MOD 10);
  106.         wbounds.bottom:=QuickDraw.globals.screenBits.bounds.bottom-20;
  107.         wbounds.right:= QuickDraw.globals.screenBits.bounds.right-50; INC(wcount);
  108.         winTitle[0]:=3X; winTitle[1]:=23X; winTitle[2]:=CHR((wcount DIV 10) MOD 10+30H); winTitle[3]:=CHR(wcount MOD 10+30H);
  109.         window:=WindowMgr.NewWindow(NIL, wbounds, winTitle, FALSE, 0, SYSTEM.VAL(WindowMgr.WindowPtr, -1), TRUE, 0);
  110.         QuickDraw.SetPort(window);
  111.         GetTERect(window, tbounds);
  112.         text:= TextEdit.TENew(tbounds, tbounds);    (* Add textedit structure and set default font *)
  113.         text.txFont:=4; text.txSize:=9;
  114.         QuickDraw.TextFont(4); QuickDraw.TextSize(9);
  115.         FontMgr.GetFontInfo(info);
  116.         text.lineHeight:=info.ascent+info.descent+info.leading;
  117.         text.fontAscent:=info.ascent;
  118.         AdjustViewRect(text);
  119.         TextEdit.TEAutoView(TRUE, text);        
  120.         newDoc := SYSTEM.VAL(DocPtr, MemoryMgr.NewPtrClear(SIZE(DocRec)));
  121.         newDoc.data:=text;
  122.         newDoc.vScrollBar:=ControlMgr.GetNewControl(rVScroll, window);    (* Add scrollbar *)
  123.         window.refCon:=SYSTEM.VAL(LONGINT, newDoc);    (* We use the window refcon to store our data pointer *)
  124.         RETURN window
  125.     END NewWindow;
  126. (***************************************************************)
  127. (* Routines for text scrolling and updating *)
  128.     PROCEDURE AdjustTE(window : WindowMgr.WindowPtr);
  129.         myDoc : DocPtr;
  130.     BEGIN
  131.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  132.         TextEdit.TEPinScroll( myDoc.data.viewRect.left - myDoc.data.destRect.left,
  133.             myDoc.data.viewRect.top - myDoc.data.destRect.top -
  134.             ControlMgr.GetCtlValue(myDoc.vScrollBar)*myDoc.data.lineHeight, myDoc.data);
  135.     END AdjustTE;
  136.     PROCEDURE AdjustScrollSizes(window : WindowMgr.WindowPtr);
  137.         myDoc : DocPtr;
  138.         teTop, teRight, teBottom : INTEGER;
  139.         teRect : QuickDraw.Rect;
  140.     BEGIN
  141.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  142.         GetTERect(window, teRect);
  143.         teTop:=window.portRect.top;
  144.         teRight:=window.portRect.right;
  145.         teBottom:=window.portRect.bottom;
  146.         myDoc.data.viewRect:=teRect;
  147.         AdjustViewRect(myDoc.data);
  148.         ControlMgr.MoveControl(myDoc.vScrollBar, teRight-15, -1);
  149.         ControlMgr.SizeControl(myDoc.vScrollBar, 16, (teBottom-teTop)-13);
  150.     END AdjustScrollSizes;
  151.     PROCEDURE AdjustScrollValues(window : WindowMgr.WindowPtr);
  152.     VAR 
  153.         myDoc : DocPtr;
  154.         max, lines, value : INTEGER;
  155.     BEGIN
  156.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  157.         lines:=myDoc.data.nLines;
  158.         max:=lines-((myDoc.data.viewRect.bottom-myDoc.data.viewRect.top) DIV myDoc.data.lineHeight);
  159.         IF max<0 THEN max:=0 END;
  160.         ControlMgr.SetCtlMax(myDoc.vScrollBar, max);
  161.         value:=(myDoc.data.viewRect.top-myDoc.data.destRect.top) DIV myDoc.data.lineHeight;
  162.         IF value<0 THEN value:=0 END;IF value>max THEN value:=max END;
  163.         ControlMgr.SetCtlValue(myDoc.vScrollBar, value);
  164.         ControlMgr.ShowControl(myDoc.vScrollBar)
  165.     END AdjustScrollValues;
  166.     PROCEDURE AdjustScrollBars(window : WindowMgr.WindowPtr; resize : BOOLEAN);
  167.     VAR 
  168.         myDoc : DocPtr;
  169.     BEGIN
  170.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  171.         myDoc.vScrollBar.contrlVis:=0X;
  172.         IF resize THEN AdjustScrollSizes(window) END;
  173.         AdjustScrollValues(window)
  174.     END AdjustScrollBars;
  175. (***************************************************************)
  176. (* Use StandardGetFile to select and open a plain ascii text file *)
  177.     PROCEDURE OpenFile;
  178.         myTypes : FileMgr.SFTypeList;
  179.         myReply : FileMgr.StandardFileReply;
  180.         window : WindowMgr.WindowPtr;
  181.         inFile : INTEGER;
  182.         err : INTEGER;
  183.         theSize : LONGINT;
  184.         buffer : MacTypes.Ptr;
  185.         myDoc : DocPtr;
  186.     BEGIN
  187.         myTypes[0]:=054455854H;    (* TEXT *)
  188.         FileMgr.StandardGetFile(NIL, 1, myTypes, myReply);
  189.         IF myReply.sfGood THEN
  190.             window:=NewWindow();
  191.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  192.             WindowMgr.SetWTitle(window, SYSTEM.VAL(MacTypes.Str255, myReply.sfFile.name));
  193.             err:=FileMgr.FSpOpenDF(myReply.sfFile, 0, inFile);
  194.             err:=FileMgr.GetEOF(inFile, theSize);
  195.             IF theSize>7FFFH THEN theSize:=7FFFH END;    (* Limitation of TextEdit, max 32768 chars *)
  196.             err:=FileMgr.SetFPos(inFile, 1, 0);
  197.             buffer := MemoryMgr.NewPtr(8000H);
  198.             err:=FileMgr.FSRead(inFile, theSize, buffer);
  199.             err:=FileMgr.FSClose(inFile);
  200.             TextEdit.TESetText(buffer, theSize, myDoc.data);
  201.             AdjustScrollBars(window, TRUE);
  202.             AdjustTE(window);
  203.             WindowMgr.ShowWindow(window);
  204.             MemoryMgr.DisposPtr(buffer)
  205.         END;
  206.     END OpenFile;
  207. (***************************************************************)
  208. (* Close the front window *)
  209.     PROCEDURE CloseWindow;
  210.         window : WindowMgr.WindowPtr;
  211.         myDoc : DocPtr;
  212.     BEGIN
  213.         window:=WindowMgr.FrontWindow();
  214.         IF window=NIL THEN RETURN END;
  215.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  216.         TextEdit.TEDispose(myDoc.data);
  217.         WindowMgr.CloseWindow(window);
  218.         MemoryMgr.DisposPtr(SYSTEM.VAL(MacTypes.Ptr, myDoc));
  219.     END CloseWindow;
  220. (***************************************************************)
  221. (* Save the content of the front window to a file *)
  222.     PROCEDURE SaveWindow;
  223.         myReply : FileMgr.StandardFileReply;
  224.         prompt, defname : MacTypes.Str255;
  225.         myDoc : DocPtr;
  226.         window : WindowMgr.WindowPtr;
  227.         myFile : INTEGER;
  228.         err : INTEGER;
  229.         size : LONGINT;
  230.     BEGIN
  231.         window:=WindowMgr.FrontWindow();
  232.         IF window=NIL THEN RETURN END;
  233.         MacTypes.SetStr255(prompt, 'Save file as :');
  234.         MacTypes.SetStr255(defname, 'Untitled');
  235.         FileMgr.StandardPutFile(prompt, defname, myReply);    (* Select a filename *)
  236.         IF myReply.sfGood THEN
  237.             IF myReply.sfReplacing THEN err:=FileMgr.FSpDelete(myReply.sfFile) END;
  238.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  239.             err:=FileMgr.FSpCreate(myReply.sfFile, 045444954H, 054455854H, 0);    (* Create a new file *)
  240.             err:=FileMgr.FSpOpenDF(myReply.sfFile, 0, myFile);
  241.             IF err=0 THEN
  242.                 (* Write the text data *)
  243.                 size:=myDoc.data.teLength;
  244.                 err:=FileMgr.FSWrite(myFile, size, SYSTEM.VAL(MacTypes.Ptr, SYSTEM.ADR(myDoc.data.hText[0])));
  245.                 err:=FileMgr.FSClose(myFile)
  246.             END
  247.         END
  248.     END SaveWindow;
  249. (***************************************************************)
  250. (* Print the content of the front window *)
  251.     PROCEDURE DoPageSetUp;
  252.     VAR 
  253.         ignore : BOOLEAN;
  254.     BEGIN
  255.         PrintingMgr.PrOpen;
  256.         ignore:=PrintingMgr.PrStlDialog(gPrint);    (* Get Pagesetup *)
  257.         PrintingMgr.PrClose
  258.     END DoPageSetUp;
  259.     PROCEDURE DoPrint;
  260.         myDoc : DocPtr;
  261.         window : WindowMgr.WindowPtr;
  262.         pages : INTEGER;
  263.         lines : INTEGER;
  264.         prPort : PrintingMgr.TPPrPort;
  265.         line,page : INTEGER;
  266.         lh,y : INTEGER;
  267.     BEGIN
  268.         window:=WindowMgr.FrontWindow();
  269.         IF window=NIL THEN RETURN END;
  270.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  271.         PrintingMgr.PrOpen;
  272.         IF PrintingMgr.PrJobDialog(gPrint) THEN    (* Get printing options *)
  273.             prPort:=PrintingMgr.PrOpenDoc(gPrint, NIL, NIL);
  274.             lines:= (prPort.portRect.bottom - prPort.portRect.top) DIV myDoc.data.lineHeight;
  275.             pages:= myDoc.data.nLines DIV lines;
  276.             line:=0; page:=0;
  277.             WHILE page<=pages DO
  278.                 PrintingMgr.PrOpenPage(prPort, NIL);
  279.                 QuickDraw.TextFont(myDoc.data.txFont);
  280.                 QuickDraw.TextSize(myDoc.data.txSize);
  281.                 lh:=myDoc.data.lineHeight;
  282.                 y:=lh;
  283.                 REPEAT
  284.                     QuickDraw.MoveTo(20,y);
  285.                     QuickDraw.DrawText(SYSTEM.ADR(myDoc.data.hText[0]), myDoc.data.lineStarts[line],
  286.                         myDoc.data.lineStarts[line+1] - myDoc.data.lineStarts[line]-1);
  287.                     INC(line);
  288.                     INC(y,lh);
  289.                 UNTIL ((line>myDoc.data.nLines) OR ((line MOD lines)=0));
  290.                 PrintingMgr.PrClosePage(prPort);
  291.                 INC(page);
  292.             END;
  293.             PrintingMgr.PrCloseDoc(prPort);
  294.         END;
  295.         PrintingMgr.PrClose
  296.     END DoPrint;
  297. (***************************************************************)
  298. (* Clickroutine for scrollbar *)
  299.     PROCEDURE [CALLBACK] VertAction(control : ControlMgr.ControlHandle; part : INTEGER);
  300.         scrollDistance:INTEGER;
  301.         window : WindowMgr.WindowPtr;
  302.         myDoc : DocPtr;
  303.         oldSetting,max : INTEGER;
  304.     BEGIN
  305.         IF part#0 THEN
  306.             window:=control.contrlOwner;
  307.             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  308.             CASE part OF
  309.             |    ControlMgr.inUpButton,ControlMgr.inDownButton : scrollDistance:=1
  310.             |    ControlMgr.inPageUp,ControlMgr.inPageDown : scrollDistance:=10
  311.             END;
  312.             IF (part=ControlMgr.inDownButton) OR (part=ControlMgr
  313.             .inPageDown) THEN scrollDistance:=-scrollDistance END;
  314.             oldSetting:=ControlMgr.GetCtlValue(control);
  315.             max:=ControlMgr.GetCtlMax(control);
  316.             scrollDistance:=oldSetting-scrollDistance;
  317.             IF scrollDistance<0 THEN scrollDistance:=0 END;
  318.             IF scrollDistance>max THEN scrollDistance:=max END;
  319.             ControlMgr.SetCtlValue(control,scrollDistance);
  320.             scrollDistance:=oldSetting-scrollDistance;
  321.             IF scrollDistance#0 THEN TextEdit.TEPinScroll(0, scrollDistance*myDoc.data.lineHeight, myDoc.data) END;
  322.         END;
  323.     END VertAction;
  324. (***************************************************************)
  325. (* Process the clicking into a text window *)
  326.     PROCEDURE DoContentClick(window : WindowMgr.WindowPtr; event : EventMgr.EventRecord);
  327.         control : ControlMgr.ControlHandle;
  328.         value,part : INTEGER;
  329.         myDoc : DocPtr;
  330.         teRect : QuickDraw.Rect;
  331.     BEGIN
  332.         QuickDraw.SetPort(window);
  333.         QuickDraw.GlobalToLocal(event.where);
  334.         GetTERect(window, teRect);
  335.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  336.         IF ~QuickDraw.PtInRect(event.where,teRect) THEN    (* Click into scrollbar? *)
  337.             part:=ControlMgr.FindControl(event.where, window, control);
  338.             CASE part OF
  339.             |    0 :
  340.             |    ControlMgr.inThumb : 
  341.                 value:=ControlMgr.GetCtlValue(control);
  342.                 part:=ControlMgr.TrackControl(control, event.where, NIL);
  343.                 IF part#0 THEN
  344.                     value:=value - ControlMgr.GetCtlValue(control);
  345.                     IF value#0 THEN TextEdit.TEPinScroll(0, value*myDoc.data.lineHeight, myDoc.data) END
  346.                 END
  347.             ELSE 
  348.                 part := ControlMgr.TrackControl(control, event.where, SYSTEM.VAL(MacTypes.ProcPtr, SYSTEM.ADR(VertAction)));
  349.             END
  350.         ELSE TextEdit.TEClick(event.where, FALSE, myDoc.data) END    (* Click into window *)
  351.     END DoContentClick;
  352. (***************************************************************)
  353. (* Process the selecting of a menuitem *)
  354.     PROCEDURE MenuCommand(menuResult: LONGINT);    (* Item has been Chosen by MenuSelect or MenuKey *)
  355.     VAR 
  356.         menu, item: INTEGER;
  357.         Name: MacTypes.Str255;
  358.         daRefNum: INTEGER; 
  359.         itemHit: INTEGER; 
  360.         window: WindowMgr.WindowPtr;
  361.         myDoc: DocPtr; 
  362.         fontID, fsize : INTEGER; 
  363.         fInfo : FontMgr.FontInfo; 
  364.         oldPort : QuickDraw.GrafPtr;
  365.     BEGIN    
  366.         menu:=SHORT(menuResult DIV 10000H); item:=SHORT(menuResult MOD 10000H);   (* Get menu and item number *)
  367.         window:=WindowMgr.FrontWindow();
  368.         IF window#NIL THEN myDoc:=SYSTEM.VAL(DocPtr, window.refCon) END;
  369.         CASE    menu    OF
  370.         |    mApple:
  371.                     IF item=iAbout THEN itemHit:=DialogMgr.Alert(aAbout, NIL)
  372.                     ELSE
  373.                         MenuMgr.GetItem(MenuMgr.GetMHandle(mApple), item, Name);
  374.                         daRefNum:=DeskMgr.OpenDeskAcc(Name)
  375.                     END
  376.         |    mFile:
  377.                     CASE item OF
  378.                     |    iNew : window:=NewWindow();AdjustScrollBars(window, TRUE);
  379.                         WindowMgr.ShowWindow(window)
  380.                     |    iOpen : OpenFile;
  381.                     |    iClose : CloseWindow;
  382.                     |    iPageSetUp : DoPageSetUp;
  383.                     |    iPrint : DoPrint;
  384.                     |    iSave : SaveWindow;
  385.                     |    iQuit : OSUtils.ExitToShell 
  386.                     ELSE END
  387.         |    mEdit:
  388.                     IF window#NIL THEN
  389.                         CASE item OF    (* We don't exchange our data with the clipboard *)
  390.                         |    iCut : TextEdit.TECut(myDoc.data);
  391.                         |    iCopy : TextEdit.TECopy(myDoc.data);
  392.                         |    iPaste : TextEdit.TEPaste(myDoc.data);
  393.                         |    iClear : TextEdit.TEDelete(myDoc.data);
  394.                         |    iSelectAll : TextEdit.TESetSelect(0, 32767, myDoc.data)
  395.                         ELSE END;
  396.                         AdjustScrollBars(window, FALSE)
  397.                     END
  398.         |    mFont:
  399.                     IF window#NIL THEN
  400.                         MenuMgr.GetItem(MenuMgr.GetMHandle(mFont), item, Name);
  401.                         FontMgr.GetFNum(Name, fontID);
  402.                         QuickDraw.GetPort(oldPort);
  403.                         QuickDraw.SetPort(myDoc.data.inPort);
  404.                         QuickDraw.TextFont(fontID);
  405.                         myDoc.data.txFont:=fontID;
  406.                         AdjustScrollBars(window, TRUE);
  407.                         AdjustTE(window);
  408.                         WindowMgr.InvalRect(window.portRect);
  409.                         QuickDraw.SetPort(oldPort)
  410.                     END
  411.         |    mSize:
  412.                     IF window#NIL THEN
  413.                         CASE item OF
  414.                         |    1 : fsize:=9;
  415.                         |    2 : fsize:=10;
  416.                         |    3 : fsize:=12;
  417.                         |    4 : fsize:=18;
  418.                         |    5 : fsize:=24
  419.                         ELSE END;
  420.                         QuickDraw.GetPort(oldPort);
  421.                         QuickDraw.SetPort(myDoc.data.inPort);
  422.                         QuickDraw.TextSize(fsize);
  423.                         myDoc.data.txSize:=fsize;
  424.                         FontMgr.GetFontInfo(fInfo);
  425.                         myDoc.data.lineHeight:=fInfo.ascent+fInfo.descent+fInfo.leading;
  426.                         myDoc.data.fontAscent:=fInfo.ascent;
  427.                         AdjustScrollBars(window, TRUE);
  428.                         AdjustTE(window);
  429.                         WindowMgr.InvalRect(window.portRect);
  430.                         QuickDraw.SetPort(oldPort)
  431.                     END
  432.         ELSE END;
  433.         MenuMgr.HiliteMenu(0)
  434.     END MenuCommand;
  435. (***************************************************************)
  436. (* Help routine for update *)
  437.     PROCEDURE GetLocalUpdateRgn(window : WindowMgr.WindowPtr; localRgn : QuickDraw.RgnHandle);
  438.     BEGIN
  439.         QuickDraw.CopyRgn(window.updateRgn, localRgn);
  440.         QuickDraw.OffsetRgn(localRgn, window.portPixMap.bounds.left, window.portPixMap.bounds.top)
  441.     END GetLocalUpdateRgn;
  442. (***************************************************************)
  443. (* Handle activating or deactivating of a text window  *)
  444.     PROCEDURE DoActivate(window : WindowMgr.WindowPtr; active : BOOLEAN);
  445.         myDoc : DocPtr;
  446.         growRect : QuickDraw.Rect;
  447.     BEGIN
  448.         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  449.         IF active THEN
  450.             TextEdit.TEActivate(myDoc.data);
  451.             myDoc.vScrollBar.contrlVis:=0FFX;
  452.             WindowMgr.InvalRect(myDoc.vScrollBar.contrlRect);
  453.             growRect:=window.portRect;
  454.             growRect.left:=growRect.right-15;
  455.             growRect.top:=growRect.bottom-15;
  456.             WindowMgr.InvalRect(growRect);
  457.         ELSE
  458.             TextEdit.TEDeactivate(myDoc.data);
  459.             ControlMgr.HideControl(myDoc.vScrollBar);
  460.             WindowMgr.DrawGrowIcon(window)
  461.         END
  462.     END DoActivate;
  463. (***************************************************************)
  464. (* Main loop of our program - handles all incoming events *)
  465.     PROCEDURE Loop();
  466.     VAR 
  467.         gotEvent: BOOLEAN;
  468.         event: EventMgr.EventRecord; 
  469.         window: WindowMgr.WindowPtr;
  470.         key: INTEGER;
  471.         newsize : LONGINT;
  472.         myDoc : DocPtr;
  473.         growRect, oldViewRect : QuickDraw.Rect;
  474.         locUpdateRgn : QuickDraw.RgnHandle;
  475.         theResult : BOOLEAN;
  476.     BEGIN
  477.         LOOP    gotEvent:=EventMgr.WaitNextEvent(EventMgr.everyEvent, event, 0, NIL);
  478.             CASE    event.what    OF
  479.             |    EventMgr.mouseDown:
  480.                         CASE    WindowMgr.FindWindow(event.where, window)    OF
  481.                         |    WindowMgr.inMenuBar:    MenuCommand(MenuMgr.MenuSelect(event.where))
  482.                         |    WindowMgr.inSysWindow:    DeskMgr.SystemClick(event, window)
  483.                         |    WindowMgr.inContent:
  484.                                     IF    window # WindowMgr.FrontWindow()    THEN WindowMgr.SelectWindow(window)
  485.                                     ELSE DoContentClick(window, event)
  486.                                     END
  487.                         |    WindowMgr.inDrag:    WindowMgr.DragWindow(window, event.where, QuickDraw.globals.screenBits.bounds)
  488.                         |    WindowMgr.inGoAway:    IF WindowMgr.TrackGoAway(window, event.where) THEN WindowMgr.CloseWindow(window) END
  489.                         |    WindowMgr.inGrow: 
  490.                                     QuickDraw.SetPort(window);
  491.                                     QuickDraw.SetRect(growRect, 64, 64, 2000, 2000);
  492.                                     newsize:=WindowMgr.GrowWindow(window, event.where, growRect);
  493.                                     IF newsize#0 THEN
  494.                                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  495.                                         oldViewRect:=myDoc.data.viewRect;
  496.                                         locUpdateRgn:=QuickDraw.NewRgn();
  497.                                         GetLocalUpdateRgn(window, locUpdateRgn);
  498.                                         WindowMgr.SizeWindow(window, SHORT(newsize MOD 10000H), SHORT(newsize DIV 10000H),TRUE);
  499.                                         AdjustScrollBars(window, TRUE);
  500.                                         AdjustTE(window);
  501.                                         WindowMgr.InvalRect(window.portRect);
  502.                                         theResult:=QuickDraw.SectRect(oldViewRect, myDoc.data.viewRect, oldViewRect);
  503.                                         WindowMgr.ValidRect(oldViewRect);
  504.                                         WindowMgr.InvalRgn(locUpdateRgn);
  505.                                         QuickDraw.DisposeRgn(locUpdateRgn);
  506.                                     END;
  507.                         |    WindowMgr.inDesk, WindowMgr.inZoomIn, WindowMgr.inZoomOut:
  508.                         END;
  509.             |    EventMgr.keyDown, EventMgr.autoKey:    (* check if cmdkey is pressed *)
  510.                         key:=SHORT(event.message MOD 100H);
  511.                         IF    8 IN SYSTEM.VAL(SET, LONG(event.modifiers))    THEN    MenuCommand(MenuMgr.MenuKey(key))
  512.                         ELSE
  513.                             window:=WindowMgr.FrontWindow();
  514.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  515.                             TextEdit.TEKey(key, myDoc.data);    (* Enter key in text *)
  516.                             AdjustScrollBars(window, FALSE)
  517.                         END
  518.             |    EventMgr.updateEvt:
  519.                         window:=SYSTEM.VAL(WindowMgr.WindowPtr, event.message);
  520.                         IF window#NIL THEN
  521.                             myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  522.                             WindowMgr.BeginUpdate(window);
  523.                                 QuickDraw.SetPort(window);
  524.                                 QuickDraw.EraseRect(window.portRect);
  525.                                 ControlMgr.DrawControls(window);
  526.                                 WindowMgr.DrawGrowIcon(window);
  527.                                 TextEdit.TEUpdate(window.portRect, myDoc.data);
  528.                             WindowMgr.EndUpdate(window)
  529.                         END;
  530.             |    EventMgr.activateEvt:    (* modifiers: bit0:  0=deactivate 1=activate *)
  531.                         window:=SYSTEM.VAL(WindowMgr.WindowPtr, event.message);
  532.                         IF window#NIL THEN DoActivate(window, ODD(event.modifiers)) END;
  533.             |    EventMgr.osEvt:
  534.                         window:=WindowMgr.FrontWindow();
  535.                         IF    window#NIL    THEN    myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  536.                             IF    SYSTEM.LSH(event.message, -24) (*MOD 100H*)=EventMgr.suspendResumeMessage    THEN
  537.                                 IF    ODD(event.message)    THEN    (* Activate *)
  538.                                     QuickDraw.SetPort(window); TextEdit.TEActivate(myDoc.data); QuickDraw.InitCursor
  539.                                 ELSE    (* Deactivate *)
  540.                                     TextEdit.TEDeactivate(myDoc.data); QuickDraw.InitCursor
  541.                                 END
  542.                             END
  543.                         ELSE QuickDraw.InitCursor END
  544.             |    EventMgr.nullEvent:
  545.                     window:=WindowMgr.FrontWindow();
  546.                     IF window#NIL THEN
  547.                         myDoc:=SYSTEM.VAL(DocPtr, window.refCon);
  548.                         TextEdit.TEIdle(myDoc.data)
  549.                     END
  550.             ELSE    (* Ignore Other Event Types *)
  551.             END
  552.         END
  553.     END Loop;
  554. (***************************************************************)
  555. (* Initalize all menus, variables etc  *)
  556.     PROCEDURE InitMac;
  557.         systemversion : LONGINT; res: MacTypes.OSErr;
  558.     BEGIN
  559.         MemoryMgr.MaxApplZone;
  560.         MemoryMgr.MoreMasters;
  561.         QuickDraw.InitGraf(QuickDraw.globals.thePort);
  562.         (* The QuickDraw Globals are proper Oberon Variables *)
  563.         FontMgr.InitFonts;
  564.         WindowMgr.InitWindows;
  565.         MenuMgr.InitMenus;
  566.         TextEdit.TEInit;
  567.         DialogMgr.InitDialogs(0);
  568.         QuickDraw.InitCursor;
  569.         EventMgr.FlushEvents(EventMgr.everyEvent, 0);
  570.         res := GestaltMgr.Gestalt(GestaltMgr.SystemVersion, systemversion);
  571.         IF (res # 0) OR (systemversion < 0700H) THEN
  572.             OSUtils.SysBeep(1);
  573.             OSUtils.ExitToShell
  574.         END;
  575.     (* Set up menus *)
  576.         MenuMgr.SetMenuBar(MenuMgr.GetNewMBar(128));    
  577.         MenuMgr.AddResMenu(MenuMgr.GetMHandle(mApple), 44525652H);
  578.         MenuMgr.AddResMenu(MenuMgr.GetMHandle(mFont), 464F4E54H);
  579.         MenuMgr.DrawMenuBar;
  580.     (* Set up print structure *)
  581.         gPrint := SYSTEM.VAL(PrintingMgr.THPrint, MemoryMgr.NewHandle(120));
  582.         PrintingMgr.PrOpen;
  583.         PrintingMgr.PrintDefault(gPrint);
  584.         PrintingMgr.PrClose
  585.     END InitMac;
  586. BEGIN
  587.     InitMac;
  588.     Loop()
  589. END SamplesMacEditor.
  590. TextControllers.StdCtrlDesc
  591. TextControllers.ControllerDesc
  592. Containers.ControllerDesc
  593. Controllers.ControllerDesc
  594. Geneva
  595. Documents.ControllerDesc
  596.