You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spOSMroute/gtk/gtk_wnd_mapinfo.c

439 lines
15 KiB

/***************************************************************************
* gtk_wnd_mapinfo.c
*
* Thu Jul 19 19:00:10 2007
* Copyright 2007 Steffen Pohle
* steffen@gulpe.de
****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gtk/gtk.h>
#include "map.h"
#include "gtk_port.h"
enum {
HLIST_C_NR,
HLIST_C_FLAGS,
HLIST_C_LON,
HLIST_C_LAT,
HLIST_C_WAYS,
HLIST_C_AREAS,
HLIST_C_PLACES,
HLIST_C_POIS,
HLIST_C_MEMORY,
HLIST_C_MAX
};
enum {
WLIST_C_ID,
WLIST_C_SUBID,
WLIST_C_TYPE,
WLIST_C_NAME,
WLIST_C_MAX
};
GtkWidget *mapinfo_wnd = NULL;
GtkWidget *hash_list;
GtkWidget *wa_list;
GtkWidget *wa_info;
void hash_list_refresh ();
struct map_hashpos hash_list_getselected();
void wa_list_refresh (struct map_hashpos hpos);
int wa_list_getselected (unsigned long long int *id, short int *subid);
static gboolean mapinfo_wnd_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
mapinfo_wnd = NULL;
return FALSE; /* we can quit */
};
void mapinfo_refresh_click () {
hash_list_refresh ();
};
gboolean hash_list_click (GtkWidget *widget, GdkEventButton *event, gpointer *data) {
struct map_hashpos hpos = hash_list_getselected();
wa_list_refresh (hpos);
//map_ls_get_filename (fname, LEN_FILENAME, hpos.ilon, hpos.ilat);
//if ((lsstat = map_ls_statget (fname)) == NULL) return FALSE;
//d_printf ("%p : loaded.", lsstat);
return TRUE;
};
#define MAXTEXT 64000
gboolean wa_list_click (GtkWidget *widget, GdkEventButton *event, gpointer *data) {
unsigned long long int id;
short int subid;
GtkTextBuffer *tbuf;
char text1[MAXTEXT];
char text2[MAXTEXT];
char *texts = text1, *textd = text2, *textt;
struct map_hash *mh = NULL;
struct map_way *mw = NULL;
int i;
struct map_hashpos hpos = hash_list_getselected();
mh = map_hash_geti (hpos.ilon, hpos.ilat, MHLOAD_RELOAD);
if (mh && wa_list_getselected (&id, &subid)) {
for (mw = mh->ways; mw && (mw->subid != subid || mw->id != id); mw = mw->next);
snprintf (textd, MAXTEXT, "Hash lon: %d lat: %d\nWay ID: %lld : %d\n",
mh->pos.ilon, mh->pos.ilat, id, subid);
textt = textd; textd = texts; texts = textt;
snprintf (textd, MAXTEXT, "%s Name:%s\n", texts, mw->name);
textt = textd; textd = texts; texts = textt;
snprintf (textd, MAXTEXT, "%s Ref:%s\n", texts, mw->ref);
textt = textd; textd = texts; texts = textt;
snprintf (textd, MAXTEXT, "%s Nodes:%d\n", texts, mw->n_cnt);
textt = textd; textd = texts; texts = textt;
for (i = 0; i < mw->n_cnt; i++) {
snprintf (textd, MAXTEXT, "%s %d pnr:%d d.lon:%3.6f d.lat:%3.6f igeo:%d,%d d_wayid:%lld:%d d_pnr:%d\n",
texts, i, mw->n[i].pnr, mw->n[i].d.lon, mw->n[i].d.lat,
map_geo2igeo (mw->n[i].d.lon), map_geo2igeo (mw->n[i].d.lat),
mw->n[i].d_id, mw->n[i].d_subid, mw->n[i].d_pnr);
textt = textd; textd = texts; texts = textt;
}
snprintf (textd, MAXTEXT, "%s Points:%d\n", texts, mw->p_cnt);
textt = textd; textd = texts; texts = textt;
for (i = 0; i < mw->p_cnt; i++) {
snprintf (textd, MAXTEXT, "%s %d lon:%3.6f lat:%3.6f\n",
texts, i, mw->p[i].lon, mw->p[i].lat);
textt = textd; textd = texts; texts = textt;
}
tbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wa_info));
gtk_text_buffer_set_text (tbuf, texts, -1);
}
else {
sprintf (text1, "no data");
tbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wa_info));
gtk_text_buffer_set_text (tbuf, text1, -1);
}
return TRUE;
};
/*
* refresh way list
*/
void wa_list_refresh (struct map_hashpos hpos) {
GtkTreeStore *store;
GtkTreeIter toplevel;
struct map_way *mw;
struct map_hash *mh = NULL;
char wayid[32], *type, waysid[32];
char *way_types[] = {"MWAY_residential","MWAY_highway","MWAY_tertiary",
"MWAY_cycleway","MWAY_footway","MWAY_track","MWAY_service","MWAY_unknown","MWAY_MAX"};
/* add elements... */
store = gtk_tree_store_new (WLIST_C_MAX, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
if ((mh = map_hash_geti (hpos.ilon, hpos.ilat, MHLOAD_RELOAD))) {
mw = mh->ways;
while (mw) {
gtk_tree_store_append (store, &toplevel, NULL);
sprintf (wayid, "%lld", mw->id);
sprintf (waysid, "%d", mw->subid);
type = way_types[mw->type];
gtk_tree_store_set (store, &toplevel, WLIST_C_ID, wayid, WLIST_C_SUBID, waysid, WLIST_C_TYPE, type,
WLIST_C_NAME, mw->name, -1);
mw = mw->next;
}
}
gtk_tree_view_set_model (GTK_TREE_VIEW(wa_list), GTK_TREE_MODEL(store));
g_object_unref(store);
};
/*
* refresh the hash list
*/
void hash_list_refresh () {
GtkTreeStore *store;
GtkTreeIter toplevel;
int i;
char lon[16], lat[16], ways[16], areas[16], flags[16], memory[16], places[16], pois[16];
/* add elements... */
store = gtk_tree_store_new (HLIST_C_MAX, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
for (i = 0; i < mhash_max; i++) if (mhash[i]) {
gtk_tree_store_append (store, &toplevel, NULL);
sprintf (lon, "%d", mhash[i]->pos.ilon);
sprintf (lat, "%d", mhash[i]->pos.ilat);
sprintf (ways, "%d", mhash[i]->wayscnt);
sprintf (areas, "%d", mhash[i]->areascnt);
sprintf (places, "%d", mhash[i]->placescnt);
sprintf (pois, "%d", mhash[i]->poiscnt);
sprintf (flags, "%x", mhash[i]->status);
sprintf (memory, "%d", mhash[i]->datasize);
gtk_tree_store_set (store, &toplevel, HLIST_C_NR, i, HLIST_C_LON, lon, HLIST_C_LAT, lat,
HLIST_C_WAYS, ways, HLIST_C_AREAS, areas,
HLIST_C_PLACES, places, HLIST_C_POIS, pois,
HLIST_C_FLAGS, flags, HLIST_C_MEMORY, memory, -1);
}
gtk_tree_view_set_model (GTK_TREE_VIEW(hash_list), GTK_TREE_MODEL(store));
g_object_unref(store);
};
struct map_hashpos hash_list_getselected () {
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
gchar *ilon, *ilat;
struct map_hashpos ret;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(hash_list));
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
gtk_tree_model_get (model, &iter, HLIST_C_LON, &ilon, -1);
gtk_tree_model_get (model, &iter, HLIST_C_LAT, &ilat, -1);
ret.ilon = atoi (ilon);
ret.ilat = atoi (ilat);
g_free (ilon);
g_free (ilat);
}
return ret;
}
int wa_list_getselected (unsigned long long int *id, short int *subid) {
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
int reti = 0;
gchar *sid;
gchar *ssubid;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(wa_list));
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
gtk_tree_model_get (model, &iter, WLIST_C_ID, &sid, -1);
gtk_tree_model_get (model, &iter, WLIST_C_SUBID, &ssubid, -1);
*id = atoll(sid);
*subid = atoi (ssubid);
g_free (sid);
g_free (ssubid);
reti = 1;
}
return reti;
}
/*
* creates the main window
*/
void mapinfo_wnd_show () {
GtkWidget *main_box, *vpaned, *hpaned, *box1, *button, *scrwnd;
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
if (mapinfo_wnd == NULL) {
mapinfo_wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(mapinfo_wnd), _("spOSMroute - MAPINFO"));
gtk_window_set_default_size (GTK_WINDOW(mapinfo_wnd), 600, 450);
gtk_container_set_border_width (GTK_CONTAINER (mapinfo_wnd), 4);
g_signal_connect (G_OBJECT (mapinfo_wnd), "delete_event", G_CALLBACK (mapinfo_wnd_delete_event), NULL);
main_box = gtk_hbox_new (FALSE, 1);
gtk_container_add (GTK_CONTAINER (mapinfo_wnd), main_box);
/* button leiste */
box1 = gtk_vbox_new (FALSE, 1);
gtk_box_pack_start (GTK_BOX (main_box), box1, FALSE, FALSE, 4);
button = gtk_button_new_from_stock (GTK_STOCK_REFRESH);
gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 8);
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (mapinfo_refresh_click), NULL);
/*
* hash table
*/
vpaned = gtk_vpaned_new ();
gtk_box_pack_start (GTK_BOX (main_box), vpaned, TRUE, TRUE, 0);
/* add the scroll windows with the treeview.. and add the button release event.. */
scrwnd = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrwnd), GTK_SHADOW_IN);
hash_list = gtk_tree_view_new ();
gtk_container_add (GTK_CONTAINER (scrwnd), hash_list);
gtk_signal_connect (GTK_OBJECT (hash_list), "button-release-event", GTK_SIGNAL_FUNC (hash_list_click), NULL);
gtk_signal_connect (GTK_OBJECT (hash_list), "key-release-event", GTK_SIGNAL_FUNC (hash_list_click), NULL);
/* add the rows */
/* nr */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Nr"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_NR);
/* Changed */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Flags"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_FLAGS);
/* lon */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Lon"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_LON);
/* lat */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Lat"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_LAT);
/* ways */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Ways"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_WAYS);
/* areas */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Areas"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_AREAS);
/* places */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Places"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_PLACES);
/* pois */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Pois"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_POIS);
/* Memory */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Memory"));
gtk_tree_view_append_column (GTK_TREE_VIEW(hash_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", HLIST_C_MEMORY);
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW(hash_list)), GTK_SELECTION_SINGLE);
gtk_paned_pack1 (GTK_PANED (vpaned), scrwnd, FALSE, FALSE);
/*
* way/area list
*/
hpaned = gtk_hpaned_new ();
gtk_paned_pack2 (GTK_PANED (vpaned), hpaned, FALSE, FALSE);
/* add the scroll windows with the treeview.. and add the button release event.. */
scrwnd = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrwnd), GTK_SHADOW_IN);
wa_list = gtk_tree_view_new ();
gtk_container_add (GTK_CONTAINER (scrwnd), wa_list);
gtk_signal_connect (GTK_OBJECT (wa_list), "button-release-event", GTK_SIGNAL_FUNC (wa_list_click), NULL);
gtk_signal_connect (GTK_OBJECT (wa_list), "key-release-event", GTK_SIGNAL_FUNC (wa_list_click), NULL);
/* add the rows */
/* id */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Id"));
gtk_tree_view_append_column (GTK_TREE_VIEW(wa_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", WLIST_C_ID);
/* subid */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Subid"));
gtk_tree_view_append_column (GTK_TREE_VIEW(wa_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", WLIST_C_SUBID);
/* Type */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Type"));
gtk_tree_view_append_column (GTK_TREE_VIEW(wa_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", WLIST_C_TYPE);
/* name */
col = gtk_tree_view_column_new ();
gtk_tree_view_column_set_title (col, _("Name"));
gtk_tree_view_append_column (GTK_TREE_VIEW(wa_list), col);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute (col, renderer, "text", WLIST_C_NAME);
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW(wa_list)), GTK_SELECTION_SINGLE);
gtk_paned_pack1 (GTK_PANED (hpaned), scrwnd, FALSE, TRUE);
/*
* way/area info
*/
scrwnd = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrwnd), GTK_SHADOW_IN);
wa_info = gtk_text_view_new ();
gtk_container_add (GTK_CONTAINER (scrwnd), wa_info);
gtk_paned_pack2 (GTK_PANED (hpaned), scrwnd, TRUE, FALSE);
gtk_widget_show_all (mapinfo_wnd);
gtk_text_view_set_editable (GTK_TEXT_VIEW(wa_info), FALSE);
}
else
gtk_widget_show_all (mapinfo_wnd);
hash_list_refresh ();
};