⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsegyviewmainwindow.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 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 + -