Continuing rewrite...

master
Yevgen Muntyan 2005-09-03 16:07:59 +00:00
parent a0a60e0a94
commit 12218dce6f
2 changed files with 204 additions and 19 deletions

View File

@ -73,6 +73,10 @@ static MooEditLoader*get_loader (MooEditor *editor,
static MooEditSaver *get_saver (MooEditor *editor,
MooEdit *doc);
static void open_recent (MooEditor *editor,
MooEditFileInfo *info,
MooEditWindow *window);
struct _MooEditorPrivate {
GSList *windows; /* WindowInfo* */
@ -88,12 +92,22 @@ struct _MooEditorPrivate {
};
static void moo_editor_finalize (GObject *object);
static void moo_editor_finalize (GObject *object);
static void moo_editor_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void moo_editor_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void open_recent (MooEditor *editor,
MooEditFileInfo *info,
MooEditWindow *window);
enum {
PROP_0,
PROP_OPEN_SINGLE,
PROP_ALLOW_EMPTY_WINDOW
};
enum {
ALL_WINDOWS_CLOSED,
@ -113,6 +127,24 @@ static void moo_editor_class_init (MooEditorClass *klass)
GObjectClass *edit_window_class;
gobject_class->finalize = moo_editor_finalize;
gobject_class->set_property = moo_editor_set_property;
gobject_class->get_property = moo_editor_get_property;
g_object_class_install_property (gobject_class,
PROP_OPEN_SINGLE,
g_param_spec_boolean ("open-single",
"open-single",
"open-single",
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (gobject_class,
PROP_ALLOW_EMPTY_WINDOW,
g_param_spec_boolean ("allow-empty-window",
"allow-empty-window",
"allow-empty-window",
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
signals[ALL_WINDOWS_CLOSED] =
moo_signal_new_cb ("all-windows-closed",
@ -142,7 +174,6 @@ static void moo_editor_init (MooEditor *editor)
g_signal_connect_swapped (editor->priv->recent_mgr, "open-recent",
G_CALLBACK (open_recent), editor);
editor->priv->windows = NULL;
editor->priv->open_single = TRUE;
editor->priv->loaders =
g_hash_table_new_full (g_direct_hash, g_direct_equal,
@ -153,6 +184,54 @@ static void moo_editor_init (MooEditor *editor)
}
static void moo_editor_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MooEditor *editor = MOO_EDITOR (object);
switch (prop_id) {
case PROP_OPEN_SINGLE:
editor->priv->open_single = g_value_get_boolean (value);
g_object_notify (object, "open_single");
break;
case PROP_ALLOW_EMPTY_WINDOW:
editor->priv->allow_empty_window = g_value_get_boolean (value);
g_object_notify (object, "allow_empty_window");
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void moo_editor_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MooEditor *editor = MOO_EDITOR (object);
switch (prop_id) {
case PROP_OPEN_SINGLE:
g_value_set_boolean (value, editor->priv->open_single);
break;
case PROP_ALLOW_EMPTY_WINDOW:
g_value_set_boolean (value, editor->priv->allow_empty_window);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void moo_editor_finalize (GObject *object)
{
MooEditor *editor = MOO_EDITOR (object);
@ -168,8 +247,11 @@ static void moo_editor_finalize (GObject *object)
if (editor->priv->recent_mgr)
g_object_unref (editor->priv->recent_mgr);
/* XXX it must be empty here */
window_list_free (editor);
if (editor->priv->windows)
{
g_critical ("finalizing editor while some windows are open");
window_list_free (editor);
}
g_hash_table_destroy (editor->priv->loaders);
g_hash_table_destroy (editor->priv->savers);
@ -542,9 +624,9 @@ void moo_editor_open (MooEditor *editor,
GSList *files)
{
GSList *l;
MooEdit *doc;
MooEditLoader *loader;
MooEditSaver *saver;
MooEdit *bring_to_front = NULL;
g_return_if_fail (MOO_IS_EDITOR (editor));
g_return_if_fail (!window || MOO_IS_EDIT_WINDOW (window));
@ -573,10 +655,34 @@ void moo_editor_open (MooEditor *editor,
{
MooEditFileInfo *info = l->data;
GError *error = NULL;
gboolean new_doc = FALSE;
MooEdit *doc = NULL;
/* XXX check current doc */
doc = g_object_new (MOO_TYPE_EDIT, "editor", editor, NULL);
gtk_object_sink (g_object_ref (doc));
if (window_list_find_filename (editor, info->filename, &bring_to_front))
{
moo_recent_mgr_add_recent (editor->priv->recent_mgr, info);
continue;
}
else
{
bring_to_front = NULL;
}
if (window)
{
doc = moo_edit_window_get_active_doc (window);
if (doc && moo_edit_is_empty (doc))
g_object_ref (doc);
else
doc = NULL;
}
if (!doc)
{
doc = g_object_new (MOO_TYPE_EDIT, "editor", editor, NULL);
gtk_object_sink (g_object_ref (doc));
new_doc = TRUE;
}
/* XXX open_single */
if (!moo_edit_load (loader, doc, info->filename, info->encoding, &error))
@ -591,14 +697,22 @@ void moo_editor_open (MooEditor *editor,
moo_editor_add_window (editor, window);
}
_moo_edit_window_insert_doc (window, doc, -1);
moo_editor_add_doc (editor, window, doc, loader, saver);
if (new_doc)
{
_moo_edit_window_insert_doc (window, doc, -1);
moo_editor_add_doc (editor, window, doc, loader, saver);
}
moo_recent_mgr_add_recent (editor->priv->recent_mgr, info);
parent = GTK_WIDGET (window);
}
g_object_unref (doc);
}
if (bring_to_front)
moo_editor_set_active_doc (editor, bring_to_front);
}
@ -1003,6 +1117,7 @@ gboolean _moo_editor_save (MooEditor *editor,
WindowInfo *info;
MooEditSaver *saver;
GError *error = NULL;
MooEditFileInfo *file_info;
g_return_val_if_fail (MOO_IS_EDITOR (editor), FALSE);
@ -1025,6 +1140,11 @@ gboolean _moo_editor_save (MooEditor *editor,
return FALSE;
}
file_info = moo_edit_file_info_new (moo_edit_get_filename (doc),
moo_edit_get_encoding (doc));
moo_recent_mgr_add_recent (editor->priv->recent_mgr, file_info);
moo_edit_file_info_free (file_info);
return TRUE;
}
@ -1069,6 +1189,9 @@ gboolean _moo_editor_save_as (MooEditor *editor,
goto out;
}
if (!file_info)
file_info = moo_edit_file_info_new (filename, encoding);
moo_recent_mgr_add_recent (editor->priv->recent_mgr, file_info);
result = TRUE;
/* fall through */

View File

@ -943,10 +943,15 @@ static void edit_changed (MooEditWindow *window,
{
if (doc == ACTIVE_DOC (window))
{
GtkWidget *close_button;
update_window_title (window);
edit_can_undo_redo (window);
active_tab_lang_changed (window);
update_statusbar (window);
close_button = moo_notebook_get_action_widget (window->priv->notebook, TRUE);
gtk_widget_set_sensitive (close_button, doc != NULL);
}
if (doc)
@ -1147,17 +1152,72 @@ void _moo_edit_window_remove_doc (MooEditWindow *window,
}
static GtkWidget *create_tab_label (G_GNUC_UNUSED MooEdit *edit)
static GtkWidget *create_tab_label (MooEdit *edit)
{
/* XXX */
return gtk_label_new ("Document");
GtkWidget *hbox, *icon, *label;
hbox = gtk_hbox_new (FALSE, 3);
gtk_widget_show (hbox);
icon = gtk_image_new ();
gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
label = gtk_label_new (moo_edit_get_display_basename (edit));
gtk_widget_show (label);
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
g_object_set_data (G_OBJECT (hbox), "moo-edit-icon", icon);
g_object_set_data (G_OBJECT (hbox), "moo-edit-label", label);
return hbox;
}
static void update_tab_label (G_GNUC_UNUSED MooEditWindow *window,
G_GNUC_UNUSED MooEdit *doc)
static void update_tab_label (MooEditWindow *window,
MooEdit *doc)
{
/* XXX */
GtkWidget *hbox, *icon, *label;
MooEditStatus status;
int page = get_page_num (window, doc);
g_return_if_fail (page >= 0);
hbox = moo_notebook_get_tab_label (window->priv->notebook,
GTK_WIDGET(doc)->parent);
icon = g_object_get_data (G_OBJECT (hbox), "moo-edit-icon");
label = g_object_get_data (G_OBJECT (hbox), "moo-edit-label");
g_return_if_fail (GTK_IS_WIDGET (hbox) && GTK_IS_WIDGET (icon) &&
GTK_IS_WIDGET (label));
status = moo_edit_get_status (doc);
if (status & MOO_EDIT_MODIFIED_ON_DISK)
{
gtk_image_set_from_stock (GTK_IMAGE (icon),
MOO_STOCK_DOC_MODIFIED_ON_DISK,
GTK_ICON_SIZE_MENU);
gtk_widget_show (icon);
}
else if (status & MOO_EDIT_DELETED)
{
gtk_image_set_from_stock (GTK_IMAGE (icon),
MOO_STOCK_DOC_DELETED,
GTK_ICON_SIZE_MENU);
gtk_widget_show (icon);
}
else if ((status & MOO_EDIT_MODIFIED) && !(status & MOO_EDIT_CLEAN))
{
gtk_image_set_from_stock (GTK_IMAGE (icon),
MOO_STOCK_DOC_MODIFIED,
GTK_ICON_SIZE_MENU);
gtk_widget_show (icon);
}
else
{
gtk_widget_hide (icon);
}
gtk_label_set_text (GTK_LABEL (label), moo_edit_get_display_basename (doc));
}
@ -1209,6 +1269,7 @@ static gboolean notebook_populate_popup (MooNotebook *notebook,
g_return_val_if_fail (MOO_IS_EDIT (edit), TRUE);
item = gtk_menu_item_new_with_label ("Close");
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_object_set_data (G_OBJECT (item), "moo-edit", edit);
g_signal_connect (item, "activate",
@ -1218,6 +1279,7 @@ static gboolean notebook_populate_popup (MooNotebook *notebook,
if (moo_edit_window_num_docs (window) > 1)
{
item = gtk_menu_item_new_with_label ("Close All Others");
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_object_set_data (G_OBJECT (item), "moo-edit", edit);
g_signal_connect (item, "activate",