#ifndef StateCache_h
#define StateCache_h

#include <assert.h>
#include <qlist.h>
#include <qstring.h>

#include "KColorMLE.h"
#include "Colorizer.h"



#define STATE_INVALID -1
#define STATE_NORMAL   0



//////////////////////////////////////////////
/**
	This class represents an element in the state
	cache. it describes its position (in a line) and 
	its length; furthermore the state (font index, see 
	@see SyntaxState) and the following state are saved.
	
	this class is used by @ref StateCacheLineElem.

	@short Internal class for @ref StateCache
	@author Michael Riedel
*/	
class StateCacheElem
{
public:
	/**
		Constructs an element and sets its data members to the
		actual parameter values.
	*/
	StateCacheElem(int state, int afterState, int pos, int len)
	{ State = state; AfterState = afterState; Pos = pos; Len = len; }
	
	/**
		Retrieves the state of a element to be drawn on the screen.
	*/
	int state() { return State; }
	
	/**
		Retrieves the state following the element; this is *not* the
		state of the following element, since there may be (and surely are)
		portions of text, that are not part of any element. The state of 
		such an element is the afterState() of the preceeding element, or the
		state 0, if there is no preceeding element.
	*/
	int afterState() { return AfterState; }
	
	/**
		Returns the character position of the element. Since elements 
		are saved in a list of instances of @ref StateCacheLineElem, 
		there is no need to	save the row here; merely the column is 
		saved (and returned). 
	*/		
	int pos() { return Pos; }
	
	/**
		Returns the length of the element (in chars).
	*/
	int len() { return Len; }

	
protected:
	int State;
	int AfterState;
	int Pos; 
	int Len;
};
//////////////////////////////////////////////



//////////////////////////////////////////////
/**
	This class describes the elements of colored text, that
	appear on one line; each element is saved in the list 
	UnitStateCache; their type is @ref StateCacheElem. this 
	class is used internally by @ref StateCache.
	
	@short Internal class for @ref StateCache
	@author Michael Riedel
*/
class StateCacheLineElem
{
	friend class StateCache;
public:
	/**
		Constructs a StateCacheLineElem; the data member PrevLineEndState
		is set to the parameter prevLEState.
	*/
	StateCacheLineElem(int prevLEState);
	
	/*
		Starts a reparsing operation for the current line; the text of
		the current line is given as parameter s to this method. Its 
		return value is the state, that appears at the end of the line.
	*/
	int reparse(const QString& s);
	
	QList<StateCacheElem>& getUnitList() { return UnitStateCache; }
	int prevLineEndState() 				 { return PrevLineEndState; }
	
	
protected:
	int PrevLineEndState;
	QList<StateCacheElem> UnitStateCache;
	static Colorizer* colorizer;
};
//////////////////////////////////////////////



//////////////////////////////////////////////
/**
	A cache for saving the states of text elements and their 
	colors for a complete text file.

	@short Caches text coloring states for a complete text file.
	@author Michael Riedel
*/
class StateCache
{
public:
		/**
			constructs a StateCache that uses colorizer to detect and
			mark colored text; edit is the editor widget that contains
			the text.
		*/
	StateCache(Colorizer* colorizer, KSyntaxMultiLineEdit* edit);
	
		/** 
			this method parses the complete text in the edit @ref Edit.
		*/
	void parse();
	
		/**
			reparses from line row until there are no more changes in 
			the parsing results; returns the index of the last parsed line.
			@param row to start parsing from.
		*/
	int reparseFromHere(unsigned int row);
	
		/**
			inserts a new LineCacheElem at row; its PrevLineEndState will
			be the same as for the previous LineCacheElem at row.
			
			@param row, at which a @ref StateCacheLineElem is inserted.
		*/
	void insertLine(unsigned int row, int prevState = STATE_INVALID);
	
		/**
			removes line row from the LineStateCache
			@param row to remove from LineStateCache
			@param prevState this param can be STATE_INVALID, which sets the 
			       PrevLineEndState of 
		*/
	void removeLine(unsigned int row);
	
		/**
			retrieve a pointer to the LineStateElem at row.
			@param row desired line.
		*/
	StateCacheLineElem* getLineElem(int row) { return LineStateCache.at(row); }
	
	
protected:
	QList<StateCacheLineElem> LineStateCache;
	KSyntaxMultiLineEdit* Edit; 
};
//////////////////////////////////////////////

#endif // StateCache_h


Documentation generated by root@QBERT1 on Fri Jul 17 18:57:31 MEST 1998