aboutsummaryrefslogtreecommitdiffstats
path: root/apps/windoze/swdisprtf.cpp
blob: 64429f3bbccda2bc48f5a73bd7a7326362866e59 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//---------------------------------------------------------------------------
#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;
	}
	//{ Position control text at current verse }
	SelStart = 0;
/*
	if (Visible) {
		TComponent *owner = this->Owner;
		TForm *parentForm = dynamic_cast<TForm *>(owner);
		TWinControl *focus = 0;
		
		if (parentForm)
			focus = parentForm->ActiveControl;
		this->SetFocus();
		SelStart = 0;
		SelLength = 0;
		SendMessage(Handle, EM_SCROLLCARET, 0, 0);
		if (focus)
			focus->SetFocus();
	}
*/
	SelLength = 0;
	SendMessage(Handle, EM_SCROLLCARET, 0, 0);

	return 0;
}

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