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 + -
显示快捷键?