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