home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyTextWindow.p < prev    next >
Encoding:
Text File  |  1993-06-17  |  7.1 KB  |  346 lines  |  [TEXT/PJMM]

  1. unit MyTextWindow;
  2.  
  3. interface
  4.  
  5.     uses
  6.         MyOOMainLoop, MyEditObject;
  7.  
  8.     const
  9.         WT_EditWindow = 'EdWd';
  10.  
  11.     type
  12.         TextWindowObject = object(DObject)
  13.                 textob: EditObject;
  14.                 spec: FSSpec;
  15.                 named: boolean;
  16.                 function Modified: boolean;
  17.                 procedure Create (id: integer);
  18.                 override;
  19.                 procedure Destroy;
  20.                 override;
  21.                 procedure Resize;
  22.                 override;
  23.                 function EditMenuEnabled: boolean;
  24.                 override;
  25.                 procedure SetEditMenuItem (item: integer);
  26.                 override;
  27.                 procedure DoEditMenu (item: integer);
  28.                 override;
  29.                 procedure DoKey (modifiers: integer; ch: char; code: integer);
  30.                 override;
  31.                 procedure DoItemWhere (er: eventRecord; item: integer);
  32.                 override;
  33.                 procedure DoActivateDeactivate (activate: boolean);
  34.                 override;
  35.                 procedure CalculateRegion (var rgn: rgnHandle);
  36.                 override;
  37.                 procedure DoIdle;
  38.                 override;
  39.                 procedure DoClose;
  40.                 override;
  41.                 function InsertText (p: ptr; s: longInt): integer;
  42.                 procedure DoNew;
  43.                 procedure Open (fs: FSSpec);
  44.                 procedure Save;
  45.                 procedure SaveAs (fs: FSSpec);
  46.                 procedure DoOpen;
  47.                 procedure DoSave;
  48.                 procedure DoSaveAs;
  49.             end;
  50.  
  51. implementation
  52.  
  53.     uses
  54.         MyUtils, BaseGlobals, MyTypes, MyUtilities, MyStandardFile;
  55.  
  56.     const
  57.         text_window_dialog_id = 600;
  58.         text_item = 1;
  59.  
  60.     function TextWindowObject.Modified: boolean;
  61.     begin
  62.         Modified := textob.modified;
  63.     end;
  64.  
  65.     procedure TextWindowObject.Resize;
  66.         var
  67.             kind, fsize, bt, rt: integer;
  68.             h: handle;
  69.             r: rect;
  70.             finfo: FontInfo;
  71.     begin
  72.         SetPort(window);
  73.         GetDItem(window, text_item, kind, h, r);
  74.         r := windowPeek(window)^.port.portRect;
  75.         InsetRect(r, -1, -1);
  76.         SetDItem(window, text_item, kind, h, r);
  77.         textob.Resize;
  78.     end;
  79.  
  80.     procedure TextWindowObject.DoActivateDeactivate (activate: boolean);
  81.     begin
  82.         textob.DoActivateDeactivate(activate);
  83.     end;
  84.  
  85.     procedure TextWindowObject.DoIdle;
  86.     begin
  87.         textob.DoIdle;
  88.     end;
  89.  
  90.     function TextWindowObject.EditMenuEnabled: boolean;
  91.     begin
  92.         EditMenuEnabled := textob.EditMenuEnabled;
  93.     end;
  94.  
  95.     procedure TextWindowObject.SetEditMenuItem (item: integer);
  96.     begin
  97.         textob.SetEditMenuItem(item);
  98.     end;
  99.  
  100.     procedure TextWindowObject.DoItemWhere (er: eventRecord; item: integer);
  101.     begin
  102.         textob.DoItemWhere(er, item);
  103.     end;
  104.  
  105.     procedure TextWindowObject.DoEditMenu (item: integer);
  106.     begin
  107.         textob.DoEditMenu(item);
  108.     end;
  109.  
  110.     procedure TextWindowObject.DoKey (modifiers: integer; ch: char; code: integer);
  111.     begin
  112.         textob.DoKey(modifiers, ch);
  113.     end;
  114.  
  115.     procedure TextWindowObject.CalculateRegion (var rgn: rgnHandle);
  116.         var
  117.             pt: point;
  118.             rgn2: rgnHandle;
  119.             r: rect;
  120.     begin
  121.         rgn := NewRgn;
  122.  
  123.         r := textob.te^^.viewRect;
  124.         SetPort(window);                    {make a global version of the viewRect}
  125.         GetMouse(pt);
  126.         RectRgn(rgn, r);
  127.         if PtInRect(pt, r) then begin
  128.             SetCursor(GetCursor(iBeamCursor)^^);
  129.         end
  130.         else begin
  131.             SetCursor(arrow);
  132.             rgn2 := NewRgn;
  133.             SetRectRgn(rgn2, -30000, -30000, 30000, 30000);
  134.             DiffRgn(rgn2, rgn, rgn);
  135.             DisposeRgn(rgn2);
  136.         end;
  137.     end;
  138.  
  139.     procedure DrawText (dp: dialogPtr; item: integer);
  140.     begin
  141.         TextWindowObject(GetWObject(dp)).textob.Draw;
  142.     end;
  143.  
  144.     function TextWindowObject.InsertText (p: ptr; s: longInt): integer;
  145.         var
  146.             t: longInt;
  147.     begin
  148.         t := GetHandleSize(textob.te^^.hText);
  149.         if t + s > 32000 then
  150.             InsertText := paste_to_big
  151.         else begin
  152.             SetHandleSize(textob.te^^.hText, t + s);
  153.             if GetHandleSize(textob.te^^.hText) <> t + s then begin
  154.                 InsertText := memFullErr;
  155.             end
  156.             else begin
  157.                 BlockMove(p, ptr(longInt(textob.te^^.hText^) + t), s);
  158.                 TECalText(textob.te);
  159.                 textob.Adjust;
  160.                 InsertText := 0;
  161.             end;
  162.         end;
  163.     end;
  164.  
  165.     procedure TextWindowObject.Create (id: integer);
  166.         var
  167.             kind, lw: integer;
  168.             h: handle;
  169.             r: rect;
  170.             temptextob: EditObject;
  171.             tempname: str63;
  172.     begin
  173.         inherited Create(id);
  174.         window_type := WT_EditWindow;
  175.         spec.vRefNum := 1;
  176.         spec.parID := -1;
  177.         spec.name := GetGlobalString(untitled_name);
  178.         named := false;
  179.         tempname := spec.name;
  180.         SetWTitle(window, tempname);
  181.         SetPort(window);
  182.         TextFont(monaco);
  183.         TextSize(9);
  184.         new(temptextob);
  185.         textob := temptextob;
  186.         lw := CharWidth('a') * 80;
  187.         textob.Create(window, text_item, lw, true, true, true, true, false);
  188.         zoomSize.h := lw + 20;
  189.         GetDItem(window, text_item, kind, h, r);
  190.         SetDItem(window, text_item, kind, handle(@DrawText), r);
  191.         Zoom(inZoomOut);
  192.     end;
  193.  
  194.     procedure TextWindowObject.Destroy;
  195.     begin
  196.         textob.Destroy;
  197.         inherited Destroy;
  198.     end;
  199.  
  200.     procedure TextWindowObject.DoNew;
  201.     begin
  202.         Create(text_window_dialog_id);
  203.         ShowWindow(window);
  204.     end;
  205.  
  206.     procedure TextWindowObject.Open (fs: FSSpec);
  207.         var
  208.             rn: integer;
  209.             oe, ooe: OSErr;
  210.             size: longInt;
  211.             err: integer;
  212.             p: ptr;
  213.     begin
  214.         err := generic_read_error;
  215.         Create(text_window_dialog_id);
  216.         oe := HOpenDF(fs.vRefNum, fs.parID, fs.name, fsRdPerm, rn);
  217.         if oe = noErr then begin
  218.             oe := GetEOF(rn, size);
  219.             if oe = noErr then begin
  220.                 if size > 32000 then begin
  221.                     err := paste_to_big;
  222.                     oe := -1;
  223.                 end
  224.                 else begin
  225.                     p := NewPtr(size);
  226.                     if p = nil then begin
  227.                         err := memFullErr;
  228.                         oe := -1;
  229.                     end
  230.                     else begin
  231.                         oe := FSRead(rn, size, p);
  232.                         if oe = noErr then begin
  233.                             err := InsertText(p, size);
  234.                             if err <> 0 then
  235.                                 oe := -1;
  236.                         end;
  237.                         DisposPtr(p);
  238.                     end;
  239.                 end;
  240.             end;
  241.             ooe := FSClose(rn);
  242.         end;
  243.         if oe <> noErr then begin
  244.             Destroy;
  245.             AlertUser(err);
  246.         end
  247.         else begin
  248.             spec := fs;
  249.             named := true;
  250.             SetWTitle(window, fs.name);
  251.             ShowWindow(window);
  252.         end;
  253.     end;
  254.  
  255.     procedure TextWindowObject.Save;
  256.         var
  257.             rn: integer;
  258.             oe, ooe: OSErr;
  259.             size: longInt;
  260.             tempname: str63;
  261.     begin
  262.         tempname := spec.name;
  263.         oe := HCreate(spec.vRefNum, spec.parID, tempname, 'R*ch', 'TEXT');
  264.         oe := HOpenDF(spec.vRefNum, spec.parID, tempname, fsWrPerm, rn);
  265.         if oe = noErr then begin
  266.             ooe := SetEOF(rn, 0);
  267.             size := GetHandleSize(textob.te^^.hText);
  268.             oe := FSWrite(rn, size, textob.te^^.hText^);
  269.             ooe := FSClose(rn);
  270.         end;
  271.         if oe <> noErr then
  272.             AlertUser(generic_write_error)
  273.         else
  274.             textob.modified := false;
  275.     end;
  276.  
  277.     procedure TextWindowObject.SaveAs (fs: FSSpec);
  278.     begin
  279.         spec := fs;
  280.         named := true;
  281.         SetWTitle(window, fs.name);
  282.         DoSave;
  283.     end;
  284.  
  285.     procedure TextWindowObject.DoClose;
  286.         var
  287.             sc: SCType;
  288.     begin
  289.         sc := SCDiscard;
  290.         if textob.modified then begin
  291.             sc := SaveChanges;
  292.             if sc = SCSave then begin
  293.                 DoSave;
  294.                 if textob.modified then
  295.                     sc := SCCancel; { if still modified, then the user didn't save, so they must have canceled }
  296.             end;
  297.         end;
  298.         if sc <> SCCancel then
  299.             Destroy;
  300.     end;
  301.  
  302.     procedure TextWindowObject.DoOpen;
  303.         var
  304.             reply: MySFReply;
  305.             fs: FSSPec;
  306.     begin
  307.         GetFile1('TEXT', reply);
  308.         with reply do
  309.             if Rgood then begin
  310.                 fs.vRefNum := RVRefNum;
  311.                 fs.parID := RdirID;
  312.                 fs.name := Rfname;
  313.                 Open(fs);
  314.             end
  315.             else
  316.                 Destroy;
  317.     end;
  318.  
  319.     procedure TextWindowObject.DoSave;
  320.     begin
  321.         if not named then
  322.             DoSaveAs
  323.         else
  324.             Save;
  325.     end;
  326.  
  327.     procedure TextWindowObject.DoSaveAs;
  328.         var
  329.             reply: MySFReply;
  330.             tempname: str63;
  331.             fs: FSSpec;
  332.     begin
  333.         if named then
  334.             SetSFFile(spec.vRefNum, spec.parID);
  335.         tempname := spec.name;
  336.         PutFile('Save file as:', tempname, reply);
  337.         with reply do
  338.             if Rgood then begin
  339.                 fs.vRefNum := RVRefNum;
  340.                 fs.parID := RdirID;
  341.                 fs.name := Rfname;
  342.                 SaveAs(fs);
  343.             end;
  344.     end;
  345.  
  346. end.