aboutsummaryrefslogtreecommitdiffstats
path: root/apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp')
-rw-r--r--apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp860
1 files changed, 860 insertions, 0 deletions
diff --git a/apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp b/apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp
new file mode 100644
index 0000000..52876ab
--- /dev/null
+++ b/apps/windoze/CBuilder5/BibleCS/RxRichEditX.cpp
@@ -0,0 +1,860 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "RxRichEditX.h"
+#include <clipbrd.hpp>
+#include <swdisprtf.h>
+#include <swdisprtfchap.h>
+#include "mainfrm.h"
+#include <localemgr.h>
+#include <unicodertf.h>
+
+char TRxRichEditX::platformID = 0;
+
+TRxRichEditX::TRxRichEditX(TWinControl *parent) : TRxRichEdit(parent)
+{
+ OSVERSIONINFO osvi;
+ memset(&osvi, 0, sizeof(OSVERSIONINFO));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osvi);
+ platformID = osvi.dwPlatformId;
+ type = "Default";
+}
+
+void TRxRichEditX::RenderModule(SWModule* module, RTF_FORMAT format)
+{
+ format_ops = format;
+
+ TMemoryStream* RTFStream = new TMemoryStream();
+ AnsiString rtfText = "{\\rtf1\\ansi{\\fonttbl{\\f0\\fdecor\\fprq2 ";
+ rtfText += format_ops.fontFace;
+ rtfText += ";}}{\\colortbl;\\red0\\green0\\blue0;}";
+ rtfText += "{\\fs8\\cf1\\par\\pard} ";
+
+ //if(!strcmp(module->Type(), "Biblical Texts"))
+ rtfText += GetFormattedBible(module);
+ /*
+ else if(!strcmp(module->Type(), "Commentaries"))
+ rtfText += GetFormattedComm(module);
+ else if(!strcmp(module->Type(), "Lexicons / Dictionaries"))
+ rtfText += GetFormattedLD(module);
+ else
+ rtfText += GetFormattedBook(module);
+ */
+ rtfText += "{ \\par }}";
+ RTFStream->Clear();
+ RTFStream->WriteBuffer(rtfText.c_str(), rtfText.Length());
+ RTFStream->Position = 0;
+ Lines->LoadFromStream(RTFStream);
+ delete RTFStream;
+
+ // clear HTML link tags
+ 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;
+}
+
+AnsiString TRxRichEditX::GetFormattedBible(SWModule* module)
+{
+ AnsiString rtfText = "";
+ VerseKey key;
+ int lastChap, lastBook;
+ AnsiString bookName;
+
+ key = (VerseKey)module->Key();
+ lastChap = key.Chapter();
+ lastBook = key.Book();
+ bookName = (AnsiString)key.getText();
+ bookName = bookName.SubString(0,bookName.Pos(lastChap) - 2);
+
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, bookName);
+
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, lastChap);
+
+ for ((*module) = TOP; !module->Error(); (*module)++){
+ key = (VerseKey)module->Key();
+ if(key.Book() != lastBook){
+ rtfText += "\\par\\par";
+ bookName = (AnsiString)key.getText();
+ bookName = bookName.SubString(0,bookName.Pos(key.Chapter()) - 2);
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, bookName);
+ lastBook = key.Book();
+ lastChap = -1; // Reset the last Chapter since we could jump from Jude 1 to Revelation 1
+ }
+ if(key.Chapter() != lastChap){
+ rtfText += "\\par";
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, key.Chapter());
+ lastChap = key.Chapter();
+ }
+ rtfText += PrintEntry(module, key.Verse());
+ }
+
+ return rtfText;
+}
+/*
+AnsiString TRxRichEditX::GetFormattedComm(SWModule* module)
+{
+ AnsiString rtfText = "";
+ VerseKey key;
+ int lastChap;
+ AnsiString lastBook;
+
+ key = (VerseKey)module->Key();
+ lastChap = key.Chapter();
+ lastBook = (AnsiString)key.Book();
+
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, lastChap);
+
+ for ((*module) = TOP; !module->Error(); (*module)++){
+ key = (VerseKey)module->Key();
+ if((AnsiString)key.Book() == lastBook){
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+ lastBook = key.Book();
+ }
+ if(key.Chapter() != lastChap){
+ rtfText += "\\par\\par";
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, key.Chapter());
+ lastChap = key.Chapter();
+ }
+ rtfText += PrintEntry(module, key.Verse());
+ }
+
+ return rtfText;
+}
+
+AnsiString TRxRichEditX::GetFormattedLD(SWModule* module)
+{
+ AnsiString rtfText = "";
+ VerseKey key;
+ int lastChap;
+ AnsiString lastBook;
+
+ key = (VerseKey)module->Key();
+ lastChap = key.Chapter();
+ lastBook = (AnsiString)key.Book();
+
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, lastChap);
+
+ for ((*module) = TOP; !module->Error(); (*module)++){
+ key = (VerseKey)module->Key();
+ if((AnsiString)key.Book() == lastBook){
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+ lastBook = key.Book();
+ }
+ if(key.Chapter() != lastChap){
+ rtfText += "\\par\\par";
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, key.Chapter());
+ lastChap = key.Chapter();
+ }
+ rtfText += PrintEntry(module, key.Verse());
+ }
+
+ return rtfText;
+}
+
+AnsiString TRxRichEditX::GetFormattedBook(SWModule* module)
+{
+ AnsiString rtfText = "";
+ VerseKey key;
+ int lastChap;
+ AnsiString lastBook;
+
+ key = (VerseKey)module->Key();
+ lastChap = key.Chapter();
+ lastBook = (AnsiString)key.Book();
+
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, lastChap);
+
+ for ((*module) = TOP; !module->Error(); (*module)++){
+ key = (VerseKey)module->Key();
+ if((AnsiString)key.Book() == lastBook){
+ rtfText += "\\par\\par";
+ if(format_ops.prBookHeadings)
+ rtfText += BookHeading(module, lastBook);
+ lastBook = key.Book();
+ }
+ if(key.Chapter() != lastChap){
+ rtfText += "\\par\\par";
+ if(format_ops.prChHeadings)
+ rtfText += ChapterHeading(module, key.Chapter());
+ lastChap = key.Chapter();
+ }
+ rtfText += PrintEntry(module, key.Verse());
+ }
+
+ return rtfText;
+}
+*/
+AnsiString TRxRichEditX::PrintEntry(SWModule* module, int nVerse)
+{
+ AnsiString rtfText = "";
+ if (module->Direction() == DIRECTION_RTL) {
+ rtfText += "\\qr ";
+ }else
+ rtfText += "\\ql ";
+ if (module->Direction() == DIRECTION_RTL && (platformID == WINNT && (!strnicmp(module->Lang(), "he", 2) || !strnicmp(module->Lang(), "ar", 2)))) {
+ rtfText = rtfText + "\\rtlpar ";
+ }
+
+ if(!format_ops.paragraph)
+ rtfText += "\\par";
+ if(format_ops.prPreFix)
+ rtfText += PrintFix(module) + (AnsiString)" ";
+
+ if(format_ops.prVerseNum){
+ rtfText += (AnsiString)"{\\fs" + format_ops.vsNumFontSize;
+ if(format_ops.superVSNum)
+ rtfText += "\\super ";
+ else rtfText += " ";
+ rtfText += IntToStr(nVerse);
+ rtfText += " }";
+ }
+ rtfText += (AnsiString)"{\\fs" + format_ops.bodyFontSize + (AnsiString)" ";
+ rtfText += module->RenderText();
+ rtfText += " }";
+ if(format_ops.prPostFix)
+ rtfText += (AnsiString)" " + PrintFix(module);
+
+ return rtfText;
+}
+
+AnsiString TRxRichEditX::ChapterHeading(SWModule* module, int nChapter)
+{
+ AnsiString rtfText = "";
+ rtfText += (AnsiString)" \\qc{\\f1\\cf7\\fs" + format_ops.bkFontHeadSize + (AnsiString)"\\b ";
+ rtfText += _tr("Chapter");
+ rtfText += " ";
+ rtfText += IntToStr(nChapter);
+ rtfText += "\\par\\par}";
+ return rtfText;
+}
+
+AnsiString TRxRichEditX::BookHeading(SWModule* module, AnsiString name)
+{
+ AnsiString rtfText = "";
+ rtfText += (AnsiString)" \\qc{\\f1\\cf7\\fs" + format_ops.bkFontHeadSize + (AnsiString)"\\b\\ul ";
+ rtfText += name;
+ rtfText += "\\par\\par}";
+ return rtfText;
+}
+
+
+AnsiString TRxRichEditX::PrintFix(SWModule* module)
+{
+ AnsiString rtfText = "";
+ rtfText += (AnsiString)"{\\fs" + format_ops.vsNumFontSize;
+ rtfText += (AnsiString)"(" + (AnsiString)module->KeyText() + (AnsiString)" " + (AnsiString)module->Name() + (AnsiString)")}";
+ return rtfText;
+}
+
+
+int TRxRichEditX::paintTo(HDC hdc, TRect *size, int margin) {
+ TFormatRange Range;
+ int LastChar, MaxLen, LogX, LogY, OldMap;
+ TRect SaveRect;
+ TGetTextLengthEx TextLenEx;
+ bool calcBestSize = (size) ? IsRectEmpty(size): true;
+ TRect trySizeRect[] = {
+ TRect(0, 0, 200, 50),
+ TRect(0, 0, 200, 100),
+ TRect(0, 0, 250, 100),
+ TRect(0, 0, 300, 50),
+ TRect(0, 0, 300, 100),
+ TRect(0, 0, 350, 100),
+ TRect(0, 0, 400, 50),
+ TRect(0, 0, 400, 100),
+ TRect(0, 0, 400, 150),
+ TRect(0, 0, 400, 200),
+ TRect(0, 0, 500, 100),
+ TRect(0, 0, 500, 150),
+ TRect(0, 0, 500, 200),
+ TRect(0, 0, 500, 250),
+ TRect(0, 0, 550, 300),
+ TRect(0, 0, 550, 350),
+ TRect(0, 0, 0, 0)
+ };
+ int trySize = 0;
+ TRect *dispSize = size;
+
+ LogX = GetDeviceCaps(hdc, LOGPIXELSX);
+ LogY = GetDeviceCaps(hdc, LOGPIXELSY);
+
+ do {
+
+ if (calcBestSize) {
+ dispSize = &trySizeRect[trySize++];
+ if (IsRectEmpty(dispSize)) {
+ dispSize = &trySizeRect[trySize-2];
+ break;
+ }
+ }
+
+ memset(&Range, 0, sizeof(TFormatRange));
+ // with Printer, Range do begin
+ Range.hdc = hdc;
+ Range.hdcTarget = Range.hdc;
+// if (IsRectEmpty(&PageRect)) {
+// Range.rc.right = dispSize->Right * 1440 / LogX;
+// Range.rc.bottom = dispSize->Bottom * 1440 / LogY;
+// }
+// else {
+ Range.rc.left = (dispSize->Left + margin) * 1440 / LogX;
+ Range.rc.top = (dispSize->Top + margin) * 1440 / LogY;
+ Range.rc.right = dispSize->Right * 1440 / LogX;
+ Range.rc.bottom = (dispSize->Bottom)* 1440 / LogY;
+// }
+ Range.rcPage = Range.rc;
+ SaveRect = Range.rc;
+// Range.rcPage.top = Range.rcPage.top + (5 * 1440) / LogY;
+// Range.rcPage.bottom = Range.rcPage.bottom + (5 * 1440) / LogY;
+ LastChar = 0;
+ if (RichEditVersion >= 2) {
+ // with TextLenEx do begin
+ TextLenEx.flags = GTL_DEFAULT;
+ TextLenEx.codepage = CP_ACP;
+ MaxLen = Perform(EM_GETTEXTLENGTHEX, (WPARAM)&TextLenEx, 0);
+ }
+ else MaxLen = GetTextLen();
+ Range.chrg.cpMax = -1;
+ // { ensure printer DC is in text map mode }
+ OldMap = SetMapMode(hdc, MM_TEXT);
+ SendMessage(Handle, EM_FORMATRANGE, 0, 0); // { flush buffer }
+ try {
+ Range.rc = SaveRect;
+ Range.chrg.cpMin = LastChar;
+ LastChar = SendMessage(Handle, EM_FORMATRANGE, 1, Longint(&Range));
+// if ((LastChar < MaxLen) && (LastChar != -1)) ;//NewPage();
+ // } while ((LastChar >= MaxLen) || (LastChar = -1));
+ }
+ __finally {
+ SendMessage(Handle, EM_FORMATRANGE, 0, 0);// { flush buffer }
+ SetMapMode(hdc, OldMap); // { restore previous map mode }
+ }
+ LastChar = (LastChar < 0) ? 0: MaxLen - LastChar;
+ LastChar = (LastChar < 0) ? 0: LastChar;
+ } while (LastChar && calcBestSize);
+
+ if (calcBestSize && size)
+ *size = *dispSize;
+
+ return LastChar;
+}
+
+
+void TRxRichEditX::fillWithRTFString(SWModule *module, const char *text, const char *type) {
+
+ TMemoryStream *RTFStream = new TMemoryStream();
+ System::AnsiString newtext, tmptext;
+
+ this->module = module;
+ this->type = type;
+ recalcAppearance();
+
+ newtext = RTFHeader;
+ newtext += RTFHeadMargin;
+ newtext += "\\pard \\nowidctlpar \\cf7\\f0 ";
+
+ newtext += "{";
+
+ tmptext = "";
+ for (const char *loop = text; *loop; loop++) {
+ if (*loop == '\n') {
+ tmptext += "\\par ";
+ }
+ else tmptext += *loop;
+ }
+ newtext += RTFVersePre + tmptext + RTFVersePost;
+ newtext += "}";
+
+ newtext += RTFTrailer;
+
+ RTFStream->Clear();
+ RTFStream->WriteBuffer(newtext.c_str(), newtext.Length());
+ RTFStream->Position = 0;
+ Lines->LoadFromStream(RTFStream);
+ Repaint();
+
+ delete RTFStream;
+}
+
+
+void TRxRichEditX::fillWithVerses(SWModule *module, ListKey *verses, bool heading, bool verseNum, const char *type, bool stripNewlines) {
+ string fontname;
+ TMemoryStream *RTFStream = new TMemoryStream();
+ System::AnsiString newtext, tmptext;
+
+ this->module = module;
+ this->type = type;
+ recalcAppearance();
+
+ newtext = RTFHeader;
+
+ newtext += RTFHeadMargin;
+// newtext += "\\pard\\nowidctlpar\\cf7\\f0 ";
+
+ if (module->Direction() == DIRECTION_RTL) {
+ newtext += "\\qr ";
+ }
+ if (module->Direction() == DIRECTION_RTL && (platformID == WINNT && (!strnicmp(module->Lang(), "he", 2) || !strnicmp(module->Lang(), "ar", 2)))) {
+ newtext += "\\rtlpar ";
+ }
+
+ verses->Persist(1);
+ SWKey *saveKey = (*module);
+ if (!saveKey->Persist())
+ saveKey = 0;
+ module->SetKey(verses);
+
+ SWKey *lastKey = 0;
+ bool first = true;
+ while (!module->Error() && newtext.Length() < 10000 ) {
+ SWKey *testKey = verses->GetElement();
+ VerseKey *element = SWDYNAMIC_CAST(VerseKey, testKey);
+ if (heading) {
+ if (element) {
+ if (lastKey != element) {
+ if (!first)
+ newtext += "\\par\\par ";
+ newtext += RTFHeadingPre;
+ newtext += ((string(element->LowerBound()) + " - " + string(element->UpperBound())).c_str());
+ newtext += ":";
+ newtext += RTFHeadingPost;
+ newtext += "\\par ";
+ }
+ }
+ else {
+ if (!first)
+ newtext += "\\par\\par ";
+ newtext += RTFHeadingPre;
+ newtext += module->KeyText();
+ newtext += ":";
+ newtext += RTFHeadingPost;
+ newtext += "\\par ";
+ }
+// newtext += RTFHeadingPost;
+ }
+ else { // hack to make searchlist entries fit in box better
+ newtext += "";
+ }
+ lastKey = element;
+ first = false;
+
+ newtext = newtext + "{";
+
+ tmptext = "";
+ for (const char *loop = (const char *)*module; *loop; loop++) {
+ if (stripNewlines) {
+ if (!strnicmp(loop, "\\par", 4)) {
+ loop += (loop[4] == 'd') ? 4 : 3;
+ continue;
+ }
+ }
+ if (*loop == '\n') {
+ if (!stripNewlines)
+ tmptext += "\\par ";
+ }
+ else tmptext += *loop;
+
+ }
+
+ if (tmptext.Length() > 3) { // make sure we have an entry
+ if (module->Direction() == DIRECTION_RTL && (SWDispRTFChap::platformID == WIN9X || (module->Lang() && strnicmp(module->Lang(), "he", 2) && strnicmp(module->Lang(), "ar", 2)))) {
+ newtext = newtext + RTFVersePre + tmptext + RTFVersePost;
+ if (verseNum)
+ newtext = newtext + RTFVerseMarkPre + IntToStr(VerseKey(module->KeyText()).Verse()) + RTFVerseMarkPost;
+ newtext = newtext + "\\par ";
+ }
+ else {
+ if (verseNum)
+ newtext = newtext + RTFVerseMarkPre + IntToStr(VerseKey(module->KeyText()).Verse()) + RTFVerseMarkPost;
+ newtext = newtext + RTFVersePre + tmptext + RTFVersePost;
+ }
+ }
+ newtext = newtext + "}";
+ (*module)++;
+ }
+
+ if (saveKey)
+ module->SetKey(saveKey);
+
+ newtext += RTFTrailer;
+
+ RTFStream->Clear();
+ RTFStream->WriteBuffer(newtext.c_str(), newtext.Length());
+ RTFStream->Position = 0;
+ Lines->LoadFromStream(RTFStream);
+ Repaint();
+
+ delete RTFStream;
+}
+
+
+
+void TRxRichEditX::getDisplayPrefs(DISP_ATTRIBS *attribs, SWModule *module /*, const char *type*/) {
+
+
+ string keyBackColor = (string)getType().c_str() + "BackColor";
+ string backColor = Form1->optionsconf->Sections["Appearance"][keyBackColor];
+ // This portion of the code sets the default values (If needed) of the background
+ // for either typical windows or for popup windows
+ if (backColor == "") {
+ if (getType() == "Popup") {
+ attribs->backColor = 14680063;
+ }
+ else attribs->backColor = clWindow;
+ }
+ else attribs->backColor = StrToInt((AnsiString)backColor.c_str());
+
+ string keyFontColor = (string)getType().c_str() + "FontColor";
+ string fontColor = Form1->optionsconf->Sections["Appearance"][keyFontColor];
+ // This portion of the code sets the default values (If needed) of the background
+ // for either typical windows or for popup windows
+ if (backColor == "") {
+ attribs->fontColor = clBlack;
+ }
+ else attribs->fontColor = StrToInt((AnsiString)fontColor.c_str());
+
+ // If the module uses it's own font load that else we will try the config file else we will use the default
+ ConfigEntMap::const_iterator eit = module->getConfig().find("Font");
+ if (eit != module->getConfig().end())
+ attribs->fontName = (*eit).second.c_str();
+ else {
+ string keyFontName = (string)getType().c_str() + "FontName";
+ attribs->fontName = (AnsiString)Form1->optionsconf->Sections["Appearance"][keyFontName].c_str();
+ }
+ // If we still have no name we will set it to a default value
+ if (attribs->fontName == "")
+ attribs->fontName = "MS Sans Serif";
+
+ string keyFontSize = (string)getType().c_str() + "FontSize";
+ string fontSize = Form1->optionsconf->Sections["Appearance"][keyFontSize];
+ if (fontSize == "")
+ attribs->fontSize = 10;
+ else attribs->fontSize = StrToInt((AnsiString)fontSize.c_str());
+
+ string entryColor = Form1->optionsconf->Sections["Appearance"]["CurrentVSColor"];
+ if (entryColor == "")
+ attribs->entryKeyColor = clBlue;
+ else attribs->entryKeyColor = StrToInt((AnsiString)entryColor.c_str());
+
+ string morphColor = Form1->optionsconf->Sections["Appearance"]["MorphColor"];
+ if (morphColor == "")
+ attribs->morphColor = clBlue;
+ else attribs->morphColor = StrToInt((AnsiString)morphColor.c_str());
+
+ string strongColor = Form1->optionsconf->Sections["Appearance"]["StrongsColor"];
+ if (strongColor == "")
+ attribs->strongsColor = clBlue;
+ else attribs->strongsColor = StrToInt((AnsiString)strongColor.c_str());
+
+ string fieldColor = Form1->optionsconf->Sections["Appearance"]["FieldColor"];
+ if (fieldColor == "")
+ attribs->lookupFieldColor = clBlue;
+ else attribs->lookupFieldColor = StrToInt((AnsiString)fieldColor.c_str());
+
+ string autoVSColor = Form1->optionsconf->Sections["Appearance"]["AutoVSColor"];
+ if (autoVSColor == "")
+ attribs->markCurrentVerse = true;
+ else attribs->markCurrentVerse = (atoi(autoVSColor.c_str())) ? true : false;
+}
+
+
+void TRxRichEditX::recalcAppearance() {
+
+ char buf[4096];
+
+ getDisplayPrefs(&dispAttribs, module /*, type.c_str()*/);
+
+ Color = dispAttribs.backColor;
+ Font->Name = dispAttribs.fontName;
+ Font->Size = dispAttribs.fontSize;
+
+ RTFHeadMargin = "{\\cf1\\pard}";
+ RTFVerseMarkPost = "}";
+ RTFVersePost = " }";
+
+ buildRTFHeader();
+
+ // build headers with proportional font sizes to single user selected
+ // font size.
+ double fontBase = dispAttribs.fontSize;
+ fontBase /= 4.0;
+
+ sprintf(buf,
+ "{\\fs%d \\par }}",
+ (int)(fontBase * 8));
+ RTFTrailer = buf;
+
+ const char *chap = _tr("Chapter");
+ sprintf(buf,
+ "\\pard \\qc\\nowidctlpar{\\f1\\cf7\\fs%d\\b %s ",
+ (int)(fontBase * 10), chap);
+ RTFChapterMarkPre = buf;
+
+ sprintf(buf,
+ "\\par\\fs%d\\par}",
+ (int)(fontBase * 4));
+ RTFChapterMarkPost = buf;
+
+ sprintf(buf,
+ "{\\fs%d\\cf1\\b ",
+ (int)(fontBase * 7));
+ RTFHeadingPre = buf;
+ RTFHeadingPost = "}";
+ sprintf(buf,
+ "{\\fs%d\\cf1\\super ",
+ (int)(fontBase * 7));
+ RTFVerseMarkPre = buf;
+
+ sprintf(buf,
+ "{\\fs%d\\cf7 ",
+ (int)(fontBase * 8));
+ RTFVersePre = buf;
+}
+
+
+void TRxRichEditX::TColorToRGB(const TColor& color, int& red, int& green, int& blue) {
+ red = (color & 0xFF);
+ green = ((color >> 8) & 0xFF);
+ blue =((color >> 16) & 0xFF);
+}
+
+void TRxRichEditX::buildRTFHeader() {
+ char buf1[1024], buf2[1024];
+ SectionMap::iterator sit;
+ string value;
+ ConfigEntMap::iterator entry;
+ int CurrVSRed, CurrVSGreen, CurrVSBlue, BodyRed, BodyGreen, BodyBlue,
+ VSNumRed, VSNumGreen, VSNumBlue, MorphRed, MorphGreen, MorphBlue,
+ StrongsRed, StrongsGreen, StrongsBlue;
+ TColor CurrVSColor, VSNumColor, BodyColor, MorphColor, StrongsColor;
+
+ sprintf(buf1, "{\\rtf1\\ansi");
+ if (dispAttribs.fontName.Length()) {
+ // Font Table
+ // 0: Text Body
+ sprintf(buf2, "{\\fonttbl{\\f0\\fdecor\\fprq2 %s;}" , dispAttribs.fontName.c_str());
+ strcat(buf1, buf2);
+ // 1: Chapter Heading
+ sprintf(buf2, "{\\f1\\froman\\fcharset0\\fprq2 %s;}", dispAttribs.fontName.c_str());
+ strcat(buf1, buf2);
+ // 2: Unknown
+ sprintf(buf2, "{\\f2\\froman\\fcharset0\\fprq2 %s;}", dispAttribs.fontName.c_str());
+ strcat(buf1, buf2);
+ // 3: Unknown
+ sprintf(buf2, "{\\f3\\froman\\fcharset0\\fprq2 %s;}", dispAttribs.fontName.c_str());
+ strcat(buf1, buf2);
+ // 4: Unknown
+ sprintf(buf2, "{\\f4\\froman\\fcharset0\\fprq2 %s;}", dispAttribs.fontName.c_str());
+ strcat(buf1, buf2);
+ // 7, 8: Unknown
+ strcat(buf1, "{\\f7\\froman\\fcharset2\\fprq2 Symbol;}{\\f8\\froman\\fcharset2\\fprq2 Symbol;}}");
+ }
+ else {
+ sprintf(buf2, "{\\fonttbl{\\f0\\fdecor\\fprq2 Times New Roman;}{\\f1\\froman\\fcharset0\\fprq2 Times New Roman;}{\\f7\\froman\\fcharset2\\fprq2 Symbol;}{\\f8\\froman\\fcharset2\\fprq2 Symbol;}}");
+ strcat(buf1, buf2);
+ }
+
+ if ((sit = Form1->optionsconf->Sections.find("Appearance")) != Form1->optionsconf->Sections.end()) {
+ ConfigEntMap &section = (*sit).second;
+
+ CurrVSColor = TColor((((entry = section.find("CurrentVSColor")) != section.end()) ? atoi((*entry).second.c_str()) : 16711680));
+ TColorToRGB(CurrVSColor, CurrVSRed, CurrVSGreen, CurrVSBlue);
+
+ VSNumColor = TColor((((entry = section.find("VSNumberColor")) != section.end()) ? atoi((*entry).second.c_str()) : 0));
+ TColorToRGB(VSNumColor, VSNumRed, VSNumGreen, VSNumBlue);
+
+ StrongsColor = TColor((((entry = section.find("StrongsColor")) != section.end()) ? atoi((*entry).second.c_str()) : 16711935));
+ TColorToRGB(StrongsColor, StrongsRed, StrongsGreen, StrongsBlue);
+
+ MorphColor = TColor((((entry = section.find("MorphColor")) != section.end()) ? atoi((*entry).second.c_str()) : 60534));
+ TColorToRGB(MorphColor, MorphRed, MorphGreen, MorphBlue);
+
+ if (getType() == "Text") {
+ BodyColor = TColor((((entry = section.find("TextFontColor")) != section.end()) ? atoi((*entry).second.c_str()) : 0));
+ TColorToRGB(BodyColor, BodyRed, BodyGreen, BodyBlue);
+ }
+ else if (getType() == "Comment") {
+ BodyColor = TColor((((entry = section.find("CommentFontColor")) != section.end()) ? atoi((*entry).second.c_str()) : 0));
+ TColorToRGB(BodyColor, BodyRed, BodyGreen, BodyBlue);
+ }
+ else if (getType()== "LD") {
+ BodyColor = TColor((((entry = section.find("LDFontColor")) != section.end()) ? atoi((*entry).second.c_str()) : 0));
+ TColorToRGB(BodyColor, BodyRed, BodyGreen, BodyBlue);
+ }
+ else if (getType() == "Popup") {
+ BodyColor = TColor((((entry = section.find("PopupFontColor")) != section.end()) ? atoi((*entry).second.c_str()) : 0));
+ TColorToRGB(BodyColor, BodyRed, BodyGreen, BodyBlue);
+ }
+ else {
+ BodyRed = 0;
+ BodyGreen = 0;
+ BodyBlue = 0;
+ }
+
+ // Color Table:
+ // 1: Verse Number/ Verse info
+ sprintf(buf2, "{\\colortbl;\\red%d\\green%d\\blue%d;" , VSNumRed, VSNumGreen, VSNumBlue);
+ strcat(buf1, buf2);
+ // 2: Current Verse Color
+ sprintf(buf2, "\\red%d\\green%d\\blue%d;", CurrVSRed, CurrVSGreen, CurrVSBlue);
+ strcat(buf1, buf2);
+ // 3: Strong's Def
+ sprintf(buf2, "\\red%d\\green%d\\blue%d;", StrongsRed, StrongsGreen, StrongsBlue);
+ strcat(buf1, buf2);
+ // 4: Strongs' Tense (Morph)
+ sprintf(buf2, "\\red%d\\green%d\\blue%d;", MorphRed, MorphGreen, MorphBlue);
+ strcat(buf1, buf2);
+ // 5: Unknown
+ strcat(buf1, "\\red0\\green0\\blue255;");
+ // 6: Unknown
+ strcat(buf1, "\\red255\\green0\\blue0;");
+ // 7: Verse/Body Text Color
+ sprintf(buf2, "\\red%d\\green%d\\blue%d;}",BodyRed, BodyGreen, BodyBlue);
+ strcat(buf1, buf2);
+ }
+ else {
+ sprintf(buf2, "{\\colortbl;\\red0\\green0\\blue255;\\red0\\green200\\blue50;\\red0\\green0\\blue255;\\red0\\green200\\blue50;\\red0\\green0\\blue255;\\red255\\green0\\blue0;\\red0\\green\\blue0;\\red0\\green\\blue0;\\red0\\green\\blue0;}");
+ strcat(buf1, buf2);
+ }
+ RTFHeader = buf1;
+}
+
+
+AnsiString TRxRichEditX::getType() {
+ AnsiString retVal;
+ if (!strcmp(type.c_str(), "Default")) {
+ if (!strcmp(module->Type(), "Biblical Texts"))
+ retVal = "Text";
+ if ((!strcmp(module->Type(), "Commentaries")) ||
+ (!strcmp(module->Type(), "Generic Books")))
+ retVal = "Comment";
+ if (!strcmp(module->Type(), "Lexicons / Dictionaries"))
+ retVal = "LD";
+ }
+ else retVal = type;
+
+ return retVal;
+}
+
+
+WideString __fastcall TRxRichEditX::GetText() {
+ int MaxLen;
+
+ if (RichEditVersion >= 2) {
+ TGetTextLengthEx TextLenEx;
+ // with TextLenEx do begin
+ TextLenEx.flags = GTL_DEFAULT;
+ TextLenEx.codepage = 1200;
+ MaxLen = Perform(EM_GETTEXTLENGTHEX, (WPARAM)&TextLenEx, 0);
+ }
+ else MaxLen = GetTextLen();
+ wchar_t *buf = new wchar_t [ MaxLen + 2 ];
+ GETTEXTEX params;
+ params.cb = (MaxLen + 1) * sizeof(wchar_t);
+ params.flags = GT_DEFAULT;
+ params.codepage = 1200; //CP_ACP;
+ params.lpDefaultChar = 0;
+ params.lpUsedDefChar = 0;
+
+ LONG lResult;
+ lResult = SendMessage(Handle, EM_GETTEXTEX, (WPARAM)&params, (LPARAM)buf);
+ WideString Result = buf;
+ delete [] buf;
+ return Result;
+}
+
+
+
+
+WideString __fastcall TRxRichEditX::GetTextRange(int StartPos, int EndPos) {
+
+ WideString Result = GetText();
+
+ Result = Result.SubString(StartPos+1, (EndPos - StartPos));
+ return Result;
+}
+
+
+WideString TRxRichEditX::Trim(WideString &src) {
+ WideString Result = src;
+ int length = Result.Length();
+ int start = 1;
+ while (length) {
+ if (Result[length] != ' ')
+ break;
+ Result.SetLength(--length);
+ }
+ while (start < length) {
+ if (Result[start] != ' ')
+ break;
+ start++;
+ }
+ if (start > 1)
+ Result = Result.SubString(start, length - start);
+ return Result;
+}
+
+
+WideString __fastcall TRxRichEditX::WordAtCursor(void) {
+
+ TCharRange Range;
+ WideString Result = "";
+
+ if (HandleAllocated()) {
+ Range.cpMax = SelStart;
+ if (!Range.cpMax)
+ Range.cpMin = 0;
+ else if (SendMessage(Handle, EM_FINDWORDBREAK, WB_ISDELIMITER, Range.cpMax))
+ Range.cpMin = SendMessage(Handle, EM_FINDWORDBREAK, WB_MOVEWORDLEFT, Range.cpMax);
+ else Range.cpMin = SendMessage(Handle, EM_FINDWORDBREAK, WB_LEFT, Range.cpMax);
+ while (SendMessage(Handle, EM_FINDWORDBREAK, WB_ISDELIMITER, Range.cpMin))
+ Range.cpMin++;
+ Range.cpMax = SendMessage(Handle, EM_FINDWORDBREAK, WB_RIGHTBREAK, Range.cpMax);
+ Result = Trim(GetTextRange(Range.cpMin, Range.cpMax));
+ }
+ return Result;
+}
+