~ubuntu-branches/ubuntu/quantal/gnumeric/quantal

« back to all changes in this revision

Viewing changes to src/sheet-filter.c

  • Committer: Bazaar Package Importer
  • Author(s): Gauvain Pocentek
  • Date: 2009-06-22 13:37:20 UTC
  • mfrom: (1.1.20 upstream) (2.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20090622133720-rtdazsiz2lx5q8l7
Tags: 1.9.9-1ubuntu1
* Merge from debian unstable, remaining changes:
  - Promoted gnumeric-doc to Recommends in gnumeric package for help to be
    installed automatically
  - gnumeric-gtk is a transitional package
  - gnumeric conflicts with gnumeric-gtk << 1.8.3-3ubuntu1
  - call initltool-update in po*
  - remove psiconv support (psiconv is in universe):
    o debian/control: remove B-D on libpsiconv-dev
    o debian/rules: don't pass --with-psiconv to ./configure
    o debian/gnumeric-plugins-extra.install: don't install the psiconv
      plugin

Show diffs side-by-side

added added

removed removed

Lines of Context:
814
814
 * @filter : #GnmFilter
815
815
 * @r : #GnmRange
816
816
 *
817
 
 * Does the range filter by @filter overlap with GnmRange @r
 
817
 * Returns: %TRUE if @filter overlaps @r.
818
818
 **/
819
819
gboolean
820
820
gnm_filter_overlaps_range (GnmFilter const *filter, GnmRange const *r)
821
821
{
822
822
        g_return_val_if_fail (filter != NULL, FALSE);
 
823
        g_return_val_if_fail (r != NULL, FALSE);
823
824
 
824
825
        return range_overlap (&filter->r, r);
825
826
}
826
827
 
827
828
/*************************************************************************/
828
829
 
829
 
static gboolean
830
 
sheet_cell_or_one_below_is_not_empty (Sheet *sheet, int col, int row)
831
 
{
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));
835
 
}
836
 
 
837
830
/**
838
 
 * gnm_sheet_filter_guess_region :
 
831
 * gnm_sheet_filter_at_pos :
839
832
 * @sheet : #Sheet
840
 
 * @range : #GnmRange
841
833
 *
 
834
 * Returns : #GnmRange
842
835
 **/
843
 
void
844
 
gnm_sheet_filter_guess_region (Sheet *sheet, GnmRange *region)
 
836
GnmFilter *
 
837
gnm_sheet_filter_at_pos (Sheet const *sheet, GnmCellPos const *pos)
845
838
{
846
 
        int col;
847
 
        int end_row;
848
 
        int offset;
849
 
 
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))
856
 
                                break;
857
 
                region->start.col = col - 1;
858
 
 
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))
862
 
                                break;
863
 
                region->end.col = col - 1;
864
 
        }
865
 
 
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))
869
 
                        break;
870
 
 
871
 
        if (col > region->end.col)
872
 
                return; /* all empty -- give up */
873
 
        region->start.col = col;
874
 
 
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))
877
 
                        break;
878
 
        region->end.col = col;
879
 
 
880
 
        /* now find length of longest column */
881
 
        for (col = region->start.col; col <= region->end.col; col++) {
882
 
                offset = 0;
883
 
                if (sheet_is_cell_empty(sheet, col, region->start.row))
884
 
                        offset = 1;
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;
889
 
        }
 
839
        GSList *ptr;
 
840
        GnmRange r;
 
841
 
 
842
        g_return_val_if_fail (IS_SHEET (sheet), NULL);
 
843
        g_return_val_if_fail (NULL != pos, NULL);
 
844
 
 
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))
 
848
                        return ptr->data;
 
849
 
 
850
        return NULL;
890
851
}
891
852
 
892
853
struct cb_remove_col_undo {
1066
1027
 
1067
1028
        g_slist_free (filters);
1068
1029
}
 
1030