aboutsummaryrefslogtreecommitdiffstats
path: root/apps/windoze/swdisprtf.cpp
blob: 3a725af81263eefda4fa24d01fa5606607b8f9d6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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;
}

//---------------------------------------------------------------------------