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

📄 gsegysortview.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 C
字号:
/*  * GTKSEISVIEWUI - Library of interface elements for GSEGYView * * 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 <gsegyfile/gsegyfile.h>#include "gsegyfileaux.h"#include "gsegydataview.h"#include "gsegysortview.h"#include "gsegyfileui_marshal.h"G_DEFINE_TYPE (GSEGYSortView, g_segy_sort_view, G_TYPE_OBJECT)#define G_SEGY_SORT_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEGY_TYPE_SORT_VIEW, GSEGYSortViewPrivate))typedef struct _GSEGYSortViewPrivate GSEGYSortViewPrivate;struct _GSEGYSortViewPrivate {    GtkWidget   *hbox;    GtkWidget   *remove_view_button;    GtkWidget   *remove_view_icon;    GtkWidget   *show_data_button;    GtkWidget   *show_data_icon;    GtkWidget   *label;    GtkTooltips *sortview_tips;    GtkWidget   *remove_confirm_dialog;    gchar       *name;    GAsyncQueue *sort_progress;    GMutex      *seisaccess_mutex;    GThread     *sorting_thread;    gint16       first_sort_level_id;    gint16       second_sort_level_id;    GSEGYDataViewPref    *data_view_pref;    GSEGYDataView        *data_view;    GSEGYSeismicAccessor *seismic_accessor;};static void g_segy_sort_view_init (GSEGYSortView *self) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    private->hbox = NULL;    private->show_data_button = NULL;    private->show_data_icon = NULL;    private->remove_view_button = NULL;    private->remove_view_icon = NULL;    private->label = NULL;    private->sortview_tips = NULL;    private->remove_confirm_dialog = NULL;    private->seismic_accessor = NULL;    private->name = NULL;    private->sort_progress = g_async_queue_new ();    private->seisaccess_mutex = g_mutex_new ();    private->sorting_thread = NULL;    private->first_sort_level_id = 0;    private->second_sort_level_id = 0;    private->data_view = NULL;    private->data_view_pref = NULL;#ifdef DEBUG    g_print ("<GSEGYSortView is inited>\n");#endif}static void g_segy_sort_view_wait_thread (GSEGYSortView *self) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (G_SEGY_SORT_VIEW (self));    if (private->sort_progress && private->sorting_thread) {        g_async_queue_push (private->sort_progress, self);        g_thread_join (private->sorting_thread);    }}static void g_segy_sort_view_finalize (GObject *object) {    GSEGYSortView *self = G_SEGY_SORT_VIEW (object);    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    g_segy_sort_view_wait_thread (self);    while (g_idle_remove_by_data ((gpointer)self));    if (private->data_view)        g_object_unref (G_OBJECT (private->data_view));    if (private->remove_confirm_dialog)        gtk_widget_destroy (private->remove_confirm_dialog);    if (private->seismic_accessor)        g_object_unref (G_OBJECT (private->seismic_accessor));    if (private->name)        g_free (private->name);    if (private->sort_progress)        g_async_queue_unref (private->sort_progress);    if (private->seisaccess_mutex)        g_mutex_free (private->seisaccess_mutex);    if (private->hbox)        gtk_widget_destroy (private->hbox);    if (private->sortview_tips)        g_object_unref (G_OBJECT (private->sortview_tips));#ifdef DEBUG    g_print ("<GSEGYSortView is finalized>\n");#endif    if (G_OBJECT_CLASS (g_segy_sort_view_parent_class)->finalize)        G_OBJECT_CLASS (g_segy_sort_view_parent_class)->finalize (object);}static void g_segy_sort_view_remove_signal (GSEGYSortView *self) {    g_signal_emit (self, G_SEGY_SORT_VIEW_GET_CLASS (self)->view_remove_id, 0);}static void g_segy_sort_view_class_init (GSEGYSortViewClass *klass) {    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);    gobject_class->finalize = g_segy_sort_view_finalize;    g_type_class_add_private (klass, sizeof (GSEGYSortViewPrivate));    klass->view_remove = NULL;    klass->view_remove_id = g_signal_new ("view_remove",                                          G_TYPE_FROM_CLASS ((gpointer)G_OBJECT_CLASS (klass)),                                          G_SIGNAL_RUN_LAST,                                          G_STRUCT_OFFSET (GSEGYSortViewClass, view_remove),                                          NULL, NULL,                                          g_segyui_marshal_VOID__VOID,                                          G_TYPE_NONE, 0);#ifdef DEBUG    g_print ("<GSEGYSortView class is inited>\n");#endif}static void g_segy_sort_view_data_view_remove_handler (GSEGYDataView *data_view, gpointer data) {    g_segy_sort_view_remove_signal (G_SEGY_SORT_VIEW (data));}static gboolean g_segy_sort_view_remove_handler (GtkWidget *widget, gpointer data) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (G_SEGY_SORT_VIEW (data));    if (NULL == private->remove_confirm_dialog)        private->remove_confirm_dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (private->hbox)),                                                                 GTK_DIALOG_MODAL,                                                                 GTK_MESSAGE_QUESTION,                                                                 GTK_BUTTONS_YES_NO,                                                                 _("Are you sure that you want to remove the view\n"                                                                   "%s?"), private->name);    if (GTK_RESPONSE_YES == gtk_dialog_run (GTK_DIALOG (private->remove_confirm_dialog))) {        gtk_widget_hide (GTK_WIDGET (private->remove_confirm_dialog));        g_segy_sort_view_remove_signal (G_SEGY_SORT_VIEW (data));        return FALSE;    } else        gtk_widget_hide (GTK_WIDGET (private->remove_confirm_dialog));    return TRUE;}static void g_segy_sort_view_sort_show_data_handler (GtkWidget *button, gpointer data) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (G_SEGY_SORT_VIEW (data));    g_segy_data_view_show (private->data_view);}GtkWidget* g_segy_sort_view_get_main_widget (GSEGYSortView *self) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    if (NULL == private->hbox) {        private->hbox = gtk_hbox_new (FALSE, 3);        private->sortview_tips = gtk_tooltips_new ();        g_object_ref (G_OBJECT (private->sortview_tips));        gtk_object_sink (GTK_OBJECT (private->sortview_tips));        private->remove_view_button = gtk_button_new ();        private->remove_view_icon = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->remove_view_button), private->remove_view_icon);        gtk_box_pack_start (GTK_BOX (private->hbox), private->remove_view_button, FALSE, FALSE, 0);        gtk_signal_connect (GTK_OBJECT (private->remove_view_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_sort_view_remove_handler),                            (gpointer)G_OBJECT (self));        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->sortview_tips), private->remove_view_button,                              _("Remove data view"),                              _("This button removes the data view"                                "associated with it."));        private->show_data_button = gtk_button_new ();        private->show_data_icon = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU);        gtk_container_add (GTK_CONTAINER (private->show_data_button), private->show_data_icon);        gtk_box_pack_start (GTK_BOX (private->hbox), private->show_data_button, FALSE, FALSE, 0);        gtk_signal_connect (GTK_OBJECT (private->show_data_button), "clicked",                            GTK_SIGNAL_FUNC (g_segy_sort_view_sort_show_data_handler),                            (gpointer)G_OBJECT (self));        gtk_widget_set_sensitive (private->show_data_button, FALSE);        gtk_tooltips_set_tip (GTK_TOOLTIPS (private->sortview_tips), private->show_data_button,                              _("Show data view"),                              _("This button shows the data view"                                "associated with it."));        private->label = gtk_label_new (_("Sorting..."));        gtk_box_pack_start (GTK_BOX (private->hbox), private->label, FALSE, FALSE, 2);    }    return private->hbox;}GSEGYSortView* g_segy_sort_view_new (const gchar *name) {    GSEGYSortView *new_sort_view = G_SEGY_SORT_VIEW (g_object_new (G_SEGY_TYPE_SORT_VIEW, NULL));    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (new_sort_view);    if (name)        private->name = g_strdup (name);    return new_sort_view;}static gboolean g_segy_sort_view_sort_create_data_view (GSEGYSortView *self) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    if (NULL == private->seismic_accessor)        return FALSE;    if (private->sorting_thread)        gdk_threads_enter ();    g_mutex_lock (private->seisaccess_mutex);    if (NULL == private->data_view) {        private->data_view = g_segy_data_view_new (private->name, private->seismic_accessor);        g_segy_data_view_set_data_view_pref (private->data_view, private->data_view_pref);        g_signal_connect (G_OBJECT (private->data_view), "view_remove", (GCallback)g_segy_sort_view_data_view_remove_handler,                          (gpointer)self);    }    g_segy_data_view_show (private->data_view);    g_mutex_unlock (private->seisaccess_mutex);    if (private->sorting_thread) {        gdk_threads_leave ();        g_thread_join (private->sorting_thread);        private->sorting_thread = NULL;    }    return FALSE;}static gboolean g_segy_sort_view_set_sort_label (gpointer data) {    GSEGYSortView *self = (GSEGYSortView*)data;    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    if (private->sorting_thread)        gdk_threads_enter ();    gtk_label_set_text (GTK_LABEL (private->label), _("Sorting..."));    gtk_widget_hide (GTK_WIDGET (private->show_data_button));    if (private->sorting_thread)        gdk_threads_leave ();    return FALSE;}static gboolean g_segy_sort_view_set_ready_label (gpointer data) {    GSEGYSortView *self = (GSEGYSortView*)data;    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    if (private->sorting_thread)        gdk_threads_enter ();    gtk_label_set_text (GTK_LABEL (private->label), private->name);    gtk_widget_set_sensitive (private->show_data_button, TRUE);    gtk_widget_show (GTK_WIDGET (private->show_data_button));    if (private->sorting_thread)        gdk_threads_leave ();    return FALSE;}static void *g_segy_sort_view_sort_seismic_thread (void *args) {    GSEGYSortView *self = (GSEGYSortView*)args;    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    g_async_queue_ref (private->sort_progress);    g_mutex_lock (private->seisaccess_mutex);    g_idle_add ((GSourceFunc)g_segy_sort_view_set_sort_label, (gpointer)self);    if (private->data_view_pref)        g_segy_seismic_accessor_sort (private->seismic_accessor, private->first_sort_level_id,                                      private->second_sort_level_id,                                      0 == private->data_view_pref->first_key_order,                                      0 == private->data_view_pref->second_key_order);    else        g_segy_seismic_accessor_sort (private->seismic_accessor, private->first_sort_level_id,                                      private->second_sort_level_id, TRUE, TRUE);    if (FALSE == g_async_queue_try_pop (private->sort_progress)) {        g_idle_add ((GSourceFunc)g_segy_sort_view_set_ready_label, (gpointer)self);        g_idle_add ((GSourceFunc)g_segy_sort_view_sort_create_data_view, (gpointer)self);    }    g_mutex_unlock (private->seisaccess_mutex);    g_async_queue_unref (private->sort_progress);    return NULL;}void g_segy_sort_view_set_data_view_pref (GSEGYSortView *self, GSEGYDataViewPref *data_view_pref) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    private->data_view_pref = data_view_pref;    }void g_segy_sort_view_set_seismic_accessor (GSEGYSortView *self, GSEGYSeismicAccessor *seismic_accessor,                                            gint16 first_sort_level_id, gint16 second_sort_level_id) {    GSEGYSortViewPrivate *private = G_SEGY_SORT_VIEW_GET_PRIVATE (self);    GError *error = NULL;    if (private->seismic_accessor)        return;    private->first_sort_level_id = first_sort_level_id;    private->second_sort_level_id = second_sort_level_id;    private->seismic_accessor = seismic_accessor;    g_object_ref (G_OBJECT (private->seismic_accessor));    if (private->sorting_thread) {        g_thread_join (private->sorting_thread);        private->sorting_thread = NULL;    }    private->sorting_thread = g_thread_create (g_segy_sort_view_sort_seismic_thread, self, TRUE, &error);    if (FALSE == private->sorting_thread) {#ifdef DEBUG        if (error)            g_printf ("Failed to create thread: %s\n", error->message);        else            g_printf ("Failed to create thread, no reason given\n");#endif        if (error)            g_error_free (error);        g_segy_sort_view_set_sort_label ((gpointer)self);        if (private->data_view_pref)            g_segy_seismic_accessor_sort (private->seismic_accessor, private->first_sort_level_id,                                          private->second_sort_level_id,                                          0 == private->data_view_pref->first_key_order,                                          0 == private->data_view_pref->second_key_order);        else            g_segy_seismic_accessor_sort (private->seismic_accessor, private->first_sort_level_id,                                          private->second_sort_level_id, TRUE, TRUE);        g_segy_sort_view_set_ready_label ((gpointer)self);        g_segy_sort_view_sort_create_data_view (self);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -