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 #include "controller.h"
22
23 #include <gtkmm/button.h>
24 #include <gtkmm/menu.h>
25 #include <gtkmm/toolbutton.h>
26 #include <gtkmm/builder.h>
27
28 #include <config.h>
29
30
31 namespace Regexxer
32 {
33
34 /**** Regexxer::ControlItem ************************************************/
35
ControlItem(bool enable)36 ControlItem::ControlItem(bool enable)
37 :
38 enabled_ (enable),
39 group_enabled_ (true)
40 {}
41
~ControlItem()42 ControlItem::~ControlItem()
43 {}
44
activate()45 void ControlItem::activate()
46 {
47 if (enabled_ && group_enabled_)
48 signal_activate_(); // emit
49 }
50
slot()51 sigc::slot<void> ControlItem::slot()
52 {
53 return sigc::mem_fun(*this, &ControlItem::activate);
54 }
55
connect(const sigc::slot<void> & slot_activated)56 void ControlItem::connect(const sigc::slot<void>& slot_activated)
57 {
58 signal_activate_.connect(slot_activated);
59 }
60
add_widget(Gtk::Widget & widget)61 void ControlItem::add_widget(Gtk::Widget& widget)
62 {
63 signal_set_sensitive_.connect(sigc::mem_fun(widget, &Gtk::Widget::set_sensitive));
64 widget.set_sensitive(enabled_ && group_enabled_);
65 }
66
add_widgets(const Glib::RefPtr<Gtk::Builder> & xml,const char * menuitem_name,const char * button_name)67 void ControlItem::add_widgets(const Glib::RefPtr<Gtk::Builder>& xml,
68 const char* menuitem_name, const char* button_name)
69 {
70 const sigc::slot<void> slot_activate = slot();
71
72 Gtk::MenuItem* menuitem = 0;
73 Gtk::Widget* widget = 0;
74
75 if (menuitem_name)
76 xml->get_widget(menuitem_name, menuitem);
77
78 if (button_name)
79 xml->get_widget(button_name, widget);
80
81 if (menuitem_name)
82 {
83 menuitem->signal_activate().connect(slot_activate);
84 add_widget(*menuitem);
85 }
86
87 if (button_name)
88 {
89 if (Gtk::ToolButton *const button = dynamic_cast<Gtk::ToolButton*>(widget))
90 button->signal_clicked().connect(slot_activate);
91 else if (Gtk::Button *const button = dynamic_cast<Gtk::Button*>(widget))
92 button->signal_clicked().connect(slot_activate);
93 else
94 g_return_if_reached();
95
96 add_widget(*widget);
97 }
98 }
99
set_enabled(bool enable)100 void ControlItem::set_enabled(bool enable)
101 {
102 if (enable != enabled_)
103 {
104 enabled_ = enable;
105
106 if (group_enabled_)
107 signal_set_sensitive_(enabled_); // emit
108 }
109 }
110
set_group_enabled(bool enable)111 void ControlItem::set_group_enabled(bool enable)
112 {
113 if (enable != group_enabled_)
114 {
115 group_enabled_ = enable;
116
117 if (enabled_)
118 signal_set_sensitive_(group_enabled_); // emit
119 }
120 }
121
is_enabled() const122 bool ControlItem::is_enabled() const
123 {
124 return (enabled_ && group_enabled_);
125 }
126
127
128 /**** Regexxer::ControlGroup ***********************************************/
129
ControlGroup(bool enable)130 ControlGroup::ControlGroup(bool enable)
131 :
132 enabled_ (enable)
133 {}
134
~ControlGroup()135 ControlGroup::~ControlGroup()
136 {}
137
add(ControlItem & control)138 void ControlGroup::add(ControlItem& control)
139 {
140 signal_set_enabled_.connect(sigc::mem_fun(control, &ControlItem::set_group_enabled));
141 control.set_group_enabled(enabled_);
142 }
143
set_enabled(bool enable)144 void ControlGroup::set_enabled(bool enable)
145 {
146 if (enable != enabled_)
147 {
148 enabled_ = enable;
149 signal_set_enabled_(enabled_); // emit
150 }
151 }
152
153
154 /**** Regexxer::Controller *************************************************/
155
Controller()156 Controller::Controller()
157 :
158 match_actions (true),
159 edit_actions (false),
160 save_file (false),
161 save_all (false),
162 undo (false),
163 preferences (true),
164 quit (true),
165 about (true),
166 find_files (false),
167 find_matches (false),
168 next_file (false),
169 prev_file (false),
170 next_match (false),
171 prev_match (false),
172 replace (false),
173 replace_file (false),
174 replace_all (false),
175 cut (true),
176 copy (true),
177 paste (true),
178 erase (true)
179 {
180 match_actions.add(undo);
181 match_actions.add(find_files);
182 match_actions.add(find_matches);
183 match_actions.add(next_file);
184 match_actions.add(prev_file);
185 match_actions.add(next_match);
186 match_actions.add(prev_match);
187 match_actions.add(replace);
188 match_actions.add(replace_file);
189 match_actions.add(replace_all);
190 edit_actions.add(cut);
191 edit_actions.add(copy);
192 edit_actions.add(paste);
193 edit_actions.add(erase);
194 }
195
~Controller()196 Controller::~Controller()
197 {}
198
load_xml(const Glib::RefPtr<Gtk::Builder> & xml)199 void Controller::load_xml(const Glib::RefPtr<Gtk::Builder>& xml)
200 {
201 save_file .add_widgets(xml, "menuitem_save", "button_save");
202 save_all .add_widgets(xml, "menuitem_save_all", "button_save_all");
203 quit .add_widgets(xml, "menuitem_quit", "button_quit");
204 undo .add_widgets(xml, "menuitem_undo", "button_undo");
205 cut .add_widgets(xml, "menuitem_cut", 0);
206 copy .add_widgets(xml, "menuitem_copy", 0);
207 paste .add_widgets(xml, "menuitem_paste", 0);
208 erase .add_widgets(xml, "menuitem_delete", 0);
209 preferences .add_widgets(xml, "menuitem_preferences", 0);
210 next_file .add_widgets(xml, "menuitem_next_file", "button_next_file");
211 prev_file .add_widgets(xml, "menuitem_prev_file", "button_prev_file");
212 next_match .add_widgets(xml, "menuitem_next_match", "button_next_match");
213 prev_match .add_widgets(xml, "menuitem_prev_match", "button_prev_match");
214 replace .add_widgets(xml, "menuitem_replace", "button_replace");
215 replace_file.add_widgets(xml, "menuitem_replace_file", "button_replace_file");
216 replace_all .add_widgets(xml, "menuitem_replace_all", "button_replace_all");
217 find_files .add_widgets(xml, 0, "button_find_files");
218 find_matches.add_widgets(xml, 0, "button_find_matches");
219 about .add_widgets(xml, "menuitem_about", 0);
220 }
221
222 } // namespace Regexxer
223