grendel-1.0.0a7/backup/
grendel-1.0.0a7/bin/
grendel-1.0.0a7/boards/
grendel-1.0.0a7/clans/
grendel-1.0.0a7/documentation/todo/
grendel-1.0.0a7/help/
grendel-1.0.0a7/logs/
grendel-1.0.0a7/players/
grendel-1.0.0a7/progs/
grendel-1.0.0a7/races/
grendel-1.0.0a7/src/contrib/
grendel-1.0.0a7/src/modules/speller/
grendel-1.0.0a7/src/modules/status/
grendel-1.0.0a7/src/tests/
grendel-1.0.0a7/src/tests/dunit/
{
	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.