Componentes.Terceros.jvcl/official/3.32/archive/JvTimerListForm.pas

586 lines
15 KiB
ObjectPascal

{-----------------------------------------------------------------------------
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: JvTimLstEd.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
Last Modified: 2002-07-04
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
{$I JVCL.INC}
unit JvTimerListForm;
interface
uses
Windows,
SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls, Grids, Menus,
{$IFDEF COMPILER6_UP}
RTLConsts, DesignIntf, DesignEditors, DesignWindows, VCLEditors,
{$ELSE}
LibIntf, DsgnIntf, DsgnWnds,
{$ENDIF}
JvJVCLUtils, JvFormPlacement, JvTimerList, JvComponent;
type
TJvTimerItemsEditor = class(TDesignWindow)
BtnPanel: TPanel;
ClientPanel: TPanel;
NewBtn: TButton;
DeleteBtn: TButton;
DrawGrid: TDrawGrid;
PopupMenu: TPopupMenu;
CutMenu: TMenuItem;
CopyMenu: TMenuItem;
PasteMenu: TMenuItem;
FormStorage: TJvFormStorage;
DeleteMenu: TMenuItem;
N1: TMenuItem;
NewMenu: TMenuItem;
ClearBtn: TButton;
Panel1: TPanel;
CloseBtn: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure DrawGridDrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure DrawGridSelectCell(Sender: TObject; Col, Row: Longint;
var CanSelect: Boolean);
procedure CloseBtnClick(Sender: TObject);
procedure DeleteClick(Sender: TObject);
procedure DrawGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure NewClick(Sender: TObject);
procedure CutClick(Sender: TObject);
procedure CopyClick(Sender: TObject);
procedure PasteClick(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
private
FTimersCollection: TJvTimerList;
function GetForm: TCustomForm;
function CheckCollection: Boolean;
function ItemByRow(Row: Integer): TJvTimerEvent;
procedure SelectItem(Item: TJvTimerEvent);
procedure UpdateData;
procedure SetTimersCollection(Value: TJvTimerList);
procedure Copy;
procedure Cut;
procedure Paste;
protected
function UniqueName(Component: TComponent): string; override;
procedure Activated; override;
public
{$IFDEF COMPILER6_UP}
function EditAction(Action: TEditAction): Boolean; override;
procedure ItemsModified(const Designer: IDesigner); override;
procedure DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean); override;
{$ELSE}
procedure EditAction(Action: TEditAction); override;
procedure FormModified; override;
procedure FormClosed(Form: TCustomForm); override;
{$ENDIF}
function GetEditState: TEditState; override;
{$IFDEF COMPILER6_UP}
procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); override;
{$ELSE}
procedure ComponentDeleted(Component: IPersistent); override;
{$ENDIF}
property TimersCollection: TJvTimerList read FTimersCollection
write SetTimersCollection;
property OwnerForm: TCustomForm read GetForm;
end;
TJvTimersItemListProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
end;
TJvTimersCollectionEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
implementation
uses
Consts,
JvConsts, JvTypes, JvxDConst;
{$R *.DFM}
{$D-}
{$IFDEF COMPILER6_UP}
type
TDesigner = DesignIntf.IDesigner;
TFormDesigner = DesignIntf.IDesigner;
{$ELSE}
type
TDesigner = IDesigner;
TFormDesigner = IFormDesigner;
{$ENDIF}
function FindEditor(ATimersCollection: TJvTimerList): TJvTimerItemsEditor;
var
I: Integer;
begin
Result := nil;
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I] is TJvTimerItemsEditor then
if TJvTimerItemsEditor(Screen.Forms[I]).TimersCollection = ATimersCollection then
begin
Result := TJvTimerItemsEditor(Screen.Forms[I]);
Break;
end;
end;
procedure ShowItemsEditor(Designer: TDesigner;
ATimersCollection: TJvTimerList);
var
Editor: TJvTimerItemsEditor;
begin
if ATimersCollection = nil then
Exit;
Editor := FindEditor(ATimersCollection);
if Editor = nil then
begin
Editor := TJvTimerItemsEditor.Create(Application);
try
Editor.Designer := TFormDesigner(Designer);
Editor.TimersCollection := ATimersCollection;
Editor.Show;
except
Editor.Free;
raise;
end;
end
else
begin
Editor.Show;
if Editor.WindowState = wsMinimized then
Editor.WindowState := wsNormal;
end;
end;
//=== TJvTimersItemListProperty ==============================================
function TJvTimersItemListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
function TJvTimersItemListProperty.GetValue: string;
var
List: TList;
begin
List := TList(Pointer(GetOrdValue));
if (List = nil) or (List.Count = 0) then
Result := srNone
else
FmtStr(Result, '(%s)', [GetPropType^.Name]);
end;
procedure TJvTimersItemListProperty.Edit;
begin
ShowItemsEditor(Designer, TJvTimerList(GetComponent(0)));
end;
//=== TJvTimersCollectionEditor ==============================================
procedure TJvTimersCollectionEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0:
ShowItemsEditor(Designer, TJvTimerList(Component));
end;
end;
function TJvTimersCollectionEditor.GetVerb(Index: Integer): string;
begin
case Index of
0:
Result := srTimerDesigner;
end;
end;
function TJvTimersCollectionEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
//=== TJvTimerItemsEditor ====================================================
procedure TJvTimerItemsEditor.SetTimersCollection(Value: TJvTimerList);
begin
if FTimersCollection <> Value then
begin
FTimersCollection := Value;
UpdateData;
end;
end;
function TJvTimerItemsEditor.UniqueName(Component: TComponent): string;
var
Temp: string;
begin
if Component <> nil then
Temp := Component.ClassName
else
Temp := TJvTimerEvent.ClassName;
if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
System.Delete(Temp, 1, 1);
Result := Designer.UniqueName(Temp);
end;
function TJvTimerItemsEditor.GetEditState: TEditState;
begin
Result := [];
if DeleteBtn.Enabled then
Result := [esCanDelete, esCanCut, esCanCopy];
if ClipboardComponents then
Include(Result, esCanPaste);
end;
{$IFDEF COMPILER6_UP}
procedure TJvTimerItemsEditor.DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean);
{$ELSE}
procedure TJvTimerItemsEditor.FormClosed(Form: TCustomForm);
{$ENDIF}
begin
if {$IFDEF COMPILER6_UP} ADesigner.Root {$ELSE} Form {$ENDIF} = OwnerForm then
Free;
end;
{$IFDEF COMPILER6_UP}
procedure TJvTimerItemsEditor.ItemsModified(const Designer: IDesigner);
{$ELSE}
procedure TJvTimerItemsEditor.FormModified;
{$ENDIF}
begin
if not (csDestroying in ComponentState) then
UpdateData;
end;
procedure TJvTimerItemsEditor.Activated;
begin
SelectItem(ItemByRow(DrawGrid.Row - 1));
end;
procedure TJvTimerItemsEditor.UpdateData;
var
Empty: Boolean;
begin
if CheckCollection then
begin
Caption := Format(srTimerEvents, [TimersCollection.Name]);
Empty := TimersCollection.Events.Count = 0;
end
else
Empty := True;
if Empty then
begin
DrawGrid.RowCount := 2;
SelectItem(nil);
end
else
DrawGrid.RowCount := TimersCollection.Events.Count + 1;
DeleteBtn.Enabled := not Empty;
ClearBtn.Enabled := not Empty;
DeleteMenu.Enabled := not Empty;
CopyMenu.Enabled := not Empty;
CutMenu.Enabled := not Empty;
PasteMenu.Enabled := ClipboardComponents;
DrawGrid.Invalidate;
end;
function TJvTimerItemsEditor.GetForm: TCustomForm;
begin
Result := {$IFDEF COMPILER6_UP} TCustomForm(Designer.Root) {$ELSE} Designer.Form {$ENDIF};
end;
procedure TJvTimerItemsEditor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
function TJvTimerItemsEditor.CheckCollection: Boolean;
begin
Result := (TimersCollection <> nil) and (TimersCollection.Owner <> nil)
and ({$IFDEF COMPILER6_UP} Designer.Root {$ELSE} Designer.Form {$ENDIF} <> nil);
end;
{$IFDEF COMPILER6_UP}
type
TDesignerSelectionList = IDesignerSelections;
{$ENDIF}
procedure TJvTimerItemsEditor.SelectItem(Item: TJvTimerEvent);
var
FComponents: TDesignerSelectionList;
begin
if CheckCollection and Active then
begin
FComponents := {$IFDEF COMPILER6_UP} TDesignerSelections {$ELSE} TDesignerSelectionList {$ENDIF}.Create;
if Item <> nil then
FComponents.Add(Item)
else
FComponents.Add(TimersCollection);
SetSelection(FComponents);
end;
end;
function TJvTimerItemsEditor.ItemByRow(Row: Integer): TJvTimerEvent;
begin
Result := nil;
if CheckCollection and (Row >= 0) and
(Row < TimersCollection.Events.Count) then
begin
Result := TJvTimerEvent(TimersCollection.Events[Row]);
end;
end;
{$IFDEF COMPILER6_UP}
procedure TJvTimerItemsEditor.ItemDeleted(const ADesigner: IDesigner; Item: TPersistent);
begin
if Item = TimersCollection then
begin
{$ELSE}
procedure TJvTimerItemsEditor.ComponentDeleted(Component: IPersistent);
begin
if ExtractPersistent(Component) = TimersCollection then
begin
{$ENDIF}
TimersCollection := nil;
Close;
end;
end;
procedure TJvTimerItemsEditor.DrawGridDrawCell(Sender: TObject; Col,
Row: Longint; Rect: TRect; State: TGridDrawState);
var
CellText: string;
Item: TJvTimerEvent;
begin
CellText := '';
if gdFixed in State then
CellText := 'Item name'
else
begin
Item := ItemByRow(Row - 1);
if Item <> nil then
CellText := Item.DisplayName;
end;
DrawCellText(DrawGrid, Col, Row, CellText, Rect, taLeftJustify, vaCenterJustify);
end;
procedure TJvTimerItemsEditor.DrawGridSelectCell(Sender: TObject; Col,
Row: Longint; var CanSelect: Boolean);
begin
SelectItem(ItemByRow(Row - 1));
end;
procedure TJvTimerItemsEditor.CloseBtnClick(Sender: TObject);
begin
Close;
end;
procedure TJvTimerItemsEditor.DeleteClick(Sender: TObject);
var
Item: TJvTimerEvent;
begin
Item := ItemByRow(DrawGrid.Row - 1);
if Item <> nil then
begin
{$IFDEF COMPILER6_UP} TCustomForm(Designer.Root).Designer {$ELSE} Designer {$ENDIF}.ValidateRename(Item.TimerList, Item.DisplayName, '');
TimersCollection.Delete(Item.Handle);
if TimersCollection.Count > 0 then
begin
Item := ItemByRow(DrawGrid.Row - 1);
SelectItem(Item);
end
else
SelectItem(nil);
UpdateData;
Designer.Modified;
end;
end;
procedure TJvTimerItemsEditor.DrawGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift = [] then
case Key of
VK_RETURN:
if ItemByRow(DrawGrid.Row - 1) <> nil then
ActivateInspector(#0);
VK_DELETE:
DeleteClick(nil);
end;
end;
procedure TJvTimerItemsEditor.FormCreate(Sender: TObject);
begin
TimersCollection := nil;
if NewStyleControls then
Font.Style := [];
with FormStorage do
begin
UseRegistry := True;
IniFileName := SDelphiKey;
end;
end;
procedure TJvTimerItemsEditor.FormResize(Sender: TObject);
begin
with DrawGrid do
ColWidths[0] := ClientWidth;
end;
{$IFDEF COMPILER6_UP}
function TJvTimerItemsEditor.EditAction(Action: TEditAction): Boolean;
begin
Result := True;
{$ELSE}
procedure TJvTimerItemsEditor.EditAction(Action: TEditAction);
begin
{$ENDIF}
case Action of
eaCut:
Cut;
eaCopy:
Copy;
eaPaste:
Paste;
eaDelete:
DeleteClick(Self);
end;
end;
procedure TJvTimerItemsEditor.NewClick(Sender: TObject);
var
I: Integer;
Item: TJvTimerEvent;
begin
Item := TJvTimerEvent.Create(TimersCollection.Owner);
if Item <> nil then
try
Item.Name := UniqueName(Item);
with TimersCollection do
I := ItemIndexByHandle(AddItem(Item));
SelectItem(Item);
Designer.Modified;
ActivateInspector(#0);
DrawGrid.Row := I + 1;
except
Item.Free;
raise;
end
else
raise EJVCLException.Create(srEventNotCreate);
end;
procedure TJvTimerItemsEditor.CutClick(Sender: TObject);
begin
Cut;
UpdateData;
end;
procedure TJvTimerItemsEditor.CopyClick(Sender: TObject);
begin
Copy;
UpdateData;
end;
procedure TJvTimerItemsEditor.PasteClick(Sender: TObject);
begin
Paste;
UpdateData;
end;
procedure TJvTimerItemsEditor.Cut;
begin
Copy;
DeleteClick(Self);
end;
procedure TJvTimerItemsEditor.Copy;
var
CompList: TDesignerSelectionList;
Item: TJvTimerEvent;
begin
CompList := {$IFDEF COMPILER6_UP} TDesignerSelections {$ELSE} TDesignerSelectionList {$ENDIF}.Create;
{$IFNDEF COMPILER6_UP}
try
{$ENDIF}
Item := ItemByRow(DrawGrid.Row - 1);
if Item <> nil then
begin
CompList.Add(Item);
CopyComponents(OwnerForm, CompList);
end;
{$IFNDEF COMPILER6_UP}
finally
CompList.Free;
end;
{$ENDIF}
end;
procedure TJvTimerItemsEditor.Paste;
var
CompList: TDesignerSelectionList;
begin
if CheckCollection then
begin
CompList := {$IFDEF COMPILER6_UP} TDesignerSelections {$ELSE} TDesignerSelectionList {$ENDIF}.Create;
{$IFNDEF COMPILER6_UP}
try
{$ENDIF}
PasteComponents(OwnerForm, TimersCollection, CompList);
UpdateData;
{$IFNDEF COMPILER6_UP}
finally
CompList.Free;
end;
{$ENDIF}
end;
end;
procedure TJvTimerItemsEditor.ClearBtnClick(Sender: TObject);
var
Item: TJvTimerEvent;
begin
while TimersCollection.Events.Count > 0 do
begin
Item := TJvTimerEvent(TimersCollection.Events[0]);
if Item <> nil then
{$IFDEF COMPILER6_UP} TCustomForm(Designer.Root).Designer {$ELSE} Designer {$ENDIF}.ValidateRename(Item,
Item.Name, '');
TimersCollection.Events.Delete(0);
Item.Free;
end;
UpdateData;
end;
end.