586 lines
15 KiB
ObjectPascal
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.
|
|
|