Revision | 537 (tree) |
---|---|
Time | 2021-03-30 01:55:38 |
Author | ![]() |
Revisão intermediária e incompleta. Não a use!
Estou comitando apenas porque vou remover a propriedade NotifierIndex de TKRKOTANotifier e preciso ter um ponto de retorno seguro
@@ -126,11 +126,6 @@ | ||
126 | 126 | // ser inconveniente |
127 | 127 | Module.Show; |
128 | 128 | |
129 | - /// aparentemente o evento display é chamado quando se alternam as abas do | |
130 | - // editor principal, por exemplo, quando vc tem dois fontes abertos e | |
131 | - // alterna entre eles, este evento aqui é chamado, o que pode fazer com que | |
132 | - // o componente carregue texto antigo salvo em um rtf anteriormente | |
133 | - | |
134 | 129 | // codigo original que não faz uso de tdocument |
135 | 130 | // if FileExists(FileName) then |
136 | 131 | // (AViewObject as TFRAMDocumentation).Load(FileName) |
@@ -11,7 +11,8 @@ | ||
11 | 11 | , KRK.ToolsApi.Components.Notifier |
12 | 12 | , KRK.ToolsApi.Components.EditServicesNotifier |
13 | 13 | , KRK.ToolsApi.Components.IDENotifier |
14 | - , KRK.ToolsApi.Components.ProjectMenuItemCreatorNotifier; | |
14 | + , KRK.ToolsApi.Components.ProjectMenuItemCreatorNotifier | |
15 | + , KRK.ToolsApi.Components.ModuleNotifier; | |
15 | 16 | |
16 | 17 | type |
17 | 18 | TDAMONotifiers = class(TDataModule) |
@@ -30,6 +31,7 @@ | ||
30 | 31 | MNUISubItem1: TMenuItem; |
31 | 32 | MNUISubItem2: TMenuItem; |
32 | 33 | N1: TMenuItem; |
34 | + KMON: TKRKOTAModuleNotifier; | |
33 | 35 | procedure KESNEditorViewActivated(const AEditWindow: INTAEditWindow; const AEditView: IOTAEditView); |
34 | 36 | procedure KESNWindowNotification(const AEditWindow: INTAEditWindow; AOperation: TOperation); |
35 | 37 | procedure KIDNFileNotification(ANotifyCode: TOTAFileNotification; const AFileName: string; var ACancel: Boolean); |
@@ -41,6 +43,7 @@ | ||
41 | 43 | procedure MNUISubItem1Click(Sender: TObject); |
42 | 44 | procedure MNUISubItem2Click(Sender: TObject); |
43 | 45 | procedure PUMEPopup(Sender: TObject); |
46 | + procedure KMONAllowSave(out AAllowSave: Boolean); | |
44 | 47 | private |
45 | 48 | { Private declarations } |
46 | 49 | procedure CreateLanguagePanel(AStatusBar: TStatusBar); |
@@ -261,7 +264,7 @@ | ||
261 | 264 | // desenganchamento do menu PopUp porque achei a solução adotada pelo Delphi |
262 | 265 | // 2006 melhor: desviar o evento OnClose do Form da janela de edição. |
263 | 266 | if AShow then |
264 | - HookModulesTabSetPopUpMenu(AEditWindow,PUME) | |
267 | + HookModulesTabSetPopUpMenu(AEditWindow,PUME); | |
265 | 268 | end; |
266 | 269 | |
267 | 270 | procedure TDAMONotifiers.KIDNFileNotification(ANotifyCode: TOTAFileNotification; const AFileName: string; var ACancel: Boolean); |
@@ -268,8 +271,43 @@ | ||
268 | 271 | begin |
269 | 272 | if Assigned(GetINTAEditorServices.TopEditWindow) and (GetINTAEditorServices.TopEditWindow.StatusBar.ComponentCount = 1) then |
270 | 273 | UpdateLanguageInfo(GetINTAEditorServices.TopEditWindow.StatusBar,''); |
274 | + | |
275 | + // o certo é criar uma nova instância de KMON para cada arquivo aberto e | |
276 | + // manter uma lista que associa o modulo a seu notificador. Considerando que | |
277 | + // mais de um modulo pode ser aberto, alguém deve manter a referencia para | |
278 | + // permitir a remoção do notificador | |
279 | + | |
280 | +// KMON.Module.AddNotifier | |
281 | + | |
282 | +// acredito que tenha que ser feito aqui mesmo. | |
283 | +// faça com que a classe atual gerencie a lista de notificadores | |
284 | +// e remova NotifierIndex do notificador de modulo | |
285 | +// tem como saber o tipo de modulo, iotamoduletype ou algo assim e só atue para | |
286 | +// modulos especificos. quando se abre o modulo adiciona o notificador. | |
287 | +// talvez seja interessante criar uma função propria chamada AddModuleNotifier | |
288 | +// e seu par para criar automaticamente uma instância do notificador de modulo | |
289 | +// | |
290 | +// isso sera estranho, pois ter o componente não visual é muito conveniente. Como | |
291 | +// aproveitar o componente visual? criar a função de adicionar nele mesmo?? hu... | |
292 | +// talvez sim | |
293 | + | |
294 | +// if ANotifyCode = ofnFileOpened then | |
295 | +// begin | |
296 | +// KMON.Module := GetIOTAModuleFromFileName(AFileName); | |
297 | +// KMON.RegisterNotifier; | |
298 | +// end | |
299 | +// else if ANotifyCode = ofnFileClosing then | |
300 | +// begin | |
301 | +// KMON.UnRegisterNotifier; | |
302 | +// end; | |
271 | 303 | end; |
272 | 304 | |
305 | +procedure TDAMONotifiers.KMONAllowSave(out AAllowSave: Boolean); | |
306 | +begin | |
307 | +// AAllowSave := False; | |
308 | +// ShowMessage('Salvando um módulo, aqui verifica-se os arquivos que este módulo gerencia e faz alguma coisa'); | |
309 | +end; | |
310 | + | |
273 | 311 | procedure TDAMONotifiers.KPMNAddMenu(const AProject: IOTAProject; const AIdentList: TStrings; const AProjectManagerMenuList: IInterfaceList; const AIsMultiSelect: Boolean); |
274 | 312 | var |
275 | 313 | AvailableLanguage: TAvailableLanguage; |
@@ -19,21 +19,31 @@ | ||
19 | 19 | TOnBeforeRename = TOnAfterRename; |
20 | 20 | |
21 | 21 | // A interface IOTAModuleNotifier80 possui duas propriedades, as quais estão |
22 | - // associadas a dois métodos. Por um tempo eu não sabia como lidar com isso, | |
23 | - // mas acredio que seja como está implementado abaixo. As interfaces de | |
24 | - // notificação normalmente nos notificam algo, portanto, dados "saem" destas | |
25 | - // interfaces. Este é o funcionamento normal. Algumas interfaces, como | |
26 | - // IOTAModuleNotifier80 possuem propriedades somente leitura associadas a | |
22 | + // associadas a dois métodos. As interfaces de notificação normalmente nos | |
23 | + // notificam algo, portanto, dados "saem" destas interfaces. Este é o | |
24 | + // funcionamento normal. Algumas interfaces, como IOTAModuleNotifier80 e | |
25 | + // INTACustomEditorSubView possuem propriedades somente leitura associadas a | |
27 | 26 | // métodos. Isso significa que a IDE lê estas propriedades e é por isso que |
28 | 27 | // precisamos implementar seus métodos associados (métodos get). Estes métodos |
29 | - // get não serão chamados pela IDE, nós é que precisamos, nestes métodos, | |
30 | - // retornar algo para a IDE, fazendo o caminho oposto de uma interface de | |
31 | - // notificação comum. Na classe abaixo FOverwriteFileNames é uma lista que | |
32 | - // pode ser modificada em tempo de projeto no componente. Ao preencher esta | |
33 | - // lista, os métodos GetOverwriteFileName e GetOverwriteFileNameCount | |
34 | - // retornarão para a IDE as informações que ela precisa quando a IDE acessar | |
35 | - // as propriedades OverwriteFileNameCount e OverwriteFileNames | |
28 | + // get não serão chamados pela IDE, eles existem na interface para nos obrigar | |
29 | + // a implementá-los, pois a IDE fará uso apenas das propriedades somente | |
30 | + // leitura, as quais obtém seus dados a partir dos métodos "get". Nós é quem | |
31 | + // precisamos, nestes métodos, retornar algo para a IDE, fazendo o caminho | |
32 | + // oposto de uma interface de notificação tradicional. Na classe abaixo | |
33 | + // FOverwriteFileNames é uma lista que pode ser modificada em tempo de projeto | |
34 | + // no componente. Ao preencher esta lista, os métodos GetOverwriteFileName e | |
35 | + // GetOverwriteFileNameCount retornarão para a IDE as informações que ela | |
36 | + // precisa quando a IDE acessar as propriedades OverwriteFileNameCount e | |
37 | + // OverwriteFileNames. | |
36 | 38 | |
39 | + // ATENÇÃO: Me parece estranho, nesta interface de notificação precisarmos | |
40 | + // informar nomes de arquivo e sua quantidade, sendo que isso o módulo em | |
41 | + // si já parece conhecer. Talvez isso seja algo para configurar corretamente o | |
42 | + // notificador. Se isso for verdade, a OverwriteFileNames não deve existir, | |
43 | + // pois seus dados devem ser pegos diretamente do modulo que registra esse | |
44 | + // notificador. Verifique isso depois, pois acho que há como saber os arquivos | |
45 | + // e quantidade de arquivos que um módulo manipula! | |
46 | + | |
37 | 47 | //: Classe do componente que implementa a interface IOTAModuleNotifier |
38 | 48 | TKRKCustomOTAModuleNotifier = class(TKRKOTANotifier |
39 | 49 | ,IOTAModuleNotifier |
@@ -35,7 +35,10 @@ | ||
35 | 35 | // deve usar o método de registro/desregistro a partir da interface correta. |
36 | 36 | procedure RegisterNotifier; virtual; |
37 | 37 | procedure UnRegisterNotifier; virtual; |
38 | - | |
38 | + // ATENÇÃO: NOTIFICADORES NÃO DEVEM TER ESSA PROPRIEDADE, PORQUE AQUELES QUE | |
39 | + // OS REGISTRAM É QUE PRECISAM MANTER ESSE NUMERO! ESSA ALTERAÇÃO VAI SER DRÁSTICA | |
40 | + // PROCURE TODOS OS NOTIFICADORES NO EXPERT E VEJA COMO ELES TÃO SENDO CRIADOS. | |
41 | + // EM SEGUIDA DESVINCULE-OS, FAZENDO COM QUE LISTAS DE INDICES SEJAM MANTIDAS NOS OBJETOS QUE OS REGISTRAM | |
39 | 42 | property NotifierIndex: Integer read FNotifierIndex write FNotifierIndex; |
40 | 43 | public |
41 | 44 | constructor Create(AOwner: TComponent); override; |
@@ -52,15 +52,17 @@ | ||
52 | 52 | function GetINTAIDEInsightService: INTAIDEInsightService; |
53 | 53 | function GetIOTAIDEInsightService: IOTAIDEInsightService; |
54 | 54 | function GetINTAEditorServices: INTAEditorServices; |
55 | + | |
55 | 56 | procedure RegisterNTAIDEInsightItem(ANTAIDEInsightItem: INTAIDEInsightItem; const ACategory: String = ''); |
56 | 57 | procedure UnRegisterNTAIDEInsightItem(const ANTAIDEInsightItem: INTAIDEInsightItem); |
57 | 58 | function RegisterNTACustomEditorSubView(AINTACustomEditorSubView: INTACustomEditorSubView): Pointer; |
58 | 59 | procedure UnRegisterNTACustomEditorSubView(ANTACustomEditorSubView: Pointer); |
60 | + | |
59 | 61 | function AddOTAProjectMenuItemCreatorNotifier(AOTAProjectMenuItemCreatorNotifier: IOTAProjectMenuItemCreatorNotifier): Integer; |
60 | 62 | procedure RemoveOTAProjectMenuItemCreatorNotifier(ANotifierIndex: Integer); |
61 | 63 | {$ELSE} { Delphi 2009 e inferiores} |
64 | +function AddNTAProjectMenuCreatorNotifier(ANTAProjectMenuCreatorNotifier: INTAProjectMenuCreatorNotifier): Integer; | |
62 | 65 | procedure RemoveNTAProjectMenuCreatorNotifier(ANotifierIndex: Integer); |
63 | -function AddNTAProjectMenuCreatorNotifier(ANTAProjectMenuCreatorNotifier: INTAProjectMenuCreatorNotifier): Integer; | |
64 | 66 | {$IFEND} |
65 | 67 | |
66 | 68 | // A regra para registro de notificadores é: ao necessitar de um notificador da |