Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1077 → Rev 1078

/Delphi/akMediaAdmin/Source/MainUnit.pas
0,0 → 1,353
// akMediaAdmin v. 1.1
// Copyright (c) 1999-2000 Anatoli Klassen
 
// Main Unit
unit MainUnit;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, ImgList, ToolWin, MPlayer, ShellAPI, LoadUnit;
 
type
TMainForm = class(TForm)
FilesBox: TListBox;
StatusBar: TStatusBar;
ToolBar: TToolBar;
AddButton: TToolButton;
ToolHotImages: TImageList;
AboutButton: TToolButton;
ToolImages: TImageList;
ToolDisabledImages: TImageList;
ToolSeparator1: TToolButton;
MPlayer: TMediaPlayer;
OpenDialog: TOpenDialog;
PlayBar: TProgressBar;
ToolSeparator2: TToolButton;
PlayButton: TToolButton;
StopButton: TToolButton;
ToolSeparator3: TToolButton;
PlayTimer: TTimer;
ClearButton: TToolButton;
HelpButton: TToolButton;
procedure FilesBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure AddButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FilesBoxClick(Sender: TObject);
procedure FilesBoxKeyPress(Sender: TObject; var Key: Char);
procedure AboutButtonClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure PlayButtonClick(Sender: TObject);
procedure StopButtonClick(Sender: TObject);
procedure PlayTimerTimer(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FilesBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure HelpButtonClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure PlayBarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
function CalcTimes : longint;
procedure CalcSelectedTimes;
procedure Load(Files : TStrings);
procedure ClearList;
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
procedure PlayerStart;
procedure PlayerStop;
procedure UpdatePlayerState;
public
end;
 
var
MainForm: TMainForm;
 
implementation
 
uses AboutUnit, UtilsUnit, FileCtrl, WaitUnit;
 
{$R *.DFM}
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.HelpFile :=
AddSlash(ExtractFileDir(Application.ExeName)) + 'akmadmin.hlp';
DragAcceptFiles(Handle, True);
UpdatePlayerState;
end;
 
procedure TMainForm.FormShow(Sender: TObject);
var
i : longint;
S : TStringList;
 
begin
// load files from command line
S := TStringList.Create;
for i := 1 to ParamCount do
S.Add(ParamStr(i));
Load(S);
S.Free;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
ClearList;
end;
 
procedure TMainForm.AddButtonClick(Sender: TObject);
begin
if OpenDialog.Execute then
Load(OpenDialog.Files);
end;
 
procedure TMainForm.HelpButtonClick(Sender: TObject);
begin
Application.HelpJump('main');
end;
 
procedure TMainForm.AboutButtonClick(Sender: TObject);
begin
AboutBox.ShowModal;
end;
 
procedure TMainForm.FilesBoxClick(Sender: TObject);
begin
CalcSelectedTimes;
UpdatePlayerState;
end;
 
procedure TMainForm.FilesBoxKeyPress(Sender: TObject; var Key: Char);
begin
CalcSelectedTimes;
UpdatePlayerState;
end;
 
procedure TMainForm.PlayButtonClick(Sender: TObject);
begin
PlayerStart;
end;
 
procedure TMainForm.StopButtonClick(Sender: TObject);
begin
PlayerStop;
end;
 
procedure TMainForm.ClearButtonClick(Sender: TObject);
begin
ClearList;
StatusBar.Panels[1].Text := 'Total: 0; time: ' + ShowTime(0);
UpdatePlayerState;
ClearButton.Enabled := False;
end;
 
procedure TMainForm.FilesBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
R : TRect;
FI : TFileInfo;
 
begin
with FilesBox.Canvas do begin
FI := TFileInfo(FilesBox.Items.Objects[Index]);
TextRect(Rect, Rect.Left, Rect.Top, FI.Name);
R := Rect;
R.Left := R.Right - TextWidth(FI.TimeString) - 2;
TextRect(R, R.Left, R.Top, FI.TimeString);
end;
end;
 
procedure TMainForm.FilesBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then begin // if 'delete' key was pressed
// delete corresponded TFileInfo for current item
if FilesBox.Items.Objects[FilesBox.ItemIndex] <> nil then
FilesBox.Items.Objects[FilesBox.ItemIndex].Free;
FilesBox.Items.Objects[FilesBox.ItemIndex] := nil;
FilesBox.Items.Delete(FilesBox.ItemIndex);
 
StatusBar.Panels[1].Text := 'Total: ' + IntToStr(FilesBox.Items.Count)
+ '; time: ' + ShowTime(CalcTimes);
ClearButton.Enabled := (FilesBox.Items.Count > 0);
UpdatePlayerState;
end;
end;
 
function TMainForm.CalcTimes : longint;
var
i : longint;
 
begin
Result := 0;
for i := 0 to FilesBox.Items.Count - 1 do
Result := Result + TFileInfo(FilesBox.Items.Objects[i]).Time;
end;
 
procedure TMainForm.CalcSelectedTimes;
var
i, t : longint;
 
begin
t := 0;
for i := 0 to FilesBox.Items.Count - 1 do
if FilesBox.Selected[i] then begin
t := t + TFileInfo(FilesBox.Items.Objects[i]).Time;
end;
StatusBar.Panels[0].Text := 'Selected: ' + IntToStr(FilesBox.SelCount)
+ '; time: ' + ShowTime(t);
end;
 
// Handle Windows message for drop files
procedure TMainForm.WMDropFiles;
var
FileName : array[0 .. 256] of Char;
Count, i : integer;
S : TStringList;
 
begin
Count := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 0);
 
S := TStringList.Create;
for i := 0 to Count-1 do begin
DragQueryFile(Msg.WParam, i, FileName, SizeOf(FileName));
S.Add(String(FileName));
end;
Load(S);
S.Free;
 
DragFinish(Msg.WParam);
end;
 
procedure TMainForm.FormResize(Sender: TObject);
begin
FilesBox.Repaint; // the TListBox does not repaint itself correctly
StatusBar.Panels[0].Width := StatusBar.Width div 2;
end;
 
procedure TMainForm.PlayerStart;
begin
if MPlayer.FileName <> '' then begin
MPlayer.Play;
PlayTimer.Enabled := True;
PlayButton.Enabled := False;
StopButton.Enabled := True;
end
else begin
PlayButton.Enabled := False;
StopButton.Enabled := False;
end;
end;
 
procedure TMainForm.PlayerStop;
begin
PlayTimer.Enabled := False;
if MPlayer.FileName <> '' then begin
MPlayer.Stop;
PlayButton.Enabled := True;
StopButton.Enabled := False;
end
else begin
PlayButton.Enabled := False;
StopButton.Enabled := False;
end;
end;
 
procedure TMainForm.UpdatePlayerState;
begin
MPlayer.Close;
PlayBar.Position := 0;
PlayTimer.Enabled := False;
PlayButton.Enabled := False;
StopButton.Enabled := False;
 
if (FilesBox.ItemIndex < 0) or (FilesBox.Items.Count = 0) then
MPlayer.FileName := ''
else begin
if FileExists(TFileInfo(FilesBox.Items.Objects[FilesBox.ItemIndex]).FileName)
then
try
MPlayer.FileName :=
TFileInfo(FilesBox.Items.Objects[FilesBox.ItemIndex]).FileName;
 
// find correct type of the file with 'cut and try' method
MPlayer.DeviceType := dtAutoSelect;
repeat
try
MPlayer.Open;
PlayBar.Max := MPlayer.Length;
PlayTimer.Enabled := True;
PlayButton.Enabled := True;
Break;
except
if MPlayer.DeviceType < dtWaveAudio then
MPlayer.DeviceType := Succ(MPlayer.DeviceType)
else
Break;
end;
until False;
except
end
else begin
PlayBar.Max := 100;
end;
end;
end;
 
procedure TMainForm.PlayTimerTimer(Sender: TObject);
begin
PlayBar.Position := MPlayer.Position;
if MPlayer.Mode = mpStopped then begin
PlayerStop;
MPlayer.Position := 0;
end;
end;
 
procedure TMainForm.ClearList;
var
i : longint;
 
begin
// delete corresponded TFileInfo's for all items
for i := 0 to FilesBox.Items.Count - 1 do begin
if FilesBox.Items.Objects[i] <> nil then
FilesBox.Items.Objects[i].Free;
FilesBox.Items.Objects[i] := nil;
end;
 
FilesBox.Items.Clear;
end;
 
procedure TMainForm.Load(Files : TStrings);
var
Result : TStrings;
 
begin
if Files.Count = 0 then Exit;
 
Result := WaitForm.Execute(Files);
FilesBox.Items.BeginUpdate;
FilesBox.Items.AddStrings(Result);
FilesBox.Items.EndUpdate;
Result.Free;
 
StatusBar.Panels[1].Text := 'Total: ' + IntToStr(FilesBox.Items.Count)
+ '; time: ' + ShowTime(CalcTimes);
ClearButton.Enabled := (FilesBox.Items.Count > 0);
UpdatePlayerState;
end;
 
procedure TMainForm.PlayBarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if MPlayer.Mode <> mpPlaying then Exit;
PlayTimer.Enabled := False;
MPlayer.Position := Trunc(X/PlayBar.Width*PlayBar.Max);
MPlayer.Play;
PlayTimer.Enabled := True;
end;
 
end.