185 lines
4.7 KiB
ObjectPascal
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.
|