#ifndef YABTEXT_H
#define YABTEXT_H

#include <TextView.h>
#include <Font.h>
#include <String.h>	
#include <vector>
#include <string>
#include <stdio.h>
#include <Window.h>
#include <Message.h>
#include <Messenger.h>

class YabText : public BTextView
{
	public:
		YabText(BRect frame, const char* name, BRect textRect, uint32 resizeMode, uint32 flags);
		~YabText();
		void AddCommand(const char* command, int colorGroup);
		virtual void AttachedToWindow();
		virtual void Select(int32 start,int32 finish);
		void SetColors(int, int, int, int);
		int32 CountPhysicalLines(); //?
		virtual void KeyDown(const char* bytes, int32 numBytes);
		int FindFirstOnLine(char c,int offset,int eol);
		int32 OffsetAtIndex(int32 index);// const;
		int32 LineAt(int32 offset);// const;	
		void FillSolEol(std::vector<int>& s,std::vector<int>& e,int start,int finish);	
		// void GoToLine(int32 index);
		int32 CountLines();
		void ParseAll(int start,int finish,bool IsInteractive);
		void IParseLine(int sol,int eol); // TODO!
		void ParseLine(int sol,int eol,std::vector<rgb_color>& colorVec); // TODO!
		void ICheckWordLists(int sol,int eol,std::vector<rgb_color>& colorVec);
		void SetText(const char* text,int32 length,const text_run_array* runs = NULL);
		void UpdateColors();
		void UpdateFontSize();
		void SetText(BFile* file,int32 offset,int32 length,const text_run_array* runs = NULL);
		bool Contains(std::vector<BString>& v,BString s);
		// virtual bool CanEndLine(int32 offset);
		// void LoadFile(entry_ref *ref);
		virtual void MessageReceived(BMessage* msg);

		bool HasChanged();
		void SetChanged(bool changed);
		bool IsCaseSensitive();
		void SetCaseSensitive(bool caseSensitive);
		
		void SetNormalFocus();
		void SetAttachedFocus();

		void AddWord(BString *word);
		void SetAutoCompleteStart(int num);
		void HasAutoCompletion(bool flag);

		int SearchOffset;

	private:
		bool isCaseSensitive, hasChanged, isJapanese;
		int myFontSize;
		rgb_color bgcolor;
		rgb_color textcolor, punc_symbol_color, comment_color, ignore_color;
		rgb_color format_cmd_color, special_cmd_color, generic_cmd_color;
		BFont f;

		std::vector <BString> green_matches;
		std::vector <BString> purple_matches;
		std::vector <BString> generic_matches;
		std::vector <BString> comment_matches;
		std::vector <char> punctuation;

		BList *words;
		bool hasAutoCompletion, isAutoComplete;
		int32 autoOffset, autoEnd;
		int number_of_letters;

		bool min(int32 a, int32 b)
		{
			return (a<=b?a:b);
		};
		bool max(int32 a, int32 b)
		{
			return (a>=b?a:b);
		};

	protected:
		virtual void InsertText(const char* text,int32 length,int32 offset,const text_run_array* runner);
		virtual void DeleteText(int32 start, int32 finish);
};
#endif