ProjectGroups: open Drop-Down-Button

This commit is contained in:
Ondrej Pokorny 2024-06-10 13:51:55 +02:00
parent 1b1dd07d55
commit c695f895ea
20 changed files with 278 additions and 68 deletions

View File

@ -15,6 +15,9 @@ pg_new_200.png
pg_open.png
pg_open_150.png
pg_open_200.png
pg_open_simple.png
pg_open_simple_150.png
pg_open_simple_200.png
pg_open_recent.png
pg_open_recent_150.png
pg_open_recent_200.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

View File

@ -324,6 +324,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Neue Projektgruppe"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Öffnen"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Neu laden"
@ -499,6 +509,7 @@ msgid "Open Target"
msgstr "Ziel öffnen"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Öffnen"

View File

@ -311,6 +311,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Nouveau groupe de projets"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Ouvrir"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Recharger"
@ -484,6 +494,7 @@ msgid "Open Target"
msgstr "Ouvrir la cible"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Ouvrir"

View File

@ -311,6 +311,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Új projektcsoport"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Megnyitás"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Újratöltés"
@ -484,6 +494,7 @@ msgid "Open Target"
msgstr "Cél megnyitása"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Megnyitás"

View File

@ -319,6 +319,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Nuovo gruppo di progetti"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Apri"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Ricarica"
@ -498,6 +508,7 @@ msgid "Open Target"
msgstr "Apri destinazione"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Apri"

View File

@ -324,6 +324,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Nauja projekto grupė"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Atverti"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Įkelti iš naujo"
@ -499,6 +509,7 @@ msgid "Open Target"
msgstr "Atverti tikslą"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Atverti"

View File

@ -296,6 +296,15 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupopencaption
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr ""
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr ""
@ -469,6 +478,7 @@ msgid "Open Target"
msgstr ""
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr ""

View File

@ -311,6 +311,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Novo grupo de projeto"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Abrir"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Recarregar"
@ -484,6 +494,7 @@ msgid "Open Target"
msgstr "Abrir Alvo"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Abrir"

View File

@ -311,6 +311,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Новая группа проектов"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Открыть"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Перезагрузить"
@ -484,6 +494,7 @@ msgid "Open Target"
msgstr "Открыть цель"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Открыть"

View File

@ -309,6 +309,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Nová skupina projektov"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Otvoriť"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Znovu načítať"
@ -482,6 +492,7 @@ msgid "Open Target"
msgstr "Otvoriť cieľ"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Otvoriť"

View File

@ -311,6 +311,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Yeni proje grubu"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Aç"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Tekrar yükle"
@ -484,6 +494,7 @@ msgid "Open Target"
msgstr "Hedefi Aç"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Aç"

View File

@ -313,6 +313,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "Нова група проєктів"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "Відкрити"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "Перезавантажити"
@ -486,6 +496,7 @@ msgid "Open Target"
msgstr "Відкрити ціль"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "Відкрити"

View File

@ -312,6 +312,16 @@ msgctxt "projectgroupstrconst.lisprojectgroupnewhint"
msgid "New project group"
msgstr "新建项目组"
#: projectgroupstrconst.lisprojectgroupopencaption
#, fuzzy
msgctxt "projectgroupstrconst.lisprojectgroupopencaption"
msgid "Open"
msgstr "打开"
#: projectgroupstrconst.lisprojectgroupopenhint
msgid "Open project group"
msgstr ""
#: projectgroupstrconst.lisprojectgroupreload
msgid "Reload"
msgstr "重新加载"
@ -485,6 +495,7 @@ msgid "Open Target"
msgstr "打开目标"
#: projectgroupstrconst.listargetopencaption
msgctxt "projectgroupstrconst.listargetopencaption"
msgid "Open"
msgstr "打开"

View File

@ -1,34 +1,40 @@
object ProjectGroupEditorForm: TProjectGroupEditorForm
Left = 190
Height = 448
Top = 198
Width = 808
Left = 331
Height = 358
Top = 393
Width = 646
BorderIcons = [biSystemMenu]
Caption = 'ProjectGroupEditorForm'
ClientHeight = 448
ClientWidth = 808
DesignTimePPI = 120
ClientHeight = 358
ClientWidth = 646
LCLVersion = '3.99.0.0'
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '2.3.0.0'
object TBProjectGroup: TToolBar
Left = 0
Height = 60
Height = 48
Top = 0
Width = 808
Width = 646
AutoSize = True
ButtonHeight = 58
ButtonWidth = 29
ButtonHeight = 46
ButtonWidth = 23
ShowCaptions = True
TabOrder = 0
object TBSave: TToolButton
object TBOpen: TToolButton
Left = 1
Top = 2
Action = AProjectGroupOpen
DropdownMenu = PopupMenuOpen
Style = tbsDropDown
end
object TBSave: TToolButton
Left = 50
Top = 2
Action = AProjectGroupSave
end
object TBAdd: TToolButton
Left = 127
Left = 150
Top = 2
Caption = 'Add'
DropdownMenu = PopupMenuAdd
@ -36,101 +42,100 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
Style = tbsButtonDrop
end
object TBNewTarget: TToolButton
Left = 41
Left = 82
Top = 2
Action = AProjectGroupAddNew
Visible = False
end
object TBDelete: TToolButton
Left = 177
Left = 190
Top = 2
Action = AProjectGroupDelete
end
object TBCompile: TToolButton
Left = 240
Left = 241
Top = 2
Action = ATargetCompile
end
object TBCompileClean: TToolButton
Left = 305
Left = 294
Top = 2
Action = ATargetCompileClean
end
object ToolButton1: TToolButton
Left = 411
Height = 8
Left = 380
Height = 46
Top = 2
Caption = 'ToolButton1'
Style = tbsSeparator
end
object TBTargetUp: TToolButton
Left = 484
Left = 439
Top = 2
Action = ATargetEarlier
end
object TBTargetLater: TToolButton
Left = 535
Left = 479
Top = 2
Action = ATargetLater
end
object TBMore: TToolButton
Left = 633
Left = 557
Top = 2
Caption = 'More...'
DropdownMenu = PopupMenuMore
Style = tbsButtonDrop
end
object TBActivate: TToolButton
Left = 421
Left = 388
Top = 2
Action = ATargetActivate
Visible = False
end
object TBReload: TToolButton
Left = 577
Left = 513
Top = 2
Action = AProjectGroupReload
end
end
object TVPG: TTreeView
Left = 0
Height = 359
Top = 60
Width = 808
Height = 287
Top = 48
Width = 646
Align = alClient
HideSelection = False
PopupMenu = PopupMenuTree
ReadOnly = True
RightClickSelect = True
ShowSeparators = False
TabOrder = 1
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
OnAdvancedCustomDrawItem = TVPGAdvancedCustomDrawItem
OnDblClick = TVPGDblClick
OnKeyDown = TVPGKeyDown
OnMouseDown = TVPGMouseDown
OnSelectionChanged = TVPGSelectionChanged
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
object SBPG: TStatusBar
Left = 0
Height = 29
Top = 419
Width = 808
Height = 23
Top = 335
Width = 646
Panels = <
item
Text = '0 targets'
Width = 106
Width = 85
end
item
Text = 'Current target: '
Width = 62
Width = 50
end>
SimplePanel = False
end
object PopupMenuMore: TPopupMenu
OnPopup = PopupMenuMorePopup
Left = 260
Top = 120
Left = 208
Top = 96
object PMINew: TMenuItem
Action = AProjectGroupNew
end
@ -187,29 +192,8 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
end
end
object ActionListMain: TActionList
Left = 60
Top = 190
object AProjectGroupSave: TAction
Category = 'ProjectGroupActions'
Caption = 'Save'
ImageIndex = 7
OnExecute = AProjectGroupSaveExecute
OnUpdate = AProjectGroupSaveUpdate
end
object AProjectGroupSaveAs: TAction
Category = 'ProjectGroupActions'
Caption = 'Save As'
ImageIndex = 21
OnExecute = AProjectGroupSaveAsExecute
OnUpdate = AProjectGroupSaveAsUpdate
end
object AProjectGroupAddExisting: TAction
Category = 'ProjectGroupActions'
Caption = 'Add from file'
ImageIndex = 8
OnExecute = AProjectGroupAddExistingExecute
OnUpdate = AProjectGroupAddExistingUpdate
end
Left = 48
Top = 152
object ATargetEarlier: TAction
Category = 'TargetAction'
Caption = 'Earlier'
@ -294,6 +278,32 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
Caption = 'Info'
OnExecute = ATargetInfoExecute
end
object AProjectGroupOpen: TAction
Category = 'ProjectGroupActions'
Caption = 'Open'
OnExecute = AProjectGroupOpenExecute
end
object AProjectGroupSave: TAction
Category = 'ProjectGroupActions'
Caption = 'Save'
ImageIndex = 7
OnExecute = AProjectGroupSaveExecute
OnUpdate = AProjectGroupSaveUpdate
end
object AProjectGroupSaveAs: TAction
Category = 'ProjectGroupActions'
Caption = 'Save As'
ImageIndex = 21
OnExecute = AProjectGroupSaveAsExecute
OnUpdate = AProjectGroupSaveAsUpdate
end
object AProjectGroupAddExisting: TAction
Category = 'ProjectGroupActions'
Caption = 'Add from file'
ImageIndex = 8
OnExecute = AProjectGroupAddExistingExecute
OnUpdate = AProjectGroupAddExistingUpdate
end
object AProjectGroupAddCurrent: TAction
Category = 'ProjectGroupActions'
Caption = 'Add current project'
@ -351,8 +361,8 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
end
end
object PopupMenuTree: TPopupMenu
Left = 260
Top = 190
Left = 208
Top = 152
object PMICopyFilenameMenuItem: TMenuItem
Action = ATargetCopyFilename
end
@ -638,12 +648,12 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
end
object OpenDialogTarget: TOpenDialog
Options = [ofAllowMultiSelect, ofFileMustExist, ofEnableSizing, ofViewDetail]
Left = 60
Top = 120
Left = 48
Top = 96
end
object PopupMenuAdd: TPopupMenu
Left = 150
Top = 66
Left = 120
Top = 53
object PMIAddExisting: TMenuItem
Action = AProjectGroupAddExisting
end
@ -656,7 +666,12 @@ object ProjectGroupEditorForm: TProjectGroupEditorForm
end
object SelectDirectoryDialog: TSelectDirectoryDialog
Options = [ofAllowMultiSelect, ofFileMustExist, ofEnableSizing, ofViewDetail]
Left = 150
Top = 250
Left = 120
Top = 200
end
object PopupMenuOpen: TPopupMenu
OnPopup = PopupMenuOpenPopup
Left = 24
Top = 64
end
end

