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

RichEdit

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. #include <vclvcl.h>
  3. #include <ShellApi.h>
  4. #pragma hdrstop
  5. #include "Unit1.h"
  6. #include "URLScan.hpp"
  7. //---------------------------------------------------------------------------
  8. #pragma link "RVEdit"
  9. #pragma link "RichView"
  10. #pragma link "RVScroll"
  11. #pragma link "RVStyle"
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. //---------------------------------------------------------------------------
  15. __fastcall TForm1::TForm1(TComponent* Owner)
  16.     : TForm(Owner)
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TForm1::FormCreate(TObject *Sender)
  21. {
  22.   // Uncomment this line to test working with Unicode
  23.   // RVStyle1->TextStyles->Items[0]->Unicode = true;
  24.   rve->Clear();
  25.   rve->AddNLATag("This demo shows how to implement URL scanning",0,0,0);
  26.   rve->AddNLATag("Click the button, and URLs (like this - "www.richedit.com/") will be highlighted.",0,0,0);
  27.   rve->AddNLATag("Ctrl+click URL to launch browser or e-mail client",0,0,0);  
  28.   rve->Format();
  29. }
  30. //---------------------------------------------------------------------------
  31. void __fastcall TForm1::btnOpenClick(TObject *Sender)
  32. {
  33.   if (! od->Execute())
  34.     return;
  35.   Screen->Cursor = crHourGlass;
  36.   rve->Clear();
  37.   rve->DeleteUnusedStyles(true,true,true);
  38.   bool r = false;
  39.   switch (od->FilterIndex)
  40.   {
  41.    case 1:
  42.      r = rve->LoadText(od->FileName,0,0,false);
  43.      break;
  44.    case 2:
  45.      r = rve->LoadRTF(od->FileName);
  46.      break;
  47.   }
  48.   rve->Format();
  49.   Screen->Cursor = crDefault;
  50.   if (!r)
  51.     Application->MessageBox("Error loading file", "Error", MB_OK | MB_ICONSTOP);
  52. }
  53. //---------------------------------------------------------------------------
  54. void __fastcall TForm1::btnScanClick(TObject *Sender)
  55. {
  56.   Screen->Cursor = crHourGlass;
  57.   // Moving caret to the beginning
  58.   rve->SetSelectionBounds(0, rve->GetOffsBeforeItem(0), 0, rve->GetOffsBeforeItem(0));
  59.   // Clearing undo/redo buffers
  60.   rve->ClearUndo();
  61.   // removing old hypertext links
  62.   bool r = ClearHypertext(rve->RVData, URLScanEvent, true);
  63.   // scanning for URLs
  64.   r = ScanURLs(rve->RVData, URLScanEvent, true) || r;
  65.   if (r)
  66.     rve->Format();
  67.   Screen->Cursor = crDefault;
  68.   rve->SetFocus();
  69. }
  70. //---------------------------------------------------------------------------
  71. // Callback procedure
  72. // This procedure should return index of style for converting source style to
  73. void __fastcall TForm1::URLScanEvent(int OldStyleNo, int& NewStyleNo,
  74.                                      bool ToHypertext)
  75. {
  76.   // Constructing desired style
  77.   TFontInfo* Style = new TFontInfo(NULL);
  78.   Style->Assign(RVStyle1->TextStyles->Items[OldStyleNo]);
  79.   Style->Jump = ToHypertext;
  80.   if (ToHypertext)
  81.   {
  82.     // Hypertext links will be blue and underlined
  83.     Style->Style << fsUnderline;
  84.     Style->Color = clBlue;
  85.     Style->JumpCursor = crJump;
  86.   }
  87.   else
  88.   {
  89.     // Plain text will be black and not underlined
  90.     Style->Style >> fsUnderline;
  91.     Style->Color = clWindowText;
  92.   }
  93.   // May be such style already exists?
  94.   NewStyleNo = RVStyle1->TextStyles->FindSuchStyle(OldStyleNo,Style,RVAllFontInfoProperties);
  95.   if (NewStyleNo==-1)
  96.   {
  97.     // Not exists, adding...
  98.     RVStyle1->TextStyles->Add()->Assign(Style);
  99.     NewStyleNo = RVStyle1->TextStyles->Count-1;
  100.     RVStyle1->TextStyles->Items[NewStyleNo]->Standard = false;
  101.   }
  102.   delete Style;
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TForm1::rveJump(TObject *Sender, int id)
  106. {
  107.   TCustomRVFormattedData* RVData;
  108.   int ItemNo;
  109.   rve->GetJumpPointLocation(id, RVData, ItemNo);
  110.   AnsiString url = (char*)(RVData->GetItemTag(ItemNo));
  111.   ShellExecute(0, "open", url.c_str(), NULL, NULL, SW_SHOW);
  112. }
  113. //---------------------------------------------------------------------------
  114. void __fastcall TForm1::rveKeyDown(TObject *Sender, WORD &Key,
  115. TShiftState Shift)
  116. {
  117.   if (Key==VK_SPACE || Key==VK_RETURN)
  118.   {
  119.     // url detection
  120.     if (CheckBox1->Checked)
  121.       DetectURL(rve, URLScanEvent, true);
  122.     // closing url if necessary
  123.     TerminateHyperlink(rve, URLScanEvent);
  124.   }
  125. }
  126. //---------------------------------------------------------------------------