📄 gemnumchooser.c.svn-base
字号:
/* addressbook - Address book *abooknumchooser.c - * *Authors: YE Nan <nan.ye@orange-ftgroup.com> * ZHAO Liangjing <liangjing.zhao@orange-ftgroup.com> * *This software and associated documentation files (the "Software") *are copyright (C) 2005 LiPS Linux Phone Standards Forum [FranceTelecom] *All Rights Reserved. * *A copyright license is hereby granted for redistribution and use of *the Software in source and binary forms, with or without modification, *provided that the following conditions are met: *- Redistributions of source code must retain the above copyright notice, *this copyright license and the following disclaimer. *- Redistributions in binary form must reproduce the above copyright *notice, this copyright license and the following disclaimer in the *documentation and/or other materials provided with the distribution. *- Neither the name of LiPS nor the names of its Members may be used *to endorse or promote products derived from the Software without *specific prior written permission. * *A patent license for any Necessary Claims owned by Members of LiPS Forum *to make, have made, use, import, offer to sell, lease and sell or otherwise *distribute any implementation compliant with the any specification adopted *by the LiPS Forumcan be obtained from the respective Members on reasonable *and non-discriminatory terms and conditions and under reciprocity, as *regulated in more detail in the Internal Policy of the LiPS Forum. * *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER, ITS MEMBERS AND CONTRIBUTORS *"AS IS", AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, *THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE *AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER, *ITS MEMBERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *POSSIBILITY OF SUCH DAMAGE. */#include <libintl.h>#include <ctype.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include "gemnumchooser.h"#define _(x) gettext(x)static void abook_number_chooser_class_init (ABookNumberChooserClass *klass);static void abook_number_chooser_init (ABookNumberChooser *window);GTypeabook_number_chooser_get_type (void){ static GType number_chooser_type = 0; if (!number_chooser_type) { static const GTypeInfo number_chooser_info = { sizeof (ABookNumberChooserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) abook_number_chooser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (ABookNumberChooser), 0, /* n_preallocs */ (GInstanceInitFunc) abook_number_chooser_init, }; number_chooser_type = g_type_register_static (GTK_TYPE_DIALOG, "ABookNumberChooser", &number_chooser_info, 0); } return number_chooser_type;}static voidabook_number_chooser_class_init (ABookNumberChooserClass *klass){ return;}static gbooleanabook_number_chooser_treeview_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, ABookNumberChooser *view){ GtkTreeView *treeview = GTK_TREE_VIEW (view->treeview); if (event->keyval == GDK_Up) { GtkTreePath *path = NULL; GtkTreePath *first = NULL; GtkTreeViewColumn *col = NULL; gboolean result = FALSE; gtk_tree_view_get_cursor (treeview, &path, &col); first = gtk_tree_path_new_first (); result = !gtk_tree_path_compare (path, first); gtk_tree_path_free (first); if (path && result) { GtkTreeModel *model = NULL; model = gtk_tree_view_get_model (treeview); if (model) { GtkTreeIter iter; if (gtk_tree_model_iter_nth_child (model, &iter, NULL, gtk_tree_model_iter_n_children (model, NULL) - 1)) { GtkTreePath *last = NULL; last = gtk_tree_model_get_path (model, &iter); if (gtk_tree_view_row_expanded (treeview, last)) { GtkTreeIter child_iter; if (gtk_tree_model_iter_nth_child (model, &child_iter, &iter, gtk_tree_model_iter_n_children (model, &iter) - 1)) { gtk_tree_path_free (last); last = gtk_tree_model_get_path (model, &child_iter); } } gtk_tree_view_set_cursor (treeview, last, NULL, FALSE); gtk_tree_path_free (last); } } } gtk_tree_path_free (path); return result; } else if (event->keyval == GDK_Down) { GtkTreePath *path = NULL; GtkTreeViewColumn *col = NULL; GtkTreeModel *model = NULL; gboolean result = FALSE; gtk_tree_view_get_cursor (treeview, &path, &col); model = gtk_tree_view_get_model (treeview); if (model) { GtkTreeIter iter; if (gtk_tree_model_iter_nth_child (model, &iter, NULL, gtk_tree_model_iter_n_children (model, NULL) - 1)) { GtkTreePath *last = NULL; last = gtk_tree_model_get_path (model, &iter); if (gtk_tree_view_row_expanded (treeview, last)) { GtkTreeIter child_iter; if (gtk_tree_model_iter_nth_child (model, &child_iter, &iter, gtk_tree_model_iter_n_children (model, &iter) - 1)) { gtk_tree_path_free (last); last = gtk_tree_model_get_path (model, &child_iter); } } result = !gtk_tree_path_compare (path, last); if (result) { GtkTreePath *first = NULL; first = gtk_tree_path_new_first (); gtk_tree_view_set_cursor (treeview, first, NULL, FALSE); gtk_tree_path_free (first); } gtk_tree_path_free (last); } } gtk_tree_path_free (path); return result; } return FALSE;}voidabook_number_chooser_number_cell_data_func (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, GtkTreeView *view){ if (TRUE) { gchar *origtxt = NULL; gchar *markuptxt = NULL; gtk_tree_model_get (GTK_TREE_MODEL (model), iter, COL_NC_NUMBER, &origtxt, -1);// g_print("%s(): entering, str = %s\n", __FUNCTION__, origtxt); if (TRUE) { GtkTreePath *curr_path = NULL; GtkTreePath *cursor_path = NULL; GtkTreeViewColumn *unused = NULL; gtk_tree_view_get_cursor (view, &cursor_path, &unused); curr_path = gtk_tree_model_get_path (model, iter); if (gtk_tree_path_compare (curr_path, cursor_path) == 0) { markuptxt = g_strdup_printf ("<span color=\"White\" style=\"italic\">%s</span>", origtxt); } else { markuptxt = g_strdup_printf ("<span color=\"Blue\" style=\"normal\">%s</span>", origtxt); } gtk_tree_path_free (curr_path); gtk_tree_path_free (cursor_path); } g_object_set (G_OBJECT (cell), "markup", markuptxt, NULL); g_free (markuptxt); g_free (origtxt); } return;}static voidabook_number_chooser_row_activated (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data){ ABookNumberChooser *nc = (ABookNumberChooser *) user_data; GtkTreeModel *model = NULL; GtkTreeIter iter; model = gtk_tree_view_get_model (treeview); if (gtk_tree_model_get_iter (model, &iter, path)) { gtk_dialog_response (GTK_DIALOG (nc), GTK_RESPONSE_OK); } return;}static voidabook_number_chooser_show_cb (GtkWidget *widget, gpointer user_data){ ABookNumberChooser *nc = ABOOK_NUMBER_CHOOSER (widget); GtkTreePath *path = NULL; GdkRectangle rect; gint n_childen = 0; path = gtk_tree_path_new_first (); gtk_tree_view_get_cell_area (GTK_TREE_VIEW (nc->treeview), path, NULL, &rect); gtk_tree_path_free (path); n_childen = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (nc->liststore), NULL); gtk_widget_set_size_request (nc->treeview, 240, (rect.height + 2) *n_childen);// gtk_widget_set_size_request(GTK_DIALOG(nc)->action_area, 240, 0); return;}static voidabook_number_chooser_init (ABookNumberChooser *view){ GtkTreeViewColumn *col; GtkCellRenderer *renderer; view->scroll_window = gtk_auto_scrolled_window_new (); view->liststore = gtk_list_store_new (NUM_NC_COLS, G_TYPE_STRING, G_TYPE_STRING); view->treeview = gtk_tree_view_new (); /* column type */ col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, "String"); gtk_tree_view_append_column (GTK_TREE_VIEW (view->treeview), col); gtk_tree_view_column_set_clickable (col, FALSE); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (col, renderer, TRUE); g_object_set (G_OBJECT (renderer), "ypad", 5, NULL); gtk_tree_view_column_add_attribute (col, renderer, "text", COL_NC_TYPE); /* column number */ col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, "Number"); gtk_tree_view_append_column (GTK_TREE_VIEW (view->treeview), col); gtk_tree_view_column_set_clickable (col, FALSE); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_add_attribute (col, renderer, "text", COL_NC_NUMBER); gtk_tree_view_column_set_cell_data_func (col, renderer, (GtkTreeCellDataFunc) abook_number_chooser_number_cell_data_func, view->treeview, NULL); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view->treeview), FALSE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view->treeview), FALSE); g_signal_connect (G_OBJECT (view->treeview), "key-press-event", G_CALLBACK (abook_number_chooser_treeview_key_press_event_cb), view); g_signal_connect (G_OBJECT (view->treeview), "row-activated", G_CALLBACK (abook_number_chooser_row_activated), view); gtk_tree_view_set_model (GTK_TREE_VIEW (view->treeview), GTK_TREE_MODEL (view->liststore)); view->scroll_window = gtk_auto_scrolled_window_new (); gtk_auto_scrolled_window_add (GTK_AUTO_SCROLLED_WINDOW (view->scroll_window), view->treeview); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (view)->vbox), view->scroll_window); gtk_window_set_decorated (GTK_WINDOW (view), FALSE); gtk_dialog_set_has_separator (GTK_DIALOG (view), FALSE); gtk_container_set_border_width (GTK_CONTAINER (view), 0); g_signal_connect (G_OBJECT (view), "show", G_CALLBACK (abook_number_chooser_show_cb), NULL); return;}GtkWidget *abook_number_chooser_new (void){ g_print("%s() :$$$$$$$$$$$$$$$$$$$$$44\n",__FUNCTION__); return g_object_new (ABOOK_TYPE_NUMBER_CHOOSER, NULL);}GtkListStore *abook_number_chooser_get_model (ABookNumberChooser *view){ if (view->liststore) { g_object_ref (view->liststore); } return view->liststore;}GtkWidget *abook_number_chooser_get_view (ABookNumberChooser *view){ if (view->treeview) { g_object_ref (view->treeview); } return view->treeview;}voidabook_number_chooser_update (ABookNumberChooser *view){ GtkTreePath *path = NULL; path = gtk_tree_path_new_first (); gtk_tree_view_set_cursor (GTK_TREE_VIEW (view->treeview), path, NULL, TRUE); gtk_tree_path_free (path); gtk_widget_set_size_request (GTK_DIALOG (view)->vbox, 240, -1); gtk_widget_set_size_request (GTK_DIALOG (view)->action_area, 240, 0); gtk_widget_show_all (GTK_WIDGET (view)); return;}gchar *abook_number_chooser_get_selected (ABookNumberChooser *view){ GtkTreeView *treeview = GTK_TREE_VIEW (view->treeview); GtkTreePath *path = NULL; GtkTreeViewColumn *col = NULL; gchar *numstr = NULL; gtk_tree_view_get_cursor (treeview, &path, &col); if (path) { GtkTreeModel *model = NULL; model = gtk_tree_view_get_model (treeview); if (model) { GtkTreeIter iter; gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, COL_NC_NUMBER, &numstr, -1); } } return numstr;}/* vi:ts=2:nowrap:ai:expandtab*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -