[gnumeric] Introspection: copy and paste.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Introspection: copy and paste.
- Date: Fri, 13 Apr 2018 00:18:47 +0000 (UTC)
commit fbe12ed1920471f787825b2dda3d34785d952a04
Author: Morten Welinder <terra gnome org>
Date: Thu Apr 12 20:18:16 2018 -0400
Introspection: copy and paste.
ChangeLog | 5 ++++
README-introspection | 31 +++++++++++++++++++++++++-
plugins/excel/ms-excel-read.c | 3 +-
src/clipboard.c | 42 ++++++++++++++++++++++++------------
src/clipboard.h | 17 ++++++++------
src/commands.c | 7 ++---
src/sheet-merge.c | 15 ++++++------
src/sheet-merge.h | 3 +-
src/sheet.c | 10 ++++----
test/t3001-introspection-simple.pl | 21 ++++++++++++------
test/t3001-introspection-simple.py | 12 +++++++++-
11 files changed, 115 insertions(+), 51 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 6c40952..9da9c70 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-04-12 Morten Welinder <terra gnome org>
+
+ * src/sheet-merge.c (gnm_sheet_merge_remove): Drop unused command
+ context argument. All callers changed.
+
2018-04-11 Morten Welinder <terra gnome org>
* src/workbook.c: Make Workbook a more proper object by adding a
diff --git a/README-introspection b/README-introspection
index e3da5f5..12075aa 100644
--- a/README-introspection
+++ b/README-introspection
@@ -11,7 +11,6 @@ be useful in this setting and actually work.
This is incomplete. In particular, I'll have to look at
* Expressions other than via text
* File i/o
-* Copy and paste
* Installing a gi override module for more pythony structure handling
-----------------------------------------------------------------------------
@@ -81,8 +80,10 @@ Sheet: [GObject]
GnmCell: [Boxed structure] [2]
name()
get_value()
+ get_entered_text()
pos
+
GnmSheetSize: [Simple structure]
max_cols
max_rows
@@ -133,6 +134,30 @@ GnmSheetVisibility: [Enum]
VERY_HIDDEN
+PasteFlags: [Enum]
+ CONTENTS
+ AS_VALUES
+ FORMATS
+ COMMENTS
+ OBJECTS
+ OPER_ADD
+ OPER_SUB
+ OPER_MULT
+ OPER_DIV
+ TRANSPOSE
+ LINK
+ SKIP_BLANKS
+ DONT_MERGE
+ IGNORE_COMMENTS_AT_ORIGIN
+ UPDATE_ROW_HEIGHT
+ EXPR_LOCAL_RELOCATE
+ NO_RECALC
+ FLIP_H
+ FLIP_V
+ ALL_TYPES
+ DEFAULT
+
+
GnmStyle: [Boxed structure]
new()
new_default()
@@ -179,6 +204,10 @@ GnmStyle: [Boxed structure]
get_effective_text_wrap()
visible_in_blank()
+Gnm (i.e., not in a class):
+ clipboard_copy_range(sheet,range)
+
+
Footnotes:
diff --git a/plugins/excel/ms-excel-read.c b/plugins/excel/ms-excel-read.c
index 055dd93..cbedb35 100644
--- a/plugins/excel/ms-excel-read.c
+++ b/plugins/excel/ms-excel-read.c
@@ -4906,8 +4906,7 @@ excel_read_MERGECELLS (BiffQuery *q, ExcelReadSheet *esheet)
/* Do this early because the _remove can kill r2. */
r = range_union (&r, r2);
- gnm_sheet_merge_remove (esheet->sheet, r2,
- GO_CMD_CONTEXT (esheet->container.importer->context));
+ gnm_sheet_merge_remove (esheet->sheet, r2);
g_slist_free (overlap);
}
gnm_sheet_merge_add (esheet->sheet, &r, FALSE,
diff --git a/src/clipboard.c b/src/clipboard.c
index 4bf64b4..5505d7d 100644
--- a/src/clipboard.c
+++ b/src/clipboard.c
@@ -86,9 +86,7 @@ gnm_cell_copy_get_type (void)
static GnmPasteTarget *
gnm_paste_target_copy (GnmPasteTarget *pt)
{
- GnmPasteTarget *res = g_new (GnmPasteTarget, 1);
- memcpy (res, pt, sizeof (GnmPasteTarget));
- return res;
+ return g_memdup (pt, sizeof (*pt));
}
GType
@@ -104,6 +102,15 @@ gnm_paste_target_get_type (void)
return t;
}
+GnmPasteTarget *
+gnm_paste_target_new (Sheet *sheet, GnmRange *r, GnmPasteFlags flags)
+{
+ GnmPasteTarget *res = g_new (GnmPasteTarget, 1);
+ paste_target_init (res, sheet, r, flags);
+ return res;
+}
+
+
static gboolean
cell_has_expr_or_number_or_blank (GnmCell const * cell)
{
@@ -403,7 +410,7 @@ range_flip_v (GnmRange *range, Sheet const *sheet, int const *data)
* clipboard_paste_region:
* @cr: The GnmCellRegion to paste.
* @pt: Where to paste the values.
- * @cc: The context for error handling.
+ * @cc: (nullable): The context for error handling.
*
* Pastes the supplied GnmCellRegion (@cr) into the supplied
* GnmPasteTarget (@pt). This operation is not undoable. It does not auto grow
@@ -476,9 +483,11 @@ clipboard_paste_region (GnmCellRegion const *cr,
}
if (cr->not_as_contents && (pt->paste_flags & PASTE_CONTENTS)) {
- go_cmd_context_error_invalid (cc,
- _("Unable to paste"),
- _("Contents can only be pasted by value or by link."));
+ if (cc)
+ go_cmd_context_error_invalid
+ (cc,
+ _("Unable to paste"),
+ _("Contents can only be pasted by value or by link."));
return TRUE;
}
@@ -489,7 +498,8 @@ clipboard_paste_region (GnmCellRegion const *cr,
_("destination does not have an even multiple of source columns (%d vs %d)\n\n"
"Try selecting a single cell or an area of the same shape and size."),
dst_cols, src_cols);
- go_cmd_context_error_invalid (cc, _("Unable to paste"), msg);
+ if (cc)
+ go_cmd_context_error_invalid (cc, _("Unable to paste"), msg);
g_free (msg);
return TRUE;
}
@@ -500,16 +510,19 @@ clipboard_paste_region (GnmCellRegion const *cr,
_("destination does not have an even multiple of source rows (%d vs %d)\n\n"
"Try selecting a single cell or an area of the same shape and size."),
dst_rows, src_rows);
- go_cmd_context_error_invalid (cc, _("Unable to paste"), msg);
+ if (cc)
+ go_cmd_context_error_invalid (cc, _("Unable to paste"), msg);
g_free (msg);
return TRUE;
}
if ((pt->range.start.col + dst_cols) > gnm_sheet_get_max_cols (pt->sheet) ||
(pt->range.start.row + dst_rows) > gnm_sheet_get_max_rows (pt->sheet)) {
- go_cmd_context_error_invalid (cc,
- _("Unable to paste"),
- _("result passes the sheet boundary"));
+ if (cc)
+ go_cmd_context_error_invalid
+ (cc,
+ _("Unable to paste"),
+ _("result passes the sheet boundary"));
return TRUE;
}
@@ -834,9 +847,10 @@ clipboard_copy_obj (Sheet *sheet, GSList *objects)
}
GnmPasteTarget*
-paste_target_init (GnmPasteTarget *pt, Sheet *sheet, GnmRange const *r, int flags)
+paste_target_init (GnmPasteTarget *pt, Sheet *sheet,
+ GnmRange const *r, GnmPasteFlags flags)
{
- pt->sheet = sheet;
+ pt->sheet = sheet; // No ref
pt->range = *r;
pt->paste_flags = flags;
return pt;
diff --git a/src/clipboard.h b/src/clipboard.h
index e13347c..75b9ef6 100644
--- a/src/clipboard.h
+++ b/src/clipboard.h
@@ -7,7 +7,7 @@
G_BEGIN_DECLS
-enum {
+typedef enum {
PASTE_CONTENTS = 1 << 0, /* either CONTENTS or AS_VALUES */
PASTE_AS_VALUES = 1 << 1, /* can be applied, not both */
PASTE_FORMATS = 1 << 2,
@@ -45,11 +45,12 @@ enum {
/* Whether the paste flips or not */
PASTE_FLIP_H = 1 << 17,
- PASTE_FLIP_V = 1 << 18
-};
+ PASTE_FLIP_V = 1 << 18,
+
+ PASTE_ALL_TYPES = (PASTE_CONTENTS | PASTE_FORMATS | PASTE_COMMENTS | PASTE_OBJECTS),
+ PASTE_DEFAULT = PASTE_ALL_TYPES
+} GnmPasteFlags;
-#define PASTE_ALL_TYPES (PASTE_CONTENTS | PASTE_FORMATS | PASTE_COMMENTS | PASTE_OBJECTS)
-#define PASTE_DEFAULT PASTE_ALL_TYPES
#define PASTE_OPER_MASK (PASTE_OPER_ADD | PASTE_OPER_SUB | PASTE_OPER_MULT | PASTE_OPER_DIV)
typedef struct {
@@ -78,11 +79,13 @@ struct _GnmCellRegion {
struct _GnmPasteTarget {
Sheet *sheet;
GnmRange range;
- int paste_flags;
+ GnmPasteFlags paste_flags;
};
GType gnm_paste_target_get_type (void);
+GnmPasteTarget *gnm_paste_target_new (Sheet *sheet, GnmRange *r, GnmPasteFlags flags);
+
GnmCellRegion *clipboard_copy_range (Sheet *sheet, GnmRange const *r);
GOUndo *clipboard_copy_range_undo (Sheet *sheet, GnmRange const *r);
GOUndo *clipboard_copy_ranges_undo (Sheet *sheet, GSList *ranges);
@@ -92,7 +95,7 @@ gboolean clipboard_paste_region (GnmCellRegion const *cr,
GOCmdContext *cc);
GnmPasteTarget *paste_target_init (GnmPasteTarget *pt,
Sheet *sheet, GnmRange const *r,
- int flags);
+ GnmPasteFlags flags);
GType gnm_cell_region_get_type (void);
GnmCellRegion *gnm_cell_region_new (Sheet *origin_sheet);
diff --git a/src/commands.c b/src/commands.c
index c5e69d3..4ecddd7 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -3820,8 +3820,7 @@ cmd_unmerge_cells_redo (GnmCommand *cmd, WorkbookControl *wbc)
GnmRange const *pr = ptr->data;
GnmRange const tmp = *pr;
g_array_append_val (me->unmerged_regions, tmp);
- gnm_sheet_merge_remove (me->cmd.sheet, &tmp,
- GO_CMD_CONTEXT (wbc));
+ gnm_sheet_merge_remove (me->cmd.sheet, &tmp);
sheet_range_calc_spans (me->cmd.sheet, &tmp,
GNM_SPANCALC_RE_RENDER);
}
@@ -3928,7 +3927,7 @@ cmd_merge_cells_undo (GnmCommand *cmd, WorkbookControl *wbc)
for (i = 0 ; i < me->ranges->len ; ++i) {
GnmRange const *r = &(g_array_index (me->ranges, GnmRange, i));
- gnm_sheet_merge_remove (me->cmd.sheet, r, GO_CMD_CONTEXT (wbc));
+ gnm_sheet_merge_remove (me->cmd.sheet, r);
}
/* Avoid pasting comments that are at 0,0. Redo copies the target
@@ -3980,7 +3979,7 @@ cmd_merge_cells_redo (GnmCommand *cmd, WorkbookControl *wbc)
me->old_contents = g_slist_prepend (me->old_contents,
clipboard_copy_range (sheet, r));
for (ptr = merged ; ptr != NULL ; ptr = ptr->next)
- gnm_sheet_merge_remove (sheet, ptr->data, GO_CMD_CONTEXT (wbc));
+ gnm_sheet_merge_remove (sheet, ptr->data);
g_slist_free (merged);
gnm_sheet_merge_add (sheet, r, TRUE, GO_CMD_CONTEXT (wbc));
diff --git a/src/sheet-merge.c b/src/sheet-merge.c
index 0dc50be..f983672 100644
--- a/src/sheet-merge.c
+++ b/src/sheet-merge.c
@@ -52,7 +52,7 @@ range_row_cmp (GnmRange const *a, GnmRange const *b)
* @r: The region to merge
* @clear: should the non-corner content of the region be cleared and the
* style from the corner applied.
- * @cc: the calling context
+ * @cc: (nullable): the calling context
*
* Add a range to the list of merge targets. Checks for array spliting returns
* %TRUE if there was an error. Queues a respan. Only queus a redraw if @clear
@@ -159,7 +159,6 @@ gnm_sheet_merge_add (Sheet *sheet, GnmRange const *r, gboolean clear,
* gnm_sheet_merge_remove:
* @sheet: the sheet which will contain the region
* @r: The region
- * @cc: the calling context
*
* Remove a merged range.
* Queues a redraw.
@@ -167,7 +166,7 @@ gnm_sheet_merge_add (Sheet *sheet, GnmRange const *r, gboolean clear,
* Returns: %TRUE if there was an error.
**/
gboolean
-gnm_sheet_merge_remove (Sheet *sheet, GnmRange const *r, GOCmdContext *cc)
+gnm_sheet_merge_remove (Sheet *sheet, GnmRange const *r)
{
GnmRange *r_copy;
GnmCell *cell;
@@ -317,7 +316,7 @@ cb_restore_merge (Sheet *sheet, GSList *restore)
// the old state, so we'll have to remove the merge and
// create a new.
if (r2)
- gnm_sheet_merge_remove (sheet, r2, NULL);
+ gnm_sheet_merge_remove (sheet, r2);
gnm_sheet_merge_add (sheet, r, FALSE, NULL);
}
@@ -356,7 +355,7 @@ gnm_sheet_merge_relocate (GnmExprRelocateInfo const *ri, GOUndo **pundo)
for (ptr = copy; ptr != NULL ; ptr = ptr->next) {
GnmRange const *r = ptr->data;
if (range_contains (&dest, r->start.col, r->start.row))
- gnm_sheet_merge_remove (ri->target_sheet, r, NULL);
+ gnm_sheet_merge_remove (ri->target_sheet, r);
}
g_slist_free (copy);
}
@@ -374,7 +373,7 @@ gnm_sheet_merge_relocate (GnmExprRelocateInfo const *ri, GOUndo **pundo)
ri->col_offset, ri->row_offset);
range_ensure_sanity (&r2, ri->target_sheet);
- gnm_sheet_merge_remove (ri->origin_sheet, r, NULL);
+ gnm_sheet_merge_remove (ri->origin_sheet, r);
if (range_is_singleton (&r2))
needs_restore = TRUE;
else if (r2.start.col <= r2.end.col &&
@@ -388,12 +387,12 @@ gnm_sheet_merge_relocate (GnmExprRelocateInfo const *ri, GOUndo **pundo)
r2.end.col += ri->col_offset;
r2.end.row += ri->row_offset;
range_ensure_sanity (&r2, ri->target_sheet);
- gnm_sheet_merge_remove (ri->origin_sheet, r, NULL);
+ gnm_sheet_merge_remove (ri->origin_sheet, r);
needs_restore = TRUE;
needs_reapply = !range_is_singleton (&r2);
} else if (!change_sheets &&
range_contains (&dest, r->start.col, r->start.row))
- gnm_sheet_merge_remove (ri->origin_sheet, r, NULL);
+ gnm_sheet_merge_remove (ri->origin_sheet, r);
if (needs_reapply)
reapply = g_slist_prepend (reapply,
diff --git a/src/sheet-merge.h b/src/sheet-merge.h
index e985c2f..04eb931 100644
--- a/src/sheet-merge.h
+++ b/src/sheet-merge.h
@@ -12,8 +12,7 @@ gboolean gnm_sheet_merge_add (Sheet *sheet,
gboolean clear,
GOCmdContext *cc);
gboolean gnm_sheet_merge_remove (Sheet *sheet,
- GnmRange const *r,
- GOCmdContext *cc);
+ GnmRange const *r);
GSList *gnm_sheet_merge_get_overlap (Sheet const *sheet, GnmRange const *r);
GnmRange const *gnm_sheet_merge_contains_pos (Sheet const *sheet, GnmCellPos const *pos);
GnmRange const *gnm_sheet_merge_is_corner (Sheet const *sheet, GnmCellPos const *pos);
diff --git a/src/sheet.c b/src/sheet.c
index c66b74e..511e16b 100644
--- a/src/sheet.c
+++ b/src/sheet.c
@@ -3487,9 +3487,9 @@ cb_check_array_vertical (GnmColRowIter const *iter, ArrayCheckData *data)
* sheet_range_splits_array:
* @sheet: The sheet.
* @r: The range to check
- * @ignore: an optionally NULL range in which it is ok to have an array.
- * @cc: an optional place to report an error.
- * @cmd: an optional cmd name used with @cc.
+ * @ignore: (nullable): a range in which it is ok to have an array.
+ * @cc: (nullable): place to report an error.
+ * @cmd: (nullable): cmd name used with @cc.
*
* Check the outer edges of range @sheet!@r to ensure that if an array is
* within it then the entire array is within the range. @ignore is useful when
@@ -4727,7 +4727,7 @@ cb_empty_cell (GnmCellIter const *iter, gpointer user)
* @end_col:
* @end_row:
* @clear_flags: If this is TRUE then styles are erased.
- * @cc:
+ * @cc: (nullable):
*
* Clears are region of cells
*
@@ -4793,7 +4793,7 @@ sheet_clear_region (Sheet *sheet,
GSList *merged, *ptr;
merged = gnm_sheet_merge_get_overlap (sheet, &r);
for (ptr = merged ; ptr != NULL ; ptr = ptr->next)
- gnm_sheet_merge_remove (sheet, ptr->data, cc);
+ gnm_sheet_merge_remove (sheet, ptr->data);
g_slist_free (merged);
}
diff --git a/test/t3001-introspection-simple.pl b/test/t3001-introspection-simple.pl
index de56494..faba82e 100755
--- a/test/t3001-introspection-simple.pl
+++ b/test/t3001-introspection-simple.pl
@@ -37,10 +37,17 @@ As int:
1
List of cells in sheet:
-A1
-A2
-A3
-A4
-A5
-A6
-A7
+A1: 10 [bold]
+C1: 10
+A2: 101.25 [bold]
+C2: 101.25
+A3: =A1+A2
+C3: =C1+C2
+A4: '01
+C4: '01
+A5: zzz
+C5: zzz
+A6: abc
+C6: abc
+A7: TRUE
+C7: TRUE
diff --git a/test/t3001-introspection-simple.py b/test/t3001-introspection-simple.py
index 74cb117..8749ebe 100755
--- a/test/t3001-introspection-simple.py
+++ b/test/t3001-introspection-simple.py
@@ -25,6 +25,16 @@ sheet.cell_set_text(0,4,"zzz")
sheet.cell_set_value(0,5,Gnm.Value.new_string("abc"))
sheet.cell_set_value(0,6,Gnm.Value.new_bool(1))
+# Copy A1:A7, paste to C1:C7
+src = Gnm.Range()
+src.init(0,0,0,6)
+cr = Gnm.clipboard_copy_range(sheet,src)
+dst = Gnm.Range()
+dst.init(2,0,2,6)
+pt = Gnm.PasteTarget.new (sheet,dst,Gnm.PasteFlags.DEFAULT)
+Gnm.clipboard_paste_region(cr,pt,None)
+
+
# Make A1:A2 bold
st = Gnm.Style.new()
st.set_font_bold(1)
@@ -47,4 +57,4 @@ print "\nList of cells in sheet:"
for c in sheet.cells(None):
st = sheet.style_get (c.pos.col,c.pos.row)
bold = st.get_font_bold()
- print("{}: {}".format(c.name(), ("[bold]" if bold else "")))
+ print("{}: {} {}".format(c.name(), c.get_entered_text(), ("[bold]" if bold else "")))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]