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

RichEdit

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. #include <vclvcl.h>
  3. #pragma hdrstop
  4. #include "Unit1.h"
  5. //---------------------------------------------------------------------------
  6. #pragma link "RVEdit"
  7. #pragma link "RichView"
  8. #pragma link "RVScroll"
  9. #pragma link "RVStyle"
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12. //---------------------------------------------------------------------------
  13. __fastcall TForm1::TForm1(TComponent* Owner)
  14. : TForm(Owner)
  15. {
  16. }
  17. //---------------------------------------------------------------------------
  18. void __fastcall TForm1::FormCreate(TObject *Sender)
  19. {
  20.   rve1->Clear();
  21.   rve1->AddNL("John: ", 3, 0);
  22.   rve1->AddNL("Funny, very funny :)", 0, -1);
  23.   rve1->AddNL("Rob: ", 3, 0);
  24.   rve1->AddNL("I do not think so :(...", 0, -1);
  25.   rve1->Format();
  26.   rve4->Clear();
  27.   rve4->AddNL("La la la:):):):)", 1, 0);
  28.   rve4->AddNL("La la la:):):):)", 2, -1);
  29.   rve4->AddNL("La la la:):):):)", 0, -1);
  30.   rve4->Format();
  31. }
  32. //---------------------------------------------------------------------------
  33. // Using Search feature of RichViewEdit to insert emotion icons
  34. void SearchAndInsertIcon(const AnsiString Code, int ImageIndex,
  35.   TCustomRichViewEdit* rve1, TCustomImageList* ImageList1)
  36. {
  37.   rve1->SetSelectionBounds(0, rve1->GetOffsBeforeItem(0), 0, rve1->GetOffsBeforeItem(0));
  38.   TRVESearchOptions Options;
  39.   Options << rvseoDown;
  40.   while (rve1->SearchText(Code, Options))
  41.     rve1->InsertBullet(ImageIndex, ImageList1);
  42. }
  43. //---------------------------------------------------------------------------
  44. void __fastcall TForm1::Button1Click(TObject *Sender)
  45. {
  46.   LockWindowUpdate(rve1->Handle);
  47.   try
  48.   {
  49.     SearchAndInsertIcon(":)", 0, rve1, ImageList1);
  50.     SearchAndInsertIcon(":|", 1, rve1, ImageList1);
  51.     SearchAndInsertIcon(":(", 2, rve1, ImageList1);
  52.   }
  53.   catch(...)
  54.   {
  55.   }
  56.   LockWindowUpdate(0);
  57. }
  58. //---------------------------------------------------------------------------
  59. int GetImageIndex(char mouth)
  60. {
  61.   switch (mouth)
  62.   {
  63.     case ')': return 0;
  64.     case '|': return 1;
  65.     default:  return 2;
  66.   }
  67. }
  68. AnsiString GetSmile(int ImageIndex)
  69. {
  70.   switch(ImageIndex)
  71.   {
  72.     case 0: return ":)";
  73.     case 1: return ":|";
  74.     default: return ":(";
  75.   }
  76. }
  77. //---------------------------------------------------------------------------
  78. void TForm1::AddWithIcons(TCustomRichView* rv, AnsiString s, int StyleNo,
  79.   int &ParaNo)
  80. {
  81.   AnsiString s2 = "";
  82.   while (s!="")
  83.   {
  84.     int p = s.Pos(":"); // searching for "eyes"
  85.     if (!p)
  86.     {
  87.       // not found
  88.       rv->AddNL(s2+s, StyleNo, ParaNo);
  89.       ParaNo = -1;
  90.       return;
  91.     }
  92.     // is it really "eyes"?
  93.     if (s.Length()>p && (s[p+1]==')' || s[p+1]=='|' || s[p+1]=='('))
  94.     {
  95.       // a smile is found
  96.       s2 += s.SubString(1, p-1);
  97.       if (s2!="")
  98.       {
  99.         rv->AddNL(s2, StyleNo, ParaNo);
  100.         s2 = "";
  101.         ParaNo = -1;
  102.       }
  103.       rv->AddBulletEx("", GetImageIndex(s[p+1]), ImageList1, ParaNo);
  104.       ParaNo = -1;
  105.       s = s.SubString(p+2, s.Length());
  106.     }
  107.     else
  108.     {
  109.       // this is not a smile
  110.       s2 = s.SubString(1, p);
  111.       s = s.SubString(p+1, s.Length());
  112.     }
  113.   }
  114.   if (s2!="")
  115.   {
  116.     rv->AddNL(s2, StyleNo, ParaNo);
  117.     s2 = "";
  118.     ParaNo = -1;
  119.   }
  120. }
  121. void __fastcall TForm1::Button2Click(TObject *Sender)
  122. {
  123.   if (Edit1->Text!="")
  124.   {
  125.     rv2->AddNL("Me: ",3,0);
  126.     int ParaNo = -1; // adding to the same line
  127.     AddWithIcons(rv2, Edit1->Text, 0, ParaNo);
  128.     rv2->FormatTail();
  129.     Edit1->Text = "";
  130.   }
  131.   else
  132.     MessageBeep(0);
  133. }
  134. //---------------------------------------------------------------------------
  135. // From TRichViewEdit with emoticons detection
  136. void __fastcall TForm1::Button3Click(TObject *Sender)
  137. {
  138.   // this example has the following limitations:
  139.   // - non-text will be ignored
  140.   // - assumes that styles of rv3 and rve4 are the same
  141.   int ParaNo = 0;
  142.   for (int i=0; i<rve4->ItemCount; i++)
  143.   {
  144.     if (rve4->IsFromNewLine(i))
  145.       ParaNo = rve4->GetItemPara(i);
  146.     if (rve4->GetItemStyle(i)>=0)
  147.       AddWithIcons(rv3, rve4->GetItemText(i), rve4->GetItemStyle(i), ParaNo);
  148.   }
  149.   rv3->FormatTail();
  150.   rve4->SetFocus();
  151. }
  152. //---------------------------------------------------------------------------
  153. // From TRichViewEdit as is
  154. void __fastcall TForm1::Button4Click(TObject *Sender)
  155. {
  156.   TMemoryStream*Stream = new TMemoryStream;
  157.   rve6->SaveRVFToStream(Stream, false);
  158.   Stream->Position = 0;
  159.   rv5->InsertRVFFromStream(Stream, rv5->ItemCount);
  160.   delete Stream;
  161.   rv5->FormatTail();
  162.   rve6->SetFocus();
  163. }
  164. //---------------------------------------------------------------------------
  165. // Emoticons autodetection on typing
  166. void __fastcall TForm1::rve6KeyPress(TObject *Sender, char &Key)
  167. {
  168.   if (Key!=')' && Key!='(' && Key!='|')
  169.     return;
  170.   TCustomRichViewEdit* rve = ((TCustomRichViewEdit*)Sender)->TopLevelEditor;
  171.   int ItemNo = rve->CurItemNo;
  172.   if (rve->GetItemStyle(ItemNo)<0)
  173.     return;
  174.   int Offs = rve->OffsetInCurItem;
  175.   AnsiString s = rve->GetItemTextA(ItemNo);
  176.   if (s=="" || Offs==1)
  177.     return;
  178.   if (s[Offs-1]==':')
  179.   {
  180.     rve->SetSelectionBounds(ItemNo, Offs-1, ItemNo, Offs);
  181.     rve->InsertBullet(GetImageIndex(Key), ImageList1);
  182.     Key = 0;
  183.   }
  184. }
  185. //---------------------------------------------------------------------------
  186. int GetBulletImageIndex(TCustomRichView* rv, int ItemNo)
  187. {
  188.   int tag, r;
  189.   AnsiString s;
  190.   TCustomImageList* il;
  191.   rv->GetBulletInfo(ItemNo, s, r, il, tag);
  192.   return r;
  193. }
  194. //---------------------------------------------------------------------------
  195. // BACKSPACE disassembles emoticon
  196. void __fastcall TForm1::rve6KeyDown(TObject *Sender, WORD &Key,
  197. TShiftState Shift)
  198. {
  199.   if (Key!=VK_BACK)
  200.     return;
  201.   TCustomRichViewEdit* rve = ((TCustomRichViewEdit*)Sender)->TopLevelEditor;
  202.   if (rve->SelectionExists())
  203.     return;
  204.   int ItemNo = rve->CurItemNo;
  205.   int Offs = rve->OffsetInCurItem;
  206.   if (rve->GetItemStyle(ItemNo)==rvsBullet && Offs==1)
  207.   {
  208.     Key = 0;
  209.     rve->SetSelectionBounds(ItemNo, 0, ItemNo, 1);
  210.     rve->InsertText(GetSmile(GetBulletImageIndex(rve, ItemNo)), false);
  211.   }
  212. }
  213. void __fastcall TForm1::rv5RVFImageListNeeded(TCustomRichView *Sender,
  214. int ImageListTag, TCustomImageList *&il)
  215. {
  216.   il = ImageList1;
  217. }
  218. //---------------------------------------------------------------------------