home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-04-20 | 13.6 KB | 573 lines | [TEXT/PJMM] |
- unit OOStatus;
-
- { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
-
- interface
-
- uses
- OOMainLoop;
-
- type
- requestDirection = (RD_incoming, RD_outgoing, RD_whatever);
- requestState = (RS_request, RS_connecting, RS_connected, RS_disconnected, RS_failed, RS_whatever);
- statusCommands = (SC_None, SC_Abort, SC_Connect, SC_BringToFront);
-
- procedure InitOOStatus (HandleStatusCommand: procPtr);
- { procedure HandleStatusCommand(data:longInt;sc:statusCommand;var s:string) }
- procedure FinishOOStatus;
- procedure SetEntry (data: univ longInt; rd: requestDirection; rs: requestState; title: str255);
- procedure RemoveEntry (data: univ longInt);
- procedure ShowStatus;
-
- implementation
-
- uses
- AppGlobals, MyTypes, MyUtils, MyFMenus, MyPreferences, PrefsGlobals, LDEFTypes, MyDialogs, TalkTos;
-
- type
- StatusObject = object(DObject)
- procedure Create (id: integer);
- override;
- procedure Destroy;
- override;
- procedure DoClose;
- override;
- procedure Resize;
- override;
- procedure DoItemWhere (er: eventRecord; item: integer);
- override;
- procedure DoKey (modifiers: integer; ch: char; code: integer);
- override;
- procedure DoActivateDeactivate (activate: boolean);
- override;
- end;
-
- const
- status_ldef = 128;
- but1_item = 1;
- but2_item = 2;
- but3_item = 3;
- outline_item = 4;
- line1_item = 5;
- line2_item = 6;
- list_item = 7;
-
- var
- status: StatusObject;
- dblclickproc: procPtr;
- thelist: listHandle;
- outlined_button: integer;
- cheat_v: integer;
-
- procedure SetShowStatus (themenu, theitem: integer);
- begin
- SetIDItemEnable(themenu, theitem, FrontWindow <> status.window);
- end;
-
- procedure ShowStatus;
- begin
- SelectWindow(status.window);
- ShowWindow(status.window);
- end;
-
- procedure InitOOStatus (HandleStatusCommand: procPtr);
- begin
- cheat_v := -1;
- outlined_button := 0;
- dblclickproc := HandleStatusCommand;
- SetFBoth(CStatus, @ShowStatus, @SetShowStatus);
- new(status);
- status.Create(status_dialog_id);
- end;
-
- procedure FinishOOStatus;
- begin
- status.Destroy;
- end;
-
- procedure StatusObject.DoClose;
- begin
- HideWindow(window);
- end;
-
- procedure DrawStatus (dp: dialogPtr; item: integer);
- var
- f: longInt;
- begin
- LUpdate(dp^.visRgn, thelist);
- DrawGrowIcon(dp);
- end;
-
- procedure DrawOutline (dp: dialogPtr; item: integer);
- var
- r: rect;
- fi: StatusObject;
- begin
- SetPort(dp);
- GetDItemRect(dp, outline_item, r);
- if (r.right <> 0) and (outlined_button <> 0) then begin
- fi := StatusObject(GetWObject(dp));
- PenSize(3, 3);
- if not ControlEnabled(dp, outlined_button) or not fi.is_active then begin
- PenPat(gray);
- FrameRoundRect(r, 16, 16);
- PenPat(black);
- end
- else
- FrameRoundRect(r, 16, 16);
- end;
- end;
-
- procedure StatusObject.DoActivateDeactivate (activate: boolean);
- begin
- inherited DoActivateDeactivate(activate);
- DrawOutline(window, outline_item);
- end;
-
- procedure SetOutline (item: integer);
- var
- r, r2: rect;
- begin
- SetPort(status.window);
- GetDItemRect(status.window, outline_item, r);
- EraseRect(r);
- if item = 0 then
- SetRect(r2, 0, 0, 0, 0)
- else begin
- GetDItemRect(status.window, item, r2);
- InsetRect(r2, -4, -4);
- end;
- SetDItemRect(status.window, outline_item, r2);
- DrawControls(status.window);
- outlined_button := item;
- DrawOutline(status.window, outline_item);
- end;
-
- procedure SetDControlRect (dp: dialogPtr; item: integer; r: rect);
- var
- kind: integer;
- h: handle;
- rr: rect;
- begin
- SetDItemRect(dp, item, r);
- GetDItem(dp, item, kind, h, rr);
- MoveControl(controlHandle(h), r.left, r.top);
- SizeControl(controlHandle(h), r.right - r.left, r.bottom - r.top);
- GetDItemRect(dp, item, rr);
- end;
-
- procedure StatusObject.Resize;
- var
- pr, b1, r: rect;
- dist: integer;
- begin
- pr := window^.portrect;
- GetDItemRect(window, but1_item, b1);
- dist := (pr.right - 16 - pr.left - 3 * (b1.right - b1.left)) div 4;
- b1.right := b1.right - b1.left + dist;
- b1.left := dist;
- SetDControlRect(window, but1_item, b1);
- growRect.left := 3 * (b1.right - b1.left) + 38;
- r := b1;
- r.right := pr.right - 16 - b1.left;
- r.left := pr.right - 16 - b1.right;
- SetDControlRect(window, but3_item, r);
- r.left := (r.left + b1.left) div 2;
- r.right := (r.right + b1.right) div 2;
- SetDControlRect(window, but2_item, r);
- GetDItemRect(window, line1_item, r);
- r.left := pr.left;
- r.right := pr.right;
- SetDControlRect(window, line1_item, r);
- growRect.top := r.bottom + 64;
- GetDItemRect(window, line2_item, r);
- r.left := pr.left;
- r.right := pr.right;
- SetDControlRect(window, line2_item, r);
- r.left := -1;
- r.right := pr.right + 1;
- r.top := r.top + 1;
- r.bottom := pr.bottom - 15;
- SetDItemRect(window, list_item, r);
- thelist^^.rView := r;
- LSize(r.right - r.left - 16, r.bottom - r.top, thelist);
- InvalRect(window^.portRect);
- SetOutline(outlined_button);
- inherited Resize;
- end;
-
- procedure DoSetButtons (i1: integer; b1: boolean; i2: integer; b2: boolean; i3: integer; b3: boolean; def: integer);
- procedure DSB (but, index: integer; on: boolean);
- var
- ch: ControlHandle;
- s1, s2: str255;
- hilite: integer;
- begin
- ch := GetDControlHandle(status.window, but);
- if index <> 0 then begin
- s1 := GetIndexedString(statusButtonsStrhID, index);
- GetCTitle(ch, s2);
- if s1 <> s2 then
- SetCTitle(ch, s1);
- end;
- hilite := 255 * ord(not on);
- if ch^^.contrlHilite <> hilite then
- HiliteControl(ch, 255 * ord(not on));
- end;
- begin
- DSB(but1_item, i1, b1);
- DSB(but2_item, i2, b2);
- DSB(but3_item, i3, b3);
- if def <> outlined_button then
- SetOutline(def);
- end;
-
- procedure SetNoButtons;
- begin
- DoSetButtons(statusAbortStrIndex, false, statusConnectStrIndex, false, statusToFrontStrIndex, false, 0);
- end;
-
- procedure SetSomeButtons (data: longInt; var celldata: cellRecord);
- var
- rs: requestState;
- out: boolean;
- begin
- out := requestDirection(celldata.sicn1index - 1) = RD_Outgoing;
- rs := requestState(celldata.sicn2index - 1);
- case rs of
- RS_request:
- DoSetButtons(statusAbortStrIndex, out, statusConnectStrIndex, not out, statusToFrontStrIndex, false, 2 - ord(out));
- RS_connecting:
- if out then
- DoSetButtons(statusAbortStrIndex, true, statusRingAgainStrIndex, true, statusToFrontStrIndex, false, 2)
- else
- DoSetButtons(statusAbortStrIndex, false, statusConnectStrIndex, false, statusToFrontStrIndex, false, 0);
- RS_connected:
- DoSetButtons(statusHangUpStrIndex, true, 0, false, statusToFrontStrIndex, true, 3);
- RS_disconnected:
- if data = 0 then
- DoSetButtons(statusRemoveStrIndex, true, statusConnectStrIndex, true, statusToFrontStrIndex, false, 2)
- else
- DoSetButtons(statusRemoveStrIndex, false, statusConnectStrIndex, false, statusToFrontStrIndex, true, 3);
- RS_failed:
- DoSetButtons(statusRemoveStrIndex, true, statusConnectStrIndex, true, statusToFrontStrIndex, false, 2);
- otherwise
- ;
- end;
- end;
-
- procedure GetLineInfo (v: integer; var data: longInt; var celldata: cellRecord);
- var
- c: cell;
- datalen: integer;
- begin
- c.v := v;
- c.h := 1;
- datalen := SizeOf(data);
- LGetCell(@data, datalen, c, thelist);
- if datalen = SizeOf(data) then begin
- c.h := 0;
- datalen := SizeOf(celldata);
- LGetCell(@celldata, datalen, c, thelist);
- end;
- end;
-
- procedure SetButtons;
- var
- c: cell;
- data: longInt;
- celldata: cellRecord;
- begin
- c.h := 0;
- c.v := 0;
- if LGetSelect(true, c, thelist) then begin
- GetLineInfo(c.v, data, celldata);
- SetSomeButtons(data, celldata);
- end
- else
- SetNoButtons;
- end;
-
- procedure StatusObject.Destroy;
- var
- h: handle;
- begin
- h := NewHandle(0);
- GetWindowPos(h);
- SetPrefsResource(savedWindowresType, resid, h);
-
- LDispose(thelist);
- end;
-
- procedure StatusObject.Create (id: integer);
- var
- k: integer;
- h: handle;
- r: rect;
- view, bounds: rect;
- cSize: point;
- wasvisible: boolean;
- resfile: integer;
- begin
- inherited Create(id);
- draw_grow_icon := true;
- SetPort(window);
- TextFont(geneva);
- GetDItem(window, list_item, k, h, r);
- SetDItem(window, list_item, k, handle(@DrawStatus), r);
- GetDItem(window, outline_item, k, h, r);
- SetDItem(window, outline_item, k, handle(@DrawOutline), r);
- SetRect(view, 0, 0, 10, 10); { irrelevent }
- SetRect(bounds, 0, 0, 2, 0);
- SetPt(cSize, 1000, 0);
- thelist := LNew(view, bounds, cSize, status_ldef, window, true, true, false, true);
- thelist^^.selFlags := lOnlyOne;
-
- SetButtons;
-
- resfile := GetPrefsResource(savedWindowResType, id, h);
- if h <> nil then
- SetWindowPos(h, wasvisible)
- else
- wasvisible := false;
-
- if resfile <> -1 then
- CloseResFile(resfile);
-
- Resize;
-
- if wasvisible then
- ShowWindow(window);
- end;
-
- procedure CallDoCommand (data: longInt; sc: statusCommands; var s: string; p: ptr);
- inline
- $205F, $4E90;
-
- procedure DoStatusCommand (v: integer; item: integer);
- var
- data: longInt;
- celldata: cellRecord;
- sc: statusCommands;
- begin
- sc := statusCommands(item);
- GetLineInfo(v, data, celldata);
- if data = 0 then begin
- if sc = SC_Connect then begin
- cheat_v := v;
- TalkTo(celldata.str2);
- end
- else begin
- LDelRow(1, v, thelist);
- if prefs.close_status then
- if thelist^^.databounds.bottom = 0 then
- status.DoClose;
- SetButtons;
- end;
- end
- else
- CallDoCommand(data, sc, celldata.str2, dblclickproc);
- end;
-
- procedure StatusObject.DoItemWhere (er: eventRecord; item: integer);
- var
- c: cell;
- data: longInt;
- datalen: integer;
- begin
- case item of
- list_item: begin
- SetPort(window);
- GlobalToLocal(er.where);
- if LClick(er.where, er.modifiers, thelist) then begin
- c := LLastClick(thelist);
- DoStatusCommand(c.v, outlined_button);
- end;
- SetButtons;
- end;
- but1_item, but2_item, but3_item: begin
- c.h := 0;
- c.v := 0;
- if LGetSelect(true, c, thelist) then
- DoStatusCommand(c.v, item);
- end;
- otherwise
- ;
- end;
- end;
-
- procedure SelectRow (v: integer);
- var
- c: cell;
- begin
- c.h := 0;
- c.v := 0;
- if LGetSelect(true, c, thelist) then
- LSetSelect(false, c, thelist);
- c.v := v;
- LSetSelect(true, c, thelist);
- SetButtons;
- end;
-
- procedure StatusObject.DoKey (modifiers: integer; ch: char; code: integer);
- var
- c: cell;
- data: longInt;
- datalen, v, vm: integer;
- didit: boolean;
- celldata: cellRecord;
- h: handle;
- wasvis: boolean;
- begin
- didit := false;
- c.h := 0;
- c.v := 0;
- if LGetSelect(true, c, thelist) then
- v := c.v
- else
- v := -1;
- vm := thelist^^.dataBounds.bottom;
- case ch of
- cr, enter: begin
- if outlined_button <> 0 then begin
- if c.v >= 0 then begin
- DoStatusCommand(v, outlined_button);
- didit := true;
- end;
- end;
- end;
- upArrow, downArrow: begin
- if vm > 0 then begin
- case 8 * ord(ch = upArrow) + 4 * ord(v = -1) + 2 * ord(v > 0) + ord(v < vm - 1) of
- 1, 3: { down, not last }
- v := v + 1;
- 10, 11: { up, not first }
- v := v - 1;
- 8, 9, 4, 5, 6, 7: { up&first OR down&no sel }
- v := 0;
- 0, 2, 12, 13, 14, 15: { down&last OR up&no sel }
- v := vm - 1;
- end;
- SelectRow(v);
- didit := true;
- end;
- end;
- 'a'..'z', 'A'..'Z': begin
- v := 0;
- while v < vm do begin
- GetLineInfo(v, data, celldata);
- if (length(celldata.str2) > 0) & (UpCase(celldata.str2[1]) = UpCase(ch)) then begin
- SelectRow(v);
- didit := true;
- leave;
- end;
- v := v + 1;
- end;
- end;
- otherwise
- ;
- end;
- if not didit then
- SysBeep(1);
- end;
-
- function FindData (data: longInt; var c: cell): boolean;
- var
- ldata: longInt;
- datalen: integer;
- begin
- FindData := false;
- c.h := 1;
- c.v := 0;
- while (c.v < thelist^^.dataBounds.bottom) do begin
- datalen := SizeOf(ldata);
- LGetCell(@ldata, datalen, c, thelist);
- if (datalen = 4) and (ldata = data) then begin
- FindData := true;
- leave;
- end;
- c.v := c.v + 1;
- end;
- end;
-
- procedure SetEntry (data: univ longInt; rd: requestDirection; rs: requestState; title: str255);
- var
- c, c2: cell;
- celldata: cellRecord;
- s: str255;
- secs: longInt;
- datalen: integer;
- begin
- if not FindData(data, c) then begin
- if cheat_v >= 0 then
- c.v := cheat_v
- else
- c.v := LAddRow(1, maxInt, thelist);
- c.h := 1;
- LSetCell(@data, SizeOf(data), c, thelist);
- celldata.sicn1id := 200;
- celldata.sicn1index := 1;
- celldata.sicn2id := 300;
- celldata.sicn2index := 1;
- GetDateTime(secs);
- IUTimeString(secs, false, s);
- celldata.str1 := s;
- celldata.str2 := title;
- end
- else begin
- datalen := SizeOf(celldata);
- c.h := 0;
- LGetCell(@celldata, datalen, c, thelist);
- end;
- cheat_v := -1;
- if rd <> RD_whatever then
- celldata.sicn1index := ord(rd) + 1;
- if rs <> RS_whatever then
- celldata.sicn2index := ord(rs) + 1;
- if title <> '' then
- celldata.str2 := title;
- c.h := 0;
- LSetCell(@celldata, SizeOf(celldata) - SizeOf(celldata.str2) + 1 + length(celldata.str2), c, thelist);
- c2.h := 0;
- c2.v := 0;
- if LGetSelect(true, c2, thelist) then begin
- if c2.v = c.v then
- SetButtons;
- end
- else begin
- LSetSelect(true, c, thelist);
- SetButtons;
- end;
- end;
-
- procedure RemoveEntry (data: univ longInt);
- var
- c, c2: cell;
- celldata: cellRecord;
- datalen: integer;
- begin
- if FindData(data, c) then begin
- c.h := 0;
- datalen := SizeOf(celldata);
- LGetCell(@celldata, datalen, c, thelist);
- case requestState(celldata.sicn2index - 1) of
- rs_request, rs_connecting:
- celldata.sicn2index := ord(rs_failed) + 1;
- rs_connected:
- celldata.sicn2index := ord(rs_disconnected) + 1;
- otherwise
- ;
- end;
- LSetCell(@celldata, datalen, c, thelist);
- c.h := 1;
- data := 0;
- LSetCell(@data, SizeOf(data), c, thelist);
- c2.h := 0;
- c2.v := 0;
- if LGetSelect(true, c2, thelist) then
- if c2.v = c.v then
- SetButtons;
- end;
- end;
-
- end.