1 /***************************************************************************
2   FAC_toggle.cpp
3   Handle dialog factory element : Toggle
4   (C) 2006 Mean Fixounet@free.fr
5 ***************************************************************************/
6 
7 /***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 #include "ADM_toolkitGtk.h"
17 #include "DIA_factory.h"
18 namespace ADM_GtkFactory
19 {
20 class diaElemHex : public diaElem
21 {
22   uint32_t dataSize;
23   uint8_t  *data;
24 
25 public:
26 
27   diaElemHex(const char *toggleTitle, uint32_t dataSize,uint8_t *data);
28   virtual ~diaElemHex() ;
29   void setMe(void *dialog, void *opaque,uint32_t line);
30   void getMe(void) ;
31   void finalize(void);
32   int getRequiredLayout(void);
33 };
34 
35 #define HEX_NB_LINE   8
36 #define HEX_NB_COLUMN 16
37 
38 typedef struct hexStruct
39 {
40     GtkWidget *grid;
41     GtkWidget *entry[HEX_NB_LINE];
42     uint8_t   *data;
43     uint32_t  size;
44     uint32_t  curOffset;
45 }hexStruct;
46 
47 static void updateMe(hexStruct *s);
48 static void prev(void *z,hexStruct *s);
49 static void next(void *z,hexStruct *s);
50 
diaElemHex(const char * toggleTitle,uint32_t dataSize,uint8_t * data)51 diaElemHex::diaElemHex(const char *toggleTitle, uint32_t dataSize,uint8_t *data)
52   : diaElem(ELEM_HEXDUMP)
53 {
54   param=NULL;
55   paramTitle=toggleTitle;
56   this->tip=NULL;
57   this->data=data;
58   this->dataSize=dataSize;
59    setSize(3);
60 }
61 
~diaElemHex()62 diaElemHex::~diaElemHex()
63 {
64   if(myWidget)
65   {
66      hexStruct *s=(hexStruct *)myWidget;
67      delete s;
68      myWidget=NULL;
69   }
70 }
setMe(void * dialog,void * opaque,uint32_t line)71 void diaElemHex::setMe(void *dialog, void *opaque,uint32_t line)
72 {
73   GtkWidget *hexTable;
74   GtkWidget *buttonP, *alignment1, *hbox1, *image1, *label1;
75   GtkWidget *buttonN, *alignment2, *hbox2, *image2, *label2;
76   uint8_t *tail=data+dataSize;
77 
78   hexTable=gtk_table_new(1,HEX_NB_LINE,0);
79   gtk_widget_show(hexTable);
80 
81 
82   gtk_table_attach (GTK_TABLE (opaque), hexTable, 0, 2, line, line+1,
83                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
84                     (GtkAttachOptions) (0), 0, 0);
85 
86   hexStruct *s=new hexStruct;
87   s->grid=hexTable;
88   s->data=data;
89   s->size=dataSize;
90   s->curOffset=0;
91   for(int i=0;i<HEX_NB_LINE;i++)
92   {
93     s->entry[i]=gtk_label_new("");
94     gtk_label_set_selectable(GTK_LABEL(s->entry[i]), TRUE);
95     gtk_misc_set_alignment (GTK_MISC (s->entry[i]), 0, 1);
96     gtk_widget_show(s->entry[i]);
97      gtk_table_attach (GTK_TABLE (hexTable), s->entry[i], 0, 1, i, i+1,
98                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
99                     (GtkAttachOptions) (0), 0, 0);
100   }
101   myWidget=(void *)s;
102   //*************************
103   buttonP = gtk_button_new_with_mnemonic (QT_TR_NOOP("_Previous"));
104   gtk_widget_show (buttonP);
105   gtk_table_attach (GTK_TABLE (opaque), buttonP, 0, 1, line+1, line+2,
106                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
107                     (GtkAttachOptions) (0), 0, 0);
108   g_signal_connect(buttonP, "clicked", G_CALLBACK(prev), s);
109 
110   buttonN = gtk_button_new_with_mnemonic (QT_TR_NOOP("_Next"));
111   gtk_widget_show (buttonN);
112   gtk_table_attach (GTK_TABLE (opaque), buttonN, 1, 2, line+1, line+2,
113                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
114                     (GtkAttachOptions) (0), 0, 0);
115   g_signal_connect(buttonN, "clicked", G_CALLBACK(next), s);
116 #if 0
117   alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);
118   gtk_widget_show (alignment1);
119 
120 
121   hbox1 = gtk_hbox_new (FALSE, 2);
122   gtk_widget_show (hbox1);
123   gtk_container_add (GTK_CONTAINER (alignment1), hbox1);
124 
125 
126   gtk_box_pack_start (GTK_BOX (hbox1), buttonP, FALSE, FALSE, 0);
127   gtk_container_add (GTK_CONTAINER (buttonP), alignment1);
128 
129   image1 = gtk_image_new_from_stock ("gtk-go-back", GTK_ICON_SIZE_BUTTON);
130   gtk_widget_show (image1);
131   gtk_box_pack_start (GTK_BOX (hbox1), image1, FALSE, FALSE, 0);
132 
133   label1 = gtk_label_new_with_mnemonic (QT_TR_NOOP("_Previous"));
134   gtk_widget_show (label1);
135   gtk_box_pack_start (GTK_BOX (hbox1), label1, FALSE, FALSE, 0);
136 
137   gtk_table_attach (GTK_TABLE (opaque), hbox1, 0, 1, line+1, line+2,
138                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
139                     (GtkAttachOptions) (0), 0, 0);
140 
141   g_signal_connect(buttonP, "clicked", G_CALLBACK(prev), s);
142 
143 
144   alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);
145   gtk_widget_show (alignment2);
146   gtk_container_add (GTK_CONTAINER (buttonN), alignment2);
147 
148   hbox2 = gtk_hbox_new (FALSE, 2);
149   gtk_widget_show (hbox2);
150   gtk_container_add (GTK_CONTAINER (alignment2), hbox2);
151 
152   buttonN = gtk_button_new ();
153   gtk_widget_show (buttonN);
154   gtk_box_pack_start (GTK_BOX (hbox2), buttonN, FALSE, FALSE, 0);
155 
156 
157   image2 = gtk_image_new_from_stock ("gtk-go-forward", GTK_ICON_SIZE_BUTTON);
158   gtk_widget_show (image2);
159   gtk_box_pack_start (GTK_BOX (hbox2), image2, FALSE, FALSE, 0);
160 
161   label2 = gtk_label_new_with_mnemonic (QT_TR_NOOP("_Next"));
162   gtk_widget_show (label2);
163   gtk_box_pack_start (GTK_BOX (hbox2), label2, FALSE, FALSE, 0);
164 
165   gtk_table_attach (GTK_TABLE (opaque), hbox2, 0, 1, line+2, line+3,
166                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
167                     (GtkAttachOptions) (0), 0, 0);
168   g_signal_connect(buttonN, "clicked", G_CALLBACK(next),  s);
169 #endif
170   updateMe(s);
171 }
prev(void * z,hexStruct * s)172 void prev(void *z,hexStruct *s)
173 {
174   if(s->curOffset>=HEX_NB_COLUMN*4)
175       s->curOffset-=HEX_NB_COLUMN*4;
176   updateMe(s);
177 
178 }
next(void * z,hexStruct * s)179 void next(void *z,hexStruct *s)
180 {
181       s->curOffset+=HEX_NB_COLUMN*4;
182   updateMe(s);
183 }
updateMe(hexStruct * s)184 void updateMe(hexStruct *s)
185 {
186   uint8_t *tail=s->data+s->size;
187   uint8_t *cur;
188   char string[3000];
189   char *ptr;
190   for(int i=0;i<HEX_NB_LINE;i++)
191   {
192      cur=s->data+HEX_NB_COLUMN*i+s->curOffset;
193 
194      sprintf(string,"%06x:",HEX_NB_COLUMN*i+s->curOffset);
195      ptr=string+strlen(string);
196      *ptr=0;
197      for(int j=0;j<HEX_NB_COLUMN;j++)
198      {
199        if(cur<tail)
200        {
201           sprintf(ptr,"%02X ",*cur++);
202        }
203 	   else
204        {
205 		  sprintf(ptr,"XX ");
206        }
207 
208 	   ptr+=3;
209      }
210 
211      gtk_label_set_text(GTK_LABEL(s->entry[i]),string);
212   }
213 }
getMe(void)214 void diaElemHex::getMe(void)
215 {
216 
217 }
finalize(void)218 void diaElemHex::finalize(void)
219 {
220 
221 };
222 
getRequiredLayout(void)223 int diaElemHex::getRequiredLayout(void) { return 0; }
224 
225 } // End of namespace
226 //****************************Hoook*****************
227 
gtkCreateHex(const char * toggleTitle,uint32_t dataSize,uint8_t * data)228 diaElem  *gtkCreateHex(const char *toggleTitle, uint32_t dataSize,uint8_t *data)
229 {
230 	return new  ADM_GtkFactory::diaElemHex(toggleTitle,dataSize,data);
231 }
gtkDestroyHex(diaElem * e)232 void gtkDestroyHex(diaElem *e)
233 {
234 	ADM_GtkFactory::diaElemHex *a=(ADM_GtkFactory::diaElemHex *)e;
235 	delete a;
236 }
237 //EOF
238