/* * dialogs.c - this file is part of Geany, a fast and lightweight IDE * * Copyright 2006 Enrico Troeger * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id$ */ #include #include #include "dialogs.h" #include "callbacks.h" #include "document.h" #include "win32.h" #include "about.h" #include "sciwrappers.h" #include "support.h" #include "interface.h" #include "utils.h" /* This shows the file selection dialog to open a file. */ void dialogs_show_open_file () { if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) < GEANY_MAX_OPEN_FILES) { #ifdef GEANY_WIN32 win32_show_file_dialog(TRUE); #else /* X11, not win32: use GTK_FILE_CHOOSER */ /* We use the same file selection widget each time, so first of all we create it if it hasn't already been created. */ if (app->open_filesel == NULL) { GtkWidget *combo; gint i; app->open_filesel = gtk_file_chooser_dialog_new(_("Open File"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_widget_set_size_request(app->open_filesel, 520, 460); gtk_window_set_modal(GTK_WINDOW(app->open_filesel), TRUE); gtk_window_set_destroy_with_parent(GTK_WINDOW(app->open_filesel), TRUE); gtk_window_set_skip_taskbar_hint(GTK_WINDOW(app->open_filesel), TRUE); gtk_window_set_type_hint(GTK_WINDOW(app->open_filesel), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_transient_for(GTK_WINDOW(app->open_filesel), GTK_WINDOW(app->window)); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(app->open_filesel), TRUE); // add checkboxes and filename entry gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(app->open_filesel), dialogs_add_file_open_extra_widget()); combo = lookup_widget(app->open_filesel, "filetype_combo"); // add FileFilters(start with "All Files") gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(app->open_filesel), utils_create_file_filter(filetypes[GEANY_FILETYPES_ALL])); for (i = 0; i < GEANY_MAX_FILE_TYPES - 1; i++) { if (filetypes[i]) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), filetypes[i]->title); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(app->open_filesel), utils_create_file_filter(filetypes[i])); } } gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Detect by file extension ")); gtk_combo_box_set_active(GTK_COMBO_BOX(combo), GEANY_MAX_FILE_TYPES - 1); g_signal_connect((gpointer) app->open_filesel, "selection-changed", G_CALLBACK(on_file_open_selection_changed), NULL); g_signal_connect ((gpointer) app->open_filesel, "delete_event", G_CALLBACK(gtk_widget_hide), NULL); g_signal_connect((gpointer) app->open_filesel, "response", G_CALLBACK (on_file_open_dialog_response), NULL); } // set dialog directory to the current file's directory, if present { gchar *initdir = utils_get_current_file_dir(); if (initdir != NULL) { gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(app->open_filesel), initdir); g_free(initdir); } } gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(app->open_filesel)); gtk_widget_show(app->open_filesel); #endif } else { dialogs_show_file_open_error(); } } /* This shows the file selection dialog to save a file. */ void dialogs_show_save_as () { #ifdef GEANY_WIN32 win32_show_file_dialog(FALSE); #else gint idx = document_get_cur_idx(); if (app->save_filesel == NULL) { app->save_filesel = create_filesavedialog1(); /* Make sure the dialog doesn't disappear behind the main window. */ gtk_window_set_transient_for(GTK_WINDOW(app->save_filesel), GTK_WINDOW(app->window)); } /* If the current document has a filename we use that as the default. */ if (doc_list[idx].file_name) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(app->save_filesel), doc_list[idx].file_name); else { gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(app->save_filesel)); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(app->save_filesel), GEANY_STRING_UNTITLED); } /* We make sure the dialog is visible. */ gtk_window_present(GTK_WINDOW(app->save_filesel)); #endif } void dialogs_show_file_open_error(void) { gchar *pri = g_strdup_printf(_("There is a limit of %d concurrent open tabs."), GEANY_MAX_OPEN_FILES); gchar *sec = _("error: too many open files"); #ifdef GEANY_WIN32 MessageBox(NULL, pri, sec, MB_OK | MB_ICONERROR); #else GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, sec); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), pri); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); #endif g_free(pri); } gboolean dialogs_show_not_found(const gchar *text) { GtkWidget *dialog; gchar *string; gint ret; string = g_strdup_printf(_("The match \"%s\" was not found. Wrap search around the document?"), text); #ifdef GEANY_WIN32 dialog = NULL; ret = MessageBox(NULL, string, _("Question"), MB_YESNO | MB_ICONQUESTION); g_free(string); if (ret == IDYES) return TRUE; else return FALSE; #else dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", string); g_free(string); ret = gtk_dialog_run(GTK_DIALOG (dialog)); gtk_widget_destroy(dialog); if (ret == GTK_RESPONSE_YES) return TRUE; else return FALSE; #endif } void dialogs_show_info(const gchar *text, ...) { #ifndef GEANY_WIN32 GtkWidget *dialog; #endif gchar *string = g_malloc(512); va_list args; va_start(args, text); g_vsnprintf(string, 511, text, args); va_end(args); #ifdef GEANY_WIN32 MessageBox(NULL, string, _("Information"), MB_OK | MB_ICONINFORMATION); #else dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, string); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); #endif g_free(string); } void dialogs_show_error(const gchar *text, ...) { #ifndef GEANY_WIN32 GtkWidget *dialog; #endif gchar *string = g_malloc(512); va_list args; va_start(args, text); g_vsnprintf(string, 511, text, args); va_end(args); #ifdef GEANY_WIN32 MessageBox(NULL, string, _("Error"), MB_OK | MB_ICONERROR); #else dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, string); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); #endif g_free(string); } gboolean dialogs_show_unsaved_file(gint idx) { #ifndef GEANY_WIN32 GtkWidget *dialog, *button, *label, *image, *hbox, *align; #endif gchar *msg; gint ret; if (doc_list[idx].file_name != NULL) { gchar *short_fn = g_path_get_basename(doc_list[idx].file_name); msg = (gchar*) g_malloc(100 + strlen(short_fn)); g_snprintf(msg, 100 + strlen(doc_list[idx].file_name), _("The file '%s' is not saved.\nDo you want to save it before closing?"), short_fn); g_free(short_fn); } else { msg = g_strdup(_("The file is not saved.\nDo you want to save it before closing?")); } #ifdef GEANY_WIN32 ret = MessageBox(NULL, msg, _("Error"), MB_YESNOCANCEL | MB_ICONQUESTION); switch(ret) { case IDYES: ret = GTK_RESPONSE_YES; break; case IDNO: ret = GTK_RESPONSE_NO; break; case IDCANCEL: ret = GTK_RESPONSE_CANCEL; break; } #else dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, msg); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); button = gtk_button_new(); label = gtk_label_new(_("Don't save")); image = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); hbox = gtk_hbox_new(FALSE, 2); align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(button), align); gtk_container_add(GTK_CONTAINER(align), hbox); gtk_widget_show_all(align); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button, GTK_RESPONSE_NO); gtk_widget_show(button); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_SAVE, GTK_RESPONSE_YES); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES); ret = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); #endif g_free(msg); switch(ret) { case GTK_RESPONSE_YES: { if (doc_list[idx].file_name == NULL) dialogs_show_save_as(); else document_save_file(idx); ret = TRUE; break; } case GTK_RESPONSE_NO: ret = TRUE; break; case GTK_RESPONSE_CANCEL: /* fall through to default and leave the function */ default: ret = FALSE; break; } return (gboolean) ret; } /* This shows the font selection dialog to choose a font. */ void dialogs_show_open_font(void) { #ifdef GEANY_WIN32 win32_show_font_dialog(); #else /* X11, not win32: use GTK_FILE_CHOOSER */ if (app->open_fontsel == NULL) { app->open_fontsel = create_fontselectiondialog1(); /* Make sure the dialog doesn't disappear behind the main window. */ gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(app->open_fontsel), app->editor_font); gtk_window_set_transient_for(GTK_WINDOW (app->open_fontsel), GTK_WINDOW(app->window)); } /* We make sure the dialog is visible. */ gtk_window_present(GTK_WINDOW(app->open_fontsel)); #endif } void dialogs_show_about(void) { AboutInfo *info; GtkWidget *dialog; GdkPixbuf *icon; gchar *s; guint n; static const struct { gchar *name, *email, *language; } translators[] = { //{ "Dwayne Bailey", "dwayne@translate.org.za", "en_GB" }, { NULL, NULL, NULL }, }; icon = utils_new_pixbuf_from_inline(GEANY_IMAGE_LOGO, FALSE); info = about_info_new(PACKAGE, VERSION, _("A fast and lightweight IDE"), ABOUT_COPYRIGHT_TEXT("2006", "Enrico Troeger"), GEANY_HOMEPAGE, GEANY_CODENAME); about_info_add_credit(info, "Enrico Troeger", "enrico.troeger@uvena.de", _("Maintainer")); for (n = 0; translators[n].name != NULL; ++n) { s = g_strdup_printf(_("Translator (%s)"), translators[n].language); about_info_add_credit(info, translators[n].name, translators[n].email, s); g_free(s); } dialog = about_dialog_new(GTK_WINDOW(app->window), info, icon); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); about_info_free(info); } gboolean dialogs_show_reload_warning(const gchar *text) { #ifdef GEANY_WIN32 if (MessageBox(NULL, text, _("Question"), MB_YESNO | MB_ICONWARNING) == IDYES) return TRUE; else return FALSE; #else gboolean ret = FALSE; GtkWidget *dlg; dlg = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, text); if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_YES) { ret = TRUE; } gtk_widget_destroy(dlg); return ret; #endif } gboolean dialogs_show_confirm_exit(void) { gchar *text = _("Do you really want to quit?"); #ifdef GEANY_WIN32 if (MessageBox(NULL, text, _("Question"), MB_YESNO | MB_ICONWARNING) == IDYES) return TRUE; else return FALSE; #else gboolean ret = FALSE; GtkWidget *dlg; dlg = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text); if (gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_YES) { ret = TRUE; } gtk_widget_destroy(dlg); return ret; #endif } void dialogs_show_word_count(void) { GtkWidget *dialog, *label; gint idx; guint chars, lines, words; gchar *string, *text, *range; GtkRequisition *size = g_new(GtkRequisition, 1); idx = document_get_cur_idx(); if (idx == -1) return; dialog = gtk_dialog_new_with_buttons(_("Word Count"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL); if (sci_can_copy(doc_list[idx].sci)) { text = g_malloc0(sci_get_selected_text_length(doc_list[idx].sci) + 1); sci_get_selected_text(doc_list[idx].sci, text); utils_wordcount(text, &chars, &lines, &words); g_free(text); range = _("selection"); } else { text = g_malloc(sci_get_length(doc_list[idx].sci) + 1); sci_get_text(doc_list[idx].sci, sci_get_length(doc_list[idx].sci) + 1 , text); utils_wordcount(text, &chars, &lines, &words); g_free(text); range = _("whole document"); } string = g_strdup_printf(_("Range:\t\t%s\n\nLines:\t\t%d\nWords:\t\t%d\nCharacters:\t%d\n"), range, lines, words, chars); label = gtk_label_new(string); g_free(string); g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); gtk_widget_size_request(label, size); gtk_widget_set_size_request(dialog, size->width + 20, size->height + 50); g_free(size); gtk_widget_show_all(dialog); } /* This shows the color selection dialog to choose a color. */ void dialogs_show_color(void) { #ifdef GEANY_WIN32 win32_show_color_dialog(); #else /* X11, not win32: use GTK_COLOR_CHOOSER */ if (app->open_colorsel == NULL) { app->open_colorsel = gtk_color_selection_dialog_new(_("Color Chooser")); gtk_window_set_transient_for(GTK_WINDOW(app->open_colorsel), GTK_WINDOW(app->window)); g_signal_connect(GTK_COLOR_SELECTION_DIALOG(app->open_colorsel)->cancel_button, "clicked", G_CALLBACK(on_color_cancel_button_clicked), NULL); g_signal_connect(GTK_COLOR_SELECTION_DIALOG(app->open_colorsel)->ok_button, "clicked", G_CALLBACK(on_color_ok_button_clicked), NULL); g_signal_connect(app->open_colorsel, "delete_event", G_CALLBACK(on_color_delete_event), NULL); } /* We make sure the dialog is visible. */ gtk_window_present (GTK_WINDOW(app->open_colorsel)); #endif } GtkWidget *dialogs_create_build_menu_gen(gboolean link, gboolean execute) { GtkWidget *menu, *item, *image, *separator; GtkAccelGroup *accel_group = gtk_accel_group_new(); GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips")); menu = gtk_menu_new(); // compile the code item = gtk_image_menu_item_new_with_label(_("Compile")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Compiles the current file"), NULL); gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F8, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); image = gtk_image_new_from_stock("gtk-convert", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_compile_activate), NULL); if (link) { // build the code app->build_menu_item_link = gtk_menu_item_new_with_label(_("Build")); gtk_widget_show(app->build_menu_item_link); gtk_container_add(GTK_CONTAINER(menu), app->build_menu_item_link); gtk_tooltips_set_tip(tooltips, app->build_menu_item_link, _("Builds the current file (generate an executable file)"), NULL); gtk_widget_add_accelerator(app->build_menu_item_link, "activate", accel_group, GDK_F9, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); g_signal_connect((gpointer) app->build_menu_item_link, "activate", G_CALLBACK(on_build_build_activate), NULL); } // build the code with make all item = gtk_menu_item_new_with_label(_("Build with \"make\"")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Builds the current file with the " "make tool and the default target"), NULL); gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F9, (GdkModifierType) GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate), GINT_TO_POINTER(0)); // build the code with make item = gtk_menu_item_new_with_label(_("Build with make (custom target)")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Builds the current file with the " "make tool and the specified target"), NULL); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate), GINT_TO_POINTER(1)); if (execute) { // execute the code item = gtk_image_menu_item_new_from_stock("gtk-execute", accel_group); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Execute the current file if it was already compiled"), NULL); gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F5, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_execute_activate), NULL); } // separator separator = gtk_separator_menu_item_new(); gtk_widget_show(separator); gtk_container_add(GTK_CONTAINER(menu), separator); gtk_widget_set_sensitive(separator, FALSE); // arguments item = gtk_image_menu_item_new_with_label(_("Set Includes and Arguments")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER (menu), item); gtk_tooltips_set_tip(tooltips, item, _("Sets the includes and library paths for the compiler and " "the program arguments for execution"), NULL); image = gtk_image_new_from_stock("gtk-preferences", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_arguments_activate), GINT_TO_POINTER(link)); gtk_window_add_accel_group(GTK_WINDOW(app->window), accel_group); return menu; } GtkWidget *dialogs_create_build_menu_tex(void) { GtkWidget *menu, *item, *image, *separator; GtkAccelGroup *accel_group = gtk_accel_group_new(); GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips")); menu = gtk_menu_new(); // DVI item = gtk_image_menu_item_new_with_label(_("LaTeX -> DVI")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Compiles the current file into a DVI file"), NULL); // gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F8, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); image = gtk_image_new_from_stock("gtk-convert", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(0)); // PDF item = gtk_image_menu_item_new_with_label(_("LaTeX -> PDF")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Compiles the current file into a PDF file"), NULL); // gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F9, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); image = gtk_image_new_from_stock("gtk-convert", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(1)); // build the code with make all item = gtk_menu_item_new_with_label(_("Build with \"make\"")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Builds the current file with the " "make tool and the default target"), NULL); /* gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F9, (GdkModifierType) GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); */ g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate), GINT_TO_POINTER(0)); // build the code with make item = gtk_menu_item_new_with_label(_("Build with make (custom target)")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); gtk_tooltips_set_tip(tooltips, item, _("Builds the current file with the " "make tool and the specified target"), NULL); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate), GINT_TO_POINTER(1)); // DVI view item = gtk_image_menu_item_new_with_label(_("View DVI file")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); // gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F5, (GdkModifierType) 0, GTK_ACCEL_VISIBLE); gtk_tooltips_set_tip(tooltips, item, _("Compiles and view the current file"), NULL); image = gtk_image_new_from_stock("gtk-find", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(2)); // PDF view item = gtk_image_menu_item_new_with_label(_("View PDF file")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER(menu), item); /* gtk_widget_add_accelerator(item, "activate", accel_group, GDK_F5, (GdkModifierType) GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); */ gtk_tooltips_set_tip(tooltips, item, _("Compiles and view the current file"), NULL); image = gtk_image_new_from_stock("gtk-find", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(3)); // separator separator = gtk_separator_menu_item_new(); gtk_widget_show(separator); gtk_container_add(GTK_CONTAINER(menu), separator); gtk_widget_set_sensitive(separator, FALSE); // arguments item = gtk_image_menu_item_new_with_label(_("Set Arguments")); gtk_widget_show(item); gtk_container_add(GTK_CONTAINER (menu), item); gtk_tooltips_set_tip(tooltips, item, _("Sets the program paths and arguments"), NULL); image = gtk_image_new_from_stock("gtk-preferences", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_tex_arguments_activate), NULL); gtk_window_add_accel_group(GTK_WINDOW(app->window), accel_group); return menu; } void dialogs_create_recent_menu(void) { GtkWidget *recent_menu = lookup_widget(app->window, "recent_files1_menu"); GtkWidget *tmp; gint i; gchar *filename; for (i = (MIN(app->mru_length, g_queue_get_length(app->recent_queue)) - 1); i >= 0; i--) { filename = g_queue_peek_nth(app->recent_queue, i); tmp = gtk_menu_item_new_with_label(filename); gtk_widget_show(tmp); gtk_container_add(GTK_CONTAINER(recent_menu), tmp); g_signal_connect((gpointer) tmp, "activate", G_CALLBACK(on_recent_file_activate), (gpointer) filename); } } void dialogs_show_make_target(void) { GtkWidget *dialog, *label, *entry; dialog = gtk_dialog_new_with_buttons(_("Enter custom options for the make tool"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); label = gtk_label_new(_("Enter custom options here, all entered text is passed to the make command.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); entry = gtk_entry_new(); if (app->build_make_custopt) { gtk_entry_set_text(GTK_ENTRY(entry), app->build_make_custopt); } gtk_entry_set_max_length(GTK_ENTRY(entry), 248); gtk_entry_set_width_chars(GTK_ENTRY(entry), 30); g_signal_connect((gpointer) entry, "activate", G_CALLBACK (on_make_target_entry_activate), dialog); g_signal_connect((gpointer) dialog, "response", G_CALLBACK (on_make_target_dialog_response), entry); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entry); gtk_widget_show_all(dialog); } void dialogs_show_goto_line(void) { GtkWidget *dialog, *label, *entry; dialog = gtk_dialog_new_with_buttons(_("Go to line"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); label = gtk_label_new(_("Enter the line you want to go to")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry), 6); gtk_entry_set_width_chars(GTK_ENTRY(entry), 30); g_signal_connect((gpointer) entry, "activate", G_CALLBACK(on_goto_line_entry_activate), dialog); g_signal_connect((gpointer) dialog, "response", G_CALLBACK(on_goto_line_dialog_response), entry); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entry); gtk_widget_show_all(dialog); } void dialogs_show_find(void) { gint idx = document_get_cur_idx(); gchar *sel = NULL; if (sci_can_copy(doc_list[idx].sci)) { sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci)); sci_get_selected_text(doc_list[idx].sci, sel); } if (app->find_dialog == NULL) { GtkWidget *label, *entry, *checkbox1, *checkbox2, *checkbox3, *checkbox4, *checkbox5; GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips")); app->find_dialog = gtk_dialog_new_with_buttons(_("Find"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_dialog_add_button(GTK_DIALOG(app->find_dialog), "gtk-find", GTK_RESPONSE_ACCEPT); label = gtk_label_new(_("Enter the search text here")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); entry = gtk_combo_box_entry_new_text(); gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 248); gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))), 50); if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry)->child), sel); g_object_set_data_full(G_OBJECT(app->find_dialog), "entry", gtk_widget_ref(entry), (GDestroyNotify)gtk_widget_unref); g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry)), "activate", G_CALLBACK(on_find_entry_activate), NULL); g_signal_connect((gpointer) app->find_dialog, "response", G_CALLBACK(on_find_dialog_response), entry); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), label); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), entry); checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive")); g_object_set_data_full(G_OBJECT(app->find_dialog), "check_case", gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE); checkbox2 = gtk_check_button_new_with_mnemonic(_("Match only a _whole word")); g_object_set_data_full(G_OBJECT(app->find_dialog), "check_word", gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE); checkbox3 = gtk_check_button_new_with_mnemonic(_("_Use regular expressions")); g_object_set_data_full(G_OBJECT(app->find_dialog), "check_regexp", gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE); gtk_tooltips_set_tip(tooltips, checkbox3, _("For detailed information about using regular expressions, please read the documentation."), NULL); checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards")); g_object_set_data_full(G_OBJECT(app->find_dialog), "check_back", gtk_widget_ref(checkbox4), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox4), FALSE); checkbox5 = gtk_check_button_new_with_mnemonic(_("Match only word _start")); g_object_set_data_full(G_OBJECT(app->find_dialog), "check_wordstart", gtk_widget_ref(checkbox5), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox5), FALSE); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), checkbox1); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), checkbox2); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), checkbox5); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), checkbox3); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), checkbox4); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->find_dialog)->vbox), gtk_label_new("")); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(app->find_dialog)->vbox), 3); gtk_widget_show_all(app->find_dialog); } else { if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN( lookup_widget(app->find_dialog, "entry"))->child), sel); gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->find_dialog, "entry"))->child)); gtk_widget_show(app->find_dialog); } g_free(sel); } void dialogs_show_replace(void) { gint idx = document_get_cur_idx(); gchar *sel = NULL; if (sci_can_copy(doc_list[idx].sci)) { sel = g_malloc(sci_get_selected_text_length(doc_list[idx].sci)); sci_get_selected_text(doc_list[idx].sci, sel); } if (app->replace_dialog == NULL) { GtkWidget *label_find, *label_replace, *entry_find, *entry_replace, *checkbox1, *checkbox2, *checkbox3, *checkbox5, *checkbox4; GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips")); app->replace_dialog = gtk_dialog_new_with_buttons(_("Replace"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_dialog_add_button(GTK_DIALOG(app->replace_dialog), _("Replace"), GEANY_RESPONSE_REPLACE); gtk_dialog_add_button(GTK_DIALOG(app->replace_dialog), _("Replace All"), GEANY_RESPONSE_REPLACE_ALL); gtk_dialog_add_button(GTK_DIALOG(app->replace_dialog), _("Replace in selection"), GEANY_RESPONSE_REPLACE_SEL); label_find = gtk_label_new(_("Enter the search text here")); gtk_misc_set_padding(GTK_MISC(label_find), 0, 6); gtk_misc_set_alignment(GTK_MISC(label_find), 0, 0); label_replace = gtk_label_new(_("Enter the replace text here")); gtk_misc_set_padding(GTK_MISC(label_replace), 0, 6); gtk_misc_set_alignment(GTK_MISC(label_replace), 0, 0); entry_find = gtk_combo_box_entry_new_text(); gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 248); gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_find))), 50); if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(entry_find)->child), sel); g_object_set_data_full(G_OBJECT(app->replace_dialog), "entry_find", gtk_widget_ref(entry_find), (GDestroyNotify)gtk_widget_unref); entry_replace = gtk_combo_box_entry_new_text(); gtk_entry_set_max_length(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 248); gtk_entry_set_width_chars(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry_replace))), 50); g_object_set_data_full(G_OBJECT(app->replace_dialog), "entry_replace", gtk_widget_ref(entry_replace), (GDestroyNotify)gtk_widget_unref); g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_replace)), "activate", G_CALLBACK(on_replace_entry_activate), NULL); g_signal_connect((gpointer) app->replace_dialog, "response", G_CALLBACK(on_replace_dialog_response), entry_replace); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), label_find); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), entry_find); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), label_replace); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), entry_replace); checkbox1 = gtk_check_button_new_with_mnemonic(_("_Case sensitive")); g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_case", gtk_widget_ref(checkbox1), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox1), FALSE); checkbox2 = gtk_check_button_new_with_mnemonic(_("Match only a _whole word")); g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_word", gtk_widget_ref(checkbox2), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox2), FALSE); checkbox3 = gtk_check_button_new_with_mnemonic(_("_Use regular expressions")); g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_regexp", gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE); gtk_tooltips_set_tip(tooltips, checkbox3, _("For detailed information about using regular expressions, please read the documentation."), NULL); checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards")); g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_back", gtk_widget_ref(checkbox4), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox4), FALSE); checkbox5 = gtk_check_button_new_with_mnemonic(_("Match only word _start")); g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_wordstart", gtk_widget_ref(checkbox5), (GDestroyNotify)gtk_widget_unref); gtk_button_set_focus_on_click(GTK_BUTTON(checkbox5), FALSE); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), checkbox1); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), checkbox2); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), checkbox5); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), checkbox3); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), checkbox4); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(app->replace_dialog)->vbox), gtk_label_new("")); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(app->replace_dialog)->vbox), 3); gtk_widget_show_all(app->replace_dialog); } else { if (sel) gtk_entry_set_text(GTK_ENTRY(GTK_BIN( lookup_widget(app->replace_dialog, "entry_find"))->child), sel); gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->replace_dialog, "entry_find"))->child)); gtk_widget_show(app->replace_dialog); } g_free(sel); } void dialogs_show_includes_arguments_tex(void) { GtkWidget *dialog, *label, *entries[3]; dialog = gtk_dialog_new_with_buttons(_("Set Arguments"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); label = gtk_label_new(_("Set programs and options for compilation and viewing (La)TeX files.\nThe filename is appended automatically at the end.\n")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); // LaTeX -> DVI args label = gtk_label_new(_("Enter here the (La)TeX command (for DVI creation) and some useful options.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[0] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[0]), 30); if (app->build_tex_dvi_cmd) gtk_entry_set_text(GTK_ENTRY(entries[0]), app->build_tex_dvi_cmd); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[0]); // whitespace gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); // LaTeX -> PDF args label = gtk_label_new(_("Enter here the (La)TeX command (for PDF creation) and some useful options.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[1] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[1]), 30); if (app->build_tex_pdf_cmd) gtk_entry_set_text(GTK_ENTRY(entries[1]), app->build_tex_pdf_cmd); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[1]); // whitespace gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); // View LaTeX -> DVI args label = gtk_label_new(_("Enter here the (La)TeX command (for DVI preview) and some useful options.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[2] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[2]), 30); if (app->build_tex_view_dvi_cmd) gtk_entry_set_text(GTK_ENTRY(entries[2]), app->build_tex_view_dvi_cmd); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[2]); // whitespace gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); // View LaTeX -> PDF args label = gtk_label_new(_("Enter here the (La)TeX command (for PDF preview) and some useful options.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[3] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[3]), 30); if (app->build_tex_view_pdf_cmd) gtk_entry_set_text(GTK_ENTRY(entries[3]), app->build_tex_view_pdf_cmd); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[3]); // whitespace gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); g_object_set_data_full(G_OBJECT(dialog), "tex_entry1", gtk_widget_ref(entries[0]), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(dialog), "tex_entry2", gtk_widget_ref(entries[1]), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(dialog), "tex_entry3", gtk_widget_ref(entries[2]), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(dialog), "tex_entry4", gtk_widget_ref(entries[3]), (GDestroyNotify)gtk_widget_unref); g_signal_connect((gpointer) dialog, "response", G_CALLBACK(on_includes_arguments_tex_dialog_response), NULL); gtk_widget_show_all(dialog); } void dialogs_show_includes_arguments_gen(gboolean link) { GtkWidget *dialog, *label, *entries[3]; dialog = gtk_dialog_new_with_buttons(_("Set Includes and Arguments"), GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); label = gtk_label_new(_("Sets the includes and library paths for the compiler and the program arguments for execution\n")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); // include-args label = gtk_label_new(_("Enter here arguments to your compiler.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[0] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[0]), 30); if (app->build_args_inc) { gtk_entry_set_text(GTK_ENTRY(entries[0]), app->build_args_inc); } gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[0]); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); // lib-args label = gtk_label_new(_("Enter here arguments to your linker.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[1] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[1]), 30); if (app->build_args_libs) { gtk_entry_set_text(GTK_ENTRY(entries[1]), app->build_args_libs); } gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[1]); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); // program-args label = gtk_label_new(_("Enter here arguments to your program.")); gtk_misc_set_padding(GTK_MISC(label), 0, 6); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); entries[2] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entries[2]), 30); if (app->build_args_prog) { gtk_entry_set_text(GTK_ENTRY(entries[2]), app->build_args_prog); } gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entries[2]); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), gtk_label_new("")); g_object_set_data_full(G_OBJECT(dialog), "includes_entry1", gtk_widget_ref(entries[0]), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(dialog), "includes_entry2", gtk_widget_ref(entries[1]), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(dialog), "includes_entry3", gtk_widget_ref(entries[2]), (GDestroyNotify)gtk_widget_unref); g_signal_connect((gpointer) dialog, "response", G_CALLBACK(on_includes_arguments_dialog_response), NULL); gtk_widget_show_all(dialog); } GtkWidget *dialogs_add_file_open_extra_widget(void) { GtkWidget *vbox; GtkWidget *ebox; GtkWidget *hbox; GtkWidget *file_entry; GtkWidget *check_readonly; GtkWidget *check_hidden; GtkWidget *filetype_label; GtkWidget *filetype_combo; GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips")); vbox = gtk_vbox_new(FALSE, 4); file_entry = gtk_entry_new(); gtk_widget_show(file_entry); gtk_box_pack_start(GTK_BOX(vbox), file_entry, FALSE, FALSE, 0); gtk_entry_set_activates_default(GTK_ENTRY(file_entry), TRUE); check_readonly = gtk_check_button_new_with_mnemonic(_("Open file _read-only")); gtk_widget_show(check_readonly); gtk_box_pack_start(GTK_BOX(vbox), check_readonly, FALSE, FALSE, 0); gtk_tooltips_set_tip(tooltips, check_readonly, _("Opens the file in read-only mode. If you choose more than one file to open, all files will opened read-only."), NULL); gtk_button_set_focus_on_click(GTK_BUTTON(check_readonly), FALSE); check_hidden = gtk_check_button_new_with_mnemonic(_("Show hidden files")); gtk_widget_show(check_hidden); gtk_box_pack_start(GTK_BOX(vbox), check_hidden, FALSE, FALSE, 0); gtk_button_set_focus_on_click(GTK_BUTTON(check_hidden), FALSE); // the ebox is for the tooltip, because gtk_combo_box doesn't show a tooltip for unknown reason ebox = gtk_event_box_new(); hbox = gtk_hbox_new(FALSE, 4); filetype_label = gtk_label_new(_("Set filetype: ")); filetype_combo = gtk_combo_box_new_text(); gtk_tooltips_set_tip(tooltips, ebox, _("Explicitly defines a filetype for the file, if it would not detected by filename extension.\nNote if you choose multiple files, they will all opened with the chossed filetype."), NULL); gtk_box_pack_start(GTK_BOX(hbox), filetype_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), filetype_combo, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(ebox), hbox); gtk_box_pack_start(GTK_BOX(vbox), ebox, FALSE, FALSE, 0); gtk_widget_show_all(vbox); g_signal_connect((gpointer) file_entry, "activate", G_CALLBACK(on_file_open_entry_activate), NULL); g_signal_connect((gpointer) check_hidden, "toggled", G_CALLBACK(on_file_open_check_hidden_toggled), NULL); g_object_set_data_full(G_OBJECT(app->open_filesel), "file_entry", gtk_widget_ref(file_entry), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(app->open_filesel), "check_readonly", gtk_widget_ref(check_readonly), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(app->open_filesel), "check_hidden", gtk_widget_ref(check_hidden), (GDestroyNotify)gtk_widget_unref); g_object_set_data_full(G_OBJECT(app->open_filesel), "filetype_combo", gtk_widget_ref(filetype_combo), (GDestroyNotify)gtk_widget_unref); return vbox; } gboolean dialogs_show_mkcfgdir_error(gint error_nr) { GtkWidget *dialog; gchar string[255]; gint ret; snprintf(string, 255, _("Configuration directory could not be created (%s).\nThere could be some problems using %s without a configuration directory.\nStart %s anyway?"), g_strerror(error_nr), PACKAGE, PACKAGE); #ifdef GEANY_WIN32 dialog = NULL; ret = MessageBox(NULL, string, _("Error"), MB_YESNO | MB_ICONERROR); if (ret == IDYES) return TRUE; else return FALSE; #else dialog = gtk_message_dialog_new(GTK_WINDOW(app->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_YES_NO, string); ret = gtk_dialog_run(GTK_DIALOG (dialog)); gtk_widget_destroy(dialog); if (ret == GTK_RESPONSE_YES) return TRUE; else return FALSE; #endif }