Initial Commit
[celltowerinfo] / src / cellinfo-window.c
1 #include "cellinfo-window.h"
2
3 #include <gtk/gtk.h>
4
5 #include <glib/gi18n.h>
6
7 static void create_cellinfo (CellinfoWindow *self);
8 static void create_menu (CellinfoWindow *self);
9
10 static void cellinfo_on_location_changed(LocationGPSDevice *device, gpointer data);
11
12 static void cellinfo_window_on_menu_select_sensors (GtkButton *button, gpointer data);
13 static void cellinfo_window_on_menu_configuration (GtkButton *button, gpointer data);
14
15
16 G_DEFINE_TYPE (CellinfoWindow, cellinfo_window, HILDON_TYPE_WINDOW)
17
18 static void
19 cellinfo_window_dispose (GObject *object)
20 {
21   CellinfoWindow *self = CELLINFO_WINDOW (object);
22   
23   location_gpsd_control_stop(self->control);
24   G_OBJECT_CLASS (cellinfo_window_parent_class)->dispose (object);
25 }
26
27 static void
28 cellinfo_window_finalize (GObject *object)
29 {
30   G_OBJECT_CLASS (cellinfo_window_parent_class)->finalize (object);
31 }
32
33 static void
34 cellinfo_window_class_init (CellinfoWindowClass *klass)
35 {
36   GObjectClass *object_class = G_OBJECT_CLASS (klass);
37
38
39   object_class->dispose = cellinfo_window_dispose;
40   object_class->finalize = cellinfo_window_finalize;
41 }
42
43 static void
44 cellinfo_window_init (CellinfoWindow *self)
45 {
46    
47   /* Create a vbox which will contain our text view: */
48   GtkWidget *main_vbox = gtk_vbox_new (FALSE, 0);
49   gtk_container_add (GTK_CONTAINER (self), main_vbox);
50     
51   /* Create all necessary parts: */
52   create_cellinfo (self);
53   create_menu (self);
54     
55   /* Put the cell info in the vbox and show it: */
56   gtk_box_pack_start (GTK_BOX (main_vbox), self->vb_cellinfo, TRUE, TRUE, 0);
57   gtk_widget_show (main_vbox);
58     
59   /* Set the intial focus on the text view: */
60   gtk_widget_grab_focus (GTK_WIDGET(self->vb_cellinfo));
61   
62 }
63
64 CellinfoWindow*
65 cellinfo_window_new (osso_context_t *osso)
66 {
67   CellinfoWindow *self = 
68     CELLINFO_WINDOW (g_object_new (CELLINFO_TYPE_WINDOW, NULL));
69   
70   /* Avoid adding extra code such as this to a _new() function when writing 
71    * widgets that should be reusable. This should really be a GObject property.
72    */
73   self->osso = osso; 
74   
75   return self;
76 }
77
78 static GtkWidget* add_menu_item (GtkWidget *main_menu, const gchar* title,
79     GCallback clicked_callback, gpointer user_data)
80 {
81   HildonAppMenu *app_menu = HILDON_APP_MENU (main_menu);
82     
83   /* Create a button, add it, and return it: */
84   GtkWidget *button = hildon_button_new_with_text (HILDON_SIZE_AUTO, 
85         HILDON_BUTTON_ARRANGEMENT_VERTICAL, title, NULL);
86   gtk_widget_show (button);
87     
88   g_signal_connect_after (button, "clicked", 
89     G_CALLBACK (clicked_callback), user_data);
90             
91   hildon_app_menu_append (app_menu, GTK_BUTTON (button));
92     
93   return button;
94 }
95
96 static void create_menu (CellinfoWindow *self)
97 {
98   return;
99   /* Create needed handles */
100   GtkWidget *main_menu = hildon_app_menu_new ();
101   
102   /* Create the menu items */
103   self->select_sensors = add_menu_item (main_menu, _("Select Sensors"),
104     G_CALLBACK (&cellinfo_window_on_menu_select_sensors), self);
105     
106
107   /* Create the menu items */
108   self->select_sensors = add_menu_item (main_menu, _("Configuration"),
109     G_CALLBACK (&cellinfo_window_on_menu_configuration), self);
110
111   /* Add menu to HildonWindow */
112   hildon_window_set_app_menu (
113     HILDON_WINDOW (self),
114     HILDON_APP_MENU (main_menu));
115   
116   /* We need to show menu items */
117   gtk_widget_show_all (GTK_WIDGET (main_menu));
118 }
119 static gboolean cellinfo_start_location (gpointer data)
120 {
121   location_gpsd_control_start ((LocationGPSDControl *) data);
122   return FALSE;
123 }
124
125 static gboolean cellinfo_on_gpsd_running (LocationGPSDControl *control, gpointer data){
126   CellinfoWindow *self = (CellinfoWindow *)data;
127   if(self->device){
128     g_print("gpsd running status %d\n", self->device->status);
129   }else{
130     g_print("No device !");
131   }
132   return FALSE;
133 }
134
135 static void cellinfo_on_gpsd_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data)
136 {
137   g_print("GPSD error!\n");
138   switch (error) {
139   case LOCATION_ERROR_USER_REJECTED_DIALOG:
140     g_debug("User didn't enable requested methods");
141     break;
142   case LOCATION_ERROR_USER_REJECTED_SETTINGS:
143     g_debug("User changed settings, which disabled location");
144     break;
145   case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE:
146     g_debug("Problems with BT GPS");
147     break;
148   case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE:
149     g_debug("Requested method is not allowed in offline mode");
150     break;
151   case LOCATION_ERROR_SYSTEM:
152     g_debug("System error");
153     break;
154   }
155 }
156
157 static GtkWidget *add_cellinfo_label_entry(CellinfoWindow *self, const char *entry_name, GtkWidget **label){
158   GtkWidget *hbox;
159   GtkWidget *l;
160
161   hbox = gtk_hbox_new (TRUE, 1);
162   l = gtk_label_new(entry_name);
163   *label = gtk_label_new("");
164
165   gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT);
166   gtk_label_set_justify (GTK_LABEL (*label), GTK_JUSTIFY_LEFT);
167   gtk_box_pack_start (GTK_BOX (hbox), l, TRUE, TRUE, 0);
168   gtk_box_pack_start (GTK_BOX (hbox), *label, TRUE, TRUE, 0);
169   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), hbox, TRUE, TRUE, 0);
170
171   return hbox;
172 }
173 static void create_cellinfo (CellinfoWindow *self)
174 {
175   GtkWidget   *hbox;
176   GtkWidget   *label;
177
178   /* Location stuff */
179   self->control = location_gpsd_control_get_default();
180   self->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL);
181
182   g_object_set(G_OBJECT(self->control),
183     "preferred-method", LOCATION_METHOD_CWP,
184     "preferred-interval", LOCATION_INTERVAL_DEFAULT,
185     NULL);
186
187   g_signal_connect(self->device, "changed", G_CALLBACK(cellinfo_on_location_changed), self);
188   g_signal_connect(self->control, "gpsd-running", G_CALLBACK(cellinfo_on_gpsd_running), self);
189   g_signal_connect(self->control, "error", G_CALLBACK(cellinfo_on_gpsd_error), self);
190
191   g_idle_add(cellinfo_start_location, self->control);
192
193   /* Main container */
194   self->vb_cellinfo = gtk_vbox_new(TRUE, 1);
195
196   /* CELL TYPE */
197   hbox = gtk_hbox_new (TRUE, 1);
198   label = gtk_label_new(_("Cell Type:"));
199   self->lb_cell_type = gtk_label_new("");
200   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
201   gtk_box_pack_start (GTK_BOX (hbox), self->lb_cell_type, TRUE, TRUE, 0);
202   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), hbox, TRUE, TRUE, 0);
203
204
205   /* CELL ID */
206   self->hb_cell_id = add_cellinfo_label_entry (self, _("Cell Id:"), &self->lb_cell_id);
207
208   /* MNC */
209   hbox = gtk_hbox_new (TRUE, 1);
210   label = gtk_label_new (_("MNC:"));
211   self->lb_mnc = gtk_label_new("");
212   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
213   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0); 
214   gtk_box_pack_start (GTK_BOX (hbox), self->lb_mnc, TRUE, TRUE, 0);
215   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), hbox, TRUE, TRUE, 0);
216
217   /* MCC */
218   hbox = gtk_hbox_new (TRUE, 1);
219   label = gtk_label_new(_("MCC:"));
220   self->lb_mcc = gtk_label_new("");
221   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
222   gtk_box_pack_start (GTK_BOX (hbox), self->lb_mcc, TRUE, TRUE, 0);
223   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), hbox, TRUE, TRUE, 0);
224
225   /* LAC */
226   self->hb_lac = gtk_hbox_new (TRUE, 1);
227   label = gtk_label_new(_("LAC:"));
228   self->lb_lac = gtk_label_new("");
229   gtk_box_pack_start (GTK_BOX (self->hb_lac), label, TRUE, TRUE, 0);
230   gtk_box_pack_start (GTK_BOX (self->hb_lac), self->lb_lac, TRUE, TRUE, 0);
231   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), self->hb_lac, TRUE, TRUE, 0);
232
233   /* UCID */ 
234   self->hb_ucid = gtk_hbox_new (TRUE, 1);
235   label = gtk_label_new(_("UCID:"));
236   self->lb_ucid = gtk_label_new("");
237   gtk_box_pack_start (GTK_BOX (self->hb_ucid), label, TRUE, TRUE, 0);
238   gtk_box_pack_start (GTK_BOX (self->hb_ucid), self->lb_ucid, TRUE, TRUE, 0);
239   gtk_box_pack_start (GTK_BOX (self->vb_cellinfo), self->hb_ucid, TRUE, TRUE, 0);
240
241
242   gtk_widget_show_all (self->vb_cellinfo);
243
244   gtk_widget_hide_all (self->hb_cell_id);
245   gtk_widget_hide_all (self->hb_lac);
246   gtk_widget_hide_all (self->hb_ucid);
247
248 }
249
250 static void cellinfo_window_on_menu_select_sensors (GtkButton *button, gpointer data)
251 {
252   return;
253 }
254
255 static void cellinfo_window_on_menu_configuration (GtkButton *button, gpointer data)
256 {
257   //CellinfoWindow *self = CELLINFO_WINDOW (data);
258   return;
259 }
260
261 static void cellinfo_on_location_changed(LocationGPSDevice *device, gpointer data)
262 {
263   CellinfoWindow *self = CELLINFO_WINDOW (data);
264   if (!device) {
265     g_print("No device\n");
266     return;
267   }
268   g_print("Changed! status %d\n", device->status);
269   if (device->cell_info){
270     if (device->cell_info->flags & LOCATION_CELL_INFO_GSM_CELL_INFO_SET){
271       _gsm_cell_info ci = device->cell_info->gsm_cell_info;
272       gtk_label_set_text (GTK_LABEL (self->lb_cell_type), _("GSM"));
273       gtk_label_set_text (GTK_LABEL (self->lb_cell_id), g_strdup_printf ("%d",ci.cell_id));
274       gtk_label_set_text (GTK_LABEL (self->lb_mnc), g_strdup_printf ("%d",ci.mnc));
275       gtk_label_set_text (GTK_LABEL (self->lb_mcc), g_strdup_printf ("%d",ci.mcc));
276       gtk_label_set_text (GTK_LABEL (self->lb_lac), g_strdup_printf ("%d",ci.lac));
277       gtk_widget_show_all (self->hb_cell_id);
278       gtk_widget_show_all (self->hb_lac);
279       gtk_widget_hide_all (self->hb_ucid);
280     } 
281     if (device->cell_info->flags & LOCATION_CELL_INFO_WCDMA_CELL_INFO_SET){
282       _wcdma_cell_info ci = device->cell_info->wcdma_cell_info;
283
284       gtk_label_set_text (GTK_LABEL (self->lb_cell_type), _("WCDMA"));
285       gtk_label_set_text (GTK_LABEL (self->lb_mnc), g_strdup_printf ("%d",ci.mnc));
286       gtk_label_set_text (GTK_LABEL (self->lb_mcc), g_strdup_printf ("%d",ci.mcc));
287       gtk_label_set_text (GTK_LABEL (self->lb_ucid), g_strdup_printf ("%d",ci.ucid));
288       gtk_widget_hide_all (self->hb_cell_id);
289       gtk_widget_hide_all (self->hb_lac);
290       gtk_widget_show_all (self->hb_ucid);
291     }    
292   }
293 }
294
295