📄 gsegysortview.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 + -