NO HAY CÓDIGO FUENTE git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TRichView@1 b34d35ef-135b-4489-b9d1-9916e9c25524
816 lines
27 KiB
ObjectPascal
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.
|