{ Summary: Module that hooks into systray.pas and displays console form on desktop ## $Id: status_console.pas,v 1.12 2004/04/14 21:33:02 druid Exp $ } unit status_console; interface implementation uses StdCtrls, ExtCtrls, Graphics, Forms, DateUtils, Classes, Windows, SysUtils, SyncObjs, console, modules, constants, systray; type GConsoleWindowWriter = class(GConsoleWriter) public procedure write(timestamp : integer; const text : string; debugLevel : integer = 0); override; end; GConsoleModule = class(TInterfacedObject, IModuleInterface) private consoleMemo : TMemo; consoleFont : TFont; consoleTimer : TTimer; consoleDriver : GConsoleWindowWriter; procedure handleOnTimer(Sender : TObject); public procedure registerModule(); procedure unregisterModule(); end; var consoleQueue : TStringList; consoleForm : TForm; cs : TCriticalSection; procedure showConsoleProc(id : integer); begin consoleForm.Show(); end; function returnModuleInterface() : IModuleInterface; begin Result := GConsoleModule.Create(); end; procedure GConsoleWindowWriter.write(timestamp : integer; const text : string; debugLevel : integer = 0); begin cs.Acquire(); consoleQueue.add('[' + FormatDateTime('hh:nn:ss', UnixToDateTime(timestamp)) + '] ' + text); cs.Release(); end; procedure GConsoleModule.handleOnTimer(Sender: TObject); var idx : integer; begin cs.Acquire(); for idx := 0 to consoleQueue.Count - 1 do begin consoleMemo.Lines.Add(consoleQueue[idx]); end; Application.ProcessMessages(); consoleQueue.Clear(); cs.Release(); end; procedure GConsoleModule.registerModule(); var console : GConsole; begin cs := TCriticalSection.Create(); initSysTray(); registerSysTray(); Application.Title := 'Grendel ' + version_number; consoleForm := TForm.Create(nil); consoleForm.Caption := version_info + ': Server console'; consoleForm.Position := poScreenCenter; consoleForm.BorderStyle := bsSingle; consoleForm.BorderIcons := [biSystemMenu]; consoleForm.Width := 600; consoleForm.Height := 400; consoleFont := TFont.Create(); consoleFont.Name := 'Courier'; consoleFont.Size := 10; consoleMemo := TMemo.Create(consoleForm); consoleMemo.Parent := consoleForm; consoleMemo.Width := consoleForm.ClientWidth; consoleMemo.Height := consoleForm.ClientHeight; consoleMemo.ScrollBars := ssVertical; consoleMemo.ReadOnly := True; consoleMemo.WordWrap := false; consoleMemo.Font := consoleFont; consoleTimer := TTimer.Create(consoleForm); consoleTimer.Interval := 250; consoleTimer.OnTimer := handleOnTimer; consoleQueue := TStringList.Create(); consoleQueue.Duplicates := dupAccept; consoleQueue.Sorted := false; consoleDriver := GConsoleWindowWriter.Create(); registerMenuItem('Show console', showConsoleProc); console := GConsole.Create(); console.fetchHistory(consoleDriver); console.attachWriter(consoleDriver); console.Free(); end; procedure GConsoleModule.unregisterModule(); var console : GConsole; begin consoleTimer.Enabled := false; console := GConsole.Create(); console.detachWriter(consoleDriver); console.Free(); consoleForm.Release(); unregisterMenuItem('Show console'); consoleDriver.Free(); consoleQueue.Free(); cs.Free(); unregisterSysTray(); cleanupSysTray(); end; exports returnModuleInterface; end.