diff options
Diffstat (limited to 'apps/windoze/swdisprtf.cpp')
-rw-r--r-- | apps/windoze/swdisprtf.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/apps/windoze/swdisprtf.cpp b/apps/windoze/swdisprtf.cpp new file mode 100644 index 0000000..3a725af --- /dev/null +++ b/apps/windoze/swdisprtf.cpp @@ -0,0 +1,113 @@ +//--------------------------------------------------------------------------- +#include <vcl\vcl.h> +#pragma hdrstop + +#include "swdisprtf.h" +#include <unicodertf.h> + + + +//--------------------------------------------------------------------------- +__fastcall SWDispRTF::SWDispRTF(TWinControl *Owner) + : TRxRichEditX(Owner) { + RTFStream = new TMemoryStream(); + + ExpandNewLine = true; + this->AutoURLDetect = true; +} + +__fastcall SWDispRTF::~SWDispRTF() +{ + if (RTFStream) + delete RTFStream; +} + + +void __fastcall SWDispRTF::Loaded(void) +{ + TRxRichEditX::Loaded(); +} + + +int __fastcall SWDispRTF::GetMySelStart() { + CHARRANGE cr; + + SendMessage(Handle, EM_EXGETSEL, 0, (long)&cr); + return cr.cpMin; +} + + +void __fastcall SWDispRTF::SetMySelStart(int iselstart) { + CHARRANGE cr; + + cr.cpMin = iselstart; + cr.cpMax = iselstart; + SendMessage(Handle, EM_EXSETSEL, 0, (long)&cr); +} + +// Display for Comm and LD +char SWDispRTF::Display(SWModule &Module) { + System::AnsiString newtext, tmptext; + static UnicodeRTF filter; + char buf[255]; + + module = &Module; + type = "Default"; + + recalcAppearance(); + + newtext = RTFHeader; + newtext = newtext + RTFHeadMargin; + Module.Error(); // clear error; + newtext = newtext + "\\pard \\nowidctlpar \\cf7\\f0 "; + (const char *)Module; // force key to snap to entry before pulling out the text of the key + strcpy(buf, Module.KeyText()); + SWKey *key = Module; + + // VerseKey locales are not yet UTF8, so don't try to convert them. + if (!SWDYNAMIC_CAST(VerseKey, key)) + filter.ProcessText(buf, 253, Module, &Module); + + newtext = newtext + RTFHeadingPre + buf + RTFHeadingPost + ":\\par "; + tmptext = ""; + + tmptext = (const char *)Module; + + newtext = newtext + RTFVersePre + " " + tmptext + RTFVersePost; + newtext = newtext + RTFTrailer; + RTFStream->Clear(); + RTFStream->WriteBuffer(newtext.c_str(), newtext.Length()); + RTFStream->Position = 0; + Lines->LoadFromStream(RTFStream); + + // make links + while (true) { + int start, len, foundAt, endAt; + + start = (SelLength) ? SelStart + SelLength : 0; + len = Text.Length() - start; + foundAt = this->SearchText("<a href=\"\">", start, len, TRichSearchTypes()); + if (foundAt == -1) + break; + + SelStart = foundAt; + SelLength = 11; + this->SelText = ""; + endAt = this->SearchText("</a>", foundAt, len, TRichSearchTypes()); + if (foundAt == -1) + break; + SelStart = endAt; + SelLength = 4; + this->SelText = ""; + SelStart = foundAt; + SelLength = endAt - foundAt; + this->SelAttributes->Link = true; + } + SelLength = 0; + + return 0; +} + +//--------------------------------------------------------------------------- + + |