lazarus/components/printers/unix/udlgprintersjobs.pp
2012-04-09 08:24:59 +00:00

247 lines
7.2 KiB
ObjectPascal

{
udlgPrintersJobs.pp
------------
*****************************************************************************
* *
* This file is part of the Lazarus Component Library (LCL) *
* *
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
* for details about the copyright. *
* *
* 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. *
* *
*****************************************************************************
Author : Olivier Guilbaud (OG)
Abstract:
Printer jobs dialog.
This dialog provide an user interface for view or modify an printer
job
Credit
few images : http://jimmac.musichall.cz/
history
fev 27 2004 OG - Creation
mar 05 2004 OG - Test and design
mar 08 2004 OG - Hold, Restart or cancel job
mar 16 2004 OG - Delete ShowMessage() of debug
Oct 06 2004 OG - Modified for use new Printers.pas
}
unit udlgPrintersJobs;
{$mode objfpc}{$H+}
{$DEFINE DYNLINK}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Printers,cupsPrinters,Buttons,ComCtrls,StdCtrls,
{$IFNDEF DYNLINK}
Cups, cups_ipp,
{$ELSE}
CUPSDyn,
{$ENDIF}
{$IFDEF darwin}
miniCupsLibc,
{$ELSE}
Libc,
{$ENDIF}
;
Const
cStateJob : Array[IPP_JOB_PENDING..IPP_JOB_COMPLETED] of string =('Pending ...',
'Held',
'Processing ...',
'Stopped',
'Canceled',
'Aborded',
'Completed');
type
TdlgPrintersJobs = class(TForm)
cbPrinters: TComboBox;
lstImg: TImageList;
lvJobs: TListView;
Panel1: TPanel;
btnMyJobOnly: TSpeedButton;
btnJobCompleted: TSpeedButton;
btnRefesh: TSpeedButton;
btnStopJob: TSpeedButton;
btnRestartJob: TSpeedButton;
btnDeleteJob: TSpeedButton;
procedure btnDeleteJobClick(Sender: TObject);
procedure btnRefeshClick(Sender: TObject);
procedure btnRestartJobClick(Sender: TObject);
procedure btnStopJobClick(Sender: TObject);
private
{ private declarations }
function TimeToDatetimeStr(atime : time_t) : string;
public
{ public declarations }
constructor Create(aOwner : TComponent); override;
end;
var
dlgPrintersJobs: TdlgPrintersJobs;
implementation
{ TdlgPrintersJobs }
constructor TdlgPrintersJobs.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
cbPrinters.Items.Add('All');
cbPrinters.Items.AddStrings(Printer.Printers);
cbPrinters.ItemIndex:=0;
cbPrinters.OnChange:=@btnRefeshClick;
lstImg.AddLazarusResource('pending');
lstImg.AddLazarusResource('helded');
lstImg.AddLazarusResource('process');
end;
//Refresh all jobs for defined printers
procedure TdlgPrintersJobs.btnRefeshClick(Sender: TObject);
Var Jobs : Pcups_job_t;
Job : Pcups_job_t;
NumJobs,i : Integer;
k,aId : longint;
JobCompleted : Byte;
myJobOnly : Byte;
C : TListColumn;
Li,Ls : TListItem;
aPrinterName : PChar;
begin
Jobs:=nil;
if Sender=btnJobCompleted then
btnJobCompleted.Tag:=Byte(not btnJobCompleted.Down);
if Sender=btnMyJobOnly then
btnMyJobOnly.Tag:=Byte(not btnMyJobOnly.Tag);
//List only or nor the job of current user
myJobOnly:=btnMyJobOnly.Tag;
//Job all job completed Yes/No
JobCompleted:=btnJobCompleted.Tag;
//Printer name
aPrinterName:=nil; //All defined printers
if cbPrinters.ItemIndex>0 then
aPrinterName:=PChar(cbPrinters.Text);
//Save the selected job if exists (must be before cupsGetJobs())
if Assigned(lvJobs.selected) then
aId:=Pcups_job_t(lvJobs.Selected.Data)^.Id
else
aId:=-1;
//Enums all jobs
NumJobs:=cupsGetJobs(@Jobs,aPrinterName,myJobOnly,JobCompleted);
LvJobs.BeginUpdate;
try
lvJobs.Items.Clear;
Ls:=nil;
if Assigned(Jobs) then
begin
//Datas rows
for i:=0 to NumJobs-1 do
begin
Job:=@Jobs[i];
DateSeparator:='/';
Li:=LvJobs.Items.Add;
Li.Caption:=IntToStr(Job^.id);
Li.ImageIndex:=Ord(Job^.state)-Ord(IPP_JOB_PENDING);
Li.Data:=Job;
if not Assigned(Ls) or (Job^.id=aId) then
Ls:=Li;
Li.SubItems.Add(Job^.dest);
Li.SubItems.Add(Job^.Title);
Li.SubItems.Add(Job^.User);
Li.SubItems.Add(Job^.Format);
Li.SubItems.Add(cStateJob[Job^.state]);
Li.SubItems.Add(IntToStr(Job^.Size));
Li.SubItems.Add(IntToStr(Job^.priority));
Li.SubItems.Add(TimeToDatetimeStr(Job^.creation_time));
Li.SubItems.Add(TimeToDatetimeStr(Job^.processing_time));
Li.SubItems.Add(TimeToDatetimeStr(Job^.completed_time));
end;
cupsFreeJobs(NumJobs,Jobs);
end;
finally
LvJobs.EndUpdate;
LvJobs.Selected:=Ls;
end;
end;
//Restart an holded job
procedure TdlgPrintersJobs.btnRestartJobClick(Sender: TObject);
Var Job : Pcups_job_t;
begin
if (lvJobs.Items.Count>0) and Assigned(lvJobs.Selected) then
begin
Job:=Pcups_job_t(lvJobs.Selected.Data);
if (Job^.state=IPP_JOB_HELD) then
TCUPSPrinter(Printer).SetJobState(Job^.id,IPP_RELEASE_JOB);
btnRefeshClick(nil);
end;
end;
//Stop an active job
procedure TdlgPrintersJobs.btnStopJobClick(Sender: TObject);
Var Job : Pcups_job_t;
begin
if (lvJobs.Items.Count>0) and Assigned(lvJobs.Selected) then
begin
Job:=Pcups_job_t(lvJobs.Selected.Data);
if (Job^.state<IPP_JOB_STOPPED) and (Job^.state<>IPP_JOB_HELD) then
TCUPSPrinter(Printer).SetJobState(Job^.id,IPP_HOLD_JOB);
btnRefeshClick(nil);
end;
end;
//Delete the selected job
procedure TdlgPrintersJobs.btnDeleteJobClick(Sender: TObject);
Var Job : Pcups_job_t;
begin
if (lvJobs.Items.Count>0) and Assigned(lvJobs.Selected) then
begin
Job:=Pcups_job_t(lvJobs.Selected.Data);
cupsCancelJob(Job^.dest,Job^.id);
btnRefeshClick(nil);
end;
end;
//Return an String date and time with an GMT Time
function TdlgPrintersJobs.TimeToDatetimeStr(atime: time_t): string;
var lTime : PTm;
Dt : TDateTime;
begin
lTime:=LocalTime(aTime);
Result:='';
if Assigned(lTime) then
begin
Try
if lTime^.tm_year=70 then Exit;
Dt:=EncodeDate(lTime^.tm_year+1900,lTime^.tm_mon+1,lTime^.tm_mday)+
EncodeTime(lTime^.tm_hour,lTime^.tm_min,lTime^.tm_sec,0);
Result:=DateTimeToStr(Dt);
Except
end;
end;
end;
initialization
{$I udlgprintersjobs.lrs}
{$I jobsimglist.lrs}
end.