View File

@ -51,6 +51,7 @@ type
{ TProjectGroupEditorForm }
TProjectGroupEditorForm = class(TForm)
AProjectGroupOpen: TAction;
AProjectGroupAddAll: TAction;
AProjectGroupNew: TAction;
AProjectGroupAddCurrent: TAction;
@ -98,6 +99,7 @@ type
PMICompile: TMenuItem;
OpenDialogTarget: TOpenDialog;
PopupMenuAdd: TPopupMenu;
PopupMenuOpen: TPopupMenu;
PopupMenuMore: TPopupMenu;
PopupMenuTree: TPopupMenu;
SBPG: TStatusBar;
@ -109,6 +111,7 @@ type
TBDelete: TToolButton;
TBCompile: TToolButton;
TBCompileClean: TToolButton;
TBOpen: TToolButton;
ToolButton1: TToolButton;
TBTargetUp: TToolButton;
TBTargetLater: TToolButton;
@ -125,6 +128,7 @@ type
procedure AProjectGroupDeleteExecute(Sender: TObject);
procedure AProjectGroupDeleteUpdate(Sender: TObject);
procedure AProjectGroupNewExecute(Sender: TObject);
procedure AProjectGroupOpenExecute(Sender: TObject);
procedure AProjectGroupOptionsExecute(Sender: TObject);
procedure AProjectGroupRedoExecute(Sender: TObject);
procedure AProjectGroupRedoUpdate(Sender: TObject);
@ -164,6 +168,7 @@ type
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PopupMenuMorePopup(Sender: TObject);
procedure PopupMenuOpenPopup(Sender: TObject);
procedure TVPGAdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; {%H-}State: TCustomDrawState; Stage: TCustomDrawStage;
var {%H-}PaintImages, {%H-}DefaultDraw: Boolean);
@ -256,6 +261,8 @@ type
function SelectedNodeType: TPGCompileTarget;
procedure UpdateIDEMenuCommandFromAction(Sender: TObject; Item: TIDEMenuCommand);
procedure UpdateStatusBarTargetCount;
procedure UpdateRecentProjectGroupMenu;
procedure DoOpenRecentClick(Sender: TObject);
protected
procedure Localize;
procedure ShowProjectGroup;
@ -418,6 +425,7 @@ procedure TProjectGroupEditorForm.Localize;
end;
begin
ConfigAction(AProjectGroupOpen,'pg_open_simple',lisProjectGroupOpenCaption,lisProjectGroupOpenHint,Nil);
ConfigAction(AProjectGroupSave,'pg_save_simple',lisProjectGroupSaveCaption,lisProjectGroupSaveHint,Nil);
ConfigAction(AProjectGroupSaveAs,'pg_save_as_simple',lisProjectGroupSaveAsCaption,lisProjectGroupSaveAsHint,Nil);
ConfigAction(AProjectGroupNew,'pg_new',lisProjectGroupNewCaption,lisProjectGroupNewHint,Nil);
@ -659,6 +667,11 @@ begin
PMIRunMenuItem.Visible:=taRun in AllowedActions;
end;
procedure TProjectGroupEditorForm.PopupMenuOpenPopup(Sender: TObject);
begin
UpdateRecentProjectGroupMenu;
end;
procedure TProjectGroupEditorForm.TVPGAdvancedCustomDrawItem(
Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
@ -766,6 +779,12 @@ begin
TBTargetLater.Click;
Key := 0;
end;
Ord('O'):
if Shift=[ssCtrl] then
begin
TBOpen.Click;
Key := 0;
end;
Ord('S'):
begin
if Shift=[ssCtrl] then
@ -1138,6 +1157,11 @@ begin
IDEProjectGroupManager.DoNewClick(Sender);
end;
procedure TProjectGroupEditorForm.AProjectGroupOpenExecute(Sender: TObject);
begin
IDEProjectGroupManager.DoOpenClick(Sender);
end;
procedure TProjectGroupEditorForm.AProjectGroupOptionsExecute(Sender: TObject);
begin
LazarusIDE.DoOpenIDEOptions(TProjGrpOptionsFrame);
@ -1582,6 +1606,17 @@ begin
Result:=DisplayFileName(TNodeData(Node.Data));
end;
procedure TProjectGroupEditorForm.DoOpenRecentClick(Sender: TObject);
var
Item: TMenuItem;
aFilename: String;
begin
Item:=Sender as TMenuItem;
aFilename:=Item.Caption;
//debugln(['TProjectGroupEditorForm.DoOpenRecentClick ',aFilename]);
IDEProjectGroupManager.LoadProjectGroup(aFilename,[pgloBringToFront, pgloLoadRecursively]);
end;
function TProjectGroupEditorForm.DisplayFileName(NodeData: TNodeData): string;
begin
if NodeData=nil then exit('');
@ -1709,6 +1744,30 @@ begin
end;
end;
procedure TProjectGroupEditorForm.UpdateRecentProjectGroupMenu;
var
i: Integer;
Item: TMenuItem;
aFilename: String;
begin
i:=0;
while i<IDEProjectGroupManager.Options.RecentProjectGroups.Count do begin
aFilename:=IDEProjectGroupManager.Options.RecentProjectGroups[i];
if i<PopupMenuOpen.Items.Count then begin
Item:=PopupMenuOpen.Items[i];
end
else begin
Item:=TMenuItem.Create(Self);
PopupMenuOpen.Items.Add(Item);
Item.OnClick:=@DoOpenRecentClick;
end;
Item.Caption:=aFilename;
inc(i);
end;
while i<PopupMenuOpen.Items.Count do
PopupMenuOpen.Items[i].Free;
end;
procedure TProjectGroupEditorForm.FillProjectGroupNode(TVNode: TTreeNode;
AProjectGroup: TProjectGroup);
Const

View File

@ -61,6 +61,8 @@ Resourcestring
lisTargetCount = '%d targets';
lisActiveTarget = 'Target: %s';
lisProjectGroupOpenCaption = 'Open';
lisProjectGroupOpenHint = 'Open project group';
lisProjectGroupSaveCaption = 'Save';
lisProjectGroupSaveHint = 'Save project group';
lisProjectGroupSaveAsCaption = 'Save As ...';