Componentes.Terceros.jcl/official/1.96/experts/versioncontrol/JclVersionCtrlCommonOptions.pas

577 lines
20 KiB
ObjectPascal

{**************************************************************************************************}
{ }
{ Project JEDI Code Library (JCL) }
{ }
{ 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/ }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF }
{ ANY KIND, either express or implied. See the License for the specific language governing rights }
{ and limitations under the License. }
{ }
{ The Original Code is JclVersionCtrlCommonOptions.pas }
{ }
{ The Initial Developer of the Original Code is Florent Ouchet. }
{ Portions created by Florent Ouchet are Copyright (C) of Florent Ouchet. }
{ }
{ }
{**************************************************************************************************}
{ }
{ Unit owner: Florent Ouchet }
{ Last modified: $Date: 2006/01/15 20:58:03 $ }
{ Revision: $Revision: 1.2 $ }
{ }
{**************************************************************************************************}
unit JclVersionCtrlCommonOptions;
{$I jcl.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ActnList, Menus;
type
TJclVersionCtrlOptionsFrame = class(TFrame)
CheckBoxHideActions: TCheckBox;
LabelIcons: TLabel;
ComboBoxIcons: TComboBox;
TreeViewMenu: TTreeView;
LabelMenuOrganization: TLabel;
CheckBoxDisableActions: TCheckBox;
ButtonNewSeparator: TButton;
ButtonDelete: TButton;
ButtonRename: TButton;
ButtonMoveUp: TButton;
ButtonMoveDown: TButton;
ActionListVersionCtrl: TActionList;
ActionNewSeparator: TAction;
ActionDeleteItem: TAction;
ActionRenameItem: TAction;
ActionMoveItemUp: TAction;
ActionMoveItemDown: TAction;
CheckBoxSaveConfirmation: TCheckBox;
PopupMenuActions: TPopupMenu;
ActionNewAction: TAction;
ButtonNewAction: TButton;
ActionNewSubMenu: TAction;
ButtonNewSubMenu: TButton;
CheckBoxActOnTopSandbox: TCheckBox;
procedure ActionActOnTopSandboxUpdate(Sender: TObject);
procedure ActionNewActionExecute(Sender: TObject);
procedure ActionNewActionUpdate(Sender: TObject);
procedure ActionRenameItemExecute(Sender: TObject);
procedure ActionNewSubMenuExecute(Sender: TObject);
procedure ActionNewSubMenuUpdate(Sender: TObject);
procedure ActionNewSeparatorExecute(Sender: TObject);
procedure ActionMoveItemUpExecute(Sender: TObject);
procedure ActionMoveItemDownExecute(Sender: TObject);
procedure ActionDeleteItemExecute(Sender: TObject);
procedure ActionSaveConfirmationUpdate(Sender: TObject);
procedure ActionRenameItemUpdate(Sender: TObject);
procedure ActionNewSeparatorUpdate(Sender: TObject);
procedure ActionMoveItemUpUpdate(Sender: TObject);
procedure ActionMoveItemDownUpdate(Sender: TObject);
procedure ActionHideUnSupportedActionsUpdate(Sender: TObject);
procedure ActionDisableActionsUpdate(Sender: TObject);
procedure ActionDeleteItemUpdate(Sender: TObject);
procedure TreeViewMenuEditing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
procedure TreeViewMenuEdited(Sender: TObject; Node: TTreeNode; var S: string);
private
FMenuTree: TStrings;
function GetActOnTopSandbox: Boolean;
procedure SetActOnTopSandbox(const Value: Boolean);
function GetSaveConfirmation: Boolean;
procedure SetSaveConfirmation(const Value: Boolean);
function GetDisableActions: Boolean;
function GetHideActions: Boolean;
function GetIconType: Integer;
function GetMenuTree: TStrings;
procedure SetDisableActions(const Value: Boolean);
procedure SetHideActions(const Value: Boolean);
procedure SetIconType(const Value: Integer);
procedure SetMenuTree(const Value: TStrings);
procedure MenuItemNewActionClick(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetIconTypeNames(const Names: TStrings);
procedure SetActions(const Actions: array of TCustomAction);
property ActOnTopSandbox: Boolean read GetActOnTopSandbox write SetActOnTopSandbox;
property DisableActions: Boolean read GetDisableActions write SetDisableActions;
property HideActions: Boolean read GetHideActions write SetHideActions;
property IconType: Integer read GetIconType write SetIconType;
property MenuTree: TStrings read GetMenuTree write SetMenuTree;
property SaveConfirmation: Boolean read GetSaveConfirmation write SetSaveConfirmation;
end;
implementation
{$R *.dfm}
uses
TypInfo, ToolsAPI,
JclStrings,
JclOtaUtils, JclOtaResources, VersionControlImpl;
resourcestring
RsEInvalidMenuCaption = 'Menu caption cannot contain \, _ and numbers';
RsDisableActions = '&Enable/disable actions';
RsHideUnsupportedActions = '&Hide unsupported actions';
RsSaveConfirmation = '&Save confirmation';
RsActOnTopSandBox = '&Act on top sandbox';
RsIcons = '&Icons:';
RsNewItem = 'New item';
RsNewSeparator = 'New &separator';
RsNewSubMenu = 'New s&ub menu';
RsNewAction = 'New &action';
RsDeleteItem = '&Delete';
RsRenameItem = '&Rename';
RsMoveItemUp = 'Move &up';
RsMoveItemDown = 'Move &down';
RsMenuOrganization = 'Menu &organization:';
RsNoIcon = 'No icon';
RsJCLIcons = 'JCL icons';
RsAutoIcons = 'Automatic';
//=== TJclVersionCtrlOptionsFrame ============================================
procedure TJclVersionCtrlOptionsFrame.ActionActOnTopSandboxUpdate(
Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
procedure TJclVersionCtrlOptionsFrame.ActionDeleteItemExecute(Sender: TObject);
var
ATreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) then
ATreeNode.Delete;
end;
procedure TJclVersionCtrlOptionsFrame.ActionDeleteItemUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := Assigned(TreeViewMenu.Selected);
end;
procedure TJclVersionCtrlOptionsFrame.ActionDisableActionsUpdate(
Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
procedure TJclVersionCtrlOptionsFrame.ActionHideUnSupportedActionsUpdate(
Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
procedure TJclVersionCtrlOptionsFrame.ActionMoveItemDownExecute(
Sender: TObject);
var
ATreeNode, BTreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
BTreeNode := ATreeNode.getNextSibling;
if Assigned(BTreeNode) then
BTreeNode.MoveTo(ATreeNode, naInsert);
end;
procedure TJclVersionCtrlOptionsFrame.ActionMoveItemDownUpdate(Sender: TObject);
var
ATreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) then
ATreeNode := ATreeNode.getNextSibling;
TAction(Sender).Enabled := Assigned(ATreeNode);
end;
procedure TJclVersionCtrlOptionsFrame.ActionMoveItemUpExecute(Sender: TObject);
var
ATreeNode, BTreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
BTreeNode := ATreeNode.getPrevSibling;
ATreeNode.MoveTo(BTreeNode, naInsert);
end;
procedure TJclVersionCtrlOptionsFrame.ActionMoveItemUpUpdate(Sender: TObject);
var
ATreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) then
ATreeNode := ATreeNode.getPrevSibling;
TAction(Sender).Enabled := Assigned(ATreeNode);
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewActionExecute(Sender: TObject);
var
APoint: TPoint;
begin
APoint.X := 0;
APoint.Y := ButtonNewAction.Height;
APoint := ButtonNewAction.ClientToScreen(APoint);
PopupMenuActions.Popup(APoint.X, APoint.Y);
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewActionUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewSubMenuExecute(
Sender: TObject);
var
ATreeNode, NewTreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) and Assigned(ATreeNode.Parent) then
ATreeNode := ATreeNode.Parent;
if Assigned(ATreeNode) and (ATreeNode.getNextSibling <> nil) then
NewTreeNode := TreeViewMenu.Items.Insert(ATreeNode.getNextSibling, RsNewItem)
else
NewTreeNode := TreeViewMenu.Items.Add(ATreeNode, RsNewItem);
NewTreeNode.ImageIndex := -1;
NewTreeNode.SelectedIndex := -1;
NewTreeNode.Data := nil;
NewTreeNode.EditText;
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewSubMenuUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewSeparatorExecute(Sender: TObject);
var
ATreeNode, NewTreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) and (ATreeNode.getNextSibling <> nil) then
NewTreeNode := TreeViewMenu.Items.Insert(ATreeNode.getNextSibling, '-')
else
NewTreeNode := TreeViewMenu.Items.Add(ATreeNode, '-');
NewTreeNode.ImageIndex := -1;
NewTreeNode.SelectedIndex := -1;
NewTreeNode.Data := nil;
end;
procedure TJclVersionCtrlOptionsFrame.ActionNewSeparatorUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := Assigned(TreeViewMenu.Selected);
end;
procedure TJclVersionCtrlOptionsFrame.ActionRenameItemExecute(Sender: TObject);
var
ATreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode) then
ATreeNode.EditText;
end;
procedure TJclVersionCtrlOptionsFrame.ActionRenameItemUpdate(Sender: TObject);
var
ATreeNode: TTreeNode;
begin
ATreeNode := TreeViewMenu.Selected;
TAction(Sender).Enabled := Assigned(ATreeNode) and (ATreeNode.Text <> '-')
and not Assigned(ATreeNode.Data);
end;
procedure TJclVersionCtrlOptionsFrame.ActionSaveConfirmationUpdate(
Sender: TObject);
begin
TAction(Sender).Enabled := True;
end;
constructor TJclVersionCtrlOptionsFrame.Create(AOwner: TComponent);
var
NTAServices: INTAServices;
begin
inherited Create(AOwner);
FMenuTree := TStringList.Create;
Supports(BorlandIDEServices, INTAServices, NTAServices);
if not Assigned(NTAServices) then
raise EJclExpertException.CreateTrace(RsENoNTAServices);
TreeViewMenu.Images := NTAServices.ImageList;
PopupMenuActions.Images := NTAServices.ImageList;
CheckBoxActOnTopSandbox.Caption := RsActOnTopSandBox;
CheckBoxDisableActions.Caption := RsDisableActions;
CheckBoxHideActions.Caption := RsHideUnsupportedActions;
CheckBoxSaveConfirmation.Caption := RsSaveConfirmation;
ActionNewSubMenu.Caption := RsNewSubMenu;
ActionNewSeparator.Caption := RsNewSeparator;
ActionNewAction.Caption := RsNewAction;
ActionDeleteItem.Caption := RsDeleteItem;
ActionRenameItem.Caption := RsRenameItem;
ActionMoveItemUp.Caption := RsMoveItemUp;
ActionMoveItemDown.Caption := RsMoveItemDown;
LabelIcons.Caption := RsIcons;
LabelMenuOrganization.Caption := RsMenuOrganization;
ComboBoxIcons.Items.Strings[0] := RsNoIcon;
ComboBoxIcons.Items.Strings[1] := RsJCLIcons;
ComboBoxIcons.Items.Strings[2] := RsAutoIcons;
end;
destructor TJclVersionCtrlOptionsFrame.Destroy;
begin
FMenuTree.Free;
inherited Destroy;
end;
function TJclVersionCtrlOptionsFrame.GetActOnTopSandbox: Boolean;
begin
Result := CheckBoxActOnTopSandbox.Checked;
end;
function TJclVersionCtrlOptionsFrame.GetDisableActions: Boolean;
begin
Result := CheckBoxDisableActions.Checked;
end;
function TJclVersionCtrlOptionsFrame.GetHideActions: Boolean;
begin
Result := CheckBoxHideActions.Checked;
end;
function TJclVersionCtrlOptionsFrame.GetIconType: Integer;
begin
Result := ComboBoxIcons.ItemIndex - 3;
end;
function TJclVersionCtrlOptionsFrame.GetMenuTree: TStrings;
var
ATreeNode, BTreeNode: TTreeNode;
ItemName: string;
AAction: TCustomAction;
Index: Integer;
begin
FMenuTree.Clear;
ATreeNode := TreeViewMenu.Items.GetFirstNode;
while Assigned(ATreeNode) do
begin
AAction := TCustomAction(ATreeNode.Data);
ItemName := '';
if Assigned(AAction) then
for Index := 0 to PopupMenuActions.Items.Count - 1 do
if TCustomAction(PopupMenuActions.Items.Items[Index].Tag) = AAction then
ItemName := GetEnumName(TypeInfo(TJclVersionControlAction), Index);
if ItemName = '' then
ItemName := ATreeNode.Text;
FMenuTree.Add(Format('%d%s', [ATreeNode.Index, ItemName]));
BTreeNode := ATreeNode.getFirstChild;
while Assigned(BTreeNode) do
begin
AAction := TCustomAction(BTreeNode.Data);
ItemName := '';
if Assigned(AAction) then
for Index := 0 to PopupMenuActions.Items.Count - 1 do
if TCustomAction(PopupMenuActions.Items.Items[Index].Tag) = AAction then
ItemName := GetEnumName(TypeInfo(TJclVersionControlAction), Index);
if ItemName = '' then
ItemName := BTreeNode.Text;
FMenuTree.Add(Format('%d%s%d', [ATreeNode.Index, ItemName, BTreeNode.Index]));
BTreeNode := BTreeNode.getNextSibling;
end;
ATreeNode := ATreeNode.getNextSibling;
end;
Result := FMenuTree;
end;
function TJclVersionCtrlOptionsFrame.GetSaveConfirmation: Boolean;
begin
Result := CheckBoxSaveConfirmation.Checked;
end;
procedure TJclVersionCtrlOptionsFrame.MenuItemNewActionClick(Sender: TObject);
var
AAction: TCustomAction;
ATreeNode, NewTreeNode: TTreeNode;
begin
AAction := TCustomAction((Sender as TMenuItem).Tag);
ATreeNode := TreeViewMenu.Selected;
if Assigned(ATreeNode.Data) or (ATreeNode.Text = '-') then
begin
if Assigned(ATreeNode) and (ATreeNode.getNextSibling <> nil) then
NewTreeNode := TreeViewMenu.Items.Insert(ATreeNode.getNextSibling, AAction.Caption)
else
NewTreeNode := TreeViewMenu.Items.Add(ATreeNode, AAction.Caption);
end
else
begin
NewTreeNode := TreeViewMenu.Items.AddChildFirst(ATreeNode, AAction.Caption);
ATreeNode.Expand(False);
end;
NewTreeNode.Data := AAction;
NewTreeNode.ImageIndex := AAction.ImageIndex;
NewTreeNode.SelectedIndex := AAction.ImageIndex;
end;
procedure TJclVersionCtrlOptionsFrame.SetActions(
const Actions: array of TCustomAction);
var
Index: Integer;
AMenuItem: TMenuItem;
begin
for Index := Low(Actions) to High(Actions) do
begin
AMenuItem := TMenuItem.Create(Self);
AMenuItem.Tag := Integer(Actions[Index]);
AMenuItem.Caption := Actions[Index].Caption;
AMenuItem.ImageIndex := Actions[Index].ImageIndex;
AMenuItem.OnClick := MenuItemNewActionClick;
PopupMenuActions.Items.Add(AMenuItem);
end;
end;
procedure TJclVersionCtrlOptionsFrame.SetActOnTopSandbox(const Value: Boolean);
begin
CheckBoxActOnTopSandbox.Checked := Value;
end;
procedure TJclVersionCtrlOptionsFrame.SetDisableActions(const Value: Boolean);
begin
CheckBoxDisableActions.Checked := Value;
end;
procedure TJclVersionCtrlOptionsFrame.SetHideActions(const Value: Boolean);
begin
CheckBoxHideActions.Checked := Value;
end;
procedure TJclVersionCtrlOptionsFrame.SetIconType(const Value: Integer);
begin
ComboBoxIcons.ItemIndex := Value + 3;
end;
procedure TJclVersionCtrlOptionsFrame.SetIconTypeNames(const Names: TStrings);
var
Index: Integer;
begin
for Index := ComboBoxIcons.Items.Count - 1 downto 3 do
ComboBoxIcons.Items.Delete(Index);
ComboBoxIcons.Items.AddStrings(Names);
end;
procedure TJclVersionCtrlOptionsFrame.SetMenuTree(const Value: TStrings);
var
ATreeNode, BTreeNode: TTreeNode;
Index, IndexB: Integer;
Item, ItemName: string;
AAction: Integer;
ControlAction: TCustomAction;
begin
TreeViewMenu.Items.Clear;
ATreeNode := nil;
for Index := 0 to Value.Count - 1 do
begin
Item := Value.Strings[Index];
IndexB := GetItemIndexB(Item);
ItemName := GetItemName(Item);
AAction := GetEnumValue(TypeInfo(TJclVersionControlAction), ItemName);
if IndexB = -1 then
begin
if (AAction = -1) or (ItemName = '-') then
begin
ATreeNode := TreeViewMenu.Items.Add(nil, ItemName);
ATreeNode.ImageIndex := -1;
ATreeNode.SelectedIndex := -1;
ATreeNode.Data := nil;
end
else
begin
ControlAction := TCustomAction(PopupMenuActions.Items.Items[AAction].Tag);
ATreeNode := TreeViewMenu.Items.Add(nil, StrRemoveChars(ControlAction.Caption, ['&']));
ATreeNode.Data := ControlAction;
ATreeNode.ImageIndex := ControlAction.ImageIndex;
ATreeNode.SelectedIndex := ControlAction.ImageIndex;
ATreeNode := nil;
end;
end
else
begin
if not Assigned(ATreeNode) then
Abort;
if (AAction = -1) or (ItemName = '-') then
begin
BTreeNode := TreeViewMenu.Items.AddChild(ATreeNode, ItemName);
BTreeNode.ImageIndex := -1;
BTreeNode.SelectedIndex := -1;
BTreeNode.Data := nil;
end
else
begin
ControlAction := TCustomAction(PopupMenuActions.Items.Items[AAction].Tag);
BTreeNode := TreeViewMenu.Items.AddChild(ATreeNode, StrRemoveChars(ControlAction.Caption, ['&']));
BTreeNode.ImageIndex := ControlAction.ImageIndex;
BTreeNode.SelectedIndex := ControlAction.ImageIndex;
BTreeNode.Data := ControlAction;
end;
ATreeNode.Expand(False);
end;
end;
end;
procedure TJclVersionCtrlOptionsFrame.SetSaveConfirmation(const Value: Boolean);
begin
CheckBoxSaveConfirmation.Checked := Value;
end;
procedure TJclVersionCtrlOptionsFrame.TreeViewMenuEdited(Sender: TObject;
Node: TTreeNode; var S: string);
begin
if StrContainsChars(S, ['\', '_', '0'..'9'], True) then
begin
S := Node.Text;
MessageDlg(RsEInvalidMenuCaption, mtError, [mbAbort], 0);
end;
end;
procedure TJclVersionCtrlOptionsFrame.TreeViewMenuEditing(Sender: TObject;
Node: TTreeNode; var AllowEdit: Boolean);
begin
AllowEdit := Assigned(Node) and (Node.Text <> '-') and not Assigned(Node.Data);
end;
// History:
// $Log: JclVersionCtrlCommonOptions.pas,v $
// Revision 1.2 2006/01/15 20:58:03 outchy
// Delphi 5 support: no TCustomAction.AutoCheck property
// Removed unused resources
//
// Revision 1.1 2006/01/15 00:51:22 outchy
// cvs support in version control expert
// version control expert integration in the installer
//
end.