home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-04-20 | 8.1 KB | 374 lines | [TEXT/PJMM] |
- unit OOTalk;
-
- { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
-
- interface
-
- uses
- OOMainLoop, OOStaticEdit;
-
- type
- TalkObject = object
- us: DObject;
- procedure Create (id: integer);
- procedure Destroy; { to close the window, call this. It will get called if the user closes it }
- procedure TransmitKey (ch: char); { override this proc to handle sending characters down the line }
- procedure TransmitBlock (h: handle; len: longInt);
- procedure ReceiveKey (ch: char); { call this proc when you receive a key }
- end;
-
- implementation
-
- uses
- MyTypes, MyTEUtils, BaseGlobals, MyUtilities, PrefsGlobals;
-
- type
- TObject = object(DObject)
- te1, te2: TEStaticObject;
- t: TalkObject;
- reverse_panes: boolean;
- procedure Create (id: integer);
- override;
- procedure Destroy;
- override;
- procedure DoClose;
- override;
- procedure DoItemWhere (er: eventRecord; item: integer);
- override;
- procedure DoKey (modifiers: integer; ch: char; code: integer);
- override;
- procedure DoAutoKey (modifiers: integer; ch: char; code: integer);
- override;
- procedure DoIdle;
- override;
- procedure Resize;
- override;
- procedure DoActivateDeactivate (activate: boolean);
- override;
- function EditMenuEnabled: boolean;
- override;
- procedure SetEditMenuItem (item: integer);
- override;
- procedure DoEditMenu (item: integer);
- override;
- procedure CalculateRegion (var rgn: rgnHandle);
- override;
- procedure ReceiveKey (ch: char);
- function ActiveTE: TEStaticObject;
- end;
-
- procedure TalkObject.Create (id: integer);
- var
- tempus: TObject;
- begin
- new(tempus);
- us := tempus;
- us.Create(id);
- TObject(us).t := self;
- end;
-
- procedure TalkObject.Destroy;
- begin
- us.Destroy;
- dispose(self);
- end;
-
- procedure TalkObject.TransmitKey (ch: char); { override this proc to handle sending characters down the line }
- begin
- end;
-
- procedure TalkObject.TransmitBlock (h: handle; len: longInt); { override this proc to handle sending characters down the line }
- begin
- end;
-
- procedure TalkObject.ReceiveKey (ch: char); { call this proc when you receive a key }
- begin
- TObject(us).ReceiveKey(ch);
- end;
-
- function TObject.ActiveTE: TEStaticObject;
- begin
- if te1.te^^.selStart < te1.te^^.selEnd then
- ActiveTE := te1
- else if te2.te^^.selStart < te2.te^^.selEnd then
- ActiveTE := te2
- else
- ActiveTE := te1;
- end;
-
- function FindTEObject (dlg: dialogPtr; item: integer): TEStaticObject;
- var
- t: TObject;
- begin
- FindTEObject := nil;
- t := TObject(GetWObject(dlg));
- if t.te1 <> nil then
- if t.te1.titem = item then
- FindTEObject := t.te1;
- if t.te2 <> nil then
- if t.te2.titem = item then
- FindTEObject := t.te2;
- end;
-
- procedure DrawTEObject (dlg: dialogPtr; item: integer);
- var
- teo: TEStaticObject;
- begin
- FindTEObject(dlg, item).Draw;
- end;
-
- function TObject.EditMenuEnabled: boolean;
- var
- dummy: boolean;
- begin
- dummy := ActiveTE.EditMenuEnabled;
- if ActiveTE = te1 then
- TESetEditMenuItem(te1.te, false, 32000, EMpaste);
- EditMenuEnabled := GetMHandle(M_Edit)^^.enableFlags <> 0;
- end;
-
- procedure TObject.SetEditMenuItem (item: integer);
- begin
- if (item = EMpaste) and (ActiveTE = te1) then begin
- TESetEditMenuItem(te1.te, false, 32000, EMpaste);
- end
- else
- ActiveTE.SetEditMenuItem(item)
- end;
-
- procedure TObject.DoEditMenu (item: integer);
- var
- h: handle;
- len, i: longInt;
- oe: OSErr;
- begin
- if item = EMpaste then begin
- oe := TEFromScrap;
- len := TEGetScrapLen;
- if len > 2000 then begin
- len := 2000;
- TESetScrapLen(len);
- end;
- t.TransmitBlock(TEScrapHandle, len);
- TESetSelect(maxLongInt, maxLongInt, te1.te);
- TEPaste(te1.te);
- end
- else
- ActiveTE.DoEditMenu(item);
- end;
-
- procedure TObject.DoKey (modifiers: integer; ch: char; code: integer);
- procedure SendChar (ch: char);
- begin
- TESetSelect(maxlongint, maxlongint, te1.te);
- TEDeactivate(te2.te);
- if is_active then
- TEActivate(te1.te);
- te1.DoKey(modifiers, ch);
- t.TransmitKey(ch);
- end;
- var
- charpos: integer;
- begin
- with te1.te^^ do begin
- if BAND(modifiers, cmdKey) = 0 then begin
- case ch of
- enter, cr: begin
- ch := cr;
- end;
- del, bs: begin
- if prefs.no_return_delete & (teLength > 0) & (ptr(ord(hText^) + teLength - 1)^ = ord(cr)) then
- ch := nul
- else
- ch := bs;
- end;
- tab, spc: begin
- ch := spc;
- end;
- otherwise
- if ch < spc then
- ch := nul;
- end;
- charpos := 0;
- while (charpos < teLength) & (ptr(ord(hText^) + teLength - charpos - 1)^ <> ord(cr)) do
- charpos := charpos + 1;
- end;
- if ch <> nul then begin
- if (charpos > 70) & (ch = spc) then
- ch := cr;
- if prefs.no_return_delete & (charpos > 78) & (ch <> cr) & (ch <> bs) then
- SendChar(cr);
- SendChar(ch);
- end;
- end;
- end;
-
- procedure TObject.ReceiveKey (ch: char);
- begin
- case ch of
- enter, lf, cr:
- ch := cr;
- del, bs:
- ch := bs;
- tab:
- ch := spc;
- otherwise
- if ch < spc then
- ch := nul;
- end;
- if ch <> nul then begin
- TEDeactivate(te2.te);
- if is_active then
- TEActivate(te1.te);
- TESetSelect(maxlongint, maxlongint, te2.te);
- te2.DoKey(0, ch);
- end;
- end;
-
- procedure TObject.DoAutoKey (modifiers: integer; ch: char; code: integer);
- begin
- DoKey(modifiers, ch, code);
- end;
-
- procedure TObject.DoIdle;
- begin
- te1.DoIdle;
- end;
-
- procedure TObject.DoActivateDeactivate (activate: boolean);
- var
- teo: TEStaticObject;
- begin
- inherited DoActivateDeactivate(activate);
- if is_active then begin
- teo := ActiveTE;
- TEActivate(teo.te);
- end
- else begin
- TEDeactivate(te1.te);
- TEDeactivate(te2.te);
- end;
- end;
-
- procedure TObject.DoItemWhere (er: eventRecord; item: integer);
- var
- teo, teox: TEStaticObject;
- begin
- teo := FindTEObject(window, item);
- if teo = nil then
- DoItem(item)
- else begin
- if teo = te1 then
- teox := te2
- else
- teox := te1;
- TEAutoView(false, teox.te);
- TESetSelect(maxlongint, maxlongint, teox.te);
- TEDeactivate(teox.te);
- TEAutoView(true, teox.te);
- if is_active then
- TEActivate(teo.te);
- teo.DoItemWhere(er, item);
- if ActiveTE <> teo then begin
- TEDeactivate(teo.te);
- if is_active then
- TEActivate(teox.te);
- end;
- end;
- end;
-
- procedure TObject.Create (id: integer);
- var
- k: integer;
- h: handle;
- r: rect;
- tempte: TEStaticObject;
- lw: integer;
- begin
- inherited Create(id);
- reverse_panes := prefs.type_in_bottom_pane;
- draw_grow_icon := true;
- is_active := in_foreground;
- SetPort(window);
- TextFont(monaco);
- TextSize(9);
- new(tempte);
- te1 := tempte;
- lw := CharWidth('a') * 80;
- te1.Create(window, 1, lw, true, true, reverse_panes, reverse_panes);
- GetDItem(window, 1, k, h, r);
- SetDItem(window, 1, k, handle(@DrawTEObject), r);
- new(tempte);
- te2 := tempte;
- te2.Create(window, 2, lw, true, true, not reverse_panes, not reverse_panes);
- GetDItem(window, 2, k, h, r);
- SetDItem(window, 2, k, handle(@DrawTEObject), r);
- Resize;
- end;
-
- procedure TObject.Destroy;
- begin
- te1.Destroy;
- te2.Destroy;
- inherited Destroy;
- end;
-
- procedure TObject.DoClose;
- begin
- t.Destroy;
- end;
-
- procedure TObject.Resize;
- var
- k: integer;
- h: handle;
- r1, r2, r: rect;
- begin
- with window^.portrect do begin
- SetRect(r1, -1, -1, right + 1, bottom div 2);
- SetRect(r2, -1, bottom div 2, right + 1, bottom + 1);
- end;
- if reverse_panes then begin
- r := r1;
- r1 := r2;
- r2 := r;
- end;
- GetDItem(window, 1, k, h, r);
- SetDItem(window, 1, k, h, r1);
- te1.Resize;
- GetDItem(window, 2, k, h, r);
- SetDItem(window, 2, k, h, r2);
- te2.Resize;
- inherited Resize;
- end;
-
- procedure TObject.CalculateRegion (var rgn: rgnHandle);
- var
- pt: point;
- rgn2: rgnHandle;
- r: rect;
- begin
- SetPort(window);
- GetMouse(pt);
-
- rgn := NewRgn;
- r := te1.te^^.viewRect;
- RectRgn(rgn, r);
-
- rgn2 := NewRgn;
- r := te2.te^^.viewRect;
- RectRgn(rgn2, r);
-
- UnionRgn(rgn, rgn2, rgn);
- if PtInRgn(pt, rgn) then begin
- SetCursor(GetCursor(iBeamCursor)^^);
- end
- else begin
- SetCursor(arrow);
- SetRectRgn(rgn2, -30000, -30000, 30000, 30000);
- DiffRgn(rgn2, rgn, rgn);
- end;
- DisposeRgn(rgn2);
- end;
-
- end.