Componentes.Terceros.TRichView/12.0.4/Demos/DelphiUnicode/Editors/Notes/Unit1.pas
david fddb8c1dff Importación inicial con versión 12.0.4
NO HAY CÓDIGO FUENTE

git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TRichView@1 b34d35ef-135b-4489-b9d1-9916e9c25524
2010-01-11 12:26:42 +00:00

816 lines
27 KiB
ObjectPascal

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls, ExtCtrls, Menus,
RVStyle, RVScroll, RichView, RVEdit, RVFuncs, RVNote, PtblRV, RVItem, RVTable;
{==============================================================================}
{ RichEditor Demo with footnotes, endnotes and print preview.
See "Notes" main menu.
{==============================================================================}
type
TDemoFileFormat = (dffRVF, dffRTF);
TForm1 = class(TForm)
Panel1: TPanel;
StatusBar1: TStatusBar;
rvs: TRVStyle;
cmbFont: TComboBox;
btnBold: TSpeedButton;
btnItalic: TSpeedButton;
btnUnderline: TSpeedButton;
btnFont: TSpeedButton;
btnLeft: TSpeedButton;
btnCenter: TSpeedButton;
btnRight: TSpeedButton;
btnJustify: TSpeedButton;
btnOpen: TSpeedButton;
btnSave: TSpeedButton;
btnSaveAs: TSpeedButton;
btnNew: TSpeedButton;
cmbFontSize: TComboBox;
Label2: TLabel;
Label3: TLabel;
MainMenu1: TMainMenu;
File1: TMenuItem;
mitOpen: TMenuItem;
mitSave: TMenuItem;
mitNew: TMenuItem;
mitSaveAs: TMenuItem;
N1: TMenuItem;
mitExit: TMenuItem;
Edit1: TMenuItem;
mitUndo: TMenuItem;
mitRedo: TMenuItem;
N2: TMenuItem;
mitCut: TMenuItem;
mitCopy: TMenuItem;
mitPaste: TMenuItem;
mitDelete: TMenuItem;
od: TOpenDialog;
sd: TSaveDialog;
fd: TFontDialog;
btnIdentInc: TSpeedButton;
btnIdentDec: TSpeedButton;
btnFontColor: TSpeedButton;
btnFontBackColor: TSpeedButton;
SpeedButton1: TSpeedButton;
cd: TColorDialog;
Panel2: TPanel;
rveMain: TRichViewEdit;
Splitter1: TSplitter;
rveNote: TRichViewEdit;
Endnotes1: TMenuItem;
mitInsertEndnote: TMenuItem;
N3: TMenuItem;
mitInsertNoteReference: TMenuItem;
RVPrint1: TRVPrint;
N4: TMenuItem;
mitPreview: TMenuItem;
mitInsertFootnote: TMenuItem;
procedure mitNewClick(Sender: TObject);
procedure mitOpenClick(Sender: TObject);
procedure mitSaveClick(Sender: TObject);
procedure mitSaveAsClick(Sender: TObject);
procedure mitExitClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure rveChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure rveCurTextStyleChanged(Sender: TObject);
procedure rveCurParaStyleChanged(Sender: TObject);
procedure cmbFontClick(Sender: TObject);
procedure rveStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
procedure mitUndoClick(Sender: TObject);
procedure mitRedoClick(Sender: TObject);
procedure mitCutClick(Sender: TObject);
procedure mitCopyClick(Sender: TObject);
procedure mitPasteClick(Sender: TObject);
procedure mitDeleteClick(Sender: TObject);
procedure mitFontClick(Sender: TObject);
procedure btnApplyParaClick(Sender: TObject);
procedure cmbFontSizeClick(Sender: TObject);
procedure cmbFontSizeKeyPress(Sender: TObject; var Key: Char);
procedure cmbFontSizeExit(Sender: TObject);
procedure FontStyleButtonClick(Sender: TObject);
procedure rveParaStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
procedure btnIdentDecClick(Sender: TObject);
procedure btnIdentIncClick(Sender: TObject);
procedure btnFontColorClick(Sender: TObject);
procedure btnFontBackColorClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure rveNoteEnter(Sender: TObject);
procedure mitInsertEndnoteClick(Sender: TObject);
procedure rveMainCaretMove(Sender: TObject);
procedure rveMainEnter(Sender: TObject);
procedure rveNoteExit(Sender: TObject);
procedure mitInsertNoteReferenceClick(Sender: TObject);
procedure mitPreviewClick(Sender: TObject);
procedure mitInsertFootnoteClick(Sender: TObject);
private
{ Private declarations }
FileName, FontName: String;
FileFormat: TDemoFileFormat;
IgnoreChanges: Boolean;
FontSize: Integer;
ActiveEditor: TCustomRichViewEdit;
FActiveNoteItem: TCustomRVNoteItemInfo;
function SaveIfNeeded: Boolean;
function Save: Boolean;
function SaveAs: Boolean;
procedure Open;
procedure New;
function GetAlignmentFromUI: TRVAlignment;
procedure SetAlignmentToUI(Alignment: TRVAlignment);
procedure DisableNote(Init: Boolean=False);
procedure EditNote(NoteItem: TCustomRVNoteItemInfo);
procedure UpdateNote;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses PreviewFrm;
// Parameters for ApplyStyleConversion
const
TEXT_BOLD = 1;
TEXT_ITALIC = 2;
TEXT_UNDERLINE = 3;
TEXT_APPLYFONTNAME = 4;
TEXT_APPLYFONT = 5;
TEXT_APPLYFONTSIZE = 6;
TEXT_COLOR = 7;
TEXT_BACKCOLOR = 8;
// Parameters for ApplyParaStyleConversion
PARA_ALIGNMENT = 1;
PARA_INDENTINC = 2;
PARA_INDENTDEC = 3;
PARA_COLOR = 4;
{$R *.DFM}
{------------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Filling font names combobox
cmbFont.Items.Assign(Screen.Fonts);
ActiveEditor := rveMain;
New;
end;
{------------------------------------------------------------------------------}
{ Document in rveMain or rveNote was changed }
procedure TForm1.rveChange(Sender: TObject);
begin
StatusBar1.SimpleText := 'Modified';
end;
{------------------------------------------------------------------------------}
{ Current text style in rveMain or rveNote was changed }
procedure TForm1.rveCurTextStyleChanged(Sender: TObject);
var fi: TFontInfo;
rve: TCustomRichViewEdit;
begin
rve := TCustomRichViewEdit(Sender).GetRootEditor;
if rve<>ActiveEditor then
exit;
IgnoreChanges := True;
// Changing selection in comboboxes with font names and sizes:
fi := rvs.TextStyles[rve.CurTextStyleNo];
cmbFont.ItemIndex := cmbFont.Items.IndexOf(fi.FontName);
cmbFontSize.Text := IntToStr(fi.Size);
// Checking font buttons
btnBold.Down := fsBold in fi.Style;
btnItalic.Down := fsItalic in fi.Style;
btnUnderline.Down := fsUnderline in fi.Style;
IgnoreChanges := False;
end;
{------------------------------------------------------------------------------}
{ Current paragraph style in rveMain or rveNote was changed }
procedure TForm1.rveCurParaStyleChanged(Sender: TObject);
var rve: TCustomRichViewEdit;
begin
rve := TCustomRichViewEdit(Sender).GetRootEditor;
if rve<>ActiveEditor then
exit;
SetAlignmentToUI(rvs.ParaStyles[rve.CurParaStyleNo].Alignment);
end;
{------------------------------------------------------------------------------}
{ Returns paragraph alignment selected in the toolbar }
function TForm1.GetAlignmentFromUI: TRVAlignment;
begin
if btnLeft.Down then
Result := rvaLeft
else if btnRight.Down then
Result := rvaRight
else if btnCenter.Down then
Result := rvaCenter
else
Result := rvaJustify;
end;
{------------------------------------------------------------------------------}
{ Sets Alignment to the toolbar }
procedure TForm1.SetAlignmentToUI(Alignment: TRVAlignment);
begin
case Alignment of
rvaLeft:
btnLeft.Down := True;
rvaCenter:
btnCenter.Down := True;
rvaRight:
btnRight.Down := True;
rvaJustify:
btnJustify.Down := True;
end;
end;
{------------------------------------------------------------------------------}
{ Applying font name to ActiveEditor }
procedure TForm1.cmbFontClick(Sender: TObject);
begin
if (cmbFont.ItemIndex<>-1) then begin
if not IgnoreChanges then begin
FontName := cmbFont.Items[cmbFont.ItemIndex];
ActiveEditor.ApplyStyleConversion(TEXT_APPLYFONTNAME);
end;
end;
if Visible then
ActiveEditor.SetFocus;
end;
{------------------------------------------------------------------------------}
{ Applying font size to ActiveEditor }
procedure TForm1.cmbFontSizeClick(Sender: TObject);
begin
if (cmbFontSize.Text<>'') and not IgnoreChanges then begin
FontSize := StrToIntDef(cmbFontSize.Text, 10);
ActiveEditor.ApplyStyleConversion(TEXT_APPLYFONTSIZE);
end;
if Visible then
ActiveEditor.SetFocus;
end;
{------------------------------------------------------------------------------}
{ Applying bold/italic/underline to ActiveEditor }
procedure TForm1.FontStyleButtonClick(Sender: TObject);
var Button: TSpeedButton;
begin
Button := Sender as TSpeedButton;
// constants TEXT_BOLD, TEXT_ITALIC and TEXT_UNDERLINE are
// assigned to the tags of corresponding buttons
ActiveEditor.ApplyStyleConversion(Button.Tag);
end;
{------------------------------------------------------------------------------}
{ Applying font to ActiveEditor }
procedure TForm1.mitFontClick(Sender: TObject);
begin
fd.Font.Assign(rvs.TextStyles[ActiveEditor.CurTextStyleNo]);
if fd.Execute then begin
ActiveEditor.ApplyStyleConversion(TEXT_APPLYFONT);
end;
end;
{------------------------------------------------------------------------------}
{ Applying text color to ActiveEditor }
procedure TForm1.btnFontColorClick(Sender: TObject);
begin
cd.Color := rvs.TextStyles[ActiveEditor.CurTextStyleNo].Color;
if cd.Execute then
ActiveEditor.ApplyStyleConversion(TEXT_COLOR);
end;
{------------------------------------------------------------------------------}
{ Applying text background color to ActiveEditor }
procedure TForm1.btnFontBackColorClick(Sender: TObject);
begin
case Application.MessageBox('Make the selected text background transparent?'#13+
'(YES - make transparent; NO - choose color)',
'Text Background', MB_YESNOCANCEL or MB_ICONQUESTION) of
IDYES:
cd.Color := clNone;
IDNO:
begin
cd.Color := rvs.TextStyles[ActiveEditor.CurTextStyleNo].BackColor;
if cd.Color=clNone then
cd.Color := clWhite;
if not cd.Execute then
exit;
end;
IDCANCEL:
exit;
end;
ActiveEditor.ApplyStyleConversion(TEXT_BACKCOLOR);
end;
{------------------------------------------------------------------------------}
{ Applying paragraph background color to ActiveEditor }
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
case Application.MessageBox('Make the selected paragraph background transparent?'#13+
'(YES - make transparent; NO - choose color)',
'Text Background', MB_YESNOCANCEL or MB_ICONQUESTION) of
IDYES:
cd.Color := clNone;
IDNO:
begin
cd.Color := rvs.ParaStyles[ActiveEditor.CurParaStyleNo].Background.Color;
if cd.Color=clNone then
cd.Color := clWhite;
if not cd.Execute then
exit;
end;
IDCANCEL:
exit;
end;
ActiveEditor.ApplyParaStyleConversion(PARA_COLOR);
end;
{------------------------------------------------------------------------------}
{ Applying paragraph alignment to ActiveEditor }
procedure TForm1.btnApplyParaClick(Sender: TObject);
begin
ActiveEditor.ApplyParaStyleConversion(PARA_ALIGNMENT);
end;
{------------------------------------------------------------------------------}
{ changing left indents in ActiveEditor }
procedure TForm1.btnIdentDecClick(Sender: TObject);
begin
ActiveEditor.ApplyParaStyleConversion(PARA_INDENTDEC);
end;
procedure TForm1.btnIdentIncClick(Sender: TObject);
begin
ActiveEditor.ApplyParaStyleConversion(PARA_INDENTINC);
end;
{------------------------------------------------------------------------------}
{ rveMain's & rveNote's OnStyleConversion }
procedure TForm1.rveStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
var FontInfo: TFontInfo;
begin
FontInfo := TFontInfo.Create(nil);
try
FontInfo.Assign(rvs.TextStyles[StyleNo]);
case UserData of
TEXT_BOLD:
if btnBold.Down then
FontInfo.Style := FontInfo.Style+[fsBold]
else
FontInfo.Style := FontInfo.Style-[fsBold];
TEXT_ITALIC:
if btnItalic.Down then
FontInfo.Style := FontInfo.Style+[fsItalic]
else
FontInfo.Style := FontInfo.Style-[fsItalic];
TEXT_UNDERLINE:
if btnUnderline.Down then
FontInfo.Style := FontInfo.Style+[fsUnderline]
else
FontInfo.Style := FontInfo.Style-[fsUnderline];
TEXT_APPLYFONTNAME:
FontInfo.FontName := FontName;
TEXT_APPLYFONTSIZE:
FontInfo.Size := FontSize;
TEXT_APPLYFONT:
FontInfo.Assign(fd.Font);
TEXT_COLOR:
FontInfo.Color := cd.Color;
TEXT_BACKCOLOR:
FontInfo.BackColor := cd.Color;
// add your code here....
end;
NewStyleNo := rvs.TextStyles.FindSuchStyle(StyleNo,FontInfo,RVAllFontInfoProperties);
if NewStyleNo=-1 then begin
rvs.TextStyles.Add;
NewStyleNo := rvs.TextStyles.Count-1;
rvs.TextStyles[NewStyleNo].Assign(FontInfo);
rvs.TextStyles[NewStyleNo].Standard := False;
end;
finally
FontInfo.Free;
end;
end;
{------------------------------------------------------------------------------}
{ rveMain's & rveNote's OnParaStyleConversion }
procedure TForm1.rveParaStyleConversion(Sender: TCustomRichViewEdit;
StyleNo, UserData: Integer; AppliedToText: Boolean;
var NewStyleNo: Integer);
var ParaInfo: TParaInfo;
begin
ParaInfo := TParaInfo.Create(nil);
try
ParaInfo.Assign(rvs.ParaStyles[StyleNo]);
case UserData of
PARA_ALIGNMENT:
ParaInfo.Alignment := GetAlignmentFromUI;
PARA_INDENTINC:
begin
ParaInfo.LeftIndent := ParaInfo.LeftIndent+20;
if ParaInfo.LeftIndent>200 then
ParaInfo.LeftIndent := 200;
end;
PARA_INDENTDEC:
begin
ParaInfo.LeftIndent := ParaInfo.LeftIndent-20;
if ParaInfo.LeftIndent<0 then
ParaInfo.LeftIndent := 0;
end;
PARA_COLOR:
ParaInfo.Background.Color := cd.Color;
// add your code here....
end;
NewStyleNo := rvs.ParaStyles.FindSuchStyle(StyleNo,ParaInfo,RVAllParaInfoProperties);
if NewStyleNo=-1 then begin
rvs.ParaStyles.Add;
NewStyleNo := rvs.ParaStyles.Count-1;
rvs.ParaStyles[NewStyleNo].Assign(ParaInfo);
rvs.ParaStyles[NewStyleNo].Standard := False;
end;
finally
ParaInfo.Free;
end;
end;
{------------------------------------------------------------------------------}
{ cmbFontSize combobox: Enter key triggers OnClick }
procedure TForm1.cmbFontSizeKeyPress(Sender: TObject; var Key: Char);
begin
if ord(Key)=VK_RETURN then begin
Key := #0;
cmbFontSizeClick(nil);
end;
end;
{------------------------------------------------------------------------------}
{ cmbFontSize combobox: moving focus from it triggers OnClick }
procedure TForm1.cmbFontSizeExit(Sender: TObject);
begin
cmbFontSizeClick(nil);
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Undo }
procedure TForm1.mitUndoClick(Sender: TObject);
begin
ActiveEditor.Undo;
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Redo }
procedure TForm1.mitRedoClick(Sender: TObject);
begin
ActiveEditor.Redo;
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Cut }
procedure TForm1.mitCutClick(Sender: TObject);
begin
ActiveEditor.CutDef;
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Copy }
procedure TForm1.mitCopyClick(Sender: TObject);
begin
ActiveEditor.CopyDef;
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Paste }
procedure TForm1.mitPasteClick(Sender: TObject);
begin
ActiveEditor.Paste;
end;
{------------------------------------------------------------------------------}
{ Menu Edit | Delete }
procedure TForm1.mitDeleteClick(Sender: TObject);
begin
ActiveEditor.DeleteSelection;
end;
{------------------------------------------------------------------------------}
{ Saves note text (if it was edited) in the main document, then asks user
to save the document.
Returns True if:
- the user answers "No", or
- the user answers "Yes" and the document was saved.
Returns False if:
- the user answers "Cancel", or
- the user answers "Yes" and the document was not saved. }
function TForm1.SaveIfNeeded: Boolean;
begin
Result := True;
UpdateNote;
if rveMain.Modified then
case Application.MessageBox('Save file now?','File was modified',
MB_ICONQUESTION or MB_YESNOCANCEL) of
IDYES:
Result := Save;
IDNO:
Result := True;
IDCANCEL:
Result := False;
end;
end;
{------------------------------------------------------------------------------}
{ Saves the document. If this is a new document, calls SaveAs.
Returns True on successful saving }
function TForm1.Save: Boolean;
begin
if FileName='' then
Result := SaveAs
else begin
UpdateNote;
Result := False;
case FileFormat of
dffRVF:
Result := rveMain.SaveRVF(FileName, False);
dffRTF:
Result := rveMain.SaveRTF(FileName, False);
end;
if Result then begin
rveMain.Modified := False;
StatusBar1.SimpleText := '';
end
else begin
Application.MessageBox('Cannot save file','Error', MB_OK or MB_ICONSTOP);
Result := SaveAs;
end;
end;
end;
{------------------------------------------------------------------------------}
{ Displays save dialog and calls Save to save document.
Returns True on successful saving }
function TForm1.SaveAs: Boolean;
begin
sd.FileName := FileName;
sd.FilterIndex := ord(FileFormat)+1;
if sd.Execute then begin
FileName := sd.FileName;
FileFormat := TDemoFileFormat(sd.FilterIndex-1);
Result := Save;
if Result then
Caption := ExtractFileName(FileName) + '- RDemo';
end
else
Result := False;
end;
{------------------------------------------------------------------------------}
{ Asks to save the existing document.
Opens document from file }
procedure TForm1.Open;
var r: Boolean;
begin
if not SaveIfNeeded then exit;
rveMain.Modified := False;
New;
if od.Execute then begin
r := False;
DisableNote;
rveMain.Clear;
rveMain.DeleteUnusedStyles(True, True, True);
FileName := od.FileName;
case od.FilterIndex of
1:
begin
r := rveMain.LoadRVF(FileName);
FileFormat := dffRVF;
end;
2:
begin
r := rveMain.LoadRTF(FileName);
FileFormat := dffRTF;
end;
end;
rveMain.Format;
rveCurTextStyleChanged(ActiveEditor);
rveCurParaStyleChanged(ActiveEditor);
DisableNote(True);
StatusBar1.SimpleText := '';
Caption := ExtractFileName(FileName) + '- RDemo';
if not r then
Application.MessageBox('Error while opening or reading file','Error',
MB_OK or MB_ICONSTOP);
end;
end;
{------------------------------------------------------------------------------}
{ Asks to save the existing document. Creates a new document }
procedure TForm1.New;
begin
if not SaveIfNeeded then exit;
FileName := '';
FileFormat := dffRVF;
StatusBar1.SimpleText := '';
Caption := 'Unnamed - RDemo';
DisableNote(True);
rveMain.LeftMargin := 5;
rveMain.RightMargin := 5;
rveMain.TopMargin := 5;
rveMain.BottomMargin := 5;
rveMain.BackgroundBitmap := nil;
rveMain.BackgroundStyle := bsNoBitmap;
rveMain.Clear;
rveMain.DeleteUnusedStyles(True, True, True);
rveMain.Format;
rveCurTextStyleChanged(ActiveEditor);
rveCurParaStyleChanged(ActiveEditor);
end;
{------------------------------------------------------------------------------}
{ Menu File | New }
procedure TForm1.mitNewClick(Sender: TObject);
begin
New;
end;
{------------------------------------------------------------------------------}
{ Menu File | Open }
procedure TForm1.mitOpenClick(Sender: TObject);
begin
Open;
end;
{------------------------------------------------------------------------------}
{ Menu File | Save }
procedure TForm1.mitSaveClick(Sender: TObject);
begin
Save;
end;
{------------------------------------------------------------------------------}
{ Menu File | Save As }
procedure TForm1.mitSaveAsClick(Sender: TObject);
begin
SaveAs;
end;
{------------------------------------------------------------------------------}
{ Menu File | Print Preview }
procedure TForm1.mitPreviewClick(Sender: TObject);
var frm: TfrmPreview;
begin
UpdateNote;
RVPrint1.AssignSource(rveMain);
RVPrint1.FormatPages(rvdoALL);
frm := TfrmPreview.Create(Application);
try
frm.rvpp.RVPrint := RVPrint1;
frm.Button1Click(nil);
frm.ShowModal;
finally
frm.Free;
end;
RVPrint1.Clear;
end;
{------------------------------------------------------------------------------}
{ Menu File | Exit }
procedure TForm1.mitExitClick(Sender: TObject);
begin
Close;
end;
{------------------------------------------------------------------------------}
{ Form1.OnCloseQuery }
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := SaveIfNeeded;
end;
{------------------------------------------------------------------------------}
{ Occurs when input focus is set to rveMain }
procedure TForm1.rveMainEnter(Sender: TObject);
begin
ActiveEditor := rveMain;
rveCurTextStyleChanged(ActiveEditor);
rveCurParaStyleChanged(ActiveEditor);
mitInsertFootnote.Enabled := True;
mitInsertEndnote.Enabled := True;
mitInsertNoteReference.Enabled := False;
end;
{------------------------------------------------------------------------------}
{ Occurs when input focus is set to rveNote }
procedure TForm1.rveNoteEnter(Sender: TObject);
begin
ActiveEditor := rveNote;
rveCurTextStyleChanged(ActiveEditor);
rveCurParaStyleChanged(ActiveEditor);
mitInsertFootnote.Enabled := False;
mitInsertEndnote.Enabled := False;
mitInsertNoteReference.Enabled := True;
end;
{------------------------------------------------------------------------------}
{ Disables rveNote }
procedure TForm1.DisableNote(Init: Boolean);
begin
if Init or (FActiveNoteItem<>nil) then begin
FActiveNoteItem := nil;
rveNote.Enabled := False;
rveNote.Color := clBtnFace;
rveNote.Clear;
rveNote.AddNL('(footnote or endnote is not selected)', 0, 0);
rveNote.Format;
end;
end;
{------------------------------------------------------------------------------}
{ Starts editing NoteItem's Document in rveNote }
procedure TForm1.EditNote(NoteItem: TCustomRVNoteItemInfo);
var Stream: TMemoryStream;
begin
if FActiveNoteItem = NoteItem then
exit;
FActiveNoteItem := NoteItem;
rveNote.NoteText := NoteItem.Text; // this text is displayed in
// TRVNoteReferenceItemInfo items
rveNote.Enabled := True;
rveNote.Color := clWindow;
rveNote.Clear;
Stream := TMemoryStream.Create;
try
NoteItem.Document.SaveRVFToStream(Stream);
Stream.Position := 0;
rveNote.LoadRVFFromStream(Stream);
finally
Stream.Free;
end;
with rveNote do begin
Format;
SetSelectionBounds(ItemCount-1, GetOffsAfterItem(ItemCount-1),
ItemCount-1, GetOffsAfterItem(ItemCount-1));
end;
end;
{------------------------------------------------------------------------------}
{ Saves changes made in rveNote to FActiveNoteItem.Document. This operation
can be undone and redone by the user }
procedure TForm1.UpdateNote;
var Stream: TMemoryStream;
begin
if not rveNote.Modified then
exit;
Stream := TMemoryStream.Create;
try
rveNote.SaveRVFToStream(Stream, False);
FActiveNoteItem.ReplaceDocumentEd(Stream); // this is an editing operation
// in rveMain, can be undone by user
finally
Stream.Free;
end;
rveNote.Modified := False;
end;
{------------------------------------------------------------------------------}
{ Menu Notes | Insert Endnote.
This command is enabled only if ActiveEditor = rveMain.
This command inserts a new endnote in rveMain. In the endnote document, it
adds the note reference (TRVNoteReferenceItemInfo, displays endnote number)
and one space character. Because of rveMain.CaretMove, this endnote will be
immediately opened in rveNote.
Moving input focus to rveNote }
procedure TForm1.mitInsertEndnoteClick(Sender: TObject);
var EndNote: TRVEndnoteItemInfo;
NoteRef: TRVNoteReferenceItemInfo;
begin
EndNote := TRVEndnoteItemInfo.CreateEx(rveMain.RVData,
RVGetNoteTextStyleNo(rvs, rveMain.CurTextStyleNo), 1, False);
NoteRef := TRVNoteReferenceItemInfo.CreateEx(EndNote.Document, RVGetNoteTextStyleNo(rvs,0));
EndNote.Document.AddItem('', NoteRef);
EndNote.Document.AddNL(' ', 0, -1);
if rveMain.InsertItem('', EndNote) then
rveNote.SetFocus;
end;
{------------------------------------------------------------------------------}
{ Menu Notes | Insert Footnote. }
procedure TForm1.mitInsertFootnoteClick(Sender: TObject);
var FootNote: TRVFootnoteItemInfo;
NoteRef: TRVNoteReferenceItemInfo;
begin
FootNote := TRVFootnoteItemInfo.CreateEx(rveMain.RVData,
RVGetNoteTextStyleNo(rvs, rveMain.CurTextStyleNo), 1, False);
NoteRef := TRVNoteReferenceItemInfo.CreateEx(FootNote.Document, RVGetNoteTextStyleNo(rvs,0));
FootNote.Document.AddItem('', NoteRef);
FootNote.Document.AddNL(' ', 0, -1);
if rveMain.InsertItem('', FootNote) then
rveNote.SetFocus;
end;
{------------------------------------------------------------------------------}
{ Menu Notes | Insert Footnote/Endnote Number.
This command is enabled only if ActiveEditor = rveNote.
Inserts note reference (TRVNoteReferenceItemInfo, displays endnote number) in
rveNote.
This command is not really necessary, but may be useful if the user acidentally
deleted the initial reference }
procedure TForm1.mitInsertNoteReferenceClick(Sender: TObject);
var NoteRef: TRVNoteReferenceItemInfo;
begin
NoteRef := TRVNoteReferenceItemInfo.CreateEx(rveNote.RVData,
RVGetNoteTextStyleNo(rvs,rveNote.CurTextStyleNo));
rveNote.InsertItem('', NoteRef);
end;
{------------------------------------------------------------------------------}
{ rveMain.OnCaretMove. Updates rveNote }
procedure TForm1.rveMainCaretMove(Sender: TObject);
begin
if rveMain.GetCurrentItem is TCustomRVNoteItemInfo then
EditNote(rveMain.GetCurrentItem as TCustomRVNoteItemInfo)
else begin
UpdateNote;
DisableNote;
end;
end;
{------------------------------------------------------------------------------}
{ When moving input focus from rveNote, we update note document (if it was edited) }
procedure TForm1.rveNoteExit(Sender: TObject);
begin
UpdateNote;
end;
{------------------------------------------------------------------------------}
end.