lasarus_compotents/KASToolBar/kasprogressbar.pas

185 lines
4.7 KiB
ObjectPascal

{
Double Commander Components
-------------------------------------------------------------------------
Extended ProgressBar class
Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com)
Copyright (C) 2011-2012 Koblov Alexander (Alexx2000@mail.ru)
Windows 7 implementation based on "Windows 7 Component Library"
by Daniel Wischnewski (http://www.gumpi.com/blog)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
in a file called COPYING along with this program; if not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
02139, USA.
}
unit KASProgressBar;
{$mode objfpc}{$H+}
interface
uses
LCLType, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls
{$IFDEF LCLWIN32}
, InterfaceBase, ComObj, dwTaskbarList
{$ENDIF}
{$IFDEF LCLGTK2}
, Gtk2
{$ENDIF}
{$IFDEF LCLQT}
, qt4, qtwidgets
{$ENDIF}
;
type
{ TKASProgressBar }
TKASProgressBar = class(TProgressBar)
private
FShowInTaskbar: Boolean;
{$IFDEF LCLWIN32}
FTaskBarEntryHandle: HWND;
FTaskbarList: ITaskbarList;
FTaskbarList3: ITaskbarList3;
{$ENDIF}
protected
{$IFDEF LCLWIN32}
procedure InitializeWnd; override;
{$ENDIF}
procedure DoOnResize; override;
public
constructor Create(AOwner: TComponent); override;
procedure SetProgress(CurrentValue: Int64; MaxValue: Int64; BarText: String = '');
published
property ShowInTaskbar: Boolean read FShowInTaskbar write FShowInTaskbar default False;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('KASComponents',[TKASProgressBar]);
end;
{ TKASProgressBar }
{$IFDEF LCLWIN32}
procedure TKASProgressBar.InitializeWnd;
var
aOwnerForm: TWinControl;
begin
inherited InitializeWnd;
if CheckWin32Version(6, 1) then
begin
aOwnerForm:= GetParentForm(Self);
if Assigned(aOwnerForm) and (aOwnerForm <> Application.MainForm) then
FTaskBarEntryHandle := aOwnerForm.Handle
else
FTaskBarEntryHandle := Widgetset.AppHandle;
end;
end;
{$ENDIF}
procedure TKASProgressBar.DoOnResize;
begin
inherited;
Max := Width;
end;
constructor TKASProgressBar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{$IFDEF LCLWIN32}
FTaskbarList3 := nil;
FTaskBarEntryHandle := INVALID_HANDLE_VALUE;
// Works only under Windows 7 and higher
if CheckWin32Version(6, 1) then
try
FTaskbarList := ITaskbarList(CreateComObject(CLSID_TaskbarList));
FTaskbarList.HrInit;
FTaskbarList.QueryInterface(CLSID_TaskbarList3, FTaskbarList3);
except
FTaskbarList3 := nil;
end;
{$ENDIF}
{$IFDEF LCLGTK2}
// Have to disable LCLGTK2 default progress bar text
// set in TGtk2WSProgressBar.UpdateProgressBarText.
BarShowText := False;
{$ENDIF}
end;
procedure TKASProgressBar.SetProgress(CurrentValue: Int64; MaxValue: Int64;
BarText: String);
{$IFDEF LCLGTK2}
var
wText: String;
{$ENDIF}
{$IFDEF LCLQT}
var
wText: WideString;
{$ENDIF}
begin
if MaxValue <> 0 then
Position := Round(CurrentValue * Max / MaxValue)
else
Position := 0;
{$IFDEF LCLWIN32}
if FShowInTaskbar and (FTaskBarEntryHandle <> INVALID_HANDLE_VALUE) and Assigned(FTaskbarList3) then
begin
FTaskbarList3.SetProgressValue(FTaskBarEntryHandle, Position, Max);
end;
{$ENDIF}
{$IFDEF LCLGTK2}
{
%v - the current progress value.
%l - the lower bound for the progress value.
%u - the upper bound for the progress value.
%p - the current progress percentage.
}
if BarText <> '' then
wText := BarText + ' (%p%%)'
else
wText := '%p%%';
gtk_progress_set_format_string(PGtkProgress(Self.Handle), PChar(wText));
// Have to reset 'show_text' every time because LCLGTK2 will set it according to BarShowText.
gtk_progress_set_show_text(PGtkProgress(Self.Handle), True);
{$ENDIF}
{$IFDEF LCLQT}
{
%p - is replaced by the percentage completed.
%v - is replaced by the current value.
%m - is replaced by the total number of steps.
}
if BarText <> '' then
wText := WideString(BarText) + ' (%p%)'
else
wText := '%p%';
QProgressBar_setFormat(QProgressBarH(TQtProgressBar(Self.Handle).Widget), @wText);
//QProgressBar_setTextVisible(QProgressBarH(TQtProgressBar(Self.Handle).Widget), True);
{$ENDIF}
end;
end.