#include "Browser.h"


struct TopicLinkDlg : WithTopicLinkLayout<TopWindow> {
	void   Package();
	void   Group();
	void   Topic();
	void   Label();
	String LinkString();
	String ActualDir();

	Vector<String>& packagedir;

	typedef TopicLinkDlg CLASSNAME;
	TopicLinkDlg(Vector<String>& packagedir, FileList& _package);
};

TopicLinkDlg::TopicLinkDlg(Vector<String>& packagedir, FileList& _package)
: packagedir(packagedir)
{
	CtrlLayoutOKCancel(*this, "Hyperlink");
	package.WhenKillCursor = package.WhenEnterItem = THISBACK(Package);
	group.WhenKillCursor = group.WhenEnterItem = THISBACK(Group);
	topic.WhenKillCursor = topic.WhenEnterItem = THISBACK(Topic);
	label.WhenKillCursor = label.WhenEnterItem = THISBACK(Label);
	for(int i = 0; i < _package.GetCount(); i++)
		package.Add(_package[i].name);
	package.SetCursor(0);
	package.FindSetCursor(_package.GetCurrentName());
	insert <<= Breaker(IDYES);
}

void TopicLinkDlg::Package()
{
	String pg = group.GetCurrentName();
	group.Clear();
	if(!package.IsCursor())
		return;
	LoadGroups(group, packagedir[package.GetCursor()]);
	topic.Clear();
	group.FindSetCursor(pg);
}

void TopicLinkDlg::Group()
{
	topic.Clear();
	if(package.IsCursor() && group.IsCursor())
		LoadTopics(topic, AppendFileName(packagedir[package.GetCursor()], group.GetCurrentName() + ".tpp"));
}

String TopicLinkDlg::LinkString()
{
	return "topic://" + (String)package.GetCurrentName() + '/' + (String)group.GetCurrentName()
	       + '/' + (String)topic.GetCurrentName();
}

void TopicLinkDlg::Topic()
{
	if(package.IsCursor() && group.IsCursor() && topic.IsCursor()) {
		link <<= LinkString();
		RichText txt = ParseQTF(ReadTopic(LoadFile(
						NormalizePath(
							AppendFileName(AppendFileName(packagedir[package.GetCursor()],
								                          group.GetCurrentName() + ".tpp"),
		        			               topic.GetCurrentName() + ".tpp")
		               ))).text);
		Vector<String> ref = GatherLabels(txt);
		label.Clear();
		for(int i = 0; i < ref.GetCount(); i++)
			label.Add(ref[i]);
	}
}

void TopicLinkDlg::Label()
{
	if(package.IsCursor() && group.IsCursor() && topic.IsCursor() && label.IsCursor())
		link <<= LinkString() + '#' + label.GetCurrentName();
}

void TopicEditor::Hyperlink(String& link, WString& text)
{
	TopicLinkDlg d(packagedir, package);
	d.link <<= link;
	String label;
	TopicLink tl;
	int q = link.ReverseFind('#');
	if(q >= 0) {
		label = link.Mid(q + 1);
		tl = ParseTopicLink(link.Mid(0, q));
	}
	else
		tl = ParseTopicLink(link);
	if(IsNull(tl.topic)) {
		d.package.FindSetCursor(package.GetCurrentName()) &&
		d.group.FindSetCursor(group.GetCurrentName()) &&
		d.topic.FindSetCursor(topic.GetCurrentName());
	}
	else {
		d.package.FindSetCursor(tl.package) &&
		d.group.FindSetCursor(tl.group) &&
		d.topic.FindSetCursor(tl.topic) &&
		d.label.FindSetCursor(label);
	}
	int c = d.Run();
	if(c == IDCANCEL)
		return;
	link = ~d.link;
	if(c == IDOK)
		return;
	if(d.topic.IsCursor()) {
		String fn = AppendFileName(
				                   AppendFileName(d.packagedir[d.package.GetCursor()],
				                                  d.group.GetCurrentName() + ".tpp"),
		                           d.topic.GetCurrentName() + ".tpp");
		text = ReadTopic(LoadFile(fn)).title.ToWString();
	}
}


syntax highlighted by Code2HTML, v. 0.9.1