aboutsummaryrefslogblamecommitdiffstats
path: root/apps/windoze/swdisprtf.cpp
blob: 64429f3bbccda2bc48f5a73bd7a7326362866e59 (plain) (tree)





































































                                                                                                    
                                                                              



                                       
                                                                 




























                                                                                            
                                                    
                     















                                                                 
                      
                                                  






                                                                             
//---------------------------------------------------------------------------
#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;
}

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