aboutsummaryrefslogblamecommitdiffstats
path: root/apps/windoze/CBuilder5/BibleCS/bookmarkfrm.cpp
blob: edbbc243aae020f1c74822f8fc1f6838b502294b (plain) (tree)





































































































































































                                                                                                                                                                                                                            
                                            





















































                                                                                                                                                                                                          
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "bookmarkfrm.h"
#include <swconfig.h>
#include <dirent.h>
#include "mainfrm.h"
#include "newbmfilefrm.h"
#include <io.h>
#include <dir.h>

//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TbookmarkForm *bookmarkForm;
//---------------------------------------------------------------------------
__fastcall TbookmarkForm::TbookmarkForm(TComponent* Owner)
	: TForm(Owner)
{
	SWConfig *bookmarks;
	SectionMap::iterator sit;
	ConfigEntMap::iterator eit;
	TTreeNode *node;
	
	DIR *dir;
	struct dirent *ent;
	string conffile;
	bmdir = "";
	
	bmtree->Items->Clear();

	if ((sit = Form1->optionsconf->Sections.find("Bookmarks")) != Form1->optionsconf->Sections.end())
		bmdir = ((eit = (*sit).second.find("Directory")) != (*sit).second.end()) ? (*eit).second : (string)"";
		
//	Add Personal Bookmarks first, or if they don't exist, ADD A BLANK BRANCH first in the tree
//	--------------------------------------------------------------------------

	if (bmdir == "")
		bmdir = "./bookmarks/";
	
	if (access(bmdir.c_str(), 0)) {		// directory does not exist
		_mkdir(bmdir.c_str());
	}
		
	conffile = bmdir + "personal.conf";
	bookmarks = new SWConfig(conffile.c_str());
	if ((sit = bookmarks->Sections.find("ROOT")) != bookmarks->Sections.end()) {
		if ((eit = (*sit).second.begin()) != (*sit).second.end()) {
			node = bmtree->Items->AddObject(bmtree->Selected, (*eit).second.c_str(), *bmfiles.insert(bmfiles.begin(), new String(conffile.c_str())));
			AddSection(bookmarks, bmtree, node, (*eit).first.c_str());
		}
	}
	else	bmtree->Items->AddObject(bmtree->Selected, "Personal Bookmarks", *bmfiles.insert(bmfiles.begin(), new String(conffile.c_str())));
	delete bookmarks;
//	--------------------------------------------------------------------------

//	Add all other bookmark files ---------------------------------------------
	if (dir = opendir(bmdir.c_str())) {
		rewinddir(dir);
		while ((ent = readdir(dir))) {
			if ((strcmp(ent->d_name, "personal.conf")) && (strcmp(ent->d_name, "."))&& (strcmp(ent->d_name, ".."))) {
				conffile = bmdir;
				conffile += ent->d_name;
				bookmarks = new SWConfig(conffile.c_str());
				if ((sit = bookmarks->Sections.find("ROOT")) != bookmarks->Sections.end()) {
					if ((eit = (*sit).second.begin()) != (*sit).second.end()) {	// Currently supports only ONE topsection per file because on save, each topsection designates which file to rewrite
						node = bmtree->Items->AddObject(bmtree->Selected, (*eit).second.c_str(), *bmfiles.insert(bmfiles.begin(), new String(conffile.c_str())));
						AddSection(bookmarks, bmtree, node, (*eit).first.c_str());
					}
				}
				delete bookmarks;
			}
		}
		closedir(dir);
	}
}


__fastcall TbookmarkForm::~TbookmarkForm() {
	list <String *>::iterator it;

	SaveBookmarks();

	for (it = bmfiles.begin(); it != bmfiles.end(); it++)
		delete *it;
}


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

void TbookmarkForm::AddSection(SWConfig *config, TTreeView *tree, TTreeNode *parent, String section)
{
	SectionMap::iterator sit;
	ConfigEntMap::iterator eit;
	TTreeNode *node;
	
	if ((sit = config->Sections.find(section.c_str())) != config->Sections.end()) {
		for (eit = (*sit).second.begin(); eit != (*sit).second.end(); eit++) {
			node = tree->Items->AddChild(parent, (*eit).second.c_str());
			AddSection(config, tree, node, (*eit).first.c_str());
		}
	}
}


void __fastcall TbookmarkForm::bmtreeDragDrop(TObject *Sender, TObject *Source,
	int X, int Y)
{
	bmtree->Selected->MoveTo(bmtree->DropTarget, naAddChildFirst);
}
//---------------------------------------------------------------------------
void __fastcall TbookmarkForm::bmtreeDragOver(TObject *Sender, TObject *Source,
	int X, int Y, TDragState State, bool &Accept)
{
	Accept = false;
	
	if (String(Source->ClassName()) == "TTreeView") {
		if (Source == bmtree) {
			if (bmtree->Selected->Data) {
				if (strcmp((*(String*)(bmtree->Selected->Data)).c_str(),(bmdir + "personal.conf").c_str())) {
					Accept = true;
				}
			}
			else	Accept = true;
		}
	}
}
//---------------------------------------------------------------------------
void __fastcall TbookmarkForm::bmtreeDblClick(TObject *Sender)
{
	if (!bmtree->Selected->getFirstChild()) {
		*(Form1->DefaultVSKey) = bmtree->Selected->Text.c_str();	
		Form1->TextKeyChanged();
	}
	
}
//---------------------------------------------------------------------------
void __fastcall TbookmarkForm::AddChild1Click(TObject *Sender)
{
	bmtree->Selected->Expand(false);
	bmtree->Items->AddChildFirst(bmtree->Selected, "New Topic")->EditText();	
}
//---------------------------------------------------------------------------
void __fastcall TbookmarkForm::Delete1Click(TObject *Sender)
{
	if (bmtree->Selected->Data) {
		if (strcmp((*(String*)(bmtree->Selected->Data)).c_str(),(bmdir + "personal.conf").c_str())) {
			bmtree->Selected->Delete();
		}
	}
	else	bmtree->Selected->Delete();
}
//---------------------------------------------------------------------------
void __fastcall TbookmarkForm::Rename1Click(TObject *Sender)
{
	bmtree->Selected->EditText();	
}
//---------------------------------------------------------------------------

void TbookmarkForm::SaveBookmarks()
{
	TTreeNode *tree = 0;
	SWConfig *bmconf;
	ConfigEntMap emap;
	SectionMap::iterator sit;
	char buf[15];
	bool personal = true, other = false;
	list <String *>::iterator it;
	string persfile;

	if (bmtree->Items->Count)
		tree = bmtree->Items->Item[0];

	if ((sit = Form1->optionsconf->Sections.find("Bookmarks")) != Form1->optionsconf->Sections.end()) {
		personal = (atoi((*(*sit).second.find("AutoSavePersonal")).second.c_str())) ? true:false;
		other = (atoi((*(*sit).second.find("AutoSaveOther")).second.c_str())) ? true:false;
	}

	persfile = bmdir + "personal.conf";
	for (it = bmfiles.begin(); it != bmfiles.end(); it++) {		// delete all bookmark files before saving in case a top level was deleted
		if (((!strcmp((*it)->c_str(), persfile.c_str())) && personal) || ((strcmp((*it)->c_str(), persfile.c_str())) && other))
			unlink((*it)->c_str());
	}
	
	for (;tree;tree = tree->getNextSibling()) {
		if (((*((String *)tree->Data) == persfile.c_str()) && personal) || ((*((String *)tree->Data) != persfile.c_str()) && other)) {
			bmconf = new SWConfig(((String *)tree->Data)->c_str());
			emap = bmconf->Sections["ROOT"];
			sprintf(buf, "branch%d", tree->AbsoluteIndex);
			emap.erase(buf); emap.insert(ConfigEntMap::value_type(buf, tree->Text.c_str()));
			AddSectionToConf(bmconf, buf, tree);
			bmconf->Sections["ROOT"] = emap;
			bmconf->Save();
			delete bmconf;
		}
	}
}


void TbookmarkForm::AddSectionToConf(SWConfig *config, String section, TTreeNode *tree) {
	ConfigEntMap sit;
	char buf[15];
	
	if (tree = tree->getFirstChild()) {
		sit = config->Sections[section.c_str()];
		for (; tree; tree = tree->getNextSibling()) {
			sprintf(buf, "branch%d", tree->AbsoluteIndex);
			sit.erase(buf); sit.insert(ConfigEntMap::value_type(buf, tree->Text.c_str()));
			AddSectionToConf(config, buf, tree);
		}
		config->Sections[section.c_str()] = sit;
	}
}

void __fastcall TbookmarkForm::NewBookmarkFile1Click(TObject *Sender)
{
	if (NewBMfrm->ShowModal() == mrOk) {
		bmtree->Items->AddObject(bmtree->Items->Item[0], NewBMfrm->bmtitle->Text, *bmfiles.insert(bmfiles.begin(), new String(String(bmdir.c_str()) + NewBMfrm->bmfile->Text + String(".conf"))));
	}
}
//---------------------------------------------------------------------------