1 /*
2 * Copyright (c) 2002-2007 Daniel Elstner <daniel.kitta@gmail.com>
3 *
4 * This file is part of regexxer.
5 *
6 * regexxer is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * regexxer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with regexxer; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #ifndef REGEXXER_FILETREEPRIVATE_H_INCLUDED
22 #define REGEXXER_FILETREEPRIVATE_H_INCLUDED
23
24 #include "filetree.h"
25
26 #include <gtkmm/treerowreference.h>
27 #include <gtkmm/treestore.h>
28 #include <utility>
29
30 namespace Regexxer
31 {
32
33 /*
34 * This namespace contains all types and functions which are used exclusively by
35 * the FileTree implementation, but aren't members of class Regexxer::FileTree.
36 */
37 namespace FileTreePrivate
38 {
39
40 // Normally I don't like global using declarations, but it's
41 // reasonable to make an exception for the smart pointer casts.
42 using Util::shared_dynamic_cast;
43 using Util::shared_polymorphic_cast;
44
45 struct FileTreeColumns : public Gtk::TreeModel::ColumnRecord
46 {
47 Gtk::TreeModelColumn<Glib::ustring> filename;
48 Gtk::TreeModelColumn<std::string> collatekey;
49 Gtk::TreeModelColumn<int> matchcount;
50 Gtk::TreeModelColumn<FileInfoBasePtr> fileinfo;
51
52 static const FileTreeColumns& instance();
53
54 private:
FileTreeColumnsFileTreeColumns55 FileTreeColumns() { add(filename); add(collatekey); add(matchcount); add(fileinfo); }
56 };
57
58 inline
get_fileinfo_from_iter(const Gtk::TreeModel::iterator & iter)59 FileInfoPtr get_fileinfo_from_iter(const Gtk::TreeModel::iterator& iter)
60 {
61 const FileInfoBasePtr base ((*iter)[FileTreeColumns::instance().fileinfo]);
62 return shared_dynamic_cast<FileInfo>(base);
63 }
64
65 int default_sort_func (const Gtk::TreeModel::iterator& a, const Gtk::TreeModel::iterator& b);
66 int collatekey_sort_func(const Gtk::TreeModel::iterator& a, const Gtk::TreeModel::iterator& b);
67
68 bool next_match_file(Gtk::TreeModel::iterator& iter, Gtk::TreeModel::Path* collapse = 0);
69 bool prev_match_file(Gtk::TreeModel::iterator& iter, Gtk::TreeModel::Path* collapse = 0);
70
71 typedef std::pair<std::string, Gtk::TreeModel::iterator> DirNodePair;
72 typedef std::list<DirNodePair> DirStack;
73
74 class ScopedPushDir
75 {
76 private:
77 DirStack& dirstack_;
78
79 ScopedPushDir(const ScopedPushDir&);
80 ScopedPushDir& operator=(const ScopedPushDir&);
81
82 public:
ScopedPushDir(DirStack & dirstack,const std::string & dirname)83 ScopedPushDir(DirStack& dirstack, const std::string& dirname)
84 : dirstack_ (dirstack)
85 { dirstack_.push_back(DirNodePair(dirname, Gtk::TreeModel::iterator())); }
86
~ScopedPushDir()87 ~ScopedPushDir() { dirstack_.pop_back(); }
88 };
89
90 } // namespace FileTreePrivate
91
92 /* This is just a Gtk::TreeRowReference wrapper that can be used with Util::SharedPtr<>.
93 */
94 class FileTree::TreeRowRef : public Util::SharedObject, public Gtk::TreeRowReference
95 {
96 public:
97 TreeRowRef(const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path);
98 ~TreeRowRef();
99
100 private:
101 TreeRowRef(const FileTree::TreeRowRef&);
102 FileTree::TreeRowRef& operator=(const FileTree::TreeRowRef&);
103 };
104
105 /* This is just a std::list<> wrapper that can be used with Util::SharedPtr<>.
106 */
107 class FileTree::MessageList : public Util::SharedObject, public std::list<Glib::ustring>
108 {
109 public:
110 MessageList();
111 ~MessageList();
112
113 private:
114 MessageList(const FileTree::MessageList&);
115 FileTree::MessageList& operator=(const FileTree::MessageList&);
116 };
117
118 struct FileTree::FindData
119 {
120 FindData(const Glib::RefPtr<Glib::Regex>& pattern_, bool recursive_, bool hidden_);
121 ~FindData();
122
123 const Glib::RefPtr<Glib::Regex>& pattern;
124 const bool recursive;
125 const bool hidden;
126 FileTreePrivate::DirStack dirstack;
127 Util::SharedPtr<FileTree::MessageList> error_list;
128
129 private:
130 FindData(const FileTree::FindData&);
131 FileTree::FindData& operator=(const FileTree::FindData&);
132 };
133
134 struct FileTree::FindMatchesData
135 {
136 FindMatchesData(const Glib::RefPtr<Glib::Regex>& pattern_, bool multiple_);
137
138 const Glib::RefPtr<Glib::Regex>& pattern;
139 const bool multiple;
140 bool path_match_first_set;
141
142 private:
143 FindMatchesData(const FileTree::FindMatchesData&);
144 FileTree::FindMatchesData& operator=(const FileTree::FindMatchesData&);
145 };
146
147 struct FileTree::ReplaceMatchesData
148 {
149 ReplaceMatchesData(FileTree& filetree_, const Glib::ustring& substitution_);
150 ~ReplaceMatchesData();
151
152 FileTree& filetree;
153 const Glib::ustring substitution;
154 FileTree::TreeRowRefPtr row_reference;
155 UndoStackPtr undo_stack;
156 const sigc::slot<void, UndoActionPtr> slot_undo_stack_push;
157
158 void undo_stack_push(UndoActionPtr undo_action);
159
160 private:
161 ReplaceMatchesData(const FileTree::ReplaceMatchesData&);
162 FileTree::ReplaceMatchesData& operator=(const FileTree::ReplaceMatchesData&);
163 };
164
165 class FileTree::ScopedBlockSorting
166 {
167 public:
168 explicit ScopedBlockSorting(FileTree& filetree);
169 ~ScopedBlockSorting();
170
171 private:
172 FileTree& filetree_;
173 int sort_column_;
174 Gtk::SortType sort_order_;
175
176 ScopedBlockSorting(const FileTree::ScopedBlockSorting&);
177 FileTree::ScopedBlockSorting& operator=(const FileTree::ScopedBlockSorting&);
178 };
179
180 class FileTree::BufferActionShell : public UndoAction
181 {
182 public:
183 BufferActionShell(FileTree& filetree, const FileTree::TreeRowRefPtr& row_reference,
184 const UndoActionPtr& buffer_action);
185 virtual ~BufferActionShell();
186
187 private:
188 FileTree& filetree_;
189 FileTree::TreeRowRefPtr row_reference_;
190 UndoActionPtr buffer_action_;
191
192 virtual bool do_undo(const sigc::slot<bool>& pulse);
193 };
194
195 } // namespace Regexxer
196
197 #endif /* REGEXXER_FILETREEPRIVATE_H_INCLUDED */
198