X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=fd60dbd186f2f1fdfff4298cb504c0fbb94e7dfc;hb=c29e05c50e21d5be8365ffdd990d558b95725d71;hp=246e2d77d8f87753e0af674d85eebea671c5d3c7;hpb=38c2638eed90f33225870563c4be183097e4155a;p=pspp diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 246e2d77d8..fd60dbd186 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -454,9 +454,9 @@ static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, static void gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint column); -/* draw visible part of range. If range == NULL then draw the whole screen */ -static void gtk_sheet_range_draw (GtkSheet *sheet, - const GtkSheetRange *range); +/* draw visible part of range. */ +static void draw_sheet_region (GtkSheet *sheet, GdkRegion *region); + /* highlight the visible part of the selected range */ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, @@ -1061,7 +1061,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->sheet_window = NULL; sheet->entry_widget = NULL; - sheet->entry_handler_id = 0; sheet->button = NULL; sheet->hadjustment = NULL; @@ -1093,6 +1092,29 @@ gtk_sheet_init (GtkSheet *sheet) } +/* Cause RANGE to be redrawn. If RANGE is null, then the + entire visible range will be redrawn. + */ +static void +redraw_range (GtkSheet *sheet, GtkSheetRange *range) +{ + GdkRectangle rect; + + if ( ! GTK_WIDGET_REALIZED (sheet)) + return; + + if ( NULL != range ) + rectangle_from_range (sheet, range, &rect); + else + { + GdkRegion *r = gdk_drawable_get_visible_region (sheet->sheet_window); + gdk_region_get_clipbox (r, &rect); + } + + gdk_window_invalidate_rect (sheet->sheet_window, &rect, FALSE); +} + + /* Callback which occurs whenever columns are inserted / deleted in the model */ static void columns_inserted_deleted_callback (GSheetModel *model, gint first_column, @@ -1121,10 +1143,13 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, draw_column_title_buttons_range (sheet, first_column, max_visible_column (sheet)); - gtk_sheet_range_draw (sheet, &range); + + redraw_range (sheet, &range); } + + /* Callback which occurs whenever rows are inserted / deleted in the model */ static void rows_inserted_deleted_callback (GSheetModel *model, gint first_row, @@ -1151,7 +1176,7 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, draw_row_title_buttons_range (sheet, first_row, max_visible_row (sheet)); - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } /* @@ -1176,7 +1201,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) { - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); adjust_scrollbars (sheet); draw_row_title_buttons_range (sheet, min_visible_row (sheet), @@ -1198,7 +1223,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, range.coli = max_visible_column (sheet); } - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } @@ -1296,7 +1321,7 @@ gtk_sheet_show_grid (GtkSheet *sheet, gboolean show) sheet->show_grid = show; - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } gboolean @@ -1956,7 +1981,7 @@ gtk_sheet_map (GtkWidget *widget) !GTK_WIDGET_MAPPED (GTK_BIN (sheet->button)->child)) gtk_widget_map (GTK_BIN (sheet->button)->child); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); @@ -2085,15 +2110,36 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) } - static void -gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) +draw_sheet_region (GtkSheet *sheet, GdkRegion *region) { + GtkSheetRange range; + GdkRectangle area; + gint y, x; gint i, j; - GdkRectangle area; GtkSheetRange drawing_range; + gdk_region_get_clipbox (region, &area); + + y = area.y + sheet->vadjustment->value; + x = area.x + sheet->hadjustment->value; + + if ( sheet->column_titles_visible) + y -= sheet->column_title_area.height; + + if ( sheet->row_titles_visible) + x -= sheet->row_title_area.width; + + maximize_int (&x, 0); + maximize_int (&y, 0); + + range.row0 = row_from_ypixel (sheet, y); + range.rowi = row_from_ypixel (sheet, y + area.height); + + range.col0 = column_from_xpixel (sheet, x); + range.coli = column_from_xpixel (sheet, x + area.width); + g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_SHEET (sheet)); @@ -2101,51 +2147,35 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; - if (range == NULL) - { - drawing_range.row0 = min_visible_row (sheet); - drawing_range.col0 = min_visible_column (sheet); - drawing_range.rowi = MIN (max_visible_row (sheet), - psppire_axis_unit_count (sheet->vaxis) - 1); - drawing_range.coli = max_visible_column (sheet); - gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height); - area.x = area.y = 0; - } - else - { - drawing_range.row0 = MAX (range->row0, min_visible_row (sheet)); - drawing_range.col0 = MAX (range->col0, min_visible_column (sheet)); - drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet)); - drawing_range.coli = MIN (range->coli, max_visible_column (sheet)); - rectangle_from_range (sheet, &drawing_range, &area); - } + drawing_range.row0 = MAX (range.row0, min_visible_row (sheet)); + drawing_range.col0 = MAX (range.col0, min_visible_column (sheet)); + drawing_range.rowi = MIN (range.rowi, max_visible_row (sheet)); + drawing_range.coli = MIN (range.coli, max_visible_column (sheet)); g_return_if_fail (drawing_range.rowi >= drawing_range.row0); g_return_if_fail (drawing_range.coli >= drawing_range.col0); - gdk_window_begin_paint_rect (sheet->sheet_window, &area); - for (i = drawing_range.row0; i <= drawing_range.rowi; i++) - for (j = drawing_range.col0; j <= drawing_range.coli; j++) - { + { + for (j = drawing_range.col0; j <= drawing_range.coli; j++) gtk_sheet_cell_draw (sheet, i, j); - } + } if (sheet->state != GTK_SHEET_NORMAL && gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw_selection (sheet, drawing_range); + if (sheet->state == GTK_STATE_NORMAL && sheet->active_cell.row >= drawing_range.row0 && sheet->active_cell.row <= drawing_range.rowi && sheet->active_cell.col >= drawing_range.col0 && sheet->active_cell.col <= drawing_range.coli) gtk_sheet_show_entry_widget (sheet); - - gdk_window_end_paint (sheet->sheet_window); } + static void gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) { @@ -2266,7 +2296,7 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column) gtk_sheet_real_cell_clear (sheet, row, column); - gtk_sheet_range_draw (sheet, &range); + redraw_range (sheet, &range); } static void @@ -2470,16 +2500,12 @@ gtk_sheet_get_active_cell (GtkSheet *sheet, gint *row, gint *column) static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) { - GtkSheet *sheet; + GtkSheet *sheet = GTK_SHEET (data); gint row, col; const char *text; GtkJustification justification; GtkSheetCellAttr attributes; - g_return_if_fail (data != NULL); - g_return_if_fail (GTK_IS_SHEET (data)); - - sheet = GTK_SHEET (data); if (!GTK_WIDGET_VISIBLE (widget)) return; if (sheet->state != GTK_STATE_NORMAL) return; @@ -2525,7 +2551,6 @@ static void change_active_cell (GtkSheet *sheet, gint row, gint col) { gint old_row, old_col; - glong old_handler_id = sheet->entry_handler_id; g_return_if_fail (GTK_IS_SHEET (sheet)); @@ -2542,29 +2567,11 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_real_unselect_range (sheet, NULL); } - - g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id); - old_row = sheet->active_cell.row; old_col = sheet->active_cell.col; - { - /* Redraw the neighbourhood of the old active cell */ - GtkSheetRange r; - r.col0 = old_col - 1; - r.coli = old_col + 1; - r.row0 = old_row - 1; - r.rowi = old_row + 1; - - maximize_int (&r.row0, 0); - maximize_int (&r.col0, 0); - minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1); - minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1); - - - if ( gtk_sheet_range_isvisible (sheet, &r)) - gtk_sheet_range_draw (sheet, &r); - } + /* Erase the old cell */ + gtk_sheet_draw_active_cell (sheet); sheet->range.row0 = row; sheet->range.col0 = col; @@ -2577,15 +2584,15 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); + GTK_WIDGET_UNSET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS); + gtk_sheet_draw_active_cell (sheet); gtk_sheet_show_entry_widget (sheet); - + GTK_WIDGET_SET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS); g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, row, col, old_row, old_col); - if ( old_handler_id == sheet->entry_handler_id) - g_signal_handler_unblock (sheet->entry_widget, sheet->entry_handler_id); } static void @@ -2593,10 +2600,9 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) { GtkEntry *sheet_entry; GtkSheetCellAttr attributes; - gchar *text = NULL; + gint row, col; - g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); row = sheet->active_cell.row; @@ -2616,14 +2622,14 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) gtk_sheet_get_attributes (sheet, row, col, &attributes); - - text = gtk_sheet_cell_get_text (sheet, row, col); - if ( ! text ) - text = g_strdup (""); - - if ( GTK_IS_ENTRY (sheet_entry)) + if (GTK_IS_ENTRY (sheet_entry) && !GTK_WIDGET_HAS_FOCUS (sheet_entry)) { + gchar *text = gtk_sheet_cell_get_text (sheet, row, col); const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); + + if ( ! text ) + text = g_strdup (""); + if (strcmp (old_text, text) != 0) gtk_entry_set_text (sheet_entry, text); @@ -2640,6 +2646,7 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0); break; } + dispose_string (sheet, text); } gtk_sheet_size_allocate_entry (sheet); @@ -2648,8 +2655,6 @@ gtk_sheet_show_entry_widget (GtkSheet *sheet) g_sheet_model_is_editable (sheet->model, row, col)); gtk_widget_map (sheet->entry_widget); - - dispose_string (sheet, text); } static gboolean @@ -3046,15 +3051,10 @@ static gint gtk_sheet_expose (GtkWidget *widget, GdkEventExpose *event) { - GtkSheet *sheet; - GtkSheetRange range; + GtkSheet *sheet = GTK_SHEET (widget); - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); - sheet = GTK_SHEET (widget); - if (!GTK_WIDGET_DRAWABLE (widget)) return FALSE; @@ -3075,33 +3075,11 @@ gtk_sheet_expose (GtkWidget *widget, max_visible_column (sheet)); } - - { - gint y = event->area.y + sheet->vadjustment->value; - gint x = event->area.x + sheet->hadjustment->value; - - if ( sheet->column_titles_visible) - y -= sheet->column_title_area.height; - - if ( sheet->row_titles_visible) - x -= sheet->row_title_area.width; - - maximize_int (&x, 0); - maximize_int (&y, 0); - - range.row0 = row_from_ypixel (sheet, y); - - range.rowi = row_from_ypixel (sheet, y + event->area.height); - - range.col0 = column_from_xpixel (sheet, x); - - range.coli = column_from_xpixel (sheet, x + event->area.width); - } - if (event->window == sheet->sheet_window) { - gtk_sheet_range_draw (sheet, &range); + draw_sheet_region (sheet, event->region); +#if 0 if (sheet->state != GTK_SHEET_NORMAL) { if (gtk_sheet_range_isvisible (sheet, &sheet->range)) @@ -3115,20 +3093,28 @@ gtk_sheet_expose (GtkWidget *widget, if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) draw_xor_rectangle (sheet, sheet->drag_range); } +#endif - } - - (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); - - if (event->window == sheet->sheet_window) - { if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet))) { - if (sheet->state == GTK_SHEET_NORMAL) - gtk_sheet_draw_active_cell (sheet); + GdkRectangle rect; + GtkSheetRange range; + range.row0 = range.rowi = sheet->active_cell.row; + range.col0 = range.coli = sheet->active_cell.col; + + rectangle_from_range (sheet, &range, &rect); + + if (GDK_OVERLAP_RECTANGLE_OUT != + gdk_region_rect_in (event->region, &rect)) + { + gtk_sheet_draw_active_cell (sheet); + } } + } + (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); + return FALSE; } @@ -3422,8 +3408,6 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) sheet->state = GTK_SHEET_NORMAL; GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_sheet_draw_active_cell (sheet); - gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget)); return TRUE; @@ -4556,8 +4540,7 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_key_press), sheet); - sheet->entry_handler_id = - g_signal_connect (sheet->entry_widget, + g_signal_connect (sheet->entry_widget, "changed", G_CALLBACK (gtk_sheet_entry_changed), sheet); @@ -4917,7 +4900,6 @@ vadjustment_value_changed (GtkAdjustment *adjustment, if ( ! GTK_WIDGET_REALIZED (sheet)) return; - gtk_widget_hide (sheet->entry_widget); region = @@ -4925,13 +4907,14 @@ vadjustment_value_changed (GtkAdjustment *adjustment, gdk_window_begin_paint_region (sheet->sheet_window, region); + draw_sheet_region (sheet, region); - gtk_sheet_range_draw (sheet, NULL); draw_row_title_buttons (sheet); // size_allocate_global_button (sheet); gtk_sheet_draw_active_cell (sheet); gdk_window_end_paint (sheet->sheet_window); + gdk_region_destroy (region); } @@ -4954,13 +4937,16 @@ hadjustment_value_changed (GtkAdjustment *adjustment, gdk_window_begin_paint_region (sheet->sheet_window, region); - gtk_sheet_range_draw (sheet, NULL); + draw_sheet_region (sheet, region); + draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); gtk_sheet_draw_active_cell (sheet); gdk_window_end_paint (sheet->sheet_window); + + gdk_region_destroy (region); } @@ -5082,7 +5068,7 @@ set_column_width (GtkSheet *sheet, draw_column_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } } @@ -5104,7 +5090,7 @@ set_row_height (GtkSheet *sheet, draw_row_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); - gtk_sheet_range_draw (sheet, NULL); + redraw_range (sheet, NULL); } }