#ifndef NATIVEPARSER_H
#define NATIVEPARSER_H

#include <wx/event.h>
#include <wx/hashmap.h>

// forward decls
class cbEditor;
class cbProject;
class ClassBrowser;
class Parser;
class Token;

WX_DECLARE_HASH_MAP(cbProject*, Parser*, wxPointerHash, wxPointerEqual, ParsersMap);
WX_DECLARE_HASH_MAP(cbProject*, wxString, wxPointerHash, wxPointerEqual, ParsersFilenameMap);

enum ParserTokenType
{
	pttSearchText = 0,
	pttClass,
	pttNamespace
};

enum BrowserViewMode
{
	bvmRaw = 0,
	bvmInheritance
};

class NativeParser : public wxEvtHandler
{
	public:
		NativeParser();
		~NativeParser();

		void AddParser(cbProject* project, bool useCache = true);
		void RemoveParser(cbProject* project, bool useCache = true);
		void ClearParsers();
		void RereadParserOptions();
		void AddFileToParser(cbProject* project, const wxString& filename);
		void RemoveFileFromParser(cbProject* project, const wxString& filename);
		void ForceReparseActiveProject();

		int MarkItemsByAI(bool reallyUseAI = true);

		const wxString& GetCodeCompletionItems();
		const wxArrayString& GetCallTips();

		int GetEditorStartWord(){ return m_EditorStartWord; }
		int GetEditorEndWord(){ return m_EditorEndWord; }

		cbProject* FindProjectFromParser(Parser* parser);
		cbProject* FindProjectFromEditor(cbEditor* editor);
		cbProject* FindProjectFromActiveEditor();
		Parser* FindParserFromActiveEditor();
		Parser* FindParserFromEditor(cbEditor* editor);
		Parser* FindParserFromActiveProject();
		Parser* FindParserFromProject(cbProject* project);

		void CreateClassBrowser();
		void RemoveClassBrowser(bool appShutDown = false);
		void SetClassBrowserProject(cbProject* project);
		void SetCBViewMode(const BrowserViewMode& mode);
	protected:
	private:
        friend class CodeCompletion;
		int AI(cbEditor* editor, Parser* parser, const wxString& lineText = wxEmptyString, bool noPartialMatch = false, bool caseSensitive = false);
		unsigned int FindCCTokenStart(const wxString& line);
		wxString GetNextCCToken(const wxString& line, unsigned int& startAt);
		wxString GetCCToken(wxString& line, ParserTokenType& tokenType);
		bool FindFunctionNamespace(cbEditor* editor, wxString* nameSpace = 0L, wxString* procName = 0L);
		int FindCurrentBlockStart(cbEditor* editor);
		int DoInheritanceAI(Token* parentToken, Token* scopeToken, const wxString& searchText = wxEmptyString, bool caseSensitive = true);
		void AddCompilerDirs(Parser* parser, cbProject* project);
		bool LoadCachedData(Parser* parser, cbProject* project);
		bool SaveCachedData(Parser* parser, const wxString& projectFilename);
		void DisplayStatus(Parser* parser, cbProject* project);
		void OnThreadStart(wxCommandEvent& event);
		void OnThreadEnd(wxCommandEvent& event);
		void OnParserEnd(wxCommandEvent& event);

		bool SkipWhitespaceForward(cbEditor* editor, int& pos);
		bool SkipWhitespaceBackward(cbEditor* editor, int& pos);

		ParsersMap m_Parsers;
		ParsersFilenameMap m_ParsersFilenames;
		int m_EditorStartWord;
		int m_EditorEndWord;
		wxString m_CCItems;
		wxArrayString m_CallTips;
    	ClassBrowser* m_pClassBrowser;

        DECLARE_EVENT_TABLE()
};

#endif // NATIVEPARSER_H



syntax highlighted by Code2HTML, v. 0.9.1