1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include "wb_config.h"
#include "find_panel.h"
#include "workbench/wb_find_dialog.h"
#include "workbench/wb_context_ui.h"
#include <gtkmm/table.h>
#include <gtkmm/button.h>
#include <gtkmm/entry.h>
#include <gtkmm/scrolledwindow.h>
#include "listmodel_wrapper.h"
#include "auto_completable.h"
#include "base/string_utilities.h"
//------------------------------------------------------------------------------
FindPanel::FindPanel(GtkVBox *obj, const Glib::RefPtr<Gtk::Builder> &b)
: Gtk::VBox(obj)
{
reference();
unparent();
}
//------------------------------------------------------------------------------
void FindPanel::init(wb::WBContextUI *wbui, Glib::RefPtr<Gtk::Builder> ui)
{
_wbui= wbui;
_ui= ui;
_be= wbui->get_find_dialog();
_be->set_search_diagram_only(true);
Gtk::Button *btn;
_ui->get_widget("close_button", btn);
btn->signal_clicked().connect(sigc::mem_fun(this, &FindPanel::handle_close));
Gtk::Entry *entry;
_ui->get_widget("find_entry", entry);
entry->signal_key_press_event().
connect_notify(sigc::bind(sigc::mem_fun(this, &FindPanel::key_press), entry));
_ui->get_widget("next_button", btn);
btn->signal_clicked().connect(sigc::mem_fun(this, &FindPanel::find_next));
_ui->get_widget("previous_button", btn);
btn->signal_clicked().connect(sigc::mem_fun(this, &FindPanel::find_previous));
}
//------------------------------------------------------------------------------
FindPanel::~FindPanel()
{
}
//------------------------------------------------------------------------------
void FindPanel::handle_close()
{
hide();
}
//------------------------------------------------------------------------------
FindPanel *FindPanel::create(wb::WBContextUI *wbui)
{
Glib::RefPtr<Gtk::Builder> ui= Gtk::Builder::create_from_file(wbui->get_wb()->get_grt_manager()->get_data_file_path("find.glade"));
FindPanel *panel= 0;
ui->get_widget_derived<FindPanel>("find_parts_box", panel);
if (panel)
panel->init(wbui, ui);
return panel;
}
//------------------------------------------------------------------------------
void FindPanel::key_press(GdkEventKey *ev, Gtk::Entry *entry)
{
if (ev->keyval == GDK_Return || ev->keyval == GDK_Linefeed)
{
Gtk::Button *btn;
_ui->get_widget("next_button", btn);
btn->clicked();
}
else if (ev->keyval == GDK_Escape)
handle_close();
else
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffffff"));
}
//------------------------------------------------------------------------------
void FindPanel::setup_arguments()
{
Gtk::Entry *entry;
Gtk::ToggleButton *check;
_ui->get_widget("find_entry", entry);
_be->set_text(entry->get_text().c_str());
_ui->get_widget("case_check", check);
_be->set_match_case(check->get_active());
_ui->get_widget("comment_check", check);
_be->set_search_in_comments(check->get_active());
}
//------------------------------------------------------------------------------
void FindPanel::find_next()
{
Gtk::Entry *entry = 0;
_ui->get_widget("find_entry", entry);
setup_arguments();
switch (_be->find_next())
{
case wb::NotFound:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffaaaa"));
break;
case wb::FoundMatch:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#aaffaa"));
break;
case wb::NoMoreMatches:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffffff"));
break;
}
}
//------------------------------------------------------------------------------
void FindPanel::find_previous()
{
setup_arguments();
Gtk::Entry *entry;
_ui->get_widget("find_entry", entry);
setup_arguments();
switch (_be->find_previous())
{
case wb::NotFound:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffaaaa"));
break;
case wb::FoundMatch:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#aaffaa"));
break;
case wb::NoMoreMatches:
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffffff"));
break;
}
}
//------------------------------------------------------------------------------
void FindPanel::show()
{
Gtk::VBox::show();
Gtk::Entry *entry;
_ui->get_widget("find_entry", entry);
entry->modify_base(Gtk::STATE_NORMAL, Gdk::Color("#ffffff"));
entry->grab_focus();
entry->select_region(0, entry->get_text().length());
}
|