814
814
* @filter : #GnmFilter
817
* Does the range filter by @filter overlap with GnmRange @r
817
* Returns: %TRUE if @filter overlaps @r.
820
820
gnm_filter_overlaps_range (GnmFilter const *filter, GnmRange const *r)
822
822
g_return_val_if_fail (filter != NULL, FALSE);
823
g_return_val_if_fail (r != NULL, FALSE);
824
825
return range_overlap (&filter->r, r);
827
828
/*************************************************************************/
830
sheet_cell_or_one_below_is_not_empty (Sheet *sheet, int col, int row)
832
return !sheet_is_cell_empty (sheet, col, row) ||
833
(row < gnm_sheet_get_last_row (sheet) &&
834
!sheet_is_cell_empty (sheet, col, row+1));
838
* gnm_sheet_filter_guess_region :
831
* gnm_sheet_filter_at_pos :
839
832
* @sheet : #Sheet
834
* Returns : #GnmRange
844
gnm_sheet_filter_guess_region (Sheet *sheet, GnmRange *region)
837
gnm_sheet_filter_at_pos (Sheet const *sheet, GnmCellPos const *pos)
850
/* check in case only one cell selected */
851
if (region->start.col == region->end.col) {
852
int start = region->start.col;
853
/* look for previous empty column */
854
for (col = start - 1; col > 0; col--)
855
if (!sheet_cell_or_one_below_is_not_empty (sheet, col, region->start.row))
857
region->start.col = col - 1;
859
/* look for next empty column */
860
for (col = start + 1; col < gnm_sheet_get_max_cols (sheet); col++)
861
if (!sheet_cell_or_one_below_is_not_empty (sheet, col, region->start.row))
863
region->end.col = col - 1;
866
/* find first and last non-empty cells in region */
867
for (col = region->start.col; col <= region->end.col; col++)
868
if (sheet_cell_or_one_below_is_not_empty (sheet, col, region->start.row))
871
if (col > region->end.col)
872
return; /* all empty -- give up */
873
region->start.col = col;
875
for (col = region->end.col; col >= region->start.col; col--)
876
if (sheet_cell_or_one_below_is_not_empty(sheet, col, region->start.row))
878
region->end.col = col;
880
/* now find length of longest column */
881
for (col = region->start.col; col <= region->end.col; col++) {
883
if (sheet_is_cell_empty(sheet, col, region->start.row))
885
end_row = sheet_find_boundary_vertical (sheet, col,
886
region->start.row + offset, col, 1, TRUE);
887
if (end_row > region->end.row)
888
region->end.row = end_row;
842
g_return_val_if_fail (IS_SHEET (sheet), NULL);
843
g_return_val_if_fail (NULL != pos, NULL);
845
range_init_cellpos (&r, pos);
846
for (ptr = sheet->filters; ptr != NULL ; ptr = ptr->next)
847
if (gnm_filter_overlaps_range (ptr->data, &r))
892
853
struct cb_remove_col_undo {