text_model.h
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #ifndef TEXT_MODEL_H
00028 #define TEXT_MODEL_H
00029 
00030 #include <string>
00031 #include <vector>
00032 #include <cassert>
00033 #include <glib.h>
00034 #include <iconv.h>
00035 #include "plugin_inc.h"
00036 #include "text_base_types.h"
00037 #include "signal_slot.h"
00038 
00039 namespace text
00040 {
00041 
00042 #define DEFAULT_ENCODING "iso8859-1"
00043 
00044 class TextModel
00045 {
00046 public:
00047 
00048     TextModel();
00049     ~TextModel();
00050 
00051 public:
00052 
00053     PluginStatus open(const std::string& path);
00054 
00055 
00056     PluginStatus open(const std::string& path, const std::string& encoding);
00057 
00058 
00059     bool is_open() const
00060     {
00061         return b_open;
00062     }
00063 
00064 
00065     void close();
00066 
00067 
00068     const std::string& get_encoding() const
00069     {
00070         return encoding;
00071     }
00072 
00073     const std::string& get_path() const
00074     {
00075         return path;
00076     }
00077 
00078 
00079     unsigned int get_paragraph_count() const
00080     {
00081         return static_cast<unsigned int>(doc.size());
00082     }
00083 
00084 
00085     const std::string* get_paragraph(unsigned int index) const
00086     {
00087         assert(index < doc.size());
00088         return doc[index].text;
00089     }
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098     bool search(std::vector<Range>& result_ranges, SearchContext* sc);
00099 
00100 
00101     bool has_anchor(const Position &pos);
00102 
00103 
00104     bool get_file_pos_from_anchor(size_t& file_pos, const Position &pos);
00105 
00106 
00107     bool get_word_from_anchor(const Position& pos,
00108                               Position& word_start_pos,
00109                               Position& word_end_pos);
00110 
00111 
00112     bool get_words_from_range(const Position& range_start,
00113                               const Position& range_end,
00114                               Position& words_start,
00115                               Position& words_end);
00116 
00117 
00118     bool get_text_from_range(std::string& result,
00119                              const Position& start_pos,
00120                              const Position& end_pos);
00121 
00122 
00123     void dump();
00124 
00125 
00126     void set_aborting_search_task_id(unsigned int id)
00127     {
00128         aborting_search_task_id = id;
00129     }
00130 
00131     unsigned int get_aborting_search_task_id()
00132     {
00133         return aborting_search_task_id;
00134     }
00135 
00136 public:
00137 
00138     utils::Signal<const std::vector<Range>&, const SearchContext*> search_done_signal;
00139 
00140 private:
00141 
00142     void detect_encoding();
00143 
00144 
00145     void clear();
00146 
00147 
00148     PluginStatus read_text();
00149 
00150 
00151     PluginStatus read_utf8_text();
00152 
00153 
00154     PluginStatus read_non_utf8_text();
00155 
00156 
00157     void save_block_with_paragraphs(const char *blk, size_t blk_size);
00158 
00159 
00160     void convert(iconv_t cd, char **in_buf, size_t *in_bytes_left, char **out_buf, size_t *out_bytes_left);
00161 
00162 
00163     bool is_seperator(const char* p);
00164 
00165 
00166     bool is_new_search(SearchContext * sc);
00167 
00168 private:
00169 
00170     FILE *file_p;
00171 
00172 
00173     std::string encoding;
00174 
00175 
00176     std::string path;
00177 
00178 
00179     bool b_open;
00180 
00181 
00182     unsigned int aborting_search_task_id;
00183   
00184 
00185     Range         last_search_result;
00186 
00187 
00188     SearchContext last_sc; 
00189 
00190 
00191 
00192 
00193     bool incomplete_line;
00194 
00195     struct Paragraph
00196     {
00197     public:
00198         size_t       start_file_pos;
00199         std::string* text;
00200 
00201     public:
00202         Paragraph(size_t pos, std::string* _text)
00203         : start_file_pos(pos), text(_text)
00204         {
00205         }
00206     };
00207 
00208 
00209     typedef std::vector<Paragraph> TextDocument;
00210     typedef TextDocument::iterator TextDocumentIter;
00211 
00212 
00213     TextDocument doc;
00214 };
00215 
00216 };  
00217 
00218 #endif // TEXT_MODEL_H
00219