PluginTabControl.pas 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. unit PluginTabControl;
  2. interface
  3. uses
  4. Tabs, Classes, SysUtils, uICaption, uPluginObject;
  5. type
  6. TPluginTabControl = class(TTabSet)
  7. private
  8. function checkGetPluginObject(pvIndex:Integer): TPluginObject;
  9. protected
  10. procedure OnTabChange(Sender: TObject; NewTab: Integer; var AllowChange:
  11. Boolean);
  12. procedure OnTabClose(Sender: TObject; var ACanClose: Boolean);
  13. procedure setCaptionMananger(const pvPlugin: IInterface; pvCaptionMananger:
  14. ICaptionManager);
  15. procedure onPluginSetCaption(Sender: TObject; pvCaption:String);
  16. public
  17. constructor Create(AOwner: TComponent); override;
  18. destructor Destroy; override;
  19. function BindPlugin(const pvPlugin: IInterface; pvInstanceID: string): TPluginObject;
  20. function unBindPlugin(pvIndex: Integer; const pvPluginObject: TPluginObject):
  21. Boolean;
  22. function remove(pvInstanceID:string): Boolean;
  23. procedure showCurrentPlugin();
  24. function ShowTabPlugin(pvIndex: Integer): IInterface;
  25. function FindPlugin(const pvInstanceID: string): Integer;
  26. function CheckFind(const pvInstanceID: string; pvRaiseIfFalse: Boolean = true):
  27. Integer;
  28. function GetActivePlugin: IInterface;
  29. procedure closeAll;
  30. procedure freeAll;
  31. procedure RefreshCaption(const pvPlugin: IInterface);
  32. end;
  33. implementation
  34. uses
  35. Forms, uMainFormTools;
  36. constructor TPluginTabControl.Create(AOwner: TComponent);
  37. begin
  38. inherited Create(AOwner);
  39. // self.ShowCloseButton := true;
  40. // self.ShowCloseButtonOnActiveTab := true;
  41. self.OnChange := OnTabChange;
  42. //self.OnClose := OnTabClose;
  43. end;
  44. destructor TPluginTabControl.Destroy;
  45. begin
  46. inherited Destroy;
  47. end;
  48. procedure TPluginTabControl.OnTabClose(Sender: TObject; var ACanClose: Boolean);
  49. var
  50. lvPluginObject: TPluginObject;
  51. begin
  52. //在Plugin释放的时候移除
  53. ACanClose := false;
  54. lvPluginObject := TPluginObject(Self.Tabs.Objects[self.TabIndex]);
  55. if not lvPluginObject.canClose then
  56. begin //不允许手工关闭, 主页
  57. {nop}
  58. end else
  59. begin
  60. TMainFormTools.closePlugin(lvPluginObject.Plugin);
  61. end;
  62. end;
  63. procedure TPluginTabControl.OnTabChange(Sender: TObject; NewTab: Integer; var
  64. AllowChange: Boolean);
  65. var
  66. lvPluginObject: TPluginObject;
  67. begin
  68. if self.TabIndex = -1 then exit;
  69. lvPluginObject := TPluginObject(Self.Tabs.Objects[self.TabIndex]);
  70. if lvPluginObject<> nil then
  71. begin
  72. TMainFormTools.showAsNormal(lvPluginObject.Plugin);
  73. end;
  74. end;
  75. function TPluginTabControl.BindPlugin(const pvPlugin: IInterface; pvInstanceID:
  76. string): TPluginObject;
  77. var
  78. lvObj: TPluginObject;
  79. lvStr:String;
  80. begin
  81. lvObj := TPluginObject.Create();
  82. lvObj.OnSetCaption := self.onPluginSetCaption;
  83. lvObj.InstanceID := pvInstanceID;
  84. lvObj.Plugin := pvPlugin;
  85. lvStr := TMainFormTools.getPluginCaption(lvObj.Plugin);
  86. self.setCaptionMananger(pvPlugin, lvObj);
  87. Self.OnChange := nil;
  88. try
  89. self.TabIndex := self.Tabs.AddObject(lvStr, lvObj);
  90. finally
  91. self.OnChange := OnTabChange;
  92. end;
  93. // with self.Tabs.Add do
  94. // begin
  95. // self.TabIndex := Index;
  96. // Data := lvObj;
  97. // ImageIndex := 0;
  98. // Caption := lvStr;
  99. // end;
  100. Result := lvObj;
  101. end;
  102. function TPluginTabControl.CheckFind(const pvInstanceID: string;
  103. pvRaiseIfFalse: Boolean = true): Integer;
  104. var
  105. i: Integer;
  106. begin
  107. Result := -1;
  108. for i := 0 to Self.Tabs.Count - 1 do
  109. begin
  110. if checkGetPluginObject(i).InstanceID = pvInstanceID then
  111. begin
  112. Result := i;
  113. Break;
  114. end;
  115. end;
  116. if (Result = -1) and pvRaiseIfFalse then
  117. raise Exception.CreateFmt('未找到(%)插件对应的页面', [pvInstanceID]);
  118. end;
  119. procedure TPluginTabControl.closeAll;
  120. var
  121. i: Integer;
  122. lvPluginObject: TPluginObject;
  123. begin
  124. for i := Self.Tabs.Count - 1 downto 0 do
  125. begin
  126. lvPluginObject := checkGetPluginObject(i);
  127. if not lvPluginObject.canClose then
  128. begin //不允许手工关闭, 主页
  129. {nop}
  130. end else
  131. begin
  132. TMainFormTools.closePlugin(lvPluginObject.Plugin);
  133. end;
  134. end;
  135. end;
  136. function TPluginTabControl.FindPlugin(const pvInstanceID: string): Integer;
  137. var
  138. i: Integer;
  139. begin
  140. Result := -1;
  141. for i := 0 to Self.Tabs.Count - 1 do
  142. begin
  143. if checkGetPluginObject(i).InstanceID = pvInstanceID then
  144. begin
  145. Result := i;
  146. Break;
  147. end;
  148. end;
  149. end;
  150. procedure TPluginTabControl.freeAll;
  151. var
  152. i: Integer;
  153. lvPluginObject: TPluginObject;
  154. begin
  155. for i := Self.Tabs.Count - 1 downto 0 do
  156. begin
  157. lvPluginObject := checkGetPluginObject(i);
  158. try
  159. unBindPlugin(i, lvPluginObject);
  160. TMainFormTools.freePlugin(lvPluginObject.Plugin);
  161. finally
  162. lvPluginObject.Free;
  163. end;
  164. end;
  165. end;
  166. function TPluginTabControl.GetActivePlugin: IInterface;
  167. begin
  168. Result := nil;
  169. if Self.TabIndex = -1 then exit;
  170. Result := checkGetPluginObject(self.TabIndex).Plugin;
  171. end;
  172. function TPluginTabControl.checkGetPluginObject(pvIndex:Integer): TPluginObject;
  173. begin
  174. Result := TPluginObject(Self.Tabs.Objects[pvIndex]);
  175. if Result = nil then
  176. begin
  177. raise Exception.Create('获取不到页面插件对象');
  178. end;
  179. end;
  180. procedure TPluginTabControl.onPluginSetCaption(Sender: TObject;
  181. pvCaption: String);
  182. begin
  183. end;
  184. procedure TPluginTabControl.RefreshCaption(const pvPlugin: IInterface);
  185. var
  186. lvIndex: Integer;
  187. lvInstanceID:String;
  188. begin
  189. lvInstanceID := TMainFormTools.getInstanceID(pvPlugin);
  190. lvIndex := CheckFind(lvInstanceID, False);
  191. if lvIndex <> -1 then
  192. begin
  193. self.Tabs[lvIndex] := TMainFormTools.getPluginCaption(pvPlugin);
  194. end;
  195. end;
  196. function TPluginTabControl.remove(pvInstanceID:string): Boolean;
  197. var
  198. lvIndex: Integer;
  199. lvObj: TPluginObject;
  200. begin
  201. Result := false;
  202. lvIndex := CheckFind(pvInstanceID, False);
  203. if lvIndex <> -1 then
  204. begin
  205. lvObj := checkGetPluginObject(lvIndex);
  206. try
  207. unBindPlugin(lvIndex, lvObj);
  208. Result := true;
  209. finally
  210. lvObj.Free;
  211. end;
  212. end;
  213. end;
  214. procedure TPluginTabControl.setCaptionMananger(const pvPlugin: IInterface;
  215. pvCaptionMananger: ICaptionManager);
  216. var
  217. lvSetter:ICaptionManagerSetter;
  218. begin
  219. if pvPlugin = nil then Exit;
  220. try
  221. if pvPlugin.QueryInterface(ICaptionManagerSetter, lvSetter) = S_OK then
  222. begin
  223. lvSetter.setCaptionManager(pvCaptionMananger);
  224. end;
  225. except
  226. end;
  227. end;
  228. procedure TPluginTabControl.showCurrentPlugin;
  229. begin
  230. ShowTabPlugin(self.TabIndex);
  231. end;
  232. function TPluginTabControl.ShowTabPlugin(pvIndex: Integer): IInterface;
  233. var
  234. lvPluginObject: TPluginObject;
  235. begin
  236. Self.TabIndex := pvIndex;
  237. if pvIndex = -1 then exit;
  238. lvPluginObject := checkGetPluginObject(pvIndex);
  239. TMainFormTools.showAsNormal(lvPluginObject.Plugin);
  240. Result := lvPluginObject.Plugin;
  241. end;
  242. function TPluginTabControl.unBindPlugin(pvIndex: Integer; const pvPluginObject:
  243. TPluginObject): Boolean;
  244. begin
  245. self.OnChange := nil;
  246. try
  247. Result := false;
  248. setCaptionMananger(pvPluginObject.Plugin, nil);
  249. //先删除
  250. //Self.Tabs[lvIndex] := nil;
  251. self.Tabs.Objects[pvIndex] := nil;
  252. Self.Tabs.Delete(pvIndex);
  253. finally
  254. self.OnChange := OnTabChange;
  255. end;
  256. end;
  257. end.