You've already forked lazarus-ccr
jvcllaz: Add missing JvId3v2*Form.* files
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6319 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
79
components/jvcllaz/design/JvMM/JvId3v2DefineForm.lfm
Normal file
79
components/jvcllaz/design/JvMM/JvId3v2DefineForm.lfm
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
object JvID3DefineDlg: TJvID3DefineDlg
|
||||||
|
Left = 382
|
||||||
|
Height = 88
|
||||||
|
Top = 194
|
||||||
|
Width = 295
|
||||||
|
BorderStyle = bsDialog
|
||||||
|
Caption = 'JvID3DefineDlg'
|
||||||
|
ClientHeight = 88
|
||||||
|
ClientWidth = 295
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Color = clWindowText
|
||||||
|
OnShow = FormShow
|
||||||
|
Position = poScreenCenter
|
||||||
|
LCLVersion = '1.9.0.0'
|
||||||
|
object lblFrames: TLabel
|
||||||
|
AnchorSideLeft.Control = Owner
|
||||||
|
AnchorSideTop.Control = Owner
|
||||||
|
Left = 8
|
||||||
|
Height = 15
|
||||||
|
Top = 8
|
||||||
|
Width = 63
|
||||||
|
BorderSpacing.Left = 8
|
||||||
|
BorderSpacing.Top = 8
|
||||||
|
Caption = 'Frame Kind:'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object cmbFrames: TComboBox
|
||||||
|
AnchorSideLeft.Control = lblFrames
|
||||||
|
AnchorSideTop.Control = lblFrames
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 8
|
||||||
|
Height = 23
|
||||||
|
Top = 27
|
||||||
|
Width = 280
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
BorderSpacing.Right = 8
|
||||||
|
Constraints.MinWidth = 280
|
||||||
|
DropDownCount = 24
|
||||||
|
ItemHeight = 15
|
||||||
|
Sorted = True
|
||||||
|
Style = csDropDownList
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object OkBtn: TButton
|
||||||
|
AnchorSideTop.Control = CancelBtn
|
||||||
|
AnchorSideRight.Control = CancelBtn
|
||||||
|
Left = 134
|
||||||
|
Height = 25
|
||||||
|
Top = 58
|
||||||
|
Width = 75
|
||||||
|
Anchors = [akTop, akRight]
|
||||||
|
BorderSpacing.Right = 4
|
||||||
|
Caption = 'OK'
|
||||||
|
Default = True
|
||||||
|
ModalResult = 1
|
||||||
|
OnClick = OkBtnClick
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
object CancelBtn: TButton
|
||||||
|
AnchorSideTop.Control = cmbFrames
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = cmbFrames
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 213
|
||||||
|
Height = 25
|
||||||
|
Top = 58
|
||||||
|
Width = 75
|
||||||
|
Anchors = [akTop, akRight]
|
||||||
|
BorderSpacing.Top = 8
|
||||||
|
BorderSpacing.Bottom = 8
|
||||||
|
Cancel = True
|
||||||
|
Caption = 'Cancel'
|
||||||
|
ModalResult = 2
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
|
end
|
141
components/jvcllaz/design/JvMM/JvId3v2DefineForm.pas
Normal file
141
components/jvcllaz/design/JvMM/JvId3v2DefineForm.pas
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
{-----------------------------------------------------------------------------
|
||||||
|
The contents of this file are subject to the Mozilla Public License
|
||||||
|
Version 1.1 (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.mozilla.org/MPL/MPL-1.1.html
|
||||||
|
|
||||||
|
Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
||||||
|
the specific language governing rights and limitations under the License.
|
||||||
|
|
||||||
|
The Original Code is: JvID3v2Define.PAS, released on 2003-04-16.
|
||||||
|
|
||||||
|
The Initial Developer of the Original Code is Remko Bonte [remkobonte att myrealbox dott com]
|
||||||
|
Portions created by Remko Bonte are Copyright (C) 2003 Remko Bonte.
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
Contributor(s):
|
||||||
|
|
||||||
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
||||||
|
located at http://jvcl.delphi-jedi.org
|
||||||
|
|
||||||
|
Known Issues:
|
||||||
|
-----------------------------------------------------------------------------}
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
unit JvId3v2DefineForm;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
|
||||||
|
//DesignEditors, DesignIntf, DesignMenus, DesignWindows,
|
||||||
|
JvId3v2Base, JvId3v2Types, JvComponent;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TJvID3DefineDlg }
|
||||||
|
|
||||||
|
TJvID3DefineDlg = class(TForm) //TJvForm)
|
||||||
|
lblFrames: TLabel;
|
||||||
|
cmbFrames: TComboBox;
|
||||||
|
OkBtn: TButton;
|
||||||
|
CancelBtn: TButton;
|
||||||
|
procedure FormShow(Sender: TObject);
|
||||||
|
procedure OkBtnClick(Sender: TObject);
|
||||||
|
private
|
||||||
|
FDesigner: TJvID3ControllerDesigner; //IDesigner;
|
||||||
|
FController: TJvID3Controller;
|
||||||
|
FFSDesigner: TJvID3ControllerDesigner;
|
||||||
|
FFrame: TJvID3Frame;
|
||||||
|
procedure SetController(const Value: TJvID3Controller);
|
||||||
|
function GetFrameClass: TJvID3FrameClass;
|
||||||
|
function GetFrameID: TJvID3FrameID;
|
||||||
|
function GetFrameIDStr: AnsiString;
|
||||||
|
protected
|
||||||
|
procedure FillFrames(const Strings: TStrings);
|
||||||
|
public
|
||||||
|
property FrameClass: TJvID3FrameClass read GetFrameClass;
|
||||||
|
property FrameID: TJvID3FrameID read GetFrameID;
|
||||||
|
property FrameIDStr: AnsiString read GetFrameIDStr;
|
||||||
|
property Frame: TJvID3Frame read FFrame;
|
||||||
|
property Controller: TJvID3Controller read FController write SetController;
|
||||||
|
// property Designer: IDesigner read FDesigner write FDesigner;
|
||||||
|
property FSDesigner: TJvID3ControllerDesigner read FFSDesigner write FFSDesigner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
uses
|
||||||
|
JvID3v2EditorForm;
|
||||||
|
|
||||||
|
procedure TJvID3DefineDlg.OkBtnClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
ModalResult := mrNone;
|
||||||
|
FSDesigner.BeginDesign;
|
||||||
|
try
|
||||||
|
FFrame := Controller.AddFrame(FrameID);
|
||||||
|
finally
|
||||||
|
FSDesigner.EndDesign;
|
||||||
|
end;
|
||||||
|
ModalResult := mrOk;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3DefineDlg.FormShow(Sender: TObject);
|
||||||
|
begin
|
||||||
|
ClientHeight := CancelBtn.Top + CancelBtn.Height + 8;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3DefineDlg.FillFrames(const Strings: TStrings);
|
||||||
|
var
|
||||||
|
lFrameID: TJvID3FrameID;
|
||||||
|
begin
|
||||||
|
Strings.BeginUpdate;
|
||||||
|
try
|
||||||
|
Strings.Clear;
|
||||||
|
for lFrameID := Low(TJvID3FrameID) to High(TJvID3FrameID) do
|
||||||
|
if Controller.CanAddFrame(lFrameID) then
|
||||||
|
Strings.AddObject(
|
||||||
|
Format('%s - %s',
|
||||||
|
[ID3_FrameIDToString(lFrameID), TFSDesigner(FSDesigner).FrameDescription[lFrameID]]),
|
||||||
|
TObject(lFrameID));
|
||||||
|
finally
|
||||||
|
Strings.EndUpdate;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3DefineDlg.SetController(const Value: TJvID3Controller);
|
||||||
|
begin
|
||||||
|
FController := Value;
|
||||||
|
FillFrames(cmbFrames.Items);
|
||||||
|
end;
|
||||||
|
|
||||||
|
type
|
||||||
|
TControllerAccess = class(TJvID3Controller);
|
||||||
|
|
||||||
|
function TJvID3DefineDlg.GetFrameClass: TJvID3FrameClass;
|
||||||
|
begin
|
||||||
|
Result := TControllerAccess(Controller).GetFrameClass(FrameID);
|
||||||
|
if Result = nil then
|
||||||
|
Result := TJvID3SkipFrame;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3DefineDlg.GetFrameID: TJvID3FrameID;
|
||||||
|
begin
|
||||||
|
with cmbFrames do
|
||||||
|
if ItemIndex >= 0 then
|
||||||
|
Result := TJvID3FrameID(Items.Objects[ItemIndex])
|
||||||
|
else
|
||||||
|
Result := fiUnknownFrame;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3DefineDlg.GetFrameIDStr: AnsiString;
|
||||||
|
begin
|
||||||
|
Result := ID3_FrameIDToString(FrameID);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
44
components/jvcllaz/design/JvMM/JvId3v2EditorForm.lfm
Normal file
44
components/jvcllaz/design/JvMM/JvId3v2EditorForm.lfm
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
object JvId3FramesEditor: TJvId3FramesEditor
|
||||||
|
Left = 540
|
||||||
|
Height = 293
|
||||||
|
Top = 208
|
||||||
|
Width = 231
|
||||||
|
BorderStyle = bsSizeToolWin
|
||||||
|
Caption = 'Frame editor'
|
||||||
|
ClientHeight = 293
|
||||||
|
ClientWidth = 231
|
||||||
|
OnActivate = FormActivate
|
||||||
|
OnCreate = FormCreate
|
||||||
|
OnDestroy = FormDestroy
|
||||||
|
PopupMenu = LocalMenu
|
||||||
|
LCLVersion = '1.9.0.0'
|
||||||
|
object FrameListBox: TListBox
|
||||||
|
Left = 0
|
||||||
|
Height = 293
|
||||||
|
Top = 0
|
||||||
|
Width = 231
|
||||||
|
Align = alClient
|
||||||
|
ItemHeight = 0
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object LocalMenu: TPopupMenu
|
||||||
|
left = 81
|
||||||
|
top = 96
|
||||||
|
object NewItem: TMenuItem
|
||||||
|
Caption = '&New frame...'
|
||||||
|
ShortCut = 16462
|
||||||
|
OnClick = NewFrameClick
|
||||||
|
end
|
||||||
|
object Separator: TMenuItem
|
||||||
|
Caption = '-'
|
||||||
|
end
|
||||||
|
object DeleteItem: TMenuItem
|
||||||
|
Caption = '&Delete'
|
||||||
|
ShortCut = 46
|
||||||
|
end
|
||||||
|
object SelectAllItem: TMenuItem
|
||||||
|
Caption = 'Se&lect all'
|
||||||
|
ShortCut = 16460
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
730
components/jvcllaz/design/JvMM/JvId3v2EditorForm.pas
Normal file
730
components/jvcllaz/design/JvMM/JvId3v2EditorForm.pas
Normal file
@ -0,0 +1,730 @@
|
|||||||
|
unit JvId3v2EditorForm;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus,
|
||||||
|
PropEdits, ComponentEditors,
|
||||||
|
JvId3v2Types, JvId3v2Base;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
TFSDesigner = class;
|
||||||
|
|
||||||
|
{ TJvId3FramesEditor }
|
||||||
|
|
||||||
|
TJvId3FramesEditor = class(TForm)
|
||||||
|
FrameListBox: TListBox;
|
||||||
|
LocalMenu: TPopupMenu;
|
||||||
|
NewItem: TMenuItem;
|
||||||
|
Separator: TMenuItem;
|
||||||
|
DeleteItem: TMenuItem;
|
||||||
|
SelectAllItem: TMenuItem;
|
||||||
|
procedure DeleteClick(Sender: TObject);
|
||||||
|
procedure FormActivate(Sender: TObject);
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure FormDestroy(Sender: TObject);
|
||||||
|
procedure NewFrameClick(Sender: TObject);
|
||||||
|
procedure SelectAllClick(Sender: TObject);
|
||||||
|
private
|
||||||
|
FFSDesigner: TFSDesigner;
|
||||||
|
FController: TJvID3Controller;
|
||||||
|
FMinWidth: Integer;
|
||||||
|
FMinHeight: Integer;
|
||||||
|
procedure RemoveFrames;
|
||||||
|
procedure SelectAll;
|
||||||
|
procedure SetController(Value: TJvID3Controller);
|
||||||
|
procedure UpdateDisplay;
|
||||||
|
procedure UpdateCaption;
|
||||||
|
procedure UpdateFrameList;
|
||||||
|
procedure UpdateSelection;
|
||||||
|
|
||||||
|
protected
|
||||||
|
// procedure Activated; override;
|
||||||
|
|
||||||
|
public
|
||||||
|
function DoNewFrame: TJvID3Frame;
|
||||||
|
|
||||||
|
property Controller: TJvID3Controller read FController write SetController;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
TJvID3ControllerEditor = class(TDefaultComponentEditor)
|
||||||
|
private
|
||||||
|
FDesigner: TComponentEditorDesigner;
|
||||||
|
protected
|
||||||
|
procedure Commit;
|
||||||
|
function CreateFramesEditor(ADesigner: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller; var Shared: Boolean): TJvID3FramesEditor;
|
||||||
|
procedure RemoveTag;
|
||||||
|
procedure ShowFramesEditor(ADesigner: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller);
|
||||||
|
public
|
||||||
|
constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override;
|
||||||
|
procedure Edit; override;
|
||||||
|
procedure ExecuteVerb(AIndex: Integer); override;
|
||||||
|
function GetVerb(AIndex: Integer): string; override;
|
||||||
|
function GetVerbCount: Integer; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TFSDesigner = class(TJvID3ControllerDesigner)
|
||||||
|
private
|
||||||
|
FFramesEditor: TJvID3FramesEditor;
|
||||||
|
function GetFrameDescription(const FrameID: TJvID3FrameID): string;
|
||||||
|
public
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure ID3Event(Event: TJvID3Event; Info: Longint); override;
|
||||||
|
property FramesEditor: TJvID3FramesEditor read FFramesEditor;
|
||||||
|
property FrameDescription[const FrameID: TJvID3FrameID]: string read GetFrameDescription;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TJvID3FileInfoEditor = class(TClassProperty)
|
||||||
|
public
|
||||||
|
procedure Edit; override;
|
||||||
|
function GetAttributes: TPropertyAttributes; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
JvId3FramesEditor: TJvId3FramesEditor;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Math, IDEWindowIntf,
|
||||||
|
JvDsgnConsts, JvId3v2DefineForm;
|
||||||
|
|
||||||
|
type
|
||||||
|
TJvID3ControllerAccess = class(TJvID3Controller);
|
||||||
|
|
||||||
|
const
|
||||||
|
cFrameDescriptions: array [TJvID3FrameID] of string = (
|
||||||
|
RsfiErrorFrame,
|
||||||
|
RsfiPaddingFrame,
|
||||||
|
RsfiNoFrame,
|
||||||
|
RsfiAudioCrypto,
|
||||||
|
RsfiPicture,
|
||||||
|
RsfiAudioSeekPoint,
|
||||||
|
RsfiComment,
|
||||||
|
RsfiCommercial,
|
||||||
|
RsfiCryptoReg,
|
||||||
|
RsfiEqualization2,
|
||||||
|
RsfiEqualization,
|
||||||
|
RsfiEventTiming,
|
||||||
|
RsfiGeneralObject,
|
||||||
|
RsfiGroupingReg,
|
||||||
|
RsfiInvolvedPeople,
|
||||||
|
RsfiLinkedInfo,
|
||||||
|
RsfiCDID,
|
||||||
|
RsfiMPEGLookup,
|
||||||
|
RsfiOwnership,
|
||||||
|
RsfiPrivate,
|
||||||
|
RsfiPlayCounter,
|
||||||
|
RsfiPopularimeter,
|
||||||
|
RsfiPositionsync,
|
||||||
|
RsfiBufferSize,
|
||||||
|
RsfiVolumeAdj2,
|
||||||
|
RsfiVolumeAdj,
|
||||||
|
RsfiReverb,
|
||||||
|
RsfiSeekFrame,
|
||||||
|
RsfiSignature,
|
||||||
|
RsfiSyncedLyrics,
|
||||||
|
RsfiSyncedTempo,
|
||||||
|
RsfiAlbum,
|
||||||
|
RsfiBPM,
|
||||||
|
RsfiComposer,
|
||||||
|
RsfiContentType,
|
||||||
|
RsfiCopyright,
|
||||||
|
RsfiDate,
|
||||||
|
RsfiEncodingTime,
|
||||||
|
RsfiPlaylistDelay,
|
||||||
|
RsfiOrigReleaseTime,
|
||||||
|
RsfiRecordingTime,
|
||||||
|
RsfiReleaseTime,
|
||||||
|
RsfiTaggingTime,
|
||||||
|
RsfiInvolvedPeople2,
|
||||||
|
RsfiEncodedBy,
|
||||||
|
RsfiLyricist,
|
||||||
|
RsfiFileType,
|
||||||
|
RsfiTime,
|
||||||
|
RsfiContentGroup,
|
||||||
|
RsfiTitle,
|
||||||
|
RsfiSubTitle,
|
||||||
|
RsfiInitialKey,
|
||||||
|
RsfiLanguage,
|
||||||
|
RsfiSongLen,
|
||||||
|
RsfiMusicianCreditList,
|
||||||
|
RsfiMediaType,
|
||||||
|
RsfiMood,
|
||||||
|
RsfiOrigAlbum,
|
||||||
|
RsfiOrigFileName,
|
||||||
|
RsfiOrigLyricist,
|
||||||
|
RsfiOrigArtist,
|
||||||
|
RsfiOrigYear,
|
||||||
|
RsfiFileOwner,
|
||||||
|
RsfiLeadArtist,
|
||||||
|
RsfiBand,
|
||||||
|
RsfiConductor,
|
||||||
|
RsfiMixArtist,
|
||||||
|
RsfiPartInSet,
|
||||||
|
RsfiProducedNotice,
|
||||||
|
RsfiPublisher,
|
||||||
|
RsfiTrackNum,
|
||||||
|
RsfiRecordingDates,
|
||||||
|
RsfiNetRadioStation,
|
||||||
|
RsfiNetRadioOwner,
|
||||||
|
RsfiSize,
|
||||||
|
RsfiAlbumSortOrder,
|
||||||
|
RsfiPerformerSortOrder,
|
||||||
|
RsfiTitleSortOrder,
|
||||||
|
RsfiISRC,
|
||||||
|
RsfiEncoderSettings,
|
||||||
|
RsfiSetSubTitle,
|
||||||
|
RsfiUserText,
|
||||||
|
RsfiYear,
|
||||||
|
RsfiUniqueFileID,
|
||||||
|
RsfiTermsOfUse,
|
||||||
|
RsfiUnsyncedLyrics,
|
||||||
|
RsfiWWWCommercialInfo,
|
||||||
|
RsfiWWWCopyright,
|
||||||
|
RsfiWWWAudioFile,
|
||||||
|
RsfiWWWArtist,
|
||||||
|
RsfiWWWAudioSource,
|
||||||
|
RsfiWWWRadioPage,
|
||||||
|
RsfiWWWPayment,
|
||||||
|
RsfiWWWPublisher,
|
||||||
|
RsfiWWWUser,
|
||||||
|
RsfiMetaCrypto,
|
||||||
|
RsfiMetaCompression
|
||||||
|
);
|
||||||
|
(*
|
||||||
|
//function CreateFramesEditor(Designer: IJvFormDesigner;
|
||||||
|
// AController: TJvID3Controller; var Shared: Boolean): TJvID3FramesEditor;
|
||||||
|
function CreateFramesEditor(Designer: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller; var Shared: Boolean): TJvID3FramesEditor;
|
||||||
|
begin
|
||||||
|
Shared := True;
|
||||||
|
if AController.Designer <> nil then
|
||||||
|
Result := (AController.Designer as TFSDesigner).FFramesEditor
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Result := TJvID3FramesEditor.Create(Application);
|
||||||
|
Result.Designer := Designer;
|
||||||
|
Result.Controller := AController;
|
||||||
|
Shared := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
(*
|
||||||
|
//procedure ShowFramesEditor(Designer: IJvFormDesigner; AController: TJvID3Controller);
|
||||||
|
procedure ShowFramesEditor(Designer: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller);
|
||||||
|
var
|
||||||
|
FramesEditor: TJvID3FramesEditor;
|
||||||
|
VShared: Boolean;
|
||||||
|
Hook: TPropertyEditorHook;
|
||||||
|
begin
|
||||||
|
Hook:=nil;
|
||||||
|
if not GetHook(Hook) then exit;
|
||||||
|
FramesEditor := CreateFramesEditor(Designer, AController, VShared);
|
||||||
|
if FramesEditor <> nil then
|
||||||
|
FramesEditor.Show;
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
procedure ShowFileInfo(AController: TJvID3Controller);
|
||||||
|
const
|
||||||
|
cVersion: array [TJvMPEGVersion] of string =
|
||||||
|
(RsMPEG25, RsMPEGUnknown, RsMPEG20, RsMPEG10);
|
||||||
|
cLayer: array [TJvMPEGLayer] of string =
|
||||||
|
(RsLayerUnknown, RsLayer3, RsLayer2, RsLayer1);
|
||||||
|
cChannelMode: array [TJvMPEGChannelMode] of string =
|
||||||
|
(RsChannelModeStereo, RsChannelModeJointStereo,
|
||||||
|
RsChannelModeDualChannel, RsChannelModeMono);
|
||||||
|
cEmphasis: array [TJvMPEGEmphasis] of string =
|
||||||
|
(RsEmphasisNone, RsEmphasisMicrosec, RsEmphasisUnknown, RsEmphasisCCITTJ17);
|
||||||
|
cBool: array [Boolean] of string =
|
||||||
|
(RsBoolNo, RsBoolYes);
|
||||||
|
cVbr: array [Boolean] of string =
|
||||||
|
(RsVbrNo, RsVbrVbr);
|
||||||
|
var
|
||||||
|
Msg: string;
|
||||||
|
SavedActive: Boolean;
|
||||||
|
begin
|
||||||
|
SavedActive := AController.Active;
|
||||||
|
try
|
||||||
|
with TJvID3ControllerAccess(AController) do
|
||||||
|
begin
|
||||||
|
if FileName = '' then
|
||||||
|
begin
|
||||||
|
MessageDlg(RsID3Err_NoFileSpecified, mtError, [mbOK], 0);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if not FileExists(FileName) then
|
||||||
|
begin
|
||||||
|
MessageDlg(Format(RSID3Err_FileDoesNotExists, [FileName]),
|
||||||
|
mtError, [mbOK], 0);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Active := True;
|
||||||
|
|
||||||
|
with FileInfo do
|
||||||
|
begin
|
||||||
|
if not IsValid then
|
||||||
|
begin
|
||||||
|
MessageDlg(RSID3Err_NoValidMPEGTag, mtError, [mbOK], 0);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Msg := Format(RsIDV2FileInfoFmt, [FileSize, HeaderFoundAt, LengthInSec,
|
||||||
|
cVersion[Version], cLayer[Layer], Bitrate, cVbr[IsVbr], FrameCount,
|
||||||
|
SamplingRateFrequency, cChannelMode[ChannelMode],
|
||||||
|
cBool[mbProtection in Bits], cBool[mbCopyrighted in Bits],
|
||||||
|
cBool[mbOriginal in Bits], cEmphasis[Emphasis]]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ We don't use MessageDlg now, because we want a custom caption }
|
||||||
|
with CreateMessageDialog(Msg, mtCustom, [mbOK]) do
|
||||||
|
try
|
||||||
|
Position := poScreenCenter;
|
||||||
|
Caption := RsIDV2FileInfoCaption;
|
||||||
|
ShowModal;
|
||||||
|
finally
|
||||||
|
Free;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
AController.Active := SavedActive;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// === TJvId3FramesEditor =====================================================
|
||||||
|
(*
|
||||||
|
procedure TJvID3FramesEditor.Activated;
|
||||||
|
begin
|
||||||
|
Designer.Activate;
|
||||||
|
try
|
||||||
|
UpdateSelection;
|
||||||
|
except
|
||||||
|
FrameListBox.Items.Clear;
|
||||||
|
end;
|
||||||
|
end; *)
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.DeleteClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
RemoveFrames;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3FramesEditor.DoNewFrame: TJvID3Frame;
|
||||||
|
var
|
||||||
|
DefineFrame: TJvID3DefineDlg;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
DefineFrame := TJvID3DefineDlg.Create(Application);
|
||||||
|
try
|
||||||
|
DefineFrame.FSDesigner := FFSDesigner;
|
||||||
|
DefineFrame.Designer := Designer;
|
||||||
|
DefineFrame.Controller := Controller;
|
||||||
|
if DefineFrame.ShowModal = mrOk then
|
||||||
|
begin
|
||||||
|
Result := DefineFrame.Frame;
|
||||||
|
if Visible then
|
||||||
|
UpdateDisplay;
|
||||||
|
Designer.Modified;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
DefineFrame.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvId3FramesEditor.FormActivate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
(*
|
||||||
|
Designer.Activate;
|
||||||
|
try
|
||||||
|
UpdateSelection;
|
||||||
|
except
|
||||||
|
FrameListBox.Items.Clear;
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvId3FramesEditor.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FMinWidth := Width;
|
||||||
|
FMinHeight := Height;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvId3FramesEditor.FormDestroy(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if FFSDesigner <> nil then
|
||||||
|
begin
|
||||||
|
{ Destroy the designer if the editor is destroyed }
|
||||||
|
FFSDesigner.FFramesEditor := nil;
|
||||||
|
FFSDesigner.Free;
|
||||||
|
FFSDesigner := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.NewFrameClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
Selection: TStringList;
|
||||||
|
Frame: TJvID3Frame;
|
||||||
|
begin
|
||||||
|
Frame := DoNewFrame;
|
||||||
|
if Frame <> nil then
|
||||||
|
begin
|
||||||
|
(*
|
||||||
|
Selection := TStringList.Create;
|
||||||
|
try
|
||||||
|
Selection.Add(Frame.Name);
|
||||||
|
finally
|
||||||
|
RestoreSelection(Selection, -1, -1, False);
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
end;
|
||||||
|
FrameListBox.SetFocus;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.RemoveFrames;
|
||||||
|
var
|
||||||
|
I, lFocused: Integer;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
FFSDesigner.BeginDesign;
|
||||||
|
try
|
||||||
|
lFocused := FrameListBox.ItemIndex;
|
||||||
|
with FrameListBox do
|
||||||
|
for I := Items.Count - 1 downto 0 do
|
||||||
|
if Selected[I] then
|
||||||
|
TJvID3Frame(Items.Objects[I]).Free;
|
||||||
|
finally
|
||||||
|
FFSDesigner.EndDesign;
|
||||||
|
Designer.Modified;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
UpdateDisplay;
|
||||||
|
end;
|
||||||
|
if lFocused <> -1 then
|
||||||
|
begin
|
||||||
|
lFocused := Min(lFocused, FrameListBox.Items.Count - 1);
|
||||||
|
FrameListBox.ItemIndex := lFocused;
|
||||||
|
FrameListBox.Selected[lFocused] := True;
|
||||||
|
UpdateSelection;
|
||||||
|
end;
|
||||||
|
FrameListBox.SetFocus;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.SelectAll;
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
with FrameListBox do
|
||||||
|
for I := 0 to Items.Count - 1 do
|
||||||
|
Selected[I] := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.SelectAllClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SelectAll;
|
||||||
|
UpdateSelection;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.SetController(Value: TJvID3Controller);
|
||||||
|
begin
|
||||||
|
if FController <> Value then
|
||||||
|
begin
|
||||||
|
if FController <> nil then
|
||||||
|
FreeAndNil(FFSDesigner);
|
||||||
|
FController := Value;
|
||||||
|
if FController <> nil then
|
||||||
|
begin
|
||||||
|
FFSDesigner := TFSDesigner.Create(Value);
|
||||||
|
FFSDesigner.FFramesEditor := Self;
|
||||||
|
UpdateDisplay;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if not (csDestroying in ComponentState) then
|
||||||
|
Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.UpdateCaption;
|
||||||
|
const
|
||||||
|
cFrameEditor = '%s%s%s';
|
||||||
|
var
|
||||||
|
NewCaption: string;
|
||||||
|
begin
|
||||||
|
if (Controller <> nil) and (Controller.Owner <> nil) then
|
||||||
|
NewCaption := Format(cFrameEditor,
|
||||||
|
[Controller.Owner.Name, '.', Controller.Name]);
|
||||||
|
if Caption <> NewCaption then
|
||||||
|
Caption := NewCaption;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.UpdateDisplay;
|
||||||
|
begin
|
||||||
|
UpdateFrameList;
|
||||||
|
UpdateCaption;
|
||||||
|
UpdateSelection;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.UpdateFrameList;
|
||||||
|
var
|
||||||
|
ItemIndex, TopIndex: Integer;
|
||||||
|
Selection: TStringList;
|
||||||
|
EnableList: Boolean;
|
||||||
|
I: Integer;
|
||||||
|
Frame: TJvID3Frame;
|
||||||
|
FrameName: string;
|
||||||
|
begin
|
||||||
|
// SaveSelection(Selection, ItemIndex, TopIndex, True);
|
||||||
|
try
|
||||||
|
FrameListBox.Clear;
|
||||||
|
EnableList := False;
|
||||||
|
try
|
||||||
|
if Controller = nil then
|
||||||
|
Exit;
|
||||||
|
for I := 0 to Controller.Frames.Count - 1 do
|
||||||
|
begin
|
||||||
|
Frame := Controller.Frames[I];
|
||||||
|
if not (csDestroying in Frame.ComponentState) then
|
||||||
|
begin
|
||||||
|
FrameName := string(Frame.FrameName);
|
||||||
|
if FrameName = '' then
|
||||||
|
FrameName := Format('<%s>', [Controller.Frames[I].Name]);
|
||||||
|
FrameName := FrameName + ' - ' + cFrameDescriptions[Frame.FrameID];
|
||||||
|
FrameListBox.Items.AddObject(FrameName, Frame);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
EnableList := True;
|
||||||
|
finally
|
||||||
|
FrameListBox.Enabled := EnableList;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
// RestoreSelection(Selection, ItemIndex, TopIndex, True)
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3FramesEditor.UpdateSelection;
|
||||||
|
{
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
Frame: TJvID3Frame;
|
||||||
|
ComponentList: IDesignerSelections;
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
if Active then
|
||||||
|
begin
|
||||||
|
ComponentList := TDesignerSelections.Create;
|
||||||
|
with FrameListBox do
|
||||||
|
for I := 0 to Items.Count - 1 do
|
||||||
|
if Selected[I] then
|
||||||
|
begin
|
||||||
|
Frame := TJvID3Frame(Items.Objects[I]);
|
||||||
|
if Frame <> nil then
|
||||||
|
ComponentList.Add(Frame);
|
||||||
|
end;
|
||||||
|
if ComponentList.Count = 0 then
|
||||||
|
ComponentList.Add(Controller);
|
||||||
|
Designer.SetSelections(ComponentList);
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
(*
|
||||||
|
function FindFramesEditor(AController: TJvID3Controller): TJvID3FramesEditor;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
if AController <> nil then
|
||||||
|
for i:=0 to EditorForms.Count-1 do begin
|
||||||
|
if TActionListEditor(EditorForms[i]).FActionList=AList then
|
||||||
|
Exit(TActionListEditor(EditorForms[i]));
|
||||||
|
end;
|
||||||
|
Result:=nil
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
|
||||||
|
// === TJvID3ControllerEditor ==================================================
|
||||||
|
|
||||||
|
constructor TJvID3ControllerEditor.Create(AComponent: TComponent;
|
||||||
|
ADesigner: TComponentEditorDesigner);
|
||||||
|
begin
|
||||||
|
inherited Create(AComponent, ADesigner);
|
||||||
|
FDesigner := ADesigner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3ControllerEditor.Commit;
|
||||||
|
begin
|
||||||
|
if MessageDlg(RsCommit, mtConfirmation, mbOKCancel, 0) = mrOk then
|
||||||
|
TJvID3Controller(Component).Commit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3ControllerEditor.CreateFramesEditor(ADesigner: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller; var Shared: Boolean): TJvID3FramesEditor;
|
||||||
|
begin
|
||||||
|
Shared := True;
|
||||||
|
if AController.Designer <> nil then
|
||||||
|
Result := (AController.Designer as TFSDesigner).FFramesEditor
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Result := TJvID3FramesEditor.Create(Application);
|
||||||
|
Result.Designer := ADesigner;
|
||||||
|
Result.Controller := AController;
|
||||||
|
Shared := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3ControllerEditor.Edit;
|
||||||
|
var
|
||||||
|
lController: TJvID3Controller;
|
||||||
|
lEditor: TJvId3FramesEditor;
|
||||||
|
begin
|
||||||
|
lController := GetComponent as TJvID3Controller;
|
||||||
|
if lController = nil then
|
||||||
|
raise Exception.Create('TJvID3ControllerEditor.Edit lController=nil');
|
||||||
|
|
||||||
|
lEditor := TJvId3FramesEditor.Create(Application);
|
||||||
|
with lEditor do begin
|
||||||
|
Designer := Self.FDesigner;
|
||||||
|
Controller := lController;
|
||||||
|
end;
|
||||||
|
SetPopupModeParentForPropertyEditor(lEditor);
|
||||||
|
lEditor.ShowOnTop;
|
||||||
|
(*
|
||||||
|
lController :AEditor:=FindActionEditor(AActionList);
|
||||||
|
if not Assigned(AEditor) then begin
|
||||||
|
AEditor:=TActionListEditor.Create(Application);
|
||||||
|
with AEditor do begin
|
||||||
|
lstActionName.ItemIndex := -1;
|
||||||
|
Designer := Self.FDesigner;
|
||||||
|
SetActionList(AActionList);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
SetPopupModeParentForPropertyEditor(AEditor);
|
||||||
|
AEditor.ShowOnTop;
|
||||||
|
*)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3ControllerEditor.ExecuteVerb(AIndex: Integer);
|
||||||
|
begin
|
||||||
|
case AIndex of
|
||||||
|
0: ShowFramesEditor(Designer, TJvID3Controller(Component));
|
||||||
|
1: RemoveTag;
|
||||||
|
2: ShowFileInfo(TJvID3Controller(Component));
|
||||||
|
3: Commit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3ControllerEditor.GetVerb(AIndex: Integer): string;
|
||||||
|
begin
|
||||||
|
case AIndex of
|
||||||
|
0: Result := RSID3FrameEditorTag;
|
||||||
|
1: Result := RSID3RemoveTag;
|
||||||
|
2: Result := RSID3FileInfoTag;
|
||||||
|
3: Result := RSID3CommitTag;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3ControllerEditor.GetVerbCount: Integer;
|
||||||
|
begin
|
||||||
|
Result := 3;
|
||||||
|
with TJvID3Controller(Component) do
|
||||||
|
if Active and Modified then
|
||||||
|
Inc(Result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3ControllerEditor.RemoveTag;
|
||||||
|
begin
|
||||||
|
with TJvID3Controller(Component) do
|
||||||
|
begin
|
||||||
|
if FileName = '' then
|
||||||
|
begin
|
||||||
|
MessageDlg(RsID3Err_NoFileSpecified, mtError, [mbOK], 0);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if not FileExists(FileName) then
|
||||||
|
begin
|
||||||
|
MessageDlg(Format(RSID3Err_FileDoesNotExists, [FileName]), mtError, [mbOK], 0);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if MessageDlg(RSID3RemoveTagConfirmation, mtConfirmation, mbOKCancel, 0) = mrOk then
|
||||||
|
Erase;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TJvID3ControllerEditor.ShowFramesEditor(ADesigner: TComponentEditorDesigner;
|
||||||
|
AController: TJvID3Controller);
|
||||||
|
var
|
||||||
|
FramesEditor: TJvID3FramesEditor;
|
||||||
|
VShared: Boolean;
|
||||||
|
Hook: TPropertyEditorHook;
|
||||||
|
begin
|
||||||
|
Hook := nil;
|
||||||
|
if not GetHook(Hook) then exit;
|
||||||
|
FramesEditor := CreateFramesEditor(ADesigner, AController, VShared);
|
||||||
|
if FramesEditor <> nil then
|
||||||
|
FramesEditor.Show;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
//=== TFSDesigner =============================================================
|
||||||
|
|
||||||
|
destructor TFSDesigner.Destroy;
|
||||||
|
var
|
||||||
|
F: TJvID3FramesEditor;
|
||||||
|
begin
|
||||||
|
if FFramesEditor <> nil then
|
||||||
|
begin
|
||||||
|
F := FFramesEditor;
|
||||||
|
FFramesEditor := nil;
|
||||||
|
F.FFSDesigner := nil;
|
||||||
|
{ (rb) DSDesign.pas uses Release, but that gave problems, with recompiling }
|
||||||
|
F.Free;
|
||||||
|
end;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFSDesigner.GetFrameDescription(const FrameID: TJvID3FrameID): string;
|
||||||
|
begin
|
||||||
|
Result := cFrameDescriptions[FrameID];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFSDesigner.ID3Event(Event: TJvID3Event; Info: Longint);
|
||||||
|
begin
|
||||||
|
if Event in [ideFrameListChange, ideID3Change] then
|
||||||
|
FFramesEditor.UpdateFrameList;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// === TJvId3FileInfoEditor ===================================================
|
||||||
|
|
||||||
|
procedure TJvID3FileInfoEditor.Edit;
|
||||||
|
var
|
||||||
|
P: TPersistent;
|
||||||
|
begin
|
||||||
|
P := TPersistent(GetComponent(0));
|
||||||
|
if P is TJvID3Controller then
|
||||||
|
ShowFileInfo(TJvID3Controller(P));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TJvID3FileInfoEditor.GetAttributes: TPropertyAttributes;
|
||||||
|
begin
|
||||||
|
Result := [paDialog];
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Reference in New Issue
Block a user