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