|  | (* | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements. See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership. The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License. You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied. See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | *) | 
|  |  | 
|  | unit ConsoleHelper; | 
|  |  | 
|  | interface | 
|  |  | 
|  | uses Classes, SysUtils, SyncObjs; | 
|  |  | 
|  | type | 
|  | TThriftConsole = class | 
|  | strict private | 
|  | FLock : TCriticalSection; | 
|  | strict protected | 
|  | procedure Lock; | 
|  | procedure UnLock; | 
|  | public | 
|  | constructor Create; | 
|  | destructor Destroy; override; | 
|  |  | 
|  | procedure Write( const S: string); virtual; | 
|  | procedure WriteLine( const S: string); virtual; | 
|  | end; | 
|  |  | 
|  |  | 
|  | TGUIConsole = class( TThriftConsole ) | 
|  | strict private | 
|  | FLineBreak : Boolean; | 
|  | FMemo : TStrings; | 
|  |  | 
|  | procedure InternalWrite( const S: string; bWriteLine: Boolean); | 
|  | public | 
|  | constructor Create( AMemo: TStrings); | 
|  |  | 
|  | procedure Write( const S: string); override; | 
|  | procedure WriteLine( const S: string); override; | 
|  | end; | 
|  |  | 
|  |  | 
|  | function Console: TThriftConsole; | 
|  | procedure ChangeConsole( AConsole: TThriftConsole ); | 
|  | procedure RestoreConsoleToDefault; | 
|  |  | 
|  |  | 
|  | implementation | 
|  |  | 
|  | var | 
|  | FDefaultConsole : TThriftConsole; | 
|  | FConsole : TThriftConsole; | 
|  |  | 
|  | function Console: TThriftConsole; | 
|  | begin | 
|  | Result := FConsole; | 
|  | end; | 
|  |  | 
|  | { TThriftConsole } | 
|  |  | 
|  | constructor TThriftConsole.Create; | 
|  | begin | 
|  | inherited Create; | 
|  | FLock := TCriticalSection.Create; | 
|  | end; | 
|  |  | 
|  | destructor TThriftConsole.Destroy; | 
|  | begin | 
|  | FreeAndNil( FLock); | 
|  | inherited Destroy; | 
|  | end; | 
|  |  | 
|  | procedure TThriftConsole.Lock; | 
|  | begin | 
|  | FLock.Enter; | 
|  | end; | 
|  |  | 
|  | procedure TThriftConsole.UnLock; | 
|  | begin | 
|  | FLock.Leave; | 
|  | end; | 
|  |  | 
|  | procedure TThriftConsole.Write(const S: string); | 
|  | begin | 
|  | Lock; | 
|  | try | 
|  | System.Write( S ); | 
|  | finally | 
|  | Unlock; | 
|  | end; | 
|  | end; | 
|  |  | 
|  | procedure TThriftConsole.WriteLine(const S: string); | 
|  | begin | 
|  | Lock; | 
|  | try | 
|  | System.Writeln( S ); | 
|  | finally | 
|  | Unlock; | 
|  | end; | 
|  | end; | 
|  |  | 
|  | procedure ChangeConsole( AConsole: TThriftConsole ); | 
|  | begin | 
|  | FConsole := AConsole; | 
|  | end; | 
|  |  | 
|  | procedure RestoreConsoleToDefault; | 
|  | begin | 
|  | FConsole := FDefaultConsole; | 
|  | end; | 
|  |  | 
|  | { TGUIConsole } | 
|  |  | 
|  | constructor TGUIConsole.Create( AMemo: TStrings); | 
|  | begin | 
|  | inherited Create; | 
|  | FMemo := AMemo; | 
|  | FLineBreak := True; | 
|  | end; | 
|  |  | 
|  | procedure TGUIConsole.InternalWrite(const S: string; bWriteLine: Boolean); | 
|  | var idx : Integer; | 
|  | begin | 
|  | Lock; | 
|  | try | 
|  |  | 
|  | if FLineBreak then begin | 
|  | FMemo.Add( S ) | 
|  | end | 
|  | else begin | 
|  | idx := FMemo.Count - 1; | 
|  | if idx < 0 | 
|  | then FMemo.Add( S ) | 
|  | else FMemo[idx] := FMemo[idx] + S; | 
|  | end; | 
|  | FLineBreak := bWriteLine; | 
|  |  | 
|  | finally | 
|  | Unlock; | 
|  | end; | 
|  | end; | 
|  |  | 
|  | procedure TGUIConsole.Write(const S: string); | 
|  | begin | 
|  | InternalWrite( S, False); | 
|  | end; | 
|  |  | 
|  | procedure TGUIConsole.WriteLine(const S: string); | 
|  | begin | 
|  | InternalWrite( S, True); | 
|  | end; | 
|  |  | 
|  | initialization | 
|  | FDefaultConsole := TThriftConsole.Create; | 
|  | FConsole := FDefaultConsole; | 
|  |  | 
|  | finalization | 
|  | FDefaultConsole.Free; | 
|  | FDefaultConsole := nil; | 
|  |  | 
|  | end. | 
|  |  | 
|  |  |