• R/O
  • SSH
  • HTTPS

akdf: Commit


Commit MetaInfo

Revision536 (tree)
Time2021-03-28 03:57:38
Authorderekwildstar

Log Message

KRKExperts
¯¯¯¯¯¯¯¯¯¯

Adicionado o frame de documentação que aparece numa nova sub-visão

KX.EditorSubViews
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Adicionado mais um componente de sub-visão para manipular a adição de uma sub-visão

KRK.ExtendedActions
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Nova ação "TRichEditRedo" registrada

KRK.ToolsApiComponents
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Novo componente TKRKOTAModuleNotifier é registrado

KRKLib
¯¯¯¯¯¯

Unit do novo componente TKRKOTAModuleNotifier adicionada

KRK.ToolsApi.Components.IDENotifier
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Manipulado o evento OnDestroyed

KRK.ToolsApi.Components.Notifier
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Criados os métodos virtuais RegisterNotifier e UnRegisterNotifier
Os eventos padrão tiveram sua visibilidade reduzida, pois nem todo componente precisa destes eventos

KRK.ToolsAPI
¯¯¯¯¯¯¯¯¯¯¯¯

Criada a função GetIOTAEditorViewServices sobrecarregada

KRK.Vcl.ExtActns.ActnRes
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Configuradas as propriedades padrão da nova ação de refezer (Redo)

KRK.Vcl.ExtActns
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Implementada a ação de refazer (Redo)

Extras
¯¯¯¯¯¯

Alguns documentos foram adicionados!

Change Summary

Incremental Difference

--- trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExperts.dpr (revision 535)
+++ trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExperts.dpr (revision 536)
@@ -1,5 +1,32 @@
11 library KRKExperts;
2+{ DLLs de experts precisam ser construídas com runtime packages a fim de não
3+gerar access violations aleatórios quando carregadas. Os pacotes adicionados a
4+lista de runtime packages devem ser os pacotes que contém as units usadas dentro
5+da dll, por exemplo, se a dll utiliza forms com controles da paleta standard, é
6+necessário incluir o runtime package "dclstd".
27
8+Na realidade a referência dos pacotes é feita por meio de seus arquivos .dcp
9+correspondentes, exatamente igual ao que é feito quando se está desenvolvendo um
10+pacote, isto é, sua cláusula "Requires" contém uma lista de arquivos .dcp que
11+são necessários para que o pacote seja compilado corretamente e fique compatível
12+com a IDE. Em outras palavras a lista "Requires" está para os pacotes (.dpk)
13+assim como a lista de runtime packages está para os experts em dll (.dpr).
14+
15+As regras de herança de pacotes também se aplicam as dlls de experts assim como
16+acontece com os pacotes, por exemplo, quando um pacote P1.bpl possui dclstd.dcp
17+em sua lista requires, todos os pacotes que incluírem P1.dcp em sua lista
18+requires também já possuem dclstd.dcp automaticamente! É exatamente por isso que
19+a dll atual só possui em sua lista de runtime packages KRKLib (dcp), pois esta
20+já tem em sua lista Requires referência aos pacotes necessários e as
21+dependências são resolvidas em cascata. Em outras palavras, KRKLib requer vcldb,
22+que requer vcl e rtl, portanto esta dll já tem acesso implícito a todas as units
23+de KRKLib + vcldb + vcl + rtl!
24+
25+Para facilitar, programe este expert no modo pacote, assim, sempre que for
26+necessária alguma referência (Requires) a própria IDE informará e você poderá
27+editar a lista de runtime packages no projeto da dll, usando o pacote que a IDE
28+sugeriu adição.
29+}
330 uses
431 ToolsAPI,
532 SysUtils,
@@ -18,7 +45,8 @@
1845 KX.EditorSubViews in '..\..\src\D14+\KX.EditorSubViews.pas' {DAMOEditorSubviews: TDataModule},
1946 KX.About in '..\..\src\KX.About.pas' {FormAbout},
2047 KX.IDEInsightItems in '..\..\src\D21+\KX.IDEInsightItems.pas' {DAMOIDEInsightItems: TDataModule},
21- KX.FindMyPackage in '..\..\src\FindMyPackage\KX.FindMyPackage.pas' {FormFindMyPackage};
48+ KX.FindMyPackage in '..\..\src\FindMyPackage\KX.FindMyPackage.pas' {FormFindMyPackage},
49+ KX.Documentation in '..\..\src\D14+\EditorSubViews\KX.Documentation.pas' {FRAMDocumentation: TFrame};
2250
2351 {$R *.res}
2452
--- trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExperts.dproj (revision 535)
+++ trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExperts.dproj (revision 536)
@@ -66,7 +66,7 @@
6666 <VerInfo_MajorVer>2</VerInfo_MajorVer>
6767 <VerInfo_DLL>true</VerInfo_DLL>
6868 <VerInfo_AutoGenVersion>true</VerInfo_AutoGenVersion>
69- <DCC_UsePackage>KRKLib;$(DCC_UsePackage)</DCC_UsePackage>
69+ <DCC_UsePackage>KRKLib;rtl;$(DCC_UsePackage)</DCC_UsePackage>
7070 </PropertyGroup>
7171 <PropertyGroup Condition="'$(Base_Win32)'!=''">
7272 <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
@@ -144,6 +144,10 @@
144144 <DCCReference Include="..\..\src\FindMyPackage\KX.FindMyPackage.pas">
145145 <Form>FormFindMyPackage</Form>
146146 </DCCReference>
147+ <DCCReference Include="..\..\src\D14+\EditorSubViews\KX.Documentation.pas">
148+ <Form>FRAMDocumentation</Form>
149+ <DesignClass>TFrame</DesignClass>
150+ </DCCReference>
147151 <BuildConfiguration Include="Release">
148152 <Key>Cfg_2</Key>
149153 <CfgParent>Base</CfgParent>
@@ -242,6 +246,10 @@
242246 <RemoteDir>classes</RemoteDir>
243247 <Operation>1</Operation>
244248 </Platform>
249+ <Platform Name="Android64">
250+ <RemoteDir>classes</RemoteDir>
251+ <Operation>1</Operation>
252+ </Platform>
245253 </DeployClass>
246254 <DeployClass Name="AndroidFileProvider">
247255 <Platform Name="Android">
@@ -248,6 +256,10 @@
248256 <RemoteDir>res\xml</RemoteDir>
249257 <Operation>1</Operation>
250258 </Platform>
259+ <Platform Name="Android64">
260+ <RemoteDir>res\xml</RemoteDir>
261+ <Operation>1</Operation>
262+ </Platform>
251263 </DeployClass>
252264 <DeployClass Name="AndroidGDBServer">
253265 <Platform Name="Android">
@@ -260,6 +272,10 @@
260272 <RemoteDir>library\lib\armeabi</RemoteDir>
261273 <Operation>1</Operation>
262274 </Platform>
275+ <Platform Name="Android64">
276+ <RemoteDir>library\lib\armeabi</RemoteDir>
277+ <Operation>1</Operation>
278+ </Platform>
263279 </DeployClass>
264280 <DeployClass Name="AndroidLibnativeArmeabiv7aFile">
265281 <Platform Name="Android64">
@@ -272,6 +288,10 @@
272288 <RemoteDir>library\lib\mips</RemoteDir>
273289 <Operation>1</Operation>
274290 </Platform>
291+ <Platform Name="Android64">
292+ <RemoteDir>library\lib\mips</RemoteDir>
293+ <Operation>1</Operation>
294+ </Platform>
275295 </DeployClass>
276296 <DeployClass Name="AndroidServiceOutput">
277297 <Platform Name="Android">
@@ -278,6 +298,10 @@
278298 <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
279299 <Operation>1</Operation>
280300 </Platform>
301+ <Platform Name="Android64">
302+ <RemoteDir>library\lib\arm64-v8a</RemoteDir>
303+ <Operation>1</Operation>
304+ </Platform>
281305 </DeployClass>
282306 <DeployClass Name="AndroidServiceOutput_Android32">
283307 <Platform Name="Android64">
@@ -290,6 +314,10 @@
290314 <RemoteDir>res\drawable</RemoteDir>
291315 <Operation>1</Operation>
292316 </Platform>
317+ <Platform Name="Android64">
318+ <RemoteDir>res\drawable</RemoteDir>
319+ <Operation>1</Operation>
320+ </Platform>
293321 </DeployClass>
294322 <DeployClass Name="AndroidSplashStyles">
295323 <Platform Name="Android">
@@ -296,6 +324,10 @@
296324 <RemoteDir>res\values</RemoteDir>
297325 <Operation>1</Operation>
298326 </Platform>
327+ <Platform Name="Android64">
328+ <RemoteDir>res\values</RemoteDir>
329+ <Operation>1</Operation>
330+ </Platform>
299331 </DeployClass>
300332 <DeployClass Name="AndroidSplashStylesV21">
301333 <Platform Name="Android">
@@ -302,6 +334,10 @@
302334 <RemoteDir>res\values-v21</RemoteDir>
303335 <Operation>1</Operation>
304336 </Platform>
337+ <Platform Name="Android64">
338+ <RemoteDir>res\values-v21</RemoteDir>
339+ <Operation>1</Operation>
340+ </Platform>
305341 </DeployClass>
306342 <DeployClass Name="Android_Colors">
307343 <Platform Name="Android">
@@ -308,6 +344,10 @@
308344 <RemoteDir>res\values</RemoteDir>
309345 <Operation>1</Operation>
310346 </Platform>
347+ <Platform Name="Android64">
348+ <RemoteDir>res\values</RemoteDir>
349+ <Operation>1</Operation>
350+ </Platform>
311351 </DeployClass>
312352 <DeployClass Name="Android_DefaultAppIcon">
313353 <Platform Name="Android">
@@ -314,6 +354,10 @@
314354 <RemoteDir>res\drawable</RemoteDir>
315355 <Operation>1</Operation>
316356 </Platform>
357+ <Platform Name="Android64">
358+ <RemoteDir>res\drawable</RemoteDir>
359+ <Operation>1</Operation>
360+ </Platform>
317361 </DeployClass>
318362 <DeployClass Name="Android_LauncherIcon144">
319363 <Platform Name="Android">
@@ -320,6 +364,10 @@
320364 <RemoteDir>res\drawable-xxhdpi</RemoteDir>
321365 <Operation>1</Operation>
322366 </Platform>
367+ <Platform Name="Android64">
368+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
369+ <Operation>1</Operation>
370+ </Platform>
323371 </DeployClass>
324372 <DeployClass Name="Android_LauncherIcon36">
325373 <Platform Name="Android">
@@ -326,6 +374,10 @@
326374 <RemoteDir>res\drawable-ldpi</RemoteDir>
327375 <Operation>1</Operation>
328376 </Platform>
377+ <Platform Name="Android64">
378+ <RemoteDir>res\drawable-ldpi</RemoteDir>
379+ <Operation>1</Operation>
380+ </Platform>
329381 </DeployClass>
330382 <DeployClass Name="Android_LauncherIcon48">
331383 <Platform Name="Android">
@@ -332,6 +384,10 @@
332384 <RemoteDir>res\drawable-mdpi</RemoteDir>
333385 <Operation>1</Operation>
334386 </Platform>
387+ <Platform Name="Android64">
388+ <RemoteDir>res\drawable-mdpi</RemoteDir>
389+ <Operation>1</Operation>
390+ </Platform>
335391 </DeployClass>
336392 <DeployClass Name="Android_LauncherIcon72">
337393 <Platform Name="Android">
@@ -338,6 +394,10 @@
338394 <RemoteDir>res\drawable-hdpi</RemoteDir>
339395 <Operation>1</Operation>
340396 </Platform>
397+ <Platform Name="Android64">
398+ <RemoteDir>res\drawable-hdpi</RemoteDir>
399+ <Operation>1</Operation>
400+ </Platform>
341401 </DeployClass>
342402 <DeployClass Name="Android_LauncherIcon96">
343403 <Platform Name="Android">
@@ -344,6 +404,10 @@
344404 <RemoteDir>res\drawable-xhdpi</RemoteDir>
345405 <Operation>1</Operation>
346406 </Platform>
407+ <Platform Name="Android64">
408+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
409+ <Operation>1</Operation>
410+ </Platform>
347411 </DeployClass>
348412 <DeployClass Name="Android_NotificationIcon24">
349413 <Platform Name="Android">
@@ -350,6 +414,10 @@
350414 <RemoteDir>res\drawable-mdpi</RemoteDir>
351415 <Operation>1</Operation>
352416 </Platform>
417+ <Platform Name="Android64">
418+ <RemoteDir>res\drawable-mdpi</RemoteDir>
419+ <Operation>1</Operation>
420+ </Platform>
353421 </DeployClass>
354422 <DeployClass Name="Android_NotificationIcon36">
355423 <Platform Name="Android">
@@ -356,6 +424,10 @@
356424 <RemoteDir>res\drawable-hdpi</RemoteDir>
357425 <Operation>1</Operation>
358426 </Platform>
427+ <Platform Name="Android64">
428+ <RemoteDir>res\drawable-hdpi</RemoteDir>
429+ <Operation>1</Operation>
430+ </Platform>
359431 </DeployClass>
360432 <DeployClass Name="Android_NotificationIcon48">
361433 <Platform Name="Android">
@@ -362,6 +434,10 @@
362434 <RemoteDir>res\drawable-xhdpi</RemoteDir>
363435 <Operation>1</Operation>
364436 </Platform>
437+ <Platform Name="Android64">
438+ <RemoteDir>res\drawable-xhdpi</RemoteDir>
439+ <Operation>1</Operation>
440+ </Platform>
365441 </DeployClass>
366442 <DeployClass Name="Android_NotificationIcon72">
367443 <Platform Name="Android">
@@ -368,6 +444,10 @@
368444 <RemoteDir>res\drawable-xxhdpi</RemoteDir>
369445 <Operation>1</Operation>
370446 </Platform>
447+ <Platform Name="Android64">
448+ <RemoteDir>res\drawable-xxhdpi</RemoteDir>
449+ <Operation>1</Operation>
450+ </Platform>
371451 </DeployClass>
372452 <DeployClass Name="Android_NotificationIcon96">
373453 <Platform Name="Android">
@@ -374,6 +454,10 @@
374454 <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
375455 <Operation>1</Operation>
376456 </Platform>
457+ <Platform Name="Android64">
458+ <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
459+ <Operation>1</Operation>
460+ </Platform>
377461 </DeployClass>
378462 <DeployClass Name="Android_SplashImage426">
379463 <Platform Name="Android">
@@ -380,6 +464,10 @@
380464 <RemoteDir>res\drawable-small</RemoteDir>
381465 <Operation>1</Operation>
382466 </Platform>
467+ <Platform Name="Android64">
468+ <RemoteDir>res\drawable-small</RemoteDir>
469+ <Operation>1</Operation>
470+ </Platform>
383471 </DeployClass>
384472 <DeployClass Name="Android_SplashImage470">
385473 <Platform Name="Android">
@@ -386,6 +474,10 @@
386474 <RemoteDir>res\drawable-normal</RemoteDir>
387475 <Operation>1</Operation>
388476 </Platform>
477+ <Platform Name="Android64">
478+ <RemoteDir>res\drawable-normal</RemoteDir>
479+ <Operation>1</Operation>
480+ </Platform>
389481 </DeployClass>
390482 <DeployClass Name="Android_SplashImage640">
391483 <Platform Name="Android">
@@ -392,6 +484,10 @@
392484 <RemoteDir>res\drawable-large</RemoteDir>
393485 <Operation>1</Operation>
394486 </Platform>
487+ <Platform Name="Android64">
488+ <RemoteDir>res\drawable-large</RemoteDir>
489+ <Operation>1</Operation>
490+ </Platform>
395491 </DeployClass>
396492 <DeployClass Name="Android_SplashImage960">
397493 <Platform Name="Android">
@@ -398,6 +494,10 @@
398494 <RemoteDir>res\drawable-xlarge</RemoteDir>
399495 <Operation>1</Operation>
400496 </Platform>
497+ <Platform Name="Android64">
498+ <RemoteDir>res\drawable-xlarge</RemoteDir>
499+ <Operation>1</Operation>
500+ </Platform>
401501 </DeployClass>
402502 <DeployClass Name="Android_Strings">
403503 <Platform Name="Android">
@@ -404,6 +504,10 @@
404504 <RemoteDir>res\values</RemoteDir>
405505 <Operation>1</Operation>
406506 </Platform>
507+ <Platform Name="Android64">
508+ <RemoteDir>res\values</RemoteDir>
509+ <Operation>1</Operation>
510+ </Platform>
407511 </DeployClass>
408512 <DeployClass Name="DebugSymbols">
409513 <Platform Name="iOSSimulator">
@@ -473,6 +577,9 @@
473577 <Platform Name="Android">
474578 <Operation>0</Operation>
475579 </Platform>
580+ <Platform Name="Android64">
581+ <Operation>0</Operation>
582+ </Platform>
476583 <Platform Name="iOSDevice32">
477584 <Operation>0</Operation>
478585 </Platform>
@@ -804,6 +911,9 @@
804911 <Platform Name="Android">
805912 <Operation>1</Operation>
806913 </Platform>
914+ <Platform Name="Android64">
915+ <Operation>1</Operation>
916+ </Platform>
807917 </DeployClass>
808918 <DeployClass Name="ProjectiOSDeviceDebug">
809919 <Platform Name="iOSDevice32">
@@ -847,6 +957,10 @@
847957 <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
848958 <Operation>1</Operation>
849959 </Platform>
960+ <Platform Name="Android64">
961+ <RemoteDir>library\lib\arm64-v8a</RemoteDir>
962+ <Operation>1</Operation>
963+ </Platform>
850964 <Platform Name="iOSDevice32">
851965 <Operation>1</Operation>
852966 </Platform>
--- trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExpertsD.dpk (revision 535)
+++ trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExpertsD.dpk (revision 536)
@@ -46,6 +46,7 @@
4646 KX.EditorSubViews in '..\..\src\D14+\KX.EditorSubViews.pas' {DAMOEditorSubviews: TDataModule},
4747 KX.About in '..\..\src\KX.About.pas' {FormAbout},
4848 KX.IDEInsightItems in '..\..\src\D21+\KX.IDEInsightItems.pas' {DAMOIDEInsightItems: TDataModule},
49- KX.FindMyPackage in '..\..\src\FindMyPackage\KX.FindMyPackage.pas' {FormFindMyPackage};
49+ KX.FindMyPackage in '..\..\src\FindMyPackage\KX.FindMyPackage.pas' {FormFindMyPackage},
50+ KX.Documentation in '..\..\src\D14+\EditorSubViews\KX.Documentation.pas' {FRAMDocumentation: TFrame};
5051
5152 end.
--- trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExpertsD.dproj (revision 535)
+++ trunk/dtp/Experts/prj/Delphi 26 (Delphi Rio)/KRKExpertsD.dproj (revision 536)
@@ -42,6 +42,7 @@
4242 <DCC_Description>Anak Krakatoa Experts</DCC_Description>
4343 <DesignOnlyPackage>true</DesignOnlyPackage>
4444 <DllSuffix>260</DllSuffix>
45+ <DCC_OutputDRCFile>true</DCC_OutputDRCFile>
4546 </PropertyGroup>
4647 <PropertyGroup Condition="'$(Base_Win32)'!=''">
4748 <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
@@ -110,6 +111,11 @@
110111 <Form>FormFindMyPackage</Form>
111112 <FormType>dfm</FormType>
112113 </DCCReference>
114+ <DCCReference Include="..\..\src\D14+\EditorSubViews\KX.Documentation.pas">
115+ <Form>FRAMDocumentation</Form>
116+ <FormType>dfm</FormType>
117+ <DesignClass>TFrame</DesignClass>
118+ </DCCReference>
113119 <BuildConfiguration Include="Base">
114120 <Key>Base</Key>
115121 </BuildConfiguration>
--- trunk/dtp/Experts/src/D14+/EditorSubViews/KX.Documentation.pas (nonexistent)
+++ trunk/dtp/Experts/src/D14+/EditorSubViews/KX.Documentation.pas (revision 536)
@@ -0,0 +1,330 @@
1+unit KX.Documentation;
2+
3+interface
4+
5+// Leia isso para saber quais delphis tem as interfaces
6+// https://www.davidghoyle.co.uk/WordPress/?page_id=1251
7+
8+uses
9+ Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
10+ Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls,
11+ System.ImageList, Vcl.ImgList, Vcl.StdActns, System.Actions, Vcl.ActnList,
12+ KRK.Vcl.ExtActns, Vcl.ExtActns, UPngImageList, Vcl.ToolWin, Vcl.ActnMan,
13+ Vcl.ActnCtrls, Vcl.ExtCtrls, Contnrs, ToolsApi;
14+
15+type
16+ TDocument = class
17+ private
18+ FId: String;
19+ FContents: String;
20+ FModified: Boolean;
21+ procedure SetContents(const Value: String);
22+ public
23+ constructor Create(AId: String; AContents: String);
24+
25+ property Id: String read FId;
26+ property Contents: String read FContents write SetContents;
27+ property Modified: Boolean read FModified write FModified;
28+ end;
29+
30+ TDocumentation = class(TObjectList)
31+ private
32+ function GetItemById(AId: String): TDocument;
33+ public
34+ function Add(AId: String; AContents: String): TDocument; reintroduce;
35+ property ItemById[AId: String]: TDocument read GetItemById; default;
36+ end;
37+
38+ TFRAMDocumentation = class(TFrame)
39+ RIEDDocumentation: TRichEdit;
40+ TOBA: TToolBar;
41+ TOBUCut: TToolButton;
42+ TOBUCopy: TToolButton;
43+ ACLI: TActionList;
44+ PNIL: TPngImageList;
45+ EDCU: TEditCut;
46+ EDCO: TEditCopy;
47+ EDPA: TEditPaste;
48+ EDSA: TEditSelectAll;
49+ EDUN: TEditUndo;
50+ TOBUPaste: TToolButton;
51+ TOBUSeparator1: TToolButton;
52+ REBO: TRichEditBold;
53+ REIT: TRichEditItalic;
54+ REUL: TRichEditUnderline;
55+ RESO: TRichEditStrikeOut;
56+ REBU: TRichEditBullets;
57+ REAL: TRichEditAlignLeft;
58+ REAR: TRichEditAlignRight;
59+ REAC: TRichEditAlignCenter;
60+ REAJ: TRichEditAlignJustified;
61+ TOBUBold: TToolButton;
62+ TOBUItalic: TToolButton;
63+ TOBUSelectAll: TToolButton;
64+ TOBUUndo: TToolButton;
65+ TOBUUnderline: TToolButton;
66+ TOBUSeparator2: TToolButton;
67+ TOBUStrikeOut: TToolButton;
68+ TOBUSeparator3: TToolButton;
69+ TOBUBullets: TToolButton;
70+ STBU: TStatusBar;
71+ TOBUAlignLeft: TToolButton;
72+ TOBUAlignCenter: TToolButton;
73+ TOBUAlignRight: TToolButton;
74+ TOBUAlignJustify: TToolButton;
75+ COBOFontColor: TColorBox;
76+ CBBXFontName: TComboBox;
77+ TOBUSeparator5: TToolButton;
78+ CBBXFontSize: TComboBox;
79+ TOBUSeparator4: TToolButton;
80+ RERD: TRichEditRedo;
81+ TOBURedo: TToolButton;
82+ procedure ACLIUpdate(Action: TBasicAction; var Handled: Boolean);
83+ procedure RIEDDocumentationSelectionChange(Sender: TObject);
84+ procedure COBOFontColorChange(Sender: TObject);
85+ procedure CBBXFontNameChange(Sender: TObject);
86+ procedure CBBXFontSizeChange(Sender: TObject);
87+ procedure RIEDDocumentationChange(Sender: TObject);
88+ private
89+ { Private declarations }
90+ FDocumentation: TDocumentation;
91+ FCurrentDocument: TDocument;
92+ FCurrentModule: IOTAModule;
93+
94+ function GetContents: String;
95+ procedure LoadFromFile(AFileName: String);
96+ procedure LoadCurrentDocumentContents;
97+ procedure Clear;
98+ public
99+ { Public declarations }
100+ constructor Create(AOwner: TComponent); override;
101+ destructor Destroy; override;
102+
103+ procedure CutToClipBoard;
104+ procedure CopyToClipboard;
105+ procedure PasteFromClipboard;
106+ procedure Undo;
107+ procedure Redo;
108+ procedure SelectAll;
109+
110+ procedure LoadDocument(AId: String; AFileName: String; AModule: IOTAModule);
111+ procedure ApplyAdvancedTypography;
112+ end;
113+
114+implementation
115+
116+{$R *.dfm}
117+
118+uses KX.EditorSubViews
119+ , RichEdit;
120+
121+procedure TFRAMDocumentation.ACLIUpdate(Action: TBasicAction; var Handled: Boolean);
122+begin
123+ if Odd(GetKeyState (VK_CAPITAL)) then
124+ STBU.Panels[0].Text := 'CAPS LOCK'
125+ else
126+ STBU.Panels[0].Text := '';
127+
128+ STBU.Panels[2].Text := Application.Hint;
129+end;
130+
131+
132+// Para que o alinhamento justificado seja efetivo, precisamos habilitar a
133+// tipografia avançada. Isso habilita outras coisas também. Pesquise sobre
134+// EM_SETTYPOGRAPHYOPTIONS no MSDN
135+procedure TFRAMDocumentation.ApplyAdvancedTypography;
136+begin
137+ SendMessage(RIEDDocumentation.Handle, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY);
138+end;
139+
140+procedure TFRAMDocumentation.CBBXFontNameChange(Sender: TObject);
141+begin
142+ RIEDDocumentation.SelAttributes.Name := CBBXFontName.Text;
143+end;
144+
145+procedure TFRAMDocumentation.CBBXFontSizeChange(Sender: TObject);
146+begin
147+ RIEDDocumentation.SelAttributes.Size := StrToInt(CBBXFontSize.Text);
148+end;
149+
150+procedure TFRAMDocumentation.Clear;
151+begin
152+ RIEDDocumentation.Clear;
153+end;
154+
155+procedure TFRAMDocumentation.COBOFontColorChange(Sender: TObject);
156+begin
157+ RIEDDocumentation.SelAttributes.Color := COBOFontColor.Selected;
158+end;
159+
160+procedure TFRAMDocumentation.CopyToClipboard;
161+begin
162+ RIEDDocumentation.CopyToClipboard;
163+end;
164+
165+constructor TFRAMDocumentation.Create(AOwner: TComponent);
166+begin
167+ inherited;
168+ FDocumentation := TDocumentation.Create;
169+end;
170+
171+procedure TFRAMDocumentation.CutToClipBoard;
172+begin
173+ RIEDDocumentation.CutToClipboard;
174+end;
175+
176+destructor TFRAMDocumentation.Destroy;
177+begin
178+ FDocumentation.Free;
179+ inherited;
180+end;
181+
182+function TFRAMDocumentation.GetContents: String;
183+var
184+ SS: TStringStream;
185+begin
186+ SS := TStringStream.Create;
187+ try
188+ RIEDDocumentation.Lines.SaveToStream(SS);
189+ Result := SS.DataString;
190+ finally
191+ SS.Free;
192+ end;
193+end;
194+
195+// Como sempre há apenas um módulo visível por vez nas abas do editor, é
196+// garantido que somente haja um documento ativo de cada vez e que ele
197+// permaneça imutável até que se escolha uma outra aba de edição ou que se
198+// escolha uma outra subvisão. O método abaixo é usado no manipulador de evento
199+// KX.EditorSubViews.KEDSDocumentationDisplay a fim de realizar a troca de
200+// conteúdo existente em RIEDDocumentation
201+procedure TFRAMDocumentation.LoadDocument(AId: String; AFileName: String; AModule: IOTAModule);
202+begin
203+ FCurrentModule := AModule;
204+ FCurrentDocument := FDocumentation[AId];
205+
206+ // Se já existe um documento carregado na lista de documentos, simplesmente
207+ // carrega este documento no RichEdit por meio de seu conteúdo
208+ if Assigned(FCurrentDocument) then
209+ LoadCurrentDocumentContents
210+ // Caso o documento ainda não exista na lista de documentos e já exista o
211+ // arquivo de documentação rtf, carrega o RichText com este arquivo e em
212+ // seguida adiciona este novo documento na lista de documentos
213+ else if FileExists(AFileName) then
214+ begin
215+ LoadFromFile(AFileName);
216+ FDocumentation.Add(AId,GetContents);
217+ end
218+ // Caso não haja nem documento na lista de documentos e nem arquivo, cria
219+ // uma entrada na lista de documentos, com conteúdo vazio e limpa o conteúdo
220+ // do RichEdit, porque pode haver texto carregado de outros módulos
221+ else
222+ begin
223+ Clear;
224+ FCurrentDocument := FDocumentation.Add(AId,'');
225+ end;
226+end;
227+
228+procedure TFRAMDocumentation.LoadCurrentDocumentContents;
229+var
230+ SS: TStringStream;
231+begin
232+ // O carregamento do conteúdo do documento atual não deve gerar o evento
233+ // OnChange por dois motivos, primeiro, porque aqui já estamos carregando o
234+ // RichEdit com FCurrentDocument.Contents e, em segundo lugar, porque ao
235+ // carregar, não precisamos alterar o flag de modificação do módulo. O evento
236+ // OnChange atualiza FCurrentDocument.Contents com o que está digitado em
237+ // RichEdit e ativa o flag de modificação do módulo atual. Isso não é
238+ // necessário aqui
239+ RIEDDocumentation.OnChange := nil;
240+ SS := TStringStream.Create(FCurrentDocument.Contents);
241+ try
242+ SS.Seek(0,soFromBeginning);
243+ RIEDDocumentation.Lines.LoadFromStream(SS); // isso gera OnChange
244+ finally
245+ SS.Free;
246+ RIEDDocumentation.OnChange := RIEDDocumentationChange;
247+ end;
248+end;
249+
250+procedure TFRAMDocumentation.LoadFromFile(AFileName: String);
251+begin
252+ RIEDDocumentation.Lines.LoadFromFile(AFileName);
253+end;
254+
255+procedure TFRAMDocumentation.PasteFromClipboard;
256+begin
257+ RIEDDocumentation.PasteFromClipboard;
258+end;
259+
260+procedure TFRAMDocumentation.Redo;
261+begin
262+ RERD.Execute;
263+end;
264+
265+procedure TFRAMDocumentation.RIEDDocumentationChange(Sender: TObject);
266+begin
267+ if Assigned(FCurrentDocument) then
268+ begin
269+ FCurrentDocument.Contents := GetContents;
270+ FCurrentModule.MarkModified;
271+ end;
272+end;
273+
274+procedure TFRAMDocumentation.RIEDDocumentationSelectionChange(Sender: TObject);
275+begin
276+ if RIEDDocumentation.SelLength > 0 then
277+ STBU.Panels[1].Text := Format('Selection: %d lines, %d characters',[RIEDDocumentation.CaretPos.Y + 1, RIEDDocumentation.SelLength])
278+ else
279+ STBU.Panels[1].Text := Format('Position: line %d, column %d',[RIEDDocumentation.CaretPos.Y + 1, RIEDDocumentation.CaretPos.X + 1]);
280+
281+ CBBXFontName.ItemIndex := CBBXFontName.Items.IndexOf(RIEDDocumentation.SelAttributes.Name);
282+ COBOFontColor.Selected := RIEDDocumentation.SelAttributes.Color;
283+ CBBXFontSize.ItemIndex := CBBXFontSize.Items.IndexOf(IntToStr(RIEDDocumentation.SelAttributes.Size));
284+end;
285+
286+procedure TFRAMDocumentation.SelectAll;
287+begin
288+ RIEDDocumentation.SelectAll;
289+end;
290+
291+procedure TFRAMDocumentation.Undo;
292+begin
293+ RIEDDocumentation.Undo;
294+end;
295+
296+{ TDocument }
297+
298+constructor TDocument.Create(AId: String; AContents: String);
299+begin
300+ FId := AId;
301+ FContents := AContents;
302+ FModified := False;
303+end;
304+
305+procedure TDocument.SetContents(const Value: String);
306+begin
307+ FContents := Value;
308+ FModified := True;
309+end;
310+
311+{ TDocumentation }
312+
313+function TDocumentation.Add(AId: String; AContents: String): TDocument;
314+begin
315+ Result := TDocument.Create(AId, AContents);
316+ inherited Add(Result);
317+end;
318+
319+function TDocumentation.GetItemById(AId: String): TDocument;
320+var
321+ O: TObject;
322+begin
323+ Result := nil;
324+
325+ for O in Self do
326+ if TDocument(O).Id = AId then
327+ Result := TDocument(O);
328+end;
329+
330+end.
--- trunk/dtp/Experts/src/D14+/KX.EditorSubViews.pas (revision 535)
+++ trunk/dtp/Experts/src/D14+/KX.EditorSubViews.pas (revision 536)
@@ -11,6 +11,7 @@
1111 type
1212 TDAMOEditorSubviews = class(TDataModule)
1313 KEDSExample: TKRKOTAEditorSubview;
14+ KEDSDocumentation: TKRKOTAEditorSubview;
1415 procedure KEDSExampleDisplay(const AContext: IInterface; AViewObject: TObject);
1516 function KEDSExampleEditAction(const AContext: IInterface; AAction: TEditAction; AViewObject: TObject): Boolean;
1617 procedure KEDSExampleFrameCreated(AFrame: TCustomFrame);
@@ -19,6 +20,12 @@
1920 procedure KEDSExampleHide(const AContext: IInterface; AViewObject: TObject);
2021 procedure KEDSExampleSetViewContext(const AContext: IInterface; const AViewObject, AViewContext: TObject);
2122 procedure KEDSExampleViewClosed(const AContext: IInterface; AViewObject: TObject);
23+ function KEDSDocumentationGetFrameClass: TCustomFrameClass;
24+ function KEDSDocumentationHandles(const AContext: IInterface): Boolean;
25+ function KEDSDocumentationEditAction(const AContext: IInterface; AAction: TEditAction; AViewObject: TObject): Boolean;
26+ procedure KEDSDocumentationDisplay(const AContext: IInterface; AViewObject: TObject);
27+ procedure KEDSDocumentationHide(const AContext: IInterface; AViewObject: TObject);
28+ procedure KEDSDocumentationFrameCreated(AFrame: TCustomFrame);
2229 private
2330 { Private declarations }
2431 public
@@ -29,7 +36,10 @@
2936
3037 uses ToolsAPI
3138 , KRK.ToolsAPI
32- , KX.SubViewExample;
39+ , KRK.Rtl.Win.WinCrypt.Utilities
40+ , KX.Documentation
41+ , KX.SubViewExample
42+ , Windows;
3343
3444 {$R *.dfm}
3545
@@ -77,6 +87,58 @@
7787 end;
7888 end;
7989
90+procedure TDAMOEditorSubviews.KEDSDocumentationDisplay(const AContext: IInterface; AViewObject: TObject);
91+var
92+ EditorViewService: IOTAEditorViewServices;
93+ Module: IOTAModule;
94+ FileName: String;
95+begin
96+ if Assigned(AContext) and GetIOTAEditorViewServices(EditorViewService) and EditorViewService.ContextToModule(AContext, Module) then
97+ begin
98+ (AViewObject as TFRAMDocumentation).ApplyAdvancedTypography;
99+ FileName := ChangeFileExt(GetIOTASourceEditor(Module).FileName,'.rtf');
100+ (AViewObject as TFRAMDocumentation).LoadDocument(GetStringCheckSum(UTF8String(FileName),[haMD5])
101+ ,FileName
102+ ,Module);
103+ // Aparentemente quando se alterna as abas do editor (alternando
104+ // arquivos/módulos) enquanto a subvisão está visível, o módulo que controla
105+ // a habilitação/desabilitação dos botões de salvamento na IDE não é
106+ // alternado e isso faz com que o botão de salvamento atue em um módulo
107+ // diferente do atual, mais especificamente o último módulo que foi aberto
108+ // ou o último módulo cuja sub-visão "Code" ou "Design" foi exibida.
109+ // Aparentemente só ocorre a mudança de módulo quando as sub-visões Code ou
110+ // Design são as sub-visões ativas. Isso acontece até mesmo com a sub-visão
111+ // "History", experimente, abra dois arquivos na IDE, altere ambos de forma
112+ // que eles fiquem marcados como modificados, em seguida alterne cada um
113+ // deles para a sub-visão "History" e salve cada um deles indivudualmente.
114+ // Note que um dos arquivos, mesmo quando tem sua aba ativa na ide, não será
115+ // salvo, porque a ação de salvar na verdade salvou o outro módulo, o módulo
116+ // cuja sub-visão "Code" ou "Design" estava aberta por último ANTES da
117+ // sub-visão "History" ser selecionada. Quando executamos o comando abaixo,
118+ // há uma espécie de confirmação do módulo ativo, mesmo quando a nossa
119+ // sub-visão está visível, possibilitando assim salvar individualmente cada
120+ // módulo de forma correta. O efeito colateral de executar show é que em
121+ // momentos aleatórios a sub-visão padrão do módulo será selecionada, por
122+ // exemplo, se abrirmos dois módulos e mudaramos ambos para a sub-visão
123+ // "Documentation" e ficarmos alternando as abas do editor da IDE, em algum
124+ // momento a sub-visão selecionada de cada módulo mudará para "Code" ou
125+ // "Design", dependendo do módulo aberto. Isso não é tão drástico, mas pode
126+ // ser inconveniente
127+ Module.Show;
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+ // codigo original que não faz uso de tdocument
135+// if FileExists(FileName) then
136+// (AViewObject as TFRAMDocumentation).Load(FileName)
137+// else then
138+// (AViewObject as TFRAMDocumentation).RIEDDocumentation.Clear;
139+ end;
140+end;
141+
80142 // Defina no evento OnEditAction o que deve acontecer quando alguma ação do menu
81143 // "Edit" for utilizada. Retornar true informa que a ação foi bem sucedida
82144 function TDAMOEditorSubviews.KEDSExampleEditAction(const AContext: IInterface; AAction: TEditAction; AViewObject: TObject): Boolean;
@@ -94,6 +156,38 @@
94156 end;
95157 end;
96158
159+function TDAMOEditorSubviews.KEDSDocumentationEditAction(const AContext: IInterface; AAction: TEditAction; AViewObject: TObject): Boolean;
160+begin
161+ Result := False;
162+
163+ case AAction Of
164+ eaCut: begin
165+ (AViewObject As TFRAMDocumentation).CutToClipBoard;
166+ Result := True;
167+ end;
168+ eaCopy: begin
169+ (AViewObject As TFRAMDocumentation).CopyToClipboard;
170+ Result := True;
171+ end;
172+ eaPaste: begin
173+ (AViewObject As TFRAMDocumentation).PasteFromClipboard;
174+ Result := True;
175+ end;
176+ eaUndo: begin
177+ (AViewObject As TFRAMDocumentation).Undo;
178+ Result := True;
179+ end;
180+ eaSelectAll: begin
181+ (AViewObject As TFRAMDocumentation).SelectAll;
182+ Result := True;
183+ end;
184+ eaRedo: begin
185+ (AViewObject As TFRAMDocumentation).Redo;
186+ Result := True;
187+ end;
188+ end;
189+end;
190+
97191 // Defina no evento OnFrameCreated o que deve ser feito quando o frame for
98192 // criado. Um frame será criado para cada janela de edição. O Delphi já cria um
99193 // frame na sua inicialização para a janela de edição principal. Este evento
@@ -104,6 +198,12 @@
104198 // isso deve ser executado após a criação do frame (apenas uma vez)
105199 end;
106200
201+procedure TDAMOEditorSubviews.KEDSDocumentationFrameCreated(AFrame: TCustomFrame);
202+begin
203+ TFRAMDocumentation(AFrame).CBBXFontName.Items := Screen.Fonts;
204+ TFRAMDocumentation(AFrame).CBBXFontName.ItemIndex := TFRAMDocumentation(AFrame).CBBXFontName.Items.IndexOf(TFRAMDocumentation(AFrame).RIEDDocumentation.Font.Name);
205+end;
206+
107207 // Defina no evento OnGetFrameClass a classe do frame a ser criado. Faça isso
108208 // obrigatoriamente. Não implementar este evento levantará uma exceção na
109209 // inicialização do Delphi
@@ -112,6 +212,11 @@
112212 Result := TFRAMSubViewExample;
113213 end;
114214
215+function TDAMOEditorSubviews.KEDSDocumentationGetFrameClass: TCustomFrameClass;
216+begin
217+ Result := TFRAMDocumentation;
218+end;
219+
115220 // Defina no evento OnHandles um algorítmo que considere o contexto visualizável
116221 // pela sub-visão. Se esta função retornar false a visão não estará disponível
117222 // para seleção
@@ -124,21 +229,60 @@
124229 // retornamos true e a aba será exibida, permitindo ser selecionada
125230 Result := False;
126231
127- EditorViewServices := GetIOTAEditorViewServices;
232+ if Assigned(AContext) and GetIOTAEditorViewServices(EditorViewServices) then
233+ Result := EditorViewServices.ContextToModule(AContext,Module);
234+end;
128235
129- if Assigned(EditorViewServices) then
236+function TDAMOEditorSubviews.KEDSDocumentationHandles(const AContext: IInterface): Boolean;
237+var
238+ EditorViewServices: IOTAEditorViewServices;
239+ Module: IOTAModule;
240+begin
241+ Result := False;
242+
243+ if Assigned(AContext) and GetIOTAEditorViewServices(EditorViewServices) then
130244 Result := EditorViewServices.ContextToModule(AContext,Module);
131245 end;
132246
133247 // Defina no evento OnHide o que deve ser feito quando a sub-visão for ocultada.
134248 // Isso pode ser detectado em OnDisplay, quando AContext = nil. Aqui, AContext
135-// sempre é diferente de nil e representa o frame. Este evento seria então a
136-// contrapartida do envento OnDisplay e pode ser usado para salvar coisas
249+// sempre é diferente de nil e representa contexto atual onde esta sub-visão
250+// está sendo ocultada. AViewObject é uma referência ao noss frame. Este evento
251+// seria então a contrapartida do envento OnDisplay e pode ser usado para salvar
252+// coisas
137253 procedure TDAMOEditorSubviews.KEDSExampleHide(const AContext: IInterface; AViewObject: TObject);
138254 begin
139255 { Nada }
140256 end;
141257
258+procedure TDAMOEditorSubviews.KEDSDocumentationHide(const AContext: IInterface; AViewObject: TObject);
259+var
260+ EditorViewService: IOTAEditorViewServices;
261+ Module: IOTAModule;
262+ FileName: String;
263+begin
264+ if Assigned(AContext) and GetIOTAEditorViewServices(EditorViewService) and EditorViewService.ContextToModule(AContext, Module) then
265+ begin
266+ // Neste ponto do código é garantida a existência de um documento na lista
267+ // de documentos. No caso, o documento aberto atualmente está em
268+ // FCurrentDocument
269+ // Afinal? O que fazer neste evento, que só é chamado quando trocamos de abas
270+ //FCurrentDocument.Contents := (AViewObject as TFRAMDocumentation).Contents;
271+
272+
273+ // Codigo original que salvava direto no arquivo final
274+// FileName := ChangeFileExt(GetIOTASourceEditor(Module).FileName,'.rtf');
275+//
276+// if FileExists(FileName) then
277+// (AViewObject as TFRAMDocumentation).RIEDDocumentation.Lines.SaveToFile(FileName)
278+// else
279+// case Application.MessageBox('Você deseja salvar a documentção para o módulo atual?'#13#10#13#10'Clique em "Sim" para criar um arquivo .rtf na mesma pasta do arquivo do módulo atual. Clique em "Não" para não salvar nada. Clique em "Cancelar" para permanecer na aba de documentação','Deseja salvar?',MB_ICONQUESTION or MB_YESNOCANCEL) of
280+// IDYES: (AViewObject as TFRAMDocumentation).RIEDDocumentation.Lines.SaveToFile(FileName);
281+// IDCANCEL: Abort; { Impede o ocultamento da aba }
282+// end;
283+ end;
284+end;
285+
142286 // Não sei bem para que isso serve. Em ToolsAPI.pas existe um comentário a
143287 // respeito. Busque por SetViewContext e tente entender
144288 procedure TDAMOEditorSubviews.KEDSExampleSetViewContext(const AContext: IInterface; const AViewObject, AViewContext: TObject);
--- trunk/dtp/ExtendedActions/src/KRK.ExtendedActions.pas (revision 535)
+++ trunk/dtp/ExtendedActions/src/KRK.ExtendedActions.pas (revision 536)
@@ -42,7 +42,8 @@
4242 // parâmetro e reinstale. Após as alterações terem sido feitas em
4343 // TActionResources elas ficarão salvas no DFM e não será necessário realizar
4444 // o procedimento acima, apenas instalar normalmente
45- RegisterActions('Format',[TRichEditAlignFullyJustified],TActionResources);
45+ RegisterActions('Format',[TRichEditAlignJustified],TActionResources);
46+ RegisterActions('Edit',[TRichEditRedo],TActionResources);
4647 end;
4748
4849 end.
--- trunk/dtp/ToolsApiComponents/src/KRK.ToolsApiComponents.pas (revision 535)
+++ trunk/dtp/ToolsApiComponents/src/KRK.ToolsApiComponents.pas (revision 536)
@@ -22,7 +22,8 @@
2222 , KRK.ToolsApi.Components.IDEInsightItem
2323 , KRK.ToolsApi.Components.IDEInsightItem.Editors
2424 , KRK.ToolsApi.Components.IDEMainMenu
25- , KRK.ToolsApi.Components.IDEMainMenu.Editors;
25+ , KRK.ToolsApi.Components.IDEMainMenu.Editors
26+ , KRK.ToolsApi.Components.ModuleNotifier;
2627
2728 procedure Register;
2829 begin
@@ -44,7 +45,8 @@
4445 {$IFEND}
4546 ,TKRKOTAFormWizard
4647 ,TKRKOTAProjectWizard
47- ,TKRKOTAModuleCreator]);
48+ ,TKRKOTAModuleCreator
49+ ,TKRKOTAModuleNotifier]);
4850
4951 RegisterPropertyEditor (TypeInfo(String), TKRKIDEMainMenu, 'ReferenceMenuItemName', TReferenceMenuItemNameProperty);
5052
--- trunk/rtp/prj/Delphi 26 (Delphi Rio)/KRKLib.dpk (revision 535)
+++ trunk/rtp/prj/Delphi 26 (Delphi Rio)/KRKLib.dpk (revision 536)
@@ -147,6 +147,7 @@
147147 KRK.Rtl.Win.WinInet in '..\..\src\Rtl\Win\KRK.Rtl.Win.WinInet.pas',
148148 KRK.Xml.MsXml5 in '..\..\src\Xml\KRK.Xml.MsXml5.pas',
149149 KRK.Xml.CryptXml.Utilities in '..\..\src\Xml\KRK.Xml.CryptXml.Utilities.pas',
150- KRK.Xml.CryptXml in '..\..\src\Xml\KRK.Xml.CryptXml.pas';
150+ KRK.Xml.CryptXml in '..\..\src\Xml\KRK.Xml.CryptXml.pas',
151+ KRK.ToolsApi.Components.ModuleNotifier in '..\..\src\ToolsAPI\Components\KRK.ToolsApi.Components.ModuleNotifier.pas';
151152
152153 end.
--- trunk/rtp/prj/Delphi 26 (Delphi Rio)/KRKLib.dproj (revision 535)
+++ trunk/rtp/prj/Delphi 26 (Delphi Rio)/KRKLib.dproj (revision 536)
@@ -171,6 +171,7 @@
171171 <DCCReference Include="..\..\src\Xml\KRK.Xml.MsXml5.pas"/>
172172 <DCCReference Include="..\..\src\Xml\KRK.Xml.CryptXml.Utilities.pas"/>
173173 <DCCReference Include="..\..\src\Xml\KRK.Xml.CryptXml.pas"/>
174+ <DCCReference Include="..\..\src\ToolsAPI\Components\KRK.ToolsApi.Components.ModuleNotifier.pas"/>
174175 <BuildConfiguration Include="Base">
175176 <Key>Base</Key>
176177 </BuildConfiguration>
--- trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.IDENotifier.pas (revision 535)
+++ trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.IDENotifier.pas (revision 536)
@@ -20,6 +20,9 @@
2020 FOnBeforeCompile: TOnBeforeCompile;
2121 FOnFileNotification: TOnFileNotification;
2222 FOnAfterCompile: TOnAfterCompile;
23+ // Manipulador do evento OnDestroyed, usado aqui para TAMBÉM desregistrar o
24+ // notificador
25+ procedure DoDestroyed(ASender: TObject);
2326
2427 { IOTAIDENotifier }
2528 procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: string; var Cancel: Boolean);
@@ -39,6 +42,7 @@
3942 property OnBeforeCompile: TOnBeforeCompile read FOnBeforeCompile write FOnBeforeCompile;
4043 property OnAfterCompile: TOnAfterCompile read FOnAfterCompile write FOnAfterCompile;
4144 public
45+ constructor Create(AOwner: TComponent); override;
4246 destructor Destroy; override;
4347 end;
4448
@@ -82,6 +86,12 @@
8286 FOnBeforeCompile(Project,IsCodeInsight,Cancel);
8387 end;
8488
89+constructor TKRKCustomOTAIDENotifier.Create(AOwner: TComponent);
90+begin
91+ inherited;
92+ OnDestroyed := DoDestroyed;
93+end;
94+
8595 destructor TKRKCustomOTAIDENotifier.Destroy;
8696 begin
8797 if not (csDesigning in ComponentState) then
@@ -103,7 +113,20 @@
103113 if not (csDesigning in ComponentState) then
104114 NotifierIndex := AddOTAIDENotifier(Self);
105115 end;
116+// O evento OnDestroyed acontece antes da destruição da classe, portanto, caso
117+// este evento seja disparado, precisamos configurar NotifierIndex como -1, de
118+// forma que no destrutor regular da classe não seja feita a remoção novamente,
119+// o que invariavelmente levaria a uma exceção
120+procedure TKRKCustomOTAIDENotifier.DoDestroyed(ASender: TObject);
121+begin
122+ if not (csDesigning in ComponentState) then
123+ begin
124+ RemoveOTAIDENotifier(NotifierIndex);
125+ NotifierIndex := -1;
126+ end;
106127
128+end;
129+
107130 end.
108131
109132
--- trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.ModuleNotifier.pas (nonexistent)
+++ trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.ModuleNotifier.pas (revision 536)
@@ -0,0 +1,203 @@
1+unit KRK.ToolsApi.Components.ModuleNotifier;
2+//https://www.davidghoyle.co.uk/WordPress/?p=1761
3+// explicação de cada interface: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Obtaining_Tools_API_Services
4+// Sobre notificadores: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Notifying_a_Wizard_of_IDE_Events
5+// Leia isso para saber quais delphis tem as interfaces
6+// https://www.davidghoyle.co.uk/WordPress/?page_id=1251
7+interface
8+
9+uses KRK.ToolsApi.Components.Notifier
10+ , ToolsApi
11+ , Classes;
12+
13+type
14+ TOnCheckOverwrite = procedure (out AAllowOverwrite: Boolean) of object;
15+ TOnModuleRenamed = procedure (const ANewName: String) of object;
16+ TOnSetSaveFileName = procedure (const AFileName: String) of object;
17+ TOnAllowSave = procedure (out AAllowSave: Boolean) of object;
18+ TOnAfterRename = procedure (const AOldFileName: String; const ANewFileName: String) of object;
19+ TOnBeforeRename = TOnAfterRename;
20+
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
27+ // métodos. Isso significa que a IDE lê estas propriedades e é por isso que
28+ // 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
36+
37+ //: Classe do componente que implementa a interface IOTAModuleNotifier
38+ TKRKCustomOTAModuleNotifier = class(TKRKOTANotifier
39+ ,IOTAModuleNotifier
40+ ,IOTAModuleNotifier80
41+ ,IOTAModuleNotifier90)
42+
43+ private
44+ FModule: IOTAMOdule;
45+ FOverwriteFileNames: TStrings;
46+ FOnCheckOverwrite: TOnCheckOverwrite;
47+ FOnModuleRenamed: TOnModuleRenamed;
48+ FOnSetSaveFileName: TOnSetSaveFileName;
49+ FOnAllowSave: TOnAllowSave;
50+ FOnAfterRename: TOnAfterRename;
51+ FOnBeforeRename: TOnBeforeRename;
52+ procedure DoDestroyed(ASender: TObject);
53+
54+ { IOTAModuleNotifier }
55+ function CheckOverwrite: Boolean;
56+ procedure ModuleRenamed(const NewName: string);
57+ { IOTAModuleNotifier80 }
58+ procedure SetSaveFileName(const FileName: string);
59+ function GetOverwriteFileName(Index: Integer): string;
60+ function GetOverwriteFileNameCount: Integer;
61+ function AllowSave: Boolean;
62+ { IOTAModuleNotifier90 }
63+ procedure AfterRename(const OldFileName: string; const NewFileName: string);
64+ procedure BeforeRename(const OldFileName: string; const NewFileName: string);
65+ { TKRKCustomOTAModuleNotifier }
66+ procedure SetOverwriteFileNames(const Value: TStrings);
67+ protected
68+ property OnCheckOverwrite: TOnCheckOverwrite read FOnCheckOverwrite write FOnCheckOverwrite;
69+ property OnModuleRenamed: TOnModuleRenamed read FOnModuleRenamed write FOnModuleRenamed;
70+ property OnSetSaveFileName: TOnSetSaveFileName read FOnSetSaveFileName write FOnSetSaveFileName;
71+ property OnAllowSave: TOnAllowSave read FOnAllowSave write FOnAllowSave;
72+ property OnAfterRename: TOnAfterRename read FOnAfterRename write FOnAfterRename;
73+ property OnBeforeRename: TOnBeforeRename read FOnBeforeRename write FOnBeforeRename;
74+ property OverwriteFileNames: TStrings read FOverwriteFileNames write SetOverwriteFileNames;
75+ public
76+ constructor Create(AOwner: TComponent); override;
77+ destructor Destroy; override;
78+
79+ procedure RegisterNotifier; override;
80+ procedure UnRegisterNotifier; override;
81+
82+ property Module: IOTAModule write FModule;
83+ end;
84+
85+ TKRKOTAModuleNotifier = class(TKRKCustomOTAModuleNotifier)
86+ published
87+ property OnCheckOverwrite;
88+ property OnModuleRenamed;
89+ property OnSetSaveFileName;
90+ property OnAllowSave;
91+ property OnAfterRename;
92+ property OnBeforeRename;
93+ property OverwriteFileNames;
94+ end;
95+
96+implementation
97+
98+{ TKRKCustomOTAModuleNotifier }
99+
100+procedure TKRKCustomOTAModuleNotifier.AfterRename(const OldFileName: string; const NewFileName: string);
101+begin
102+ if Assigned(FOnAfterRename) then
103+ FOnAfterRename(OldFileName,NewFileName);
104+end;
105+
106+function TKRKCustomOTAModuleNotifier.AllowSave: Boolean;
107+begin
108+ Result := True;
109+
110+ if Assigned(FOnAllowSave) then
111+ FOnAllowSave(Result);
112+end;
113+
114+procedure TKRKCustomOTAModuleNotifier.BeforeRename(const OldFileName: string; const NewFileName: string);
115+begin
116+ if Assigned(FOnBeforeRename) then
117+ FOnBeforeRename(OldFileName,NewFileName);
118+end;
119+
120+function TKRKCustomOTAModuleNotifier.CheckOverwrite: Boolean;
121+begin
122+ Result := True;
123+
124+ if Assigned(FOnCheckOverwrite) then
125+ FOnCheckOverwrite(Result);
126+end;
127+
128+constructor TKRKCustomOTAModuleNotifier.Create(AOwner: TComponent);
129+begin
130+ inherited;
131+ FOverwriteFileNames := TStringList.Create;
132+ OnDestroyed := DoDestroyed;
133+end;
134+
135+destructor TKRKCustomOTAModuleNotifier.Destroy;
136+begin
137+ FOverwriteFileNames.Free;
138+ UnRegisterNotifier;
139+ inherited;
140+end;
141+// É necessário usar NotifierIndex := -1 porque o evento OnDestroyed pode
142+// ocorrer antes da destruição da classe atual e sendo assim, no destrutor
143+// regular, não precisaremos mais desregistrar o notificador. Aqui também
144+// configuramos FModule como nil porque sendo FModule a referencia a uma
145+// interface, precisamos garantir que a contagem de referencias seja
146+// decrementada. Caso OnDestroyed seja disparado antes da classe atual ser
147+// destruída, ao configurmos FModule como nil, informamos ao sistema de contagem
148+// de referencias de interfaces que existe menos uma referencia e que portanto a
149+// memória pode ser liberada, caso a contagem de referencia seja zero. Não fazer
150+// isso poderia manter na memória uma instância de IOTAModule que não estaria
151+// sendo usada mais por ninguém. Note que no destrutor não é necessário
152+// confugurar FModule como nil, porque ao destruir a classe, todos os seus
153+// membros serão anulados automaticamente
154+procedure TKRKCustomOTAModuleNotifier.DoDestroyed(ASender: TObject);
155+begin
156+ UnRegisterNotifier;
157+ NotifierIndex := -1;
158+ FModule := nil;
159+end;
160+
161+function TKRKCustomOTAModuleNotifier.GetOverwriteFileName(Index: Integer): string;
162+begin
163+ Result := '';
164+
165+ if FOverwriteFileNames.Count > 0 then
166+ Result := FOverwriteFileNames[Index];
167+end;
168+
169+function TKRKCustomOTAModuleNotifier.GetOverwriteFileNameCount: Integer;
170+begin
171+ Result := FOverwriteFileNames.Count;
172+end;
173+
174+procedure TKRKCustomOTAModuleNotifier.ModuleRenamed(const NewName: string);
175+begin
176+ if Assigned(FOnModuleRenamed) then
177+ FOnModuleRenamed(NewName);
178+end;
179+
180+procedure TKRKCustomOTAModuleNotifier.RegisterNotifier;
181+begin
182+ if Assigned(FModule) then
183+ NotifierIndex := FModule.AddNotifier(Self);
184+end;
185+
186+procedure TKRKCustomOTAModuleNotifier.SetOverwriteFileNames(const Value: TStrings);
187+begin
188+ FOverwriteFileNames.Assign(Value);
189+end;
190+
191+procedure TKRKCustomOTAModuleNotifier.SetSaveFileName(const FileName: string);
192+begin
193+ if Assigned(FOnSetSaveFileName) then
194+ FOnSetSaveFileName(FileName);
195+end;
196+
197+procedure TKRKCustomOTAModuleNotifier.UnRegisterNotifier;
198+begin
199+ if Assigned(FModule) and (NotifierIndex > -1) then
200+ FModule.RemoveNotifier(NotifierIndex);
201+end;
202+
203+end.
--- trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.Notifier.pas (revision 535)
+++ trunk/rtp/src/ToolsAPI/Components/KRK.ToolsApi.Components.Notifier.pas (revision 536)
@@ -14,25 +14,41 @@
1414 FOnDestroyed: TNotifyEvent;
1515 FOnModified: TNotifyEvent;
1616 protected
17- // Precisa ser protected para poder ser utilizado pelas classes descendentes
1817 { IOTANotifier }
18+ // Os eventos aos quais estes métodos estão associados estão na sessão
19+ // public porque eu não tenho certeza se tais eventos são disparados
20+ // normalmente. Caso algum destes eventos precise ser usado em designtime,
21+ // considere movê-los para a seção published de classes filhas a fim de
22+ // expô-los. O eveto OnDestroyed é o único que parece ser disparado sempre
23+ // que o notificador for destruído pela IDE e pode ser usado para
24+ // desregistrar tal noficador em adição a um desregistro feito no destrutor
25+ // regular da classe
1926 procedure AfterSave;
2027 procedure BeforeSave;
2128 procedure Destroyed;
2229 procedure Modified;
2330
31+ // Os métodos virtuais abaixo servem para o registro e desregistro do
32+ // notificador. Como existem notificadores que são registrados por
33+ // interfaces diferentes, precisamos deixar isso a cargo do programador. Ao
34+ // implementar estes metodos em classes de notificação filhas o programador
35+ // deve usar o método de registro/desregistro a partir da interface correta.
36+ procedure RegisterNotifier; virtual;
37+ procedure UnRegisterNotifier; virtual;
38+
2439 property NotifierIndex: Integer read FNotifierIndex write FNotifierIndex;
2540 public
2641 constructor Create(AOwner: TComponent); override;
27- published
2842 property OnAfterSave: TNotifyEvent read FOnAfterSave write FOnAfterSave;
2943 property OnBeforeSave: TNotifyEvent read FOnBeforeSave write FOnBeforeSave;
44+ property OnModified: TNotifyEvent read FOnModified write FOnModified;
3045 property OnDestroyed: TNotifyEvent read FOnDestroyed write FOnDestroyed;
31- property OnModified: TNotifyEvent read FOnModified write FOnModified;
3246 end;
3347
3448 implementation
3549
50+uses SysUtils;
51+
3652 { TKRKOTANotifier }
3753
3854 procedure TKRKOTANotifier.AfterSave;
@@ -65,4 +81,14 @@
6581 FOnModified(Self);
6682 end;
6783
84+procedure TKRKOTANotifier.RegisterNotifier;
85+begin
86+ raise Exception.Create('Este método precisa ser implementado na classe "' + ClassName + '" antes de ser usado!'#13#10'Ao implementá-lo não use a palavra chave inherited!');
87+end;
88+
89+procedure TKRKOTANotifier.UnRegisterNotifier;
90+begin
91+ raise Exception.Create('Este método precisa ser implementado na classe "' + ClassName + '" antes de ser usado!'#13#10'Ao implementá-lo não use a palavra chave inherited!');
92+end;
93+
6894 end.
--- trunk/rtp/src/ToolsAPI/KRK.ToolsAPI.pas (revision 535)
+++ trunk/rtp/src/ToolsAPI/KRK.ToolsAPI.pas (revision 536)
@@ -47,7 +47,8 @@
4747 function GetIOTAServices: IOTAServices;
4848 function GetINTAServices: INTAServices;
4949 {$IF CompilerVersion >= 21} { Delphi 2010 }
50-function GetIOTAEditorViewServices: IOTAEditorViewServices;
50+function GetIOTAEditorViewServices: IOTAEditorViewServices; overload;
51+function GetIOTAEditorViewServices(out OEVS: IOTAEditorViewServices): Boolean; overload;
5152 function GetINTAIDEInsightService: INTAIDEInsightService;
5253 function GetIOTAIDEInsightService: IOTAIDEInsightService;
5354 function GetINTAEditorServices: INTAEditorServices;
@@ -325,6 +326,11 @@
325326 Result := nil;
326327 end;
327328
329+function GetIOTAEditorViewServices(out OEVS: IOTAEditorViewServices): Boolean;
330+begin
331+ Result := Supports(BorlandIDEServices, IOTAEditorViewServices, OEVS);
332+end;
333+
328334 procedure RegisterNTAIDEInsightItem(ANTAIDEInsightItem: INTAIDEInsightItem; const ACategory: String = '');
329335 var
330336 IIS: IOTAIDEInsightService;
--- trunk/rtp/src/Vcl/KRK.Vcl.ExtActns.ActnRes.pas (revision 535)
+++ trunk/rtp/src/Vcl/KRK.Vcl.ExtActns.ActnRes.pas (revision 536)
@@ -14,7 +14,8 @@
1414
1515 type
1616 TActionResources = class(TStandardActions)
17- RichEditAlignFullyJustified1: TRichEditAlignFullyJustified;
17+ RichEditAlignJustified1: TRichEditAlignJustified;
18+ RichEditRedo1: TRichEditRedo;
1819 private
1920 { Private declarations }
2021 public
--- trunk/rtp/src/Vcl/KRK.Vcl.ExtActns.pas (revision 535)
+++ trunk/rtp/src/Vcl/KRK.Vcl.ExtActns.pas (revision 536)
@@ -1,19 +1,42 @@
11 unit KRK.Vcl.ExtActns;
22
33 interface
4-
4+// para implementar outras coisas interessantes, leia isso!
5+// http://www.functionx.com/bcb/controls/richedit.htm
56 uses ExtActns;
67
78 type
8- TRichEditAlignFullyJustified = class(TRichEditAction)
9+ TRichEditAlignJustified = class(TRichEditAction)
910 private
10- procedure SetFullyJustifiedAlignment(Target: TObject);
11- function GetFullyJustifiedAlignment(Target: TObject): Boolean;
11+ //: Executa o código necessário para a efetivação da ação de justificação de
12+ //: texto no TRichEdit
13+ procedure Justify(ATarget: TObject);
14+ //: Atualiza as propriedades Checked e Enabled do TAction atual de forma que
15+ //: elas reflitam o estado atual da justificação de texto no TRichEdit
16+ procedure UpdateActionState(ATarget: TObject);
1217 public
13- procedure ExecuteTarget(Target: TObject); override;
14- procedure UpdateTarget(Target: TObject); override;
18+ procedure ExecuteTarget(ATarget: TObject); override;
19+ procedure UpdateTarget(ATarget: TObject); override;
1520 end;
1621
22+ // Os métodos CanRedo e Redo, deveriam ser implementados diretamente em
23+ // TRichEdit (sem o parâmetro ATarget). Eu poderia criar um interposer para
24+ // simplificar a codificação de TRichEditRedo abaixo, mas isso faria com que o
25+ // usuário final precisasse lidar com a colocação da unit com a interposer no
26+ // local correto da cláusula uses, e isso não seria bom
27+
28+ TRichEditRedo = class(TRichEditAction)
29+ private
30+ function CanRedo(ATarget: TObject): Boolean;
31+ procedure Redo(ATarget: TObject);
32+ public
33+ procedure ExecuteTarget(ATarget: TObject); override;
34+ procedure UpdateTarget(ATarget: TObject); override;
35+ end;
36+
37+const
38+ TO_ADVANCEDTYPOGRAPHY = $1;
39+
1740 implementation
1841
1942 uses RichEdit
@@ -20,57 +43,96 @@
2043 , Windows
2144 , ComCtrls;
2245
23-procedure InitParaFormat2(var aParaFormat2: TParaFormat2);
24-begin
25- ZeroMemory(@aParaFormat2, SizeOf(TParaFormat2));
26- aParaFormat2.cbSize := SizeOf(TParaFormat2);
27-end;
28-
2946 { TRichEditAlignFullyJustified }
3047
31-function TRichEditAlignFullyJustified.GetFullyJustifiedAlignment(Target: TObject): Boolean;
48+procedure TRichEditAlignJustified.UpdateActionState(ATarget: TObject);
3249 var
3350 Paragraph: TParaFormat2;
3451 begin
35- InitParaFormat2(Paragraph);
52+ // Se for um TCustomRichEdit, já deixa habilitada a ação de justificação de
53+ // texto
54+ Enabled := ATarget is TCustomRichEdit;
55+ Checked := False;
3656
37- if TCustomRichEdit(Target).HandleAllocated then
38- SendMessage(TCustomRichEdit(Target).Handle, EM_GETPARAFORMAT, 0, LPARAM(@Paragraph));
57+ if Enabled then
58+ begin
59+ ZeroMemory(@Paragraph, SizeOf(TParaFormat2));
60+ Paragraph.cbSize := SizeOf(TParaFormat2);
3961
40- Result := Paragraph.wAlignment = $4;
62+ if TCustomRichEdit(ATarget).HandleAllocated then
63+ SendMessage(TCustomRichEdit(ATarget).Handle, EM_GETPARAFORMAT, 0, LPARAM(@Paragraph));
64+
65+ // Caso o alinhamento do TRichEdit seja justificado, configura a ação como
66+ // checked, de forma que controles associados a ela apareçam destacados
67+ // (marcados, checados, etc)
68+ Checked := Paragraph.wAlignment = PFA_JUSTIFY;
69+ end;
4170 end;
4271
43-procedure TRichEditAlignFullyJustified.SetFullyJustifiedAlignment(Target: TObject);
72+// Para que o alinhamento justificado seja efetivo, precisamos habilitar a
73+// tipografia avançada. Caso você implemente alguma ação que não funcione,
74+// pode ser necessário aplicar a tipografia avançada. Isso parece só
75+// precisar ser feito apenas uma vez. Use o comando abaixo para ativar a
76+// tipografia avançada
77+// SendMessage(RichEdit.Handle, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY);
78+procedure TRichEditAlignJustified.Justify(ATarget: TObject);
4479 var
4580 Paragraph: TParaFormat2;
4681 begin
47- InitParaFormat2(Paragraph);
82+ Checked := False;
4883
49- with Paragraph do
84+ if ATarget is TCustomRichEdit then
5085 begin
51- dwMask := PFM_ALIGNMENT;
52- wAlignment := $4; { Justificado }
86+ ZeroMemory(@Paragraph, SizeOf(TParaFormat2));
87+ Paragraph.cbSize := SizeOf(TParaFormat2);
88+ Paragraph.dwMask := PFM_ALIGNMENT;
89+ Paragraph.wAlignment := PFA_JUSTIFY;
90+
91+ TCustomRichEdit(ATarget).HandleNeeded; { we REALLY need the handle for BiDi }
92+
93+ if TCustomRichEdit(ATarget).HandleAllocated then
94+ Checked := SendMessage(TCustomRichEdit(ATarget).Handle, EM_SETPARAFORMAT, 0, LPARAM(@Paragraph)) <> 0;
5395 end;
96+end;
5497
55- TCustomRichEdit(Target).HandleNeeded; { we REALLY need the handle for BiDi }
98+procedure TRichEditAlignJustified.ExecuteTarget(ATarget: TObject);
99+begin
100+ inherited;
101+ Justify(ATarget);
102+end;
56103
57- if TCustomRichEdit(Target).HandleAllocated then
58- SendMessage(TCustomRichEdit(Target).Handle, EM_SETPARAFORMAT, 0, LPARAM(@Paragraph));
104+procedure TRichEditAlignJustified.UpdateTarget(ATarget: TObject);
105+begin
106+ inherited;
107+ UpdateActionState(ATarget);
59108 end;
60109
61-procedure TRichEditAlignFullyJustified.ExecuteTarget(Target: TObject);
110+{ TRichEditRedo }
111+
112+function TRichEditRedo.CanRedo(ATarget: TObject): Boolean;
62113 begin
114+ Result := False;
115+
116+ if (ATarget is TCustomRichEdit) and TCustomRichEdit(ATarget).HandleAllocated then
117+ Result := SendMessage(TCustomRichEdit(ATarget).Handle, EM_CANREDO, 0, 0) <> 0;
118+end;
119+
120+procedure TRichEditRedo.ExecuteTarget(ATarget: TObject);
121+begin
63122 inherited;
64- if Target is TCustomRichEdit then
65- SetFullyJustifiedAlignment(Target);
66- Checked := True;
123+ Redo(ATarget);
67124 end;
68125
69-procedure TRichEditAlignFullyJustified.UpdateTarget(Target: TObject);
126+procedure TRichEditRedo.Redo(ATarget: TObject);
70127 begin
128+ if ATarget is TCustomRichEdit then
129+ SendMessage(TCustomRichEdit(ATarget).Handle, EM_REDO, 0, 0);
130+end;
131+
132+procedure TRichEditRedo.UpdateTarget(ATarget: TObject);
133+begin
71134 inherited;
72- Enabled := Target is TCustomRichEdit;
73- Checked := Enabled and GetFullyJustifiedAlignment(Target);
135+ Enabled := CanRedo(ATarget) and not TCustomRichEdit(ATarget).ReadOnly;
74136 end;
75137
76138 end.
--- trunk/utl/Package Manager/prj/PackageManager.dproj (revision 535)
+++ trunk/utl/Package Manager/prj/PackageManager.dproj (revision 536)
@@ -85,7 +85,7 @@
8585 <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
8686 <VerInfo_Locale>1033</VerInfo_Locale>
8787 <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
88- <Debugger_RunParams>-l&quot;C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\rtl260.bpl&quot;</Debugger_RunParams>
88+ <Debugger_RunParams>-l&quot;C:\Program Files (x86)\Embarcadero\Studio\20.0\bin&quot;</Debugger_RunParams>
8989 <Icon_MainIcon>..\res\PackageManager.ico</Icon_MainIcon>
9090 </PropertyGroup>
9191 <ItemGroup>
--- trunk/utl/TESTADOR/src/UDAMOPrincipal.pas (revision 535)
+++ trunk/utl/TESTADOR/src/UDAMOPrincipal.pas (revision 536)
@@ -4,7 +4,8 @@
44
55 uses
66 SysUtils, Classes, Menus, ActnPopup, XPStyleActnCtrls,
7- Dialogs;
7+ Dialogs, System.ImageList, Vcl.ImgList, Vcl.Controls, System.Actions,
8+ Vcl.ActnList, Vcl.StdActns, Vcl.ExtActns, KRK.Vcl.ExtActns;
89
910 type
1011 TDAMOPrincipal = class(TDataModule)
--- trunk/KRAKATOA.D26++.groupproj (revision 535)
+++ trunk/KRAKATOA.D26++.groupproj (revision 536)
@@ -48,6 +48,9 @@
4848 <Projects Include="utl\TESTADOR\prj\Testador.dproj">
4949 <Dependencies/>
5050 </Projects>
51+ <Projects Include="D:\OneDrive\Desktop\RichEdit\richedit.dproj">
52+ <Dependencies/>
53+ </Projects>
5154 </ItemGroup>
5255 <ProjectExtensions>
5356 <Borland.Personality>Default.Personality.12</Borland.Personality>
@@ -191,14 +194,23 @@
191194 <Target Name="Testador:Make">
192195 <MSBuild Projects="utl\TESTADOR\prj\Testador.dproj" Targets="Make"/>
193196 </Target>
197+ <Target Name="richedit">
198+ <MSBuild Projects="D:\OneDrive\Desktop\RichEdit\richedit.dproj"/>
199+ </Target>
200+ <Target Name="richedit:Clean">
201+ <MSBuild Projects="D:\OneDrive\Desktop\RichEdit\richedit.dproj" Targets="Clean"/>
202+ </Target>
203+ <Target Name="richedit:Make">
204+ <MSBuild Projects="D:\OneDrive\Desktop\RichEdit\richedit.dproj" Targets="Make"/>
205+ </Target>
194206 <Target Name="Build">
195- <CallTarget Targets="KRKLib;KRKStandardControlsD;KRKAdditionalControlsD;KRKExtendedActionsD;KRKDataControlsD;KRKNetworkControlsD;KRKShellControlsD;KRKWin32ControlsD;KRKToolsApiComponentsD;KRKCustomModulesD;KRKExpertsD;KRKExperts;PackageManager;CryptTableMaker;Testador"/>
207+ <CallTarget Targets="KRKLib;KRKStandardControlsD;KRKAdditionalControlsD;KRKExtendedActionsD;KRKDataControlsD;KRKNetworkControlsD;KRKShellControlsD;KRKWin32ControlsD;KRKToolsApiComponentsD;KRKCustomModulesD;KRKExpertsD;KRKExperts;PackageManager;CryptTableMaker;Testador;richedit"/>
196208 </Target>
197209 <Target Name="Clean">
198- <CallTarget Targets="KRKLib:Clean;KRKStandardControlsD:Clean;KRKAdditionalControlsD:Clean;KRKExtendedActionsD:Clean;KRKDataControlsD:Clean;KRKNetworkControlsD:Clean;KRKShellControlsD:Clean;KRKWin32ControlsD:Clean;KRKToolsApiComponentsD:Clean;KRKCustomModulesD:Clean;KRKExpertsD:Clean;KRKExperts:Clean;PackageManager:Clean;CryptTableMaker:Clean;Testador:Clean"/>
210+ <CallTarget Targets="KRKLib:Clean;KRKStandardControlsD:Clean;KRKAdditionalControlsD:Clean;KRKExtendedActionsD:Clean;KRKDataControlsD:Clean;KRKNetworkControlsD:Clean;KRKShellControlsD:Clean;KRKWin32ControlsD:Clean;KRKToolsApiComponentsD:Clean;KRKCustomModulesD:Clean;KRKExpertsD:Clean;KRKExperts:Clean;PackageManager:Clean;CryptTableMaker:Clean;Testador:Clean;richedit:Clean"/>
199211 </Target>
200212 <Target Name="Make">
201- <CallTarget Targets="KRKLib:Make;KRKStandardControlsD:Make;KRKAdditionalControlsD:Make;KRKExtendedActionsD:Make;KRKDataControlsD:Make;KRKNetworkControlsD:Make;KRKShellControlsD:Make;KRKWin32ControlsD:Make;KRKToolsApiComponentsD:Make;KRKCustomModulesD:Make;KRKExpertsD:Make;KRKExperts:Make;PackageManager:Make;CryptTableMaker:Make;Testador:Make"/>
213+ <CallTarget Targets="KRKLib:Make;KRKStandardControlsD:Make;KRKAdditionalControlsD:Make;KRKExtendedActionsD:Make;KRKDataControlsD:Make;KRKNetworkControlsD:Make;KRKShellControlsD:Make;KRKWin32ControlsD:Make;KRKToolsApiComponentsD:Make;KRKCustomModulesD:Make;KRKExpertsD:Make;KRKExperts:Make;PackageManager:Make;CryptTableMaker:Make;Testador:Make;richedit:Make"/>
202214 </Target>
203215 <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/>
204216 </Project>
Show on old repository browser