unit msmCurrentElementSynchronizeBinding; // Модуль: "w:\common\components\gui\Garant\msm\msmCurrentElementSynchronizeBinding.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmCurrentElementSynchronizeBinding" MUID: (57D1737F03CB) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmListToListBinding , msmEvents ; type TmsmCurrentElementSynchronizeBinding = class(TmsmListToListBinding) protected procedure DoCurrentElementChangedEvent(anEvent: TmsmEvent); procedure LinkEventHandlers; override; end;//TmsmCurrentElementSynchronizeBinding implementation uses l3ImplUses , msmListAndTreeInterfaces //#UC START# *57D1737F03CBimpl_uses* //#UC END# *57D1737F03CBimpl_uses* ; procedure TmsmCurrentElementSynchronizeBinding.DoCurrentElementChangedEvent(anEvent: TmsmEvent); //#UC START# *57D1737F03CB_57B31D1000FA_57D1737F03CB_var* //#UC END# *57D1737F03CB_57B31D1000FA_57D1737F03CB_var* begin //#UC START# *57D1737F03CB_57B31D1000FA_57D1737F03CB_impl* if (ModelToFire.CurrentElement = nil) then begin if (ModelToListen.CurrentElement <> nil) then ModelToFire.CurrentElement := ModelToListen.CurrentElement; end//ModelToFire.CurrentElement = nil else if not ModelToFire.CurrentElement.IsSameElementView(ModelToListen.CurrentElement) then ModelToFire.CurrentElement := ModelToListen.CurrentElement; //#UC END# *57D1737F03CB_57B31D1000FA_57D1737F03CB_impl* end;//TmsmCurrentElementSynchronizeBinding.DoCurrentElementChangedEvent procedure TmsmCurrentElementSynchronizeBinding.LinkEventHandlers; begin inherited; Self.LinkEventHandler(CurrentElementChangedEvent.Instance, DoCurrentElementChangedEvent); end;//TmsmCurrentElementSynchronizeBinding.LinkEventHandlers end.
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
понедельник, 31 октября 2016 г.
#1312. MVC. TmsmCurrentElementSynchronizeBinding. Только код
#1311. MVC. TmsmCurrentElementShowAsListBinding. Только код
unit msmCurrentElementShowAsListBinding; // Модуль: "w:\common\components\gui\Garant\msm\msmCurrentElementShowAsListBinding.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmCurrentElementShowAsListBinding" MUID: (57B2BA6D0104) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmListToListBinding , msmEvents ; type TmsmCurrentElementShowAsListBinding = class(TmsmListToListBinding) protected procedure DoCurrentElementChangedEvent(anEvent: TmsmEvent); procedure LinkEventHandlers; override; end;//TmsmCurrentElementShowAsListBinding implementation uses l3ImplUses , msmListAndTreeInterfaces //#UC START# *57B2BA6D0104impl_uses* //#UC END# *57B2BA6D0104impl_uses* ; procedure TmsmCurrentElementShowAsListBinding.DoCurrentElementChangedEvent(anEvent: TmsmEvent); //#UC START# *57B2BA6D0104_57B31D1000FA_57B2BA6D0104_var* //#UC END# *57B2BA6D0104_57B31D1000FA_57B2BA6D0104_var* begin //#UC START# *57B2BA6D0104_57B31D1000FA_57B2BA6D0104_impl* inherited; Self.ModelToFire.ShowElementAsList(Self.ModelToListen.CurrentElement); //#UC END# *57B2BA6D0104_57B31D1000FA_57B2BA6D0104_impl* end;//TmsmCurrentElementShowAsListBinding.DoCurrentElementChangedEvent procedure TmsmCurrentElementShowAsListBinding.LinkEventHandlers; begin inherited; Self.LinkEventHandler(CurrentElementChangedEvent.Instance, DoCurrentElementChangedEvent); end;//TmsmCurrentElementShowAsListBinding.LinkEventHandlers end.
#1310. MVC. TmsmViewController. Только код
unit msmViewController; // Модуль: "w:\common\components\gui\Garant\msm\msmViewController.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmViewController" MUID: (57AB0A810292) {$Include w:\common\components\msm.inc} interface uses l3IntfUses , msmController , msmControllers {$If NOT Defined(NoVCL)} , Menus {$IfEnd} // NOT Defined(NoVCL) , msmModels ; type TmsmViewController = class(TmsmController, ImsmViewController) private f_PopupMenu: TPopupMenu; f_View: TmsmView; protected procedure Cleanup; override; {* Функция очистки полей объекта. } procedure InitFields; override; procedure DoActivated; override; public constructor Create(aView: TmsmView; const aModel: ImsmModel); reintroduce; class function Make(aView: TmsmView; const aModel: ImsmModel): ImsmViewController; reintroduce; protected property View: TmsmView read f_View; end;//TmsmViewController implementation uses l3ImplUses , msmOperations , Classes {$If NOT Defined(NoScripts)} , TtfwClassRef_Proxy {$IfEnd} // NOT Defined(NoScripts) //#UC START# *57AB0A810292impl_uses* , SysUtils //#UC END# *57AB0A810292impl_uses* ; type TmsmOperationMenuItem = class({$If NOT Defined(NoVCL)} TMenuItem {$IfEnd} // NOT Defined(NoVCL) ) private f_Operation: ImsmOperation; protected {$If NOT Defined(NoVCL)} procedure Click; override; {$IfEnd} // NOT Defined(NoVCL) {$If NOT Defined(NoVCL)} procedure InitiateAction; override; {$IfEnd} // NOT Defined(NoVCL) public constructor Create(anOwner: TComponent; const anOperation: ImsmOperation); reintroduce; destructor Destroy; override; end;//TmsmOperationMenuItem TmsmViewFriend = {abstract} class(TmsmView) {* Друг к классу TmsmView } end;//TmsmViewFriend constructor TmsmOperationMenuItem.Create(anOwner: TComponent; const anOperation: ImsmOperation); //#UC START# *57CECAC202FB_57CECA080010_var* //#UC END# *57CECAC202FB_57CECA080010_var* begin //#UC START# *57CECAC202FB_57CECA080010_impl* Assert(anOperation <> nil); inherited Create(anOwner); f_Operation := anOperation; Self.Action := f_Operation.Action; //Self.Caption := anOperation.Caption; //#UC END# *57CECAC202FB_57CECA080010_impl* end;//TmsmOperationMenuItem.Create destructor TmsmOperationMenuItem.Destroy; //#UC START# *48077504027E_57CECA080010_var* //#UC END# *48077504027E_57CECA080010_var* begin //#UC START# *48077504027E_57CECA080010_impl* f_Operation := nil; inherited; //#UC END# *48077504027E_57CECA080010_impl* end;//TmsmOperationMenuItem.Destroy {$If NOT Defined(NoVCL)} procedure TmsmOperationMenuItem.Click; //#UC START# *57CECDB70264_57CECA080010_var* //#UC END# *57CECDB70264_57CECA080010_var* begin //#UC START# *57CECDB70264_57CECA080010_impl* inherited; //f_Operation.DoIt; //#UC END# *57CECDB70264_57CECA080010_impl* end;//TmsmOperationMenuItem.Click {$IfEnd} // NOT Defined(NoVCL) {$If NOT Defined(NoVCL)} procedure TmsmOperationMenuItem.InitiateAction; //#UC START# *57EB857E015E_57CECA080010_var* var l_Popup : Boolean; //#UC END# *57EB857E015E_57CECA080010_var* begin //#UC START# *57EB857E015E_57CECA080010_impl* l_Popup := (GetParentMenu Is TPopupMenu); inherited; // Не показываем в контекстном меню не доступные операции. Вызывать нужно // обязательно после inherited (Action.Update) когда состояние пункта меню // станет актуальным: if l_Popup then begin if Self.Enabled then Self.Visible := true else Self.Visible := false; end;//l_Popup //#UC END# *57EB857E015E_57CECA080010_impl* end;//TmsmOperationMenuItem.InitiateAction {$IfEnd} // NOT Defined(NoVCL) constructor TmsmViewController.Create(aView: TmsmView; const aModel: ImsmModel); //#UC START# *57AB0AD803AD_57AB0A810292_var* //#UC END# *57AB0AD803AD_57AB0A810292_var* begin //#UC START# *57AB0AD803AD_57AB0A810292_impl* Assert(aView <> nil); Assert(aModel <> nil); inherited Create(aModel); f_View := aView; //#UC END# *57AB0AD803AD_57AB0A810292_impl* end;//TmsmViewController.Create class function TmsmViewController.Make(aView: TmsmView; const aModel: ImsmModel): ImsmViewController; var l_Inst : TmsmViewController; begin l_Inst := Create(aView, aModel); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmViewController.Make procedure TmsmViewController.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57AB0A810292_var* //#UC END# *479731C50290_57AB0A810292_var* begin //#UC START# *479731C50290_57AB0A810292_impl* inherited; if (f_PopupMenu = TmsmViewFriend(View).PopupMenu) then TmsmViewFriend(View).PopupMenu := nil; FreeAndNil(f_PopupMenu); f_View := nil; //#UC END# *479731C50290_57AB0A810292_impl* end;//TmsmViewController.Cleanup procedure TmsmViewController.InitFields; //#UC START# *47A042E100E2_57AB0A810292_var* //#UC END# *47A042E100E2_57AB0A810292_var* begin //#UC START# *47A042E100E2_57AB0A810292_impl* inherited; //#UC END# *47A042E100E2_57AB0A810292_impl* end;//TmsmViewController.InitFields procedure TmsmViewController.DoActivated; //#UC START# *57CEC64E0063_57AB0A810292_var* var l_Item : TMenuItem; l_Index : Integer; //#UC END# *57CEC64E0063_57AB0A810292_var* begin //#UC START# *57CEC64E0063_57AB0A810292_impl* inherited; if not OperationsList.Empty then begin f_PopupMenu := TPopupMenu.Create(nil{View}); for l_Index := 0 to Pred(OperationsList.Count) do begin l_Item := TmsmOperationMenuItem.Create(f_PopupMenu, OperationsList[l_Index]); f_PopupMenu.Items.Add(l_Item); end;//for l_Index TmsmViewFriend(View).PopupMenu := f_PopupMenu; end;//not OperationsList.Empty //#UC END# *57CEC64E0063_57AB0A810292_impl* end;//TmsmViewController.DoActivated initialization {$If NOT Defined(NoScripts)} TtfwClassRef.Register(TmsmOperationMenuItem); {* Регистрация TmsmOperationMenuItem } {$IfEnd} // NOT Defined(NoScripts) end.
#1309. MVC. TmsmController. Только код
unit msmController; // Модуль: "w:\common\components\gui\Garant\msm\msmController.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmController" MUID: (57B1F28B030D) {$Include w:\common\components\msm.inc} interface uses l3IntfUses , l3ProtoObject , msmControllers , msmModels , msmEvents , msmOperations , msmOperationsList , msmEventList , msmEventHandlers ; type _msmOperationsManaging_Parent_ = Tl3ProtoObject; {$Include w:\common\components\gui\Garant\msm\msmOperationsManaging.imp.pas} _msmEventsSubscriber_Parent_ = _msmOperationsManaging_; {$Include w:\common\components\gui\Garant\msm\msmEventsSubscriber.imp.pas} TmsmController = class(_msmEventsSubscriber_, ImsmController) private f_Model: ImsmModel; protected procedure DoActivate; virtual; procedure LinkDataToView; virtual; procedure DoActivated; virtual; function As_ImsmEventsSubscriber: ImsmEventsSubscriber; {* Метод приведения нашего интерфейса к ImsmEventsSubscriber } function Get_Model: ImsmModel; function Publisher: ImsmEventsPublisher; override; procedure Cleanup; override; {* Функция очистки полей объекта. } procedure InitFields; override; procedure ClearFields; override; public constructor Create(const aModel: ImsmModel); reintroduce; class function Make(const aModel: ImsmModel): ImsmController; reintroduce; procedure Activate; procedure Activated; protected property Model: ImsmModel read f_Model; end;//TmsmController implementation uses l3ImplUses , SysUtils , msmNullOperationsList //#UC START# *57B1F28B030Dimpl_uses* //#UC END# *57B1F28B030Dimpl_uses* ; {$Include w:\common\components\gui\Garant\msm\msmOperationsManaging.imp.pas} {$Include w:\common\components\gui\Garant\msm\msmEventsSubscriber.imp.pas} procedure TmsmController.DoActivate; //#UC START# *57B1ABC80368_57B1F28B030D_var* //#UC END# *57B1ABC80368_57B1F28B030D_var* begin //#UC START# *57B1ABC80368_57B1F28B030D_impl* //#UC END# *57B1ABC80368_57B1F28B030D_impl* end;//TmsmController.DoActivate constructor TmsmController.Create(const aModel: ImsmModel); //#UC START# *57B1F34803E0_57B1F28B030D_var* //#UC END# *57B1F34803E0_57B1F28B030D_var* begin //#UC START# *57B1F34803E0_57B1F28B030D_impl* Assert(aModel <> nil); f_Model := aModel; inherited Create; //#UC END# *57B1F34803E0_57B1F28B030D_impl* end;//TmsmController.Create class function TmsmController.Make(const aModel: ImsmModel): ImsmController; var l_Inst : TmsmController; begin l_Inst := Create(aModel); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmController.Make procedure TmsmController.LinkDataToView; //#UC START# *57B6A49900F4_57B1F28B030D_var* //#UC END# *57B6A49900F4_57B1F28B030D_var* begin //#UC START# *57B6A49900F4_57B1F28B030D_impl* //#UC END# *57B6A49900F4_57B1F28B030D_impl* end;//TmsmController.LinkDataToView procedure TmsmController.DoActivated; //#UC START# *57CEC64E0063_57B1F28B030D_var* //#UC END# *57CEC64E0063_57B1F28B030D_var* begin //#UC START# *57CEC64E0063_57B1F28B030D_impl* //#UC END# *57CEC64E0063_57B1F28B030D_impl* end;//TmsmController.DoActivated function TmsmController.As_ImsmEventsSubscriber: ImsmEventsSubscriber; {* Метод приведения нашего интерфейса к ImsmEventsSubscriber } begin Result := Self; end;//TmsmController.As_ImsmEventsSubscriber function TmsmController.Get_Model: ImsmModel; //#UC START# *57ADBECA0388_57B1F28B030Dget_var* //#UC END# *57ADBECA0388_57B1F28B030Dget_var* begin //#UC START# *57ADBECA0388_57B1F28B030Dget_impl* Result := f_Model; //#UC END# *57ADBECA0388_57B1F28B030Dget_impl* end;//TmsmController.Get_Model procedure TmsmController.Activate; //#UC START# *57B1AB98014B_57B1F28B030D_var* //#UC END# *57B1AB98014B_57B1F28B030D_var* begin //#UC START# *57B1AB98014B_57B1F28B030D_impl* DoActivate; //#UC END# *57B1AB98014B_57B1F28B030D_impl* end;//TmsmController.Activate procedure TmsmController.Activated; //#UC START# *57B6A3EF0191_57B1F28B030D_var* //#UC END# *57B6A3EF0191_57B1F28B030D_var* begin //#UC START# *57B6A3EF0191_57B1F28B030D_impl* LinkDataToView; DoActivated; //#UC END# *57B6A3EF0191_57B1F28B030D_impl* end;//TmsmController.Activated function TmsmController.Publisher: ImsmEventsPublisher; //#UC START# *57B6B9CD03B7_57B1F28B030D_var* //#UC END# *57B6B9CD03B7_57B1F28B030D_var* begin //#UC START# *57B6B9CD03B7_57B1F28B030D_impl* Result := Model.As_ImsmEventsPublisher; //#UC END# *57B6B9CD03B7_57B1F28B030D_impl* end;//TmsmController.Publisher procedure TmsmController.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57B1F28B030D_var* //#UC END# *479731C50290_57B1F28B030D_var* begin //#UC START# *479731C50290_57B1F28B030D_impl* inherited; //#UC END# *479731C50290_57B1F28B030D_impl* end;//TmsmController.Cleanup procedure TmsmController.InitFields; //#UC START# *47A042E100E2_57B1F28B030D_var* //#UC END# *47A042E100E2_57B1F28B030D_var* begin //#UC START# *47A042E100E2_57B1F28B030D_impl* Assert(Model <> nil); inherited; //#UC END# *47A042E100E2_57B1F28B030D_impl* end;//TmsmController.InitFields procedure TmsmController.ClearFields; begin f_Model := nil; inherited; end;//TmsmController.ClearFields end.
#1308. MVC. TmsmAddElement. Только код
unit msmAddElement; // Модуль: "w:\common\components\gui\Garant\msm\msmAddElement.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmAddElement" MUID: (57F50186039F) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmListLikeOperation , msmModelElementSelectService {$If NOT Defined(NoScripts)} , tfwScriptingInterfaces {$IfEnd} // NOT Defined(NoScripts) , msmModelElements , msmOperations ; type TmsmAddElement = class(TmsmListLikeOperation, ImsmElementSelector) protected procedure DoDoIt; override; function GetEnabled: Boolean; override; procedure SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); function SelectFormCaption: AnsiString; function KeyValues: ItfwArray; procedure InitOperationParams(var theParams: TmsmOperationParams); override; end;//TmsmAddElement implementation uses l3ImplUses //#UC START# *57F50186039Fimpl_uses* , msmConcreteModels , msmListAndTreeViewUtils , msmListModel , msmElementViews //#UC END# *57F50186039Fimpl_uses* ; procedure TmsmAddElement.DoDoIt; //#UC START# *57CEB1F602D1_57F50186039F_var* //#UC END# *57CEB1F602D1_57F50186039F_var* begin //#UC START# *57CEB1F602D1_57F50186039F_impl* TmsmModelElementSelectService.Instance.SelectElement(Self); //#UC END# *57CEB1F602D1_57F50186039F_impl* end;//TmsmAddElement.DoDoIt function TmsmAddElement.GetEnabled: Boolean; //#UC START# *57EB6D020381_57F50186039F_var* //#UC END# *57EB6D020381_57F50186039F_var* begin //#UC START# *57EB6D020381_57F50186039F_impl* Result := Model.CanAddNewElement; //#UC END# *57EB6D020381_57F50186039F_impl* end;//TmsmAddElement.GetEnabled procedure TmsmAddElement.SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F509AC007F_57F50186039F_var* //#UC END# *57F509AC007F_57F50186039F_var* begin //#UC START# *57F509AC007F_57F50186039F_impl* Model.AddNewElement(anElementName, anElementStereotype, aKeyValues); //#UC END# *57F509AC007F_57F50186039F_impl* end;//TmsmAddElement.SelectElement function TmsmAddElement.SelectFormCaption: AnsiString; //#UC START# *57FB8665023E_57F50186039F_var* //#UC END# *57FB8665023E_57F50186039F_var* begin //#UC START# *57FB8665023E_57F50186039F_impl* Result := 'New element'; //#UC END# *57FB8665023E_57F50186039F_impl* end;//TmsmAddElement.SelectFormCaption function TmsmAddElement.KeyValues: ItfwArray; //#UC START# *57FB86B0027E_57F50186039F_var* //#UC END# *57FB86B0027E_57F50186039F_var* begin //#UC START# *57FB86B0027E_57F50186039F_impl* Result := Model.PropertiesForNewElement; //#UC END# *57FB86B0027E_57F50186039F_impl* end;//TmsmAddElement.KeyValues procedure TmsmAddElement.InitOperationParams(var theParams: TmsmOperationParams); //#UC START# *57EBADA9033E_57F50186039F_var* //#UC END# *57EBADA9033E_57F50186039F_var* begin //#UC START# *57EBADA9033E_57F50186039F_impl* inherited; theParams.rImageIndex := 58; theParams.SetShortCut('Ins'); //#UC END# *57EBADA9033E_57F50186039F_impl* end;//TmsmAddElement.InitOperationParams end.
#1307. MVC. TmsmPaste. Только код
unit msmPaste; // Модуль: "w:\common\components\gui\Garant\msm\msmPaste.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmPaste" MUID: (57E28018005C) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmListLikeOperation , msmOperations ; type TmsmPaste = class(TmsmListLikeOperation) protected procedure DoDoIt; override; function GetEnabled: Boolean; override; procedure InitOperationParams(var theParams: TmsmOperationParams); override; end;//TmsmPaste implementation uses l3ImplUses , msmConcreteModels //#UC START# *57E28018005Cimpl_uses* , SysUtils , l3Interfaces , l3SysUtils , l3Base //#UC END# *57E28018005Cimpl_uses* ; procedure TmsmPaste.DoDoIt; //#UC START# *57CEB1F602D1_57E28018005C_var* var l_IData : IDataObject; l_Sel : ImsmElementSelection; //#UC END# *57CEB1F602D1_57E28018005C_var* begin //#UC START# *57CEB1F602D1_57E28018005C_impl* if not l3IFail(OleGetClipboard(l_IData)) then try if Supports(l_IData, ImsmElementSelection, l_Sel) then try Self.Model.Paste(l_Sel); finally l_Sel := nil; end;//try..finally finally l_IData := nil; end;//try..finally //#UC END# *57CEB1F602D1_57E28018005C_impl* end;//TmsmPaste.DoDoIt function TmsmPaste.GetEnabled: Boolean; //#UC START# *57EB6D020381_57E28018005C_var* var l_IData : IDataObject; l_Sel : ImsmElementSelection; //#UC END# *57EB6D020381_57E28018005C_var* begin //#UC START# *57EB6D020381_57E28018005C_impl* Result := false; if not l3IFail(OleGetClipboard(l_IData)) then try if Supports(l_IData, ImsmElementSelection, l_Sel) then try Result := Self.Model.CanPaste(l_Sel); finally l_Sel := nil; end;//try..finally finally l_IData := nil; end;//try..finally //#UC END# *57EB6D020381_57E28018005C_impl* end;//TmsmPaste.GetEnabled procedure TmsmPaste.InitOperationParams(var theParams: TmsmOperationParams); //#UC START# *57EBADA9033E_57E28018005C_var* //#UC END# *57EBADA9033E_57E28018005C_var* begin //#UC START# *57EBADA9033E_57E28018005C_impl* inherited; theParams.rImageIndex := 10; theParams.SetShortCut('Ctrl+V'); //#UC END# *57EBADA9033E_57E28018005C_impl* end;//TmsmPaste.InitOperationParams end.
#1306. MVC. TmsmDrawingUseCaseView. Только код
unit msmDrawingUseCaseView; // Модуль: "w:\common\components\gui\Garant\msm\msmDrawingUseCaseView.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmDrawingUseCaseView" MUID: (57D2DF7E00CE) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmConcreteUseCases , msmControllers , msmUseCase , msmUseCases //#UC START# *57D2DF7E00CEintf_uses* //#UC END# *57D2DF7E00CEintf_uses* ; type //#UC START# *57D2DF7E00CEci* //#UC END# *57D2DF7E00CEci* _ConcreteUseCase_ = ImsmDrawingUseCase; {$Define l3Items_IsProto} {$Include w:\common\components\gui\Garant\msm\msmUseCaseView.imp.pas} //#UC START# *57D2DF7E00CEcit* //#UC END# *57D2DF7E00CEcit* TmsmDrawingUseCaseView = class(_msmUseCaseView_, ImsmDrawingUseCaseView) protected procedure Cleanup; override; {* Функция очистки полей объекта. } procedure DoActivate; override; procedure DoActivated; override; public constructor Create(const aUseCase: ImsmDrawingUseCase; const aMainZone: ImsmViewParent; const aChildZone: ImsmViewParent; const aLeftZone: ImsmViewParent; const aFloatingZone: ImsmViewParent; const aTopZone: ImsmViewParent); reintroduce; class function Make(const aUseCase: ImsmDrawingUseCase; const aMainZone: ImsmViewParent; const aChildZone: ImsmViewParent; const aLeftZone: ImsmViewParent; const aFloatingZone: ImsmViewParent; const aTopZone: ImsmViewParent): ImsmDrawingUseCaseView; reintroduce; //#UC START# *57D2DF7E00CEpubl* //#UC END# *57D2DF7E00CEpubl* end;//TmsmDrawingUseCaseView implementation uses l3ImplUses , msmParentedViewControllerWithOwnership , msmModel , msmPanel , msmProportionalPanel , msmGenerateElement , msmSaveChangedElements , msmCopySelection , msmPaste , msmWordsManaging , msmSomeWordsListModel , msmSomeModelElementsListModel , msmSomeModelElementsList , msmMultiPanelViewParentHorz , msmMultiPanelViewParentVert , msmMultiPanelViewParent , msmButtonEditViewController , msmAddElement , msmDeleteSelection , msmChangeProperties , msmChangePropertiesBinding , msmLoadedWordsListModel , l3Memory //#UC START# *57D2DF7E00CEimpl_uses* , SysUtils , msmOpenInNewWindow , msmShowInNavigator , msmUpToParent , msmOperationsSeparator , msmListAndTreeInterfaces , msmListAndTreeViewUtils , msmCurrentElementShowAsListBinding , msmListOpener , msmListModel , msmListViewController , msmElementViews , msmDrawingViewController , msmTreeViewController , msmParentedViewController , msmModelElement , msmConcreteModels , msmListOwnerShowAsListBinding //#UC END# *57D2DF7E00CEimpl_uses* ; type _Instance_R_ = TmsmDrawingUseCaseView; {$Include w:\common\components\gui\Garant\msm\msmUseCaseView.imp.pas} constructor TmsmDrawingUseCaseView.Create(const aUseCase: ImsmDrawingUseCase; const aMainZone: ImsmViewParent; const aChildZone: ImsmViewParent; const aLeftZone: ImsmViewParent; const aFloatingZone: ImsmViewParent; const aTopZone: ImsmViewParent); //#UC START# *57D2DFA70064_57D2DF7E00CE_var* function AddNavigatorOperations(const aController: ImsmController; const aModel: ImsmListLikeModel): ImsmController; begin//AddNavigatorOperations aController.AddOperation(TmsmOpenInNewWindow.Make('Open in new window', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmGenerateElement.Make('Generate element', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmSaveChangedElements.Make('Save changed', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmCopySelection.Make('Copy', aModel)); aController.AddOperation(TmsmPaste.Make('Paste', aModel)); aController.AddOperation(TmsmDeleteSelection.Make('Delete', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmAddElement.Make('Add element', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmChangeProperties.Make('Properties', aModel)); Result := aController; end;//AddNavigatorOperations function AddReadonlyListOperations(const aController: ImsmController; const aModel: ImsmListLikeModel): ImsmController; begin// Assert(aUseCase.FloatingNavigator <> nil); AddNavigatorOperations(aController, aModel); aController.AddOperation(TmsmOperationsSeparator.Make); aController.AddOperation(TmsmShowInNavigator.Make('Show in navigator', aModel, aUseCase.FloatingNavigator)); Result := aController; end;//AddReadonlyListOperations function AddListLikeOperations(const aController: ImsmController; const aModel: ImsmListLikeModel): ImsmController; begin//AddListLikeOperations AddReadonlyListOperations(aController, aModel); Result := aController; end;//AddListLikeOperations function AddListOperations(const aController: ImsmController; const aModel: ImsmListModel): ImsmController; begin//AddListOperations AddListLikeOperations(aController, aModel); Result := aController; end;//AddListOperations function AddMainListOperations(const aController: ImsmController; const aModel: ImsmListModel): ImsmController; begin//AddMainListOperations aController.AddOperation(TmsmUpToParent.Make('Up to parent', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); AddListOperations(aController, aModel); Result := aController; end;//AddMainListOperations function AddDiagramOperations(const aController: ImsmController; const aModel: ImsmDrawingModel): ImsmController; begin//AddDiagramOperations aController.AddOperation(TmsmUpToParent.Make('Parent diagram', aModel)); aController.AddOperation(TmsmOperationsSeparator.Make); AddListOperations(aController, aModel); Result := aController; end;//AddDiagramOperations function DisableActionElementEvent(const aController: ImsmController): ImsmController; begin//DisableActionElementEvent aController.DisableEvent(ActionElementEvent.Instance); Result := aController; end;//DisableActionElementEvent procedure AddChildView(const aChildModel: ImsmListModel; const aParent: ImsmViewParent; const aContext: TmsmListViewtInitContext); overload; begin//AddChildView Bind(TmsmCurrentElementShowAsListBinding.Make(aUseCase.MainList, aChildModel)); Bind(TmsmCurrentElementShowAsListBinding.Make(aUseCase.Drawing, aChildModel)); Bind(TmsmChangePropertiesBinding.Make(aChildModel)); //Bind(TmsmListOpener.Make(aChildModel, aUseCase.MainList)); AddController( AddListOperations ( DisableActionElementEvent ( TmsmListViewController.Make(aChildModel, aParent, aContext) ) , aChildModel ) ); end;//AddChildView procedure AddChildView(const aView: TmsmModelElementView; const aParent: ImsmViewParent; const aContext: TmsmListViewtInitContext); overload; begin//AddChildView AddChildView(TmsmListModel.MakeListForViewed(aView), aParent, aContext); end;//AddChildView procedure AddChildView(const aName: String; const aParent: ImsmViewParent; const aContext: TmsmListViewtInitContext); overload; begin//AddChildView AddChildView(TmsmModelElementView_C(aName), aParent, aContext); end;//AddChildView procedure AddChildViews(const aNames: array of String; const aParent: ImsmViewParent; const aContext: TmsmListViewtInitContext); var l_Index : Integer; begin//AddChildViews for l_Index := Low(aNames) to High(aNames) do AddChildView(aNames[l_Index], aParent, aContext); end;//AddChildViews var l_ListContext : TmsmListViewtInitContext; l_DrawingZone : ImsmViewParent; l_AllWords : ImsmListModel; l_NavigatorZone : ImsmViewParent; //#UC END# *57D2DFA70064_57D2DF7E00CE_var* begin //#UC START# *57D2DFA70064_57D2DF7E00CE_impl* inherited Create(aUseCase); (* aUseCase.AddController( TmsmMainFormController.Make(Self, aUseCase.Caption) );*) l_DrawingZone := TmsmMultiPanelViewParentHorz.Make( BindViewParentToModelAndZone( AddViewParentForRelease(TmsmProportionalPanel.Create(nil)) , aUseCase.Drawing, aMainZone ) ); AddController( AddDiagramOperations ( TmsmDrawingViewController.Make(aUseCase.Drawing, l_DrawingZone) , aUseCase.Drawing ) ); AddController( AddMainListOperations ( DisableActionElementEvent ( TmsmListViewController.Make(aUseCase.Drawing, l_DrawingZone) ) , aUseCase.Drawing ) ); AddController( AddMainListOperations ( DisableActionElementEvent ( TmsmListViewController.Make(aUseCase.MainList, aMainZone) ) , aUseCase.MainList ) ); if (aLeftZone <> nil) then begin AddController( AddListLikeOperations ( TmsmTreeViewController.Make(aUseCase.Navigator, aLeftZone) , aUseCase.Navigator ) ); end;//aLeftZone <> nil if (aChildZone <> nil) then begin l_ListContext := TmsmListViewtInitContext_C; AddChildViews(['Depends', 'Inherits', 'Implements', {'Inner',} 'Children', 'Constants', 'Attributes', 'Operations', 'Dependencies', 'Implemented', 'Overridden', 'Parameters'], aChildZone, l_ListContext ); if false then begin AddChildView(TmsmModelElementView_C('UpList', 'UpText'), aChildZone, l_ListContext); end;//false if false then begin l_ListContext := TmsmListViewtInitContext_C; l_ListContext.rMultiStrokeItem := true; AddChildView(TmsmModelElementView_C('SelfList', 'DocumentationNotEmpty'), aChildZone, l_ListContext); end;//false end;//aChildZone <> nil if (aFloatingZone <> nil) then begin l_NavigatorZone := TmsmMultiPanelViewParentVert.Make( BindViewParentToModelAndZone( AddViewParentForRelease(TmsmProportionalPanel.Create(nil)) , aUseCase.FloatingNavigator, aFloatingZone ) ); AddController( AddListLikeOperations( //AddNavigatorOperations( TmsmTreeViewController.Make(aUseCase.FloatingNavigator, l_NavigatorZone), aUseCase.FloatingNavigator ) ); AddController( AddReadonlyListOperations( DisableActionElementEvent ( TmsmListViewController.Make(aUseCase.FoundElements, l_NavigatorZone) ) , aUseCase.FoundElements ) ); if true{false} then begin l_AllWords := TmsmLoadedWordsListModel.Make; AddController( AddReadonlyListOperations( DisableActionElementEvent ( TmsmListViewController.Make(l_AllWords, aFloatingZone) ) , l_AllWords ) ); // - список всех слов модели Bind(TmsmListOpener.Make(l_AllWords, aUseCase.MainList)); end;//false if true{false} then begin l_AllWords := TmsmSomeWordsListModel.Make('Primitives'); AddController( AddReadonlyListOperations( DisableActionElementEvent ( TmsmListViewController.Make(l_AllWords, aFloatingZone) ) , l_AllWords ) ); // - список примитивов Bind(TmsmListOpener.Make(l_AllWords, aUseCase.MainList)); end;//false if true then begin if false then begin l_ListContext := TmsmListViewtInitContext_C; l_ListContext.rImageNameProp := 'msm:View:StereotypeImageFileName'; AddChildView('AllowedElements', aFloatingZone, l_ListContext); // - список стереотипов доступных для текущего элемента end;//false if false{true} then begin l_ListContext := TmsmListViewtInitContext_C; AddChildView('AccessibleTypes', aFloatingZone, l_ListContext); // - список типов, которые может использовать текущий элемент end;//true if true then begin l_ListContext := TmsmListViewtInitContext_C; AddChildView('CanImplement', aFloatingZone, l_ListContext); // - список методов, которые может реализовывать текущий элемент end;//true if true then begin l_ListContext := TmsmListViewtInitContext_C; AddChildView('CanOverride', aFloatingZone, l_ListContext); // - список методов, которые может перекрывать текущий элемент end;//true end;//true end;//aFloatingZone <> nil if (aTopZone <> nil) then begin AddController(TmsmButtonEditViewController.Make(aUseCase.ElementToFind, aTopZone)); end;//aTopZone <> nil //#UC END# *57D2DFA70064_57D2DF7E00CE_impl* end;//TmsmDrawingUseCaseView.Create class function TmsmDrawingUseCaseView.Make(const aUseCase: ImsmDrawingUseCase; const aMainZone: ImsmViewParent; const aChildZone: ImsmViewParent; const aLeftZone: ImsmViewParent; const aFloatingZone: ImsmViewParent; const aTopZone: ImsmViewParent): ImsmDrawingUseCaseView; var l_Inst : TmsmDrawingUseCaseView; begin l_Inst := Create(aUseCase, aMainZone, aChildZone, aLeftZone, aFloatingZone, aTopZone); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmDrawingUseCaseView.Make procedure TmsmDrawingUseCaseView.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57D2DF7E00CE_var* //#UC END# *479731C50290_57D2DF7E00CE_var* begin //#UC START# *479731C50290_57D2DF7E00CE_impl* inherited; //#UC END# *479731C50290_57D2DF7E00CE_impl* end;//TmsmDrawingUseCaseView.Cleanup procedure TmsmDrawingUseCaseView.DoActivate; //#UC START# *57D2B82102BD_57D2DF7E00CE_var* //#UC END# *57D2B82102BD_57D2DF7E00CE_var* begin //#UC START# *57D2B82102BD_57D2DF7E00CE_impl* inherited; //#UC END# *57D2B82102BD_57D2DF7E00CE_impl* end;//TmsmDrawingUseCaseView.DoActivate procedure TmsmDrawingUseCaseView.DoActivated; //#UC START# *57DAB38900EF_57D2DF7E00CE_var* //#UC END# *57DAB38900EF_57D2DF7E00CE_var* begin //#UC START# *57DAB38900EF_57D2DF7E00CE_impl* inherited; //#UC END# *57DAB38900EF_57D2DF7E00CE_impl* end;//TmsmDrawingUseCaseView.DoActivated //#UC START# *57D2DF7E00CEimpl* //#UC END# *57D2DF7E00CEimpl* end.
#1305. MVC. TmsmDrawingUseCase. Только код
unit msmDrawingUseCase; // Модуль: "w:\common\components\gui\Garant\msm\msmDrawingUseCase.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmDrawingUseCase" MUID: (57D2A86F0082) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmUseCase , msmConcreteUseCases , msmConcreteModels , msmControllers , msmElementViews ; type TmsmDrawingUseCase = class(TmsmUseCase, ImsmDrawingUseCase) private f_FloatingNavigator: ImsmTreeModel; f_MainList: ImsmListModel; f_Drawing: ImsmDrawingModel; f_Navigator: ImsmTreeModel; f_Caption: ImsmCaptionModel; f_FoundElements: ImsmListModel; f_ElementToFind: ImsmCaptionModel; protected function Get_MainList: ImsmListModel; function Get_Navigator: ImsmTreeModel; function Get_Drawing: ImsmDrawingModel; function Get_FloatingNavigator: ImsmTreeModel; function Get_Caption: ImsmCaptionModel; function Get_FoundElements: ImsmListModel; function Get_ElementToFind: ImsmCaptionModel; procedure Cleanup; override; {* Функция очистки полей объекта. } procedure DoActivate; override; procedure DoActivated; override; procedure ClearFields; override; public constructor Create(const aViewForTree: TmsmModelElementView; const aViewForList: TmsmModelElementView; const aCaptionModel: ImsmCaptionModel); reintroduce; class function Make(const aViewForTree: TmsmModelElementView; const aViewForList: TmsmModelElementView; const aCaptionModel: ImsmCaptionModel): ImsmDrawingUseCase; reintroduce; public property FloatingNavigator: ImsmTreeModel read f_FloatingNavigator; property MainList: ImsmListModel read f_MainList; property Drawing: ImsmDrawingModel read f_Drawing; property Navigator: ImsmTreeModel read f_Navigator; property Caption: ImsmCaptionModel read f_Caption; property FoundElements: ImsmListModel read f_FoundElements; property ElementToFind: ImsmCaptionModel read f_ElementToFind; end;//TmsmDrawingUseCase implementation uses l3ImplUses , msmTreeModel , msmDrawingModel , msmListModel , msmCaptionModel , msmListOwnerNameToCaptionBinding , msmListOpener , msmListOwnerShowAsListBinding , msmCurrentElementSynchronizeBinding , msmCurrentElementShowAsListBinding , msmListOwnerToCurrentElementBinding , msmSomeModelElementsListModel , msmWordsManaging , msmSomeModelElementsList , msmFindWordBinding , msmFindWordsBinding //#UC START# *57D2A86F0082impl_uses* //#UC END# *57D2A86F0082impl_uses* ; constructor TmsmDrawingUseCase.Create(const aViewForTree: TmsmModelElementView; const aViewForList: TmsmModelElementView; const aCaptionModel: ImsmCaptionModel); //#UC START# *57D2A8F301D0_57D2A86F0082_var* //#UC END# *57D2A8F301D0_57D2A86F0082_var* begin //#UC START# *57D2A8F301D0_57D2A86F0082_impl* inherited Create; f_Navigator := TmsmTreeModel.Make(aViewForTree); f_FloatingNavigator := TmsmTreeModel.Make(aViewForTree); f_MainList := TmsmListModel.MakeDir(aViewForList); if (aCaptionModel = nil) then f_Caption := TmsmCaptionModel.Make else f_Caption := aCaptionModel; f_ElementToFind := TmsmCaptionModel.Make; f_Drawing := TmsmDrawingModel.Make(aViewForList.rElement); f_FoundElements := TmsmSomeModelElementsListModel.Make(nil, 'Found'); Bind(TmsmListOwnerNameToCaptionBinding.Make(MainList, Caption)); // - показываем имя владельца списка в заголовке (формы) Bind(TmsmListOpener.Make(MainList, MainList)); // - открываем новый список MainList -> MainList по ActionElement Bind(TmsmListOpener.Make(Drawing, MainList)); // - открываем новый список Drawing -> MainList по ActionElement Bind(TmsmListOpener.Make(FoundElements, MainList)); // - открываем новый список FoundElements -> MainList по ActionElement Bind(TmsmListOpener.Make(Navigator, MainList)); // - открываем новый список Navigator -> MainList по ActionElement Bind(TmsmListOpener.Make(FloatingNavigator, MainList)); // - открываем новый список FloatingNavigator -> MainList по ActionElement Bind(TmsmListOwnerShowAsListBinding.Make(MainList, Drawing)); Bind(TmsmListOwnerShowAsListBinding.Make(Drawing, MainList)); // - синхронизируем списки у MainList и Drawing в обе стороны Bind(TmsmCurrentElementSynchronizeBinding.Make(MainList, Drawing)); Bind(TmsmCurrentElementSynchronizeBinding.Make(Drawing, MainList)); // - синхронизируем текущий элемент у MainList и Drawing в обе стороны Bind(TmsmCurrentElementShowAsListBinding.Make(Navigator, MainList)); // - синхронизируем текущий элемент из Navigator со списком MainList Bind(TmsmListOwnerToCurrentElementBinding.Make(MainList, Navigator)); // - синхронизируем текущий список из MainList с текущим элементом в Navigator Bind(TmsmFindWordBinding.Make(ElementToFind, FloatingNavigator)); Bind(TmsmFindWordsBinding.Make(ElementToFind, FoundElements)); //#UC END# *57D2A8F301D0_57D2A86F0082_impl* end;//TmsmDrawingUseCase.Create class function TmsmDrawingUseCase.Make(const aViewForTree: TmsmModelElementView; const aViewForList: TmsmModelElementView; const aCaptionModel: ImsmCaptionModel): ImsmDrawingUseCase; var l_Inst : TmsmDrawingUseCase; begin l_Inst := Create(aViewForTree, aViewForList, aCaptionModel); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmDrawingUseCase.Make function TmsmDrawingUseCase.Get_MainList: ImsmListModel; //#UC START# *57D2D7C0039B_57D2A86F0082get_var* //#UC END# *57D2D7C0039B_57D2A86F0082get_var* begin //#UC START# *57D2D7C0039B_57D2A86F0082get_impl* Result := Self.MainList; //#UC END# *57D2D7C0039B_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_MainList function TmsmDrawingUseCase.Get_Navigator: ImsmTreeModel; //#UC START# *57D2D7D00023_57D2A86F0082get_var* //#UC END# *57D2D7D00023_57D2A86F0082get_var* begin //#UC START# *57D2D7D00023_57D2A86F0082get_impl* Result := Self.Navigator; //#UC END# *57D2D7D00023_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_Navigator function TmsmDrawingUseCase.Get_Drawing: ImsmDrawingModel; //#UC START# *57D2D7DB0283_57D2A86F0082get_var* //#UC END# *57D2D7DB0283_57D2A86F0082get_var* begin //#UC START# *57D2D7DB0283_57D2A86F0082get_impl* Result := Self.Drawing; //#UC END# *57D2D7DB0283_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_Drawing function TmsmDrawingUseCase.Get_FloatingNavigator: ImsmTreeModel; //#UC START# *57D2D7E900D8_57D2A86F0082get_var* //#UC END# *57D2D7E900D8_57D2A86F0082get_var* begin //#UC START# *57D2D7E900D8_57D2A86F0082get_impl* Result := Self.FloatingNavigator; //#UC END# *57D2D7E900D8_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_FloatingNavigator function TmsmDrawingUseCase.Get_Caption: ImsmCaptionModel; //#UC START# *57D2D7F40131_57D2A86F0082get_var* //#UC END# *57D2D7F40131_57D2A86F0082get_var* begin //#UC START# *57D2D7F40131_57D2A86F0082get_impl* Result := Self.Caption; //#UC END# *57D2D7F40131_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_Caption function TmsmDrawingUseCase.Get_FoundElements: ImsmListModel; //#UC START# *57EA784B020D_57D2A86F0082get_var* //#UC END# *57EA784B020D_57D2A86F0082get_var* begin //#UC START# *57EA784B020D_57D2A86F0082get_impl* Result := Self.FoundElements; //#UC END# *57EA784B020D_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_FoundElements function TmsmDrawingUseCase.Get_ElementToFind: ImsmCaptionModel; //#UC START# *57EA811D026D_57D2A86F0082get_var* //#UC END# *57EA811D026D_57D2A86F0082get_var* begin //#UC START# *57EA811D026D_57D2A86F0082get_impl* Result := Self.ElementToFind; //#UC END# *57EA811D026D_57D2A86F0082get_impl* end;//TmsmDrawingUseCase.Get_ElementToFind procedure TmsmDrawingUseCase.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57D2A86F0082_var* //#UC END# *479731C50290_57D2A86F0082_var* begin //#UC START# *479731C50290_57D2A86F0082_impl* f_FloatingNavigator := nil; f_MainList := nil; f_Drawing := nil; f_Navigator := nil; f_Caption := nil; inherited; //#UC END# *479731C50290_57D2A86F0082_impl* end;//TmsmDrawingUseCase.Cleanup procedure TmsmDrawingUseCase.DoActivate; //#UC START# *57D2B82102BD_57D2A86F0082_var* //#UC END# *57D2B82102BD_57D2A86F0082_var* begin //#UC START# *57D2B82102BD_57D2A86F0082_impl* inherited; //Assert(MainList.List <> nil); //Navigator.CurrentElement := MainList.List.Owner; //FloatingNavigator.CurrentElement := MainList.List.Owner; //#UC END# *57D2B82102BD_57D2A86F0082_impl* end;//TmsmDrawingUseCase.DoActivate procedure TmsmDrawingUseCase.DoActivated; //#UC START# *57DAB38900EF_57D2A86F0082_var* //#UC END# *57DAB38900EF_57D2A86F0082_var* begin //#UC START# *57DAB38900EF_57D2A86F0082_impl* inherited; Assert(MainList.List <> nil); Navigator.CurrentElement := MainList.List.Owner; FloatingNavigator.CurrentElement := MainList.List.Owner; //#UC END# *57DAB38900EF_57D2A86F0082_impl* end;//TmsmDrawingUseCase.DoActivated procedure TmsmDrawingUseCase.ClearFields; begin f_FloatingNavigator := nil; f_MainList := nil; f_Drawing := nil; f_Navigator := nil; f_Caption := nil; f_FoundElements := nil; f_ElementToFind := nil; inherited; end;//TmsmDrawingUseCase.ClearFields end.
#1304. MVC. TmsmListLikeModel. Только код
unit msmListLikeModel; // Модуль: "w:\common\components\gui\Garant\msm\msmListLikeModel.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmListLikeModel" MUID: (57B57EDB003F) {$Include w:\common\components\gui\Garant\msm\msm.inc} interface uses l3IntfUses , msmModel , msmConcreteModels , msmElementViews , msmModelElements , l3Interfaces {$If NOT Defined(NoScripts)} , tfwScriptingInterfaces {$IfEnd} // NOT Defined(NoScripts) , msmDefaultModels ; type TmsmListLikeModel = {abstract} class(TmsmModel, ImsmListLikeModel, ImsmCaptionModel, ImsmDragAndDropModel) private f_Selection: ImsmElementSelection; f_ElementToAction: ImsmModelElement; protected f_ElementView: TmsmModelElementView; protected function DoGetList: ImsmModelElementStringList; virtual; abstract; procedure DoShowElementAsList(const anElement: ImsmModelElement); virtual; abstract; function DoGetCaption: AnsiString; virtual; function As_ImsmDragAndDropModel: ImsmDragAndDropModel; {* Метод приведения нашего интерфейса к ImsmDragAndDropModel } procedure ShowElementAsList(const anElement: ImsmModelElement); function Get_Caption: Il3CString; procedure Set_Caption(const aValue: Il3CString); function Get_ElementToAction: ImsmModelElement; procedure Set_ElementToAction(const aValue: ImsmModelElement); function Get_CurrentElement: ImsmModelElement; procedure Set_CurrentElement(const aValue: ImsmModelElement); function Get_List: ImsmModelElementStringList; function Get_Selection: ImsmElementSelection; procedure Paste(const aSelection: ImsmElementSelection); overload; procedure Paste(const aDataObject: IDataObject); overload; procedure Paste; overload; procedure Paste(const anArray: ItfwArray); overload; function Drop(const anElement: ImsmModelElement; const aPoint: Tl3SPoint): Boolean; overload; function CanPaste(const aSelection: ImsmElementSelection): Boolean; function CanAddNewElement: Boolean; procedure AddNewElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); procedure DeleteSelection; function CanDeleteSelection: Boolean; procedure ChangeProperties(const aKeyValues: ItfwArray); function CanChangeProperties: Boolean; function PropertiesForNewElement: ItfwArray; function Properties: ItfwArray; procedure InitFields; override; procedure ClearFields; override; public constructor Create(const anElementView: TmsmModelElementView); reintroduce; function Drop(aFormat: Tl3ClipboardFormat; const aMedium: Tl3StoragePlace; var dwEffect: Integer; const aPoint: Tl3SPoint): Boolean; overload; function DragOver(const aData: IDataObject; const aPoint: TPoint): Boolean; public property Selection: ImsmElementSelection read f_Selection; end;//TmsmListLikeModel implementation uses l3ImplUses , l3CProtoObject , msmModelElementSelectService , msmListAndTreeInterfaces , msmElementSelection , tfwCStringFactory , msmModelElementMethodCaller {$If NOT Defined(NoScripts)} , tfwWordsIterator {$IfEnd} // NOT Defined(NoScripts) {$If NOT Defined(NoScripts)} , tfwWordRefList {$IfEnd} // NOT Defined(NoScripts) , SysUtils , l3SysUtils , l3Base //#UC START# *57B57EDB003Fimpl_uses* , Windows , l3TreeConst , l3TreeInterfaces , msmModelElementNode , msmModelElement , l3String , msmDeletedElements , msmChangedElements , msmWaitCursor //#UC END# *57B57EDB003Fimpl_uses* ; type TmsmListLikeModelWorker = class(Tl3CProtoObject) private f_Model: ImsmListLikeModel; f_Target: ImsmModelElement; protected procedure ClearFields; override; public constructor Create(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement); reintroduce; protected property Model: ImsmListLikeModel read f_Model; property Target: ImsmModelElement read f_Target; end;//TmsmListLikeModelWorker TmsmAttributeAdder = class(TmsmListLikeModelWorker, ImsmElementSelector) protected procedure SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); function SelectFormCaption: AnsiString; function KeyValues: ItfwArray; public class function Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; reintroduce; end;//TmsmAttributeAdder TmsmOperationAdder = class(TmsmListLikeModelWorker, ImsmElementSelector) protected procedure SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); function SelectFormCaption: AnsiString; function KeyValues: ItfwArray; public class function Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; reintroduce; end;//TmsmOperationAdder TmsmDependencyAdder = class(TmsmListLikeModelWorker, ImsmElementSelector) protected procedure SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); function SelectFormCaption: AnsiString; function KeyValues: ItfwArray; public class function Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; reintroduce; end;//TmsmDependencyAdder TmsmParameterAdder = class(TmsmListLikeModelWorker, ImsmElementSelector) protected procedure SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); function SelectFormCaption: AnsiString; function KeyValues: ItfwArray; public class function Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; reintroduce; end;//TmsmParameterAdder constructor TmsmListLikeModelWorker.Create(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement); //#UC START# *58049B0200B1_58049A4D0355_var* //#UC END# *58049B0200B1_58049A4D0355_var* begin //#UC START# *58049B0200B1_58049A4D0355_impl* Assert(aModel <> nil); Assert(aTarget <> nil); f_Model := aModel; f_Target := aTarget; inherited Create; //#UC END# *58049B0200B1_58049A4D0355_impl* end;//TmsmListLikeModelWorker.Create procedure TmsmListLikeModelWorker.ClearFields; begin f_Model := nil; f_Target := nil; inherited; end;//TmsmListLikeModelWorker.ClearFields class function TmsmAttributeAdder.Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; var l_Inst : TmsmAttributeAdder; begin l_Inst := Create(aModel, aTarget); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmAttributeAdder.Make procedure TmsmAttributeAdder.SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F509AC007F_58049B2C00EB_var* //#UC END# *57F509AC007F_58049B2C00EB_var* begin //#UC START# *57F509AC007F_58049B2C00EB_impl* Model.AddNewElement(anElementName, anElementStereotype, aKeyValues); //#UC END# *57F509AC007F_58049B2C00EB_impl* end;//TmsmAttributeAdder.SelectElement function TmsmAttributeAdder.SelectFormCaption: AnsiString; //#UC START# *57FB8665023E_58049B2C00EB_var* //#UC END# *57FB8665023E_58049B2C00EB_var* begin //#UC START# *57FB8665023E_58049B2C00EB_impl* Result := 'Add attribute'; //#UC END# *57FB8665023E_58049B2C00EB_impl* end;//TmsmAttributeAdder.SelectFormCaption function TmsmAttributeAdder.KeyValues: ItfwArray; //#UC START# *57FB86B0027E_58049B2C00EB_var* //#UC END# *57FB86B0027E_58049B2C00EB_var* begin //#UC START# *57FB86B0027E_58049B2C00EB_impl* TmsmWaitCursor.Make; Result := Model.List.Owner.CallAndGetList([TtfwStackValue_C(Self.Target.MainWord)], 'msm:KeyValuesForNewAttribute'); //#UC END# *57FB86B0027E_58049B2C00EB_impl* end;//TmsmAttributeAdder.KeyValues class function TmsmOperationAdder.Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; var l_Inst : TmsmOperationAdder; begin l_Inst := Create(aModel, aTarget); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmOperationAdder.Make procedure TmsmOperationAdder.SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F509AC007F_58049DA603A3_var* //#UC END# *57F509AC007F_58049DA603A3_var* begin //#UC START# *57F509AC007F_58049DA603A3_impl* Model.AddNewElement(anElementName, anElementStereotype, aKeyValues); //#UC END# *57F509AC007F_58049DA603A3_impl* end;//TmsmOperationAdder.SelectElement function TmsmOperationAdder.SelectFormCaption: AnsiString; //#UC START# *57FB8665023E_58049DA603A3_var* //#UC END# *57FB8665023E_58049DA603A3_var* begin //#UC START# *57FB8665023E_58049DA603A3_impl* Result := 'Add operation'; //#UC END# *57FB8665023E_58049DA603A3_impl* end;//TmsmOperationAdder.SelectFormCaption function TmsmOperationAdder.KeyValues: ItfwArray; //#UC START# *57FB86B0027E_58049DA603A3_var* //#UC END# *57FB86B0027E_58049DA603A3_var* begin //#UC START# *57FB86B0027E_58049DA603A3_impl* TmsmWaitCursor.Make; Result := Model.List.Owner.CallAndGetList([TtfwStackValue_C(Self.Target.MainWord)], 'msm:KeyValuesForNewOperation'); //#UC END# *57FB86B0027E_58049DA603A3_impl* end;//TmsmOperationAdder.KeyValues class function TmsmDependencyAdder.Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; var l_Inst : TmsmDependencyAdder; begin l_Inst := Create(aModel, aTarget); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmDependencyAdder.Make procedure TmsmDependencyAdder.SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F509AC007F_5804A3BE00EE_var* //#UC END# *57F509AC007F_5804A3BE00EE_var* begin //#UC START# *57F509AC007F_5804A3BE00EE_impl* Model.AddNewElement(anElementName, anElementStereotype, aKeyValues); //#UC END# *57F509AC007F_5804A3BE00EE_impl* end;//TmsmDependencyAdder.SelectElement function TmsmDependencyAdder.SelectFormCaption: AnsiString; //#UC START# *57FB8665023E_5804A3BE00EE_var* //#UC END# *57FB8665023E_5804A3BE00EE_var* begin //#UC START# *57FB8665023E_5804A3BE00EE_impl* Result := 'Add dependency'; //#UC END# *57FB8665023E_5804A3BE00EE_impl* end;//TmsmDependencyAdder.SelectFormCaption function TmsmDependencyAdder.KeyValues: ItfwArray; //#UC START# *57FB86B0027E_5804A3BE00EE_var* //#UC END# *57FB86B0027E_5804A3BE00EE_var* begin //#UC START# *57FB86B0027E_5804A3BE00EE_impl* TmsmWaitCursor.Make; Result := Model.List.Owner.CallAndGetList([TtfwStackValue_C(Self.Target.MainWord)], 'msm:KeyValuesForNewDependency'); //#UC END# *57FB86B0027E_5804A3BE00EE_impl* end;//TmsmDependencyAdder.KeyValues class function TmsmParameterAdder.Make(const aModel: ImsmListLikeModel; const aTarget: ImsmModelElement): ImsmElementSelector; var l_Inst : TmsmParameterAdder; begin l_Inst := Create(aModel, aTarget); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmParameterAdder.Make procedure TmsmParameterAdder.SelectElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F509AC007F_5810ACC40099_var* //#UC END# *57F509AC007F_5810ACC40099_var* begin //#UC START# *57F509AC007F_5810ACC40099_impl* Model.AddNewElement(anElementName, anElementStereotype, aKeyValues); //#UC END# *57F509AC007F_5810ACC40099_impl* end;//TmsmParameterAdder.SelectElement function TmsmParameterAdder.SelectFormCaption: AnsiString; //#UC START# *57FB8665023E_5810ACC40099_var* //#UC END# *57FB8665023E_5810ACC40099_var* begin //#UC START# *57FB8665023E_5810ACC40099_impl* Result := 'Add parameter'; //#UC END# *57FB8665023E_5810ACC40099_impl* end;//TmsmParameterAdder.SelectFormCaption function TmsmParameterAdder.KeyValues: ItfwArray; //#UC START# *57FB86B0027E_5810ACC40099_var* //#UC END# *57FB86B0027E_5810ACC40099_var* begin //#UC START# *57FB86B0027E_5810ACC40099_impl* TmsmWaitCursor.Make; Result := Model.List.Owner.CallAndGetList([TtfwStackValue_C(Self.Target.MainWord)], 'msm:KeyValuesForNewParameter'); //#UC END# *57FB86B0027E_5810ACC40099_impl* end;//TmsmParameterAdder.KeyValues function TmsmListLikeModel.DoGetCaption: AnsiString; //#UC START# *57E331B90378_57B57EDB003F_var* //#UC END# *57E331B90378_57B57EDB003F_var* begin //#UC START# *57E331B90378_57B57EDB003F_impl* Result := f_ElementView.rListName; if (Result = 'SelfList') then Result := f_ElementView.rTextName; if (Result = 'DocumentationNotEmpty') then Result := 'Doc'; //#UC END# *57E331B90378_57B57EDB003F_impl* end;//TmsmListLikeModel.DoGetCaption constructor TmsmListLikeModel.Create(const anElementView: TmsmModelElementView); //#UC START# *57E410A500DD_57B57EDB003F_var* //#UC END# *57E410A500DD_57B57EDB003F_var* begin //#UC START# *57E410A500DD_57B57EDB003F_impl* f_ElementView := anElementView; inherited Create; //#UC END# *57E410A500DD_57B57EDB003F_impl* end;//TmsmListLikeModel.Create function TmsmListLikeModel.As_ImsmDragAndDropModel: ImsmDragAndDropModel; {* Метод приведения нашего интерфейса к ImsmDragAndDropModel } begin Result := Self; end;//TmsmListLikeModel.As_ImsmDragAndDropModel procedure TmsmListLikeModel.ShowElementAsList(const anElement: ImsmModelElement); //#UC START# *57B1A3DA0382_57B57EDB003F_var* //#UC END# *57B1A3DA0382_57B57EDB003F_var* begin //#UC START# *57B1A3DA0382_57B57EDB003F_impl* DoShowElementAsList(anElement); //#UC END# *57B1A3DA0382_57B57EDB003F_impl* end;//TmsmListLikeModel.ShowElementAsList function TmsmListLikeModel.Get_Caption: Il3CString; //#UC START# *57B1A47403C5_57B57EDB003Fget_var* //#UC END# *57B1A47403C5_57B57EDB003Fget_var* begin //#UC START# *57B1A47403C5_57B57EDB003Fget_impl* Result := TtfwCStringFactory.C(DoGetCaption); //#UC END# *57B1A47403C5_57B57EDB003Fget_impl* end;//TmsmListLikeModel.Get_Caption procedure TmsmListLikeModel.Set_Caption(const aValue: Il3CString); //#UC START# *57B1A47403C5_57B57EDB003Fset_var* //#UC END# *57B1A47403C5_57B57EDB003Fset_var* begin //#UC START# *57B1A47403C5_57B57EDB003Fset_impl* // - ничего не делаем //#UC END# *57B1A47403C5_57B57EDB003Fset_impl* end;//TmsmListLikeModel.Set_Caption function TmsmListLikeModel.Get_ElementToAction: ImsmModelElement; //#UC START# *57B2B019009C_57B57EDB003Fget_var* //#UC END# *57B2B019009C_57B57EDB003Fget_var* begin //#UC START# *57B2B019009C_57B57EDB003Fget_impl* Result := f_ElementToAction; //#UC END# *57B2B019009C_57B57EDB003Fget_impl* end;//TmsmListLikeModel.Get_ElementToAction procedure TmsmListLikeModel.Set_ElementToAction(const aValue: ImsmModelElement); //#UC START# *57B2B019009C_57B57EDB003Fset_var* //#UC END# *57B2B019009C_57B57EDB003Fset_var* begin //#UC START# *57B2B019009C_57B57EDB003Fset_impl* f_ElementToAction := aValue; Fire(ActionElementEvent.Instance); //#UC END# *57B2B019009C_57B57EDB003Fset_impl* end;//TmsmListLikeModel.Set_ElementToAction function TmsmListLikeModel.Get_CurrentElement: ImsmModelElement; //#UC START# *57B31CF301D2_57B57EDB003Fget_var* //#UC END# *57B31CF301D2_57B57EDB003Fget_var* begin //#UC START# *57B31CF301D2_57B57EDB003Fget_impl* Assert(Selection <> nil); Result := Selection.CurrentElement; //#UC END# *57B31CF301D2_57B57EDB003Fget_impl* end;//TmsmListLikeModel.Get_CurrentElement procedure TmsmListLikeModel.Set_CurrentElement(const aValue: ImsmModelElement); //#UC START# *57B31CF301D2_57B57EDB003Fset_var* //#UC END# *57B31CF301D2_57B57EDB003Fset_var* begin //#UC START# *57B31CF301D2_57B57EDB003Fset_impl* if (f_Selection = nil) then f_Selection := TmsmElementSelection.Make(Self); Assert(Selection <> nil); Selection.CurrentElement := aValue; //#UC END# *57B31CF301D2_57B57EDB003Fset_impl* end;//TmsmListLikeModel.Set_CurrentElement function TmsmListLikeModel.Get_List: ImsmModelElementStringList; //#UC START# *57B6A4550271_57B57EDB003Fget_var* //#UC END# *57B6A4550271_57B57EDB003Fget_var* begin //#UC START# *57B6A4550271_57B57EDB003Fget_impl* Result := DoGetList; //#UC END# *57B6A4550271_57B57EDB003Fget_impl* end;//TmsmListLikeModel.Get_List function TmsmListLikeModel.Get_Selection: ImsmElementSelection; //#UC START# *57D8F1B70265_57B57EDB003Fget_var* //#UC END# *57D8F1B70265_57B57EDB003Fget_var* begin //#UC START# *57D8F1B70265_57B57EDB003Fget_impl* Result := Selection; //#UC END# *57D8F1B70265_57B57EDB003Fget_impl* end;//TmsmListLikeModel.Get_Selection procedure TmsmListLikeModel.Paste(const aSelection: ImsmElementSelection); //#UC START# *57E283A603D2_57B57EDB003F_var* //#UC END# *57E283A603D2_57B57EDB003F_var* begin //#UC START# *57E283A603D2_57B57EDB003F_impl* Assert(aSelection <> nil); Paste(aSelection.AsArray); //#UC END# *57E283A603D2_57B57EDB003F_impl* end;//TmsmListLikeModel.Paste procedure TmsmListLikeModel.Paste(const aDataObject: IDataObject); //#UC START# *57E3F713019E_57B57EDB003F_var* var l_Sel : ImsmElementSelection; //#UC END# *57E3F713019E_57B57EDB003F_var* begin //#UC START# *57E3F713019E_57B57EDB003F_impl* if Supports(aDataObject, ImsmElementSelection, l_Sel) then try Self.Paste(l_Sel); finally l_Sel := nil; end;//try..finally //#UC END# *57E3F713019E_57B57EDB003F_impl* end;//TmsmListLikeModel.Paste procedure TmsmListLikeModel.Paste; //#UC START# *57E3F7330377_57B57EDB003F_var* var l_IData : IDataObject; //#UC END# *57E3F7330377_57B57EDB003F_var* begin //#UC START# *57E3F7330377_57B57EDB003F_impl* if not l3IFail(OleGetClipboard(l_IData)) then try Self.Paste(l_IData); finally l_IData := nil; end;//try..finally //#UC END# *57E3F7330377_57B57EDB003F_impl* end;//TmsmListLikeModel.Paste procedure TmsmListLikeModel.Paste(const anArray: ItfwArray); //#UC START# *57E3FC26029F_57B57EDB003F_var* var l_A : ItfwArray; //#UC END# *57E3FC26029F_57B57EDB003F_var* begin //#UC START# *57E3FC26029F_57B57EDB003F_impl* Assert(Self.Get_List <> nil); Assert(Self.Get_List.Owner <> nil); if Self.Get_List.Owner.BoolProp['IsDiagram'] then l_A := Self.Get_List.Owner.CallAndGetList([TtfwStackValue_C(anArray)], 'msm:Diagram:PasteElements') else Assert(false); //Fire(ListContentChangedEvent.Instance); Selection.SelectElements(l_A); //#UC END# *57E3FC26029F_57B57EDB003F_impl* end;//TmsmListLikeModel.Paste function TmsmListLikeModel.Drop(aFormat: Tl3ClipboardFormat; const aMedium: Tl3StoragePlace; var dwEffect: Integer; const aPoint: Tl3SPoint): Boolean; //#UC START# *57E410D101DC_57B57EDB003F_var* var l_Data: Pl3TreeData; l_W : ITmsmModelElementNodeWrap; //#UC END# *57E410D101DC_57B57EDB003F_var* begin //#UC START# *57E410D101DC_57B57EDB003F_impl* Result := false; if (aFormat = CF_TreeNode) then begin if (aMedium.tymed = TYMED_HGLOBAL) then begin l_Data := GlobalLock(aMedium.hGlobal); try if not l_Data.rMultiSelection AND (l_Data.rNode <> nil) then begin if Supports(l_Data.rNode, ITmsmModelElementNodeWrap, l_W) then try Result := Drop(l_W.GetSelf.Element.rElement, aPoint); finally l_W := nil; end;//try..finally end;//not l_Data.rMultiSelection AND (l_Data.rNode <> nil) finally GlobalUnlock(aMedium.hGlobal); end;//try..finally end;//aMedium.tymed = TYMED_HGLOBAL end;//aFormat = CF_TreeNode //#UC END# *57E410D101DC_57B57EDB003F_impl* end;//TmsmListLikeModel.Drop function TmsmListLikeModel.Drop(const anElement: ImsmModelElement; const aPoint: Tl3SPoint): Boolean; //#UC START# *57E4210F0225_57B57EDB003F_var* var l_E : ImsmModelElement; //#UC END# *57E4210F0225_57B57EDB003F_var* begin //#UC START# *57E4210F0225_57B57EDB003F_impl* l_E := nil; if {(f_ElementView.rListName = 'Inherits') OR (f_ElementView.rListName = 'Implements')} false then begin Assert(Self.f_ElementView.rElement <> nil); Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); Self.f_ElementView.rElement.ElementProp['Viewed'].Call( [TtfwStackValue_C(anElement.ElementProp['Viewed'].MainWord)], 'msm:AddToCollection: .' + f_ElementView.rListName ); l_E := anElement; end//f_ElementView.rListName = 'Inherits'.. else if (f_ElementView.rListName = 'Overridden') OR (f_ElementView.rListName = 'Inherits') OR (f_ElementView.rListName = 'Implements') then begin Assert(Self.f_ElementView.rElement <> nil); Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); l_E := TmsmModelElement.MakeFromValue( Self.f_ElementView.rElement.ElementProp['Viewed'].Call( [TtfwStackValue_C(anElement.ElementProp['Viewed'].MainWord)], 'msm:Add' + f_ElementView.rListName ) ); end//(f_ElementView.rListName = 'Overridden') else if (f_ElementView.rListName = 'Attributes') then TmsmModelElementSelectService.Instance.SelectElement(TmsmAttributeAdder.Make(Self, anElement)) else if (f_ElementView.rListName = 'Operations') then TmsmModelElementSelectService.Instance.SelectElement(TmsmOperationAdder.Make(Self, anElement)) else if (f_ElementView.rListName = 'Dependencies') then TmsmModelElementSelectService.Instance.SelectElement(TmsmDependencyAdder.Make(Self, anElement)) else if (f_ElementView.rListName = 'Parameters') then TmsmModelElementSelectService.Instance.SelectElement(TmsmParameterAdder.Make(Self, anElement)) else begin Assert(Self.Get_List <> nil); Assert(Self.Get_List.Owner <> nil); if Self.Get_List.Owner.BoolProp['IsDiagram'] then begin l_E := TmsmModelElement.MakeFromValue( Self.Get_List.Owner.Call( [TtfwStackValue_C(anElement.MainWord), TtfwStackValue_C(aPoint.X), TtfwStackValue_C(aPoint.Y)], 'msm:Diagram:PasteElement' ) ); end//Self.Get_List.Owner.BoolProp['IsDiagram'] else Assert(false); end;//else //Fire(ListContentChangedEvent.Instance); if (l_E <> nil) then begin Selection.Clear; Selection.CurrentElement := l_E; end;//l_E <> nil Result := true; //#UC END# *57E4210F0225_57B57EDB003F_impl* end;//TmsmListLikeModel.Drop function TmsmListLikeModel.CanPaste(const aSelection: ImsmElementSelection): Boolean; //#UC START# *57EB7E79022F_57B57EDB003F_var* //#UC END# *57EB7E79022F_57B57EDB003F_var* begin //#UC START# *57EB7E79022F_57B57EDB003F_impl* Result := false; if (aSelection = nil) then Exit; if (Self.Get_List = nil) then Exit; if (Self.Get_List.Owner = nil) then Exit; if not Self.Get_List.Owner.BoolProp['IsDiagram'] then Exit; Result := true; //#UC END# *57EB7E79022F_57B57EDB003F_impl* end;//TmsmListLikeModel.CanPaste function TmsmListLikeModel.CanAddNewElement: Boolean; //#UC START# *57F4FE6D0164_57B57EDB003F_var* //#UC END# *57F4FE6D0164_57B57EDB003F_var* begin //#UC START# *57F4FE6D0164_57B57EDB003F_impl* Result := false; if (f_ElementView.rListName = 'Attributes') OR (f_ElementView.rListName = 'Operations') OR (f_ElementView.rListName = 'Dependencies') OR (f_ElementView.rListName = 'Parameters') then begin if (f_ElementView.rElement = nil) then Exit; if (f_ElementView.rElement.MEList['AllowedElements'].Count <= 0) then Exit; Result := true; Exit; end;//f_ElementView.rListName = 'Attributes' if (f_ElementView.rListName = 'Inherits') then begin if (f_ElementView.rElement = nil) then Exit; Result := true; Exit; end;//f_ElementView.rListName = 'Inherits' if (f_ElementView.rListName = 'Overridden') then begin if (f_ElementView.rElement = nil) then Exit; Result := true; Exit; end;//f_ElementView.rListName = 'Overridden' if (f_ElementView.rListName = 'Implements') then begin if (f_ElementView.rElement = nil) then Exit; Result := true; Exit; end;//f_ElementView.rListName = 'Implements' if (Self.Get_List = nil) then Exit; if (Self.Get_List.Owner = nil) then Exit; if (Self.Get_List.Owner.MEList['AllowedElements'].Count <= 0) then Exit; if Self.Get_List.Owner.BoolProp['IsDiagram'] then begin Result := true; Exit; end;//Self.Get_List.Owner.BoolProp['IsDiagram'] //#UC END# *57F4FE6D0164_57B57EDB003F_impl* end;//TmsmListLikeModel.CanAddNewElement procedure TmsmListLikeModel.AddNewElement(const anElementName: AnsiString; const anElementStereotype: ImsmModelElement; const aKeyValues: ItfwArray); //#UC START# *57F4FE8F022B_57B57EDB003F_var* var l_E : ImsmModelElement; //#UC END# *57F4FE8F022B_57B57EDB003F_var* begin //#UC START# *57F4FE8F022B_57B57EDB003F_impl* //Assert(anElementName <> ''); //Assert(anElementStereotype <> nil); l_E := nil; if (f_ElementView.rListName = 'Attributes') OR (f_ElementView.rListName = 'Operations') OR (f_ElementView.rListName = 'Dependencies') OR (f_ElementView.rListName = 'Parameters') then begin Assert(anElementStereotype <> nil); Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); Assert(not Self.f_ElementView.rElement.BoolProp['IsDiagram']); l_E := TmsmModelElement.MakeFromValue( Self.f_ElementView.rElement.Call( [TtfwStackValue_C(TtfwCStringFactory.C(anElementName)), TtfwStackValue_C(anElementStereotype.MainWord), TtfwStackValue_C(aKeyValues)], 'msm:AddElement' ) ); end//f_ElementView.rListName = 'Attributes' else if (f_ElementView.rListName = 'Inherits') then begin Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); Assert(not Self.f_ElementView.rElement.BoolProp['IsDiagram']); Self.f_ElementView.rElement.Call( [TtfwStackValue_C(aKeyValues)], 'msm:AddNewInherits' ) end//f_ElementView.rListName = 'Inherits' else if (f_ElementView.rListName = 'Implements') then begin Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); Assert(not Self.f_ElementView.rElement.BoolProp['IsDiagram']); Self.f_ElementView.rElement.Call( [TtfwStackValue_C(aKeyValues)], 'msm:AddNewImplements' ) end//f_ElementView.rListName = 'Implements' else if (f_ElementView.rListName = 'Overridden') then begin Assert(not Self.f_ElementView.rElement.BoolProp['IsSomeView']); Assert(not Self.f_ElementView.rElement.BoolProp['IsDiagram']); Self.f_ElementView.rElement.Call( [TtfwStackValue_C(aKeyValues)], 'msm:AddNewOverridden' ) end//f_ElementView.rListName = 'Overridden' else begin Assert(anElementStereotype <> nil); Assert(Self.Get_List <> nil); Assert(Self.Get_List.Owner <> nil); if Self.Get_List.Owner.BoolProp['IsDiagram'] then l_E := TmsmModelElement.MakeFromValue( Self.Get_List.Owner.Call( [TtfwStackValue_C(TtfwCStringFactory.C(anElementName)), TtfwStackValue_C(anElementStereotype.MainWord), TtfwStackValue_C(aKeyValues)], 'msm:Diagram:AddElement' ) ) else Assert(false); end;//else //Fire(ListContentChangedEvent.Instance); if (l_E <> nil) then begin Selection.Clear; Selection.CurrentElement := l_E; end;//l_E <> nil //#UC END# *57F4FE8F022B_57B57EDB003F_impl* end;//TmsmListLikeModel.AddNewElement procedure TmsmListLikeModel.DeleteSelection; //#UC START# *57F7B78D0250_57B57EDB003F_var* procedure DoDeleteView; function DoElement(const anElement: ImsmModelElement): Boolean; begin//DoElement Result := true; if not anElement.IsSameElement(Self.Get_List.Owner) then if anElement.BoolProp['IsSomeView'] then // - тут удалять можно только View anElement.Delete; end;//DoElement begin//DoDeleteView Selection.ProcessSelectedF(L2ImsmElementSelectionProcessSelectedFAction(@DoElement)); Fire(ListContentChangedEvent.Instance); end;//DoDeleteView procedure DoDeleteElement; procedure DeleteElement(const anElement: ImsmModelElement); begin//DeleteElement if (anElement <> nil) then begin TmsmDeletedElements.Instance.Add(anElement.MainWord); //anElement.Delete; // - тут нельзя Delete звать ибо например для Override неправильно работает // да и для DecoretedType'ов - тоже end;//anElement <> nil end;//DeleteElement function DoElement(const anElement: ImsmModelElement): Boolean; begin//DoElement Result := true; if not anElement.IsSameElement(Self.Get_List.Owner) then // - вообще-то эта проверка - ЛИШНЯЯ, // т.к. у элемента могут быть ссылки на СЕБЯ ЖЕ // - и ниже проверка - лишняя // ТАК это же - ССЫЛКИ, он НЕ РАВНЫ самому ЭЛЕМЕНТУ, // так что - всё правильно, сам элемент у них в поле Target begin Assert(not anElement.BoolProp['IsSomeView']); // - ибо пока по-моему такого не бывает, а там логика может быть более сложная // - здесь ещё надо вставить проверку того, что элемент принадлежит списку // Иначе можно огрести как с пустым Inherits. DeleteElement(anElement); (* if anElement.BoolProp['IsSomeView'] then DeleteElement(anElement.ElementProp['Viewed']);*) end;//not anElement.IsSameElement(Self.Get_List.Owner) end;//DoElement begin//DoDeleteElement Assert(not Self.Get_List.Owner.BoolProp['IsSomeView']); // - ибо пока по-моему такого не бывает, а там логика может быть более сложная Selection.ProcessSelectedF(L2ImsmElementSelectionProcessSelectedFAction(@DoElement)); TmsmChangedElements.Instance.Add(Self.Get_List.Owner.MainWord); Fire(ListContentChangedEvent.Instance); end;//DoDeleteElement //#UC END# *57F7B78D0250_57B57EDB003F_var* begin //#UC START# *57F7B78D0250_57B57EDB003F_impl* Assert(Selection <> nil); Assert(Self.Get_List.Owner <> nil); if Self.Get_List.Owner.BoolProp['IsDiagram'] then DoDeleteView else if (f_ElementView.rListName = 'Inherits') OR (f_ElementView.rListName = 'Implements') OR (f_ElementView.rListName = 'Overridden') OR (f_ElementView.rListName = 'Attributes') OR (f_ElementView.rListName = 'Operations') OR (f_ElementView.rListName = 'Dependencies') OR (f_ElementView.rListName = 'Parameters') then DoDeleteElement else Assert(false); //#UC END# *57F7B78D0250_57B57EDB003F_impl* end;//TmsmListLikeModel.DeleteSelection function TmsmListLikeModel.CanDeleteSelection: Boolean; //#UC START# *57F7B79A0325_57B57EDB003F_var* //#UC END# *57F7B79A0325_57B57EDB003F_var* begin //#UC START# *57F7B79A0325_57B57EDB003F_impl* Result := false; if (Self.Get_List = nil) then Exit; if (Self.Get_List.Owner = nil) then Exit; if (Selection = nil) then Exit; if Selection.Empty AND (Selection.CurrentElement = nil) then Exit; if (Selection.CurrentElement <> nil) then if Selection.CurrentElement.IsSameElement(Self.Get_List.Owner) then Exit; if Self.Get_List.Owner.BoolProp['IsDiagram'] then begin Result := true; Exit; end;//Self.Get_List.Owner.BoolProp['IsDiagram'] if (f_ElementView.rListName = 'Inherits') OR (f_ElementView.rListName = 'Implements') OR (f_ElementView.rListName = 'Overridden') OR (f_ElementView.rListName = 'Attributes') OR (f_ElementView.rListName = 'Operations') OR (f_ElementView.rListName = 'Dependencies') OR (f_ElementView.rListName = 'Parameters') then begin Result := true; Exit; end;//f_ElementView.rListName = 'Inherits' //#UC END# *57F7B79A0325_57B57EDB003F_impl* end;//TmsmListLikeModel.CanDeleteSelection procedure TmsmListLikeModel.ChangeProperties(const aKeyValues: ItfwArray); //#UC START# *57FC23270363_57B57EDB003F_var* //#UC END# *57FC23270363_57B57EDB003F_var* begin //#UC START# *57FC23270363_57B57EDB003F_impl* Self.Get_CurrentElement.Call( [TtfwStackValue_C(aKeyValues)], 'msm:ChangeProperties' ) //#UC END# *57FC23270363_57B57EDB003F_impl* end;//TmsmListLikeModel.ChangeProperties function TmsmListLikeModel.CanChangeProperties: Boolean; //#UC START# *57FC23540116_57B57EDB003F_var* //#UC END# *57FC23540116_57B57EDB003F_var* begin //#UC START# *57FC23540116_57B57EDB003F_impl* Result := false; (* if (Self.Get_List = nil) then Exit;*) if (Self.Get_CurrentElement = nil) then Exit; (* if not Self.Get_CurrentElement.BoolProp['IsDiagram'] then Exit;*) (* if (Self.Get_List.Owner.MEList['AllowedElements'].Count <= 0) then Exit;*) Result := true; //#UC END# *57FC23540116_57B57EDB003F_impl* end;//TmsmListLikeModel.CanChangeProperties function TmsmListLikeModel.PropertiesForNewElement: ItfwArray; //#UC START# *57FCC057014C_57B57EDB003F_var* //#UC END# *57FCC057014C_57B57EDB003F_var* begin //#UC START# *57FCC057014C_57B57EDB003F_impl* TmsmWaitCursor.Make; Assert(Self.f_ElementView.rElement <> nil); if (f_ElementView.rListName = 'Attributes') then Result := Self.f_ElementView.rElement.CallAndGetList([TtfwStackValue_NULL], 'msm:KeyValuesForNewAttribute') else if (f_ElementView.rListName = 'Operations') then Result := Self.f_ElementView.rElement.CallAndGetList([TtfwStackValue_NULL], 'msm:KeyValuesForNewOperation') else if (f_ElementView.rListName = 'Dependencies') then Result := Self.f_ElementView.rElement.CallAndGetList([TtfwStackValue_NULL], 'msm:KeyValuesForNewDependency') else if (f_ElementView.rListName = 'Parameters') then Result := Self.f_ElementView.rElement.CallAndGetList([TtfwStackValue_NULL], 'msm:KeyValuesForNewParameter') else if (f_ElementView.rListName = 'Inherits') then Result := Self.f_ElementView.rElement.CallAndGetList([], 'msm:KeyValuesForNewInherits') else if (f_ElementView.rListName = 'Implements') then Result := Self.f_ElementView.rElement.CallAndGetList([], 'msm:KeyValuesForNewImplements') else if (f_ElementView.rListName = 'Overridden') then Result := Self.f_ElementView.rElement.CallAndGetList([], 'msm:KeyValuesForNewOverridden') else begin Assert(Self.Get_List <> nil); Assert(Self.Get_List.Owner <> nil); Result := Self.Get_List.Owner.CallAndGetList([], 'msm:KeyValuesForNewElement'); end;//else //#UC END# *57FCC057014C_57B57EDB003F_impl* end;//TmsmListLikeModel.PropertiesForNewElement function TmsmListLikeModel.Properties: ItfwArray; //#UC START# *57FCC083017F_57B57EDB003F_var* //#UC END# *57FCC083017F_57B57EDB003F_var* begin //#UC START# *57FCC083017F_57B57EDB003F_impl* TmsmWaitCursor.Make; Result := Self.Get_CurrentElement.CallAndGetList([], 'msm:GetProperties'); //#UC END# *57FCC083017F_57B57EDB003F_impl* end;//TmsmListLikeModel.Properties function TmsmListLikeModel.DragOver(const aData: IDataObject; const aPoint: TPoint): Boolean; //#UC START# *57FF47AE00B4_57B57EDB003F_var* //#UC END# *57FF47AE00B4_57B57EDB003F_var* begin //#UC START# *57FF47AE00B4_57B57EDB003F_impl* Result := false; if (Self.Get_List = nil) then Exit; if (Self.Get_List.Owner = nil) then Exit; if Self.Get_List.Owner.BoolProp['IsDiagram'] then begin Result := true; Exit; end;//Self.Get_List.Owner.BoolProp['IsDiagram'] if (f_ElementView.rListName = 'Inherits') OR (f_ElementView.rListName = 'Implements') OR (f_ElementView.rListName = 'Overridden') OR (f_ElementView.rListName = 'Attributes') OR (f_ElementView.rListName = 'Operations') OR (f_ElementView.rListName = 'Dependencies') OR (f_ElementView.rListName = 'Parameters') then begin Result := true; Exit; end;//f_ElementView.rListName = 'Inherits' //#UC END# *57FF47AE00B4_57B57EDB003F_impl* end;//TmsmListLikeModel.DragOver procedure TmsmListLikeModel.InitFields; //#UC START# *47A042E100E2_57B57EDB003F_var* //#UC END# *47A042E100E2_57B57EDB003F_var* begin //#UC START# *47A042E100E2_57B57EDB003F_impl* inherited; if (f_Selection = nil) then f_Selection := TmsmElementSelection.Make(Self); //#UC END# *47A042E100E2_57B57EDB003F_impl* end;//TmsmListLikeModel.InitFields procedure TmsmListLikeModel.ClearFields; begin Finalize(f_ElementView); f_Selection := nil; f_ElementToAction := nil; inherited; end;//TmsmListLikeModel.ClearFields end.
#1303. MVC. TmsmModel. Только код
unit msmModel; // Модуль: "w:\common\components\gui\Garant\msm\msmModel.pas" // Стереотип: "SimpleClass" // Элемент модели: "TmsmModel" MUID: (57ADBFD200CA) {$Include w:\common\components\msm.inc} interface uses l3IntfUses , l3ProtoObject , msmModels , msmEvents , ImsmEventsSubscriberList ; type _msmEventsPublisher_Parent_ = Tl3ProtoObject; {$Include w:\common\components\gui\Garant\msm\msmEventsPublisher.imp.pas} _msmEventFire_Parent_ = _msmEventsPublisher_; {$Include w:\common\components\gui\Garant\msm\msmEventFire.imp.pas} TmsmModel = class(_msmEventFire_, ImsmModel, ImsmEventsPublisher) protected function As_ImsmEventsPublisher: ImsmEventsPublisher; {* Метод приведения нашего интерфейса к ImsmEventsPublisher } procedure Cleanup; override; {* Функция очистки полей объекта. } public class function Make: ImsmModel; reintroduce; end;//TmsmModel implementation uses l3ImplUses , SysUtils //#UC START# *57ADBFD200CAimpl_uses* //#UC END# *57ADBFD200CAimpl_uses* ; {$Include w:\common\components\gui\Garant\msm\msmEventsPublisher.imp.pas} {$Include w:\common\components\gui\Garant\msm\msmEventFire.imp.pas} class function TmsmModel.Make: ImsmModel; var l_Inst : TmsmModel; begin l_Inst := Create; try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//TmsmModel.Make function TmsmModel.As_ImsmEventsPublisher: ImsmEventsPublisher; {* Метод приведения нашего интерфейса к ImsmEventsPublisher } begin Result := Self; end;//TmsmModel.As_ImsmEventsPublisher procedure TmsmModel.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57ADBFD200CA_var* //#UC END# *479731C50290_57ADBFD200CA_var* begin //#UC START# *479731C50290_57ADBFD200CA_impl* inherited; //#UC END# *479731C50290_57ADBFD200CA_impl* end;//TmsmModel.Cleanup end.
#1302. MVC. ConcreteModelOwnViewController. Только код
{$IfNDef msmConcreteModelOwnViewControllerMixin_imp} // Модуль: "w:\common\components\gui\Garant\msm\msmConcreteModelOwnViewControllerMixin.imp.pas" // Стереотип: "Impurity" // Элемент модели: "msmConcreteModelOwnViewControllerMixin" MUID: (57AAE9AD018B) // Имя типа: "_msmConcreteModelOwnViewControllerMixin_" {$Define msmConcreteModelOwnViewControllerMixin_imp} // _ConcreteModel_ _msmConcreteModelOwnViewControllerMixin_ = {abstract} class(_msmConcreteModelOwnViewControllerMixin_Parent_) private f_Model: _ConcreteModel_; protected procedure Cleanup; override; {* Функция очистки полей объекта. } public constructor Create(const aModel: _ConcreteModel_; const aParent: ImsmViewParent); reintroduce; overload; class function Make(const aModel: _ConcreteModel_; const aParent: ImsmViewParent): ImsmViewController; reintroduce; overload; constructor Create(const aModel: _ConcreteModel_; const aParent: ImsmViewParent; const anInitContext: _InitContext_); reintroduce; overload; class function Make(const aModel: _ConcreteModel_; const aParent: ImsmViewParent; const anInitContext: _InitContext_): ImsmViewController; reintroduce; overload; protected property Model: _ConcreteModel_ read f_Model; end;//_msmConcreteModelOwnViewControllerMixin_ {$Else msmConcreteModelOwnViewControllerMixin_imp} {$IfNDef msmConcreteModelOwnViewControllerMixin_imp_impl} {$Define msmConcreteModelOwnViewControllerMixin_imp_impl} constructor _msmConcreteModelOwnViewControllerMixin_.Create(const aModel: _ConcreteModel_; const aParent: ImsmViewParent); //#UC START# *57AAEA5202AA_57AAE9AD018B_var* var l_InitContext : _InitContext_; //#UC END# *57AAEA5202AA_57AAE9AD018B_var* begin //#UC START# *57AAEA5202AA_57AAE9AD018B_impl* Finalize(l_InitContext); System.FillChar(l_InitContext, SizeOf(l_InitContext), 0); Create(aModel, aParent, l_InitContext); //#UC END# *57AAEA5202AA_57AAE9AD018B_impl* end;//_msmConcreteModelOwnViewControllerMixin_.Create class function _msmConcreteModelOwnViewControllerMixin_.Make(const aModel: _ConcreteModel_; const aParent: ImsmViewParent): ImsmViewController; var l_Inst : _msmConcreteModelOwnViewControllerMixin_; begin l_Inst := Create(aModel, aParent); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//_msmConcreteModelOwnViewControllerMixin_.Make constructor _msmConcreteModelOwnViewControllerMixin_.Create(const aModel: _ConcreteModel_; const aParent: ImsmViewParent; const anInitContext: _InitContext_); //#UC START# *57B466EE01D6_57AAE9AD018B_var* //#UC END# *57B466EE01D6_57AAE9AD018B_var* begin //#UC START# *57B466EE01D6_57AAE9AD018B_impl* Assert(aModel <> nil); f_Model := aModel; inherited Create(aModel, aParent, anInitContext); //#UC END# *57B466EE01D6_57AAE9AD018B_impl* end;//_msmConcreteModelOwnViewControllerMixin_.Create class function _msmConcreteModelOwnViewControllerMixin_.Make(const aModel: _ConcreteModel_; const aParent: ImsmViewParent; const anInitContext: _InitContext_): ImsmViewController; var l_Inst : _msmConcreteModelOwnViewControllerMixin_; begin l_Inst := Create(aModel, aParent, anInitContext); try Result := l_Inst; finally l_Inst.Free; end;//try..finally end;//_msmConcreteModelOwnViewControllerMixin_.Make procedure _msmConcreteModelOwnViewControllerMixin_.Cleanup; {* Функция очистки полей объекта. } //#UC START# *479731C50290_57AAE9AD018B_var* //#UC END# *479731C50290_57AAE9AD018B_var* begin //#UC START# *479731C50290_57AAE9AD018B_impl* inherited; f_Model := nil; //#UC END# *479731C50290_57AAE9AD018B_impl* end;//_msmConcreteModelOwnViewControllerMixin_.Cleanup {$EndIf msmConcreteModelOwnViewControllerMixin_imp_impl} {$EndIf msmConcreteModelOwnViewControllerMixin_imp}
#1301. MVC. EditViewController. Только код
{$IfNDef msmEditViewController_imp} // Модуль: "w:\common\components\gui\Garant\msm\msmEditViewController.imp.pas" // Стереотип: "Impurity" // Элемент модели: "msmEditViewController" MUID: (57FBA9B70217) // Имя типа: "_msmEditViewController_" {$Define msmEditViewController_imp} _ConcreteModel_ = ImsmCaptionModel; _InitContext_ = TmsmEditViewInitContext; {$Include w:\common\components\gui\Garant\msm\msmConcreteModelOwnViewController.imp.pas} _msmEditViewController_ = class(_msmConcreteModelOwnViewController_) protected procedure DoTextChange(Sender: TObject); virtual; procedure DoCaptionChangedEvent(anEvent: TmsmEvent); procedure InitOwnView; override; procedure LinkDataToView; override; procedure LinkEventHandlers; override; end;//_msmEditViewController_ {$Else msmEditViewController_imp} {$IfNDef msmEditViewController_imp_impl} {$Define msmEditViewController_imp_impl} {$Include w:\common\components\gui\Garant\msm\msmConcreteModelOwnViewController.imp.pas} procedure _msmEditViewController_.DoTextChange(Sender: TObject); //#UC START# *57FBAD4B01C7_57FBA9B70217_var* //#UC END# *57FBAD4B01C7_57FBA9B70217_var* begin //#UC START# *57FBAD4B01C7_57FBA9B70217_impl* Self.Model.Caption := TtfwCStringFactory.C(OwnView.Text); //#UC END# *57FBAD4B01C7_57FBA9B70217_impl* end;//_msmEditViewController_.DoTextChange procedure _msmEditViewController_.DoCaptionChangedEvent(anEvent: TmsmEvent); //#UC START# *57FBA9B70217_57CD31A200FA_57FBA9B70217_var* //#UC END# *57FBA9B70217_57CD31A200FA_57FBA9B70217_var* begin //#UC START# *57FBA9B70217_57CD31A200FA_57FBA9B70217_impl* inherited; LinkDataToView; //#UC END# *57FBA9B70217_57CD31A200FA_57FBA9B70217_impl* end;//_msmEditViewController_.DoCaptionChangedEvent procedure _msmEditViewController_.InitOwnView; //#UC START# *57ADFB33027D_57FBA9B70217_var* //#UC END# *57ADFB33027D_57FBA9B70217_var* begin //#UC START# *57ADFB33027D_57FBA9B70217_impl* inherited; OwnView.AutoSelect := false; OwnView.OnTextChange := Self.DoTextChange; OwnView.Enabled := not InitContext.rDisabled; OwnView.ReadOnly := InitContext.rReadOnly; //#UC END# *57ADFB33027D_57FBA9B70217_impl* end;//_msmEditViewController_.InitOwnView procedure _msmEditViewController_.LinkDataToView; //#UC START# *57B6A49900F4_57FBA9B70217_var* //#UC END# *57B6A49900F4_57FBA9B70217_var* begin //#UC START# *57B6A49900F4_57FBA9B70217_impl* inherited; if l3IsNil(Model.Caption) then begin if not OwnView.TextSource.HasDocument then OwnView.TextSource.New else OwnView.Text := ''; end//l3IsNil(Model.Caption) else OwnView.Text := l3Str(Model.Caption); //#UC END# *57B6A49900F4_57FBA9B70217_impl* end;//_msmEditViewController_.LinkDataToView procedure _msmEditViewController_.LinkEventHandlers; begin inherited; Self.LinkEventHandler(CaptionChangedEvent.Instance, DoCaptionChangedEvent); end;//_msmEditViewController_.LinkEventHandlers {$EndIf msmEditViewController_imp_impl} {$EndIf msmEditViewController_imp}
пятница, 28 октября 2016 г.
#1299. Скриптованная бизнес-логика рисовалки моделей
По мотивам - http://programmingmindstream.blogspot.ru/2016/10/1298.html
UNIT msm.ms.dict USES core.ms.dict ; USES axiom_push.ms.dict ; USES ModelElementsDefinition.ms.dict ; USES ElemMemberPrim.ms.dict ; USES ElementsRTTI.ms.dict ; USES msmMetaModel.ms.dict ; USES IsNil.ms.dict ; USES arrays.ms.dict ; elem_iterator NullList [empty] >>> Result ; // NullList WordAlias ._NullList .NullList elem_iterator SelfList [ Self ] >>> Result ; // SelfList WordAlias ._SelfList .SelfList elem_iterator Inner Cached: ( Self .Children .join> ( Self .Constants ) .join> ( Self .Attributes ) .join> ( Self .Operations ) .join> ( Self .Dependencies ) .join> ( Self .Parameters ) ) >>> Result ; // Inner USES FirstElement.ms.dict ; STRING elem_func UpText Self .NameInModel >>> Result if ( Result .IsNil ) then begin Self .WordName >>> Result end // ( Result .IsNil ) if ( Self .IsUP ) then begin VAR l_Value [ Self DO ] .map> ( IN aValue RULES ( aValue IsObj ) ( aValue .Name ) DEFAULT ( aValue ToPrintable ) ; // RULES ) .FirstElement >>> l_Value [ Result ' = ' l_Value ] strings:Cat >>> Result end // ( Self .IsUP ) ; // UpText STRING elem_func LinkName '' >>> Result VAR l_St Self .Stereotype >>> l_St if ( ( l_St .NotIsNil ) AND ( l_St .NameInModel .NotIsNil ) ) then begin [ '<<' l_St .NameInModel '::' string:Split DROP '>>' ] strings:Cat >>> Result end // ( l_St .NotIsNil ) if ( Self .NameInModel .NotIsNil ) then begin [ Result Self .NameInModel ] ' ' strings:CatSep >>> Result end // ( Self .NameInModel .NotIsNil ) ; // LinkName WordAlias .msm:LinkName .LinkName WordAlias ME_EmptyStereo ME_EmptyStereo STRING elem_func StereotypeName Cached: ( VAR l_St Self .Stereotype >>> l_St RULES ( l_St ME_EmptyStereo ?== ) '' ( ( l_St .NotIsNil ) AND ( l_St .NameInModel .NotIsNil ) ) begin [ '<<' l_St .NameInModel '>>' ] strings:Cat end // ( l_St .NotIsNil ) DEFAULT begin [ '[[' Self .MDAClassString ']]' ] strings:Cat // '<<default>>' end ; // RULES ) >>> Result ; // StereotypeName STRING elem_func NameNotEmpty Cached: ( Self .NameInModel >>> Result if ( Result .IsNil ) then begin '(unnamed)' >>> Result end // ( Result .IsNil ) Result ) >>> Result ; // NameNotEmpty STRING elem_func NameWithStereo Cached: ( Self .NameNotEmpty >>> Result VAR l_St Self .StereotypeName >>> l_St if ( l_St .NotIsNil ) then begin [ l_St ' ' Result ] strings:Cat >>> Result end // ( l_St .NotIsNil ) Result ) >>> Result ; // NameWithStereo USES ExtValue.ms.dict ; STRING elem_func ValueString '' >>> Result VAR l_Value Self .ExtValueOrValue >>> l_Value if ( l_Value .IsValueValid ) then begin l_Value ToPrintable >>> Result end // ( l_Value .IsValueValid ) ; // ValueString USES CountIt.ms.dict ; ModelElement elem_func FirstOperation Cached: ( Self .Operations .filter> ( .IsLocalMethod ! ) .FirstElement ) >>> Result ; // FirstOperation elem_iterator MethodParameters Cached: ( RULES ( Self .Parameters .NotIsNil ) ( Self .Parameters ) ( Self .IsMethod ) ( Self .FirstOperation .Parameters ) ( Self .IsFunction ) ( Self .FirstOperation .Parameters ) DEFAULT ( Self .Parameters ) ; // RULES ) >>> Result ; // MethodParameters ModelElement elem_func MethodTarget Cached: ( RULES ( Self .Target .NotIsNil ) ( Self .Target ) ( Self .IsMethod ) ( Self .FirstOperation .Target ) ( Self .IsFunction ) ( Self .FirstOperation .Target ) ( Self .IsViewLink ) RULES ( Self .Target .IsNil ) ( Self .To ) DEFAULT ( Self .Target ) ; // RULES DEFAULT ( Self .Target ) ; // RULES ) >>> Result ; // MethodTarget STRING elem_func ParametersString '' >>> Result VAR l_P VAR l_Open VAR l_Close if ( Self .MDAClass class_Attribute == ) then begin Self .Attributes >>> l_P '[' >>> l_Open ']' >>> l_Close end // ( Self .MDAClass class_Attribute == ) else begin Self .MethodParameters >>> l_P '(' >>> l_Open ')' >>> l_Close end // ( Self .MDAClass class_Attribute == ) if ( l_P .NotEmpty ) then begin [ VAR l_WasParam false >>> l_WasParam l_Open l_P .for> ( IN aParam if l_WasParam then ', ' VAR l_St aParam .Stereotype >>> l_St if ( l_St .NotIsNil ) then begin if ( l_St .NameInModel 'in' != ) then begin l_St .NameInModel ' ' end // ( l_St .NameInModel 'in' != ) end // ( l_St .NotIsNil ) aParam .NameInModel VAR l_T aParam .Target >>> l_T VAR l_N if ( l_T .IsNil ) then begin 'void' >>> l_N end // ( l_T .IsNil ) else begin l_T .NameInModel >>> l_N end // ( l_T .IsNil ) ': ' l_N VAR l_V aParam .ValueString >>> l_V if ( l_V .NotIsNil ) then begin ' = ' l_V end // ( l_V .NotIsNil ) true >>> l_WasParam ) //l_P .for> l_Close ] strings:Cat >>> Result end // l_P .NotEmpty ; // ParametersString STRING elem_func Signature Cached: ( [ Self .NameNotEmpty Self .ParametersString ] strings:Cat >>> Result if ( Self .IsViewLink ) then begin if ( Self .From .NotIsNil ) then begin [ Result ' ' Self .From .NameInModel ] strings:Cat >>> Result end // ( Self .From .NotIsNil ) if ( Self .To .NotIsNil ) then begin [ Result ' ==> ' Self .To .NameInModel ] strings:Cat >>> Result end // ( Self .To .NotIsNil ) end // ( Self .IsViewLink ) else begin VAR l_T Self .MethodTarget >>> l_T if ( l_T .NotIsNil ) then begin VAR l_Name l_T .NameInModel >>> l_Name if ( l_Name .IsNil ) then begin 'void' >>> l_Name end // ( l_Name .IsNil ) [ Result ': ' l_Name ] strings:Cat >>> Result end // ( l_T .NotIsNil ) end // ( Self .IsViewLink ) Result ) >>> Result ; // Signature WordAlias .msm:Signature .Signature STRING elem_func NameWithStereoAndTarget Cached: ( [ Self .StereotypeName Self .Signature ] ' ' strings:CatSep ) >>> Result ; // NameWithStereoAndTarget STRING elem_func msm:SignatureAndValue Cached: ( Self .msm:Signature >>> Result VAR l_Value Self .ValueString >>> l_Value if ( l_Value .NotIsNil ) then begin [ Result ' = ' l_Value ] strings:Cat >>> Result end // ( l_Value .NotIsNil ) Result ) >>> Result ; // msm:SignatureAndValue STRING elem_func NameWithStereoAndTargetAndValue Cached: ( Self .NameWithStereoAndTarget >>> Result VAR l_Value Self .ValueString >>> l_Value if ( l_Value .NotIsNil ) then begin [ Result ' = ' l_Value ] strings:Cat >>> Result end // ( l_Value .NotIsNil ) Result ) >>> Result ; // NameWithStereoAndTargetAndValue STRING elem_func NameWithStereoAndTargetAndValueAndDoc Self .NameWithStereoAndTargetAndValue >>> Result VAR l_D Self .Documentation >>> l_D if ( l_D .NotIsNil ) then begin [ Result #10 ' - ' l_D ] strings:Cat >>> Result end // ( l_D .NotIsNil ) ; // NameWithStereoAndTargetAndValueAndDoc STRING elem_func DocumentationNotEmpty Self .Documentation >>> Result if ( Result .IsNil ) then begin 'Элемент не документирован' >>> Result end // ( Result .IsNil ) ; // DocumentationNotEmpty BOOLEAN elem_func IsFinished Self .GetUP "finished" false ?!= >>> Result ; // IsFinished WordAlias .DefaultShortText .NameWithStereo //WordAlias .DefaultText .Name //WordAlias .DefaultSearchText .Name WordAlias .DefaultSearchText .NameInModel WordAlias .DefaultText .NameWithStereoAndTargetAndValue WordAlias .DefaultFullText .DefaultText WordAlias .DefaultTextAndDoc .NameWithStereoAndTargetAndValueAndDoc USES CompileTimeVar.ms.dict ; USES Log.ms.dict ; BOOLEAN CompileTime-VAR g_NeedTerminate false PROCEDURE TerminateLoadInner true >>> g_NeedTerminate Log: 'Terminate Request' ; // TerminateLoadInner FORWARD .msm:MainDiagram elem_proc LoadChildInfo if ( g_NeedTerminate ! ) then begin Self .Stereotype DROP Self .NameWithStereo DROP Self .DefaultText DROP Self .Parent DROP Self .IsSummoned DROP Self .msm:MainDiagram DROP Self .Depends DROP Self .Inherits DROP Self .Implements DROP //Self .Implemented DROP //Self .Overridden DROP //Self .Dependencies DROP //Self .UpList DROP //Self .DocumentationNotEmpty DROP Self .Inner DROP end // ( g_NeedTerminate ! ) ; // LoadChildInfo elem_proc LoadInnerPrim if ( g_NeedTerminate ! ) then begin Self .LoadChildInfo Self .Inner .for> ( if g_NeedTerminate then begin DROP end // g_NeedTerminate else begin call.me end // g_NeedTerminate ) // Self .Inner .for> end // ( g_NeedTerminate ! ) ; // LoadInnerPrim BOOLEAN elem_func LoadLevel true >>> Result if ( g_NeedTerminate ! ) then begin Self .LoadChildInfo /*{ Self .Inner .for> ( if g_NeedTerminate then begin DROP end // g_NeedTerminate else begin .LoadChildInfo end // g_NeedTerminate ) // Self .Inner .for>}*/ end // ( g_NeedTerminate ! ) ; // LoadLevel USES ModelRoot.ms.dict ; USES ProcessModelFiles.ms.dict ; USES DictionaryByName.ms.dict ; BOOLEAN elem_func LoadInner PROCEDURE LoadDictionaries PROCEDURE LoadWithString IN aString ModelRootIn .ProcessModelFiles: ( STRING IN aFileName if ( g_NeedTerminate ! ) then begin if ( aString aFileName FindInFile ) then begin Log: aFileName aFileName .DictionaryByName DROP 500 SLEEP end // ( aString aFileName FindInFile ) end // ( g_NeedTerminate ! ) ) // ModelRootIn .ProcessModelFiles: ; // LoadWithString 'Stereotype st_Project' LoadWithString 'Stereotype st_Library' LoadWithString 'Stereotype st_Unit' LoadWithString 'Stereotype st_SimpleClass' LoadWithString ; // LoadDictionaries Log: 'Loading' true >>> Result Self .LoadInnerPrim //LoadDictionaries //Self .LoadInnerPrim if g_NeedTerminate then begin Log: 'Terminated' end // g_NeedTerminate else begin Log: 'Loaded' end // g_NeedTerminate ; // LoadInner USES axiom:TColor ; INTEGER elem_func msm:View:ForeColor RULES ( Self .IsProject ) TColor::clGreen ( Self .IsUnit ) TColor::clGreen ( Self .IsExeTarget ) TColor::clGreen ( Self .IsLibrary ) TColor::clBlue ( Self .IsInterfaces ) TColor::clNavy ( Self .IsStereotype st_Facet ) TColor::clNavy ( Self .IsStereotype st_Interface ) TColor::clNavy ( Self .IsMixIn ) TColor::clFuchsia //TColor::clMoneyGreen //TColor::clLime ( Self .IsSimpleClass ) TColor::clGreen ( Self .IsUtilityPack ) TColor::clRed ( Self .IsMixInMirror ) TColor::clAqua ( Self .IsEnum ) TColor::clOlive ( Self .IsTypedef ) TColor::clMedGray DEFAULT TColor::clDefault ; // RULES >>> Result ; // msm:View:ForeColor USES WordsRTTI.ms.dict ; INTEGER elem_func StereotypeBackColor Cached: ( VAR l_Color Self .StereotypeInModel .GetUP "visualization bg color" >>> l_Color RULES ( l_Color IsInt ) l_Color DEFAULT begin TColor::clDefault >>> l_Color Self .StereotypeAncestors .for> ( IN anAncestor VAR l_AncestorColor anAncestor call.me >>> l_AncestorColor RULES ( ( l_AncestorColor IsInt ) AND ( l_AncestorColor TColor::clDefault != ) ) ( l_AncestorColor >>> l_Color BREAK-ITERATOR ) ; // RULES ) // Self .Inherited.Words .for> l_Color end // DEFAULT ; // RULES ) >>> Result ; // StereotypeBackColor BOOLEAN elem_func ViewInOwnDiagram RULES ( Self .Parent .Viewed Self .Viewed ?== ) // - мы на СВОЕЙ же диаграмме true ( Self .Parent .Viewed Self .Viewed .Parent ?!= ) // - мы на чужой диаграмме false DEFAULT // - мы на диаграмме родителя true ; // RULES >>> Result ; // ViewInOwnDiagram INTEGER elem_func msm:View:BackColor RULES ( Self .ViewInOwnDiagram ! ) TColor::clWhite DEFAULT begin VAR l_Color Self .Stereotype .StereotypeInModel .StereotypeBackColor >>> l_Color RULES ( l_Color IsInt ) RULES ( l_Color TColor::clDefault == ) ( Self .msm:View:ForeColor ) DEFAULT l_Color ; // RULES DEFAULT ( Self .msm:View:ForeColor ) ; // RULES end // DEFAULT ; // RULES >>> Result ; // msm:View:BackColor INTEGER elem_func StereotypeTextColor Cached: ( VAR l_Color Self .StereotypeInModel .GetUP "visualization f-font color" >>> l_Color RULES ( l_Color IsInt ) l_Color DEFAULT begin TColor::clDefault >>> l_Color Self .StereotypeAncestors .for> ( IN anAncestor VAR l_AncestorColor anAncestor call.me >>> l_AncestorColor RULES ( ( l_AncestorColor IsInt ) AND ( l_AncestorColor TColor::clDefault != ) ) ( l_AncestorColor >>> l_Color BREAK-ITERATOR ) ; // RULES ) // Self .Inherited.Words .for> l_Color end // DEFAULT ; // RULES ) >>> Result ; // StereotypeTextColor INTEGER elem_func msm:View:TextColor RULES ( Self .ViewInOwnDiagram ! ) ( Self .Stereotype .StereotypeInModel .StereotypeTextColor ) //TColor::clNavy DEFAULT TColor::clBlack ; // RULES >>> Result ; // msm:View:TextColor STRING elem_func msm:StereotypeDocumentation Cached: ( VAR l_Label Self .Documentation >>> l_Label RULES ( l_Label .IsNil ) () ( 'перекрытие стандартного стереотипа' l_Label StartsText ) ( '' >>> l_Label ) ( 'нет дополнительной документации' l_Label ?== ) ( '' >>> l_Label ) ; // RULES RULES ( l_Label .NotIsNil ) l_Label DEFAULT begin '' >>> l_Label RULES ( Self IsString ) () DEFAULT begin Self .StereotypeAncestors .for> ( IN anAncestor VAR l_AncestorLabel anAncestor call.me >>> l_AncestorLabel RULES ( l_AncestorLabel .NotIsNil ) ( l_AncestorLabel >>> l_Label BREAK-ITERATOR ) ; // RULES ) // .for> end // DEFAULT ; // RULES l_Label end // DEFAULT ; // RULES ) >>> Result ; // msm:StereotypeDocumentation STRING elem_func StereotypeLabelName Cached: ( VAR l_Label Self .GetUP "personal label" >>> l_Label RULES ( l_Label .NotIsNil ) l_Label DEFAULT begin '' >>> l_Label RULES ( Self IsString ) () DEFAULT begin Self .StereotypeAncestors .for> ( IN anAncestor VAR l_AncestorLabel anAncestor call.me >>> l_AncestorLabel RULES ( l_AncestorLabel .NotIsNil ) ( l_AncestorLabel >>> l_Label BREAK-ITERATOR ) ; // RULES ) // .for> end // DEFAULT ; // RULES RULES ( l_Label .IsNil ) begin RULES ( Self .IsStereotype: st_MDAParameter ) ( 'code_param' >>> l_Label ) ( Self .IsStereotype: st_MDAAttribute ) ( 'code_attr' >>> l_Label ) ; // RULES end // ( l_Label .IsNil ) ; // RULES l_Label end // DEFAULT ; // RULES ) >>> Result ; // StereotypeLabelName STRING elem_func msm:View:LabelName VAR l_Label Self .Stereotype .StereotypeInModel .StereotypeLabelName >>> l_Label RULES ( l_Label .NotIsNil ) l_Label ( Self .IsUseCase ) 'code_use_case' ( Self .MDAClass class_Operation == ) 'code_method' ( Self .MDAClass class_Attribute == ) 'code_attr' ( Self .MDAClass class_Parameter == ) 'code_param' ( Self .MDAClass class_Dependency == ) 'code_mda_dependency' ( Self .MDAClass class_Inherits == ) 'code_mda_dependency' ( Self .MDAClass class_Implements == ) 'code_mda_dependency' ( Self .MDAClass class_Depends == ) 'code_dep' ( Self .IsStereotype: st_MDAParameter ) 'code_param' DEFAULT '' ; // RESULT >>> Result ; // msm:View:LabelName STRING elem_func msm:View:VisibilityLabel RULES ( Self .Visibility PublicAccess == ) //'public' '' ( Self .Visibility PrivateAccess == ) 'private' ( Self .Visibility ProtectedAccess == ) 'protected' ( Self .Visibility ImplementationAccess == ) 'implemented' ( Self .Visibility PublishedAccess == ) 'published' DEFAULT 'undefined' ; // RULES >>> Result ; // msm:View:VisibilityLabel USES joinWithLambded.ms.dict ; USES CopyWithoutDuplicatedNames.ms.dict ; USES CopyWithoutDuplicates.ms.dict ; USES CopyWithoutDuplicatedUnstereotyped.ms.dict ; USES StereotypeAllowedElements.ms.dict ; EXPORTS StereotypeAllowedElements.ms.dict USES NS.ms.dict ; elem_iterator InnerTypes Self .Children //.join> ( Self .Constants ) >>> Result ; // InnerTypes USES Predicates.ms.dict ; BOOLEAN elem_func IsCategory Self .MDAClass class_Category == >>> Result ; // IsCategory elem_iterator DeepInnerTypes [empty] RULES ( Self .IsNil ) () ( Self .MDAClass class_Inherits == ) () ( Self .MDAClass class_Implements == ) () ( Self .MDAClass class_Depends == ) () DEFAULT begin .join> ( Self .InnerTypes ) .joinWithLambded> ( Self .InnerTypes ) call.me .filter> .Not: .IsCategory .CopyWithoutDuplicatedModelElements end // DEFAULT ; // RULES >>> Result ; // DeepInnerTypes EXPORTS DictionaryByName.ms.dict USES CheckValue.ms.dict ; : .CheckValueSafe if ( StackLevel > 0 ) then .CheckValue ; // .CheckValueSafe USES IsSameModelElement.ms.dict ; USES PrimitivesModel.ms.dict ; ARRAY FUNCTION msm:Primitives Primitives::Delphi::System .DeepInnerTypes .join> ( Primitives::Primitives .DeepInnerTypes ) >>> Result ; // msm:Primitives WordAlias Primitives msm:Primitives elem_iterator AccessibleTypes Cached: ( [empty] RULES ( Self .IsNil ) () ( Self .MDAClass class_Inherits == ) () ( Self .MDAClass class_Implements == ) () ( Self .MDAClass class_Depends == ) () DEFAULT begin .join> ( Self .DeepInnerTypes ) RULES ( Self .IsCategory ) () DEFAULT begin if ( Self Primitives::Delphi::System .IsSameModelElement ! ) then begin .join> ( Primitives::Delphi::System .DeepInnerTypes ) end // ( Self Primitives::Delphi::System .IsSameModelElement ! ) if ( Self Primitives::Primitives .IsSameModelElement ! ) then begin .join> ( Primitives::Primitives .DeepInnerTypes ) end // ( Self Primitives::Primitives .IsSameModelElement ! ) .join> ( Self .Parent .DeepInnerTypes ) .join> ( [empty] .joinWithLambded> ( Self .Parent .Depends ) .DeepInnerTypes .filter> ( .Visibility PublicAccess ?== ) // - из чужих пакетов можно видеть только публичные элементы ) // .join> end // DEFAULT ; // RULES .CopyWithoutDuplicatedModelElements end // DEFAULT ; // RULES ) >>> Result ; // AccessibleTypes WordAlias .AllowedInherits .AccessibleTypes WordAlias .AllowedImplements .AccessibleTypes USES Out.ms.dict ; STRING FUNCTION .LabelNameToImageFileName STRING IN Self Self >>> Result if ( Result .NotIsNil ) then begin VAR l_Path thisDictionary pop:DictionaryEx:FileName sysutils:ExtractFilePath >>> l_Path [ l_Path 'images' ] cPathSep strings:CatSep >>> l_Path l_Path sysutils:DirectoryExists ?ASSURE [ 'Директория не существует: "' l_Path '"'] [ [ l_Path Result ] cPathSep strings:CatSep '.gif' ] strings:Cat >>> Result //[ 'W:\MDProcess\MDAGenerator\other\images\' Result '.gif' ] strings:Cat >>> Result end // ( Result .NotIsNil ) ; // .LabelNameToImageFileName STRING elem_func msm:View:ImageFileName Self .msm:View:LabelName .LabelNameToImageFileName >>> Result ; // msm:View:ImageFileName STRING elem_func msm:View:StereotypeImageFileName Self .StereotypeLabelName .LabelNameToImageFileName >>> Result ; // msm:View:StereotypeImageFileName BOOLEAN elem_func IsAttribute Self .MDAClass class_Attribute == >>> Result ; // IsAttribute BOOLEAN elem_func IsAbstract Self .NSAbstraction at_abstract == >>> Result ; // IsAbstract BOOLEAN elem_func IsFinal Self .NSAbstraction at_final == >>> Result ; // IsFinal USES axiom:TPenStyle ; INTEGER elem_func msm:View:LinkLineStyle Cached: ( RULES ( Self .IsAttribute ) TPenStyle::psSolid ( Self .MDAClass class_Inherits ?== ) TPenStyle::psSolid ( Self .MDAClass class_Implements ?== ) TPenStyle::psDash DEFAULT TPenStyle::psDash ; // RULES ) >>> Result ; // msm:View:LinkLineStyle INTEGER elem_func msm:View:LinkLineColor Cached: ( RULES ( Self .IsAttribute ) TColor::clBlack ( Self .MDAClass class_Inherits ?== ) TColor::clBlack ( Self .MDAClass class_Implements ?== ) TColor::clBlack DEFAULT TColor::clDefault ; // RULES ) >>> Result ; // msm:View:LinkLineColor BOOLEAN elem_func msm:View:LinkArrowIsPolygon Cached: ( RULES ( Self .IsAttribute ) false ( Self .MDAClass class_Inherits ?== ) true ( Self .MDAClass class_Implements ?== ) true DEFAULT false ; // RULES ) >>> Result ; // msm:View:LinkArrowIsPolygon USES LoadOnDemand.ms.dict ; USES CutSuffix.ms.dict ; USES CutPrefix.ms.dict ; USES Diagrams.ms.dict ; WordAlias .msm:View:X .X WordAlias .msm:View:Y .Y WordAlias .msm:View:Width .Width WordAlias .msm:View:Height .Height WordAlias .msm:View:From .From WordAlias .msm:View:To .To ModelElement elem_func msm:DiagramByName STRING IN aName Self .msm:Diagrams .filter> ( .Name aName SameText ) .FirstElement >>> Result ; // msm:DiagramByName ModelElement elem_func msm:DiagramByName: ^L IN aName Self aName |N .msm:DiagramByName >>> Result ; // msm:DiagramByName: ModelElement elem_func msm:MainDiagram Self .msm:DiagramByName: main //Self 'main' .msm:DiagramByName >>> Result ; // msm:MainDiagram BOOLEAN elem_func msm:HasMainDiagram Self .msm:MainDiagram .NotIsNil >>> Result ; // msm:HasMainDiagram ModelElement FUNCTION .WordByDictionaryPath IN aPath aPath DictionaryAndMainWordByName >>> Result // - возвращаем слово DROP // - выкидываем словарь ; // .WordByDictionaryPath USES DictFileName.ms.dict ; USES WordIsVar.ms.dict ; USES GenerationFramework.ms.dict ; elem_proc GenerateElement RULES ( ( Self .IsSomeView ) AND ( Self .Viewed Self ?!= ) ) ( Self .Viewed call.me ) ( Self .UID .IsNil ) then ( Self .Parent call.me ) DEFAULT begin VAR l_DictFileName Self .DictFileName >>> l_DictFileName if ( l_DictFileName .IsNil ) then begin ERROR [ 'Не задано имя словаря для ' Self .Name ] end // ( l_DictFileName .IsNil ) if ( l_DictFileName sysutils:ExtractFilePath .IsNil ) then begin [ ModelRoot .CheckDrive l_DictFileName ] cPathSep strings:CatSep >>> l_DictFileName end // ( l_DictFileName sysutils:ExtractFilePath .IsNil ) VAR l_ListName Self .Name >>> l_ListName l_ListName ' ' '_' string:Replace >>> l_ListName [ 'C:\Temp\' l_ListName '.list' ] strings:Cat >>> l_ListName //[ 'C:\Temp\' l_DictFileName sysutils:ExtractFileName '.list' ] strings:Cat >>> l_ListName l_ListName .ProcessTmpOut: ( l_DictFileName .Out ) // l_ListName .ProcessTmpOut: l_ListName sysutils:FileExists ?ASSURE [ 'Файл не существует: "' l_ListName '"'] VAR l_CmdFileName [ l_DictFileName sysutils:ExtractFilePath 'cal.cmd' ] strings:Cat >>> l_CmdFileName l_CmdFileName sysutils:FileExists ?ASSURE [ 'Файл не существует: "' l_CmdFileName '"'] [ l_CmdFileName ' ' '-list:' l_ListName ' ' '-nomodel' ] strings:Cat WinExec //[ l_DictFileName sysutils:ExtractFilePath 'cal.cmd' ' ' l_DictFileName ' ' '-nomodel' ] strings:Cat WinExec end // ( Self .UID .IsNil ) ; // RULES ; // GenerateElement USES SetElementVar.ms.dict ; EXPORTS SetElementVar.ms.dict USES axiom:msm ; elem_proc msm:SetElementVar STRING IN aName IN aValue aValue aName Self msm:CallSetter ; // msm:SetElementVar USES ModelGeneration.ms.dict ; USES ModelSaving.ms.dict ; USES DiagramGeneration.ms.dict ; USES DiagramSaving.ms.dict ; elem_proc SaveDiagrams Self @ .diagram.save.script .Save ; // SaveDiagrams elem_proc SaveModel Self @ .model.save.script .Save ; // SaveModel PROCEDURE .SaveElements ARRAY IN anElements ARRAY VAR l_SavedElements [] >>> l_SavedElements anElements .for> ( IN anElementToSave RULES ( anElementToSave .IsView ) ( anElementToSave .Parent >>> anElementToSave ) ( anElementToSave .IsViewLink ) ( anElementToSave .Parent >>> anElementToSave ) ; // RULES //if ( anElementToSave .AddToArray?: l_SavedElements ) then begin RULES ( anElementToSave .IsDiagram ) begin if ( anElementToSave /*{.Viewed}*/ .AddToArray?: l_SavedElements ) then ( anElementToSave .Viewed .SaveDiagrams ) end // ( anElementToSave .IsDiagram ) DEFAULT begin if ( anElementToSave .AddToArray?: l_SavedElements ) then ( anElementToSave .SaveModel ) end // DEFAULT ; // RULES end // ( anElementToSave .AddToArray?: l_SavedElements ) ) // anElements .for> ; // .SaveElements USES CreateGUID.ms.dict ; USES LUID.ms.dict ; USES KeyValuesCreateAndDo.ms.dict ; USES MEPrefix.ms.dict ; elem_proc SetupProducerAndKey TtfwWord IN aProducer TtfwKeyWord IN aKey aProducer Self pop:Word:SetProducer Self aKey pop:KeyWord:SetWord aKey Self pop:Word:SetKey ; // SetupProducerAndKey PROCEDURE .ElementCreateAndDo: TtfwWord IN aProducer TtfwKeyWord IN aKey ^ IN aLambda KeyValuesCreateAndDo: ( IN aMade aMade aProducer aKey .SetupProducerAndKey aMade aLambda DO ) // KeyValuesCreateAndDo: ; // .ElementCreateAndDo: TtfwDictionaryEx TtfwWord TYPE TDefinitor TtfwKeyWord FUNCTION .msm:Definitor:CheckWord STRING IN aName TDefinitor IN aDefinitor RULES ( aDefinitor Is class::TtfwWord ) ( aName aDefinitor pop:NewWordDefinitor:CheckWord ) ( aDefinitor Is class::TtfwDictionaryEx ) ( aName aDefinitor pop:Dictionary:CheckWord ) DEFAULT ( ERROR [ 'Несовместимый тип словаря: ' aDefinitor pop:Object:ClassName ] ) ; // RULES >>> Result ; // .msm:Definitor:CheckWord FUNCTION .msm:ExistingElement STRING IN aName TDefinitor IN aDefinitor nil >>> Result TtfwKeyWord VAR l_KeyWord aName aDefinitor .msm:Definitor:CheckWord >>> l_KeyWord if ( l_KeyWord pop:KeyWord:Word IsNil ) then begin l_KeyWord pop:KeyWord:Word >>> Result end // ( l_KeyWord pop:KeyWord:Word IsNil ) else begin l_KeyWord pop:KeyWord:Word >>> Result end // ( l_KeyWord pop:KeyWord:Word IsNil ) ; // .msm:ExistingElement PROCEDURE .msm:NewElementAndDo: STRING IN aName TDefinitor IN aDefinitor TtfwWord IN aProducer ^ IN aLambda TtfwKeyWord VAR l_KeyWord aName aDefinitor .msm:Definitor:CheckWord >>> l_KeyWord if ( l_KeyWord pop:KeyWord:Word IsNil ) then begin aProducer l_KeyWord .ElementCreateAndDo: ( IN aMade aMade aLambda DO ) // .ElementCreateAndDo: end // ( l_KeyWord pop:KeyWord:Word IsNil ) else begin ERROR [ 'Слово ' aName ' уже есть' ] end // ( l_KeyWord pop:KeyWord:Word IsNil ) ; // .msm:NewElementAndDo: USES axiom:msmModelElementList ; elem_proc msm:AddToNamedCollection STRING IN aName ModelElement IN anItem VAR l_List aName Self msmModelElementList:Make >>> l_List anItem l_List pop:msmModelElementList:Add ; // msm:AddToNamedCollection ModelElement elem_func msm:Diagram:AddView: ModelElement IN aView INTEGER IN anX INTEGER IN anY ^ IN aLambda nil >>> Result VAR l_UID CreateMUID >>> l_UID [ MEPrefix l_UID ] strings:Cat Self @ MEVIEW .msm:NewElementAndDo: ( IN aMade aMade 'X' anX .msm:SetElementVar aMade 'Y' anY .msm:SetElementVar RULES ( aView .IsReferencedType ) ( aMade 'Original' ( aView .Original ) .msm:SetElementVar ) DEFAULT ( aMade 'Original' ( aView .Viewed ) .msm:SetElementVar ) ; // RULES aMade 'Parent' Self .msm:SetElementVar aMade aLambda DO Self 'Views' aMade .msm:AddToNamedCollection //aMade Self .Views Array:Add aMade >>> Result ) // .msm:NewElementAndDo: //Self msm:AddChangedElement ; // msm:Diagram:AddView: ModelElement elem_func msm:Diagram:AddViewLink: ModelElement IN aFrom ModelElement IN aTo ^ IN aLambda nil >>> Result VAR l_UID CreateMUID >>> l_UID [ MEPrefix l_UID ] strings:Cat Self @ MEVIEWLINK .msm:NewElementAndDo: ( IN aMade aMade 'From' aFrom .msm:SetElementVar aMade 'To' aTo .msm:SetElementVar aMade aLambda DO Self 'Views' aMade .msm:AddToNamedCollection //aMade Self .Views Array:Add aMade >>> Result ) // .msm:NewElementAndDo: //Self msm:AddChangedElement ; // msm:Diagram:AddViewLink: ModelElement elem_func msm:Diagram:PasteElement ModelElement IN aView INTEGER IN anX INTEGER IN anY nil >>> Result RULES ( aView .IsViewLink ) ( ERROR [ 'Вставка View от связей пока не поддерживается' ] ) ( Self .IsDiagram ) begin Self aView anX anY .msm:Diagram:AddView: ( IN aMade ) // Self aView anX anY .msm:Diagram:AddView: >>> Result Self .Views .for> ( IN aFrom aFrom .Inherits .filter> ( aView .IsSameModelElement ) .for> ( IN aTo Self aFrom Result .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Inherits ) DROP ) // .for> aView .Inherits .filter> ( aFrom .IsSameModelElement ) .for> ( IN aTo Self Result aFrom .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Inherits ) DROP ) // .for> aFrom .Implements .filter> ( aView .IsSameModelElement ) .for> ( IN aTo Self aFrom Result .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Implements ) DROP ) // .for> aView .Implements .filter> ( aFrom .IsSameModelElement ) .for> ( IN aTo Self Result aFrom .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Implements ) DROP ) // .for> aFrom .Depends .filter> ( aView .IsSameModelElement ) .for> ( IN aTo Self aFrom Result .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Depends ) DROP ) // .for> aView .Depends .filter> ( aFrom .IsSameModelElement ) .for> ( IN aTo Self Result aFrom .msm:Diagram:AddViewLink: ( IN aMade aMade -> Class := class_Depends ) DROP ) // .for> aFrom .Dependencies .join> ( aFrom .Attributes ) .filter> ( .Target aView .IsSameModelElement ) .for> ( IN aDep Self aFrom Result .msm:Diagram:AddViewLink: ( IN aMade aMade 'Original' aDep .msm:SetElementVar ) DROP ) // .for> aView .Dependencies .join> ( aView .Attributes ) .filter> ( .Target aFrom .IsSameModelElement ) .for> ( IN aDep Self Result aFrom .msm:Diagram:AddViewLink: ( IN aMade aMade 'Original' aDep .msm:SetElementVar ) DROP ) // .for> ) // Self .Views .for> end // ( Self .IsDiagram ) DEFAULT ( Self pop:Word:Producer pop:Word:Name Msg ) ; // RULES ; // msm:Diagram:PasteElement USES DictName.ms.dict ; USES DiagramExt.ms.dict ; USES DiagramsRoot.ms.dict ; USES DiagramsSuffix.ms.dict ; elem_proc msm:AddDiagram STRING IN aDiagramName // - тут добавляем диаграмму RULES ( Self .IsSomeView ) RULES ( Self .Viewed Self ?!= ) begin Self .Viewed call.me Self msm:DeleteWordCachedValues end // ( Self .Viewed Self ?!= ) DEFAULT ( ERROR [ 'Некуда добавлять диаграмму.' ] ) ; // RULES DEFAULT begin //VAR l_DiagramsList //Self .msm:Diagrams >>> l_DiagramsList VAR l_Diagrams nil >>> l_Diagrams VAR l_UID Self .LUID >>> l_UID VAR l_DiagramDict [ DiagramsRoot [ l_UID DiagramExt ] strings:Cat ] cPathSep strings:CatSep DictionaryEx:CheckNamedDictionary >>> l_DiagramDict VAR l_DiagramsName [ Self .WordName DiagramsSuffix ] strings:Cat >>> l_DiagramsName l_DiagramsName l_DiagramDict .msm:ExistingElement >>> l_Diagrams if ( l_Diagrams .IsNil ) then begin l_DiagramsName l_DiagramDict @ MEDIAGRAMS .msm:NewElementAndDo: ( IN aDiagrams aDiagrams >>> l_Diagrams ) // .msm:NewElementAndDo: end // l_Diagrams .IsNil VAR l_DiagramName [ Self .WordName '_' aDiagramName ] strings:Cat >>> l_DiagramName l_DiagramName l_Diagrams @ MEDIAGRAM .msm:NewElementAndDo: ( IN aDiagram aDiagram 'Name' aDiagramName .msm:SetElementVar aDiagram 'Original' Self .msm:SetElementVar aDiagram 'Views' [] .msm:SetElementVar //Self 'Diagrams' ( l_DiagramsList .join> [ aDiagram ] ) .msm:SetElementVar Self 'Diagrams' aDiagram .msm:AddToNamedCollection //Self 'msm:Diagrams' Self .Diagrams .msm:SetElementVar Self msm:DeleteWordCachedValues aDiagram msm:AddChangedElement //Self -> Diagrams .CountIt Msg //Self .Diagrams .CountIt Msg //Self .msm:Diagrams .CountIt Msg ) // .msm:NewElementAndDo: end // DEFAULT ; // RULES ; // msm:AddDiagram elem_proc msm:AddDiagrams Self 'main' .msm:AddDiagram ; // msm:AddDiagrams elem_proc msm:CheckMainDiagram if ( Self .msm:HasMainDiagram ! ) then begin Self .msm:AddDiagrams Self msm:DeleteWordCachedValues // - ещё у View надо сбрасывать иначе например красная рамка не рисуется Self .Viewed msm:DeleteWordCachedValues end // ( Self .msm:HasMainDiagram ! ) ; // msm:CheckMainDiagram STRING elem_func msm:Name Self 'msm:Name' .ElemString >>> Result ; // msm:Name USES StereotypeUPs.ms.dict ; WordAlias .msm:Value .msm:Value elem_iterator msm:ValueList Self 'msm:ValueList' .ElemList >>> Result ; // msm:Value BOOLEAN elem_func msm:IsMemo RULES ( Self .msm:Name 'Doc' ?== ) true ( Self .msm:Name 'Documentation' ?== ) true ( Self .msm:Name '"Value"' ?== ) true DEFAULT false ; // RULES >>> Result ; // msm:IsMemo BOOLEAN elem_func msm:IsReadOnly RULES ( Self .msm:Name 'InternalName' ?== ) true ( Self .msm:Name 'UID' ?== ) true DEFAULT false ; // RULES >>> Result ; // msm:IsReadOnly elem_iterator msm:KeyValuesForNewElementPrim STRING IN anElementName ARRAY IN anAllowedElements [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Name' aMade -> msm:Value := anElementName ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Stereotype' aMade -> msm:ValueList := anAllowedElements ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Visibility' aMade -> msm:ValueList := [ ME_PublicAccess ME_ProtectedAccess ME_PrivateAccess ] ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Abstraction' aMade -> msm:ValueList := [ ME_Regular ME_Abstract ME_Final ] ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Doc' aMade -> msm:Value := '' ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewElementPrim elem_iterator msm:KeyValuesForNewElement Self 'NewElement' Self .AllowedElements .msm:KeyValuesForNewElementPrim >>> Result ; // msm:KeyValuesForNewElement INTERFACE elem_func CreateTarget: ModelElement IN aTarget ^ IN aLambda KeyValuesCreate: ( IN aMade VAR l_Types Self .AccessibleTypes >>> l_Types if ( aTarget .NotIsNil ) then begin [ aTarget ] .join> l_Types .CopyWithoutDuplicatedModelElements >>> l_Types end // ( aTarget .NotIsNil ) aMade -> msm:Name := 'Target' aMade -> msm:ValueList := l_Types aMade -> msm:Value := aTarget aMade aLambda DO ) // KeyValuesCreate: >>> Result ; // CreateTarget: elem_iterator msm:KeyValuesForNewAttribute ModelElement IN aTarget Self 'NewAttribute' Self .AllowedElements .filter> ( .IsStereotype st_MDAAttribute ) .msm:KeyValuesForNewElementPrim .join> [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'LinkType' aMade -> msm:ValueList := [ ME_agr ME_lnk ME_ref ] ) // KeyValuesCreate: Self aTarget .CreateTarget: ( IN aMade ) // Self aTarget .CreateTarget: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Value' ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewAttribute elem_iterator msm:KeyValuesForNewOperation ModelElement IN aTarget Self 'NewOperation' Self .AllowedElements .filter> ( IN anElement RULES ( anElement .IsStereotype st_MDAOperation ) true ( anElement .IsStereotypeInModelKindOf: st_method ) true ( anElement .IsStereotypeInModelKindOf: st_Iterator ) true DEFAULT false ; // RULES ) // .filter> .msm:KeyValuesForNewElementPrim .join> [ Self aTarget .CreateTarget: ( IN aMade ) // aTarget .CreateTarget: ] >>> Result ; // msm:KeyValuesForNewOperation elem_iterator msm:KeyValuesForNewDependency ModelElement IN aTarget Self '' Self .AllowedElements .filter> ( .IsStereotype st_MDADependency ) .msm:KeyValuesForNewElementPrim .join> [ Self aTarget .CreateTarget: ( IN aMade ) // aTarget .CreateTarget: ] >>> Result ; // msm:KeyValuesForNewDependency elem_iterator msm:KeyValuesForNewParameter ModelElement IN aTarget Self 'NewParam' Self .AllowedElements .filter> ( .IsStereotype st_MDAParameter ) .msm:KeyValuesForNewElementPrim .join> [ Self aTarget .CreateTarget: ( IN aMade ) // aTarget .CreateTarget: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Value' ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewParameter elem_iterator msm:KeyValuesForNewInherits [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'AllowedInherits' aMade -> msm:ValueList := ( Self .AllowedInherits ) ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewInherits elem_iterator msm:KeyValuesForNewOverridden [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'CanOverride' aMade -> msm:ValueList := ( Self .CanOverride ) ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewOverridden elem_iterator msm:KeyValuesForNewImplements [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'AllowedImplements' aMade -> msm:ValueList := ( Self .AllowedImplements ) ) // KeyValuesCreate: ] >>> Result ; // msm:KeyValuesForNewImplements ModelElement FUNCTION .msm:ElementByValue ARRAY IN anArray IN aValue anArray .filter> ( .msm:Value aValue ?== ) .FirstElement >>> Result ; // .msm:ElementByValue ModelElement FUNCTION .msm:ElementByName ARRAY IN anArray IN aName anArray .filter> ( .NameInModel aName ?== ) .FirstElement >>> Result ; // .msm:ElementByName USES MDProcess_Templates.tpi.ms.dict ; elem_iterator msm:KeyValuesForElement [ KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'InternalName' aMade -> msm:Value := ( Self .WordName ) ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'UID' aMade -> msm:Value := ( Self .UID ) ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Name' aMade -> msm:Value := ( Self .NameInModel ) ) // KeyValuesCreate: VAR l_Stereotype Self .Stereotype .StereotypeInModel >>> l_Stereotype VAR l_AllowedElements Self .ParentAllowedElementsLikeMe >>> l_AllowedElements if ( l_Stereotype .IsNil ) then begin l_AllowedElements .filter> .IsUnstereotypedStereo .FirstElement >>> l_Stereotype end // ( l_Stereotype .IsNil ) KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Stereotype' aMade -> msm:ValueList := ( if ( l_Stereotype .NotIsNil ) then begin [ l_Stereotype ] .join> l_AllowedElements .CopyWithoutDuplicatedModelElements end else begin l_AllowedElements end // ( l_Stereotype .NotIsNil ) ) aMade -> msm:Value := ( aMade -> msm:ValueList l_Stereotype .NameInModel .msm:ElementByName ) ) // KeyValuesCreate: if ( ( l_Stereotype .IsStereotype st_MDAParameter ! ) AND ( l_Stereotype .IsStereotype st_MDADependency ! ) ) then begin KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Visibility' aMade -> msm:ValueList := [ ME_PublicAccess ME_ProtectedAccess ME_PrivateAccess ] aMade -> msm:Value := ( aMade -> msm:ValueList Self .Visibility .msm:ElementByValue ) ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Abstraction' aMade -> msm:ValueList := [ ME_Regular ME_Abstract ME_Final ] aMade -> msm:Value := ( aMade -> msm:ValueList Self .NSAbstraction .msm:ElementByValue ) ) // KeyValuesCreate: end // ( l_Stereotype .IsStereotype st_MDAParameter ! ) if ( l_Stereotype .IsStereotype st_MDAAttribute ) then begin KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'LinkType' aMade -> msm:ValueList := [ ME_agr ME_lnk ME_ref ] aMade -> msm:Value := ( aMade -> msm:ValueList Self .LinkType .msm:ElementByValue ) ) // KeyValuesCreate: end // ( l_Stereotype .IsStereotype st_MDAAttribute ) if ( ( l_Stereotype .IsStereotype st_MDAParameter ) OR ( l_Stereotype .IsStereotype st_MDAAttribute ) ) then begin KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Value' aMade -> msm:Value := ( Self .ModelValue ) ) // KeyValuesCreate: end // ( l_Stereotype .IsStereotype st_MDAParameter ) KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'GUID' aMade -> msm:Value := ( Self .GUID ) ) // KeyValuesCreate: KeyValuesCreate: ( IN aMade aMade -> msm:Name := 'Doc' aMade -> msm:Value := ( Self .Documentation ) ) // KeyValuesCreate: VAR l_Target Self .Target >>> l_Target if ( ( l_Target .NotIsNil ) OR ( Self .MDAClass class_Attribute ?== ) OR ( Self .MDAClass class_Parameter ?== ) OR ( Self .MDAClass class_Dependency ?== ) OR ( Self .MDAClass class_Operation ?== ) ) then begin if ( l_Target .IsNil ) then begin Primitives::void >>> l_Target end // ( l_Target .IsNil ) Self l_Target .CreateTarget: ( IN aMade ) // l_Target .CreateTarget: end // ( l_Target .NotIsNil ) l_Stereotype .StereotypeUPs .for> ( IN aUP KeyValuesCreate: ( IN aMade VAR l_Name [ '"' aUP .Name '"' ] strings:Cat >>> l_Name aMade -> msm:Name := l_Name VAR l_DefaultValue aUP .UPDefaultValue >>> l_DefaultValue VAR l_List aUP .UPValueList >>> l_List if ( l_List .NotIsNil ) then begin aMade -> msm:ValueList := l_List end // ( l_List .NotIsNil ) VAR l_Value Self l_Name l_DefaultValue .ElemMember >>> l_Value if ( l_Value .IsNil ) then begin l_DefaultValue >>> l_Value end // ( l_Value .IsNil ) aMade -> msm:Value := l_Value if ( l_List .NotIsNil ) then begin aMade -> msm:Value := ( l_List aMade -> msm:Value .msm:ElementByValue ) end // ( l_List .NotIsNil ) ) // KeyValuesCreate: ) // l_Stereotype .StereotypeUPs .for> Self .UpList .filter> ( .WordName ':' string:Pos -1 != ) .for> ( IN aUP KeyValuesCreate: ( IN aMade VAR l_Name aUP .WordName >>> l_Name VAR l_Value [ aUP DO ] .FirstElement >>> l_Value aMade -> msm:Name := l_Name if ( l_Value IsBool ) then begin VAR l_List [ ME_False ME_True ] >>> l_List aMade -> msm:ValueList := l_List aMade -> msm:Value := l_Value aMade -> msm:Value := ( l_List aMade -> msm:Value .msm:ElementByValue ) end // ( l_Value IsBool ) else begin aMade -> msm:Value := ( l_Value ToPrintable ) end // ( l_Value IsBool ) ) // KeyValuesCreate: ) // .for> ] >>> Result ; // msm:KeyValuesForElement elem_iterator msm:GetProperties Self .Viewed .msm:KeyValuesForElement >>> Result ; // msm:GetProperties STRING FUNCTION .NormalizedName STRING IN aString aString '$' string:Split DROP >>> Result ; // NormalizedName elem_proc msm:ApplyValues ARRAY IN aKeyValues RULES DEFAULT begin aKeyValues .for> ( IN anItem VAR l_Name anItem .msm:Name >>> l_Name VAR l_Value anItem .msm:Value >>> l_Value VAR l_ValueValue l_Value .msm:Value >>> l_ValueValue if ( l_ValueValue .NotIsNil ) then begin l_ValueValue >>> l_Value end // ( l_ValueValue .NotIsNil ) RULES ( l_Name 'Doc' == ) ( '%SUM' >>> l_Name ) ( l_Name 'Documentation' == ) ( '%SUM' >>> l_Name ) ; // RULES RULES ( l_Name 'InternalName' == ) // - не даём править InternalName () ( l_Name 'UID' == ) // - не даём править InternalName () ( l_Name 'Name' == ) begin VAR l_NormalizedName l_Value .NormalizedName >>> l_NormalizedName Self l_Name l_NormalizedName .msm:SetElementVar if ( l_Value l_NormalizedName != ) then begin Self 'OriginalName' l_Value .msm:SetElementVar end // ( l_Value l_NormalizedName != ) else begin Self 'OriginalName' '' .msm:SetElementVar end // ( l_Value l_NormalizedName != ) end // ( l_Name 'Name' == ) DEFAULT ( Self l_Name l_Value .msm:SetElementVar ) ; // RULES Self msm:DeleteWordCachedValues Self msm:AddChangedElement //msm:ClearCachedValues ) // aKeyValues .for> end // DEFAULT ; // RULES ; // msm:ApplyValues elem_proc msm:ChangeProperties ARRAY IN aKeyValues Self .Viewed aKeyValues .msm:ApplyValues Self msm:DeleteWordCachedValues //msm:ClearCachedValues // - пока опять закомментировал ибо там есть вопросы с сохранением вновь созданного элемента ; // msm:ChangeProperties USES DoCache.ms.dict ; elem_proc msm:AddToCollection ModelElement IN aMade FUNCTOR IN aLamda RULES ( Self .IsSomeView ) ( ERROR [ 'Для View пока не реализовано ' Self .Name ] ) DEFAULT begin STRING VAR l_Name aLamda pop:Word:Name '.' .CutPrefix >>> l_Name Self l_Name aMade .msm:AddToNamedCollection /*{ if ( Self aLamda DO .IsNil ) then begin Self ->^ l_Name ^:= [] Self msm:DeleteWordCachedValues end // ( Self aLamda DO .IsNil ) aMade Self aLamda DO Array:Add Self msm:AddChangedElement l_Name Self msm:RegetViewedLists}*/ end // DEFAULT ; // RULES ; // msm:AddToCollection elem_proc msm:AddToCollection: ModelElement IN aMade ^ IN aLamda Self aMade aLamda .msm:AddToCollection ; // msm:AddToCollection: TtfwDictionaryEx elem_func OurDictionary Self pop:Word:KeyWord pop:KeyWord:Dictionary >>> Result ; // OurDictionary ModelElement FUNCTION .msm:CheckNewElementAndDo: STRING IN aName TDefinitor IN aDefinitor TtfwWord IN aProducer ^ IN aLambda nil >>> Result aName aDefinitor .msm:ExistingElement >>> Result if ( Result .IsNil ) then begin aName aDefinitor aProducer .msm:NewElementAndDo: ( IN aMade aMade aLambda DO aMade >>> Result ) // .msm:NewElementAndDo: end // ( Result .IsNil ) ; // .msm:CheckNewElementAndDo: ModelElement elem_func msm:AddImplemented ModelElement IN anOp nil >>> Result [ anOp .WordName '_' Self .WordName '_impl' ] strings:Cat Self .OurDictionary @ MEREF .msm:CheckNewElementAndDo: ( IN aMade aMade -> Original := anOp aMade -> OpKind := opkind_Implemented Self aMade .msm:AddToCollection: .Implemented ) // .msm:CheckNewElementAndDo: >>> Result ; // msm:AddImplemented ModelElement elem_func msm:AddInherits ModelElement IN anOp nil >>> Result [ anOp .WordName '_' Self .WordName '_G' ] strings:Cat Self .OurDictionary @ MEREF .msm:CheckNewElementAndDo: ( IN aMade aMade -> Original := anOp aMade -> OpKind := opkind_ReferencedType Self aMade .msm:AddToCollection: .Inherits ) // .msm:CheckNewElementAndDo: >>> Result ; // msm:AddInherits ModelElement elem_func msm:AddImplements ModelElement IN anOp nil >>> Result [ anOp .WordName '_' Self .WordName '_R' ] strings:Cat Self .OurDictionary @ MEREF .msm:CheckNewElementAndDo: ( IN aMade aMade -> Original := anOp aMade -> OpKind := opkind_ReferencedType Self aMade .msm:AddToCollection: .Implements ) // .msm:CheckNewElementAndDo: >>> Result ; // msm:AddImplements ModelElement elem_func msm:AddOverridden ModelElement IN anOp nil >>> Result [ anOp .WordName '_' Self .WordName '_over' ] strings:Cat Self .OurDictionary @ MEREF .msm:CheckNewElementAndDo: ( IN aMade aMade -> Original := anOp aMade -> OpKind := opkind_Overridden Self aMade .msm:AddToCollection: .Overridden ) // .msm:CheckNewElementAndDo: >>> Result ; // msm:AddOverridden elem_proc msm:AddNewInherits ARRAY IN aKeyValues VAR l_Value aKeyValues .filter> ( .msm:Name 'AllowedInherits' ?== ) .FirstElement .msm:Value >>> l_Value Self l_Value .msm:AddInherits DROP ; // msm:AddNewInherits elem_proc msm:AddNewOverridden ARRAY IN aKeyValues VAR l_Value aKeyValues .filter> ( .msm:Name 'CanOverride' ?== ) .FirstElement .msm:Value >>> l_Value Self l_Value .msm:AddOverridden DROP ; // msm:AddNewOverridden elem_proc msm:AddNewImplements ARRAY IN aKeyValues VAR l_Value aKeyValues .filter> ( .msm:Name 'AllowedImplements' ?== ) .FirstElement .msm:Value >>> l_Value Self l_Value .msm:AddImplements DROP ; // msm:AddNewImplements ModelElement elem_func msm:AddElement STRING IN aName ModelElement IN aStereotype ARRAY IN aKeyValues nil >>> Result BOOLEAN VAR l_IsSubRoot RULES ( aStereotype .IsStereotype st_MDACategory ) true ( aStereotype .IsStereotypeInModelKindOf: st_UtilityPack ) true ( Self .MDAClass class_Class == ) false ( Self .MDAClass class_Const == ) false ( aStereotype .IsStereotypeInModelKindOf: st_SimpleClass ) true ( aStereotype .IsStereotypeInModelKindOf: st_Impurity ) true DEFAULT false ; // RULES >>> l_IsSubRoot VAR l_UID CreateMUID >>> l_UID [ MEPrefix l_UID ] strings:Cat RULES l_IsSubRoot ( [ l_UID cModelScript ] strings:Cat DictionaryEx:CheckNamedDictionary ) DEFAULT ( Self .OurDictionary ) ; // RULES @ ME .msm:NewElementAndDo: ( IN aMade RULES ( aStereotype .IsStereotype st_MDACategory ) ( aMade -> Class := class_Category ) ( aStereotype .IsStereotype st_MDAOperation ) ( aMade -> Class := class_Operation ) ( aStereotype .IsStereotype st_MDAAttribute ) ( aMade -> Class := class_Attribute ) ( aStereotype .IsStereotype st_MDADependency ) ( aMade -> Class := class_Dependency ) ( aStereotype .IsStereotype st_MDAParameter ) ( aMade -> Class := class_Parameter ) ( aStereotype .IsStereotypeInModelKindOf: st_method ) ( aMade -> Class := class_Operation ) ( aStereotype .IsStereotypeInModelKindOf: st_Iterator ) ( aMade -> Class := class_Operation ) ( aStereotype .IsStereotype st_MDAClass ) ( aMade -> Class := class_Class ) DEFAULT begin ERROR [ 'Непонятный стереотип ' aStereotype .Stereotype .Name ] end // DEFAULT ; // RULES aMade -> IsSubRoot := l_IsSubRoot aMade -> UID := l_UID VAR l_Name aName .NormalizedName >>> l_Name aMade 'Name' l_Name .msm:SetElementVar if ( aName l_Name != ) then begin aMade 'OriginalName' aName .msm:SetElementVar end // ( aName l_Name != ) aMade 'Stereotype' aStereotype .msm:SetElementVar aMade 'Parent' Self .msm:SetElementVar if ( ( aStereotype .IsStereotype st_MDAParameter ! ) AND ( aStereotype .IsStereotype st_MDADependency ! ) ) then begin aMade 'Visibility' PublicAccess .msm:SetElementVar aMade 'Abstraction' at_regular .msm:SetElementVar end // ( aStereotype .IsStereotype st_MDAParameter ! ) // - вообще это надо брать из стереотипа aMade aKeyValues .msm:ApplyValues RULES ( aMade .MDAClass class_Parameter ?== ) ( Self aMade .msm:AddToCollection: .Parameters ) ( aMade .MDAClass class_Dependency ?== ) ( Self aMade .msm:AddToCollection: .Dependencies ) ( aMade .MDAClass class_Attribute ?== ) ( Self aMade .msm:AddToCollection: .Attributes ) ( aMade .MDAClass class_Operation ?== ) ( Self aMade .msm:AddToCollection: .Operations ) ( aStereotype .IsStereotypeInModelKindOf: st_method ) ( Self aMade .msm:AddToCollection: .Operations ) ( aStereotype .IsStereotypeInModelKindOf: st_Iterator ) ( Self aMade .msm:AddToCollection: .Operations ) DEFAULT ( Self aMade .msm:AddToCollection: .Children ) ; // RULES aMade >>> Result ) // .msm:NewElementAndDo: Self msm:AddChangedElement // - надо сохранять и родителя Result msm:AddChangedElement // - и ребёнка ; // msm:AddElement ModelElement elem_func msm:Diagram:AddElement STRING IN aName ModelElement IN aStereotype ARRAY IN aKeyValues nil >>> Result RULES ( Self .IsDiagram ) begin VAR l_Original Self .Viewed >>> l_Original l_Original aName aStereotype aKeyValues .msm:AddElement >>> Result Result .msm:AddDiagrams Self Result 10 10 .msm:Diagram:PasteElement >>> Result end // ( Self .IsDiagram ) DEFAULT ( Self pop:Word:Producer pop:Word:Name Msg ) ; // RULES ; // msm:Diagram:AddElement elem_iterator msm:Diagram:PasteElements ARRAY IN anElements [] >>> Result RULES ( Self .IsDiagram ) begin anElements .filter> .Not: .IsViewLink .for> ( IN aView Self aView aView .X 10 + aView .Y 10 + .msm:Diagram:PasteElement .AddToArray: Result ) // .for> end // ( Self .IsDiagram ) DEFAULT ( Self pop:Word:Producer pop:Word:Name Msg ) ; // RULES ; // msm:Diagram:PasteElements ModelElement FUNCTION .FindWord ARRAY IN aWords STRING IN aName aWords .filter> ( .NameInModel aName SameText ) .filter> ( pop:Word:Producer @ ME ?== ) .FirstElement >>> Result ; // .FindWord USES Chars.ms.dict ; BOOLEAN FUNCTION .TryLoadWord STRING IN aName STRING IN aPath : DoFile STRING IN anItem if ( [ 'MEPROP OriginalName ' cQuote aName cQuote ] strings:Cat anItem FindInFile ) then begin true >>> Result anItem .DictionaryByName DROP end // ( aName anItem FindInFile ) else if ( [ 'MEPROP Name ' cQuote aName cQuote ] strings:Cat anItem FindInFile ) then begin true >>> Result anItem .DictionaryByName DROP end // ( aName anItem FindInFile ) ; // DoFile false >>> Result aPath .ProcessModelFiles: DoFile ; // .TryLoadWord BOOLEAN FUNCTION .TryLoadWordByUID STRING IN anUID STRING IN aPath : DoFile STRING IN anItem if ( [ 'MEPROP UID ' cQuote anUID cQuote ] strings:Cat anItem FindInFile ) then begin true >>> Result anItem .DictionaryByName DROP end // ( .. anItem FindInFile ) ; // DoFile false >>> Result aPath .ProcessModelFiles: DoFile ; // .TryLoadWordByUID EXPORTS arrays.ms.dict EXPORTS ElementsRTTI.ms.dict EXPORTS CheckValue.ms.dict EXPORTS msmMetaModel.ms.dict USES ElemMemberPrim.ms.dict ; EXPORTS ElemMemberPrim.ms.dict EXPORTS Diagrams.ms.dict EXPORTS NS.ms.dict