00001 #ifndef _UNIOSCILLOGRAPH_H
00002 #define _UNIOSCILLOGRAPH_H
00003
00004 #include <gtkmm.h>
00005 #include "UniOscilChannel.h"
00006 #include "UDefaultFunctions.h"
00007 #include "GuiPM.h"
00008 #include "USignals.h"
00009 #include "UScale.h"
00010 #include "plugins.h"
00011 #include "global_macros.h"
00012
00018 class UniOscillograph : public UDefaultFunctions<Gtk::Fixed>
00019 {
00020 public:
00021 UniOscillograph();
00022 explicit UniOscillograph(GtkmmBaseType::BaseObjectType* gobject);
00023 virtual ~UniOscillograph();
00024
00025 virtual void process_sensor(UniSetTypes::ObjectId,UniSetTypes::ObjectId,long);
00026 void startup_init(void);
00027
00028 static std::string timeToString(time_t tm=time(0), std::string brk="");
00029 static std::string dateToString(time_t tm=time(0), std::string brk="");
00030 static bool createDir( const std::string dir );
00031 void timeToInt(long time,int &hour, int &min, int &sec, time_t tm=time(0));
00033 protected:
00034 enum ScalePosition
00035 {
00036 LEFT = 0,
00037 RIGHT,
00038 TOP,
00039 BOTTOM
00040 };
00041 virtual bool on_plot_area_event(GdkEvent *event);
00042 virtual void on_add(Gtk::Widget* w);
00043 virtual void on_remove(Gtk::Widget* w);
00044 virtual void oscil_allocate_changed(Gtk::Allocation& alloc);
00045 virtual void on_realize();
00046 virtual bool on_expose_event(GdkEventExpose*);
00047 virtual void set_connector(const ConnectorRef& connector) throw();
00048 virtual void on_connect() throw();
00049 virtual void on_disconnect() throw();
00050 virtual void draw_channels_list();
00051 virtual void draw_tooltip();
00052 virtual bool on_dialog_focus_out_event(GdkEventFocus *event);
00053
00054 bool on_timer_tick();
00055
00056 Gtk::VBox *topScaleBox;
00057 Gtk::VBox *bottomScaleBox;
00058 Gtk::HBox *leftScaleBox;
00059 Gtk::HBox *rightScaleBox;
00060 HScale *topScale;
00061 HScale *bottomScale;
00062 VScale *leftScale;
00063 VScale *rightScale;
00064
00065 Web *plot_area;
00066 Gtk::Table *table;
00067 Gtk::HBox *hbox;
00068
00069 Gtk::Image *BGImage;
00070 Gtk::Image *expandBGImage;
00071
00072 Gtk::Frame *channelsListBox;
00073 Gtk::EventBox *channelsListScrollwin;
00074 Glib::RefPtr<Pango::Layout> channels_layout;
00075
00076 Glib::RefPtr<Pango::Layout> tooltip_layout;
00077 Glib::RefPtr<Gdk::Pixbuf> tooltip_image;
00078
00079 private:
00080 void ctor();
00081 sigc::connection tmr;
00082
00083 void connect_child(Gtk::Widget* child);
00084 void disconnect_child(Gtk::Widget& child);
00085
00086 void set_child_connector(Gtk::Widget&);
00087
00088 void on_web_enable_changed();
00089 void on_web_color_changed();
00090 void on_scales_enable_changed();
00091 void on_scales_y_range_changed();
00092 void on_scales_x_range_changed();
00093 void on_scales_x_step_changed();
00094 void on_scales_autoscale_changed();
00095 void on_font_changed();
00096 void on_font_color_changed();
00097 void on_scale_color_changed();
00098 void on_v_scale_changed();
00099 void on_h_scale_changed();
00100 void on_plot_bg_color_changed();
00101 void on_refresh_timeout_changed();
00102 void on_bg_image_changed();
00103 void on_expand_bg_image_changed();
00104 void on_bg_border_width_changed();
00105 void on_tooltip_image_changed();
00106 void on_tooltip_font_changed();
00107 void on_history_enable_changed();
00108 void on_history_dir_changed();
00109 void on_channels_list_width_changed();
00110 void on_channels_list_font_changed();
00111 void on_channels_list_frame_changed();
00112 void on_channels_list_border_width_changed();
00113 void set_channel_random_color(UniOscilChannel *ch);
00114 void dialog_change_position();
00115
00116 bool scroll_channels_list_event(GdkEvent *event);
00117
00118 void set_channel_visible();
00119 void set_all_channel_visible(bool show = true);
00120 void set_channel_visible_only();
00121 void save_channel();
00122 void save_all_channels();
00123 void save_channel_in_file(int channel_num, string filename);
00124 void save_all_channels_in_one_file();
00125 void set_channel_color();
00126 void set_dynamic_range();
00127 void set_range();
00128 void oscil_expand();
00129 inline void set_oscil_web(){ prop_enableWeb.set_value(!prop_enableWeb);};
00130
00131 typedef std::vector<UniOscilChannel*> ChannelsList;
00132 ChannelsList channels;
00133
00134 struct CnannelHistoryData
00135 {
00136 CnannelHistoryData():
00137 value(0),
00138 tm()
00139 {
00140 };
00141 float value;
00142 time_t tm;
00143 }__attribute__((packed));
00144 typedef std::map<int,CnannelHistoryData> CnannelHistoryDataMap;
00145 typedef std::map<double,CnannelHistoryDataMap> HistoryMap;
00146 HistoryMap history;
00147
00148 typedef std::map<double,double> CnannelsDataMap;
00149 typedef std::map<UniOscilChannel*,CnannelsDataMap> DataMap;
00150 DataMap data;
00151
00152 int width;
00153 int height;
00154 int ch_num;
00155 double min_x;
00156 double max_x;
00157 double min_y;
00158 double max_y;
00159 double point_x;
00160 double step_x;
00161 double range_y;
00162 bool show_tooltip;
00163 bool is_show;
00164 bool is_expand;
00165 int widget_width;
00166 int widget_height;
00167 int widget_x;
00168 int widget_y;
00169
00170 int softmove_ch_list_pos_x;
00171 int softmove_ch_list_pos_y;
00172 int softmove_ch_list_step_x;
00173 int softmove_ch_list_step_y;
00174 int softmove_ch_list_start_x;
00175 int softmove_ch_list_start_y;
00176 bool softmove_ch_list_start;
00177
00178 std::string history_file_fullname;
00179 Gtk::Menu* menu_popup;
00180 Gtk::ImageMenuItem* mi_set_expand;
00181 Gtk::ImageMenuItem* mi_set_web;
00182 Gtk::ImageMenuItem* mi_set_dynamic_range;
00183 Gtk::ImageMenuItem* mi_set_range;
00184 Gtk::ImageMenuItem* mi_save_all_in_one;
00185 Gtk::ImageMenuItem* mi_save_all_channels;
00186 Gtk::Dialog* range_dialog;
00187 Gtk::SpinButton *ymin_spinbutton;
00188 Gtk::SpinButton *ymax_spinbutton;
00189
00190 Gtk::Menu* ch_menu_popup;
00191 Gtk::ImageMenuItem* ch_mi_visible_channel;
00192 Gtk::ImageMenuItem* ch_mi_visible_only_one_channel;
00193 Gtk::ImageMenuItem* ch_mi_visible_all_channel;
00194 Gtk::ImageMenuItem* ch_mi_hide_all_channel;
00195 Gtk::ImageMenuItem* ch_mi_save_all_in_one;
00196 Gtk::ImageMenuItem* ch_mi_save_channel;
00197 Gtk::ImageMenuItem* ch_mi_save_all_channels;
00198 Gtk::ImageMenuItem* ch_mi_set_channel_color;
00199 int save_channel_num;
00200 Gtk::ColorSelectionDialog* cs_dialog;
00201
00202 ADD_PROPERTY( prop_refresh_timeout, int )
00203 ADD_PROPERTY( prop_enableTimeLine, bool )
00204 ADD_PROPERTY( prop_timeLineColor, Gdk::Color )
00205 ADD_PROPERTY( prop_enableWeb, bool )
00206 ADD_PROPERTY( prop_webColor, Gdk::Color )
00207 ADD_PROPERTY( prop_scaleColor, Gdk::Color )
00208 ADD_PROPERTY( prop_scaleLabelColor, Gdk::Color )
00209 ADD_PROPERTY( prop_scaleLabelFont, Glib::ustring )
00210 ADD_PROPERTY( prop_scaleLabelFontSize, int )
00211 ADD_PROPERTY( prop_topScale, bool )
00212 ADD_PROPERTY( prop_bottomScale, bool )
00213 ADD_PROPERTY( prop_leftScale, bool )
00214 ADD_PROPERTY( prop_rightScale, bool )
00215 ADD_PROPERTY( prop_XRange, float )
00216 ADD_PROPERTY( prop_XStepsNum, int )
00217 ADD_PROPERTY( prop_YMin, float )
00218 ADD_PROPERTY( prop_YMax, float )
00219 ADD_PROPERTY( prop_YDynamicRange, bool )
00220 ADD_PROPERTY( prop_smoothCurve, bool )
00221 ADD_PROPERTY( prop_XmaxMin, int )
00222 ADD_PROPERTY( prop_XmaxMaj, int )
00223 ADD_PROPERTY( prop_YmaxMin, int )
00224 ADD_PROPERTY( prop_YmaxMaj, int )
00225 ADD_PROPERTY( prop_BGImagePath, Glib::ustring)
00226 ADD_PROPERTY( prop_expandBGImagePath, Glib::ustring)
00227 ADD_PROPERTY( prop_bgBorderWidth, int)
00228 ADD_PROPERTY( prop_enableTooltip, bool )
00229 ADD_PROPERTY( prop_tooltipImagePath, Glib::ustring)
00230 ADD_PROPERTY( prop_tooltipImageWidth, int )
00231 ADD_PROPERTY( prop_tooltipImageHeight, int )
00232 ADD_PROPERTY( prop_enableTooltipRealTime, bool )
00233 ADD_PROPERTY( prop_tooltipLabelPrecision, int )
00234 ADD_PROPERTY( prop_tooltipLabelColor, Gdk::Color )
00235 ADD_PROPERTY( prop_tooltipLabelFont, Glib::ustring )
00236 ADD_PROPERTY( prop_tooltipLabelFontSize, int )
00237 ADD_PROPERTY( prop_enableHisory, bool )
00238 ADD_PROPERTY( prop_dir, Glib::ustring )
00239 ADD_PROPERTY( prop_historyPointInMem, long )
00240 ADD_PROPERTY( prop_enableLabelList, bool )
00241 ADD_PROPERTY( prop_labelListWidth, int )
00242 ADD_PROPERTY( prop_labelListBorderWidth, int )
00243 ADD_PROPERTY( prop_labelListFrame, Gtk::ShadowType )
00244 ADD_PROPERTY( prop_labelListFont, Glib::ustring )
00245 ADD_PROPERTY( prop_labelListFontSize, int )
00247 DISALLOW_COPY_AND_ASSIGN(UniOscillograph);
00248 };
00249
00250 template<>
00251 inline GType UObj_Get_Type<UniOscillograph>()
00252 {
00253 static GType gtype = 0;
00254 if (gtype)
00255 return gtype;
00256
00257 UniOscillograph* dummy = new UniOscillograph();
00258 GtkContainerClass* container_klass = GTK_CONTAINER_GET_CLASS( dummy->gobj() );
00259
00260 gtype = G_OBJECT_TYPE(dummy->gobj());
00261 delete( dummy );
00262 Glib::wrap_register(gtype, &UObj_Wrap_New<UniOscillograph>);
00263
00264 return gtype;
00265 }
00266 #endif