ptk-icon-view.c

来自「台湾人开发的Linux下的文件管理器」· C语言 代码 · 共 1,591 行 · 第 1/5 页

C
1,591
字号
/* $Id: ptk-icon-view.c 405 2006-10-10 12:40:26Z pcmanx $ *//*- * Copyright (c) 2004-2006  os-cillation e.K. * Copyright (c) 2002,2004  Anders Carlsson <andersca@gnu.org> * Copyright (c) 2006       Hong Jen Yee <pcman.tw@gmail.com> * * Written by Benedikt Meurer <benny@xfce.org>. * 2006-01-22 Modified by Hong Jen Yee to be used in PCMan File Manager * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * * Brief history of PtkIconView * * This class is originally taken from ExoIconView from XFCE, * which is derived from GtkIconView from GTK+ team. * (See the copyright notice at the beggining of this file) * * And then, modified by Hong Jen Yee (PCMan) to be PtkIconView, which * is used in PCMan File Manager, a lightwight file manager. * Some bugs of original GtkIconView/PtkIconView has been fixed, and * interactive search is added by Hong Jen Yee (ported from GtkTreeView). */#ifdef HAVE_CONFIG_H#include <config.h>#endif#ifdef HAVE_MEMORY_H#include <memory.h>#endif#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#ifdef HAVE_STRING_H#include <string.h>#endif#include <glib/gi18n.h>#define I_(x) (x)#include <gdk/gdkkeysyms.h>#include "ptk-icon-view.h"#include "ptk-text-renderer.h"#include "exo-marshal.h"#include "exo-string.h"#if defined(G_PARAM_STATIC_NAME) && defined(G_PARAM_STATIC_NICK) && defined(G_PARAM_STATIC_BLURB)#define PTK_PARAM_READABLE  (G_PARAM_READABLE \                           | G_PARAM_STATIC_NAME \                           | G_PARAM_STATIC_NICK \                           | G_PARAM_STATIC_BLURB)#define PTK_PARAM_WRITABLE  (G_PARAM_WRITABLE \                           | G_PARAM_STATIC_NAME \                           | G_PARAM_STATIC_NICK \                           | G_PARAM_STATIC_BLURB)#define PTK_PARAM_READWRITE (G_PARAM_READWRITE \                           | G_PARAM_STATIC_NAME \                           | G_PARAM_STATIC_NICK \                           | G_PARAM_STATIC_BLURB)#else#define PTK_PARAM_READABLE  (G_PARAM_READABLE)#define PTK_PARAM_WRITABLE  (G_PARAM_WRITABLE)#define PTK_PARAM_READWRITE (G_PARAM_READWRITE)#endif#define SCROLL_EDGE_SIZE 15#define PTK_ICON_VIEW_SEARCH_DIALOG_TIMEOUT 5000/* Property identifiers */enum{    PROP_0,    PROP_PIXBUF_COLUMN,    PROP_TEXT_COLUMN,    PROP_MARKUP_COLUMN,    PROP_SELECTION_MODE,    PROP_ORIENTATION,    PROP_MODEL,    PROP_COLUMNS,    PROP_ITEM_WIDTH,    PROP_SPACING,    PROP_ROW_SPACING,    PROP_COLUMN_SPACING,    PROP_MARGIN,    PROP_REORDERABLE,    PROP_ENABLE_SEARCH,    PROP_SEARCH_COLUMN,};/* Signal identifiers */enum{    ITEM_ACTIVATED,    SELECTION_CHANGED,    SELECT_ALL,    UNSELECT_ALL,    SELECT_CURSOR_ITEM,    TOGGLE_CURSOR_ITEM,    MOVE_CURSOR,    ACTIVATE_CURSOR_ITEM,    LAST_SIGNAL};/* Icon view flags */typedef enum{    PTK_ICON_VIEW_DRAW_KEYFOCUS = ( 1l << 0 ),      /* whether to draw keyboard focus */    PTK_ICON_VIEW_ITERS_PERSIST = ( 1l << 1 ),      /* whether current model provides persistent iterators */} PtkIconViewFlags;#define PTK_ICON_VIEW_SET_FLAG(icon_view, flag)   G_STMT_START{ (PTK_ICON_VIEW (icon_view)->priv->flags |= flag); }G_STMT_END#define PTK_ICON_VIEW_UNSET_FLAG(icon_view, flag) G_STMT_START{ (PTK_ICON_VIEW (icon_view)->priv->flags &= ~(flag)); }G_STMT_END#define PTK_ICON_VIEW_FLAG_SET(icon_view, flag)   ((PTK_ICON_VIEW (icon_view)->priv->flags & (flag)) == (flag))typedef struct _PtkIconViewCellInfo PtkIconViewCellInfo;typedef struct _PtkIconViewChild PtkIconViewChild;typedef struct _PtkIconViewItem PtkIconViewItem;#define PTK_ICON_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), PTK_TYPE_ICON_VIEW, PtkIconViewPrivate))#define PTK_ICON_VIEW_CELL_INFO(obj)   ((PtkIconViewCellInfo *) (obj))#define PTK_ICON_VIEW_CHILD(obj)       ((PtkIconViewChild *) (obj))#define PTK_ICON_VIEW_ITEM(obj)        ((PtkIconViewItem *) (obj))static void ptk_icon_view_class_init ( PtkIconViewClass *klass );static void ptk_icon_view_cell_layout_init ( GtkCellLayoutIface *iface );static void ptk_icon_view_init ( PtkIconView *icon_view );static void ptk_icon_view_dispose ( GObject *object );static void ptk_icon_view_finalize ( GObject *object );static void ptk_icon_view_get_property ( GObject *object,                                         guint prop_id,                                         GValue *value,                                         GParamSpec *pspec );static void ptk_icon_view_set_property ( GObject *object,                                         guint prop_id,                                         const GValue *value,                                         GParamSpec *pspec );static void ptk_icon_view_realize ( GtkWidget *widget );static void ptk_icon_view_unrealize ( GtkWidget *widget );static void ptk_icon_view_size_request ( GtkWidget *widget,                                         GtkRequisition *requisition );static void ptk_icon_view_size_allocate ( GtkWidget *widget,                                          GtkAllocation *allocation );static void ptk_icon_view_style_set ( GtkWidget *widget,                                      GtkStyle *previous_style );static gboolean ptk_icon_view_expose_event ( GtkWidget *widget,                                             GdkEventExpose *event );static gboolean ptk_icon_view_key_press ( GtkWidget *widget,                                          GdkEventKey *event );static gboolean ptk_icon_view_key_release ( GtkWidget *widget,                                            GdkEventKey *event );static gboolean ptk_icon_view_motion_notify_event ( GtkWidget *widget,                                                    GdkEventMotion *event );static gboolean ptk_icon_view_button_press_event ( GtkWidget *widget,                                                   GdkEventButton *event );static gboolean ptk_icon_view_button_release_event ( GtkWidget *widget,                                                     GdkEventButton *event );static AtkObject *ptk_icon_view_get_accessible ( GtkWidget *widget );static void ptk_icon_view_remove ( GtkContainer *container,                                   GtkWidget *widget );static void ptk_icon_view_forall ( GtkContainer *container,                                   gboolean include_internals,                                   GtkCallback callback,                                   gpointer callback_data );static void ptk_icon_view_set_adjustments ( PtkIconView *icon_view,                                            GtkAdjustment *hadj,                                            GtkAdjustment *vadj );static void ptk_icon_view_real_select_all ( PtkIconView *icon_view );static void ptk_icon_view_real_unselect_all ( PtkIconView *icon_view );static void ptk_icon_view_real_select_cursor_item ( PtkIconView *icon_view );static void ptk_icon_view_real_toggle_cursor_item ( PtkIconView *icon_view );static gboolean ptk_icon_view_real_activate_cursor_item ( PtkIconView *icon_view );static void ptk_icon_view_adjustment_changed ( GtkAdjustment *adjustment,                                               PtkIconView *icon_view );static void ptk_icon_view_layout ( PtkIconView *icon_view );static void ptk_icon_view_paint_item ( PtkIconView *icon_view,                                       PtkIconViewItem *item,                                       GdkRectangle *area,                                       GdkDrawable *drawable,                                       gint x,                                       gint y,                                       gboolean draw_focus );static void ptk_icon_view_queue_draw_path ( PtkIconView *icon_view,                                            GtkTreePath *path );static void ptk_icon_view_queue_draw_item ( PtkIconView *icon_view,                                            PtkIconViewItem *item );static void ptk_icon_view_queue_layout ( PtkIconView *icon_view );static void ptk_icon_view_set_cursor_item ( PtkIconView *icon_view,                                            PtkIconViewItem *item,                                            gint cursor_cell );static void ptk_icon_view_start_rubberbanding ( PtkIconView *icon_view,                                                gint x,                                                gint y );static void ptk_icon_view_stop_rubberbanding ( PtkIconView *icon_view );static void ptk_icon_view_update_rubberband_selection ( PtkIconView *icon_view );static gboolean ptk_icon_view_item_hit_test ( PtkIconView *icon_view,                                              PtkIconViewItem *item,                                              gint x,                                              gint y,                                              gint width,                                              gint height );static gboolean ptk_icon_view_unselect_all_internal ( PtkIconView *icon_view );static void ptk_icon_view_calculate_item_size ( PtkIconView *icon_view,                                                PtkIconViewItem *item );static void ptk_icon_view_calculate_item_size2 ( PtkIconView *icon_view,                                                 PtkIconViewItem *item,                                                 gint *max_height );static void ptk_icon_view_update_rubberband ( gpointer data );static void ptk_icon_view_item_invalidate_size ( PtkIconViewItem *item );static void ptk_icon_view_invalidate_sizes ( PtkIconView *icon_view );static void ptk_icon_view_add_move_binding ( GtkBindingSet *binding_set,                                             guint keyval,                                             guint modmask,                                             GtkMovementStep step,                                             gint count );static gboolean ptk_icon_view_real_move_cursor ( PtkIconView *icon_view,                                                 GtkMovementStep step,                                                 gint count );static void ptk_icon_view_move_cursor_up_down ( PtkIconView *icon_view,                                                gint count );static void ptk_icon_view_move_cursor_page_up_down ( PtkIconView *icon_view,                                                     gint count );static void ptk_icon_view_move_cursor_left_right ( PtkIconView *icon_view,                                                   gint count );static void ptk_icon_view_move_cursor_start_end ( PtkIconView *icon_view,                                                  gint count );static void ptk_icon_view_scroll_to_item ( PtkIconView *icon_view,                                           PtkIconViewItem *item );static void ptk_icon_view_select_item ( PtkIconView *icon_view,                                        PtkIconViewItem *item );static void ptk_icon_view_unselect_item ( PtkIconView *icon_view,                                          PtkIconViewItem *item );static gboolean ptk_icon_view_select_all_between ( PtkIconView *icon_view,                                                   PtkIconViewItem *anchor,                                                   PtkIconViewItem *cursor );static PtkIconViewItem * ptk_icon_view_get_item_at_coords ( const PtkIconView *icon_view,                                                            gint x,                                                            gint y,                                                            gboolean only_in_cell,                                                            PtkIconViewCellInfo **cell_at_pos );static void ptk_icon_view_get_cell_area ( PtkIconView *icon_view,                                          PtkIconViewItem *item,                                          PtkIconViewCellInfo *cell_info,                                          GdkRectangle *cell_area );static PtkIconViewCellInfo *ptk_icon_view_get_cell_info ( PtkIconView *icon_view,                                                          GtkCellRenderer *renderer );static void ptk_icon_view_set_cell_data ( const PtkIconView *icon_view,                                          PtkIconViewItem *item );static void ptk_icon_view_cell_layout_pack_start ( GtkCellLayout *layout,                                                   GtkCellRenderer *renderer,                                                   gboolean expand );static void ptk_icon_view_cell_layout_pack_end ( GtkCellLayout *layout,                                                 GtkCellRenderer *renderer,                                                 gboolean expand );static void ptk_icon_view_cell_layout_add_attribute ( GtkCellLayout *layout,                                                      GtkCellRenderer *renderer,                                                      const gchar *attribute,                                                      gint column );static void ptk_icon_view_cell_layout_clear ( GtkCellLayout *layout );static void ptk_icon_view_cell_layout_clear_attributes ( GtkCellLayout *layout,                                                         GtkCellRenderer *renderer );static void ptk_icon_view_cell_layout_set_cell_data_func ( GtkCellLayout *layout,                                                           GtkCellRenderer *cell,                                                           GtkCellLayoutDataFunc func,                                                           gpointer func_data,                                                           GDestroyNotify destroy );static void ptk_icon_view_cell_layout_reorder ( GtkCellLayout *layout,                                                GtkCellRenderer *cell,                                                gint position );static void ptk_icon_view_item_activate_cell ( PtkIconView *icon_view,                                               PtkIconViewItem *item,                                               PtkIconViewCellInfo *cell_info,                                               GdkEvent *event );static void ptk_icon_view_put ( PtkIconView *icon_view,                                GtkWidget *widget,                                PtkIconViewItem *item,                                gint cell );static void ptk_icon_view_remove_widget ( GtkCellEditable *editable,                                          PtkIconView *icon_view );static void ptk_icon_view_start_editing ( PtkIconView *icon_view,                                          PtkIconViewItem *item,                                          PtkIconViewCellInfo *cell_info,                                          GdkEvent *event );static void ptk_icon_view_stop_editing ( PtkIconView *icon_view,                                         gboolean cancel_editing );/* Source side drag signals */static void ptk_icon_view_drag_begin ( GtkWidget *widget,                                       GdkDragContext *context );static void ptk_icon_view_drag_end ( GtkWidget *widget,                                     GdkDragContext *context );static void ptk_icon_view_drag_data_get ( GtkWidget *widget,                                          GdkDragContext *context,                                          GtkSelectionData *selection_data,                                          guint info,                                          guint time );

⌨️ 快捷键说明

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