#ifndef _DOC_CONVERTER_H
#define _DOC_CONVERTER_H
/* DOC-converter.h                           KPilot
**
** Copyright (C) 2002-2003 by Reinhold Kainhofer
**
*/

/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program in a file called COPYING; if not, write to
** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA 02110-1301, USA.
*/

/*
** Bug reports and questions can be sent to kde-pim@kde.org
*/



#define DOC_UNCOMPRESSED 1
#define DOC_COMPRESSED 2


#define BMK_SUFFIX ".bmk"
#define PDBBMK_SUFFIX ".bm"

#include <list>
#include <tqobject.h>

class PilotDatabase;


/****************************************************************************************************
 *  various bookmark classes. Most important is the bmkList  findMatches(TQString, bmkList &) function,
 *  which needs to return a list of all bookmarks found for the given bookmark expression.
 *  A bookmark usually consists of a bookmark text and an offset into the text document.
 ****************************************************************************************************/

class docBookmark;
#define bmkList std::list<docBookmark*>

class docBookmark {
public:
	static bool compare_pos;
	docBookmark():bmkName(), position(0) { };
	docBookmark(TQString name, long int pos):bmkName(name), position(pos) { };
	docBookmark(const docBookmark &bmk):bmkName(bmk.bmkName),position(bmk.position){};
	virtual ~ docBookmark() { };
	virtual int findMatches(TQString, bmkList &fBookmarks) {
		FUNCTIONSETUP;
		fBookmarks.push_back(new docBookmark(*this));
		return 1;
	};

	TQString bmkName;
	long int position;
};

class docMatchBookmark:public docBookmark {
 public:
	docMatchBookmark():docBookmark() { from=0; to=100;};
	docMatchBookmark(TQString pattrn, int options=0):docBookmark(),
		pattern(pattrn), opts(options) { from=0; to=100; };
	docMatchBookmark(TQString pattrn, TQString bmkname,
		int options=0):docBookmark(bmkname, 0), pattern(pattrn),
		opts(options) { from=0; to=100; };
	virtual ~ docMatchBookmark() { };

	virtual int findMatches(TQString, bmkList &fBookmarks);
	TQString pattern;
	int opts;
	int from, to;
};

class docRegExpBookmark:public docMatchBookmark {
 public:
	docRegExpBookmark():docMatchBookmark() { capSubexpression=-1;};
	docRegExpBookmark(TQString regexp, int cap=0,
		int options=0):docMatchBookmark(regexp, options) {capSubexpression=cap; };
	docRegExpBookmark(TQString pattrn, TQString bmkname,
		int options=0):docMatchBookmark(pattrn, bmkname, options) { capSubexpression=-1; };
	virtual ~ docRegExpBookmark() { };

	virtual int findMatches(TQString, bmkList &fBookmarks);
	int capSubexpression;
};


/*************************************************************************************************************
 *  The converter class that does the real work for us.
 *************************************************************************************************************/

class DOCConverter:public TQObject {
TQ_OBJECT
  
private:
	PilotDatabase * docdb;
	TQString txtfilename;
	TQString bmkfilename;
	bool compress;

	bmkList fBookmarks;
public:
	enum eSortBookmarksEnum
	{
		eSortNone,
		eSortPos,
		eSortName
	} eSortBookmarks;

public:
	 DOCConverter(TQObject *parent=0L, const char *name=0L);
	 virtual ~ DOCConverter();

	TQString readText();
	void setTXTpath(TQString path, TQString file);
	void setTXTpath(TQString filename);
	void setPDB(PilotDatabase * dbi);
	TQString txtFilename() const {return txtfilename;}
	TQString bmkFilename() const {return bmkfilename;}
	void setBmkFilename(TQString bmkf) { bmkfilename=bmkf;}

	bool getCompress() const { return compress; };
	void setCompress(bool newcomp) {compress=newcomp;};

	bool convertTXTtoPDB();
	bool convertPDBtoTXT();

	int setBookmarks(bmkList bookmarks) {
		for (docBookmark *bmk : fBookmarks)
		{
		  delete bmk;
		}
		fBookmarks = bookmarks;
		return fBookmarks.size();
	};
	int clearBookmarks() {
		for (docBookmark *bmk : fBookmarks)
		{
		  delete bmk;
		}
		fBookmarks.clear();
		return fBookmarks.size();
	};
	int addBookmark(docBookmark *bookmark) {
		fBookmarks.push_back(bookmark);
		return fBookmarks.size();
	};

	int findBmkEndtags(TQString &, bmkList&);
	int findBmkInline(TQString &, bmkList&);
	int findBmkFile(TQString &, bmkList&);


	void setSort(enum eSortBookmarksEnum sort) {eSortBookmarks=sort;}
	enum eSortBookmarksEnum getSort() {return eSortBookmarks;}

	enum eBmkTypesEnum {
		eBmkNone = 0,
		eBmkFile = 1,
		eBmkInline = 2,
		eBmkEndtags = 4,
		eBmkDefaultBmkFile = 8
	} fBmkTypes;
	void setBookmarkTypes(int types) {
		fBmkTypes = (eBmkTypesEnum) types;
	};

protected:
	int findBookmarks();

private:
	void readConfig();
signals:
	void logMessage(const TQString &);
	void logError(const TQString &);
};

#endif
