+
+static gint
+layer_get_page_index (RepoLayersInfo *rli, GtkTreeIter list_it)
+{
+ GtkTreePath *p1, *p2;
+ GtkTreeIter p;
+ gint index = 0;
+
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rli->layers_store), &p);
+
+ p1 = gtk_tree_model_get_path (GTK_TREE_MODEL (rli->layers_store), &list_it);
+ p2 = gtk_tree_model_get_path (GTK_TREE_MODEL (rli->layers_store), &p);
+
+ while (gtk_tree_path_compare (p1, p2) != 0) {
+ gtk_tree_path_next (p2);
+ index++;
+ }
+
+ gtk_tree_path_free (p1);
+ gtk_tree_path_free (p2);
+
+ return index;
+}
+
+
+static gboolean
+layer_name_changed (GtkWidget *entry, LayerEditInfo *lei)
+{
+ const gchar* name;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ /* take new name */
+ name = gtk_entry_get_text (GTK_ENTRY (entry));
+
+ /* find selected entry in list view */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (lei->rli->layers_list));
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ gtk_list_store_set (lei->rli->layers_store, &iter, 0, name, -1);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+layer_dialog_browse (GtkWidget *widget, LayerEditInfo *lei)
+{
+ GtkWidget *dialog;
+ gchar *basename;
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ dialog = GTK_WIDGET(
+ hildon_file_chooser_dialog_new(GTK_WINDOW(lei->rli->dialog),
+ GTK_FILE_CHOOSER_ACTION_SAVE));
+
+ gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog),
+ gtk_entry_get_text(GTK_ENTRY(lei->txt_db)));
+
+ /* Work around a bug in HildonFileChooserDialog. */
+ basename = g_path_get_basename(
+ gtk_entry_get_text(GTK_ENTRY(lei->txt_db)));
+ g_object_set(G_OBJECT(dialog), "autonaming", FALSE, NULL);
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), basename);
+
+ if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)))
+ {
+ gchar *filename = gtk_file_chooser_get_filename(
+ GTK_FILE_CHOOSER(dialog));
+ gtk_entry_set_text(GTK_ENTRY(lei->txt_db), filename);
+ g_free(filename);
+ }
+
+ gtk_widget_destroy(dialog);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+
+static LayerEditInfo*
+repoman_layers_add_layer (RepoLayersInfo *rli, gchar* name)
+{
+ LayerEditInfo *lei = g_new (LayerEditInfo, 1);
+ GtkWidget *vbox;
+ GtkWidget *hbox2;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *btn_browse;
+ GtkTreeIter layers_iter;
+
+ printf("%s(%s)\n", __PRETTY_FUNCTION__, name);
+
+ lei->rli = rli;
+
+ rli->layer_edits = g_list_append (rli->layer_edits, lei);
+
+ gtk_notebook_append_page (GTK_NOTEBOOK (rli->notebook), vbox = gtk_vbox_new (FALSE, 4),
+ gtk_label_new (name));
+
+ gtk_box_pack_start (GTK_BOX (vbox), table = gtk_table_new (4, 2, FALSE),
+ FALSE, FALSE, 0);
+
+ /* Layer name */
+ gtk_table_attach (GTK_TABLE (table), label = gtk_label_new (_("Name")),
+ 0, 1, 0, 1, GTK_FILL, 0, 2, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.f, 0.5f);
+ gtk_table_attach (GTK_TABLE (table), lei->txt_name = gtk_entry_new (),
+ 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+ gtk_entry_set_text (GTK_ENTRY (lei->txt_name), name);
+
+ /* signals */
+ g_signal_connect(G_OBJECT(lei->txt_name), "changed", G_CALLBACK(layer_name_changed), lei);
+
+ /* URL format */
+ gtk_table_attach (GTK_TABLE (table), label = gtk_label_new (_("URL")),
+ 0, 1, 1, 2, GTK_FILL, 0, 2, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.f, 0.5f);
+ gtk_table_attach (GTK_TABLE (table), lei->txt_url = gtk_entry_new (),
+ 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+
+ /* Map directory */
+ gtk_table_attach (GTK_TABLE (table), label = gtk_label_new (_("Cache DB")),
+ 0, 1, 2, 3, GTK_FILL, 0, 2, 0);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.f, 0.5f);
+ gtk_table_attach (GTK_TABLE (table), hbox2 = gtk_hbox_new (FALSE, 4),
+ 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+ gtk_box_pack_start (GTK_BOX (hbox2), lei->txt_db = gtk_entry_new (),
+ TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox2), btn_browse = gtk_button_new_with_label (_("Browse...")),
+ FALSE, FALSE, 0);
+
+ g_signal_connect(G_OBJECT(btn_browse), "clicked", G_CALLBACK(layer_dialog_browse), lei);
+
+ /* Autorefresh */
+ gtk_table_attach (GTK_TABLE (table), label = gtk_label_new (_("Autofetch")),
+ 0, 1, 3, 4, GTK_FILL, 0, 2, 0);
+ gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
+ gtk_table_attach (GTK_TABLE (table), hbox2 = gtk_hbox_new (FALSE, 4),
+ 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+ gtk_box_pack_start (GTK_BOX (hbox2), lei->num_autofetch = hildon_number_editor_new (0, 120),
+ FALSE, FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (hbox2), label = gtk_label_new (_("min.")), FALSE, FALSE, 4);
+ gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
+
+ /* Visible */
+ gtk_box_pack_start (GTK_BOX (vbox), lei->chk_visible = gtk_check_button_new_with_label (_("Layer is visible")),
+ FALSE, FALSE, 4);
+
+ gtk_widget_show_all (vbox);
+
+ /* Side list view with layers */
+ gtk_list_store_append (rli->layers_store, &layers_iter);
+ gtk_list_store_set (rli->layers_store, &layers_iter, 0, name, -1);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+
+ return lei;
+}
+
+
+
+static gboolean
+repoman_layers_new (GtkWidget *widget, RepoLayersInfo *rli)
+{
+ static GtkWidget *hbox = NULL;
+ static GtkWidget *label = NULL;
+ static GtkWidget *txt_name = NULL;
+ static GtkWidget *dialog = NULL;
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ if(dialog == NULL)
+ {
+ dialog = gtk_dialog_new_with_buttons(_("New Layer"),
+ GTK_WINDOW(rli->dialog), GTK_DIALOG_MODAL,
+ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+ NULL);
+
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
+ hbox = gtk_hbox_new(FALSE, 4), FALSE, FALSE, 4);
+
+ gtk_box_pack_start(GTK_BOX(hbox),
+ label = gtk_label_new(_("Name")),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox),
+ txt_name = gtk_entry_new(),
+ TRUE, TRUE, 0);
+ }
+
+ gtk_entry_set_text(GTK_ENTRY(txt_name), "");
+
+ gtk_widget_show_all(dialog);
+
+ while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
+ {
+ repoman_layers_add_layer(rli,
+ g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_name))));
+ break;
+ }
+
+ gtk_widget_hide(dialog);
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+repoman_layers_del (GtkWidget *widget, RepoLayersInfo *rli)
+{
+ GtkTreeIter iter;
+ GtkTreeSelection *selection;
+ gint index;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ /* delete list item */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rli->layers_list));
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ index = layer_get_page_index (rli, iter);
+ gtk_list_store_remove (rli->layers_store, &iter);
+
+ rli->layer_edits = g_list_remove_link (rli->layer_edits, g_list_nth (rli->layer_edits, index));
+
+ /* delete notebook page */
+ gtk_notebook_remove_page (GTK_NOTEBOOK (rli->notebook), index);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+repoman_layers_up (GtkWidget *widget, RepoLayersInfo *rli)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter, iter2;
+ GtkTreePath *path;
+ gint page;
+ LayerEditInfo *lei;
+ GList *list_elem;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ /* find selected entry in list view */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rli->layers_list));
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ iter2 = iter;
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (rli->layers_store), &iter);
+ if (!gtk_tree_path_prev (path) || !gtk_tree_model_get_iter (GTK_TREE_MODEL (rli->layers_store), &iter, path)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ gtk_tree_path_free (path);
+
+ /* move it up */
+ gtk_list_store_move_before (rli->layers_store, &iter2, &iter);
+
+ /* reorder notebook tabs */
+ page = gtk_notebook_get_current_page (GTK_NOTEBOOK (rli->notebook));
+ gtk_notebook_reorder_child (GTK_NOTEBOOK (rli->notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (rli->notebook), page), page-1);
+
+ /* reorder layer edits */
+ list_elem = g_list_nth (rli->layer_edits, page);
+ lei = list_elem->data;
+ rli->layer_edits = g_list_remove_link (rli->layer_edits, list_elem);
+ rli->layer_edits = g_list_insert (rli->layer_edits, lei, page-1);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+repoman_layers_dn (GtkWidget *widget, RepoLayersInfo *rli)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter iter, iter2;
+ gint page;
+ LayerEditInfo *lei;
+ GList *list_elem;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ /* find selected entry in list view */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rli->layers_list));
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ iter2 = iter;
+ if (!gtk_tree_model_iter_next (GTK_TREE_MODEL (rli->layers_store), &iter)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ /* move it down */
+ gtk_list_store_move_after (rli->layers_store, &iter2, &iter);
+
+ /* reorder notebook tabs */
+ page = gtk_notebook_get_current_page (GTK_NOTEBOOK (rli->notebook));
+ gtk_notebook_reorder_child (GTK_NOTEBOOK (rli->notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (rli->notebook), page), page+1);
+
+ /* reorder layer edits */
+ list_elem = g_list_nth (rli->layer_edits, page);
+ lei = list_elem->data;
+ rli->layer_edits = g_list_remove_link (rli->layer_edits, list_elem);
+ rli->layer_edits = g_list_insert (rli->layer_edits, lei, page+1);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+repoman_layer_selected (GtkTreeSelection *selection, RepoLayersInfo *rli)
+{
+ GtkTreeIter cur;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ if (!gtk_tree_selection_get_selected (selection, NULL, &cur)) {
+ vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (rli->notebook), layer_get_page_index (rli, cur));
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+
+static gboolean
+repoman_layers(GtkWidget *widget, RepoManInfo *rmi)
+{
+ GtkWidget *hbox = NULL;
+ GtkWidget *layers_vbox = NULL;
+ GtkWidget *buttons_hbox = NULL;
+ GtkWidget *frame;
+ GtkCellRenderer *layers_rendeder = NULL;
+ GtkTreeViewColumn *layers_column = NULL;
+ GtkTreeSelection *selection;
+
+ /* layers buttons */
+ GtkWidget *btn_new = NULL;
+ GtkWidget *btn_del = NULL;
+ GtkWidget *btn_up = NULL;
+ GtkWidget *btn_dn = NULL;
+
+ const char* t_header = _("Manage layers [%s]");
+ char* header = NULL;
+ RepoEditInfo* rei = NULL;
+ RepoLayersInfo rli;
+ gint curr_repo_index = gtk_combo_box_get_active (GTK_COMBO_BOX (rmi->cmb_repos));
+ RepoData *rd;
+
+ printf("%s()\n", __PRETTY_FUNCTION__);
+
+ if (curr_repo_index < 0) {
+ vprintf("%s(): return FALSE (1)\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ rei = g_list_nth_data (rmi->repo_edits, curr_repo_index);
+
+ if (!rei) {
+ vprintf("%s(): return FALSE (2)\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ /* check that rei have repo data structure. If it haven't, it means that repository have just
+ added, so report about this */
+ if (!rei->repo) {
+ GtkWidget *msg = hildon_note_new_information ( GTK_WINDOW (rmi->dialog),
+ _("You cannot add layers to not saved repository,\nsorry. So, press ok in repository manager\n"
+ "and open this dialog again."));
+
+ gtk_dialog_run (GTK_DIALOG (msg));
+ gtk_widget_destroy (msg);
+
+ vprintf("%s(): return FALSE (3)\n", __PRETTY_FUNCTION__);
+ return FALSE;
+ }
+
+ header = g_malloc (strlen (t_header) + strlen (rei->name));
+ sprintf (header, t_header, rei->name);
+
+ printf ("Creating dialog with header: %s\n", header);
+
+ rli.layer_edits = NULL;
+ rli.dialog = gtk_dialog_new_with_buttons (header, GTK_WINDOW (rmi->dialog), GTK_DIALOG_MODAL,
+ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
+
+ rli.layers_store = gtk_list_store_new (1, G_TYPE_STRING);
+ rli.layers_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (rli.layers_store));
+ layers_rendeder = gtk_cell_renderer_text_new ();
+ layers_column = gtk_tree_view_column_new_with_attributes ("Column", layers_rendeder, "text", 0, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (rli.layers_list), layers_column);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (rli.layers_list));
+
+ frame = gtk_frame_new (NULL);
+ gtk_container_add (GTK_CONTAINER (frame), rli.layers_list);
+ gtk_widget_set_size_request (frame, -1, 100);
+
+ /* beside layers list with have buttons on bottom */
+ layers_vbox = gtk_vbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (layers_vbox), frame, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (layers_vbox), buttons_hbox = gtk_hbox_new (FALSE, 4), FALSE, FALSE, 0);
+
+ /* buttons */
+ gtk_box_pack_start (GTK_BOX (buttons_hbox), btn_new = gtk_button_new_with_label (_("New")), FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (buttons_hbox), btn_del = gtk_button_new_with_label (_("Del")), FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (buttons_hbox), btn_up = gtk_button_new_with_label (_("Up")), FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (buttons_hbox), btn_dn = gtk_button_new_with_label (_("Dn")), FALSE, FALSE, 0);
+
+ /* signals */
+ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(repoman_layer_selected), &rli);
+ g_signal_connect(G_OBJECT(btn_new), "clicked", G_CALLBACK(repoman_layers_new), &rli);
+ g_signal_connect(G_OBJECT(btn_del), "clicked", G_CALLBACK(repoman_layers_del), &rli);
+ g_signal_connect(G_OBJECT(btn_up), "clicked", G_CALLBACK(repoman_layers_up), &rli);
+ g_signal_connect(G_OBJECT(btn_dn), "clicked", G_CALLBACK(repoman_layers_dn), &rli);
+
+ /* notebook with layers' attributes */
+ rli.notebook = gtk_notebook_new ();
+
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(rli.notebook), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(rli.notebook), FALSE);
+
+ /* walk through all layers and add notebook pages */
+ rd = rei->repo->layers;
+ while (rd) {
+ LayerEditInfo *lei = repoman_layers_add_layer (&rli, rd->name);
+
+ gtk_entry_set_text (GTK_ENTRY (lei->txt_url), rd->url);
+ gtk_entry_set_text (GTK_ENTRY (lei->txt_db), rd->db_filename);
+ hildon_number_editor_set_value (HILDON_NUMBER_EDITOR (lei->num_autofetch), rd->layer_refresh_interval);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lei->chk_visible), rd->layer_enabled);
+
+ rd = rd->layers;
+ }
+
+ /* pack all widgets together */
+ hbox = gtk_hbox_new (FALSE, 4);
+
+ gtk_box_pack_start (GTK_BOX (hbox), layers_vbox, TRUE, TRUE, 4);
+ gtk_box_pack_start (GTK_BOX (hbox), rli.notebook, TRUE, TRUE, 4);
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (rli.dialog)->vbox), hbox, FALSE, FALSE, 4);
+
+ gtk_widget_show_all (rli.dialog);
+
+ while (GTK_RESPONSE_ACCEPT == gtk_dialog_run (GTK_DIALOG (rli.dialog)))
+ {
+ RepoData **rdp;
+ gint i;
+ GList *curr;
+
+ menu_layers_remove_repos ();
+
+ /* iterate over notebook's pages and build layers */
+ /* keep list in memory in case downloads use it (TODO: reference counting) */
+ rdp = &rei->repo->layers;
+ *rdp = NULL;
+
+ for (i = 0, curr = rli.layer_edits; curr; curr = curr->next, i++) {
+ LayerEditInfo *lei = curr->data;
+
+ rd = g_new0 (RepoData, 1);
+ *rdp = rd;
+
+ rd->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (lei->txt_name)));
+ rd->url = g_strdup (gtk_entry_get_text (GTK_ENTRY (lei->txt_url)));
+ rd->db_filename = g_strdup (gtk_entry_get_text (GTK_ENTRY (lei->txt_db)));
+ rd->layer_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lei->chk_visible));
+ rd->layer_refresh_interval = hildon_number_editor_get_value (HILDON_NUMBER_EDITOR (lei->num_autofetch));
+ rd->layer_refresh_countdown = rd->layer_refresh_interval;
+ rd->layer_level = i+1;
+
+ rd->dl_zoom_steps = rei->repo->dl_zoom_steps;
+ rd->view_zoom_steps = rei->repo->view_zoom_steps;
+ rd->double_size = rei->repo->double_size;
+ rd->nextable = rei->repo->nextable;
+ rd->min_zoom = rei->repo->min_zoom;
+ rd->max_zoom = rei->repo->max_zoom;
+
+ set_repo_type (rd);
+ rdp = &rd->layers;
+ }
+
+ menu_layers_add_repos ();
+ repo_set_curr(_curr_repo);
+ settings_save ();
+ map_cache_clean ();
+ map_refresh_mark (TRUE);
+ break;
+ }
+
+ gtk_widget_destroy (rli.dialog);
+
+ vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+ return TRUE;
+}
+
+