47#include <gdk/gdkkeysyms.h>
104 guint page_num, gpointer data);
110 GtkCellRenderer *text_renderer, *icon_renderer;
111 GtkTreeViewColumn *column;
112 GtkTreeSelection *selection;
114 text_renderer = gtk_cell_renderer_text_new();
115 icon_renderer = gtk_cell_renderer_pixbuf_new();
116 column = gtk_tree_view_column_new();
118 gtk_tree_view_column_pack_start(column, icon_renderer, FALSE);
120 g_object_set(icon_renderer,
"xalign", 0.0,
NULL);
122 gtk_tree_view_column_pack_start(column, text_renderer, TRUE);
124 g_object_set(text_renderer,
"yalign", 0.5,
NULL);
125 gtk_tree_view_column_set_title(column,
_(
"Symbols"));
127 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
128 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
132 gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
133 g_object_unref(store);
135 g_signal_connect(tree,
"button-press-event",
137 g_signal_connect(tree,
"key-press-event",
142 gtk_tree_view_set_level_indentation(GTK_TREE_VIEW(tree), 10);
147 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
148 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
157 if (event->button == 3)
160 event->button, event->time);
169 GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(
tag_window);
174 gtk_scrolled_window_get_hadjustment(scrolled_window),
175 gtk_scrolled_window_get_vadjustment(scrolled_window));
177 label = gtk_label_new(
_(
"No symbols found"));
178 gtk_misc_set_alignment(GTK_MISC(
label), 0.1f, 0.01f);
190 GtkWidget *child = gtk_bin_get_child(GTK_BIN(
tag_window));
201 #define CHANGE_TREE(new_child) \
206 if (child != new_child && doc == document_get_current()) \
209 gtk_container_remove(GTK_CONTAINER(tag_window), child); \
210 gtk_container_add(GTK_CONTAINER(tag_window), new_child); \
255 GtkTreeIter *iter_b, gpointer data)
257 gchar *key_a, *key_b;
258 gchar *name_a, *name_b;
262 key_a = g_utf8_collate_key_for_filename(name_a, -1);
265 key_b = g_utf8_collate_key_for_filename(name_b, -1);
267 cmp = strcmp(key_a, key_b);
278 GtkCellRenderer *icon_renderer;
279 GtkCellRenderer *text_renderer;
280 GtkTreeViewColumn *column;
281 GtkTreeSelection *selection;
282 GtkTreeSortable *sortable;
289 G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_STRING);
294 gtk_scrolled_window_set_policy(
296 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
298 icon_renderer = gtk_cell_renderer_pixbuf_new();
299 g_object_set(icon_renderer,
"stock-size", GTK_ICON_SIZE_MENU,
NULL);
300 text_renderer = gtk_cell_renderer_text_new();
301 g_object_set(text_renderer,
"ellipsize", PANGO_ELLIPSIZE_MIDDLE,
NULL);
302 column = gtk_tree_view_column_new();
303 gtk_tree_view_column_pack_start(column, icon_renderer, FALSE);
304 gtk_tree_view_column_set_attributes(column, icon_renderer,
"gicon",
DOCUMENTS_ICON,
NULL);
305 gtk_tree_view_column_pack_start(column, text_renderer, TRUE);
326 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
347 g_return_val_if_fail(!doc, FALSE);
360 gchar *head = g_strndup(str, strlen(prefix));
370 gchar *tmp_dirname = g_strdup(path);
371 gchar *project_base_path;
372 gchar *dirname =
NULL;
373 const gchar *home_dir = g_get_home_dir();
379 if (project_base_path !=
NULL)
381 gsize len = strlen(project_base_path);
384 if (project_base_path[len-1] == G_DIR_SEPARATOR)
385 project_base_path[--len] =
'\0';
390 rest = tmp_dirname + len;
391 if (*rest == G_DIR_SEPARATOR || *rest ==
'\0')
396 g_free(project_base_path);
400 dirname = tmp_dirname;
405 rest = dirname + strlen(home_dir);
406 if (*rest == G_DIR_SEPARATOR || *rest ==
'\0')
408 dirname = g_strdup_printf(
"~%s", rest);
423 gchar *dirname =
NULL;
424 static GtkTreeIter parent;
426 static GIcon *dir_icon =
NULL;
434 if (gtk_tree_model_get_iter_first(model, &parent))
445 while (gtk_tree_model_iter_next(model, &parent));
466 GtkTreeIter *iter = &doc->
priv->
iter;
470 static GIcon *file_icon =
NULL;
475 if (parent && gtk_tree_model_iter_n_children(GTK_TREE_MODEL(
store_openfiles), parent) == 1)
480 path = gtk_tree_model_get_path(GTK_TREE_MODEL(
store_openfiles), parent);
482 gtk_tree_path_free(path);
498 GtkTreeIter *iter = &doc->
priv->
iter;
501 if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(
store_openfiles), &parent, iter) &&
502 gtk_tree_model_iter_n_children(GTK_TREE_MODEL(
store_openfiles), &parent) == 1)
511 GtkTreeIter *iter = &doc->
priv->
iter;
529 GtkTreeSelection *treesel;
533 sel = gtk_tree_selection_iter_is_selected(treesel, &doc->
priv->
iter);
538 gtk_tree_selection_select_iter(treesel, &doc->
priv->
iter);
579 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
587 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
597 item = gtk_separator_menu_item_new();
598 gtk_widget_show(item);
601 item = gtk_check_menu_item_new_with_mnemonic(
_(
"Show S_ymbol List"));
604 gtk_widget_show(item);
605 g_signal_connect(item,
"activate",
608 item = gtk_check_menu_item_new_with_mnemonic(
_(
"Show _Document List"));
611 gtk_widget_show(item);
612 g_signal_connect(item,
"activate",
615 item = gtk_image_menu_item_new_with_mnemonic(
_(
"H_ide Sidebar"));
616 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
617 gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
618 gtk_widget_show(item);
649 GtkTreeSelection *treesel;
656 if (!gtk_tree_selection_get_selected(treesel, &model, &iter))
674 gboolean
expand = GPOINTER_TO_INT(user_data);
689 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE,
NULL);
690 gtk_widget_show(item);
692 g_signal_connect(item,
"activate",
696 item = gtk_separator_menu_item_new();
697 gtk_widget_show(item);
700 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE,
NULL);
701 gtk_widget_show(item);
703 g_signal_connect(item,
"activate",
707 item = gtk_image_menu_item_new_with_mnemonic(
_(
"_Reload"));
708 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
709 gtk_image_new_from_stock(GTK_STOCK_REVERT_TO_SAVED, GTK_ICON_SIZE_MENU));
710 gtk_widget_show(item);
712 g_signal_connect(item,
"activate",
716 item = gtk_separator_menu_item_new();
717 gtk_widget_show(item);
721 gtk_widget_show(item);
726 item = gtk_separator_menu_item_new();
727 gtk_widget_show(item);
730 doc_items.show_paths = gtk_check_menu_item_new_with_mnemonic(
_(
"Show _Paths"));
734 g_signal_connect(
doc_items.show_paths,
"activate",
737 item = gtk_separator_menu_item_new();
738 gtk_widget_show(item);
744 g_signal_connect(
doc_items.expand_all,
"activate",
750 g_signal_connect(
doc_items.collapse_all,
"activate",
761 if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(
store_openfiles), &parent, iter))
763 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(
store_openfiles), &parent);
765 gtk_tree_path_free(path);
774 GtkTreeIter *iter, gpointer data)
829 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
tv.
tree_openfiles));
832 gint action = GPOINTER_TO_INT(user_data);
834 if (gtk_tree_selection_get_selected(selection, &model, &iter))
845 gint i = gtk_tree_model_iter_n_children(model, &iter) - 1;
847 while (i >= 0 && gtk_tree_model_iter_nth_child(model, &child, &iter, i))
874 if (gtk_tree_selection_get_selected(selection, &model, &iter) && !
ignore_callback)
882 if (keyval != GDK_KEY_space)
894 gboolean handled = TRUE;
896 if (gtk_tree_selection_get_selected(selection, &model, &iter))
931 GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS(widget);
932 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
938 if (widget_class->key_press_event)
939 widget_class->key_press_event(widget, event);
953 G_GNUC_UNUSED gpointer user_data)
955 GtkTreeSelection *selection;
956 GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS(widget);
957 gboolean handled = FALSE;
962 if (widget_class->button_press_event)
963 handled = widget_class->button_press_event(widget, event);
965 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
968 if (event->type == GDK_2BUTTON_PRESS)
973 if (gtk_tree_selection_get_selected(selection, &model, &iter))
975 if (gtk_tree_model_iter_has_child(model, &iter))
977 GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
979 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path))
980 gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path);
982 gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path, FALSE);
984 gtk_tree_path_free(path);
989 else if (event->button == 1)
999 else if (event->button == 2)
1004 else if (event->button == 3)
1014 event->button, event->time);
1019 event->button, event->time);
1029 GtkTreeModel *model;
1032 gchar *shortname =
NULL;
1036 sel = gtk_tree_selection_get_selected(selection, &model, &iter);
1042 path = !
EMPTY(shortname) &&
1043 (g_path_is_absolute(shortname) ||
1047 gtk_widget_set_sensitive(
doc_items.close, sel);
1050 gtk_widget_set_sensitive(
doc_items.find_in_files, sel);
1080 gpointer page, guint page_num, gpointer user_data)
1115#define WIDGET(w) w && GTK_IS_WIDGET(w)
1148 GtkWidget *symbol_list_scrollwin = gtk_notebook_get_nth_page(notebook,
TREEVIEW_SYMBOL);
1151 gtk_widget_grab_focus(gtk_bin_get_child(GTK_BIN(symbol_list_scrollwin)));
1157 guint page_num, gpointer data)
1159 gint
tabs = gtk_notebook_get_n_pages(notebook);
1166 gtk_notebook_set_show_tabs(notebook, (
tabs > 1));
GeanyDocument * document_get_current(void)
Finds the current document.
const GdkColor * document_get_status_color(GeanyDocument *doc)
Gets the status color of the document, or NULL if default widget coloring should be used.
void document_show_tab(GeanyDocument *doc)
gboolean document_save_file(GeanyDocument *doc, gboolean force)
Saves the document.
void document_try_focus(GeanyDocument *doc, GtkWidget *source_widget)
gboolean document_reload_prompt(GeanyDocument *doc, const gchar *forced_enc)
#define DOC_VALID(doc_ptr)
Null-safe way to check GeanyDocument::is_valid.
#define DOC_FILENAME(doc)
Returns the filename of the document passed or GEANY_STRING_UNTITLED (e.g.
#define documents
Wraps GeanyData::documents_array so it can be used with C array syntax.
#define foreach_document(i)
Iterates all valid document indexes.
static void expand(ScintillaObject *sci, gint *line, gboolean doExpand, gboolean force, gint visLevels, gint level)
currently not working see documentation true uses any is tabs
#define GEANY_STRING_UNTITLED
GdkModifierType keybindings_get_modifiers(GdkModifierType mods)
Gets significant modifiers from a GdkModifierType mask.
Configurable keyboard shortcuts.
#define GEANY_PRIMARY_MOD_MASK
Defines the primary modifier mask which is the Ctrl key mask on UNIX/Windows and Command key mask on ...
void configuration_add_pref_group(struct StashGroup *group, gboolean for_prefs_dialog)
gboolean navqueue_goto_line(GeanyDocument *old_doc, GeanyDocument *new_doc, gint line)
Adds old file position and new file position to the navqueue, then goes to the new position.
signal void(* document_close)(GObject *obj, GeanyDocument *doc, gpointer user_data)
Sent before closing a document.
gchar * project_get_base_path(void)
void search_show_find_in_files_dialog(const gchar *dir)
Shows the Find in Files dialog.
gboolean filetype_has_tags(GeanyFiletype *ft)
stash_group_add_boolean(group, &china_enabled, "china", TRUE)
stash_group_update(group, dialog)
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gtk_widget_show_all(dialog)
stash_group_display(group, dialog)
StashGroup * stash_group_new(const gchar *name)
Creates a new group.
void stash_group_add_widget_property(StashGroup *group, gpointer setting, const gchar *key_name, gpointer default_value, StashWidgetID widget_id, const gchar *property_name, GType type)
Adds a widget's read/write property to the stash group.
Lightweight library for reading/writing GKeyFile settings and synchronizing widgets with C variables.
struct GeanyProject * project
Currently active project or NULL if none is open.
Structure for representing an open tab with all its properties.
gchar * file_name
The UTF-8 encoded file name.
GeanyFiletype * file_type
The filetype for this document, it's only a reference to one of the elements of the global filetypes ...
gboolean has_tags
Whether this document supports source code symbols(tags) to show in the sidebar.
struct GeanyDocumentPrivate * priv
gchar * real_path
The link-dereferenced, locale-encoded file name.
gboolean is_valid
Flag used to check if this document is valid when iterating GeanyData::documents_array.
gboolean show_symbol_list_expanders
whether to show expanders in the symbol list
gboolean sidebar_symbol_visible
whether the symbol sidebar is visible
gboolean sidebar_openfiles_visible
whether the open file list is visible
gchar * tagbar_font
symbol sidebar font
GtkWidget * window
Main window.
GtkWidget * sidebar_notebook
Sidebar notebook.
gchar * name
The name of the project.
The TMTag structure represents a single tag in the tag manager.
gulong line
Line number of the tag.
Defines internationalization macros.
gboolean symbols_recreate_tag_list(GeanyDocument *doc, gint sort_mode)
void tm_tag_unref(TMTag *tag)
void ui_sidebar_show_hide(void)
gboolean ui_is_keyval_enter_or_return(guint keyval)
Checks whether the passed keyval is the Enter or Return key.
GIcon * ui_get_mime_icon(const gchar *mime_type)
GeanyMainWidgets main_widgets
GtkWidget * ui_image_menu_item_new(const gchar *stock_id, const gchar *label)
Creates a GtkImageMenuItem with a stock image and a custom label.
GtkWidget * ui_lookup_widget(GtkWidget *widget, const gchar *widget_name)
Returns a widget from a name in a component, usually created by Glade.
void ui_tree_view_set_tooltip_text_column(GtkTreeView *tree_view, gint column)
Adds text tooltips to a tree view.
void ui_widget_modify_font_from_string(GtkWidget *widget, const gchar *str)
Modifies the font of a widget using gtk_widget_modify_font().
GeanyInterfacePrefs interface_prefs
User Interface general utility functions.
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
General utility functions, non-GTK related.
#define EMPTY(ptr)
Returns TRUE if ptr is NULL or *ptr is FALSE.
#define utils_filenamecmp(a, b)