Unit1.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:59k
源码类别:

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. {$I RV_Defs.inc}
  4. uses
  5.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  6.   RVStyle, RVScroll, RichView, RVEdit, PtblRV, RVMisc, CtrlImg, RVUndoStr, RVUni,
  7.   {$IFDEF RICHVIEWDEF3}
  8.   jpeg,
  9.   {$ENDIF}
  10.   {$IFDEF RICHVIEWDEF4}
  11.   ImgList,
  12.   {$ENDIF}
  13.   Clipbrd, StdCtrls, ExtCtrls, ComCtrls, Menus, OleCtnrs,
  14.   RVTable, Buttons, CRVData, CRVFData, RVERVData, RVItem, RVFuncs;
  15. type
  16.   TForm1 = class(TForm)
  17.     RichViewEdit1: TRichViewEdit;
  18.     StatusBar1: TStatusBar;
  19.     MainMenu1: TMainMenu;
  20.     mpdInsert: TMenuItem;
  21.     mitPicture: TMenuItem;
  22.     mpdComponent: TMenuItem;
  23.     mitButtonComp: TMenuItem;
  24.     mitEditBoxComp: TMenuItem;
  25.     mitBreak: TMenuItem;
  26.     OpenDialog1: TOpenDialog;
  27.     Panel1: TPanel;
  28.     cmbText: TComboBox;
  29.     cmbPara: TComboBox;
  30.     mpdFile: TMenuItem;
  31.     N1: TMenuItem;
  32.     mitExit: TMenuItem;
  33.     mpdBullet: TMenuItem;
  34.     mitHelpIcon: TMenuItem;
  35.     mitHelpSearchIcon: TMenuItem;
  36.     mitPropertiesIcon: TMenuItem;
  37.     mitSave: TMenuItem;
  38.     SaveDialog1: TSaveDialog;
  39.     N2: TMenuItem;
  40.     mitClear: TMenuItem;
  41.     mpdEdit: TMenuItem;
  42.     mitCopy: TMenuItem;
  43.     mitPaste: TMenuItem;
  44.     mitCut: TMenuItem;
  45.     mitDelete: TMenuItem;
  46.     PasteAs1: TMenuItem;
  47.     mitPasteAsText: TMenuItem;
  48.     mitPasteAsMetafile: TMenuItem;
  49.     mitPasteAsBitmap: TMenuItem;
  50.     mitPasteAsRVF: TMenuItem;
  51.     N3: TMenuItem;
  52.     mitEditCheckpoint: TMenuItem;
  53.     mitEditProps: TMenuItem;
  54.     PopupMenu1: TPopupMenu;
  55.     mitEditProp1: TMenuItem;
  56.     mitEditCheckpoint1: TMenuItem;
  57.     mpdHotspot: TMenuItem;
  58.     mitAddImageHS: TMenuItem;
  59.     mitAddTextHS: TMenuItem;
  60.     mitSelectAll: TMenuItem;
  61.     mpdMisc: TMenuItem;
  62.     N4: TMenuItem;
  63.     mitPrint: TMenuItem;
  64.     FindDialog1: TFindDialog;
  65.     N6: TMenuItem;
  66.     mitSearch: TMenuItem;
  67.     mitPasteAsOle: TMenuItem;
  68.     N8: TMenuItem;
  69.     mitPreview: TMenuItem;
  70.     mitSelectCurrentWord: TMenuItem;
  71.     RVPrint1: TRVPrint;
  72.     mpdBackground: TMenuItem;
  73.     mitBackNoBitmap: TMenuItem;
  74.     mitBackStretched: TMenuItem;
  75.     mitBackTiled: TMenuItem;
  76.     mitBackTiledandScrolled: TMenuItem;
  77.     mitBackCentered: TMenuItem;
  78.     N5: TMenuItem;
  79.     mitCheckpointList: TMenuItem;
  80.     N9: TMenuItem;
  81.     mitRemovePageBreak: TMenuItem;
  82.     mitInsertPageBreak: TMenuItem;
  83.     N10: TMenuItem;
  84.     mitUndo: TMenuItem;
  85.     mitRedo: TMenuItem;
  86.     mitInsertFile: TMenuItem;
  87.     mitPasteAsUnicodeText: TMenuItem;
  88.     mitLoad: TMenuItem;
  89.     mpdTable: TMenuItem;
  90.     mitInserttable1: TMenuItem;
  91.     mitInsertTable2: TMenuItem;
  92.     N7: TMenuItem;
  93.     mitMergeCells: TMenuItem;
  94.     N13: TMenuItem;
  95.     mitUmRows: TMenuItem;
  96.     mitUmCols: TMenuItem;
  97.     mitUmRowsandCols: TMenuItem;
  98.     Insert1: TMenuItem;
  99.     mitRowsAbove: TMenuItem;
  100.     mitRowsBelow: TMenuItem;
  101.     N14: TMenuItem;
  102.     mitColsLeft: TMenuItem;
  103.     mitColsRight: TMenuItem;
  104.     Delete1: TMenuItem;
  105.     mitDelRows: TMenuItem;
  106.     mitDelColumns: TMenuItem;
  107.     Unmerge1: TMenuItem;
  108.     Split1: TMenuItem;
  109.     mitSplitVertically: TMenuItem;
  110.     mitSplitHorizontally: TMenuItem;
  111.     mitInsertTable3: TMenuItem;
  112.     mitInsertTable4: TMenuItem;
  113.     psd: TPrinterSetupDialog;
  114.     mitPasteAsRTF: TMenuItem;
  115.     RVStyle1: TRVStyle;
  116.     N11: TMenuItem;
  117.     mitReadOnly: TMenuItem;
  118.     N12: TMenuItem;
  119.     mitOptions: TMenuItem;
  120.     mpdLists: TMenuItem;
  121.     mitApplyList: TMenuItem;
  122.     mitRemoveLists: TMenuItem;
  123.     il: TImageList;
  124.     mitBackTopLeft: TMenuItem;
  125.     mitBackTopRight: TMenuItem;
  126.     mitBackBottomLeft: TMenuItem;
  127.     mitBackBottomRight: TMenuItem;
  128.     procedure FormCreate(Sender: TObject);
  129.     procedure mitPictureClick(Sender: TObject);
  130.     procedure mitButtonCompClick(Sender: TObject);
  131.     procedure mitEditBoxCompClick(Sender: TObject);
  132.     procedure RichViewEdit1CurParaStyleChanged(Sender: TObject);
  133.     procedure RichViewEdit1CurTextStyleChanged(Sender: TObject);
  134.     procedure cmbParaClick(Sender: TObject);
  135.     procedure cmbTextClick(Sender: TObject);
  136.     procedure mitBreakClick(Sender: TObject);
  137.     procedure mitExitClick(Sender: TObject);
  138.     procedure mitInsertBulletClick(Sender: TObject);
  139.     procedure mitSaveClick(Sender: TObject);
  140.     procedure mitClearClick(Sender: TObject);
  141.     procedure mpdEditClick(Sender: TObject);
  142.     procedure RichViewEdit1Select(Sender: TObject);
  143.     procedure mitPasteAsBitmapClick(Sender: TObject);
  144.     procedure mitPasteAsMetafileClick(Sender: TObject);
  145.     procedure mitPasteAsTextClick(Sender: TObject);
  146.     procedure mitPasteClick(Sender: TObject);
  147.     procedure mitDeleteClick(Sender: TObject);
  148.     procedure mitCutClick(Sender: TObject);
  149.     procedure mitCopyClick(Sender: TObject);
  150.     procedure mitEditCheckpointClick(Sender: TObject);
  151.     procedure mitAddHSClick(Sender: TObject);
  152.     procedure mitSelectAllClick(Sender: TObject);
  153.     procedure mitEditPropsClick(Sender: TObject);
  154.     procedure mitPrintClick(Sender: TObject);
  155.     procedure RichViewEdit1RVFPictureNeeded(Sender: TCustomRichView; Name: String; Tag: Integer;
  156.       var gr: TGraphic);
  157.     procedure RichViewEdit1RVFControlNeeded(Sender: TCustomRichView; Name: String; Tag: Integer;
  158.       var ctrl: TControl);
  159.     procedure RichViewEdit1RVFImageListNeeded(Sender: TCustomRichView; ImageListTag: Integer;
  160.       var il: TCustomImageList);
  161.     procedure mitSearchClick(Sender: TObject);
  162.     procedure FindDialog1Find(Sender: TObject);
  163.     procedure mitCheckPointListClick(Sender: TObject);
  164.     procedure mitPasteAsRVFClick(Sender: TObject);
  165.     procedure mitPasteAsOleClick(Sender: TObject);
  166.     procedure PopupMenu1Popup(Sender: TObject);
  167.     procedure mitPreviewClick(Sender: TObject);
  168.     procedure mitBackClick(Sender: TObject);
  169.     procedure RichViewEdit1SaveComponentToFile(Sender: TCustomRichView;
  170.       Path: String; SaveMe: TPersistent; SaveFormat: TRVSaveFormat;
  171.       var OutStr: String);
  172.     procedure mitSelectCurrentWordClick(Sender: TObject);
  173.     procedure RichViewEdit1Jump(Sender: TObject; id: Integer);
  174.     procedure RichViewEdit1Change(Sender: TObject);
  175.     procedure mpdBackgroundClick(Sender: TObject);
  176.     procedure mitInsertPageBreakClick(Sender: TObject);
  177.     procedure mitRemovePageBreakClick(Sender: TObject);
  178.     procedure mitUndoClick(Sender: TObject);
  179.     procedure mitRedoClick(Sender: TObject);
  180.     procedure mitInsertFileClick(Sender: TObject);
  181.     procedure mitPasteAsUnicodeTextClick(Sender: TObject);
  182.     procedure mitLoadClick(Sender: TObject);
  183.     procedure mitInserttable1Click(Sender: TObject);
  184.     procedure mitInsertTable2Click(Sender: TObject);
  185.     procedure mitCellsOperationClick(Sender: TObject);
  186.     procedure mpdTableClick(Sender: TObject);
  187.     procedure mitInsertTable3Click(Sender: TObject);
  188.     procedure mitInsertTable4Click(Sender: TObject);
  189.     procedure RichViewEdit1RVMouseMove(Sender: TObject; id: Integer);
  190.     procedure mitPasteAsRTFClick(Sender: TObject);
  191.     procedure mitReadOnlyClick(Sender: TObject);
  192.     procedure mitOptionsClick(Sender: TObject);
  193.     procedure mitApplyListClick(Sender: TObject);
  194.     procedure mitRemoveListsClick(Sender: TObject);
  195.     procedure RichViewEdit1Click(Sender: TObject);
  196.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  197.     procedure RichViewEdit1ControlAction(Sender: TCustomRichView;
  198.       ControlAction: TRVControlAction; ItemNo: Integer;
  199.       var ctrl: TControl);
  200.     procedure RichViewEdit1WriteHyperlink(Sender: TCustomRichView;
  201.       id: Integer; RVData: TCustomRVData; ItemNo: Integer;
  202.       SaveFormat: TRVSaveFormat; var Target, Extras: string);
  203.   private
  204.     { Private declarations }
  205.     ActiveOleContainer: TOleContainer;
  206.     HTMLSaveOptions: TRVSaveOptions;
  207.     HTMLTitle: String;
  208.     procedure OnOleResize(Sender: TObject);
  209.     procedure OnOleActivate(Sender: TObject);
  210.     procedure OnOleDeactivate(Sender: TObject);
  211.     procedure OnControlClick(Sender: TObject);
  212.     procedure WMDisplayChange(var Message: TMessage{TWMDisplayChange}); message WM_DISPLAYCHANGE;
  213.     procedure UpdateUndoMenu;
  214.     procedure DisplayUnicodeWarning;
  215.     function GetUnicodeFontName: String;
  216.     function GetRVFErrors: String;
  217.     procedure FillStyleCombo(Styles: TCustomRVInfos; cmb: TComboBox);
  218.     procedure CloseOleContainer;
  219.   public
  220.     { Public declarations }
  221.   end;
  222. var
  223.   Form1: TForm1;
  224. implementation
  225. uses CPFrm, PropFrm, ListFrm, PreviewFrm, OptionsFrm;
  226. {$R *.DFM}
  227. { This demo uses conditional defines from RV_Defs.inc (see include
  228.   directive at the beginnning of this file)
  229.   RICHVIEWDEF3 is defined, if there is Delphi3 or later or C++Builder 3 or later
  230.   RICHVIEWDEF4 is defined, if there is Delphi4 or later
  231. }
  232. procedure TForm1.FormCreate(Sender: TObject);
  233. begin
  234.    Randomize;
  235.    HTMLSaveOptions := [rvsoImageSizes,rvsoUseCheckpointsNames];
  236.    HTMLTitle := 'Demo File';
  237.    RVStyle1.TextStyles[11].FontName := GetUnicodeFontName;
  238.    // This demo program is saved in Delphi 2, where Charset property is not available.
  239.    // So assigning non-default charset here:
  240.    {$IFDEF RICHVIEWCBDEF3} // For Delphi3+, C++Builder 3+
  241.    RVStyle1.TextStyles[6].Charset := SYMBOL_CHARSET;
  242.    RVStyle1.ListStyles[0].Levels[0].Font.Charset := SYMBOL_CHARSET;
  243.    {$ENDIF}
  244.    // Item can have associated "tags" - integers or strings.
  245.    // Comment next line to use integer tags
  246.    RichViewEdit1.Options := RichViewEdit1.Options+[rvoTagsArePChars];
  247.    // Loading the initial file.
  248.    RichViewEdit1.LoadRVF(ExtractFilePath(Application.ExeName)+'Readme.rvf');
  249.    FillStyleCombo(RVStyle1.ParaStyles, cmbPara);
  250.    FillStyleCombo(RVStyle1.TextStyles, cmbText);
  251.    RichViewEdit1.Format;
  252.    cmbPara.ItemIndex := RichViewEdit1.CurParaStyleNo;
  253.    cmbText.ItemIndex := RichViewEdit1.CurTextStyleNo;
  254.    UpdateUndoMenu;
  255. end;
  256. { Returning available Unicode-enabled font ---------------------------}
  257. function TForm1.GetUnicodeFontName: String;
  258. begin
  259.   if Screen.Fonts.IndexOf('Arial Unicode MS')>=0 then
  260.     Result := 'Arial Unicode MS'
  261.   else if Screen.Fonts.IndexOf('Lucida Sans Unicode')>=0 then
  262.     Result := 'Lucida Sans Unicode'
  263.   else
  264.     Result := 'Arial';
  265. end;
  266. { Filling combobox with standard styles ------------------------------}
  267. procedure TForm1.FillStyleCombo(Styles: TCustomRVInfos; cmb: TComboBox);
  268. var i: Integer;
  269. begin
  270.   { The simplest way to fill the combo box with style names is:
  271.     cmb.Items.Assign(Styles);
  272.     But this code will fill the combo box with all styles -
  273.     both standard styles (i.e. real styles) and non-standard styles will be
  274.     added in it.
  275.     So we'll fill in the combo box manually.
  276.     For simplification, we'll add only the first standard styles }
  277.   cmb.Items.BeginUpdate;
  278.   cmb.Items.Clear;
  279.   for i := 0 to Styles.Count-1 do begin
  280.     if not TCustomRVInfo(Styles.Items[i]).Standard then
  281.       break;
  282.     cmb.Items.Add(TCustomRVInfo(Styles.Items[i]).StyleName);
  283.   end;
  284.   cmb.Items.EndUpdate;
  285. end;
  286. {---------------------------------------------------------------------}
  287. procedure TForm1.UpdateUndoMenu;
  288. var UndoType : TRVUndoType;
  289. begin
  290.   UndoType := RichViewEdit1.UndoAction;
  291.   mitUndo.Enabled := UndoType<>rvutNone;
  292.   if UndoType=rvutCustom then
  293.     mitUndo.Caption := 'Undo '+RichViewEdit1.UndoName
  294.   else
  295.     mitUndo.Caption := 'Undo '+RVUndoTypeNamesEn[UndoType];
  296.   UndoType := RichViewEdit1.RedoAction;
  297.   mitRedo.Enabled := UndoType<>rvutNone;
  298.   if UndoType=rvutCustom then
  299.     mitRedo.Caption := 'Redo '+RichViewEdit1.RedoName
  300.   else
  301.     mitRedo.Caption := 'Redo '+RVUndoTypeNamesEn[UndoType];
  302. end;
  303. {---------------------------------------------------------------------}
  304. procedure TForm1.DisplayUnicodeWarning;
  305. var wasclear: Boolean;
  306. begin
  307.   wasclear := RichViewEdit1.ItemCount=0;
  308.   // This method is called before loading Unicode
  309.   // (when inserting Unicode, editor automatically switches to Unicode style,
  310.   // according to RVStyle1.DefUnicodeStyle, if necessary)
  311.   if not RVStyle1.TextStyles[RichViewEdit1.CurTextStyleNo].Unicode then
  312.     Application.MessageBox('Loading/Inserting Unicode data using non-Unicode text style.'#13+
  313.                            'Text will be converted.'#13+
  314.                            'Choose "Unicode" style in combo to use Unicode text style',
  315.                            'Warning', MB_OK or MB_ICONEXCLAMATION);
  316.   if wasclear then
  317.     RichViewEdit1.Clear;
  318. end;
  319. {======================================================================}
  320. { Font and paragraph combos                                            }
  321. {======================================================================}
  322. procedure TForm1.RichViewEdit1CurParaStyleChanged(Sender: TObject);
  323. begin
  324.   if RichViewEdit1.CurParaStyleNo<cmbPara.Items.Count then
  325.     cmbPara.ItemIndex := RichViewEdit1.CurParaStyleNo
  326.   else
  327.     cmbPara.ItemIndex := -1;
  328. end;
  329. {----------------------------------------------------------------------}
  330. procedure TForm1.RichViewEdit1CurTextStyleChanged(Sender: TObject);
  331. begin
  332.   if RichViewEdit1.CurTextStyleNo<cmbText.Items.Count then
  333.     cmbText.ItemIndex := RichViewEdit1.CurTextStyleNo
  334.   else
  335.     cmbText.ItemIndex := -1;
  336. end;
  337. {----------------------------------------------------------------------}
  338. procedure TForm1.cmbParaClick(Sender: TObject);
  339. begin
  340.    RichViewEdit1.ApplyParaStyle(cmbPara.ItemIndex);
  341.    RichViewEdit1.SetFocus;
  342. end;
  343. {----------------------------------------------------------------------}
  344. procedure TForm1.cmbTextClick(Sender: TObject);
  345. begin
  346.    RichViewEdit1.ApplyTextStyle(cmbText.ItemIndex);
  347.    RichViewEdit1.SetFocus;
  348. end;
  349. {======================================================================}
  350. { Main menu: "File"                                                    }
  351. {======================================================================}
  352. { File|Load... --------------------------------------------------------}
  353. procedure TForm1.mitLoadClick(Sender: TObject);
  354. var CurTextStyleNo, CurParaStyleNo: Integer;
  355.     r: Boolean;
  356.     ErrorMessage: String;
  357. begin
  358.   OpenDialog1.Title := 'Loading & Import';
  359.   OpenDialog1.Filter := 'RichView Format Files(*.rvf)|*.rvf|'+
  360.                         'RTF Files (*.rtf)|*.rtf|'+
  361.                         'Text Files - autodetect (*.txt)|*.txt|'+
  362.                         'ANSI Text Files (*.txt)|*.txt|'+
  363.                         'Unicode Text Files (*.txt)|*.txt';
  364.   if OpenDialog1.Execute then begin
  365.     Screen.Cursor := crHourglass;
  366.     CurTextStyleNo := RichViewEdit1.CurTextStyleNo;
  367.     CurParaStyleNo := RichViewEdit1.CurParaStyleNo;
  368.     CloseOleContainer;
  369.     RichViewEdit1.Clear;
  370.     RVStyle1.DefUnicodeStyle := -1;
  371.     RichViewEdit1.CurTextStyleNo := CurTextStyleNo;
  372.     RichViewEdit1.CurParaStyleNo := CurParaStyleNo;
  373.     case OpenDialog1.FilterIndex of
  374.       1: // RVF
  375.         r := RichViewEdit1.LoadRVF(OpenDialog1.FileName);
  376.       2: // RTF
  377.         r := RichViewEdit1.LoadRTF(OpenDialog1.FileName);
  378.       3: // Text
  379.         if RV_TestFileUnicode(OpenDialog1.FileName)=rvutYes then begin
  380.           DisplayUnicodeWarning;
  381.           r := RichViewEdit1.LoadTextW(OpenDialog1.FileName,CurTextStyleNo,CurParaStyleNo,False)
  382.           end
  383.         else
  384.           r := RichViewEdit1.LoadText(OpenDialog1.FileName,CurTextStyleNo,CurParaStyleNo,False);
  385.       4: // ANSI text
  386.         r := RichViewEdit1.LoadText(OpenDialog1.FileName,CurTextStyleNo,CurParaStyleNo,False);
  387.       5: // Unicode text
  388.         begin
  389.           DisplayUnicodeWarning;
  390.           r := RichViewEdit1.LoadTextW(OpenDialog1.FileName,CurTextStyleNo,CurParaStyleNo,False)
  391.         end;
  392.       else
  393.         r := False;
  394.     end;
  395.     Screen.Cursor := crDefault;
  396.     if not r then begin
  397.       ErrorMessage := 'Error during loading';
  398.       if OpenDialog1.FilterIndex=1 then
  399.         ErrorMessage := ErrorMessage + GetRVFErrors;
  400.       Application.MessageBox(PChar(ErrorMessage), 'Error', 0);
  401.     end;
  402.     FillStyleCombo(RVStyle1.ParaStyles, cmbPara);
  403.     FillStyleCombo(RVStyle1.TextStyles, cmbText);
  404.     RichViewEdit1.Format;
  405.     cmbPara.ItemIndex := RichViewEdit1.CurParaStyleNo;
  406.     cmbText.ItemIndex := RichViewEdit1.CurTextStyleNo;
  407.     UpdateUndoMenu;
  408.   end;
  409. end;
  410. { Event: picture needed while reading from RVF ------------------------}
  411. procedure TForm1.RichViewEdit1RVFPictureNeeded(Sender: TCustomRichView; Name: String;
  412.                                                Tag: Integer; var gr: TGraphic);
  413. begin
  414.   gr := TBitmap.Create;
  415.   gr.LoadFromFile(ExtractFilePath(Application.ExeName)+'default.bmp');
  416. end;
  417. { Event: control needed while reading from RVF ------------------------}
  418. procedure TForm1.RichViewEdit1RVFControlNeeded(Sender: TCustomRichView; Name: String;
  419.                                                Tag: Integer; var ctrl: TControl);
  420. begin
  421.   ctrl := TButton.Create(RichViewEdit1);
  422.   TButton(ctrl).Caption := 'from file';
  423. end;
  424. { Event: imagelist needed while reading from RVF ----------------------}
  425. procedure TForm1.RichViewEdit1RVFImageListNeeded(Sender: TCustomRichView;
  426.                                                  ImageListTag: Integer;
  427.                                                   var il: TCustomImageList);
  428. begin
  429.   il := Self.il;
  430. end;
  431. {---------------------------------------------------------------------}
  432. function TForm1.GetRVFErrors: String;
  433. begin
  434.   Result := '';
  435.   if rvfwUnknownPicFmt in RichViewEdit1.RVFWarnings then
  436.     Result := Result+'unknown picture format;';
  437.   if rvfwUnknownCtrls in RichViewEdit1.RVFWarnings then
  438.     Result := Result+'unknown control class;';
  439.   if rvfwConvUnknownStyles in RichViewEdit1.RVFWarnings then
  440.     Result := Result+'text, paragraph or list style is not present;';
  441.   if rvfwConvLargeImageIdx in RichViewEdit1.RVFWarnings then
  442.     Result := Result+'invalid image-list index;';
  443.   if Result<>'' then
  444.     Result := #13'('+Result+')';
  445. end;
  446. { File|Save... --------------------------------------------------------}
  447. procedure TForm1.mitSaveClick(Sender: TObject);
  448.   var r: Boolean;
  449. begin
  450.   SaveDialog1.Title := 'Save & Export';
  451.   SaveDialog1.Filter := 'RichView Format files(*.rvf)|*.rvf|'+
  452.                         'RTF Files (*.rtf)|*.rtf|'+
  453.                         'Text (*.txt)|*.txt|'+
  454.                         'Unicode Text (*.txt)|*.txt|'+
  455.                         'HTML - with CSS (*.htm;*.html)|*.htm;*.html|'+
  456.                         'HTML - Simplified (*.htm;*.html)|*.htm;*.html';
  457.   SaveDialog1.DefaultExt := 'rvf';
  458.   if SaveDialog1.Execute then begin
  459.     Screen.Cursor := crHourglass;
  460.     case SaveDialog1.FilterIndex of
  461.       1: // RVF
  462.         r := RichViewEdit1.SaveRVF(SaveDialog1.FileName, False);
  463.       2: // RTF
  464.         r := RichViewEdit1.SaveRTF(SaveDialog1.FileName, False);
  465.       3: // ANSI Text (byte per character)
  466.         r := RichViewEdit1.SaveText(SaveDialog1.FileName, 80);
  467.       4: // Unicode Text (2 bytes per character)
  468.         r := RichViewEdit1.SaveTextW(SaveDialog1.FileName, 80);
  469.       5: // HTML with CSS
  470.         r := RichViewEdit1.SaveHTMLEx(SaveDialog1.FileName, HTMLTitle,'img', '',
  471.           '', '', HTMLSaveOptions);
  472.       6: // HTML
  473.         r := RichViewEdit1.SaveHTML(SaveDialog1.FileName, HTMLTitle,'img',
  474.           HTMLSaveOptions);
  475.       else
  476.         r := False;
  477.     end;
  478.     Screen.Cursor := crDefault;
  479.     if not r then
  480.       Application.MessageBox('Error during saving', 'Error', 0);
  481.   end;
  482. end;
  483. { File|Options... --------------------------------------------------------}
  484. procedure TForm1.mitOptionsClick(Sender: TObject);
  485. var RVFOptions : TRVFOptions;
  486. begin
  487.   frmOptions.SetOptions(RichViewEdit1.RVFOptions, HTMLSaveOptions, HTMLTitle);
  488.   if frmOptions.ShowModal=mrOk then begin
  489.     frmOptions.GetOptions(RVFOptions, HTMLSaveOptions, HTMLTitle);
  490.     RichViewEdit1.RVFOptions := RVFOptions;
  491.   end;
  492. end;
  493. { Event: saving controls in HTML --------------------------------------}
  494. // Note: code below works normally in Internet Explorer
  495. // Netscape 3 and 4 does not support <INPUT> tags outside <FORM></FORM> tags
  496. // (Netscape 6 does)
  497. procedure TForm1.RichViewEdit1SaveComponentToFile(Sender: TCustomRichView;
  498.   Path: String; SaveMe: TPersistent; SaveFormat: TRVSaveFormat;
  499.   var OutStr: String);
  500. begin
  501.   case SaveFormat of
  502.    rvsfText:
  503.       begin
  504.         OutStr := '('+SaveMe.ClassName+')';
  505.       end;
  506.    rvsfHTML:
  507.        begin
  508.          if SaveMe is TButton then begin
  509.            OutStr := '<INPUT type="button" value="'+TButton(SaveMe).Caption+'" '+
  510.                      'onClick="alert(''Just a demo'')">';
  511.            exit;
  512.          end;
  513.          if SaveMe is TEdit then begin
  514.            OutStr := '<INPUT type="text" value="'+TEdit(SaveMe).Text+'">';
  515.            exit;
  516.          end;
  517.        end;
  518.    rvsfRTF:
  519.       begin
  520.         OutStr := 'plainb ('+SaveMe.ClassName+')';
  521.       end;
  522.    end;
  523. end;
  524. { Event: saving URLs in HTML and RTF  ---------------------------------}
  525. procedure TForm1.RichViewEdit1WriteHyperlink(Sender: TCustomRichView;
  526.   id: Integer; RVData: TCustomRVData; ItemNo: Integer;
  527.   SaveFormat: TRVSaveFormat; var Target, Extras: string);
  528. begin
  529.   if not (rvoTagsArePChars in Sender.Options) then
  530.     exit;
  531.   Target := PChar(RVData.GetItemTag(ItemNo));
  532. end;
  533. { File|Clear ----------------------------------------------------------}
  534. procedure TForm1.mitClearClick(Sender: TObject);
  535. begin
  536.    CloseOleContainer;
  537.    RichViewEdit1.Clear;
  538.    RichViewEdit1.Format;
  539.    cmbPara.ItemIndex := RichViewEdit1.CurParaStyleNo;
  540.    cmbText.ItemIndex := RichViewEdit1.CurTextStyleNo;
  541.    UpdateUndoMenu;
  542. end;
  543. { File|Print Preview --------------------------------------------------}
  544. procedure TForm1.mitPreviewClick(Sender: TObject);
  545. begin
  546.   RVPrint1.AssignSource(RichViewEdit1);
  547.   RVPrint1.FormatPages(rvdoALL);
  548.   if RVPrint1.PagesCount>0 then begin
  549.     frmPreview.rvpp.RVPrint := RVPrint1;
  550.     frmPreview.Button1Click(nil); //  Show First Page
  551.     frmPreview.ShowModal;
  552.   end;
  553. end;
  554. { File|Print on Default Printer ---------------------------------------}
  555. procedure TForm1.mitPrintClick(Sender: TObject);
  556. var PrintIt: Boolean;
  557. begin
  558.   {$IFDEF RICHVIEWDEF3}
  559.   PrintIt := psd.Execute;
  560.   {$ELSE}
  561.   PrintIt := True;
  562.   {$ENDIF}
  563.   if PrintIt then begin
  564.     RVPrint1.AssignSource(RichViewEdit1);
  565.     RVPrint1.FormatPages(rvdoALL);
  566.     if RVPrint1.PagesCount>0 then
  567.       RVPrint1.Print('RichView Edit Demo',1,False);
  568.   end;
  569. end;
  570. { File|Exit -----------------------------------------------------------}
  571. procedure TForm1.mitExitClick(Sender: TObject);
  572. begin
  573.   Close;
  574. end;
  575. {======================================================================}
  576. { Main menu: "Insert"                                                  }
  577. {======================================================================}
  578. { Insert|File... ------------------------------------------------------}
  579. procedure TForm1.mitInsertFileClick(Sender: TObject);
  580. var r: Boolean;
  581. begin
  582.   OpenDialog1.Title := 'Inserting File';
  583.   OpenDialog1.Filter := 'RichView Format Files(*.rvf)|*.rvf|'+
  584.                         'RTF Files(*.rtf)|*.rtf|'+
  585.                         'Text Files - autodetect (*.txt)|*.txt|'+
  586.                         'ANSI Text Files (*.txt)|*.txt|'+
  587.                         'Unicode Text Files (*.txt)|*.txt|'+
  588.                         'OEM Text Files (*.txt)|*.txt';
  589.   if OpenDialog1.Execute then begin
  590.     Screen.Cursor := crHourglass;
  591.     case OpenDialog1.FilterIndex of
  592.       1: // RVF
  593.         r := RichViewEdit1.InsertRVFFromFileEd(OpenDialog1.FileName);
  594.       2: // RTF
  595.         r := RichViewEdit1.InsertRTFFromFileEd(OpenDialog1.FileName);
  596.       3: // Text
  597.         begin
  598.           if RV_TestFileUnicode(OpenDialog1.FileName)=rvutYes then
  599.             r := RichViewEdit1.InsertTextFromFileW(OpenDialog1.FileName)
  600.           else
  601.             r := RichViewEdit1.InsertTextFromFile(OpenDialog1.FileName);
  602.         end;
  603.       4: // ANSI Text
  604.         r := RichViewEdit1.InsertTextFromFile(OpenDialog1.FileName);
  605.       5: // Unicode Text
  606.         r := RichViewEdit1.InsertTextFromFileW(OpenDialog1.FileName);
  607.       6: // OEM Text
  608.         r := RichViewEdit1.InsertOEMTextFromFile(OpenDialog1.FileName);
  609.       else
  610.         r := False;
  611.     end;
  612.     Screen.Cursor := crDefault;
  613.     if not r then
  614.       Application.MessageBox('Error reading file', 'Error',
  615.                              MB_OK or MB_ICONSTOP);
  616.   end;
  617. end;
  618. { Insert|Picture... ---------------------------------------------------}
  619. procedure TForm1.mitPictureClick(Sender: TObject);
  620. var gr: TGraphic;
  621.     pic: TPicture;
  622. begin
  623.   OpenDialog1.Title := 'Inserting Image';
  624.   {$IFDEF RICHVIEWDEF3}
  625.   OpenDialog1.Filter := 'Graphics(*.bmp;*.wmf;*.emf;*.ico;*.jpg)|*.bmp;*.wmf;*.emf;*.ico;*.jpg|All(*.*)|*.*';
  626.   {$ELSE}
  627.   OpenDialog1.Filter := 'Graphics(*.bmp;*.wmf;*.emf;*.ico)|*.bmp;*.wmf;*.emf;*.ico|All(*.*)|*.*';
  628.   {$ENDIF}
  629.   if OpenDialog1.Execute then
  630.     try
  631.       pic := TPicture.Create;
  632.       try
  633.         pic.LoadFromFile(OpenDialog1.FileName);
  634.         gr := RV_CreateGraphics(TGraphicClass(pic.Graphic.ClassType));
  635.         gr.Assign(pic.Graphic);
  636.       finally
  637.         pic.Free;
  638.       end;
  639.       if gr<>nil then
  640.         RichViewEdit1.InsertPicture('',gr,rvvaBaseLine);
  641.     except
  642.       Application.MessageBox(PChar('Cannot read picture from file '+OpenDialog1.FileName), 'Error',
  643.         MB_OK or MB_ICONSTOP);
  644.     end;
  645. end;
  646. { Event: clicking inserted control ------------------------------------}
  647. procedure TForm1.OnControlClick(Sender: TObject);
  648. begin
  649.   RichViewEdit1.SelectControl(TControl(Sender));
  650. end;
  651. { Insert|Component|Button ---------------------------------------------}
  652. procedure TForm1.mitButtonCompClick(Sender: TObject);
  653. var btn: TButton;
  654. const Captions: array[0..9] of String =
  655.        (
  656.        'Help','Exit','Cancel','Ok','Close','Run','Options...','Minimize',
  657.        'Hide','Show'
  658.        );
  659. begin
  660.   btn := TButton.Create(Self);
  661.   btn.Caption := Captions[Random(10)];
  662.   btn.OnClick := OnControlClick;
  663.   RichViewEdit1.InsertControl('',btn,rvvaBaseline);
  664.   if RichViewEdit1.CurItemStyle=rvsComponent then
  665.     RichViewEdit1.SetCurrentItemExtraIntProperty(rvepResizable, 1, True);
  666. end;
  667. { Insert|Component|Edit Box -------------------------------------------}
  668. procedure TForm1.mitEditBoxCompClick(Sender: TObject);
  669. var edt: TEdit;
  670. const Captions: array[0..9] of String =
  671.        (
  672.        '0','Hello','1','$0','2x2=4','enter text here','x<y','to be or not to be?',
  673.        '(empty)','(full)'
  674.        );
  675. begin
  676.   edt := TEdit.Create(Self);
  677.   edt.Text := Captions[Random(10)];
  678.   edt.OnClick := OnControlClick;
  679.   RichViewEdit1.InsertControl('',edt,rvvaBaseline);
  680.   if RichViewEdit1.CurItemStyle=rvsComponent then
  681.     RichViewEdit1.SetCurrentItemExtraIntProperty(rvepResizable, 1, True);
  682. end;
  683. { Insert|Bullet|"XXX" -------------------------------------------------}
  684. procedure TForm1.mitInsertBulletClick(Sender: TObject);
  685. begin
  686.   RichViewEdit1.InsertBullet(TMenuItem(Sender).Tag, il);
  687. end;
  688. { Insert|Hot Spot|"XXX" -----------------------------------------------}
  689. procedure TForm1.mitAddHSClick(Sender: TObject);
  690. begin
  691.   RichViewEdit1.InsertHotSpot(TMenuItem(Sender).Tag, TMenuItem(Sender).Tag+2, il);
  692. end;
  693. { Insert|Break --------------------------------------------------------}
  694. procedure TForm1.mitBreakClick(Sender: TObject);
  695. begin
  696.    RichViewEdit1.InsertBreak(1, rvbsLine, clNone);
  697. end;
  698. {======================================================================}
  699. { Main menu : "Edit"                                                   }
  700. {======================================================================}
  701. { Edit ----------------------------------------------------------------}
  702. procedure TForm1.mpdEditClick(Sender: TObject);
  703. begin
  704.   mitPasteAsRTF.Enabled      := RichViewEdit1.CanPasteRTF;
  705.   mitPasteAsText.Enabled     := Clipboard.HasFormat(CF_TEXT);
  706.   mitPasteAsUnicodeText.Enabled := Clipboard.HasFormat(CF_UNICODETEXT);
  707.   mitPasteAsMetafile.Enabled := Clipboard.HasFormat(CF_METAFILEPICT);
  708.   mitPasteAsBitmap.Enabled   := Clipboard.HasFormat(CF_BITMAP);
  709.   mitPasteAsRVF.Enabled      := RichViewEdit1.CanPasteRVF;
  710.   mitPaste.Enabled           := RichViewEdit1.CanPaste;
  711.   mitInsertPageBreak.Enabled := (RichViewEdit1.InplaceEditor=nil);
  712.   mitRemovePageBreak.Enabled :=
  713.     (RichViewEdit1.InplaceEditor=nil) and
  714.     RichViewEdit1.PageBreaksBeforeItems[RichViewEdit1.CurItemNo];
  715.   // You can edit properties only for item with caret.
  716.   // We disable this item because otherwise user can think what he will
  717.   // edit properties of all selected items.
  718.   // More smart programs can determine if there is only one item is selected
  719.   // and do not disable this item in this case
  720.   mitEditProps.Enabled       := not RichViewEdit1.SelectionExists;
  721. end;
  722. { Edit|Undo------------------------------------------------------------}
  723. procedure TForm1.mitUndoClick(Sender: TObject);
  724. begin
  725.   RichViewEdit1.Undo;
  726. end;
  727. { Edit|Redo -----------------------------------------------------------}
  728. procedure TForm1.mitRedoClick(Sender: TObject);
  729. begin
  730.   RichViewEdit1.Redo;
  731. end;
  732. { Edit|Cut ------------------------------------------------------------}
  733. procedure TForm1.mitCutClick(Sender: TObject);
  734. begin
  735.   RichViewEdit1.CutDef;
  736. end;
  737. { Edit|Copy -----------------------------------------------------------}
  738. procedure TForm1.mitCopyClick(Sender: TObject);
  739. begin
  740.   RichViewEdit1.CopyDef;
  741. end;
  742. { Edit|Paste ----------------------------------------------------------}
  743. procedure TForm1.mitPasteClick(Sender: TObject);
  744. begin
  745.   RichViewEdit1.Paste;
  746. end;
  747. { Edit|Paste As|RTF ---------------------------------------------------}
  748. procedure TForm1.mitPasteAsRTFClick(Sender: TObject);
  749. begin
  750.   RichViewEdit1.PasteRTF;
  751. end;
  752. { Edit|Paste As|Text --------------------------------------------------}
  753. procedure TForm1.mitPasteAsTextClick(Sender: TObject);
  754. begin
  755.   RichViewEdit1.PasteText;
  756. end;
  757. { Edit|Paste As|Unicode Text ------------------------------------------}
  758. procedure TForm1.mitPasteAsUnicodeTextClick(Sender: TObject);
  759. begin
  760.   RichViewEdit1.PasteTextW;
  761. end;
  762. { Edit|Paste As|Bitmap ------------------------------------------------}
  763. procedure TForm1.mitPasteAsBitmapClick(Sender: TObject);
  764. begin
  765.   RichViewEdit1.PasteBitmap(False);
  766. end;
  767. { Edit|Paste As|Metafile ----------------------------------------------}
  768. procedure TForm1.mitPasteAsMetafileClick(Sender: TObject);
  769. begin
  770.   RichViewEdit1.PasteMetafile(False);
  771. end;
  772. { Edit|Paste As|RichView Format ---------------------------------------}
  773. procedure TForm1.mitPasteAsRVFClick(Sender: TObject);
  774. begin
  775.   RichViewEdit1.PasteRVF;
  776. end;
  777. { Edit|Paste As|Ole ---------------------------------------------------}
  778. procedure TForm1.mitPasteAsOleClick(Sender: TObject);
  779. var oc: TOleContainer;
  780. begin
  781.   oc := TOleContainer.Create(nil);
  782.   if oc.CanPaste then begin
  783.     oc.Visible := False;
  784.     oc.BorderStyle := bsNone;
  785.     oc.Parent := RichViewEdit1;
  786.     oc.SizeMode := smAutoSize;
  787.     oc.Paste;
  788.     RichViewEdit1.InsertControl('', oc,rvvaBaseline);
  789.     oc.OnResize := OnOleResize;
  790.     oc.OnActivate := OnOleActivate;
  791.     oc.OnDeactivate := OnOleDeactivate;
  792.     oc.Visible := True;
  793.     end
  794.   else
  795.     oc.Free;
  796. end;
  797. {-----------------------------------------------------------------------}
  798. procedure TForm1.CloseOleContainer;
  799. begin
  800.   if ActiveOleContainer<>nil then begin
  801.     ActiveOleContainer.Close;
  802.     ActiveOleContainer := nil;
  803.   end;
  804. end;
  805. {-----------------------------------------------------------------------}
  806. procedure TForm1.OnOleResize(Sender: TObject);
  807. begin
  808.   RichViewEdit1.AdjustControlPlacement2(TControl(Sender));
  809. end;
  810. {-----------------------------------------------------------------------}
  811. procedure TForm1.OnOleActivate(Sender: TObject);
  812. begin
  813.   if ActiveOleContainer<>Sender then
  814.     CloseOleContainer;
  815.   ActiveOleContainer := TOleContainer(Sender);
  816.   RichViewEdit1.AdjustControlPlacement2(TControl(Sender));
  817. end;
  818. {-----------------------------------------------------------------------}
  819. procedure TForm1.OnOleDeactivate(Sender: TObject);
  820. begin
  821.   RichViewEdit1.AdjustControlPlacement2(TControl(Sender));
  822. end;
  823. {-----------------------------------------------------------------------}
  824. procedure TForm1.RichViewEdit1Click(Sender: TObject);
  825. begin
  826.   CloseOleContainer;
  827. end;
  828. {-----------------------------------------------------------------------}
  829. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  830. begin
  831.   CloseOleContainer;
  832. end;
  833. {-----------------------------------------------------------------------}
  834. procedure TForm1.RichViewEdit1ControlAction(Sender: TCustomRichView;
  835.   ControlAction: TRVControlAction; ItemNo: Integer; var ctrl: TControl);
  836. begin
  837.   if ControlAction=rvcaAfterRVFLoad then begin
  838.     if ctrl is TOleContainer then begin
  839.       TOleContainer(ctrl).OnResize := OnOleResize;
  840.       TOleContainer(ctrl).OnActivate := OnOleActivate;
  841.       TOleContainer(ctrl).OnDeactivate := OnOleDeactivate;
  842.       end
  843.     else if ctrl is TButton then
  844.       TButton(ctrl).OnClick := OnControlClick
  845.     else if ctrl is TEdit then
  846.       TEdit(ctrl).OnClick := OnControlClick
  847.   end;
  848.   if ctrl<>ActiveOleContainer then
  849.     exit;
  850.   if ControlAction in [rvcaMoveToUndoList, rvcaDestroy, rvcaBeforeRVFSave] then
  851.     CloseOleContainer;
  852. end;
  853. { Edit|Delete ---------------------------------------------------------}
  854. procedure TForm1.mitDeleteClick(Sender: TObject);
  855. begin
  856.   // Shortcut to this item is Ctrl+Del
  857.   // If you make it Del, you will be unable to use del key in editor
  858.   RichViewEdit1.DeleteSelection;
  859. end;
  860. { Edit|Select All -----------------------------------------------------}
  861. procedure TForm1.mitSelectAllClick(Sender: TObject);
  862. begin
  863.   { warning: SelectAll moves caret to the end of the text }
  864.   RichViewEdit1.SelectAll;
  865.   RichViewEdit1.SetFocus;
  866.   RichViewEdit1.Invalidate;
  867. end;
  868. { Another clipboard-related action ------------------------------------}
  869. procedure TForm1.RichViewEdit1Select(Sender: TObject);
  870. begin
  871.   mitCopy.Enabled := RichViewEdit1.SelectionExists;
  872.   mitCut.Enabled := mitCopy.Enabled;
  873.   mitDelete.Enabled := mitCopy.Enabled;
  874. end;
  875. { Edit| Insert Page Break----------------------------------------------}
  876. procedure TForm1.mitInsertPageBreakClick(Sender: TObject);
  877. begin
  878.   RichViewEdit1.InsertPageBreak;
  879. end;
  880. { Edit| Remove Page Break----------------------------------------------}
  881. procedure TForm1.mitRemovePageBreakClick(Sender: TObject);
  882. begin
  883.   RichViewEdit1.RemoveCurrentPageBreak;
  884. end;
  885. {----------------------------------------------------------------------}
  886. { This demo understands both tag modes:
  887.   1. rvoTagsArePChars is in Options (tags are strings)
  888.   2. rvoTagsArePChars is not in Options (tags are integers).
  889.   So this demo uses two simple universal functions below for convering
  890.   tag to String and String to tag.
  891. }
  892. function GetTagStr(Tag: Integer): String;
  893. begin
  894.   if (rvoTagsArePChars in Form1.RichViewEdit1.Options) then
  895.     if Tag = 0 then
  896.       Result := ''
  897.     else
  898.       Result := PChar(Tag)
  899.   else
  900.     Result := IntToStr(Tag);
  901. end;
  902. function MakeTag(TagStr: String): Integer;
  903. begin
  904.    if (TagStr<>'') and (rvoTagsArePChars in Form1.RichViewEdit1.Options) then
  905.      Result := Integer(StrNew(PChar(TagStr)))
  906.    else
  907.      Result := StrToIntDef(TagStr,0);
  908. end;
  909. { Edit|Checkpoint... --------------------------------------------------}
  910. procedure TForm1.mitEditCheckpointClick(Sender: TObject);
  911. var CpNo, Tag: Integer;
  912.     Name: String;
  913.     CheckPointData: TCheckPointData;
  914.     RaiseEvent: Boolean;
  915. begin
  916.   CheckPointData := RichViewEdit1.GetCurrentCheckpoint;
  917.   if CheckPointData<>nil then begin
  918.     RichViewEdit1.GetCheckpointInfo(CheckPointData,Tag,Name,RaiseEvent);
  919.     CpNo := RichViewEdit1.GetCheckpointNo(CheckPointData);
  920.     frmCp.lblStatus.Caption := 'Editing checkpoint #'+IntToStr(CpNo);
  921.     frmCp.txtName.Text := Name;
  922.     frmCp.txtTag.Text := GetTagStr(Tag);
  923.     frmCp.btnOk.Caption := 'OK';
  924.     frmCp.btnDelete.Enabled := True;
  925.     end
  926.   else begin
  927.     frmCp.lblStatus.Caption := 'Checkpoint does not exist';
  928.     frmCp.txtName.Text := '';
  929.     frmCp.txtTag.Text := GetTagStr(0);
  930.     frmCp.btnOk.Caption := 'Add';
  931.     frmCp.btnDelete.Enabled := False;
  932.   end;
  933.   case frmCP.ShowModal of
  934.     mrOk: { add new checkpoint or modify existed one }
  935.       RichViewEdit1.SetCurrentCheckpointInfo(MakeTag(frmCp.txtTag.Text),
  936.                                              frmCp.txtName.Text,False);
  937.     mrYes: { delete checkpoint }
  938.       RichViewEdit1.RemoveCurrentCheckpoint;
  939.   end;
  940. end;
  941. { Edit|Search... -------------------------------------}
  942. procedure TForm1.mitSearchClick(Sender: TObject);
  943. begin
  944.   FindDialog1.Execute;
  945. end;
  946. {-----------------------------------------------------------------------}
  947. procedure TForm1.FindDialog1Find(Sender: TObject);
  948. begin
  949.   if not RichViewEdit1.SearchText(FindDialog1.FindText,
  950.                            GetRVESearchOptions(FindDialog1.Options)) then
  951.    Application.MessageBox('Can''t find', 'Search complete', MB_OK or MB_ICONEXCLAMATION);
  952. end;
  953. { Edit|Select Current Word -------------------------------------}
  954. procedure TForm1.mitSelectCurrentWordClick(Sender: TObject);
  955. begin
  956.   RichViewEdit1.SelectCurrentWord;
  957.   // now you can do something with current word:
  958.   // translate or spell check, for example...
  959. end;
  960. { Edit|Current Item Properties... -------------------------------------}
  961. procedure TForm1.mitEditPropsClick(Sender: TObject);
  962. var s: String;
  963.     Tag, Index: Integer;
  964.     VAlign: TRVVAlign;
  965.     ImageList: TCustomImageList;
  966.     gr: TGraphic;
  967.     ctrl: TControl;
  968.     BreakColor: TColor;
  969.     BreakStyle: TRVBreakStyle; // <- not implemented
  970.     BreakWidth: Byte;
  971. begin
  972.   frmProp.PageControl1.Visible := True;
  973.   frmProp.tsBullet.TabVisible := False;
  974.   frmProp.tsHotSpot.TabVisible := False;
  975.   frmProp.tsPicture.TabVisible := False;
  976.   frmProp.tsText.TabVisible := False;
  977.   frmProp.tsComponent.TabVisible := False;
  978.   frmProp.tsBreak.TabVisible := False;
  979.   frmProp.txtName.Enabled := True;
  980.   case RichViewEdit1.CurItemStyle of
  981.     rvsBullet:
  982.       begin
  983.         RichViewEdit1.GetCurrentBulletInfo(s, Index, ImageList, Tag);
  984.         frmProp.tsBullet.TabVisible := True;
  985.         frmProp.rgBullet.ItemIndex := Index;
  986.         frmProp.txtName.Text := s;
  987.         frmProp.txtTag.Text := GetTagStr(Tag);
  988.       end;
  989.     rvsHotspot:
  990.       begin
  991.         // you can use GetCurrentBulletInfo or GetCurrentHotspotInfo
  992.         // to receive info about hotspot in caret position.
  993.         // in this demo we need not HotImageIndex, because here
  994.         // HotImageIndex = ImageIndex+2
  995.         // and so we can use GetCurrentBulletInfo
  996.         RichViewEdit1.GetCurrentBulletInfo(s, Index, ImageList, Tag);
  997.         frmProp.tsHotspot.TabVisible := True;
  998.         frmProp.rgHotspot.ItemIndex := Index-3;
  999.         frmProp.txtName.Text := s;
  1000.         frmProp.txtTag.Text := GetTagStr(Tag);
  1001.       end;
  1002.     rvsPicture, rvsHotPicture:
  1003.       begin
  1004.         RichViewEdit1.GetCurrentPictureInfo(s, gr, VAlign, Tag);
  1005.         frmProp.tsPicture.TabVisible := True;
  1006.         frmProp.Image1.Picture.Graphic := gr;
  1007.         frmProp.txtName.Text := s;
  1008.         frmProp.txtTag.Text := GetTagStr(Tag);
  1009.         frmProp.rgPicVAlign.ItemIndex := Integer(VAlign);
  1010.       end;
  1011.     rvsComponent:
  1012.       begin
  1013.         RichViewEdit1.GetCurrentControlInfo(s, ctrl, VAlign, Tag);
  1014.         frmProp.tsComponent.TabVisible := True;
  1015.         frmProp.txtWidth.Text := IntToStr(ctrl.Width);
  1016.         frmProp.txtHeight.Text := IntToStr(ctrl.Height);
  1017.         frmProp.txtName.Text := s;
  1018.         frmProp.lblComponent.Caption := ctrl.ClassName;
  1019.         frmProp.txtTag.Text := GetTagStr(Tag);
  1020.         frmProp.rgCtrlVAlign.ItemIndex := Integer(VAlign);
  1021.       end;
  1022.     rvsBreak:
  1023.       begin
  1024.         frmProp.tsBreak.TabVisible := True;
  1025.         RichViewEdit1.GetCurrentBreakInfo(BreakWidth, BreakStyle, BreakColor, Tag);
  1026.         frmProp.txtBreakWidth.Text := IntToStr(BreakWidth);
  1027.         case BreakColor of
  1028.           clNone:
  1029.             frmProp.rgBreakColor.ItemIndex := 0;
  1030.           clRed:
  1031.             frmProp.rgBreakColor.ItemIndex := 1;
  1032.           clGreen:
  1033.             frmProp.rgBreakColor.ItemIndex := 2;
  1034.           clBlue:
  1035.             frmProp.rgBreakColor.ItemIndex := 3;
  1036.         end;
  1037.         frmProp.txtName.Text := '(not available for breaks)';
  1038.         frmProp.txtName.Enabled := False;
  1039.         frmProp.txtTag.Text := GetTagStr(Tag);
  1040.       end;
  1041.     rvsTable:
  1042.       begin
  1043.         frmProp.txtName.Text := RichViewEdit1.GetCurrentItemText;
  1044.         frmProp.txtTag.Text := GetTagStr(RichViewEdit1.GetCurrentTag);
  1045.         frmProp.PageControl1.Visible := False;
  1046.       end;
  1047.     else
  1048.       begin
  1049.         frmProp.lblText.Caption := RichViewEdit1.GetCurrentItemTextA;
  1050.         frmProp.txtTag.Text := GetTagStr(RichViewEdit1.GetCurrentTag);
  1051.         frmProp.tsText.TabVisible := True;
  1052.         frmProp.txtName.Text := '(not available for text)';
  1053.         frmProp.txtName.Enabled := False;
  1054.       end;
  1055.   end;
  1056.   if frmProp.ShowModal=mrOk then
  1057.   case RichViewEdit1.CurItemStyle of
  1058.     rvsBullet:
  1059.       begin
  1060.         RichViewEdit1.SetCurrentBulletInfo(
  1061.           frmProp.txtName.Text,
  1062.           frmProp.rgBullet.ItemIndex,
  1063.           nil,
  1064.           MakeTag(frmProp.txtTag.Text));
  1065.       end;
  1066.     rvsHotspot:
  1067.       begin
  1068.         RichViewEdit1.SetCurrentHotspotInfo(
  1069.           frmProp.txtName.Text,
  1070.           frmProp.rgHotspot.ItemIndex+3,
  1071.           frmProp.rgHotspot.ItemIndex+3+2,
  1072.           nil,
  1073.           MakeTag(frmProp.txtTag.Text));
  1074.       end;
  1075.     rvsPicture, rvsHotPicture:
  1076.       begin
  1077.         { first we need to create a copy of image ...}
  1078.         gr := TGraphic(frmProp.Image1.Picture.Graphic.ClassType.Create);
  1079.         gr.Assign(frmProp.Image1.Picture.Graphic);
  1080.         RichViewEdit1.SetCurrentPictureInfo(
  1081.           frmProp.txtName.Text,
  1082.           gr,
  1083.           TRVVAlign(frmProp.rgPicVAlign.ItemIndex),
  1084.           MakeTag(frmProp.txtTag.Text));
  1085.       end;
  1086.     rvsComponent:
  1087.       begin
  1088.         // we wish these setting to be undone as one action,
  1089.         // so we use BeginUndoGroup, SetUndoGroupMode(True), settings, SetUndoGroupMode(False)
  1090.         RichViewEdit1.BeginUndoGroup(rvutModifyItem);
  1091.         // you can use BeginUndoCustomGroup instead of BeginUndoGroup
  1092.         // example:
  1093.         // RichViewEdit1.BeginUndoCustomGroup('modifying control');
  1094.         // In this case undo type will be rvutCustom
  1095.         // (look at TForm1.UpdateUndoMenu in this file)
  1096.         RichViewEdit1.SetUndoGroupMode(True);
  1097.         RichViewEdit1.SetCurrentControlInfo(
  1098.           frmProp.txtName.Text,
  1099.           TRVVAlign(frmProp.rgCtrlVAlign.ItemIndex),
  1100.           MakeTag(frmProp.txtTag.Text));
  1101.         RichViewEdit1.ResizeCurrentControl(
  1102.           StrToIntDef(frmProp.txtWidth.Text, ctrl.Width),
  1103.           StrToIntDef(frmProp.txtHeight.Text, ctrl.Height));
  1104.         RichViewEdit1.SetUndoGroupMode(False);
  1105.       end;
  1106.     rvsBreak:
  1107.       begin
  1108.         case frmProp.rgBreakColor.ItemIndex of
  1109.           -1,0:
  1110.             BreakColor := clNone;
  1111.           1:
  1112.             BreakColor := clRed;
  1113.           2:
  1114.             BreakColor := clGreen;
  1115.           3:
  1116.             BreakColor := clBlue;
  1117.         end;
  1118.         BreakWidth := StrToIntDef(frmProp.txtBreakWidth.Text,1);
  1119.         RichViewEdit1.SetCurrentBreakInfo(BreakWidth,BreakStyle,BreakColor,
  1120.                                           MakeTag(frmProp.txtTag.Text));
  1121.       end;
  1122.     rvsTable:
  1123.       begin
  1124.         RichViewEdit1.BeginUndoGroup(rvutModifyItem);
  1125.         RichViewEdit1.SetUndoGroupMode(True);
  1126.         RichViewEdit1.SetCurrentItemText(frmProp.txtName.Text);
  1127.         RichViewEdit1.SetCurrentTag(MakeTag(frmProp.txtTag.Text));
  1128.         RichViewEdit1.SetUndoGroupMode(False);
  1129.       end;
  1130.     else
  1131.       begin
  1132.         RichViewEdit1.SetCurrentTag(MakeTag(frmProp.txtTag.Text));
  1133.       end;
  1134.   end;
  1135. end;
  1136. {======================================================================}
  1137. { Main menu : "Misc"                                                   }
  1138. {======================================================================}
  1139. { Misc | Go to checkpoint ... -----------------------------------------}
  1140. procedure TForm1.mitCheckPointListClick(Sender: TObject);
  1141. var X,Y,Tag: Integer;
  1142.     Name: String;
  1143.     CheckpointData: TCheckpointData;
  1144.     RaiseEvent: Boolean;
  1145.     s: String;
  1146. begin
  1147.   frmList.lst.Items.Clear;
  1148.   CheckpointData := RichViewEdit1.GetFirstCheckPoint;
  1149.   while CheckpointData<>nil do begin
  1150.     RichViewEdit1.GetCheckpointInfo(CheckpointData,Tag,Name,RaiseEvent);
  1151.     RichViewEdit1.GetCheckpointXY(CheckpointData,X,Y);
  1152.     s := Format('(X:%d,Y:%d) Name:"%s" Tag:"%s"', [X,Y,Name,GetTagStr(Tag)]);
  1153.     frmList.lst.Items.Add(s);
  1154.     CheckpointData := RichViewEdit1.GetNextCheckpoint(CheckpointData);
  1155.   end;
  1156.   if frmList.ShowModal=mrOk then
  1157.     with RichViewEdit1 do
  1158.       ScrollTo(GetCheckPointY(frmList.lst.ItemIndex));
  1159. end;
  1160. { Misc | Read-Only -----------------------------------------------------}
  1161. procedure TForm1.mitReadOnlyClick(Sender: TObject);
  1162. begin
  1163.   RichViewEdit1.ReadOnly := not RichViewEdit1.ReadOnly;
  1164.   mitReadOnly.Checked := RichViewEdit1.ReadOnly;
  1165. end;
  1166. { Misc | Background submenu popups ------------------------------------}
  1167. procedure TForm1.mpdBackgroundClick(Sender: TObject);
  1168. begin
  1169.   // Displaying RichViewEdit1.BackgroundStyle as checkmark in submenu...
  1170.   mitBackNoBitmap.Checked         := RichViewEdit1.BackgroundStyle=bsNoBitmap;
  1171.   mitBackStretched.Checked        := RichViewEdit1.BackgroundStyle=bsStretched;
  1172.   mitBackTiledAndScrolled.Checked := RichViewEdit1.BackgroundStyle=bsTiledAndScrolled;
  1173.   mitBackTiled.Checked            := RichViewEdit1.BackgroundStyle=bsTiled;
  1174.   mitBackCentered.Checked         := RichViewEdit1.BackgroundStyle=bsCentered;
  1175.   mitBackTopLeft.Checked          := RichViewEdit1.BackgroundStyle=bsTopLeft;
  1176.   mitBackTopRight.Checked         := RichViewEdit1.BackgroundStyle=bsTopRight;
  1177.   mitBackBottomLeft.Checked       := RichViewEdit1.BackgroundStyle=bsBottomLeft;
  1178.   mitBackBottomRight.Checked      := RichViewEdit1.BackgroundStyle=bsBottomRight;
  1179. end;
  1180. { Misc | Background options -------------------------------------------}
  1181. procedure TForm1.mitBackClick(Sender: TObject);
  1182. begin
  1183.   RichViewEdit1.BackgroundStyle := TBackgroundStyle(TMenuItem(Sender).Tag);
  1184. end;
  1185. {======================================================================}
  1186. { On Popup -------------------------------------------------------------}
  1187. procedure TForm1.PopupMenu1Popup(Sender: TObject);
  1188. begin
  1189.   mitEditProp1.Enabled := not RichViewEdit1.SelectionExists;
  1190. end;
  1191. {-----------------------------------------------------------------------}
  1192. {OnChange event handler.
  1193. {-----------------------------------------------------------------------}
  1194. procedure TForm1.RichViewEdit1Change(Sender: TObject);
  1195. begin
  1196.    UpdateUndoMenu;
  1197. end;
  1198. {-----------------------------------------------------------------------}
  1199. // You should manually update palette info when user changes color mode
  1200. // without restarting Windows
  1201. procedure TForm1.WMDisplayChange(var Message: TMessage{TWMDisplayChange});
  1202. begin
  1203.   RichViewEdit1.UpdatePaletteInfo;
  1204.   RVPrint1.UpdatePaletteInfo;
  1205. end;
  1206. {-----------------------------------------------------------------------}
  1207. { Event: OnJump (when user clicks hypertext item with pressed Ctrl key   }
  1208. procedure TForm1.RichViewEdit1Jump(Sender: TObject; id: Integer);
  1209. var RVData: TCustomRVFormattedData;
  1210.     ItemNo: Integer;
  1211.     s: String;
  1212. begin
  1213.   // NOTE: OnJump is called after the caret is repositioned to clicked item
  1214.   // But warning: a clicked event is not necessarily an active item
  1215.   // (when clicking on left part of picture or left part of first character in text item,
  1216.   // caret moves before item and previous item becomes active!)
  1217.   RichViewEdit1.GetJumpPointLocation(id, RVData, ItemNo);
  1218.   s := GetTagStr(RVData.GetItemTag(ItemNo));
  1219.   Application.MessageBox(PChar(Format('Tag of clicked hyperlink is "%s"', [s])),
  1220.     'Hyperlink', MB_OK or MB_ICONINFORMATION);
  1221. end;
  1222. {------------------------------------------------------------------------------}
  1223. { Event: OnRVMouseMove (when user moves mouse above hypertext item with pressed Ctrl key   }
  1224. procedure TForm1.RichViewEdit1RVMouseMove(Sender: TObject; id: Integer);
  1225. var RVData: TCustomRVFormattedData;
  1226.     ItemNo: Integer;
  1227.     s: String;
  1228. begin
  1229.   if id=-1 then begin
  1230.     StatusBar1.SimpleText := '';
  1231.     end
  1232.   else begin
  1233.     RichViewEdit1.GetJumpPointLocation(id, RVData, ItemNo);
  1234.     s := GetTagStr(RVData.GetItemTag(ItemNo));
  1235.     StatusBar1.SimpleText := Format('Tag of hyperlink is "%s"', [s]);
  1236.   end;
  1237. end;
  1238. {======================================================================}
  1239. { Main menu : "Lists"                                                  }
  1240. {======================================================================}
  1241. { Lists | Apply -------------------------------------------------------}
  1242. procedure TForm1.mitApplyListClick(Sender: TObject);
  1243. begin
  1244.   // See more demos about list styles in DemosDelphiAssortedListStyles
  1245.   if (RVStyle1.ListStyles.Count=0) or (RVStyle1.ListStyles[0].Levels.Count=0) then begin
  1246.     Application.MessageBox('Default list style is not defined', '', 0);
  1247.     exit;
  1248.   end;
  1249.   RichViewEdit1.ApplyListStyle(0, 0, 1, False, False);
  1250. end;
  1251. { Lists | Remove ------------------------------------------------------}
  1252. procedure TForm1.mitRemoveListsClick(Sender: TObject);
  1253. begin
  1254.   RichViewEdit1.RemoveLists(False);
  1255. end;
  1256. {======================================================================}
  1257. { Main menu : "Table"                                                  }
  1258. {======================================================================}
  1259. { Table | Insert Table Example 1 --------------------------------------}
  1260. procedure TForm1.mitInserttable1Click(Sender: TObject);
  1261. var table: TRVTableItemInfo;
  1262.     r,c: Integer;
  1263. begin
  1264.   table := TRVTableItemInfo.CreateEx(4,3, RichViewEdit1.RVData);
  1265.   table.BorderStyle := rvtbRaisedColor;
  1266.   table.CellBorderStyle := rvtbLoweredColor;
  1267.   table.BorderLightColor := $00FAF1C9;
  1268.   table.BorderColor := $00A98E10;
  1269.   table.CellBorderLightColor := $00FAF1C9;
  1270.   table.CellBorderColor := $00A98E10;
  1271.   table.Color := $00EAC724;
  1272.   table.BorderWidth := 5;
  1273.   table.CellBorderWidth := 2;
  1274.   table.CellPadding := 5;
  1275.   table.CellVSpacing := 1;
  1276.   table.CellHSpacing := 1;
  1277.   table.BorderVSpacing := 1;
  1278.   table.BorderHSpacing := 1;
  1279.   for r := 0 to table.Rows.Count-1 do
  1280.     for c := 0 to table.Rows[r].Count-1 do
  1281.       table.Cells[r,c].BestWidth := 100;
  1282.   table.MergeCells(0,0,3,1, False);
  1283.   table.MergeCells(1,0,1,3, False);
  1284.   with table.Cells[0,0] do begin
  1285.     Color := clInfoBk;
  1286.     Clear;
  1287.     AddBulletEx(  '',0,il,2);
  1288.     AddNL(' Example 1 ',1,-1);
  1289.     AddBulletEx(  '',0,il,-1);
  1290.     AddNL('All cells have 100 pixels width, width of table itself is calculated basing on width of cells.',0,0);
  1291.   end;
  1292.   if RichViewEdit1.InsertItem('', table) then begin
  1293.   end;
  1294. end;
  1295. { Table | Insert Table Example 2 --------------------------------------}
  1296. procedure TForm1.mitInsertTable2Click(Sender: TObject);
  1297. var table: TRVTableItemInfo;
  1298.     btn: TButton;
  1299. begin
  1300.   table := TRVTableItemInfo.CreateEx(10,6, RichViewEdit1.RVData);
  1301.   table.Color := clWhite;
  1302.   table.BorderStyle := rvtbRaisedColor;
  1303.   table.CellBorderStyle := rvtbLoweredColor;
  1304.   table.BorderLightColor := clWhite;
  1305.   table.BorderColor := clBlack;
  1306.   table.CellBorderLightColor := clWhite;
  1307.   table.CellBorderColor := clBlack;
  1308.   table.BorderWidth := 2;
  1309.   table.BorderVSpacing := 0;
  1310.   table.BorderHSpacing := 0;
  1311.   table.CellBorderWidth := 2;
  1312.   table.CellPadding := 3;
  1313.   table.CellVSpacing := 0;
  1314.   table.CellHSpacing := 0;
  1315.   table.Cells[0,0].BestWidth := -16;
  1316.   table.Cells[0,1].BestWidth := -16;
  1317.   table.Cells[0,2].BestWidth := -16;
  1318.   table.Cells[0,3].BestWidth := -16;
  1319.   table.Cells[0,4].BestWidth := -16;
  1320.   table.Cells[0,5].BestWidth := -16;
  1321. //  table.Rows.MergeCells(1,0,6,1);
  1322.   table.MergeCells(2,0,2,8, False);
  1323.   with table.Cells[2,0] do begin
  1324.     Clear;
  1325.     AddNL('Another example.',0,0);
  1326.     btn := TButton.Create(nil);
  1327.     btn.Caption := 'With button inside';
  1328.     btn.Width := 150;
  1329.     btn.OnClick := OnControlClick;
  1330.     AddControlEx('',btn,2,rvvaBaseline);
  1331.     SetItemExtraIntProperty(ItemCount-1, rvepResizable, 1);
  1332.     AddNL('Width of table = 90% of document width. Widths of cells = 16%',0,0);
  1333.   end;
  1334.   table.BestWidth := -90;
  1335.   if RichViewEdit1.InsertItem('', table) then begin
  1336.   end;
  1337. end;
  1338. { Table | Insert Table Example 3 --------------------------------------}
  1339. procedure TForm1.mitInsertTable3Click(Sender: TObject);
  1340. var table: TRVTableItemInfo;
  1341.     r,c: Integer;
  1342. begin
  1343.   table := TRVTableItemInfo.CreateEx(5,6, RichViewEdit1.RVData);
  1344.   table.Color := $00A5CCE7;
  1345.   table.BorderStyle := rvtbColor;
  1346.   table.CellBorderStyle := rvtbColor;
  1347.   table.BorderColor := $002E1234;
  1348.   table.CellBorderColor := $002E1234;
  1349.   table.BorderWidth := 2;
  1350.   table.BorderVSpacing := 2;
  1351.   table.BorderHSpacing := 2;
  1352.   table.CellBorderWidth := 1;
  1353.   table.CellPadding := 3;
  1354.   table.CellVSpacing := 0;
  1355.   table.CellHSpacing := 0;
  1356.   table.Options := table.Options + [rvtoHideGridLines];
  1357.   for c := 0 to table.Rows[0].Count-1 do
  1358.    table.Cells[0,c].Color := $00A5E1F8;
  1359.   for r := 1 to table.Rows.Count-1 do
  1360.    table.Cells[r,0].Color := $00A5E1F8;
  1361.   for r := 1 to table.Rows.Count-1 do
  1362.     for c := 1 to table.Rows[r].Count-1 do begin
  1363.       table.Cells[r,c].Color := $007AB4DA;
  1364.       if c>1 then
  1365.         table.Cells[r,c].VisibleBorders.Left := False;
  1366.       if c<table.Rows[r].Count-1 then
  1367.         table.Cells[r,c].VisibleBorders.Right := False;
  1368.     end;
  1369.   table.BestWidth := 400;
  1370.   RichViewEdit1.InsertText('Third example: width of table = 400 pixels, widths of cells - unspecified.',False);
  1371.   if RichViewEdit1.InsertItem('', table) then begin
  1372.   end;
  1373. end;
  1374. { Table | Insert Table Example 4 --------------------------------------}
  1375. procedure TForm1.mitInsertTable4Click(Sender: TObject);
  1376. var table: TRVTableItemInfo;
  1377.     r,c: Integer;
  1378. begin
  1379.   table := TRVTableItemInfo.CreateEx(3,3, RichViewEdit1.RVData);
  1380.   table.Color := clNone;
  1381.   table.BorderStyle := rvtbColor;
  1382.   table.CellBorderStyle := rvtbColor;
  1383.   table.BorderWidth := 1;
  1384.   table.BorderVSpacing := 2;
  1385.   table.BorderHSpacing := 2;
  1386.   table.CellBorderWidth := 1;
  1387.   table.CellPadding := 3;
  1388.   table.CellVSpacing := 5;
  1389.   table.CellHSpacing := 5;
  1390.   table.VRuleWidth := 1;
  1391.   table.HRuleWidth := 1;
  1392.   for r := 0 to table.Rows.Count-1 do
  1393.     for c := 0 to table.Rows[r].Count-1 do begin
  1394.       table.Cells[r,c].BestWidth := 40;
  1395.       table.Cells[r,c].Clear;
  1396.       table.Cells[r,c].AddFmt('%d,%d',[r,c],0,0);
  1397.       table.Cells[r,c].Color := clWhite;
  1398.     end;
  1399.   RichViewEdit1.InsertText('Transparent table with rules',False);
  1400.   if RichViewEdit1.InsertItem('', table) then begin
  1401.   end;
  1402. end;
  1403. { Table submenu popups ------------------------------------------}
  1404. procedure TForm1.mpdTableClick(Sender: TObject);
  1405. var item: TCustomRVItemInfo;
  1406.     table: TRVTableItemInfo;
  1407.     r,c,cs,rs: Integer;
  1408.     rve: TCustomRichViewEdit;
  1409.     Selected, SelectionRectangular: Boolean;
  1410. begin
  1411.   if not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, rve, item) then begin
  1412.     mitRowsAbove.Enabled         := False;
  1413.     mitRowsBelow.Enabled         := False;
  1414.     mitColsLeft.Enabled          := False;
  1415.     mitColsRight.Enabled         := False;
  1416.     mitDelRows.Enabled           := False;
  1417.     mitDelColumns.Enabled        := False;
  1418.     mitMergeCells.Enabled        := False;
  1419.     mitUmRows.Enabled            := False;
  1420.     mitUmCols.Enabled            := False;
  1421.     mitUmRowsAndCols.Enabled     := False;
  1422.     mitSplitVertically.Enabled   := False;
  1423.     mitSplitHorizontally.Enabled := False;
  1424.     exit;
  1425.   end;
  1426.   table := TRVTableItemInfo(item);
  1427.   Selected := table.GetNormalizedSelectionBounds(True,r,c,cs,rs);
  1428.   mitRowsAbove.Enabled         := Selected;
  1429.   mitRowsBelow.Enabled         := Selected;
  1430.   mitColsLeft.Enabled          := Selected;
  1431.   mitColsRight.Enabled         := Selected;
  1432.   mitDelRows.Enabled           := Selected;
  1433.   mitDelColumns.Enabled        := Selected;
  1434.   mitMergeCells.Enabled        := table.CanMergeSelectedCells(True);
  1435.   SelectionRectangular := Selected and
  1436.                           (table.CanMergeSelectedCells(True) or
  1437.                            (table.GetEditedCell(r,c)<>nil));
  1438.   mitSplitVertically.Enabled   := SelectionRectangular;
  1439.   mitSplitHorizontally.Enabled := SelectionRectangular;
  1440.   mitUmRows.Enabled            := SelectionRectangular;
  1441.   mitUmCols.Enabled            := SelectionRectangular;
  1442.   mitUmRowsAndCols.Enabled     := SelectionRectangular;
  1443. end;
  1444. { Table | All other commands --------------------------------------}
  1445. procedure TForm1.mitCellsOperationClick(Sender: TObject);
  1446. var item: TCustomRVItemInfo;
  1447.     table: TRVTableItemInfo;
  1448.     Data: Integer;
  1449.     r,c,cs,rs: Integer;
  1450.     s: String;
  1451.     rve: TCustomRichViewEdit;
  1452.     ItemNo: Integer;
  1453. begin
  1454.   if not RichViewEdit1.CanChange or
  1455.      not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, rve, item) then
  1456.     exit;
  1457.   table := TRVTableItemInfo(item);
  1458.   ItemNo := rve.GetItemNo(table);
  1459.   rve.BeginItemModify(ItemNo, Data);
  1460.   case TMenuItem(Sender).Tag of
  1461.     1:
  1462.       table.InsertRowsAbove(1);
  1463.     2:
  1464.       table.InsertRowsBelow(1);
  1465.     3:
  1466.       table.InsertColsLeft(1);
  1467.     4:
  1468.       table.InsertColsRight(1);
  1469.     5:
  1470.       begin
  1471.         table.GetNormalizedSelectionBounds(True,r,c,cs,rs);
  1472.         if rs=table.Rows.Count then begin
  1473.           // deleting whole table
  1474.           rve.SetSelectionBounds(ItemNo,0,ItemNo,1);
  1475.           rve.DeleteSelection;
  1476.           exit;
  1477.         end;
  1478.         rve.BeginUndoGroup(rvutModifyItem);
  1479.         rve.SetUndoGroupMode(True);
  1480.         table.DeleteSelectedRows;
  1481.         // it's possible all-nil rows/cols appear after deleting
  1482.         table.DeleteEmptyRows;
  1483.         table.DeleteEmptyCols;
  1484.         rve.SetUndoGroupMode(False);
  1485.       end;
  1486.     6:
  1487.       begin
  1488.         table.GetNormalizedSelectionBounds(True,r,c,cs,rs);
  1489.         if cs=table.Rows[0].Count then begin
  1490.           // deleting whole table
  1491.           rve.SetSelectionBounds(ItemNo,0,ItemNo,1);
  1492.           rve.DeleteSelection;
  1493.           exit;
  1494.         end;
  1495.         rve.BeginUndoGroup(rvutModifyItem);
  1496.         rve.SetUndoGroupMode(True);
  1497.         table.DeleteSelectedCols;
  1498.         // it's possible all-nil rows/cols appear after deleting
  1499.         table.DeleteEmptyRows;
  1500.         table.DeleteEmptyCols;
  1501.         rve.SetUndoGroupMode(False);
  1502.       end;
  1503.     7:
  1504.       begin
  1505.         // 3 methods: MergeSelectedCells, DeleteEmptyRows, DeleteEmptyCols
  1506.         // must be undone as one action.
  1507.         // So using BeginUndoGroup - SetUndoGroupMode(True) - ... - SetUndoGroupMode(False)
  1508.         rve.BeginUndoGroup(rvutModifyItem);
  1509.         rve.SetUndoGroupMode(True);
  1510.         table.MergeSelectedCells(True);
  1511.         table.DeleteEmptyRows;
  1512.         table.DeleteEmptyCols;
  1513.         rve.SetUndoGroupMode(False);
  1514.         // table.MergeSelectedCells(False) will not allow to create empty columns
  1515.         // or rows
  1516.       end;
  1517.     8:
  1518.       table.UnmergeSelectedCells(True, False);
  1519.     9:
  1520.       table.UnmergeSelectedCells(False, True);
  1521.     10:
  1522.       table.UnmergeSelectedCells(True, True);
  1523.     11:
  1524.       begin
  1525.         s := '2';
  1526.         if InputQuery('Split Vertically','Columns (in each selected cell):',s) then begin
  1527.           table.SplitSelectedCellsVertically(StrToIntDef(s,0));
  1528.         end;
  1529.       end;
  1530.     12:
  1531.       begin
  1532.         s := '2';
  1533.         if InputQuery('Split Horizontally','Rows (in each selected cell):',s) then begin
  1534.           table.SplitSelectedCellsHorizontally(StrToIntDef(s,0));
  1535.         end;
  1536.       end;
  1537.   end;
  1538.   rve.EndItemModify(ItemNo, Data);
  1539.   rve.Change;
  1540. end;
  1541. initialization
  1542.   // We need to register classes in order to load them from rvf files
  1543.   RegisterClasses([TButton, TEdit, TOleContainer]);
  1544. end.