summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tvb@src.gnome.org>2006-10-29 17:17:58 +0000
committerTristan Van Berkom <tvb@src.gnome.org>2006-10-29 17:17:58 +0000
commit8d0cbc8e70b9aa146146a95db726edfb66792928 (patch)
treea74b3c6d0b7d5e1c1ba6f3b5a353de7f6a77590e
parent5434edf16321e008e7c95d26e13ba84875c81dcf (diff)
downloadglade-8d0cbc8e70b9aa146146a95db726edfb66792928.tar.gz
- Use the new GtkRecent API, and make it screen aware. - Added the notion
* src/glade-project-window.c: - Use the new GtkRecent API, and make it screen aware. - Added the notion of a 'default_path' for file open/save operations. Replaces the previous recent-file based implementation. - Hide statusbar grip when window is in maximised state. - Set a reasonable default size for props editor and tree. * src/glade-popup.c: Removed the "Properties" context action as it doesn't really make sense in the single-window ui. * widgets/gtk+.xml.in: Added some displayable values for the GtkWindow::type-hint property.
-rw-r--r--src/glade-popup.c9
-rw-r--r--src/glade-project-window.c271
-rw-r--r--src/glade-project-window.h2
-rw-r--r--widgets/gtk+.xml.in6
4 files changed, 267 insertions, 21 deletions
diff --git a/src/glade-popup.c b/src/glade-popup.c
index fc7ce332..b8154405 100644
--- a/src/glade-popup.c
+++ b/src/glade-popup.c
@@ -138,13 +138,6 @@ glade_popup_clipboard_delete_cb (GtkMenuItem *item, GladeWidget *widget)
glade_app_command_delete_clipboard ();
}
-static void
-glade_popup_properties_cb (GtkMenuItem *item, GladeWidget *widget)
-{
- glade_popup_select_cb (item, widget);
- glade_app_show_properties (TRUE);
-}
-
/********************************************************
POPUP BUILDING
*******************************************************/
@@ -227,8 +220,6 @@ glade_popup_create_menu (GladeWidget *widget, gboolean add_childs)
glade_popup_append_item (popup_menu, GTK_STOCK_DELETE, NULL, TRUE,
glade_popup_delete_cb, widget);
- glade_popup_append_item (popup_menu, GTK_STOCK_PROPERTIES, NULL, TRUE,
- glade_popup_properties_cb, widget);
if (add_childs &&
!g_type_is_a (widget->adaptor->type, GTK_TYPE_WINDOW)) {
diff --git a/src/glade-project-window.c b/src/glade-project-window.c
index a59e2ea4..6cf76034 100644
--- a/src/glade-project-window.c
+++ b/src/glade-project-window.c
@@ -66,7 +66,11 @@ struct _GladeProjectWindowPrivate
GtkActionGroup *projects_list_menu_actions;/* Projects list menu actions */
GtkLabel *label; /* the title of property editor dock */
-
+
+ GtkRecentManager *recent_manager;
+ GtkWidget *recent_menu;
+
+ gchar *default_path; /* the default path for open/save operations */
};
const gint GLADE_WIDGET_TREE_WIDTH = 230;
@@ -77,6 +81,7 @@ static gpointer parent_class = NULL;
static void gpw_refresh_undo_redo (GladeProjectWindow *gpw);
+static void gpw_recent_chooser_item_activated_cb (GtkRecentChooser *chooser, GladeProjectWindow *gpw);
G_DEFINE_TYPE(GladeProjectWindow, glade_project_window, GLADE_TYPE_APP)
@@ -109,6 +114,81 @@ gpw_refresh_title (GladeProjectWindow *gpw)
g_free (title);
}
+static const gchar*
+gpw_get_default_path (GladeProjectWindow *gpw)
+{
+ return gpw->priv->default_path;
+}
+
+static void
+update_default_path (GladeProjectWindow *gpw, GladeProject *project)
+{
+ gchar *path;
+
+ g_return_if_fail (project->path != NULL);
+
+ path = g_path_get_dirname (project->path);
+
+ g_free (gpw->priv->default_path);
+ gpw->priv->default_path = g_strdup (path);
+
+ g_free (path);
+}
+
+static gboolean
+gpw_window_state_event_cb (GtkWidget *widget,
+ GdkEventWindowState *event,
+ GladeProjectWindow *gpw)
+{
+ if (event->changed_mask &
+ (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN))
+ {
+ gboolean show;
+
+ show = !(event->new_window_state &
+ (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN));
+
+ gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (gpw->priv->statusbar), show);
+ }
+
+ return FALSE;
+}
+
+static void
+gpw_window_screen_changed_cb (GtkWidget *widget,
+ GdkScreen *old_screen,
+ GladeProjectWindow *gpw)
+{
+ GtkWidget *menu_item;
+ GtkRecentFilter *filter;
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (widget);
+
+ gpw->priv->recent_manager = gtk_recent_manager_get_for_screen (screen);
+
+ gtk_menu_detach (GTK_MENU (gpw->priv->recent_menu));
+ g_object_unref (G_OBJECT (gpw->priv->recent_menu));
+
+ gpw->priv->recent_menu = gtk_recent_chooser_menu_new_for_manager (gpw->priv->recent_manager);
+
+ gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), TRUE);
+ gtk_recent_chooser_set_show_icons (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), FALSE);
+ gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), GTK_RECENT_SORT_MRU);
+
+ filter = gtk_recent_filter_new ();
+ gtk_recent_filter_add_application (filter, g_get_application_name());
+ gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), filter);
+
+ g_signal_connect (gpw->priv->recent_menu,
+ "item-activated",
+ G_CALLBACK (gpw_recent_chooser_item_activated_cb),
+ gpw);
+
+ menu_item = gtk_ui_manager_get_widget (gpw->priv->ui, "/MenuBar/FileMenu/OpenRecent");
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), gpw->priv->recent_menu);
+}
+
static void
project_selection_changed_cb (GladeProject *project, GladeProjectWindow *gpw)
{
@@ -446,16 +526,85 @@ gpw_refresh_projects_list_menu (GladeProjectWindow *window)
p->projects_list_menu_ui_id = id;
}
+
+void
+gpw_recent_add (GladeProjectWindow *gpw, const gchar *path)
+{
+ GtkRecentData *recent_data;
+ gchar *uri;
+ GError *error = NULL;
+
+ uri = g_filename_to_uri (path, NULL, &error);
+ if (error)
+ {
+ g_warning ("Could not convert uri \"%s\" to a local path: %s", uri, error->message);
+ g_error_free (error);
+ return;
+ }
+
+ recent_data = g_slice_new (GtkRecentData);
+
+ recent_data->display_name = NULL;
+ recent_data->description = NULL;
+ recent_data->mime_type = "application/x-glade";
+ recent_data->app_name = (gchar *) g_get_application_name ();
+ recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL);
+ recent_data->groups = NULL;
+ recent_data->is_private = FALSE;
+
+ if (!gtk_recent_manager_add_full (gpw->priv->recent_manager,
+ uri,
+ recent_data))
+ {
+ g_warning ("Unable to add '%s' to the list of recently used documents", uri);
+ }
+
+ g_free (uri);
+ g_free (recent_data->app_exec);
+ g_slice_free (GtkRecentData, recent_data);
+
+}
+
+void
+gpw_recent_remove (GladeProjectWindow *gpw, const gchar *path)
+{
+ gchar *uri;
+ GError *error = NULL;
+
+ uri = g_filename_to_uri (path, NULL, &error);
+ if (error)
+ {
+ g_warning ("Could not convert uri \"%s\" to a local path: %s", uri, error->message);
+ g_error_free (error);
+ return;
+ }
+
+ gtk_recent_manager_remove_item (gpw->priv->recent_manager, uri, &error);
+ if (error)
+ {
+ g_warning ("Could not remove recent-files uri \"%s\": %s", uri, error->message);
+ }
+
+ g_free (uri);
+}
+
static void
gpw_open_cb (GtkAction *action, GladeProjectWindow *gpw)
{
- GtkWidget *filechooser;
- gchar *path = NULL;
+ GtkWidget *filechooser;
+ gchar *path = NULL, *default_path;
filechooser = glade_util_file_dialog_new (_("Open\342\200\246"), GTK_WINDOW (gpw->priv->window),
GLADE_FILE_DIALOG_ACTION_OPEN);
+ default_path = g_strdup (gpw_get_default_path (gpw));
+ if (default_path != NULL)
+ {
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser), default_path);
+ g_free (default_path);
+ }
+
if (gtk_dialog_run (GTK_DIALOG(filechooser)) == GTK_RESPONSE_OK)
path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
@@ -494,6 +643,9 @@ gpw_save (GladeProjectWindow *gpw, GladeProject *project, const gchar *path)
/* Get display_name here, it could have changed with "Save As..." */
display_name = glade_project_display_name (project, FALSE, FALSE, FALSE);
+ gpw_recent_add (gpw, project->path);
+ update_default_path (gpw, project);
+
/* refresh names */
gpw_refresh_title (gpw);
gpw_refresh_projects_list_item (gpw, project);
@@ -528,9 +680,20 @@ gpw_save_as (GladeProjectWindow *gpw)
GLADE_FILE_DIALOG_ACTION_SAVE);
if (project->path)
+ {
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), project->path);
+ }
else
+ {
+ gchar *default_path = g_strdup (gpw_get_default_path (gpw));
+ if (default_path != NULL)
+ {
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser), default_path);
+ g_free (default_path);
+ }
+
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), project->name);
+ }
if (gtk_dialog_run (GTK_DIALOG(filechooser)) == GTK_RESPONSE_OK)
path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
@@ -663,11 +826,19 @@ gpw_confirm_close_project (GladeProjectWindow *gpw, GladeProject *project)
{
GtkWidget *filechooser;
gchar *path = NULL;
+ gchar *default_path;
filechooser =
glade_util_file_dialog_new (_("Save\342\200\246"),
GTK_WINDOW (gpw->priv->window),
GLADE_FILE_DIALOG_ACTION_SAVE);
+
+ default_path = g_strdup (gpw_get_default_path (gpw));
+ if (default_path != NULL)
+ {
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser), default_path);
+ g_free (default_path);
+ }
gtk_file_chooser_set_current_name
(GTK_FILE_CHOOSER (filechooser), project->name);
@@ -993,6 +1164,31 @@ gpw_notebook_tab_removed_cb (GtkNotebook *notebook,
}
static void
+gpw_recent_chooser_item_activated_cb (GtkRecentChooser *chooser, GladeProjectWindow *gpw)
+{
+ gchar *uri, *path;
+ GError *error = NULL;
+
+ uri = gtk_recent_chooser_get_current_uri (chooser);
+
+ path = g_filename_from_uri (uri, NULL, NULL);
+ if (error)
+ {
+ g_warning ("Could not convert uri \"%s\" to a local path: %s", uri, error->message);
+ g_error_free (error);
+ return;
+ }
+
+ if (!glade_project_window_open_project (gpw, path))
+ {
+ gpw_recent_remove (gpw, path);
+ }
+
+ g_free (uri);
+ g_free (path);
+}
+
+static void
gpw_palette_appearance_change_cb (GtkRadioAction *action,
GtkRadioAction *current,
GladeProjectWindow *gpw)
@@ -1121,6 +1317,7 @@ static const gchar *ui_info =
" <menu action='FileMenu'>\n"
" <menuitem action='New'/>\n"
" <menuitem action='Open'/>\n"
+" <menuitem action='OpenRecent'/>\n"
" <separator/>\n"
" <menuitem action='Save'/>\n"
" <menuitem action='SaveAs'/>\n"
@@ -1188,6 +1385,8 @@ static GtkActionEntry static_entries[] = {
{ "Open", GTK_STOCK_OPEN, N_("_Open"),"<control>O",
N_("Open a project"), G_CALLBACK (gpw_open_cb) },
+
+ { "OpenRecent", NULL, N_("Open _Recent") },
{ "Quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q",
N_("Quit the program"), G_CALLBACK (gpw_quit_cb) },
@@ -1440,7 +1639,9 @@ gpw_drag_data_received (GtkWidget *widget,
gchar *path = g_filename_from_uri (*str, NULL, &error);
if (path)
+ {
glade_project_window_open_project (window, path);
+ }
else
{
g_warning ("Could not convert uri to local path: %s", error->message);
@@ -1477,10 +1678,13 @@ glade_project_window_create (GladeProjectWindow *gpw)
GtkWidget *palette;
GtkWidget *editor;
GtkWidget *dockitem;
+ GtkWidget *widget;
+ GtkRecentFilter *filter;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gpw->priv->window = window;
gtk_window_maximize (GTK_WINDOW (window));
+ gtk_window_set_default_size (GTK_WINDOW (window), 720, 540);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
@@ -1500,14 +1704,17 @@ glade_project_window_create (GladeProjectWindow *gpw)
hpaned1 = gtk_hpaned_new ();
hpaned2 = gtk_hpaned_new ();
vpaned = gtk_vpaned_new ();
-
- /* minimum size for far-right pane */
- gtk_widget_set_size_request (vpaned, 310, -1);
gtk_box_pack_start (GTK_BOX (vbox), hpaned1, TRUE, TRUE, 0);
gtk_paned_pack1 (GTK_PANED (hpaned1), hpaned2, TRUE, FALSE);
gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned, FALSE, FALSE);
+ /* divider position between design area and editor/tree */
+ gtk_paned_set_position (GTK_PANED (hpaned1), 370);
+ /* divider position between tree and editor */
+ gtk_paned_set_position (GTK_PANED (vpaned), 135);
+
+
gtk_widget_show_all (hpaned1);
gtk_widget_show_all (hpaned2);
gtk_widget_show_all (vpaned);
@@ -1559,6 +1766,28 @@ glade_project_window_create (GladeProjectWindow *gpw)
gtk_widget_set_sensitive (editor_item, FALSE);
gtk_widget_set_sensitive (docs_item, FALSE);
+ /* recent files */
+ gpw->priv->recent_manager = gtk_recent_manager_get_for_screen (gtk_widget_get_screen (gpw->priv->window));
+
+ gpw->priv->recent_menu = gtk_recent_chooser_menu_new_for_manager (gpw->priv->recent_manager);
+
+ gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), TRUE);
+ gtk_recent_chooser_set_show_icons (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), FALSE);
+ gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), GTK_RECENT_SORT_MRU);
+
+ filter = gtk_recent_filter_new ();
+ gtk_recent_filter_add_application (filter, g_get_application_name());
+ gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (gpw->priv->recent_menu), filter);
+
+ g_signal_connect (gpw->priv->recent_menu,
+ "item-activated",
+ G_CALLBACK (gpw_recent_chooser_item_activated_cb),
+ gpw);
+
+ widget = gtk_ui_manager_get_widget (gpw->priv->ui, "/MenuBar/FileMenu/OpenRecent");
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (widget), gpw->priv->recent_menu);
+
+
/* support for opening a file by dragging onto the project window */
gtk_drag_dest_set (GTK_WIDGET (window),
GTK_DEST_DEFAULT_ALL,
@@ -1571,7 +1800,7 @@ glade_project_window_create (GladeProjectWindow *gpw)
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (gpw_delete_event), gpw);
- /* Connect signals notebook */
+ /* connect signals notebook */
g_signal_connect (gpw->priv->notebook,
"switch-page",
G_CALLBACK (gpw_notebook_switch_page_cb),
@@ -1584,6 +1813,16 @@ glade_project_window_create (GladeProjectWindow *gpw)
"page-removed",
G_CALLBACK (gpw_notebook_tab_removed_cb),
gpw);
+
+
+ /* GtkWindow events */
+ g_signal_connect (gpw->priv->window, "screen-changed",
+ G_CALLBACK (gpw_window_screen_changed_cb),
+ gpw);
+
+ g_signal_connect (gpw->priv->window, "window-state-event",
+ G_CALLBACK (gpw_window_state_event_cb),
+ gpw);
}
static void
@@ -1619,12 +1858,12 @@ glade_project_window_new_project (GladeProjectWindow *gpw)
glade_project_window_add_project (gpw, project);
}
-void
+gboolean
glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path)
{
GladeProject *project;
- g_return_if_fail (path != NULL);
+ g_return_val_if_fail (path != NULL, FALSE);
/* dont allow more than one project with the same name to be
* opened simultainiously.
@@ -1633,15 +1872,22 @@ glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path)
{
glade_util_ui_message (gpw->priv->window, GLADE_UI_WARN,
_("%s is already open"), path);
- return;
+ return TRUE; /* let this pass */
}
if ((project = glade_project_open (path)) == NULL)
- return;
+ return FALSE;
glade_project_window_add_project (gpw, project);
+
+ gpw_recent_add (gpw, project->path);
+ update_default_path (gpw, project);
+
+ return TRUE;
}
+
+
static void
glade_project_window_change_menu_label (GladeProjectWindow *gpw,
const gchar *path,
@@ -1728,6 +1974,8 @@ glade_project_window_show_all (GladeProjectWindow *gpw)
static void
glade_project_window_finalize (GObject *object)
{
+ g_free (GLADE_PROJECT_WINDOW (object)->priv->default_path);
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -1755,6 +2003,7 @@ glade_project_window_init (GladeProjectWindow *gpw)
gpw->priv = GLADE_PROJECT_WINDOW_GET_PRIVATE (gpw);
gpw->priv->label = NULL;
+ gpw->priv->default_path = NULL;
}
diff --git a/src/glade-project-window.h b/src/glade-project-window.h
index f0e6350e..fa353545 100644
--- a/src/glade-project-window.h
+++ b/src/glade-project-window.h
@@ -38,7 +38,7 @@ GType glade_project_window_get_type (void);
GladeProjectWindow * glade_project_window_new (void);
void glade_project_window_show_all (GladeProjectWindow *gpw);
void glade_project_window_new_project (GladeProjectWindow *gpw);
-void glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path);
+gboolean glade_project_window_open_project (GladeProjectWindow *gpw, const gchar *path);
void glade_project_window_check_devhelp (GladeProjectWindow *gpw);
G_END_DECLS
diff --git a/widgets/gtk+.xml.in b/widgets/gtk+.xml.in
index 2387b8e2..bb85eff6 100644
--- a/widgets/gtk+.xml.in
+++ b/widgets/gtk+.xml.in
@@ -159,6 +159,12 @@
<value id="GDK_WINDOW_TYPE_HINT_UTILITY" _name="Utility"/>
<value id="GDK_WINDOW_TYPE_HINT_DOCK" _name="Dock"/>
<value id="GDK_WINDOW_TYPE_HINT_DESKTOP" _name="Desktop"/>
+ <value id="GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU" _name="Drop Down Menu"/>
+ <value id="GDK_WINDOW_TYPE_HINT_POPUP_MENU" _name="Popup Menu"/>
+ <value id="GDK_WINDOW_TYPE_HINT_TOOLTIP" _name="Tooltip"/>
+ <value id="GDK_WINDOW_TYPE_HINT_NOTIFICATION" _name="Notification"/>
+ <value id="GDK_WINDOW_TYPE_HINT_COMBO" _name="Combo"/>
+ <value id="GDK_WINDOW_TYPE_HINT_DND" _name="Drag and Drop"/>
</displayable-values>
</property>
<property id="type" ignore="True">