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

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. int TForm1::GetListNo(TCustomRichViewEdit* rve, int ItemNo)
  19. {
  20.   int Level, StartFrom, Result;
  21.   bool Reset;
  22.   rve->GetListMarkerInfo(ItemNo, Result, Level, StartFrom, Reset);
  23.   return Result;
  24. }
  25. //---------------------------------------------------------------------------
  26. // Returns index of bulleted list style. Creates it, if necessary.
  27. int TForm1::CreateBullets()
  28. {
  29.   // 1. Creating desired list style
  30.   TRVListInfo* ListStyle = new TRVListInfo(NULL);
  31.   TRVListLevel* Level = ListStyle->Levels->Add();
  32.   Level->ListType  = rvlstBullet;
  33.   Level->Font->Name = "Symbol";
  34.   #if __BORLANDC__ > 0x520
  35.   Level->Font->Charset = SYMBOL_CHARSET;
  36.   #endif
  37.   Level->Font->Size  = 12;
  38.   Level->FirstIndent = 0;
  39.   Level->LeftIndent  = 24;
  40.   // 2. Searching for existing style with these properties. Creating it, if not found
  41.   int Result = RVStyle1->ListStyles->FindSuchStyle(ListStyle, true);
  42.   delete ListStyle;
  43.   return Result;
  44. }
  45. //---------------------------------------------------------------------------
  46. int TForm1::CreateNumbering()
  47. {
  48.   int Result = -1;
  49.   // 1. Creating desired list style
  50.   TRVListInfo* ListStyle = new TRVListInfo(NULL);
  51.   TRVListLevel* Level = ListStyle->Levels->Add();
  52.   Level->ListType     = rvlstDecimal;
  53.   Level->Font->Name   = "Arial";
  54.   Level->Font->Size   = 12;
  55.   Level->FirstIndent  = 0;
  56.   Level->LeftIndent   = 24;
  57.   Level->FormatString = "%0:s.";
  58.   // 2. Searching for such style in the selected paragraphs, the paragraph before,
  59.   // and the paragraph after. If found, using it.
  60.   int StartNo, EndNo, a, b;
  61.   TCustomRichViewEdit* rve = RichViewEdit1->TopLevelEditor;
  62.   rve->GetSelectionBounds(StartNo, a, EndNo, b, True);
  63.   if (StartNo<0)
  64.   {
  65.     StartNo = rve->CurItemNo;
  66.     EndNo   = StartNo;
  67.   }
  68.   // ExpandToPara is an undocumented method that changes item range StartNo..EndNo
  69.   // so that it completely includes paragraphs containing StartNo..EndNo
  70.   rve->RVData->ExpandToPara(StartNo, EndNo, StartNo, EndNo);
  71.   if (StartNo>0)
  72.     StartNo--;
  73.   if (EndNo<rve->ItemCount-1)
  74.     EndNo++;
  75.   rve->RVData->ExpandToPara(StartNo, EndNo, StartNo, EndNo);
  76.   for (int i=StartNo; i<=EndNo; i++)
  77.     if (rve->IsParaStart(i) && rve->GetItemStyle(i)==rvsListMarker)
  78.     {
  79.       int ListNo = GetListNo(rve, i);
  80.       if (RVStyle1->ListStyles->Items[ListNo]->IsSimpleEqual(ListStyle, true,true))
  81.       {
  82.         Result = ListNo;
  83.         break;
  84.       }
  85.     }
  86.   // 3. Idea for improving. You can try to reuse existing list style with the
  87.   // given properties, which is not used in the document. If you want to do it,
  88.   // you need to iterate through all items in the document, and check all markers.
  89.   // 4. If not found, creating it
  90.   if (Result<0)
  91.   {
  92.     RVStyle1->ListStyles->Add()->Assign(ListStyle);
  93.     Result = RVStyle1->ListStyles->Count-1;
  94.     RVStyle1->ListStyles->Items[Result]->Standard = false;
  95.   }
  96.   delete ListStyle;
  97.   return Result;
  98. }
  99. //---------------------------------------------------------------------------
  100. // CARET WAS MOVED: updating buttons
  101. void __fastcall TForm1::RichViewEdit1CaretMove(TObject *Sender)
  102. {
  103.   TCustomRichViewEdit* rve = RichViewEdit1->TopLevelEditor;
  104.   int FirstParaItemNo = rve->CurItemNo;
  105.   if (FirstParaItemNo<0) // document is cleared
  106.     return;
  107.   while (!rve->IsParaStart(FirstParaItemNo))
  108.     FirstParaItemNo--;
  109.   if (rve->GetItemStyle(FirstParaItemNo)==rvsListMarker)
  110.   {
  111.     int ListNo = GetListNo(rve, FirstParaItemNo);
  112.     btnBullets->Down   = ! RVStyle1->ListStyles->Items[ListNo]->HasNumbering();
  113.     btnNumbering->Down =   RVStyle1->ListStyles->Items[ListNo]->AllNumbered();
  114.   }
  115.   else
  116.   {
  117.     btnBullets->Down   = false;
  118.     btnNumbering->Down = false;
  119.   }
  120. }
  121. //---------------------------------------------------------------------------
  122. // TOGGLING BULLETS
  123. void __fastcall TForm1::btnBulletsClick(TObject *Sender)
  124. {
  125.   if (!btnBullets->Down)
  126.     RichViewEdit1->RemoveLists(false);
  127.   else
  128.     RichViewEdit1->ApplyListStyle(CreateBullets(),0,0,false,false);
  129. }
  130. //---------------------------------------------------------------------------
  131. // TOGGLING NUMBERING
  132. void __fastcall TForm1::btnNumberingClick(TObject *Sender)
  133. {
  134.   if (!btnNumbering->Down)
  135.     RichViewEdit1->RemoveLists(false);
  136.   else
  137.     RichViewEdit1->ApplyListStyle(CreateNumbering(),0,0,false,false);
  138. }
  139. //---------------------------------------------------------------------------