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.
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
понедельник, 31 октября 2016 г.
#1304. MVC. TmsmListLikeModel. Только код
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий