2005-11-22 12:26:26 +00:00
/*
* dialogs . c - this file is part of Geany , a fast and lightweight IDE
*
2012-06-18 01:13:05 +02:00
* Copyright 2005 - 2012 Enrico Tröger < enrico ( dot ) troeger ( at ) uvena ( dot ) de >
* Copyright 2006 - 2012 Nick Treleaven < nick ( dot ) treleaven ( at ) btinternet ( dot ) com >
2005-11-22 12:26:26 +00:00
*
* 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 .
*
2012-08-24 19:25:57 +02:00
* 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 . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2005-11-22 12:26:26 +00:00
*/
2007-02-24 11:41:56 +00:00
/*
2007-07-27 11:28:17 +00:00
* File related dialogs , miscellaneous dialogs , font dialog .
2007-02-24 11:41:56 +00:00
*/
2014-05-18 17:31:51 -07:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "dialogs.h"
# include "app.h"
# include "build.h"
# include "document.h"
# include "encodings.h"
# include "filetypes.h"
# include "main.h"
# include "support.h"
# include "utils.h"
# include "ui_utils.h"
# include "gtkcompat.h"
2005-11-22 12:26:26 +00:00
# include <gdk/gdkkeysyms.h>
2005-12-29 19:50:50 +00:00
# include <string.h>
2008-06-04 15:43:52 +00:00
# ifdef HAVE_SYS_TIME_H
2006-02-22 13:46:20 +00:00
# include <sys / time.h>
# endif
2008-06-04 15:43:52 +00:00
# include <time.h>
2006-02-22 13:46:20 +00:00
# ifdef HAVE_SYS_TYPES_H
# include <sys / types.h>
# endif
2008-06-04 15:43:52 +00:00
/* gstdio.h also includes sys/stat.h */
2007-04-16 15:58:34 +00:00
# include <glib/gstdio.h>
2005-11-22 12:26:26 +00:00
2006-02-10 20:57:09 +00:00
2008-01-11 13:17:00 +00:00
enum
{
2008-04-02 13:26:38 +00:00
GEANY_RESPONSE_RENAME ,
GEANY_RESPONSE_VIEW
2008-01-11 13:17:00 +00:00
} ;
2010-05-10 21:52:43 +00:00
2011-06-10 22:13:29 +00:00
static struct FileSelState
{
struct
{
guint filter_idx ;
gint encoding_idx ;
gint filetype_idx ;
gboolean show_hidden ;
gboolean more_options_visible ;
} open ;
}
filesel_state = {
2011-06-10 23:13:08 +00:00
{
0 ,
GEANY_ENCODINGS_MAX , /* default encoding is detect from file */
2014-01-17 22:56:04 +01:00
GEANY_FILETYPES_NONE , /* default filetype is detect from extension */
2011-06-10 23:13:08 +00:00
FALSE ,
FALSE
}
2011-06-10 22:13:29 +00:00
} ;
2010-05-10 21:52:43 +00:00
2010-05-16 18:22:24 +00:00
2014-01-17 22:56:04 +01:00
static gint filetype_combo_box_get_active_filetype ( GtkComboBox * combo ) ;
2011-06-10 22:13:29 +00:00
/* gets the ID of the current file filter */
static guint file_chooser_get_filter_idx ( GtkFileChooser * chooser )
{
guint idx = 0 ;
GtkFileFilter * current ;
GSList * filters , * item ;
current = gtk_file_chooser_get_filter ( chooser ) ;
filters = gtk_file_chooser_list_filters ( chooser ) ;
foreach_slist ( item , filters )
{
if ( item - > data = = current )
break ;
idx + + ;
}
g_slist_free ( filters ) ;
return idx ;
}
2007-07-17 14:52:57 +00:00
2011-06-10 22:13:29 +00:00
/* sets the current file filter from its ID */
static void file_chooser_set_filter_idx ( GtkFileChooser * chooser , guint idx )
2007-07-17 14:52:57 +00:00
{
2011-06-10 22:13:29 +00:00
GtkFileFilter * current ;
GSList * filters ;
filters = gtk_file_chooser_list_filters ( chooser ) ;
current = g_slist_nth_data ( filters , idx ) ;
g_slist_free ( filters ) ;
gtk_file_chooser_set_filter ( chooser , current ) ;
}
2007-07-17 14:52:57 +00:00
2011-06-10 22:13:29 +00:00
static void open_file_dialog_handle_response ( GtkWidget * dialog , gint response )
{
2008-04-02 13:26:38 +00:00
if ( response = = GTK_RESPONSE_ACCEPT | | response = = GEANY_RESPONSE_VIEW )
2007-07-17 14:52:57 +00:00
{
GSList * filelist ;
2008-05-16 14:17:54 +00:00
GeanyFiletype * ft = NULL ;
2010-04-25 17:43:39 +00:00
const gchar * charset = NULL ;
2011-06-10 22:13:29 +00:00
GtkWidget * expander = ui_lookup_widget ( dialog , " more_options_expander " ) ;
GtkWidget * filetype_combo = ui_lookup_widget ( dialog , " filetype_combo " ) ;
GtkWidget * encoding_combo = ui_lookup_widget ( dialog , " encoding_combo " ) ;
2008-04-02 13:26:38 +00:00
gboolean ro = ( response = = GEANY_RESPONSE_VIEW ) ; /* View clicked */
2007-07-17 14:52:57 +00:00
2011-06-10 22:13:29 +00:00
filesel_state . open . more_options_visible = gtk_expander_get_expanded ( GTK_EXPANDER ( expander ) ) ;
filesel_state . open . filter_idx = file_chooser_get_filter_idx ( GTK_FILE_CHOOSER ( dialog ) ) ;
2014-01-17 22:56:04 +01:00
filesel_state . open . filetype_idx = filetype_combo_box_get_active_filetype ( GTK_COMBO_BOX ( filetype_combo ) ) ;
2011-06-10 22:13:29 +00:00
2008-05-07 12:13:58 +00:00
/* ignore detect from file item */
2011-06-10 22:13:29 +00:00
if ( filesel_state . open . filetype_idx > 0 )
2014-01-17 22:56:04 +01:00
ft = filetypes_index ( filesel_state . open . filetype_idx ) ;
2010-10-06 15:53:53 +00:00
2014-01-17 21:56:51 +01:00
filesel_state . open . encoding_idx = ui_encodings_combo_box_get_active_encoding ( GTK_COMBO_BOX ( encoding_combo ) ) ;
2011-06-10 23:13:08 +00:00
if ( filesel_state . open . encoding_idx > = 0 & & filesel_state . open . encoding_idx < GEANY_ENCODINGS_MAX )
charset = encodings [ filesel_state . open . encoding_idx ] . charset ;
2007-07-17 14:52:57 +00:00
2011-06-10 22:13:29 +00:00
filelist = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER ( dialog ) ) ;
2007-07-17 14:52:57 +00:00
if ( filelist ! = NULL )
{
document_open_files ( filelist , ro , ft , charset ) ;
2008-02-27 13:17:29 +00:00
g_slist_foreach ( filelist , ( GFunc ) g_free , NULL ) ; /* free filenames */
2007-07-17 14:52:57 +00:00
}
g_slist_free ( filelist ) ;
}
2013-08-11 14:10:57 +01:00
if ( app - > project & & ! EMPTY ( app - > project - > base_path ) )
2011-06-10 22:13:29 +00:00
gtk_file_chooser_remove_shortcut_folder ( GTK_FILE_CHOOSER ( dialog ) ,
2009-03-19 17:50:23 +00:00
app - > project - > base_path , NULL ) ;
2007-07-17 14:52:57 +00:00
}
2011-11-13 07:45:23 -08:00
static void on_file_open_show_hidden_notify ( GObject * filechooser ,
GParamSpec * pspec , gpointer data )
2007-07-17 14:52:57 +00:00
{
2011-11-13 07:45:23 -08:00
GtkWidget * toggle_button ;
2009-04-19 18:14:12 +00:00
2011-11-13 07:45:23 -08:00
toggle_button = ui_lookup_widget ( GTK_WIDGET ( filechooser ) , " check_hidden " ) ;
2007-07-17 14:52:57 +00:00
2011-11-13 07:45:23 -08:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( toggle_button ) ,
gtk_file_chooser_get_show_hidden ( GTK_FILE_CHOOSER ( filechooser ) ) ) ;
2007-07-17 14:52:57 +00:00
}
static void
2011-06-10 22:13:29 +00:00
on_file_open_check_hidden_toggled ( GtkToggleButton * togglebutton , GtkWidget * dialog )
2007-07-17 14:52:57 +00:00
{
2011-06-10 22:13:29 +00:00
filesel_state . open . show_hidden = gtk_toggle_button_get_active ( togglebutton ) ;
gtk_file_chooser_set_show_hidden ( GTK_FILE_CHOOSER ( dialog ) , filesel_state . open . show_hidden ) ;
2007-07-17 14:52:57 +00:00
}
2006-09-09 14:36:15 +00:00
2006-10-19 16:26:29 +00:00
2014-01-17 22:56:04 +01:00
static void filetype_combo_cell_data_func ( GtkCellLayout * cell_layout , GtkCellRenderer * cell ,
GtkTreeModel * tree_model , GtkTreeIter * iter , gpointer data )
{
gboolean sensitive = ! gtk_tree_model_iter_has_child ( tree_model , iter ) ;
gchar * text ;
gtk_tree_model_get ( tree_model , iter , 1 , & text , - 1 ) ;
g_object_set ( cell , " sensitive " , sensitive , " text " , text , NULL ) ;
g_free ( text ) ;
}
static GtkWidget * create_filetype_combo_box ( void )
{
GtkTreeStore * store ;
GtkTreeIter iter_compiled , iter_script , iter_markup , iter_misc , iter_detect ;
GtkTreeIter * iter_parent ;
GtkWidget * combo ;
GtkCellRenderer * renderer ;
GSList * node ;
store = gtk_tree_store_new ( 2 , G_TYPE_INT , G_TYPE_STRING ) ;
gtk_tree_store_insert_with_values ( store , & iter_detect , NULL , - 1 ,
2014-04-15 15:42:51 +02:00
0 , GEANY_FILETYPES_NONE , 1 , _ ( " Detect from file " ) , - 1 ) ;
2014-01-17 22:56:04 +01:00
gtk_tree_store_insert_with_values ( store , & iter_compiled , NULL , - 1 ,
0 , - 1 , 1 , _ ( " Programming Languages " ) , - 1 ) ;
gtk_tree_store_insert_with_values ( store , & iter_script , NULL , - 1 ,
0 , - 1 , 1 , _ ( " Scripting Languages " ) , - 1 ) ;
gtk_tree_store_insert_with_values ( store , & iter_markup , NULL , - 1 ,
0 , - 1 , 1 , _ ( " Markup Languages " ) , - 1 ) ;
gtk_tree_store_insert_with_values ( store , & iter_misc , NULL , - 1 ,
0 , - 1 , 1 , _ ( " Miscellaneous " ) , - 1 ) ;
foreach_slist ( node , filetypes_by_title )
{
GeanyFiletype * ft = node - > data ;
if ( ft - > id = = GEANY_FILETYPES_NONE )
continue ;
switch ( ft - > group )
{
case GEANY_FILETYPE_GROUP_COMPILED : iter_parent = & iter_compiled ; break ;
case GEANY_FILETYPE_GROUP_SCRIPT : iter_parent = & iter_script ; break ;
case GEANY_FILETYPE_GROUP_MARKUP : iter_parent = & iter_markup ; break ;
case GEANY_FILETYPE_GROUP_MISC : iter_parent = & iter_misc ; break ;
case GEANY_FILETYPE_GROUP_NONE :
default : iter_parent = NULL ;
}
gtk_tree_store_insert_with_values ( store , NULL , iter_parent , - 1 ,
0 , ( gint ) ft - > id , 1 , ft - > title , - 1 ) ;
}
combo = gtk_combo_box_new_with_model ( GTK_TREE_MODEL ( store ) ) ;
gtk_combo_box_set_active_iter ( GTK_COMBO_BOX ( combo ) , & iter_detect ) ;
renderer = gtk_cell_renderer_text_new ( ) ;
gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( combo ) , renderer , TRUE ) ;
gtk_cell_layout_set_cell_data_func ( GTK_CELL_LAYOUT ( combo ) , renderer ,
filetype_combo_cell_data_func , NULL , NULL ) ;
g_object_unref ( store ) ;
return combo ;
}
static gint filetype_combo_box_get_active_filetype ( GtkComboBox * combo )
{
gint id = 0 ;
GtkTreeIter iter ;
if ( gtk_combo_box_get_active_iter ( combo , & iter ) )
{
GtkTreeModel * model = gtk_combo_box_get_model ( combo ) ;
gtk_tree_model_get ( model , & iter , 0 , & id , - 1 ) ;
}
return id ;
}
static gboolean filetype_combo_box_set_active_filetype ( GtkComboBox * combo , const gint id )
{
GtkTreeModel * model = gtk_combo_box_get_model ( combo ) ;
GtkTreeIter iter ;
if ( gtk_tree_model_get_iter_first ( model , & iter ) )
{
do
{
gint row_id ;
gtk_tree_model_get ( model , & iter , 0 , & row_id , - 1 ) ;
if ( id = = row_id )
{
gtk_combo_box_set_active_iter ( combo , & iter ) ;
return TRUE ;
}
}
while ( ui_tree_model_iter_any_next ( model , & iter , TRUE ) ) ;
}
return FALSE ;
}
2011-06-10 22:13:29 +00:00
static GtkWidget * add_file_open_extra_widget ( GtkWidget * dialog )
2005-11-22 12:26:26 +00:00
{
2011-06-10 22:13:29 +00:00
GtkWidget * expander , * vbox , * table , * check_hidden ;
GtkWidget * filetype_ebox , * filetype_label , * filetype_combo ;
GtkWidget * encoding_ebox , * encoding_label , * encoding_combo ;
expander = gtk_expander_new_with_mnemonic ( _ ( " _More Options " ) ) ;
vbox = gtk_vbox_new ( FALSE , 6 ) ;
gtk_container_add ( GTK_CONTAINER ( expander ) , vbox ) ;
table = gtk_table_new ( 2 , 4 , FALSE ) ;
/* line 1 with checkbox and encoding combo */
check_hidden = gtk_check_button_new_with_mnemonic ( _ ( " Show _hidden files " ) ) ;
gtk_widget_show ( check_hidden ) ;
gtk_table_attach ( GTK_TABLE ( table ) , check_hidden , 0 , 1 , 0 , 1 ,
( GtkAttachOptions ) ( GTK_FILL | GTK_EXPAND ) ,
( GtkAttachOptions ) ( 0 ) , 0 , 5 ) ;
/* spacing */
gtk_table_attach ( GTK_TABLE ( table ) , gtk_label_new ( " " ) , 1 , 2 , 0 , 1 ,
( GtkAttachOptions ) ( GTK_FILL ) ,
( GtkAttachOptions ) ( 0 ) , 5 , 5 ) ;
encoding_label = gtk_label_new ( _ ( " Set encoding: " ) ) ;
gtk_misc_set_alignment ( GTK_MISC ( encoding_label ) , 1 , 0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , encoding_label , 2 , 3 , 0 , 1 ,
( GtkAttachOptions ) ( GTK_FILL ) ,
( GtkAttachOptions ) ( 0 ) , 4 , 5 ) ;
/* the ebox is for the tooltip, because gtk_combo_box can't show tooltips */
encoding_ebox = gtk_event_box_new ( ) ;
2014-01-17 21:56:51 +01:00
encoding_combo = ui_create_encodings_combo_box ( TRUE , GEANY_ENCODINGS_MAX ) ;
2011-06-13 18:41:50 +00:00
gtk_widget_set_tooltip_text ( encoding_ebox ,
2011-06-10 22:13:29 +00:00
_ ( " Explicitly defines an encoding for the file, if it would not be detected. This is useful when you know that the encoding of a file cannot be detected correctly by Geany. \n Note if you choose multiple files, they will all be opened with the chosen encoding. " ) ) ;
gtk_container_add ( GTK_CONTAINER ( encoding_ebox ) , encoding_combo ) ;
gtk_table_attach ( GTK_TABLE ( table ) , encoding_ebox , 3 , 4 , 0 , 1 ,
( GtkAttachOptions ) ( GTK_FILL ) ,
( GtkAttachOptions ) ( 0 ) , 0 , 5 ) ;
/* line 2 with filetype combo */
filetype_label = gtk_label_new ( _ ( " Set filetype: " ) ) ;
gtk_misc_set_alignment ( GTK_MISC ( filetype_label ) , 1 , 0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , filetype_label , 2 , 3 , 1 , 2 ,
( GtkAttachOptions ) ( GTK_FILL ) ,
( GtkAttachOptions ) ( 0 ) , 4 , 5 ) ;
/* the ebox is for the tooltip, because gtk_combo_box can't show tooltips */
filetype_ebox = gtk_event_box_new ( ) ;
2014-01-17 22:56:04 +01:00
filetype_combo = create_filetype_combo_box ( ) ;
2011-06-13 18:41:50 +00:00
gtk_widget_set_tooltip_text ( filetype_ebox ,
2011-06-10 22:13:29 +00:00
_ ( " Explicitly defines a filetype for the file, if it would not be detected by filename extension. \n Note if you choose multiple files, they will all be opened with the chosen filetype. " ) ) ;
gtk_container_add ( GTK_CONTAINER ( filetype_ebox ) , filetype_combo ) ;
gtk_table_attach ( GTK_TABLE ( table ) , filetype_ebox , 3 , 4 , 1 , 2 ,
( GtkAttachOptions ) ( GTK_FILL ) ,
( GtkAttachOptions ) ( 0 ) , 0 , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , table , FALSE , FALSE , 0 ) ;
gtk_widget_show_all ( vbox ) ;
g_signal_connect ( check_hidden , " toggled " , G_CALLBACK ( on_file_open_check_hidden_toggled ) , dialog ) ;
ui_hookup_widget ( dialog , expander , " more_options_expander " ) ;
ui_hookup_widget ( dialog , check_hidden , " check_hidden " ) ;
ui_hookup_widget ( dialog , filetype_combo , " filetype_combo " ) ;
ui_hookup_widget ( dialog , encoding_combo , " encoding_combo " ) ;
return expander ;
}
static GtkWidget * create_open_file_dialog ( void )
{
GtkWidget * dialog ;
2007-12-21 17:25:58 +00:00
GtkWidget * viewbtn ;
2009-03-31 15:07:27 +00:00
GSList * node ;
2007-12-21 17:25:58 +00:00
2011-06-10 22:13:29 +00:00
dialog = gtk_file_chooser_dialog_new ( _ ( " Open File " ) , GTK_WINDOW ( main_widgets . window ) ,
2007-12-21 17:25:58 +00:00
GTK_FILE_CHOOSER_ACTION_OPEN , NULL , NULL ) ;
2011-06-10 22:13:29 +00:00
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
2007-12-21 17:25:58 +00:00
2014-04-15 15:30:00 +02:00
viewbtn = gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , C_ ( " Open dialog action " , " _View " ) , GEANY_RESPONSE_VIEW ) ;
2011-06-13 18:41:50 +00:00
gtk_widget_set_tooltip_text ( viewbtn ,
2008-11-18 20:14:42 +00:00
_ ( " Opens the file in read-only mode. If you choose more than one file to open, all files will be opened read-only. " ) ) ;
2007-12-21 17:25:58 +00:00
2011-06-10 22:13:29 +00:00
gtk_dialog_add_buttons ( GTK_DIALOG ( dialog ) ,
2007-12-21 17:25:58 +00:00
GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT , NULL ) ;
2011-06-10 22:13:29 +00:00
gtk_dialog_set_default_response ( GTK_DIALOG ( dialog ) , GTK_RESPONSE_ACCEPT ) ;
gtk_widget_set_size_request ( dialog , - 1 , 460 ) ;
gtk_window_set_modal ( GTK_WINDOW ( dialog ) , TRUE ) ;
gtk_window_set_destroy_with_parent ( GTK_WINDOW ( dialog ) , TRUE ) ;
gtk_window_set_skip_taskbar_hint ( GTK_WINDOW ( dialog ) , FALSE ) ;
gtk_window_set_type_hint ( GTK_WINDOW ( dialog ) , GDK_WINDOW_TYPE_HINT_DIALOG ) ;
gtk_window_set_transient_for ( GTK_WINDOW ( dialog ) , GTK_WINDOW ( main_widgets . window ) ) ;
gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER ( dialog ) , TRUE ) ;
2011-10-28 10:25:58 -07:00
gtk_file_chooser_set_local_only ( GTK_FILE_CHOOSER ( dialog ) , FALSE ) ;
2007-12-21 17:25:58 +00:00
2008-02-27 13:17:29 +00:00
/* add checkboxes and filename entry */
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_extra_widget ( GTK_FILE_CHOOSER ( dialog ) , add_file_open_extra_widget ( dialog ) ) ;
2007-12-21 17:25:58 +00:00
2008-02-27 13:17:29 +00:00
/* add FileFilters(start with "All Files") */
2011-06-10 22:13:29 +00:00
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( dialog ) ,
2008-05-07 13:54:21 +00:00
filetypes_create_file_filter ( filetypes [ GEANY_FILETYPES_NONE ] ) ) ;
2008-02-27 13:17:29 +00:00
/* now create meta filter "All Source" */
2011-06-10 22:13:29 +00:00
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( dialog ) ,
2007-12-21 17:25:58 +00:00
filetypes_create_file_filter_all_source ( ) ) ;
2009-06-12 15:32:35 +00:00
foreach_slist ( node , filetypes_by_title )
2009-03-31 15:07:27 +00:00
{
2009-06-12 15:32:35 +00:00
GeanyFiletype * ft = node - > data ;
2009-04-05 21:07:40 +00:00
if ( G_UNLIKELY ( ft - > id = = GEANY_FILETYPES_NONE ) )
2009-03-31 15:07:27 +00:00
continue ;
2011-06-10 22:13:29 +00:00
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( dialog ) , filetypes_create_file_filter ( ft ) ) ;
2009-03-31 15:07:27 +00:00
}
2006-01-26 21:32:46 +00:00
2011-11-13 07:45:23 -08:00
g_signal_connect ( dialog , " notify::show-hidden " ,
G_CALLBACK ( on_file_open_show_hidden_notify ) , NULL ) ;
2011-06-10 22:13:29 +00:00
return dialog ;
}
static void open_file_dialog_apply_settings ( GtkWidget * dialog )
{
static gboolean initialized = FALSE ;
GtkWidget * check_hidden = ui_lookup_widget ( dialog , " check_hidden " ) ;
GtkWidget * filetype_combo = ui_lookup_widget ( dialog , " filetype_combo " ) ;
2014-01-17 21:56:51 +01:00
GtkWidget * encoding_combo = ui_lookup_widget ( dialog , " encoding_combo " ) ;
2011-06-10 22:13:29 +00:00
GtkWidget * expander = ui_lookup_widget ( dialog , " more_options_expander " ) ;
/* we can't know the initial position of combo boxes, so retreive it the first time */
if ( ! initialized )
{
filesel_state . open . filter_idx = file_chooser_get_filter_idx ( GTK_FILE_CHOOSER ( dialog ) ) ;
initialized = TRUE ;
}
else
{
file_chooser_set_filter_idx ( GTK_FILE_CHOOSER ( dialog ) , filesel_state . open . filter_idx ) ;
}
gtk_expander_set_expanded ( GTK_EXPANDER ( expander ) , filesel_state . open . more_options_visible ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check_hidden ) , filesel_state . open . show_hidden ) ;
2014-01-17 21:56:51 +01:00
ui_encodings_combo_box_set_active_encoding ( GTK_COMBO_BOX ( encoding_combo ) , filesel_state . open . encoding_idx ) ;
2014-01-17 22:56:04 +01:00
filetype_combo_box_set_active_filetype ( GTK_COMBO_BOX ( filetype_combo ) , filesel_state . open . filetype_idx ) ;
2007-12-21 17:25:58 +00:00
}
2006-05-14 16:07:30 +00:00
2007-12-21 17:25:58 +00:00
/* This shows the file selection dialog to open a file. */
2011-06-10 22:13:29 +00:00
void dialogs_show_open_file ( void )
2007-12-21 17:25:58 +00:00
{
gchar * initdir ;
2006-04-27 18:06:35 +00:00
2008-02-27 13:17:29 +00:00
/* set dialog directory to the current file's directory, if present */
2007-12-21 17:25:58 +00:00
initdir = utils_get_current_file_dir_utf8 ( ) ;
2008-02-27 13:17:29 +00:00
/* use project or default startup directory (if set) if no files are open */
/** TODO should it only be used when initally open the dialog and not on every show? */
2007-12-21 17:25:58 +00:00
if ( ! initdir )
initdir = g_strdup ( utils_get_default_dir_utf8 ( ) ) ;
2012-01-25 16:26:16 +00:00
SETPTR ( initdir , utils_get_locale_from_utf8 ( initdir ) ) ;
2007-12-21 17:25:58 +00:00
2010-05-16 18:22:24 +00:00
# ifdef G_OS_WIN32
if ( interface_prefs . use_native_windows_dialogs )
win32_show_document_open_dialog ( GTK_WINDOW ( main_widgets . window ) , _ ( " Open File " ) , initdir ) ;
else
# endif
2007-05-23 13:44:25 +00:00
{
2011-06-10 22:13:29 +00:00
GtkWidget * dialog = create_open_file_dialog ( ) ;
gint response ;
2006-01-26 21:32:46 +00:00
2011-06-10 22:13:29 +00:00
open_file_dialog_apply_settings ( dialog ) ;
if ( initdir ! = NULL & & g_path_is_absolute ( initdir ) )
gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( dialog ) , initdir ) ;
2009-03-19 17:50:23 +00:00
2013-08-11 14:10:57 +01:00
if ( app - > project & & ! EMPTY ( app - > project - > base_path ) )
2011-06-10 22:13:29 +00:00
gtk_file_chooser_add_shortcut_folder ( GTK_FILE_CHOOSER ( dialog ) ,
app - > project - > base_path , NULL ) ;
2010-05-16 18:22:24 +00:00
2011-06-10 22:13:29 +00:00
response = gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
open_file_dialog_handle_response ( dialog , response ) ;
gtk_widget_destroy ( dialog ) ;
2010-05-16 18:22:24 +00:00
}
2007-12-21 17:25:58 +00:00
g_free ( initdir ) ;
2005-11-22 12:26:26 +00:00
}
2012-11-15 16:06:27 +00:00
static gboolean handle_save_as ( const gchar * utf8_filename , gboolean rename_file )
2008-01-15 17:04:31 +00:00
{
2008-06-15 13:35:48 +00:00
GeanyDocument * doc = document_get_current ( ) ;
2009-05-17 17:16:24 +00:00
gboolean success = FALSE ;
2008-01-15 17:04:31 +00:00
2013-08-11 14:10:57 +01:00
g_return_val_if_fail ( ! EMPTY ( utf8_filename ) , FALSE ) ;
2008-01-15 17:04:31 +00:00
2012-11-15 16:06:27 +00:00
if ( doc - > file_name ! = NULL )
2008-01-15 17:04:31 +00:00
{
2012-11-15 16:06:27 +00:00
if ( rename_file )
2008-01-15 17:04:31 +00:00
{
2012-11-15 16:06:27 +00:00
document_rename_file ( doc , utf8_filename ) ;
2008-01-15 17:04:31 +00:00
}
2012-11-15 16:06:27 +00:00
/* create a new tm_source_file object otherwise tagmanager won't work correctly */
tm_workspace_remove_object ( doc - > tm_file , TRUE , TRUE ) ;
doc - > tm_file = NULL ;
2009-01-18 18:19:58 +00:00
}
2012-11-15 16:06:27 +00:00
success = document_save_file_as ( doc , utf8_filename ) ;
build_menu_update ( doc ) ;
2009-05-17 17:16:24 +00:00
return success ;
2008-01-15 17:04:31 +00:00
}
2011-06-10 22:13:29 +00:00
static gboolean save_as_dialog_handle_response ( GtkWidget * dialog , gint response )
2007-07-17 14:52:57 +00:00
{
gboolean rename_file = FALSE ;
2009-05-17 17:16:24 +00:00
gboolean success = FALSE ;
2011-06-10 22:13:29 +00:00
gchar * new_filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER ( dialog ) ) ;
2007-07-17 14:52:57 +00:00
switch ( response )
{
2008-01-11 13:17:00 +00:00
case GEANY_RESPONSE_RENAME :
2009-07-20 16:12:23 +00:00
/* rename doesn't check for empty filename or overwriting */
2013-08-11 14:10:57 +01:00
if ( G_UNLIKELY ( EMPTY ( new_filename ) ) )
2009-07-20 16:12:23 +00:00
{
utils_beep ( ) ;
break ;
}
if ( g_file_test ( new_filename , G_FILE_TEST_EXISTS ) & &
! dialogs_show_question_full ( NULL , NULL , NULL ,
_ ( " Overwrite? " ) ,
_ ( " Filename already exists! " ) ) )
break ;
2007-07-17 14:52:57 +00:00
rename_file = TRUE ;
2008-02-27 13:17:29 +00:00
/* fall through */
2007-07-17 14:52:57 +00:00
case GTK_RESPONSE_ACCEPT :
{
2008-01-15 17:04:31 +00:00
gchar * utf8_filename ;
2007-07-17 14:52:57 +00:00
utf8_filename = utils_get_utf8_from_locale ( new_filename ) ;
2012-11-15 16:06:27 +00:00
success = handle_save_as ( utf8_filename , rename_file ) ;
2008-01-15 17:04:31 +00:00
g_free ( utf8_filename ) ;
2009-05-21 19:19:12 +00:00
break ;
2007-07-17 14:52:57 +00:00
}
2011-06-10 22:13:29 +00:00
case GTK_RESPONSE_DELETE_EVENT :
2009-05-21 19:19:12 +00:00
case GTK_RESPONSE_CANCEL :
success = TRUE ;
break ;
2007-07-17 14:52:57 +00:00
}
2009-07-20 16:12:23 +00:00
g_free ( new_filename ) ;
2011-06-10 22:13:29 +00:00
return success ;
2007-07-17 14:52:57 +00:00
}
2012-11-16 13:57:26 +00:00
static GtkWidget * create_save_file_dialog ( GeanyDocument * doc )
2007-12-21 17:25:58 +00:00
{
2012-11-15 16:06:27 +00:00
GtkWidget * dialog , * rename_btn ;
2009-06-25 12:39:21 +00:00
const gchar * initdir ;
2007-12-21 17:25:58 +00:00
2011-06-10 22:13:29 +00:00
dialog = gtk_file_chooser_dialog_new ( _ ( " Save File " ) , GTK_WINDOW ( main_widgets . window ) ,
2007-12-21 17:25:58 +00:00
GTK_FILE_CHOOSER_ACTION_SAVE , NULL , NULL ) ;
2011-06-10 22:13:29 +00:00
gtk_window_set_modal ( GTK_WINDOW ( dialog ) , TRUE ) ;
gtk_window_set_destroy_with_parent ( GTK_WINDOW ( dialog ) , TRUE ) ;
gtk_window_set_skip_taskbar_hint ( GTK_WINDOW ( dialog ) , FALSE ) ;
gtk_window_set_type_hint ( GTK_WINDOW ( dialog ) , GDK_WINDOW_TYPE_HINT_DIALOG ) ;
gtk_window_set_transient_for ( GTK_WINDOW ( dialog ) , GTK_WINDOW ( main_widgets . window ) ) ;
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
rename_btn = gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , _ ( " R_ename " ) , GEANY_RESPONSE_RENAME ) ;
2011-06-13 18:41:50 +00:00
gtk_widget_set_tooltip_text ( rename_btn , _ ( " Save the file and rename it " ) ) ;
2012-11-16 13:57:26 +00:00
/* disable rename unless file exists on disk */
gtk_widget_set_sensitive ( rename_btn , doc - > real_path ! = NULL ) ;
2007-12-21 17:25:58 +00:00
2011-06-10 22:13:29 +00:00
gtk_dialog_add_buttons ( GTK_DIALOG ( dialog ) ,
2007-12-21 17:25:58 +00:00
GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
GTK_STOCK_SAVE , GTK_RESPONSE_ACCEPT , NULL ) ;
2011-06-10 22:13:29 +00:00
gtk_dialog_set_default_response ( GTK_DIALOG ( dialog ) , GTK_RESPONSE_ACCEPT ) ;
2007-12-21 17:25:58 +00:00
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_do_overwrite_confirmation ( GTK_FILE_CHOOSER ( dialog ) , TRUE ) ;
2011-10-28 10:25:58 -07:00
gtk_file_chooser_set_local_only ( GTK_FILE_CHOOSER ( dialog ) , FALSE ) ;
2007-12-21 17:25:58 +00:00
2009-06-16 21:25:04 +00:00
/* set the folder by default to the project base dir or the global pref for opening files */
2009-06-25 12:39:21 +00:00
initdir = utils_get_default_dir_utf8 ( ) ;
if ( initdir )
{
gchar * linitdir = utils_get_locale_from_utf8 ( initdir ) ;
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( dialog ) , linitdir ) ;
2009-06-25 12:39:21 +00:00
g_free ( linitdir ) ;
}
2011-06-10 22:13:29 +00:00
return dialog ;
2007-12-21 17:25:58 +00:00
}
2011-10-07 16:47:31 +00:00
static gboolean show_save_as_gtk ( GeanyDocument * doc )
2005-11-22 12:26:26 +00:00
{
2011-06-10 22:13:29 +00:00
GtkWidget * dialog ;
2008-06-15 13:35:48 +00:00
gint resp ;
2005-11-22 12:26:26 +00:00
2014-01-18 15:12:22 +01:00
g_return_val_if_fail ( DOC_VALID ( doc ) , FALSE ) ;
2010-03-07 11:08:19 +00:00
2012-11-16 13:57:26 +00:00
dialog = create_save_file_dialog ( doc ) ;
2005-11-22 12:26:26 +00:00
2008-06-15 13:35:48 +00:00
if ( doc - > file_name ! = NULL )
2006-04-27 18:06:35 +00:00
{
2008-06-15 13:35:48 +00:00
if ( g_path_is_absolute ( doc - > file_name ) )
2008-02-12 15:50:22 +00:00
{
2008-06-15 13:35:48 +00:00
gchar * locale_filename = utils_get_locale_from_utf8 ( doc - > file_name ) ;
2008-02-12 15:50:22 +00:00
gchar * locale_basename = g_path_get_basename ( locale_filename ) ;
gchar * locale_dirname = g_path_get_dirname ( locale_filename ) ;
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( dialog ) , locale_dirname ) ;
gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER ( dialog ) , locale_basename ) ;
2008-02-12 15:50:22 +00:00
g_free ( locale_filename ) ;
g_free ( locale_basename ) ;
g_free ( locale_dirname ) ;
}
2006-06-02 12:00:33 +00:00
else
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER ( dialog ) , doc - > file_name ) ;
2006-04-27 18:06:35 +00:00
}
2005-11-22 12:26:26 +00:00
else
{
2006-04-27 18:06:35 +00:00
gchar * fname = NULL ;
2006-05-14 16:07:30 +00:00
2009-08-12 11:19:54 +00:00
if ( doc - > file_type ! = NULL & & doc - > file_type - > extension ! = NULL )
2006-04-27 18:06:35 +00:00
fname = g_strconcat ( GEANY_STRING_UNTITLED , " . " ,
2008-06-15 13:35:48 +00:00
doc - > file_type - > extension , NULL ) ;
2006-05-14 16:07:30 +00:00
else
2006-04-27 18:06:35 +00:00
fname = g_strdup ( GEANY_STRING_UNTITLED ) ;
2011-06-10 22:13:29 +00:00
gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER ( dialog ) , fname ) ;
2007-05-23 13:44:25 +00:00
2006-04-27 18:06:35 +00:00
g_free ( fname ) ;
2005-11-22 12:26:26 +00:00
}
2013-08-11 14:10:57 +01:00
if ( app - > project & & ! EMPTY ( app - > project - > base_path ) )
2011-06-10 22:13:29 +00:00
gtk_file_chooser_add_shortcut_folder ( GTK_FILE_CHOOSER ( dialog ) ,
2009-03-19 17:50:23 +00:00
app - > project - > base_path , NULL ) ;
2008-02-27 13:17:29 +00:00
/* Run the dialog synchronously, pausing this function call */
2011-06-10 22:13:29 +00:00
do
{
resp = gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
}
while ( ! save_as_dialog_handle_response ( dialog , resp ) ) ;
2009-03-19 17:50:23 +00:00
2013-08-11 14:10:57 +01:00
if ( app - > project & & ! EMPTY ( app - > project - > base_path ) )
2011-06-10 22:13:29 +00:00
gtk_file_chooser_remove_shortcut_folder ( GTK_FILE_CHOOSER ( dialog ) ,
2009-03-19 17:50:23 +00:00
app - > project - > base_path , NULL ) ;
2011-06-10 22:13:29 +00:00
gtk_widget_destroy ( dialog ) ;
2006-11-07 11:24:22 +00:00
return ( resp = = GTK_RESPONSE_ACCEPT ) ;
2007-12-21 17:25:58 +00:00
}
2008-02-17 18:00:42 +00:00
/**
2010-03-15 13:01:16 +00:00
* Shows the Save As dialog for the current notebook page .
2008-02-17 18:00:42 +00:00
*
2009-07-21 22:12:13 +00:00
* @ return @ c TRUE if the file was saved , otherwise @ c FALSE .
2008-02-17 18:00:42 +00:00
* */
2013-11-10 01:41:01 +01:00
gboolean dialogs_show_save_as ( void )
2007-12-21 17:25:58 +00:00
{
2011-10-07 16:47:31 +00:00
GeanyDocument * doc = document_get_current ( ) ;
2010-05-15 12:05:54 +00:00
gboolean result = FALSE ;
2007-12-21 17:25:58 +00:00
2011-10-07 16:47:31 +00:00
g_return_val_if_fail ( doc , FALSE ) ;
2010-05-16 18:22:24 +00:00
# ifdef G_OS_WIN32
if ( interface_prefs . use_native_windows_dialogs )
{
gchar * utf8_name = win32_show_document_save_as_dialog ( GTK_WINDOW ( main_widgets . window ) ,
2014-03-11 15:45:49 +01:00
_ ( " Save File " ) , doc ) ;
2010-05-16 18:22:24 +00:00
if ( utf8_name ! = NULL )
2012-11-15 16:06:27 +00:00
result = handle_save_as ( utf8_name , FALSE ) ;
2010-05-16 18:22:24 +00:00
}
else
2005-11-22 12:26:26 +00:00
# endif
2011-10-07 16:47:31 +00:00
result = show_save_as_gtk ( doc ) ;
2007-12-21 17:25:58 +00:00
return result ;
2005-11-22 12:26:26 +00:00
}
2009-07-19 20:19:09 +00:00
# ifndef G_OS_WIN32
static void show_msgbox_dialog ( GtkWidget * dialog , GtkMessageType type , GtkWindow * parent )
{
const gchar * title ;
switch ( type )
{
case GTK_MESSAGE_ERROR :
title = _ ( " Error " ) ;
break ;
case GTK_MESSAGE_QUESTION :
title = _ ( " Question " ) ;
break ;
case GTK_MESSAGE_WARNING :
title = _ ( " Warning " ) ;
break ;
default :
title = _ ( " Information " ) ;
break ;
}
gtk_window_set_title ( GTK_WINDOW ( dialog ) , title ) ;
2012-10-15 15:23:30 +02:00
gtk_window_set_icon_name ( GTK_WINDOW ( dialog ) , " geany " ) ;
2009-07-19 20:19:09 +00:00
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
}
# endif
2008-02-17 18:00:42 +00:00
/**
2010-03-15 13:01:16 +00:00
* Shows a message box of the type @ a type with @ a text .
2008-02-17 18:00:42 +00:00
* On Unix - like systems a GTK message dialog box is shown , on Win32 systems a native Windows
* message dialog box is shown .
*
2009-07-21 22:12:13 +00:00
* @ param type A @ c GtkMessageType , e . g . @ c GTK_MESSAGE_INFO , @ c GTK_MESSAGE_WARNING ,
* @ c GTK_MESSAGE_QUESTION , @ c GTK_MESSAGE_ERROR .
2008-02-17 18:00:42 +00:00
* @ param text Printf ( ) - style format string .
2009-07-21 22:12:13 +00:00
* @ param . . . Arguments for the @ a text format string .
2008-02-17 18:00:42 +00:00
* */
2009-07-09 13:51:37 +00:00
void dialogs_show_msgbox ( GtkMessageType type , const gchar * text , . . . )
2005-11-22 12:26:26 +00:00
{
2006-07-26 17:02:16 +00:00
# ifndef G_OS_WIN32
2005-11-22 12:26:26 +00:00
GtkWidget * dialog ;
# endif
2010-04-25 17:42:01 +00:00
gchar * string ;
2005-11-22 12:26:26 +00:00
va_list args ;
2009-07-19 20:19:09 +00:00
GtkWindow * parent = ( main_status . main_window_realized ) ? GTK_WINDOW ( main_widgets . window ) : NULL ;
2005-11-22 12:26:26 +00:00
va_start ( args , text ) ;
2010-04-25 17:42:01 +00:00
string = g_strdup_vprintf ( text , args ) ;
2005-11-22 12:26:26 +00:00
va_end ( args ) ;
2006-07-26 17:02:16 +00:00
# ifdef G_OS_WIN32
2009-07-19 20:19:09 +00:00
win32_message_dialog ( GTK_WIDGET ( parent ) , type , string ) ;
2005-11-22 12:26:26 +00:00
# else
2009-07-19 20:19:09 +00:00
dialog = gtk_message_dialog_new ( parent , GTK_DIALOG_DESTROY_WITH_PARENT ,
2011-08-06 18:34:14 +00:00
type , GTK_BUTTONS_OK , " %s " , string ) ;
2009-07-19 20:19:09 +00:00
show_msgbox_dialog ( dialog , type , parent ) ;
2005-11-22 12:26:26 +00:00
# endif
2010-04-25 17:42:01 +00:00
g_free ( string ) ;
2005-11-22 12:26:26 +00:00
}
2009-07-09 13:51:37 +00:00
void dialogs_show_msgbox_with_secondary ( GtkMessageType type , const gchar * text , const gchar * secondary )
2007-11-29 18:08:20 +00:00
{
2009-07-19 20:19:09 +00:00
GtkWindow * parent = ( main_status . main_window_realized ) ? GTK_WINDOW ( main_widgets . window ) : NULL ;
2007-11-29 18:08:20 +00:00
# ifdef G_OS_WIN32
2008-02-27 13:17:29 +00:00
/* put the two strings together because Windows message boxes don't support secondary texts */
2007-11-29 18:08:20 +00:00
gchar * string = g_strconcat ( text , " \n " , secondary , NULL ) ;
2009-07-19 20:19:09 +00:00
win32_message_dialog ( GTK_WIDGET ( parent ) , type , string ) ;
2007-11-29 18:08:20 +00:00
g_free ( string ) ;
# else
2008-03-17 18:26:22 +00:00
GtkWidget * dialog ;
2009-07-19 20:19:09 +00:00
dialog = gtk_message_dialog_new ( parent , GTK_DIALOG_DESTROY_WITH_PARENT ,
2011-08-06 18:34:14 +00:00
type , GTK_BUTTONS_OK , " %s " , text ) ;
2007-11-29 18:08:20 +00:00
gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG ( dialog ) , " %s " , secondary ) ;
2009-07-19 20:19:09 +00:00
show_msgbox_dialog ( dialog , type , parent ) ;
2007-11-29 18:08:20 +00:00
# endif
}
2008-10-13 16:00:53 +00:00
static gint run_unsaved_dialog ( const gchar * msg , const gchar * msg2 )
{
2006-12-08 16:21:52 +00:00
GtkWidget * dialog , * button ;
2008-10-13 16:00:53 +00:00
gint ret ;
dialog = gtk_message_dialog_new ( GTK_WINDOW ( main_widgets . window ) , GTK_DIALOG_DESTROY_WITH_PARENT ,
2011-08-06 18:34:14 +00:00
GTK_MESSAGE_QUESTION , GTK_BUTTONS_NONE , " %s " , msg ) ;
2011-09-21 15:35:38 +00:00
gtk_window_set_title ( GTK_WINDOW ( dialog ) , _ ( " Question " ) ) ;
2008-10-13 16:00:53 +00:00
gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG ( dialog ) , " %s " , msg2 ) ;
gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ) ;
button = ui_button_new_with_image ( GTK_STOCK_CLEAR , _ ( " _Don't save " ) ) ;
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 ) ;
return ret ;
}
gboolean dialogs_show_unsaved_file ( GeanyDocument * doc )
{
gchar * msg , * short_fn = NULL ;
const gchar * msg2 ;
2011-10-11 16:19:24 +01:00
gint response ;
2008-06-04 13:23:43 +00:00
gboolean old_quitting_state = main_status . quitting ;
2005-11-22 12:26:26 +00:00
2008-02-27 13:17:29 +00:00
/* display the file tab to remind the user of the document */
2008-06-03 18:15:52 +00:00
main_status . quitting = FALSE ;
2011-10-07 16:47:31 +00:00
document_show_tab ( doc ) ;
2008-06-04 13:23:43 +00:00
main_status . quitting = old_quitting_state ;
2006-12-18 12:34:29 +00:00
2009-04-21 20:52:51 +00:00
short_fn = document_get_basename_for_display ( doc , - 1 ) ;
2006-10-20 16:40:12 +00:00
2011-10-11 16:19:24 +01:00
msg = g_strdup_printf ( _ ( " The file '%s' is not saved. " ) , short_fn ) ;
2007-07-08 14:55:37 +00:00
msg2 = _ ( " Do you want to save it before closing? " ) ;
2006-10-20 16:40:12 +00:00
g_free ( short_fn ) ;
2011-10-11 16:19:24 +01:00
response = run_unsaved_dialog ( msg , msg2 ) ;
2005-11-22 12:26:26 +00:00
g_free ( msg ) ;
2011-10-11 16:19:24 +01:00
switch ( response )
2005-11-22 12:26:26 +00:00
{
case GTK_RESPONSE_YES :
2011-11-02 15:17:17 +00:00
/* document_save_file() returns the status if the file could be saved */
return document_save_file ( doc , FALSE ) ;
2011-10-11 16:19:24 +01:00
case GTK_RESPONSE_NO :
return TRUE ;
2011-10-11 21:52:58 -07:00
2005-11-22 12:26:26 +00:00
case GTK_RESPONSE_CANCEL : /* fall through to default and leave the function */
2011-10-11 16:19:24 +01:00
default :
return FALSE ;
2005-11-22 12:26:26 +00:00
}
}
2007-07-28 17:44:02 +00:00
# ifndef G_OS_WIN32
2012-09-17 14:40:24 +02:00
/* Use GtkFontChooserDialog on GTK3.2 for consistency, and because
* GtkFontSelectionDialog is somewhat broken on 3.4 */
2013-01-29 15:49:39 +01:00
# if GTK_CHECK_VERSION(3, 2, 0)
2012-09-17 14:40:24 +02:00
# undef GTK_FONT_SELECTION_DIALOG
# define GTK_FONT_SELECTION_DIALOG GTK_FONT_CHOOSER_DIALOG
# define gtk_font_selection_dialog_new(title) \
gtk_font_chooser_dialog_new ( ( title ) , NULL )
# define gtk_font_selection_dialog_get_font_name(dlg) \
gtk_font_chooser_get_font ( GTK_FONT_CHOOSER ( dlg ) )
# define gtk_font_selection_dialog_set_font_name(dlg, font) \
gtk_font_chooser_set_font ( GTK_FONT_CHOOSER ( dlg ) , ( font ) )
# endif
2007-07-17 14:52:57 +00:00
static void
2012-09-11 20:03:19 +02:00
on_font_dialog_response ( GtkDialog * dialog , gint response , gpointer user_data )
2007-07-17 14:52:57 +00:00
{
2012-09-11 20:03:19 +02:00
gboolean close = TRUE ;
2007-07-17 14:52:57 +00:00
2012-09-11 20:03:19 +02:00
switch ( response )
{
case GTK_RESPONSE_APPLY :
case GTK_RESPONSE_OK :
{
gchar * fontname ;
2007-07-17 14:52:57 +00:00
2012-09-11 20:03:19 +02:00
fontname = gtk_font_selection_dialog_get_font_name (
GTK_FONT_SELECTION_DIALOG ( ui_widgets . open_fontsel ) ) ;
ui_set_editor_font ( fontname ) ;
g_free ( fontname ) ;
2007-07-17 14:52:57 +00:00
2012-09-11 20:03:19 +02:00
close = ( response = = GTK_RESPONSE_OK ) ;
break ;
}
}
2007-07-17 14:52:57 +00:00
2012-09-11 20:03:19 +02:00
if ( close )
gtk_widget_hide ( ui_widgets . open_fontsel ) ;
2007-07-17 14:52:57 +00:00
}
2007-07-28 17:44:02 +00:00
# endif
2007-07-17 14:52:57 +00:00
2005-11-22 12:26:26 +00:00
/* This shows the font selection dialog to choose a font. */
2013-11-10 01:41:01 +01:00
void dialogs_show_open_font ( void )
2005-11-22 12:26:26 +00:00
{
2006-07-26 17:02:16 +00:00
# ifdef G_OS_WIN32
2005-11-22 12:26:26 +00:00
win32_show_font_dialog ( ) ;
2006-02-22 13:46:20 +00:00
# else
2005-11-22 12:26:26 +00:00
2007-08-23 11:34:06 +00:00
if ( ui_widgets . open_fontsel = = NULL )
2005-11-22 12:26:26 +00:00
{
2012-09-11 20:03:19 +02:00
GtkWidget * apply_button ;
2007-08-23 11:34:06 +00:00
ui_widgets . open_fontsel = gtk_font_selection_dialog_new ( _ ( " Choose font " ) ) ; ;
gtk_container_set_border_width ( GTK_CONTAINER ( ui_widgets . open_fontsel ) , 4 ) ;
gtk_window_set_modal ( GTK_WINDOW ( ui_widgets . open_fontsel ) , TRUE ) ;
gtk_window_set_destroy_with_parent ( GTK_WINDOW ( ui_widgets . open_fontsel ) , TRUE ) ;
gtk_window_set_skip_taskbar_hint ( GTK_WINDOW ( ui_widgets . open_fontsel ) , TRUE ) ;
gtk_window_set_type_hint ( GTK_WINDOW ( ui_widgets . open_fontsel ) , GDK_WINDOW_TYPE_HINT_DIALOG ) ;
gtk_widget_set_name ( ui_widgets . open_fontsel , " GeanyDialog " ) ;
2006-02-25 22:26:43 +00:00
2012-09-11 20:03:19 +02:00
# if GTK_CHECK_VERSION(2, 20, 0)
/* apply button doesn't have a getter and is hidden by default, but we'd like to show it */
apply_button = gtk_dialog_get_widget_for_response ( GTK_DIALOG ( ui_widgets . open_fontsel ) , GTK_RESPONSE_APPLY ) ;
# else
apply_button = GTK_FONT_SELECTION_DIALOG ( ui_widgets . open_fontsel ) - > apply_button ;
# endif
if ( apply_button )
gtk_widget_show ( apply_button ) ;
2006-02-22 13:46:20 +00:00
2008-07-18 13:40:48 +00:00
g_signal_connect ( ui_widgets . open_fontsel ,
" delete-event " , G_CALLBACK ( gtk_widget_hide_on_delete ) , NULL ) ;
2012-09-11 20:03:19 +02:00
g_signal_connect ( ui_widgets . open_fontsel ,
" response " , G_CALLBACK ( on_font_dialog_response ) , NULL ) ;
2006-02-22 13:46:20 +00:00
2008-05-22 14:41:28 +00:00
gtk_window_set_transient_for ( GTK_WINDOW ( ui_widgets . open_fontsel ) , GTK_WINDOW ( main_widgets . window ) ) ;
2005-11-22 12:26:26 +00:00
}
2012-06-04 14:29:23 -07:00
gtk_font_selection_dialog_set_font_name (
GTK_FONT_SELECTION_DIALOG ( ui_widgets . open_fontsel ) , interface_prefs . editor_font ) ;
2005-11-22 12:26:26 +00:00
/* We make sure the dialog is visible. */
2007-08-23 11:34:06 +00:00
gtk_window_present ( GTK_WINDOW ( ui_widgets . open_fontsel ) ) ;
2005-11-22 12:26:26 +00:00
# endif
}
2007-12-21 13:09:09 +00:00
static void
on_input_dialog_show ( GtkDialog * dialog , GtkWidget * entry )
2005-11-22 12:26:26 +00:00
{
2007-12-21 13:09:09 +00:00
gtk_widget_grab_focus ( entry ) ;
}
2005-11-22 12:26:26 +00:00
2007-12-21 13:09:09 +00:00
static void
on_input_entry_activate ( GtkEntry * entry , GtkDialog * dialog )
{
gtk_dialog_response ( dialog , GTK_RESPONSE_ACCEPT ) ;
}
2008-06-19 14:31:09 +00:00
static void
on_input_numeric_activate ( GtkEntry * entry , GtkDialog * dialog )
{
gtk_dialog_response ( dialog , GTK_RESPONSE_ACCEPT ) ;
}
2007-12-21 13:09:09 +00:00
static void
2011-08-06 18:34:14 +00:00
on_input_dialog_response ( GtkDialog * dialog , gint response , GtkWidget * entry )
2007-12-21 13:09:09 +00:00
{
2008-02-20 11:24:23 +00:00
gboolean persistent = ( gboolean ) GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( dialog ) , " has_combo " ) ) ;
2007-12-21 13:09:09 +00:00
if ( response = = GTK_RESPONSE_ACCEPT )
{
const gchar * str = gtk_entry_get_text ( GTK_ENTRY ( entry ) ) ;
2010-03-12 13:06:34 +00:00
GeanyInputCallback input_cb =
( GeanyInputCallback ) g_object_get_data ( G_OBJECT ( dialog ) , " input_cb " ) ;
2007-12-21 13:09:09 +00:00
if ( persistent )
{
GtkWidget * combo = ( GtkWidget * ) g_object_get_data ( G_OBJECT ( dialog ) , " combo " ) ;
2012-09-15 23:40:13 +02:00
ui_combo_box_add_to_history ( GTK_COMBO_BOX_TEXT ( combo ) , str , 0 ) ;
2007-12-21 13:09:09 +00:00
}
input_cb ( str ) ;
}
2010-03-12 13:06:34 +00:00
gtk_widget_hide ( GTK_WIDGET ( dialog ) ) ;
2007-12-21 13:09:09 +00:00
}
static void add_input_widgets ( GtkWidget * dialog , GtkWidget * vbox ,
2010-05-09 15:48:42 +00:00
const gchar * label_text , const gchar * default_text , gboolean persistent ,
GCallback insert_text_cb )
2007-12-21 13:09:09 +00:00
{
2010-03-12 13:06:34 +00:00
GtkWidget * entry ;
2005-11-22 12:26:26 +00:00
2010-03-12 13:06:34 +00:00
if ( label_text )
{
GtkWidget * label = gtk_label_new ( label_text ) ;
gtk_label_set_line_wrap ( GTK_LABEL ( label ) , TRUE ) ;
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0 , 0.5 ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , label ) ;
}
2007-12-21 13:09:09 +00:00
2008-02-27 13:17:29 +00:00
if ( persistent ) /* remember previous entry text in a combo box */
2007-12-21 13:09:09 +00:00
{
2012-09-15 23:40:13 +02:00
GtkWidget * combo = gtk_combo_box_text_new_with_entry ( ) ;
2007-12-21 13:09:09 +00:00
2011-10-11 21:30:28 -07:00
entry = gtk_bin_get_child ( GTK_BIN ( combo ) ) ;
2009-09-21 16:46:16 +00:00
ui_entry_add_clear_icon ( GTK_ENTRY ( entry ) ) ;
2007-12-21 13:09:09 +00:00
g_object_set_data ( G_OBJECT ( dialog ) , " combo " , combo ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , combo ) ;
}
else
{
entry = gtk_entry_new ( ) ;
2009-09-21 16:46:16 +00:00
ui_entry_add_clear_icon ( GTK_ENTRY ( entry ) ) ;
2007-12-21 13:09:09 +00:00
gtk_container_add ( GTK_CONTAINER ( vbox ) , entry ) ;
}
2006-08-19 12:56:30 +00:00
if ( default_text ! = NULL )
2005-11-22 12:26:26 +00:00
{
2006-08-19 12:56:30 +00:00
gtk_entry_set_text ( GTK_ENTRY ( entry ) , default_text ) ;
2005-11-22 12:26:26 +00:00
}
2006-08-19 12:56:30 +00:00
gtk_entry_set_max_length ( GTK_ENTRY ( entry ) , 255 ) ;
2005-11-22 12:26:26 +00:00
gtk_entry_set_width_chars ( GTK_ENTRY ( entry ) , 30 ) ;
2010-05-09 15:48:42 +00:00
if ( insert_text_cb ! = NULL )
g_signal_connect ( entry , " insert-text " , insert_text_cb , NULL ) ;
2008-07-18 13:40:48 +00:00
g_signal_connect ( entry , " activate " , G_CALLBACK ( on_input_entry_activate ) , dialog ) ;
g_signal_connect ( dialog , " show " , G_CALLBACK ( on_input_dialog_show ) , entry ) ;
g_signal_connect ( dialog , " response " , G_CALLBACK ( on_input_dialog_response ) , entry ) ;
2007-12-21 13:09:09 +00:00
}
/* Create and display an input dialog.
* persistent : whether to remember previous entry text in a combo box ;
* in this case the dialog returned is not destroyed on a response ,
* and can be reshown .
* Returns : the dialog widget . */
2010-03-12 13:06:34 +00:00
static GtkWidget *
2010-11-18 16:15:10 +00:00
dialogs_show_input_full ( const gchar * title , GtkWindow * parent ,
const gchar * label_text , const gchar * default_text ,
2010-05-09 15:48:42 +00:00
gboolean persistent , GeanyInputCallback input_cb , GCallback insert_text_cb )
2007-12-21 13:09:09 +00:00
{
GtkWidget * dialog , * vbox ;
2010-11-18 16:15:10 +00:00
dialog = gtk_dialog_new_with_buttons ( title , parent ,
2007-12-21 13:09:09 +00:00
GTK_DIALOG_DESTROY_WITH_PARENT , GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
GTK_STOCK_OK , GTK_RESPONSE_ACCEPT , NULL ) ;
vbox = ui_dialog_vbox_new ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
gtk_box_set_spacing ( GTK_BOX ( vbox ) , 6 ) ;
2008-02-12 15:50:22 +00:00
g_object_set_data ( G_OBJECT ( dialog ) , " has_combo " , GINT_TO_POINTER ( persistent ) ) ;
2007-12-21 13:09:09 +00:00
g_object_set_data ( G_OBJECT ( dialog ) , " input_cb " , ( gpointer ) input_cb ) ;
2010-05-09 15:48:42 +00:00
add_input_widgets ( dialog , vbox , label_text , default_text , persistent , insert_text_cb ) ;
2007-12-21 13:09:09 +00:00
if ( persistent )
2010-03-12 13:06:34 +00:00
{
2010-03-12 14:54:18 +00:00
/* override default handler */
g_signal_connect ( dialog , " delete-event " , G_CALLBACK ( gtk_widget_hide_on_delete ) , NULL ) ;
2010-03-12 13:06:34 +00:00
gtk_widget_show_all ( dialog ) ;
return dialog ;
}
2005-11-22 12:26:26 +00:00
gtk_widget_show_all ( dialog ) ;
2010-03-12 13:06:34 +00:00
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
return NULL ;
}
/* Remember previous entry text in a combo box.
* Returns : the dialog widget . */
GtkWidget *
2010-11-18 16:15:10 +00:00
dialogs_show_input_persistent ( const gchar * title , GtkWindow * parent ,
const gchar * label_text , const gchar * default_text ,
2010-03-12 13:06:34 +00:00
GeanyInputCallback input_cb )
{
2010-11-18 16:15:10 +00:00
return dialogs_show_input_full ( title , parent , label_text , default_text , TRUE , input_cb , NULL ) ;
2010-03-12 13:06:34 +00:00
}
/* ugly hack - user_data not supported for callback */
2010-05-10 17:36:19 +00:00
static gchar * dialog_input = NULL ;
2010-03-12 13:06:34 +00:00
static void on_dialog_input ( const gchar * str )
{
dialog_input = g_strdup ( str ) ;
}
2010-11-18 18:27:01 +00:00
/** Asks the user for text input.
* @ param title Dialog title .
* @ param parent The currently focused window , usually @ c geany - > main_widgets - > window .
2010-11-18 18:53:12 +00:00
* @ c NULL can be used but is discouraged due to window manager effects .
* @ param label_text Label text , or @ c NULL .
* @ param default_text Text to display in the input field , or @ c NULL .
2010-11-18 18:27:01 +00:00
* @ return New copy of user input or @ c NULL if cancelled .
* @ since 0.20 . */
2010-11-18 16:15:10 +00:00
gchar * dialogs_show_input ( const gchar * title , GtkWindow * parent , const gchar * label_text ,
2010-03-12 13:06:34 +00:00
const gchar * default_text )
{
dialog_input = NULL ;
2010-11-18 16:15:10 +00:00
dialogs_show_input_full ( title , parent , label_text , default_text , FALSE , on_dialog_input , NULL ) ;
2010-11-18 17:51:15 +00:00
return dialog_input ;
2010-05-09 15:48:42 +00:00
}
2010-11-18 18:27:01 +00:00
/* Note: could be changed to dialogs_show_validated_input with argument for callback. */
2010-05-10 17:36:19 +00:00
/* Returns: newly allocated copy of the entry text or NULL on cancel.
2010-05-09 15:48:42 +00:00
* Specialised variant for Goto Line dialog . */
2010-11-18 16:15:10 +00:00
gchar * dialogs_show_input_goto_line ( const gchar * title , GtkWindow * parent , const gchar * label_text ,
2010-05-09 15:48:42 +00:00
const gchar * default_text )
{
dialog_input = NULL ;
dialogs_show_input_full (
2010-11-18 16:15:10 +00:00
title , parent , label_text , default_text , FALSE , on_dialog_input ,
2010-05-09 15:48:42 +00:00
G_CALLBACK ( ui_editable_insert_text_callback ) ) ;
2010-05-10 17:36:19 +00:00
return dialog_input ;
2005-11-22 12:26:26 +00:00
}
2009-01-21 22:49:47 +00:00
/**
2010-03-15 13:01:16 +00:00
* Shows an input box to enter a numerical value using a GtkSpinButton .
2009-07-21 22:12:13 +00:00
* If the dialog is aborted , @ a value remains untouched .
2009-01-21 22:49:47 +00:00
*
* @ param title The dialog title .
* @ param label_text The shown dialog label .
* @ param value The default value for the spin button and the return location of the entered value .
* Must be non - NULL .
2009-07-21 22:12:13 +00:00
* @ param min Minimum allowable value ( see documentation for @ c gtk_spin_button_new_with_range ( ) ) .
* @ param max Maximum allowable value ( see documentation for @ c gtk_spin_button_new_with_range ( ) ) .
2009-01-21 22:49:47 +00:00
* @ param step Increment added or subtracted by spinning the widget
2009-07-21 22:12:13 +00:00
* ( see documentation for @ c gtk_spin_button_new_with_range ( ) ) .
2009-01-21 22:49:47 +00:00
*
2009-07-21 22:12:13 +00:00
* @ return @ c TRUE if a value was entered and the dialog closed with ' OK ' . @ c FALSE otherwise .
2009-01-30 18:53:23 +00:00
*
* @ since 0.16
2009-01-21 22:49:47 +00:00
* */
2008-06-19 14:31:09 +00:00
gboolean dialogs_show_input_numeric ( const gchar * title , const gchar * label_text ,
gdouble * value , gdouble min , gdouble max , gdouble step )
{
GtkWidget * dialog , * label , * spin , * vbox ;
gboolean res = FALSE ;
2009-04-15 22:47:33 +00:00
g_return_val_if_fail ( title ! = NULL , FALSE ) ;
g_return_val_if_fail ( label_text ! = NULL , FALSE ) ;
g_return_val_if_fail ( value ! = NULL , FALSE ) ;
2009-01-21 22:49:47 +00:00
2008-06-19 14:31:09 +00:00
dialog = gtk_dialog_new_with_buttons ( title , GTK_WINDOW ( main_widgets . window ) ,
GTK_DIALOG_DESTROY_WITH_PARENT ,
GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
GTK_STOCK_OK , GTK_RESPONSE_ACCEPT , NULL ) ;
gtk_dialog_set_default_response ( GTK_DIALOG ( dialog ) , GTK_RESPONSE_CANCEL ) ;
vbox = ui_dialog_vbox_new ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
label = gtk_label_new ( label_text ) ;
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0 , 0.5 ) ;
spin = gtk_spin_button_new_with_range ( min , max , step ) ;
2009-09-21 16:46:16 +00:00
ui_entry_add_clear_icon ( GTK_ENTRY ( spin ) ) ;
2008-06-19 14:31:09 +00:00
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( spin ) , * value ) ;
g_signal_connect ( spin , " activate " , G_CALLBACK ( on_input_numeric_activate ) , dialog ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , label ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , spin ) ;
gtk_widget_show_all ( vbox ) ;
if ( gtk_dialog_run ( GTK_DIALOG ( dialog ) ) = = GTK_RESPONSE_ACCEPT )
{
* value = gtk_spin_button_get_value ( GTK_SPIN_BUTTON ( spin ) ) ;
res = TRUE ;
}
gtk_widget_destroy ( dialog ) ;
return res ;
}
2008-06-15 13:35:48 +00:00
void dialogs_show_file_properties ( GeanyDocument * doc )
2006-02-22 13:46:20 +00:00
{
2013-05-20 04:08:31 +02:00
GtkWidget * dialog , * label , * image , * check ;
2006-07-22 01:29:10 +00:00
gchar * file_size , * title , * base_name , * time_changed , * time_modified , * time_accessed , * enctext ;
2009-04-21 20:52:51 +00:00
gchar * short_name ;
2008-06-04 15:43:52 +00:00
# ifdef HAVE_SYS_TYPES_H
2006-02-22 13:46:20 +00:00
struct stat st ;
2006-02-25 22:26:43 +00:00
off_t filesize ;
2006-02-22 13:46:20 +00:00
mode_t mode ;
2006-04-27 18:06:35 +00:00
gchar * locale_filename ;
2006-02-22 13:46:20 +00:00
# else
gint filesize = 0 ;
gint mode = 0 ;
# endif
2008-02-27 13:17:29 +00:00
/* define this ones, to avoid later trouble */
2006-05-05 16:37:35 +00:00
# ifndef S_IRUSR
# define S_IRUSR 0
# define S_IWUSR 0
# define S_IXUSR 0
# endif
# ifndef S_IRGRP
# define S_IRGRP 0
# define S_IWGRP 0
# define S_IXGRP 0
# define S_IROTH 0
# define S_IWOTH 0
# define S_IXOTH 0
# endif
2014-01-18 15:12:22 +01:00
g_return_if_fail ( doc = = NULL | | doc - > is_valid ) ;
2009-04-15 22:47:33 +00:00
if ( doc = = NULL | | doc - > file_name = = NULL )
2006-04-27 18:06:35 +00:00
{
2006-10-25 14:38:48 +00:00
dialogs_show_msgbox ( GTK_MESSAGE_ERROR ,
_ ( " An error occurred or file information could not be retrieved (e.g. from a new file). " ) ) ;
2006-04-27 18:06:35 +00:00
return ;
}
2006-05-14 16:07:30 +00:00
2006-02-22 13:46:20 +00:00
2008-06-04 15:43:52 +00:00
# ifdef HAVE_SYS_TYPES_H
2008-06-15 13:35:48 +00:00
locale_filename = utils_get_locale_from_utf8 ( doc - > file_name ) ;
2007-04-16 15:58:34 +00:00
if ( g_stat ( locale_filename , & st ) = = 0 )
2006-02-22 13:46:20 +00:00
{
2008-02-27 13:17:29 +00:00
/* first copy the returned string and the trim it, to not modify the static glibc string
* g_strchomp ( ) is used to remove trailing EOL chars , which are there for whatever reason */
2006-04-27 18:06:35 +00:00
time_changed = g_strchomp ( g_strdup ( ctime ( & st . st_ctime ) ) ) ;
time_modified = g_strchomp ( g_strdup ( ctime ( & st . st_mtime ) ) ) ;
time_accessed = g_strchomp ( g_strdup ( ctime ( & st . st_atime ) ) ) ;
2006-02-22 13:46:20 +00:00
filesize = st . st_size ;
mode = st . st_mode ;
}
2006-02-25 22:26:43 +00:00
else
2006-02-22 13:46:20 +00:00
{
time_changed = g_strdup ( _ ( " unknown " ) ) ;
time_modified = g_strdup ( _ ( " unknown " ) ) ;
time_accessed = g_strdup ( _ ( " unknown " ) ) ;
2006-02-25 22:26:43 +00:00
filesize = ( off_t ) 0 ;
mode = ( mode_t ) 0 ;
2006-02-22 13:46:20 +00:00
}
g_free ( locale_filename ) ;
# else
time_changed = g_strdup ( _ ( " unknown " ) ) ;
time_modified = g_strdup ( _ ( " unknown " ) ) ;
time_accessed = g_strdup ( _ ( " unknown " ) ) ;
# endif
2008-06-15 13:35:48 +00:00
base_name = g_path_get_basename ( doc - > file_name ) ;
2009-04-21 20:52:51 +00:00
short_name = utils_str_middle_truncate ( base_name , 30 ) ;
2013-05-20 01:47:25 +02:00
title = g_strdup_printf ( _ ( " %s Properties " ) , short_name ) ;
2013-05-20 04:08:31 +02:00
dialog = ui_builder_get_object ( " properties_dialog " ) ;
gtk_window_set_title ( GTK_WINDOW ( dialog ) , title ) ;
2009-04-21 20:52:51 +00:00
g_free ( short_name ) ;
2006-02-22 13:46:20 +00:00
g_free ( title ) ;
2007-05-15 15:16:16 +00:00
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_name_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , base_name ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
image = ui_lookup_widget ( dialog , " file_type_image " ) ;
2013-10-15 15:56:44 +02:00
gtk_image_set_from_gicon ( GTK_IMAGE ( image ) , doc - > file_type - > icon ,
GTK_ICON_SIZE_BUTTON ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_type_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , doc - > file_type - > title ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_size_label " ) ;
2006-02-22 13:46:20 +00:00
file_size = utils_make_human_readable_str ( filesize , 1 , 0 ) ;
2013-05-20 04:08:31 +02:00
gtk_label_set_text ( GTK_LABEL ( label ) , file_size ) ;
2006-02-22 13:46:20 +00:00
g_free ( file_size ) ;
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_location_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , doc - > file_name ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_read_only_check " ) ;
2008-06-15 13:35:48 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , doc - > readonly ) ;
2006-04-27 18:06:35 +00:00
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_encoding_label " ) ;
2006-07-22 01:29:10 +00:00
enctext = g_strdup_printf ( " %s %s " ,
2008-06-15 13:35:48 +00:00
doc - > encoding ,
( encodings_is_unicode_charset ( doc - > encoding ) ) ?
( ( doc - > has_bom ) ? _ ( " (with BOM) " ) : _ ( " (without BOM) " ) ) : " " ) ;
2013-05-20 04:08:31 +02:00
gtk_label_set_text ( GTK_LABEL ( label ) , enctext ) ;
2006-07-22 01:29:10 +00:00
g_free ( enctext ) ;
2013-05-20 04:08:31 +02:00
label = ui_lookup_widget ( dialog , " file_modified_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , time_modified ) ;
label = ui_lookup_widget ( dialog , " file_changed_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , time_changed ) ;
label = ui_lookup_widget ( dialog , " file_accessed_label " ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , time_accessed ) ;
2006-02-22 13:46:20 +00:00
2013-05-20 04:08:31 +02:00
/* permissions */
check = ui_lookup_widget ( dialog , " file_perm_owner_r_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IRUSR ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_owner_w_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IWUSR ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_owner_x_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IXUSR ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_group_r_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IRGRP ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_group_w_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IWGRP ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_group_x_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IXGRP ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_other_r_check " ) ;
2006-02-25 22:26:43 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IROTH ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_other_w_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IWOTH ) ;
2013-05-20 04:08:31 +02:00
check = ui_lookup_widget ( dialog , " file_perm_other_x_check " ) ;
2006-02-22 13:46:20 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , mode & S_IXOTH ) ;
g_free ( base_name ) ;
g_free ( time_changed ) ;
g_free ( time_modified ) ;
g_free ( time_accessed ) ;
2013-05-20 04:08:31 +02:00
gtk_widget_show ( dialog ) ;
2006-02-22 13:46:20 +00:00
}
2006-04-27 18:06:35 +00:00
2009-09-14 17:10:22 +00:00
/* extra_text can be NULL; otherwise it is displayed below main_text.
* if parent is NULL , main_widgets . window will be used
2009-12-20 15:37:40 +00:00
* btn_1 , btn_2 , btn_3 can be NULL .
* returns response_1 , response_2 or response_3 */
2009-09-14 17:10:22 +00:00
static gint show_prompt ( GtkWidget * parent ,
2009-12-20 15:37:40 +00:00
const gchar * btn_1 , GtkResponseType response_1 ,
const gchar * btn_2 , GtkResponseType response_2 ,
const gchar * btn_3 , GtkResponseType response_3 ,
2009-09-14 17:10:22 +00:00
const gchar * question_text , const gchar * extra_text )
2006-04-27 18:06:35 +00:00
{
gboolean ret = FALSE ;
2006-08-18 17:22:57 +00:00
GtkWidget * dialog ;
2009-09-14 17:10:22 +00:00
GtkWidget * btn ;
2009-12-20 15:37:40 +00:00
if ( btn_2 = = NULL )
{
btn_2 = GTK_STOCK_NO ;
response_2 = GTK_RESPONSE_NO ;
}
if ( btn_3 = = NULL )
{
btn_3 = GTK_STOCK_YES ;
response_3 = GTK_RESPONSE_YES ;
}
2006-08-18 17:22:57 +00:00
2009-09-14 17:10:22 +00:00
# ifdef G_OS_WIN32
/* our native dialog code doesn't support custom buttons */
2013-08-11 10:54:19 +01:00
if ( utils_str_equal ( btn_3 , GTK_STOCK_YES ) & &
utils_str_equal ( btn_2 , GTK_STOCK_NO ) & & btn_1 = = NULL )
2009-09-14 17:10:22 +00:00
{
gchar * string = ( extra_text = = NULL ) ? g_strdup ( question_text ) :
g_strconcat ( question_text , " \n \n " , extra_text , NULL ) ;
ret = win32_message_dialog ( parent , GTK_MESSAGE_QUESTION , string ) ;
2009-12-20 15:37:40 +00:00
ret = ret ? response_3 : response_2 ;
2009-09-14 17:10:22 +00:00
g_free ( string ) ;
return ret ;
}
# endif
2009-07-19 20:19:09 +00:00
if ( parent = = NULL & & main_status . main_window_realized )
2008-05-22 14:41:28 +00:00
parent = main_widgets . window ;
2007-07-04 17:08:53 +00:00
dialog = gtk_message_dialog_new ( GTK_WINDOW ( parent ) ,
2006-08-18 17:22:57 +00:00
GTK_DIALOG_DESTROY_WITH_PARENT , GTK_MESSAGE_QUESTION ,
GTK_BUTTONS_NONE , " %s " , question_text ) ;
2007-05-15 15:16:16 +00:00
gtk_widget_set_name ( dialog , " GeanyDialog " ) ;
2009-07-19 20:19:09 +00:00
gtk_window_set_title ( GTK_WINDOW ( dialog ) , _ ( " Question " ) ) ;
2012-10-15 15:23:30 +02:00
gtk_window_set_icon_name ( GTK_WINDOW ( dialog ) , " geany " ) ;
2009-07-19 20:19:09 +00:00
2008-02-27 13:17:29 +00:00
/* question_text will be in bold if optional extra_text used */
2006-08-18 17:22:57 +00:00
if ( extra_text ! = NULL )
gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG ( dialog ) ,
" %s " , extra_text ) ;
2009-12-20 15:37:40 +00:00
if ( btn_1 ! = NULL )
gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , btn_1 , response_1 ) ;
2009-09-14 17:10:22 +00:00
2008-02-27 13:17:29 +00:00
/* For a cancel button, use cancel response so user can press escape to cancel */
2009-12-20 15:37:40 +00:00
btn = gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , btn_2 ,
utils_str_equal ( btn_2 , GTK_STOCK_CANCEL ) ? GTK_RESPONSE_CANCEL : response_2 ) ;
2009-09-14 17:10:22 +00:00
/* we don't want a default, but we need to override the apply button as default */
gtk_widget_grab_default ( btn ) ;
2009-12-20 15:37:40 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( dialog ) , btn_3 , response_3 ) ;
2006-08-18 17:22:57 +00:00
2009-09-14 17:10:22 +00:00
ret = gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
2006-04-27 18:06:35 +00:00
gtk_widget_destroy ( dialog ) ;
2009-09-14 17:10:22 +00:00
if ( ret = = GTK_RESPONSE_CANCEL )
2009-12-20 15:37:40 +00:00
ret = response_2 ;
2006-08-18 17:22:57 +00:00
return ret ;
}
2008-02-17 18:00:42 +00:00
/**
2010-03-15 13:01:16 +00:00
* Shows a question message box with @ a text and Yes / No buttons .
2008-02-17 18:00:42 +00:00
* On Unix - like systems a GTK message dialog box is shown , on Win32 systems a native Windows
* message dialog box is shown .
*
* @ param text Printf ( ) - style format string .
2009-07-21 22:12:13 +00:00
* @ param . . . Arguments for the @ a text format string .
2008-02-17 18:00:42 +00:00
*
2009-07-21 22:12:13 +00:00
* @ return @ c TRUE if the user answered with Yes , otherwise @ c FALSE .
2008-02-17 18:00:42 +00:00
* */
2006-08-18 17:22:57 +00:00
gboolean dialogs_show_question ( const gchar * text , . . . )
{
2010-04-25 17:42:01 +00:00
gchar * string ;
2006-08-18 17:22:57 +00:00
va_list args ;
2009-07-19 20:19:09 +00:00
GtkWidget * parent = ( main_status . main_window_realized ) ? main_widgets . window : NULL ;
2010-04-25 17:42:01 +00:00
gint result ;
2006-08-18 17:22:57 +00:00
va_start ( args , text ) ;
2010-04-25 17:42:01 +00:00
string = g_strdup_vprintf ( text , args ) ;
2006-08-18 17:22:57 +00:00
va_end ( args ) ;
2010-04-25 17:42:01 +00:00
result = show_prompt ( parent ,
2009-12-20 15:37:40 +00:00
NULL , GTK_RESPONSE_NONE ,
GTK_STOCK_NO , GTK_RESPONSE_NO ,
GTK_STOCK_YES , GTK_RESPONSE_YES ,
2010-04-25 17:42:01 +00:00
string , NULL ) ;
g_free ( string ) ;
return ( result = = GTK_RESPONSE_YES ) ;
2006-08-18 17:22:57 +00:00
}
2007-07-04 17:08:53 +00:00
/* extra_text can be NULL; otherwise it is displayed below main_text.
2009-07-20 16:12:23 +00:00
* if parent is NULL , main_widgets . window will be used
* yes_btn , no_btn can be NULL . */
2007-07-04 17:08:53 +00:00
gboolean dialogs_show_question_full ( GtkWidget * parent , const gchar * yes_btn , const gchar * no_btn ,
2006-08-18 17:22:57 +00:00
const gchar * extra_text , const gchar * main_text , . . . )
{
2010-04-25 17:42:01 +00:00
gint result ;
gchar * string ;
2006-08-18 17:22:57 +00:00
va_list args ;
2006-05-14 16:07:30 +00:00
2009-09-14 17:10:22 +00:00
va_start ( args , main_text ) ;
2010-04-25 17:42:01 +00:00
string = g_strdup_vprintf ( main_text , args ) ;
2009-09-14 17:10:22 +00:00
va_end ( args ) ;
2010-04-25 17:42:01 +00:00
result = show_prompt ( parent ,
2009-12-20 15:37:40 +00:00
NULL , GTK_RESPONSE_NONE ,
no_btn , GTK_RESPONSE_NO ,
yes_btn , GTK_RESPONSE_YES ,
2010-04-25 17:42:01 +00:00
string , extra_text ) ;
g_free ( string ) ;
return ( result = = GTK_RESPONSE_YES ) ;
2009-09-14 17:10:22 +00:00
}
/* extra_text can be NULL; otherwise it is displayed below main_text.
* if parent is NULL , main_widgets . window will be used
2009-12-20 15:37:40 +00:00
* btn_1 , btn_2 , btn_3 can be NULL .
* returns response_1 , response_2 or response_3 */
2009-09-14 17:10:22 +00:00
gint dialogs_show_prompt ( GtkWidget * parent ,
2009-12-20 15:37:40 +00:00
const gchar * btn_1 , GtkResponseType response_1 ,
const gchar * btn_2 , GtkResponseType response_2 ,
const gchar * btn_3 , GtkResponseType response_3 ,
2009-09-14 17:10:22 +00:00
const gchar * extra_text , const gchar * main_text , . . . )
{
2010-04-25 17:42:01 +00:00
gchar * string ;
2009-09-14 17:10:22 +00:00
va_list args ;
2010-04-25 17:42:01 +00:00
gint result ;
2009-07-20 16:12:23 +00:00
2006-08-18 17:22:57 +00:00
va_start ( args , main_text ) ;
2010-04-25 17:42:01 +00:00
string = g_strdup_vprintf ( main_text , args ) ;
2006-08-18 17:22:57 +00:00
va_end ( args ) ;
2010-04-25 17:42:01 +00:00
result = show_prompt ( parent , btn_1 , response_1 , btn_2 , response_2 , btn_3 , response_3 ,
2009-12-20 15:37:40 +00:00
string , extra_text ) ;
2010-04-25 17:42:01 +00:00
g_free ( string ) ;
return result ;
2006-04-27 18:06:35 +00:00
}