📄 gsegyviewmainwindow.c
字号:
/* * GSEGYMainWindow - main window for the viewer * * Copyright (C) 2006 Vladimir Bashkardin * * 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 av. * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Vladimir Bashkardin <vovizmus@users.sourceforge.net> */#include <ui/gsegyfileaux.h>#include <ui/gsegyfileview.h>#include <ui/gsegyfileui_marshal.h>#include <gsegyfile/gsegyformatwizard.h>#include "gsegyviewmainwindow.h"G_DEFINE_TYPE (GSEGYViewMainWindow, g_segy_view_main_window, G_TYPE_OBJECT)#define G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEGY_TYPE_VIEW_MAIN_WINDOW, GSEGYViewMainWindowPrivate))typedef struct _GSEGYViewMainWindowPrivate GSEGYViewMainWindowPrivate;struct _GSEGYViewMainWindowPrivate { GtkWidget *main_window; GtkWidget *vbox; GtkWidget *toolbar; GtkToolItem *open_file_button; GtkWidget *open_file_icon; GtkToolItem *close_window_button; GtkWidget *close_window_icon; GtkWidget *scrolledw; GtkWidget *scrolled_vbox; GtkWidget *quit_confirm_dialog; GtkWidget *file_open_dialog; GtkWidget *file_open_extra; GtkWidget *endianess_combo; GtkFileFilter *segy_file_filter; gchar *default_filename; GPtrArray *files_views;};static void g_segy_view_main_window_init (GSEGYViewMainWindow *self) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (self); private->main_window = NULL; private->vbox = NULL; private->toolbar = NULL; private->open_file_button = NULL; private->open_file_icon = NULL; private->close_window_button = NULL; private->close_window_icon = NULL; private->scrolledw = NULL; private->scrolled_vbox = NULL; private->quit_confirm_dialog = NULL; private->file_open_dialog = NULL; private->endianess_combo = NULL; private->file_open_extra = NULL; private->segy_file_filter = NULL; private->default_filename = NULL; private->files_views = g_ptr_array_new ();#ifdef DEBUG g_print ("<GSEGYViewMainWindow is inited>\n");#endif}static void g_segy_view_main_window_finalize (GObject *object) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (G_SEGY_VIEW_MAIN_WINDOW (object)); if (private->quit_confirm_dialog) gtk_widget_destroy (private->quit_confirm_dialog); if (private->file_open_dialog) gtk_widget_destroy (private->file_open_dialog); if (private->files_views) { guint i, view_num = private->files_views->len; for (i = 0; i < view_num; i++) g_object_unref (G_OBJECT (g_ptr_array_index (private->files_views, i))); g_ptr_array_free (private->files_views, TRUE); } if (private->main_window) gtk_widget_destroy (private->main_window);#ifdef DEBUG g_print ("<GSEGYViewMainWindow is finalized>\n");#endif if (G_OBJECT_CLASS (g_segy_view_main_window_parent_class)->finalize) G_OBJECT_CLASS (g_segy_view_main_window_parent_class)->finalize (object);}static void g_segy_view_main_window_close_signal (GSEGYViewMainWindow *self) { g_signal_emit (self, G_SEGY_VIEW_MAIN_WINDOW_GET_CLASS (self)->window_close_id, 0);}static void g_segy_view_main_window_class_init (GSEGYViewMainWindowClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = g_segy_view_main_window_finalize; g_type_class_add_private (klass, sizeof (GSEGYViewMainWindowPrivate)); klass->window_close = NULL; klass->window_close_id = g_signal_new ("window_close", G_TYPE_FROM_CLASS ((gpointer)G_OBJECT_CLASS (klass)), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GSEGYViewMainWindowClass, window_close), NULL, NULL, g_segyui_marshal_VOID__VOID, G_TYPE_NONE, 0);#ifdef DEBUG g_print ("<GSEGYViewMainWindow class is inited>\n");#endif}GSEGYViewMainWindow* g_segy_view_main_window_new (void) { return g_object_new (G_SEGY_TYPE_VIEW_MAIN_WINDOW, NULL);}static gint g_segy_view_main_window_confirm_quit (GSEGYViewMainWindow *self) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (self); gint dialog_response; if (NULL == private->quit_confirm_dialog) private->quit_confirm_dialog = gtk_message_dialog_new (GTK_WINDOW (private->main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Are you sure that you want to close the application?")); dialog_response = gtk_dialog_run (GTK_DIALOG (private->quit_confirm_dialog)); gtk_widget_hide (GTK_WIDGET (private->quit_confirm_dialog)); return dialog_response;}static gboolean g_segy_view_main_window_close (GSEGYViewMainWindow *self) { if (GTK_RESPONSE_YES == g_segy_view_main_window_confirm_quit (self)) { g_segy_view_main_window_close_signal (self); return FALSE; } return TRUE;}static gboolean g_segy_view_main_window_close_handler (GtkWidget *widget, GdkEvent *event, gpointer data) { return g_segy_view_main_window_close (G_SEGY_VIEW_MAIN_WINDOW (data));}static void g_segy_view_main_window_quit_handler (GtkWidget *widget, gpointer data) { g_segy_view_main_window_close (G_SEGY_VIEW_MAIN_WINDOW (data));}static void g_segy_view_main_window_file_close_handler (GSEGYFileView *file_view, gpointer data) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (G_SEGY_VIEW_MAIN_WINDOW (data)); g_ptr_array_remove (private->files_views, (gpointer)file_view); g_object_unref (G_OBJECT (file_view));}static g_segy_view_main_window_open_handler (GtkWidget *widget, gpointer data) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (G_SEGY_VIEW_MAIN_WINDOW (data)); if (NULL == private->file_open_dialog) { private->file_open_dialog = gtk_file_chooser_dialog_new (_("Select seismic file to view"), GTK_WINDOW (private->main_window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (private->file_open_dialog), FALSE);#if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 4 gtk_file_chooser_set_show_hidden (GTK_FILE_CHOOSER (private->file_open_dialog), TRUE);#endif/* guint i; GPtrArray *files_extensions; files_extensions = g_segy_format_wizard_get_files_extensions (private->format_wizard); if (files_extensions) { private->segy_file_filter = gtk_file_filter_new (); gtk_file_filter_set_name (private->segy_file_filter, g_segy_format_wizard_get_files_name (private->format_wizard)); for (i = 0; i < files_extensions->len; i++) gtk_file_filter_add_pattern (private->segy_file_filter, (const gchar*)g_ptr_array_index (files_extensions, i)); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (private->file_open_dialog), private->segy_file_filter); }*/ private->segy_file_filter = gtk_file_filter_new (); gtk_file_filter_set_name (private->segy_file_filter, "SEG-Y files"); gtk_file_filter_add_pattern (private->segy_file_filter, "*.sgy"); gtk_file_filter_add_pattern (private->segy_file_filter, "*.segy"); gtk_file_filter_add_pattern (private->segy_file_filter, "*.SGY"); gtk_file_filter_add_pattern (private->segy_file_filter, "*.SEGY"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (private->file_open_dialog), private->segy_file_filter); private->file_open_extra = gtk_hbox_new (FALSE, 3); private->endianess_combo = gtk_combo_box_new_text (); gtk_box_pack_start (GTK_BOX (private->file_open_extra), private->endianess_combo, FALSE, FALSE, 0); gtk_combo_box_append_text (GTK_COMBO_BOX (private->endianess_combo), _("Big endian")); gtk_combo_box_append_text (GTK_COMBO_BOX (private->endianess_combo), _("Little endian")); gtk_combo_box_set_active (GTK_COMBO_BOX (private->endianess_combo), 0); gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (private->file_open_dialog), private->file_open_extra); gtk_widget_show_all (private->file_open_extra); } if (private->default_filename) gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (private->file_open_dialog), private->default_filename); if (GTK_RESPONSE_ACCEPT == gtk_dialog_run (GTK_DIALOG (private->file_open_dialog))) { gtk_widget_hide (GTK_WIDGET (private->file_open_dialog)); gchar *filename; GSEGYFileView* file_view = g_segy_file_view_new (); g_signal_connect (G_OBJECT (file_view), "file_close", (GCallback)g_segy_view_main_window_file_close_handler, (gpointer)G_SEGY_VIEW_MAIN_WINDOW (data)); g_ptr_array_add (private->files_views, (gpointer)file_view); gtk_box_pack_start (GTK_BOX (private->scrolled_vbox), g_segy_file_view_get_main_widget (file_view), FALSE, FALSE, 0); gtk_widget_show_all (g_segy_file_view_get_main_widget (file_view)); filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (private->file_open_dialog)); gboolean file_is_big_endian = (0 == gtk_combo_box_get_active (GTK_COMBO_BOX (private->endianess_combo))); gboolean platform_is_big_endian = (G_BYTE_ORDER == G_BIG_ENDIAN); GSEGYEndianess *endianess = g_segy_endianess_new ((file_is_big_endian != platform_is_big_endian), TRUE); GSEGYFormatWizard *format_wizard = g_segy_format_wizard_new (endianess); g_segy_file_view_set_file (file_view, filename, format_wizard); g_object_unref (G_OBJECT (endianess)); g_object_unref (G_OBJECT (format_wizard)); g_free (filename); } else gtk_widget_hide (GTK_WIDGET (private->file_open_dialog));}void g_segy_view_main_window_set_filename (GSEGYViewMainWindow *self, const gchar *filename) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (self); if (NULL == private->open_file_button || NULL == filename || FALSE == g_file_test (filename, G_FILE_TEST_IS_REGULAR) || FALSE == g_file_test (filename, G_FILE_TEST_EXISTS)) return; private->default_filename = filename; g_segy_view_main_window_open_handler (GTK_WIDGET (private->open_file_button), (gpointer)self); private->default_filename = NULL;}GtkWidget* g_segy_view_main_window_get_main_widget (GSEGYViewMainWindow *self) { GSEGYViewMainWindowPrivate *private = G_SEGY_VIEW_MAIN_WINDOW_GET_PRIVATE (self); gchar *window_title; if (NULL == private->main_window) { private->main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width (GTK_CONTAINER (private->main_window), 7); gtk_widget_set_size_request (GTK_WIDGET (private->main_window), 380, 240); gtk_window_set_default_size (GTK_WINDOW (private->main_window), 540, 350); window_title = g_strconcat (PROGRAM_NAME, " ", PROGRAM_VERS, NULL); gtk_window_set_title (GTK_WINDOW (private->main_window), window_title); g_free (window_title); gtk_signal_connect (GTK_OBJECT (private->main_window), "delete_event", GTK_SIGNAL_FUNC (g_segy_view_main_window_close_handler), (gpointer)G_OBJECT (self)); private->vbox = gtk_vbox_new (FALSE, 2); gtk_container_add (GTK_CONTAINER (private->main_window), private->vbox); private->toolbar = gtk_toolbar_new (); gtk_toolbar_set_orientation (GTK_TOOLBAR (private->toolbar), GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (GTK_BOX (private->vbox), private->toolbar, FALSE, FALSE, 0); private->open_file_icon = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_SMALL_TOOLBAR); private->open_file_button = gtk_tool_button_new (private->open_file_icon, _("Open")); gtk_toolbar_insert (GTK_TOOLBAR (private->toolbar), GTK_TOOL_ITEM (private->open_file_button), 0); gtk_signal_connect (GTK_OBJECT (private->open_file_button), "clicked", GTK_SIGNAL_FUNC (g_segy_view_main_window_open_handler), (gpointer)G_OBJECT (self)); private->close_window_icon = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_SMALL_TOOLBAR); private->close_window_button = gtk_tool_button_new (private->close_window_icon, _("Quit")); gtk_toolbar_insert (GTK_TOOLBAR (private->toolbar), GTK_TOOL_ITEM (private->close_window_button), -1); gtk_signal_connect (GTK_OBJECT (private->close_window_button), "clicked", GTK_SIGNAL_FUNC (g_segy_view_main_window_quit_handler), (gpointer)G_OBJECT (self)); private->scrolledw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (private->scrolledw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (private->scrolledw), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start (GTK_BOX (private->vbox), private->scrolledw, TRUE, TRUE, 0); private->scrolled_vbox = gtk_vbox_new (FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (private->scrolled_vbox), 7); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (private->scrolledw), private->scrolled_vbox); gsegy_view_set_window_icon (GTK_WINDOW (private->main_window)); } return private->main_window;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -