/////////////////////////////////////////////////////////////////////////////
// Name:        No names yet.
// Purpose:     Contrib. demo
// Author:      Aleksandras Gluchovas
// Modified by:
// Created:     22/09/98
// RCS-ID:      $Id: docripper.h,v 1.1 1999/09/13 14:29:40 JS Exp $
// Copyright:   (c) Aleskandars Gluchovas
// Licence:   	wxWindows licence
/////////////////////////////////////////////////////////////////////////////

#ifndef __DOCRIPPER_G__
#define __DOCRIPPER_G__

#include "scriptbinder.h"
#include "srcparser.h"
#include "sourcepainter.h"

#if defined( wxUSE_TEMPLATE_STL )
		
	#include <vector>

	typedef vector<ScriptTemplate*> STemplateListT;

#else

	#include "wxstlvec.h"

	typedef ScriptTemplate* ScriptTemplatePtrT; 
	typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptTemplatePtrT) STemplateListT;

#endif


// specific DocGenerator class for "Ripper", 
// also acts as source code visitor

class RipperDocGen : public DocGeneratorBase, public spVisitor
{
protected:
	// templates for various sections
	ScriptTemplate mTopTempl;
	ScriptTemplate mContentIdxTempl;
	ScriptTemplate mSuperContentTempl;
	ScriptTemplate mSubContentTempl;
	ScriptTemplate mOutLineTempl;
	ScriptTemplate mOutLine1Templ;

	// template used for corss-references
	ScriptTemplate mRefTempl;

	// template used to show not-existing sections
	ScriptTemplate mDeadRefTempl;

	// template collection for generation of class-tree
	STemplateListT mTreeTemplates;

	// pointers to all major index sections
	ScriptSection* mpTopIdx;
	ScriptSection* mpClassIdx;
	ScriptSection* mpEnumIdx;
	ScriptSection* mpTypeDefIdx;
	ScriptSection* mpMacroIdx;
	ScriptSection* mpGlobalVarsIdx;
	ScriptSection* mpGlobalFuncIdx;
	ScriptSection* mpConstIdx;

	// parser set up from user-code for sepcific language
	SourceParserBase* mpParser;

	// class section, which is currently being
	// assembled
	ScriptSection*    mpCurClassSect;
	
	// source syntax heighlighter object
	SourcePainter  mSrcPainter;

	// context, to which all file contexts
	// are assembled
	spContext*     mpFileBinderCtx;

	// script tags set up from usesr code
	MarkupTagsT    mTags;

protected:
	// helpers
	void AppendComments( spContext& fromContext, string& str );

	void AppendMulitilineStr( string& st, string& mlStr );

	void AppendHighlightedSource( string& st, string source );

	// returns TRUE, if no comments found in the context,
	// plus, creates dummy(empty) section, and puts a 
	// reference woth "dead-link" template to it in the 
	// given index-section "toSect"

	bool CheckIfUncommented( spContext& ctx, ScriptSection& toSect );

	// checks if context has any comments, then returns
	// template of normal reference, otherwise of dead reference

	ScriptTemplate* GetRefTemplFor( spContext& ctx );

	// adds "someClass::" perfix to the context name,
	// if it's not in the file scope (i.e. if it's not global)

	string GetScopedName( spContext& ofCtx );

	// adds section to currently assembled class section
	// and places references to it from "public", "protected"
	// or "private" indexing-subsections of the class, depending
	// on the visibility of the context

	void AddToCurrentClass( ScriptSection* pSection, spContext& ctx, 
							const char* subSectionName );

	// called, after all files are processed, to
	// resolve possible super/derived class relations,
	// and put cross references to them - where resolution was
	// successful
	void LinkSuperClassRefs();

	// implementations of "visiting procedures", declared in spVisitor

	virtual void VisitClass( spClass& cl );
	virtual void VisitEnumeration( spEnumeration& en );
	virtual void VisitTypeDef( spTypeDef& td );
	virtual void VisitPreprocessorLine( spPreprocessorLine& pd );
	virtual void VisitAttribute( spAttribute& attr );
	virtual void VisitOperation( spOperation& op );

	// overriden member of DocGernatorBase

	virtual bool OnSaveDocument( ScriptStream& stm );

	virtual ScriptSection* GetTopSection() 
		{ return mpTopIdx; }

public:
	RipperDocGen();
	~RipperDocGen();

	// should be called onece to set user-code provided,
	// parser for specific source code language
	// (NOTE:: it's the user-code's responsibility to
	//  relseas memory of pParser)

	void Init( SourceParserBase* pParser );
	
	// should be called on each file
	
	void ProcessFile( const char* sourceFile );
};


#endif