/* ** Copyright (C) 2000-2003 Daniel Sundberg, mike@penbex.com.tw and ** Anatoly Demchishin ** ** 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 <iostream> #include <fstream> #include <stdlib.h> #include <stdio.h> #include <string.h> #include "gtk_common.h" #include "jagsmenubar.h" #include "jagsprefsdialog.h" #include "jagsabout.h" #include "jagsmountwith.h" #include "jagssearchdialog.h" #include "jagsmntswindow.h" #include "data.h" GtkWidget *bookmarks_item; GtkWidget *bookmarks_menu; GtkWidget *popup_menu; GtkWidget *browse_item; GtkWidget *mount_and_browse_item; GtkWidget *mount_item; GtkWidget *mount_with_item; GtkWidget *mount_with_command_item; GtkWidget *browse_item2; GtkWidget *mount_and_browse_item2; GtkWidget *mount_item2; GtkWidget *mount_with_item2; gchar *server_name = NULL; gchar *share_name = NULL; gchar *workgroup_name = NULL; gchar *localmasterbrowser_name = NULL; gchar *remotelocalmasterbrowser_name = NULL; gint mount_error; gint bm_updated = TRUE; gchar *clean(gchar *s); Mount *mmnt = NULL; JagsMntsWindow *mb_mnts_window = NULL; JagsConfig *menubar_conf = NULL; JagsMenuBar *jagsmb = NULL; GtkWidget *bmark_server; GtkWidget *bmark_workgroup; MainWindow *menubar_mainw; /* Extra callbacks for the bookmarks dialog */ static gint edit_bookmarks_close(GtkWidget *, gpointer data); static gint edit_bookmarks_up(GtkWidget *, gpointer data); static gint edit_bookmarks_down(GtkWidget *, gpointer data); static gint edit_bookmarks_remove(GtkWidget *, gpointer data); static gint edit_bookmarks_selection_made(GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer user_data); gint bookmarks_selected_row = -1; JagsMenuBar::JagsMenuBar(GtkWidget *vbox, GtkWidget *itree, JagsConfig *iconf, Mount *imount, MainWindow *mainw) { GList *glist = NULL; conf = iconf; menubar_conf = iconf; mmnt = imount; mb_mnts_window = new JagsMntsWindow(mmnt, conf); jagsmb = this; main_tree = itree; menubar_mainw = mainw; /* Setup the menubar handlebox */ handlebox = gtk_handle_box_new (); gtk_widget_show (handlebox); gtk_box_pack_start (GTK_BOX (vbox), handlebox, FALSE, FALSE, 0); /* Init the menubar */ menubar = gtk_menu_bar_new(); gtk_widget_show (menubar); gtk_container_add (GTK_CONTAINER (handlebox), menubar); /* Setup the filemenu */ menuitem = gtk_menu_item_new_with_label("File"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menubar), menuitem); menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); mount_and_browse_item = gtk_menu_item_new_with_label_with_pixmap("Mount & browse...", "browse.xpm"); gtk_widget_show (mount_and_browse_item); gtk_container_add (GTK_CONTAINER (menu), mount_and_browse_item); gtk_signal_connect (GTK_OBJECT(mount_and_browse_item), "activate", GTK_SIGNAL_FUNC (mount_and_browse), jagsmb); browse_item = gtk_menu_item_new_with_label_with_pixmap("Browse...", "browse.xpm"); gtk_widget_show (browse_item); gtk_container_add (GTK_CONTAINER (menu), browse_item); gtk_signal_connect(GTK_OBJECT(browse_item), "activate", GTK_SIGNAL_FUNC(browse), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); mount_item = gtk_menu_item_new_with_label_with_pixmap("Mount", "mount.xpm"); gtk_widget_show (mount_item); gtk_container_add (GTK_CONTAINER (menu), mount_item); gtk_signal_connect (GTK_OBJECT(mount_item), "activate", GTK_SIGNAL_FUNC (mount), jagsmb); mount_with_item = gtk_menu_item_new_with_label_with_pixmap("Mount with pass...", "pass.xpm"); gtk_widget_show (mount_with_item); gtk_container_add (GTK_CONTAINER (menu), mount_with_item); gtk_signal_connect (GTK_OBJECT(mount_with_item), "activate", GTK_SIGNAL_FUNC (mount_with), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); menuitem = gtk_menu_item_new_with_label_with_pixmap("Exit", "exit.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); menuitem = gtk_menu_item_new_with_label("Settings"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menubar), menuitem); menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("Preferences...", "settings.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC (preferences), conf); /* Search menu */ menuitem = gtk_menu_item_new_with_label("Search"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menubar), menuitem); menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("Search computer...", "search.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC (my_search), jagsmb); /* Shares menu */ menuitem = gtk_menu_item_new_with_label("Shares"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menubar), menuitem); menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("Unmount all...", "unmount.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(umount), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); menuitem = gtk_menu_item_new_with_label_with_pixmap("Mounted shares...", "browse.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(mnts_window), jagsmb); /* Bookmarks-menu */ bookmarks_item = gtk_menu_item_new_with_label("Bookmarks"); gtk_widget_show(bookmarks_item); gtk_container_add(GTK_CONTAINER(menubar), bookmarks_item); gtk_signal_connect(GTK_OBJECT(bookmarks_item), "activate", GTK_SIGNAL_FUNC(bookmark_menu), jagsmb); bookmarks_menu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(bookmarks_item), bookmarks_menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("Bookmark server", "new_item.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_add), jagsmb); menuitem = gtk_menu_item_new_with_label_with_pixmap("Add bookmark manually", "new_item.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmarks_add_edit), jagsmb); menuitem = gtk_menu_item_new_with_label_with_pixmap("Edit bookmarks...", "settings.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_edit), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); /* Add the bookmarks */ if (iconf->get_show_debug()) g_print("Loading bookmarks...\n"); if (iconf->get_nBmarks() > 0) { glist = g_list_copy(iconf->get_bmarks()); while (glist->next->next) { if (iconf->get_show_debug()) g_print("%s (server) %s (workgroup)\n", (gchar *)glist->next->data, (gchar *)glist->next->next->data); menuitem = gtk_menu_item_new_with_label_with_pixmap((gchar *)glist->next->data, "i-bookmark.xpm"); gtk_widget_show(menuitem); gtk_container_add(GTK_CONTAINER(bookmarks_menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_selected), jagsmb); if (glist->next->next->next) glist = glist->next->next; else break; } } else { if (iconf->get_show_debug()) g_print("No bookmarks to load\n"); } /* Help menu */ menuitem = gtk_menu_item_new_with_label("Help"); //gtk_menu_item_right_justify(GTK_MENU_ITEM(menuitem)); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menubar), menuitem); menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("About...", "about.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC (about), jagsmb); /* Setup the popup menu */ popup_menu = gtk_menu_new(); mount_and_browse_item2 = gtk_menu_item_new_with_label_with_pixmap("Mount & browse...", "browse.xpm"); gtk_widget_show (mount_and_browse_item2); gtk_container_add (GTK_CONTAINER (popup_menu), mount_and_browse_item2); gtk_signal_connect (GTK_OBJECT(mount_and_browse_item2), "activate", GTK_SIGNAL_FUNC (mount_and_browse), jagsmb); browse_item2 = gtk_menu_item_new_with_label_with_pixmap("Browse...", "browse.xpm"); gtk_widget_show (browse_item2); gtk_container_add (GTK_CONTAINER (popup_menu), browse_item2); gtk_signal_connect (GTK_OBJECT(browse_item2), "activate", GTK_SIGNAL_FUNC (browse), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (popup_menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); mount_item2 = gtk_menu_item_new_with_label_with_pixmap("Mount", "mount.xpm"); gtk_widget_show (mount_item2); gtk_container_add (GTK_CONTAINER (popup_menu), mount_item2); gtk_signal_connect (GTK_OBJECT(mount_item2), "activate", GTK_SIGNAL_FUNC (mount), jagsmb); mount_with_item2 = gtk_menu_item_new_with_label_with_pixmap("Mount with pass", "pass.xpm"); gtk_widget_show (mount_with_item2); gtk_container_add (GTK_CONTAINER (popup_menu), mount_with_item2); gtk_signal_connect (GTK_OBJECT(mount_with_item2), "activate", GTK_SIGNAL_FUNC (mount_with), jagsmb); } JagsMenuBar::~JagsMenuBar() { delete mb_mnts_window; } GtkWidget *JagsMenuBar::get_popupmenu(void) { return popup_menu; } void JagsMenuBar::set_server_name(gchar *name) { server_name = g_strdup_printf("%s", name); } void JagsMenuBar::set_share_name(gchar *name) { share_name = g_strdup_printf("%s", name); } void JagsMenuBar::set_workgroup_name(gchar *name) { workgroup_name = g_strdup_printf("%s", name); } void JagsMenuBar::set_localmasterbrowser_name(gchar *name) { localmasterbrowser_name = g_strdup_printf("%s", name); } void JagsMenuBar::set_remotelocalmasterbrowser_name(gchar *name) { remotelocalmasterbrowser_name = g_strdup_printf("%s", name); } gchar *JagsMenuBar::get_server_name(void) { return server_name; } gchar *JagsMenuBar::get_share_name(void) { return share_name; } gchar *JagsMenuBar::get_workgroup_name(void) { return workgroup_name; } gchar *JagsMenuBar::get_localmasterbrowser_name(void) { return localmasterbrowser_name; } gchar *JagsMenuBar::get_remotelocalmasterbrowser_name(void) { return remotelocalmasterbrowser_name; } /* Grey or ungrey the menuitems, Actually vi reset the menuitems here if TRUE */ void JagsMenuBar::toggle_menu_items(gboolean view) { gboolean value = view; gtk_widget_set_sensitive(GTK_WIDGET(browse_item), !value); gtk_widget_set_sensitive(GTK_WIDGET(mount_and_browse_item), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_item), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_with_item), value); gtk_widget_set_sensitive(GTK_WIDGET(browse_item2), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_and_browse_item2), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_item2), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_with_item2), value); } void JagsMenuBar::toggle_browse(gboolean value) { gtk_widget_set_sensitive(GTK_WIDGET(browse_item), value); gtk_widget_set_sensitive(GTK_WIDGET(browse_item2), value); } void JagsMenuBar::toggle_mount_and_browse(gboolean value) { gtk_widget_set_sensitive(GTK_WIDGET(mount_and_browse_item), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_and_browse_item2), value); } void JagsMenuBar::toggle_mount(gboolean value) { gtk_widget_set_sensitive(GTK_WIDGET(mount_item), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_item2), value); } void JagsMenuBar::toggle_mount_with(gboolean value) { gtk_widget_set_sensitive(GTK_WIDGET(mount_with_item), value); gtk_widget_set_sensitive(GTK_WIDGET(mount_with_item2), value); } void JagsMenuBar::toggle_greyall(void) { toggle_browse(FALSE); toggle_mount_and_browse(FALSE); toggle_mount(FALSE); toggle_mount_with(FALSE); } void JagsMenuBar::toggle_on_share_select(void) { gchar *mnt, *server, *share,*sharemod,*path; GList *glist = mmnt->mounts; gint flag = 0; path = getenv("HOME"); server = g_strdup(g_strchomp(server_name)); g_strup(server); // Only uppercase letters in the server-name share = g_strchomp(share_name); sharemod = g_strdup(share); g_strdelimit(sharemod, NULL, '_'); //--------------check if the share was already mounted------------------ //--------------memory check------------------------------------ mnt = g_strdup_printf("%s/%s/%s", conf->get_mount_dir(), server, share); if (glist) { while (glist->next) { if (strcmp((gchar *)glist->next->data, mnt) == 0) { flag=1; break; } glist = glist->next; } } g_free(mnt); if (!flag) toggle_unshade(); else toggle_on_mount(); } void JagsMenuBar::toggle_on_mount(void) { toggle_browse(TRUE); toggle_mount_and_browse(FALSE); toggle_mount(FALSE); toggle_mount_with(FALSE); } void JagsMenuBar::toggle_unshade(void) { toggle_browse(FALSE); toggle_mount_and_browse(TRUE); toggle_mount(TRUE); toggle_mount_with(TRUE); } void JagsMenuBar::mount_and_browse_ex(GtkMenuItem *item, JagsMenuBar *jmb) { mount(item, jmb); if (!mount_error) browse(item, jmb); } /*--------------------- Callbacks ------------------------------------------------*/ gint mount_and_browse(GtkMenuItem *item, JagsMenuBar *jmb) { mount(item, jmb); if (!mount_error) browse(item, jmb); return TRUE; } gint browse(GtkMenuItem *item, JagsMenuBar *jmb) { gchar *server = g_strdup(g_strchomp(server_name)); g_strup(server); gchar *command = g_strdup_printf("%s \"%s/%s/%s\" &", menubar_conf->get_browser(), menubar_conf->get_mount_dir(), server, share_name); if (menubar_conf->get_show_debug()) g_print("%s\n", command); system(command); return TRUE; } gint mount(GtkMenuItem *item, JagsMenuBar *jmb) { gint result; gchar *cmd = NULL, *server = NULL, *mntpath = NULL, *mnt = NULL; /* Here I use the mount-class */ if (g_strcasecmp(workgroup_name ,menubar_conf->get_workgroup())) { if (menubar_conf->get_show_debug()) g_print("Remote nmb resolution mount launched\n"); result = mmnt->addMount(server_name, share_name, g_strdup(workgroup_name), remotelocalmasterbrowser_name); } else { if (menubar_conf->get_show_debug()) g_print("Local nmb resolution mount launched\n"); result = mmnt->addMount(server_name, share_name); } if (menubar_conf->get_show_debug()) g_print("result == %d\n", result); if (result == OK) { mount_error = 0; if (menubar_conf->get_sound_enabled()) { cmd = g_strdup_printf("ogg123 %s %s/.jags/sounds/share2.ogg &", menubar_conf->get_sound_params(), g_get_home_dir()); system(cmd); g_free(cmd); } jmb->toggle_on_mount(); /* Call jagsmntswindow.addMnt() here */ server = g_strdup(server_name); g_strup(server); mntpath = g_strdup_printf("%s/%s/%s", menubar_conf->get_mount_dir(), server, share_name); mnt = g_strdup_printf("//%s/%s", server, share_name); mb_mnts_window->addMount(mnt, mntpath); return TRUE; } else if (result == ERROR) { /* Popup mount_with here */ if (menubar_conf->get_sound_enabled()) { cmd = g_strdup_printf("ogg123 %s %s/.jags/sounds/password2.ogg &", menubar_conf->get_sound_params(), g_get_home_dir()); system(cmd); g_free(cmd); } mount_error = 1; JagsMountWith *mw = new JagsMountWith(menubar_conf, server_name, share_name, jmb, mmnt, mb_mnts_window); gint i = mw->get_result(); if (i) { g_print("debug: %d\n",i); } else { g_print("debug %d\n",i); } return TRUE; } else { mount_error = 0; popup_dialog(140, "Error:", "Share probably already mounted...", "Ok"); jmb->toggle_on_mount(); return TRUE; } return TRUE; } gchar *clean(gchar *s) { int i = strlen(s); char *outstr = new char[i]; int j = 0; for (j = 0; j<i; j++) { if ( s[j] != ' ' ) { outstr[j]=s[j]; } else { break; } } outstr[j]='\0'; return outstr; } gint mount_with(GtkMenuItem *item, JagsMenuBar *jmb) { JagsMountWith *mw = new JagsMountWith(menubar_conf, server_name, share_name, jmb, mmnt, mb_mnts_window); if (mw) g_print("MountWith dialog memory allocation OK\n"); jmb->toggle_on_mount(); return TRUE; } gint preferences(GtkMenuItem *item, JagsConfig *conf) { gchar *cmd = NULL; if (conf->get_sound_enabled()) { cmd = g_strdup_printf("ogg123 %s %s/.jags/sounds/settings2.ogg &", conf->get_sound_params(), g_get_home_dir()); system(cmd); g_free(cmd); } JagsPrefsDialog *d = new JagsPrefsDialog(conf); if (d) g_print("Prefs dialog memory allocation OK\n"); return TRUE; } gint about(GtkMenuItem *item, JagsMenuBar *jmb) { JagsAbout *a = new JagsAbout(); if (a) g_print("About memory allocation OK\n"); return TRUE; } gint my_search(GtkMenuItem *item, JagsMenuBar *jmb) { JagsSearchDialog *d = new JagsSearchDialog(mmnt, jmb); if (d) g_print("Search dialog memory allocation OK\n"); return TRUE; } gint umount(GtkMenuItem *item, JagsMenuBar *jmb) { GList *glist = NULL; gchar *cmd = NULL; glist = g_list_copy(mmnt->mounts); if (glist->next) cmd = g_strdup_printf("ogg123 %s %s/.jags/sounds/unmall2.ogg &", jmb->conf->get_sound_params(), g_get_home_dir()); else cmd = g_strdup_printf("ogg123 %s %s/.jags/sounds/nothing2.ogg &", jmb->conf->get_sound_params(), g_get_home_dir()); if (jmb->conf->get_sound_enabled()) system(cmd); while (glist->next) { mmnt->rmMount((gchar *)glist->next->data); glist = glist->next; } g_list_free(glist); mb_mnts_window->clear_list(); g_free(cmd); return TRUE; } gint mnts_window(GtkMenuItem *item, JagsMenuBar *jmb) { // JagsMntsWindow *m = new JagsMntsWindow(mmnt, jmb->conf); mb_mnts_window->show(); return TRUE; } //-------------BOOKMARK SECTION------------------------------------------------- gint bookmark_menu(GtkMenuItem *item, JagsMenuBar *jmb) { return TRUE; } gint bookmark_add(GtkMenuItem *item, JagsMenuBar *jmb) { GtkWidget *menuitem; gchar *file = NULL; /* If we have selected a server, add it to bookmarks */ if (server_name) { g_print("Add bookmark\n"); file = g_strdup_printf("%s/.jags/bookmarks", getenv("HOME")); ofstream outf(file, ios::app); if (outf.good()) { outf << server_name << '\n'; outf.close(); menuitem = gtk_menu_item_new_with_label_with_pixmap(server_name, "i-bookmark.xpm"); gtk_widget_show(menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_selected), jmb); gtk_menu_append(GTK_MENU(bookmarks_menu), menuitem); } } else { g_print("Add bookmark: invalid item selected\n"); } return TRUE; } gint bookmarks_add_edit(GtkMenuItem *item, JagsMenuBar *jmb) { GtkWidget *dialog; GtkWidget *button, *button1 = NULL, *button2 = NULL, *label = NULL, *hbox = NULL, *table = NULL; GSList *group; g_print("Manual bookmark editing dialog...\n"); dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), "Manual bookmark editing..."); gtk_widget_set_usize(dialog, 400, 200); /* Server name */ hbox = gtk_hbox_new(TRUE, 3); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); label = gtk_label_new("Server NetBIOS name:"); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0); gtk_widget_show(label); bmark_server = gtk_entry_new(); gtk_entry_set_editable(GTK_ENTRY(bmark_server), TRUE); gtk_entry_set_text(GTK_ENTRY(bmark_server), "NAME"); gtk_box_pack_start(GTK_BOX(hbox), bmark_server, TRUE, TRUE, 0); gtk_widget_show(bmark_server); table=gtk_table_new(3, 2, TRUE); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, FALSE, 0); gtk_widget_show(table); /* Server name */ label = gtk_label_new("Server workgroup:"); gtk_table_attach_defaults(GTK_TABLE(table), label, 0,1, 0,1); gtk_widget_show(label); /* local */ button1 = gtk_radio_button_new_with_label (NULL, "local workgroup"); gtk_table_attach_defaults(GTK_TABLE(table), button1, 0,1, 1,2); gtk_signal_connect(GTK_OBJECT(button1), "toggled", GTK_SIGNAL_FUNC(bookmarks_radio_local_toggle), NULL); gtk_widget_show(button1); /* remote */ group = gtk_radio_button_group (GTK_RADIO_BUTTON (button1)); button2 = gtk_radio_button_new_with_label(group, "remote workgroup"); gtk_table_attach_defaults(GTK_TABLE(table), button2, 0,1, 2,3); gtk_widget_show(button2); bmark_workgroup = gtk_entry_new(); gtk_entry_set_editable(GTK_ENTRY(bmark_workgroup), TRUE); gtk_entry_set_text(GTK_ENTRY(bmark_workgroup), menubar_conf->get_workgroup()); gtk_widget_set_sensitive(bmark_workgroup, FALSE); gtk_table_attach_defaults(GTK_TABLE(table), bmark_workgroup, 1,2, 2,3); gtk_widget_show(bmark_workgroup); button = gtk_button_new_with_label("Ok"); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(bookmarks_edit_add_ok), NULL); button = gtk_button_new_with_label("Close"); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(bookmarks_edit_add_close), NULL); gtk_widget_show_all(dialog); return TRUE; } void bookmarks_radio_local_toggle (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) { /* If control reaches here, the toggle button is down */ gtk_widget_set_sensitive(bmark_workgroup, FALSE); gtk_entry_set_text(GTK_ENTRY(bmark_workgroup), menubar_conf->get_workgroup()); } else { /* If control reaches here, the toggle button is up */ gtk_widget_set_sensitive(bmark_workgroup, TRUE); } } gint bookmarks_edit_add_close(GtkWidget *widget, gpointer data) { gtk_widget_destroy(widget->parent->parent->parent); return TRUE; } gint bookmarks_edit_add_ok(GtkWidget *widget, gpointer data) { GtkWidget *menuitem = NULL; gchar *server = NULL, *workgroup = NULL; Data *d = NULL; GList *glist = NULL; gchar *command = NULL; gboolean flag = FALSE; gchar *error; server = g_strdup(gtk_entry_get_text(GTK_ENTRY(bmark_server))); workgroup = g_strdup(gtk_entry_get_text(GTK_ENTRY(bmark_workgroup))); if (strlen(server)<1) return TRUE; if (strlen(workgroup)<1) return TRUE; g_strup(server); g_strup(workgroup); /* Check for workgroup validity */ command = g_strdup_printf("list_workgroups.sh \"%s\"", localmasterbrowser_name); d = new Data(command, menubar_conf->get_plugin()); glist = d->getData(); if (!g_list_find_custom(glist->next, (gpointer)workgroup, (GCompareFunc)g_strcasecmp)) { error = g_strdup_printf("Could not find workgroup\n %s on the net\n" "Possibly invalid workgroup name specified\n", workgroup); popup_dialog(170, "Warning...", error, "Ok"); g_free(error); g_print("Invalid workgroup specified\n"); delete d; return TRUE; } /* check for server name uniqueness */ if (menubar_conf->get_nBmarks() > 0) { glist = g_list_copy(menubar_conf->get_bmarks()); while (glist->next->next) { if (!g_strcasecmp((gchar *)glist->next->data, server)) { error = g_strdup_printf("Server with similar name %s\nis bookmarked " "allready\n", server); popup_dialog(150, "Warning...", error, "Ok"); g_free(error); g_print("Server with similar name is bookmarked allready\n"); delete d; flag=TRUE; break; } if (glist->next->next->next) glist = glist->next->next; else break; } } if (flag) return TRUE; menubar_conf->addBmark(server, workgroup); menuitem = gtk_menu_item_new_with_label_with_pixmap(server, "i-bookmark.xpm"); gtk_widget_show(menuitem); gtk_container_add(GTK_CONTAINER(bookmarks_menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_selected), jagsmb); gtk_widget_destroy(widget->parent->parent->parent); delete d; return TRUE; } gint bookmark_edit(GtkMenuItem *item, JagsMenuBar *jmb) { GtkWidget *dialog, *scrolled_window, *clist, *button_up; GtkWidget *button_down, *button_remove, *button_close;// *button_man_add; gchar *titles[2]; GList *glist = NULL; g_print("Edit bookmarks...\n"); dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), "Edit bookmarks..."); gtk_widget_set_usize(dialog, 500, 300); titles[0] = g_strdup("Server"); titles[1] = g_strdup("Workgroup"); clist = gtk_clist_new_with_titles(2, titles); gtk_clist_set_column_width(GTK_CLIST(clist), 0, 150); gtk_clist_set_column_width(GTK_CLIST(clist), 1, 150); gtk_signal_connect(GTK_OBJECT(clist), "select_row", GTK_SIGNAL_FUNC(edit_bookmarks_selection_made), (gpointer)clist); if (menubar_conf->get_nBmarks() > 0) { glist = g_list_copy(menubar_conf->get_bmarks()); while (glist->next->next) { gchar *buffer2[1]; buffer2[0] = g_strdup((gchar *)glist->next->data); buffer2[1] = g_strdup((gchar *)glist->next->next->data); gtk_clist_append(GTK_CLIST(clist), buffer2); if (glist->next->next->next) glist = glist->next->next; else break; } } button_up = gtk_button_new_with_label("Move up"); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button_up); gtk_signal_connect(GTK_OBJECT(button_up), "clicked", GTK_SIGNAL_FUNC(edit_bookmarks_up), (gpointer)clist); button_down = gtk_button_new_with_label("Move down"); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), button_down); gtk_signal_connect(GTK_OBJECT(button_down), "clicked", GTK_SIGNAL_FUNC(edit_bookmarks_down), (gpointer)clist); button_remove = gtk_button_new_with_label("Remove"); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button_remove); gtk_signal_connect(GTK_OBJECT(button_remove), "clicked", GTK_SIGNAL_FUNC(edit_bookmarks_remove), (gpointer)clist); button_close = gtk_button_new_with_label("Close"); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button_close); gtk_signal_connect(GTK_OBJECT(button_close), "clicked", GTK_SIGNAL_FUNC(edit_bookmarks_close), (gpointer)clist); // titles[1] = g_strdup("Server-path"); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), clist); gtk_widget_show(scrolled_window); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), scrolled_window); gtk_widget_show(clist); gtk_widget_show_all(dialog); return TRUE; } gint edit_bookmarks_selection_made(GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer user_data) { bookmarks_selected_row = row; return TRUE; } gint edit_bookmarks_up(GtkWidget *widget, gpointer data) { if ((bookmarks_selected_row != 0) && (bookmarks_selected_row != -1) && (GTK_CLIST(data)->rows > 1)) { gtk_clist_swap_rows(GTK_CLIST(data), bookmarks_selected_row, bookmarks_selected_row-1); bookmarks_selected_row--; } return TRUE; } gint edit_bookmarks_down(GtkWidget *widget, gpointer data) { if ((bookmarks_selected_row != (GTK_CLIST(data)->rows)-1) && (bookmarks_selected_row != -1) && (GTK_CLIST(data)->rows > 1)) { gtk_clist_swap_rows(GTK_CLIST(data), bookmarks_selected_row, bookmarks_selected_row+1); bookmarks_selected_row++; } return TRUE; } gint edit_bookmarks_remove(GtkWidget *widget, gpointer data) { gchar *server[1]; gtk_clist_get_text(GTK_CLIST(data), bookmarks_selected_row, 0, server); menubar_conf->delBmark(server[0]); gtk_clist_remove(GTK_CLIST(data), bookmarks_selected_row); return TRUE; } gint edit_bookmarks_close(GtkWidget *widget, gpointer data) { GtkWidget *menuitem; GList *glist = NULL; gtk_widget_destroy(bookmarks_menu); /* Bookmarks-menu */ bookmarks_menu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(bookmarks_item), bookmarks_menu); menuitem = gtk_menu_item_new_with_label_with_pixmap("Bookmark server", "new_item.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_add), jagsmb); menuitem = gtk_menu_item_new_with_label_with_pixmap("Add bookmark manually", "new_item.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmarks_add_edit), jagsmb); menuitem = gtk_menu_item_new_with_label_with_pixmap("Edit bookmarks...", "settings.xpm"); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_signal_connect (GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_edit), jagsmb); menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); gtk_container_add (GTK_CONTAINER (bookmarks_menu), menuitem); gtk_widget_set_sensitive (menuitem, FALSE); if (menubar_conf->get_nBmarks() > 0) { glist = g_list_copy(menubar_conf->get_bmarks()); while (glist->next->next) { menuitem = gtk_menu_item_new_with_label_with_pixmap((gchar *)glist->next->data, "i-bookmark.xpm"); gtk_widget_show(menuitem); gtk_container_add(GTK_CONTAINER(bookmarks_menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(bookmark_selected), jagsmb); if (glist->next->next->next) glist = glist->next->next; else break; } } gtk_widget_destroy(widget->parent->parent->parent); return TRUE; } gint bookmark_selected(GtkMenuItem *menu_item, JagsMenuBar *jmb) { GList *list_i, *list_j, *list_k, *glist; GtkTreeItem *item; gchar *server = g_strchomp(gtk_menu_item_get_text(GTK_WIDGET(menu_item))); gchar *workgroup = NULL, *error = NULL; gboolean flag = FALSE; gchar *label = NULL, *command = NULL, *mssg = NULL; GtkWidget *item2 = NULL; Data *d; GtkWidget *new_item = NULL, *subtree = NULL; /* get server workgroup */ glist = g_list_copy(menubar_conf->get_bmarks()); while (glist->next->next) { if (!g_strcasecmp((gchar *)glist->next->data, server)) { workgroup = g_strdup((gchar *)glist->next->next->data); break; } if (glist->next->next->next) glist = glist->next->next; else break; } /* check if such workgroup is reachable now */ list_i = gtk_container_children (GTK_CONTAINER (jagsmb->main_tree)); item = GTK_TREE_ITEM (list_i->data); gtk_tree_item_collapse(item); gtk_tree_item_select(item); gtk_tree_item_expand(item); gtk_tree_item_deselect(item); list_j = gtk_container_children (GTK_CONTAINER (item->subtree)); while (list_j) { item2 = GTK_WIDGET (list_j->data); if (GTK_WIDGET_VISIBLE(item2)==FALSE) { list_j = g_list_remove_link (list_j, list_j); continue; } label = gtk_tree_item_get_text(item2); if (!g_strcasecmp(label, workgroup)) { flag = TRUE; } list_j = g_list_remove_link (list_j, list_j); if (flag) while (list_j) list_j = g_list_remove_link (list_j, list_j); } g_list_remove_link (list_i, list_i); /* Actions if workgroup cannot be reached */ if (!flag) { error = g_strdup_printf("Could not find workgroup\n %s on the net\n" "The workgroup may be not reachable\n" "now or possibly bookmark is invalid\n", workgroup); popup_dialog(170, "Warning...", error, "Ok"); g_free(error); g_print("Bookmark workgroup cannot be reached\n"); return TRUE; } /* Check if server is present on RemoteLocalMasterBrowser */ if (item2) { gtk_tree_item_select(GTK_TREE_ITEM(item2)); gtk_tree_item_expand(GTK_TREE_ITEM(item2)); gtk_tree_item_deselect(GTK_TREE_ITEM(item2)); list_k = gtk_container_children (GTK_CONTAINER (GTK_TREE_ITEM(item2)->subtree)); flag = FALSE; while (list_k) { gchar *label2; GtkWidget *item3; item3 = GTK_WIDGET (list_k->data); label2 = gtk_tree_item_get_text(item3); if ( (!g_strcasecmp(label2, server)) && (GTK_WIDGET_VISIBLE(item3)==TRUE) ) { gtk_tree_item_select(GTK_TREE_ITEM(item3)); gtk_tree_item_expand(GTK_TREE_ITEM(item3)); g_print ("%s on level %d deployed with bookmark\n", label2, GTK_TREE (item3->parent)->level); flag = TRUE; } list_k = g_list_remove_link (list_k, list_k); if (flag) while (list_k) list_k = g_list_remove_link (list_k, list_k); } } else { g_print("Bookmark section: Error occured while working with main tree " "structure\n"); } if (flag) return TRUE; /* Check if the server is online */ command = g_strdup_printf("is_server_online.sh \"%s\"", server); d = new Data(command, menubar_conf->get_plugin()); glist = d->getData(); if (!g_strncasecmp((gchar *)glist->next->data, "Error", 5)) { error = g_strdup_printf("Could not connect %s server\nServer is offline " "or unreachable\n", server); popup_dialog(170, "Warning...", error, "Ok"); g_free(error); g_print("Server is offline or unreachable\n"); delete d; return TRUE; } mssg = g_strdup_printf("%s broadcast lookup success: server ip %s\n", server, (gchar *)glist->next->data); g_print(mssg); g_free(mssg); delete d; new_item = gtk_tree_item_new_with_label_with_pixmap(server, "computer.xpm"); gtk_tree_append(GTK_TREE(GTK_TREE_ITEM(item2)->subtree), new_item); subtree = gtk_tree_new(); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), subtree); gtk_widget_show(new_item); gtk_signal_connect_after(GTK_OBJECT(new_item), "expand", GTK_SIGNAL_FUNC(expand_server), GTK_TREE(GTK_TREE_ITEM(item2)->subtree)); gtk_signal_connect(GTK_OBJECT(new_item), "collapse", GTK_SIGNAL_FUNC(on_collapse), menubar_mainw); gtk_signal_connect(GTK_OBJECT(new_item), "button_press_event", GTK_SIGNAL_FUNC(check_server_click), menubar_mainw); gtk_tree_item_select(GTK_TREE_ITEM(new_item)); gtk_tree_item_expand(GTK_TREE_ITEM(new_item)); return TRUE; } /* Sample main test function */ /* main(int argc, char *argv[]) { GtkWidget *window1, *vbox1; JagsMenuBar *m; gtk_init(&argc, &argv); window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (window1), "window1", window1); gtk_window_set_title (GTK_WINDOW (window1), "window1"); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox1); gtk_object_set_data_full (GTK_OBJECT (window1), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (window1), vbox1); m = new JagsMenuBar(vbox1); gtk_widget_show(window1); gtk_main(); } */