00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BIT_GTKBUFFERTABLE_H
00020 #define BIT_GTKBUFFERTABLE_H
00021
00022 #include <vector>
00023 #include <map>
00024 #include <queue>
00025
00026 #include <gtkmm.h>
00027
00028 #include <bit.h>
00029
00030 namespace bitGtk
00031 {
00032
00036 class BufferTable : public Gtk::HBox
00037 {
00038 public:
00039 BufferTable();
00040
00041 ~BufferTable();
00042
00043 bit::FieldBase::pointer record();
00044
00045 void set_record(bit::FieldBase::pointer record);
00046
00047 bit::RecordBuffer& buffer();
00048
00049 void set_buffer( bit::RecordBuffer& buffer);
00050
00051 void set_bit_width(size_t w);
00052
00053 void enable_tooltips(bool b=true);
00054
00055 void enable_highlighter(bool b=true);
00056 void set_bg_color(std::string s);
00057
00058 void add_color_set(std::string normal_color, std::string highlight_color="yellow");
00059 void clear_color_sets();
00060
00061 protected:
00062 struct FieldBox
00063 {
00064 FieldBox() { }
00065 std::vector<Gtk::Label*> m_field_labels;
00066 std::vector<Gtk::EventBox*> m_field_event_boxes;
00067 std::vector<Gtk::Label*> m_value_labels;
00068 std::vector<Gtk::EventBox*> m_value_event_boxes;
00069 std::vector<Gtk::VBox*> m_highlight_boxes;
00070 };
00071
00072 std::map<bit::FieldBase::pointer, FieldBox > m_fieldbox;
00073
00074 bit::RecordBuffer m_buffer;
00075 bit::FieldBase::pointer m_record;
00076 int m_mode;
00077 std::list<std::pair<Gdk::Color, Gdk::Color> > m_colors;
00078 Gtk::Tooltips m_tooltips;
00079 bool m_highlighter_enabled;
00080 Gdk::Color m_bg_color;
00081
00082 size_t m_display_bit_width;
00083 Gtk::Table* m_table;
00084 Gtk::EventBox m_tablebox;
00085 Gtk::EventBox m_tableboxouter;
00086
00088 Glib::Dispatcher m_record_changed_dispatcher;
00089
00091 Glib::Dispatcher m_field_changed_dispatcher;
00092
00094 Glib::StaticMutex m_record_mutex;
00095
00097 Glib::StaticMutex m_field_queue_mutex;
00098
00100 std::queue<bit::FieldBuffer> m_field_queue;
00101
00103 void on_record_changed();
00104
00106 void on_record_changed_dispatcher();
00107
00108 void on_field_value_changed(bit::FieldBuffer);
00109
00110 void on_field_value_changed_dispatcher();
00111
00112 void set_field_value( bit::FieldBase::pointer field );
00113 void load_all_field_values();
00114 void load_all_field_values( bit::FieldBase::pointer );
00115
00116 void create_table();
00117 void setup_table();
00118 void create_fieldboxes(bit::FieldBase::pointer fb);
00119 void add_fieldbox(bit::FieldBase::pointer, unsigned left, unsigned right, unsigned top, unsigned bottom, Gdk::Color bg, Gdk::Color hl);
00120
00121 bool on_enter(GdkEventCrossing*, bit::FieldBase::pointer);
00122 bool on_leave(GdkEventCrossing*, bit::FieldBase::pointer);
00123
00124 };
00125
00126 }
00127
00128 #endif