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

RichEdit

开发平台:

Delphi

  1. /*==============================================================================
  2.  RichEditor Demo
  3.   Menu items disabling/enabling is not implemented here.
  4.   The main idea: new styles are created and added to rvs->TextStyles when needed.
  5.   The right place for this - rve->OnStyleConversion.
  6.   rvfoSaveTextStyles, rvfoSaveParaStyles are included in rve->RVFOptions.
  7.   IMPORTANT: If you right click the editor in design time, choose "Settings"
  8.   in the context menu, you'll see that radiogroup is in state
  9.   "Allow adding styles dynamically"
  10. ==============================================================================*/
  11. #include <vcl.h>
  12. #pragma hdrstop
  13. #include "Unit1.h"
  14. //---------------------------------------------------------------------------
  15. #pragma package(smart_init)
  16. #pragma link "RichView"
  17. #pragma link "RVEdit"
  18. #pragma link "RVScroll"
  19. #pragma link "RVStyle"
  20. #pragma resource "*.dfm"
  21. TForm1 *Form1;
  22. //---------------------------------------------------------------------------
  23. __fastcall TForm1::TForm1(TComponent* Owner)
  24.     : TForm(Owner)
  25. {
  26. }
  27. //---------------------------------------------------------------------------
  28. // Parameters for ApplyStyleConversion
  29. #define TEXT_BOLD          1
  30. #define TEXT_ITALIC        2
  31. #define TEXT_UNDERLINE     3
  32. #define TEXT_APPLYFONTNAME 4
  33. #define TEXT_APPLYFONT     5
  34. #define TEXT_APPLYFONTSIZE 6
  35. #define TEXT_COLOR         7
  36. #define TEXT_BACKCOLOR     8
  37. // Parameters for ApplyParaStyleConversion
  38. #define PARA_ALIGNMENT     1
  39. #define PARA_INDENTINC     2
  40. #define PARA_INDENTDEC     3
  41. #define PARA_COLOR         4
  42. void __fastcall TForm1::FormCreate(TObject *Sender)
  43. {
  44.   // Filling font names combobox
  45.   cmbFont->Items->Assign(Screen->Fonts);
  46.   New();
  47. }
  48. //---------------------------------------------------------------------------
  49. // data in editor were changed
  50. void __fastcall TForm1::rveChange(TObject *Sender)
  51. {
  52.   StatusBar1->Panels->Items[0]->Text = "Modified";
  53. }
  54. //---------------------------------------------------------------------------
  55. // current text style was changed
  56. void __fastcall TForm1::rveCurTextStyleChanged(TObject *Sender)
  57. {
  58.   IgnoreChanges = true;
  59.   StatusBar1->Panels->Items[1]->Text = "Style : "+IntToStr(rve->CurTextStyleNo);
  60.   // Changing selection in comboboxes with font names and sizes:
  61.   TFontInfo* fi = rvs->TextStyles->Items[rve->CurTextStyleNo];
  62.   cmbFont->ItemIndex = cmbFont->Items->IndexOf(fi->FontName);
  63.   cmbFontSize->Text = IntToStr(fi->Size);
  64.   // Checking font buttons
  65.   btnBold->Down      = fi->Style.Contains(fsBold);
  66.   btnItalic->Down    = fi->Style.Contains(fsItalic);
  67.   btnUnderline->Down = fi->Style.Contains(fsUnderline);
  68.   IgnoreChanges = false;
  69. }
  70. //---------------------------------------------------------------------------
  71. // current paragraph style was changed
  72. void __fastcall TForm1::rveCurParaStyleChanged(TObject *Sender)
  73. {
  74.   SetAlignmentToUI(rvs->ParaStyles->Items[rve->CurParaStyleNo]->Alignment);
  75. }
  76. //--------------------------------------------------------------------------
  77. TRVAlignment TForm1::GetAlignmentFromUI()
  78. {
  79.   if (btnLeft->Down)
  80.     return rvaLeft;
  81.   else if (btnRight->Down)
  82.     return rvaRight;
  83.   else if (btnCenter->Down)
  84.     return rvaCenter;
  85.   else
  86.     return rvaJustify;
  87. }
  88. //--------------------------------------------------------------------------
  89. void TForm1::SetAlignmentToUI(TRVAlignment Alignment)
  90. {
  91.   switch (Alignment)
  92.   {
  93.     case rvaLeft:
  94.       btnLeft->Down = true;
  95.       break;
  96.     case rvaCenter:
  97.       btnCenter->Down = true;
  98.       break;
  99.     case rvaRight:
  100.       btnRight->Down = true;
  101.       break;
  102.     case rvaJustify:
  103.       btnJustify->Down = true;
  104.       break;
  105.   }
  106. }
  107. //---------------------------------------------------------------------------
  108. // applying font name
  109. void __fastcall TForm1::cmbFontClick(TObject *Sender)
  110. {
  111.   if (cmbFont->ItemIndex!=-1 && !IgnoreChanges)
  112.   {
  113.     FontName = cmbFont->Items->Strings[cmbFont->ItemIndex];
  114.     rve->ApplyStyleConversion(TEXT_APPLYFONTNAME);
  115.   }
  116.   if (Visible)
  117.     rve->SetFocus();
  118. }
  119. //---------------------------------------------------------------------------
  120. // applying font size
  121. void __fastcall TForm1::cmbFontSizeClick(TObject *Sender)
  122. {
  123.   if (cmbFontSize->Text!="" && !IgnoreChanges)
  124.   {
  125.     FontSize = StrToIntDef(cmbFontSize->Text, 10);
  126.     rve->ApplyStyleConversion(TEXT_APPLYFONTSIZE);
  127.   }
  128.   if (Visible)
  129.     rve->SetFocus();
  130. }
  131. //---------------------------------------------------------------------------
  132. // bold, italic, underline
  133. void __fastcall TForm1::FontStyleButtonClick(TObject *Sender)
  134. {
  135.   TSpeedButton*Button = (TSpeedButton*)Sender;
  136.   // constants TEXT_BOLD, TEXT_ITALIC and TEXT_UNDERLINE are
  137.   // assigned to the tags of corresponding buttons
  138.   rve->ApplyStyleConversion(Button->Tag);
  139. }
  140. //---------------------------------------------------------------------------
  141. // applying font
  142. void __fastcall TForm1::mitFontClick(TObject *Sender)
  143. {
  144.   fd->Font->Assign(rvs->TextStyles->Items[rve->CurTextStyleNo]);
  145.   if (fd->Execute())
  146.     rve->ApplyStyleConversion(TEXT_APPLYFONT);
  147. }
  148. //---------------------------------------------------------------------------
  149. // applying text color
  150. void __fastcall TForm1::btnFontColorClick(TObject *Sender)
  151. {
  152.   cd->Color = rvs->TextStyles->Items[rve->CurTextStyleNo]->Color;
  153.   if (cd->Execute())
  154.     rve->ApplyStyleConversion(TEXT_COLOR);
  155. }
  156. //---------------------------------------------------------------------------
  157. // applying text background color
  158. void __fastcall TForm1::btnFontBackColorClick(TObject *Sender)
  159. {
  160.   switch (Application->MessageBox("Make the selected text background transparent?n"
  161.                             "(YES - make transparent; NO - choose color)",
  162.                             "Text Background", MB_YESNOCANCEL | MB_ICONQUESTION))
  163.   {
  164.     case IDYES:
  165.       cd->Color = clNone;
  166.       break;
  167.     case IDNO:
  168.       cd->Color = rvs->TextStyles->Items[rve->CurTextStyleNo]->BackColor;
  169.         if (cd->Color==clNone)
  170.           cd->Color = clWhite;
  171.         if (! cd->Execute())
  172.           return;
  173.       break;
  174.     case IDCANCEL:
  175.       return;
  176.   }
  177.   rve->ApplyStyleConversion(TEXT_BACKCOLOR);
  178. }
  179. //---------------------------------------------------------------------------
  180. void __fastcall TForm1::btnParaBackColorClick(TObject *Sender)
  181. {
  182.   switch (Application->MessageBox("Make the selected paragraph background transparent?n"
  183.                             "(YES - make transparent; NO - choose color)",
  184.                             "Text Background", MB_YESNOCANCEL | MB_ICONQUESTION))
  185.   {
  186.     case IDYES:
  187.       cd->Color = clNone;
  188.       break;
  189.     case IDNO:
  190.       cd->Color = rvs->ParaStyles->Items[rve->CurParaStyleNo]->Background->Color;
  191.       if (cd->Color==clNone)
  192.         cd->Color = clWhite;
  193.       if (! cd->Execute())
  194.         return;
  195.       break;
  196.     case IDCANCEL:
  197.       return;
  198.   }
  199.   rve->ApplyParaStyleConversion(PARA_COLOR);
  200. }
  201. //---------------------------------------------------------------------------
  202. // applying paragraph alignment
  203. void __fastcall TForm1::btnApplyPara(TObject *Sender)
  204. {
  205.    rve->ApplyParaStyleConversion(PARA_ALIGNMENT);
  206. }
  207. //---------------------------------------------------------------------------
  208. // changing paragraph left indent
  209. void __fastcall TForm1::btnIdentDecClick(TObject *Sender)
  210. {
  211.   rve->ApplyParaStyleConversion(PARA_INDENTDEC);
  212. }
  213. //---------------------------------------------------------------------------
  214. void __fastcall TForm1::btnIdentIncClick(TObject *Sender)
  215. {
  216.   rve->ApplyParaStyleConversion(PARA_INDENTINC);
  217. }
  218. //---------------------------------------------------------------------------
  219. // The heart of this demo: rve->OnStyleConversion
  220. void __fastcall TForm1::rveStyleConversion(TCustomRichViewEdit *Sender,
  221.       int StyleNo, int UserData, bool AppliedToText, int &NewStyleNo)
  222. {
  223.   TFontInfo* FontInfo = new TFontInfo(NULL);
  224.   FontInfo->Assign(rvs->TextStyles->Items[StyleNo]);
  225.   switch (UserData)
  226.   {
  227.     case TEXT_BOLD:
  228.     {
  229.       if (btnBold->Down)
  230.         FontInfo->Style << fsBold;
  231.       else
  232.         FontInfo->Style >> fsBold;
  233.       break;
  234.     }
  235.     case TEXT_ITALIC:
  236.     {
  237.       if (btnItalic->Down)
  238.         FontInfo->Style << fsItalic;
  239.       else
  240.         FontInfo->Style >> fsItalic;
  241.       break;
  242.     }
  243.     case TEXT_UNDERLINE:
  244.     {
  245.       if (btnUnderline->Down)
  246.         FontInfo->Style << fsUnderline;
  247.       else
  248.         FontInfo->Style >> fsUnderline;
  249.       break;
  250.     }
  251.     case TEXT_APPLYFONTNAME:
  252.       FontInfo->FontName = FontName;
  253.       break;
  254.     case TEXT_APPLYFONTSIZE:
  255.       FontInfo->Size     = FontSize;
  256.       break;
  257.     case TEXT_APPLYFONT:
  258.       FontInfo->Assign(fd->Font);
  259.       break;
  260.     case TEXT_COLOR:
  261.       FontInfo->Color = cd->Color;
  262.       break;
  263.     case TEXT_BACKCOLOR:
  264.       FontInfo->BackColor = cd->Color;
  265.       break;
  266.       // add your code here....
  267.   }
  268.   NewStyleNo = rvs->TextStyles->FindSuchStyle(StyleNo,FontInfo,RVAllFontInfoProperties);
  269.   if (NewStyleNo<0)
  270.   {
  271.     rvs->TextStyles->Add();
  272.     NewStyleNo = rvs->TextStyles->Count-1;
  273.     rvs->TextStyles->Items[NewStyleNo]->Assign(FontInfo);
  274.     rvs->TextStyles->Items[NewStyleNo]->Standard = false;
  275.   }
  276.   delete FontInfo;
  277. }
  278. //---------------------------------------------------------------------------
  279. void __fastcall TForm1::rveParaStyleConversion(TCustomRichViewEdit *Sender,
  280. int StyleNo, int UserData, bool AppliedToText, int &NewStyleNo)
  281. {
  282.   TParaInfo* ParaInfo = new TParaInfo(NULL);
  283.   ParaInfo->Assign(rvs->ParaStyles->Items[StyleNo]);
  284.   switch (UserData)
  285.   {
  286.     case PARA_ALIGNMENT:
  287.       ParaInfo->Alignment = GetAlignmentFromUI();
  288.       break;
  289.     case PARA_INDENTINC:
  290.       ParaInfo->LeftIndent = ParaInfo->LeftIndent+20;
  291.       if (ParaInfo->LeftIndent>200)
  292.         ParaInfo->LeftIndent = 200;
  293.       break;
  294.     case PARA_INDENTDEC:
  295.       ParaInfo->LeftIndent = ParaInfo->LeftIndent-20;
  296.       if (ParaInfo->LeftIndent<0)
  297.         ParaInfo->LeftIndent = 0;
  298.       break;
  299.     case PARA_COLOR:
  300.       ParaInfo->Background->Color = cd->Color;
  301.       break;
  302.     // add your code here....
  303.   }
  304.   NewStyleNo = rvs->ParaStyles->FindSuchStyle(StyleNo,ParaInfo,RVAllParaInfoProperties);
  305.   if (NewStyleNo<0)
  306.   {
  307.     rvs->ParaStyles->Add();
  308.     NewStyleNo = rvs->ParaStyles->Count-1;
  309.     rvs->ParaStyles->Items[NewStyleNo]->Assign(ParaInfo);
  310.     rvs->ParaStyles->Items[NewStyleNo]->Standard = false;
  311.   }
  312.   delete ParaInfo;
  313. }
  314. //---------------------------------------------------------------------------
  315. void __fastcall TForm1::cmbFontSizeKeyPress(TObject *Sender, char &Key)
  316. {
  317.   if (Key==VK_RETURN)
  318.   {
  319.     Key = 0;
  320.     cmbFontSizeClick(NULL);
  321.   }
  322. }
  323. //---------------------------------------------------------------------------
  324. void __fastcall TForm1::cmbFontSizeExit(TObject *Sender)
  325. {
  326.   cmbFontSizeClick(NULL);
  327. }
  328. //---------------------------------------------------------------------------
  329. void __fastcall TForm1::mitUndoClick(TObject *Sender)
  330. {
  331.   rve->Undo();
  332. }
  333. //---------------------------------------------------------------------------
  334. void __fastcall TForm1::mitRedoClick(TObject *Sender)
  335. {
  336.   rve->Redo();
  337. }
  338. //---------------------------------------------------------------------------
  339. void __fastcall TForm1::mitCutClick(TObject *Sender)
  340. {
  341.   rve->CutDef();
  342. }
  343. //---------------------------------------------------------------------------
  344. void __fastcall TForm1::mitCopyClick(TObject *Sender)
  345. {
  346.   rve->CopyDef();
  347. }
  348. //---------------------------------------------------------------------------
  349. void __fastcall TForm1::mitPasteClick(TObject *Sender)
  350. {
  351.   rve->Paste();
  352. }
  353. //---------------------------------------------------------------------------
  354. void __fastcall TForm1::mitDeleteClick(TObject *Sender)
  355. {
  356.   rve->DeleteSelection();
  357. }
  358. //---------------------------------------------------------------------------
  359. bool TForm1::SaveIfNeeded()
  360. {
  361.   if (rve->Modified)
  362.     switch (Application->MessageBox("Save file now?","File was modified",
  363.                                 MB_ICONQUESTION | MB_YESNOCANCEL))
  364.     {
  365.       case IDYES:
  366.         return Save();
  367.       case IDNO:
  368.         return true;
  369.       default: //case IDCANCEL:
  370.         return false;
  371.     }
  372.   else
  373.     return true;
  374. }
  375. //---------------------------------------------------------------------------
  376. bool TForm1::Save()
  377. {
  378.   if (FileName=="")
  379.     return SaveAs();
  380.   else
  381.   {
  382.     rve->SaveRVF(FileName, false);
  383.     rve->Modified = false;
  384.     StatusBar1->Panels->Items[0]->Text = "";
  385.     return true;
  386.   }
  387. }
  388. //---------------------------------------------------------------------------
  389. bool TForm1::SaveAs()
  390. {
  391.   if (sd->Execute())
  392.   {
  393.     FileName = sd->FileName;
  394.     bool r = Save();
  395.     if (r)
  396.       Caption = ExtractFileName(FileName) + "- RDemo";
  397.     return r;
  398.   }
  399.   else
  400.     return false;
  401. }
  402. //---------------------------------------------------------------------------
  403. void TForm1::Open()
  404. {
  405.   if (!SaveIfNeeded())
  406.     return;
  407.   if (od->Execute())
  408.   {
  409.     FileName = od->FileName;
  410.     rve->LoadRVF(FileName);
  411.     rve->Format();
  412.     rveCurTextStyleChanged(NULL);
  413.     rveCurParaStyleChanged(NULL);
  414.     StatusBar1->Panels->Items[0]->Text = "";
  415.     Caption = ExtractFileName(FileName) + "- RDemo";
  416.   }
  417. }
  418. //---------------------------------------------------------------------------
  419. void TForm1::New()
  420. {
  421.   if (!SaveIfNeeded())
  422.     return;
  423.   FileName = "";
  424.   StatusBar1->Panels->Items[0]->Text = "";
  425.   Caption = "Unnamed - RDemo";
  426.   rve->Clear();
  427.   rve->Format();
  428.   rve->DeleteUnusedStyles(true,true,true);
  429.   rveCurTextStyleChanged(NULL);
  430.   rveCurParaStyleChanged(NULL);
  431. }
  432. //---------------------------------------------------------------------------
  433. void __fastcall TForm1::mitNewClick(TObject *Sender)
  434. {
  435.   New();
  436. }
  437. //---------------------------------------------------------------------------
  438. void __fastcall TForm1::mitOpenClick(TObject *Sender)
  439. {
  440.   Open();
  441. }
  442. //---------------------------------------------------------------------------
  443. void __fastcall TForm1::mitSaveClick(TObject *Sender)
  444. {
  445.   Save();
  446. }
  447. //---------------------------------------------------------------------------
  448. void __fastcall TForm1::mitSaveAsClick(TObject *Sender)
  449. {
  450.   SaveAs();
  451. }
  452. //---------------------------------------------------------------------------
  453. void __fastcall TForm1::mitExitClick(TObject *Sender)
  454. {
  455.   Close();
  456. }
  457. //---------------------------------------------------------------------------
  458. void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
  459. {
  460.   CanClose = SaveIfNeeded();
  461. }