[gnumeric] Hyperlinks: code cleanup and APIs for import/export.



commit b88d10fd48d1e31efbda9f76860f0ea6187cd9bd
Author: Morten Welinder <terra gnome org>
Date:   Fri Mar 10 08:35:20 2017 -0500

    Hyperlinks: code cleanup and APIs for import/export.

 ChangeLog      |    6 +++
 src/hlink.c    |  113 +++++++++++++++++++++++++++++++++++++++++++-------------
 src/hlink.h    |    4 ++
 src/position.c |   12 +++---
 4 files changed, 103 insertions(+), 32 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 040d2f6..a52f748 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-10  Morten Welinder  <terra gnome org>
+
+       * src/hlink.c (gnm_hlink_get_name_target)
+       (gnm_hlink_get_range_target): New functions.
+       (gnm_hlink_cur_wb_activate): Use gnm_hlink_get_range_target.
+
 2017-03-07  Morten Welinder  <terra gnome org>
 
        * src/parser.y (parser_simple_name): Extract from
diff --git a/src/hlink.c b/src/hlink.c
index 70d66a8..4d6af13 100644
--- a/src/hlink.c
+++ b/src/hlink.c
@@ -36,6 +36,7 @@
 #include "position.h"
 #include "expr-name.h"
 #include "expr.h"
+#include "expr-impl.h"
 #include "value.h"
 #include "mstyle.h"
 
@@ -236,44 +237,34 @@ typedef struct {
 } GnmHLinkCurWB;
 #define GNM_HLINK_CUR_WB(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), gnm_hlink_cur_wb_get_type (), GnmHLinkCurWB))
 
+#define GNM_IS_HLINK_CUR_WB(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), gnm_hlink_cur_wb_get_type ()))
+
+
 static GObjectClass *gnm_hlink_cur_wb_parent_class;
 
 static gboolean
 gnm_hlink_cur_wb_activate (GnmHLink *lnk, WBCGtk *wbcg)
 {
-       GnmHLinkCurWB *hlcwb = (GnmHLinkCurWB *)lnk;
        WorkbookControl *wbc = GNM_WBC (wbcg);
-       GnmExprTop const *texpr = hlcwb->dep.texpr;
-       GnmValue *vr;
-       GnmRangeRef const *r;
-       GnmCellPos tmp;
-       Sheet *target_sheet;
        SheetView *sv;
+       GnmSheetRange sr;
 
-       if (!texpr) {
-               go_cmd_context_error_invalid (GO_CMD_CONTEXT (wbcg),
-                       _("Link target"), _("(none)"));
+       if (!gnm_hlink_get_range_target (lnk, &sr)) {
+               go_cmd_context_error_invalid
+                       (GO_CMD_CONTEXT (wbcg),
+                        _("Link target"),
+                        lnk->target ? lnk->target : "-");
                return FALSE;
        }
 
-       vr = gnm_expr_top_get_range (texpr);
-       if (!vr) {
-               go_cmd_context_error_invalid (GO_CMD_CONTEXT (wbcg),
-                       _("Link target"), lnk->target);
-               return FALSE;
-       }
+       sv = sheet_get_view (sr.sheet,  wb_control_view (wbc));
+       sv_selection_set (sv, &sr.range.start,
+                         sr.range.start.col, sr.range.start.row,
+                         sr.range.end.col, sr.range.end.row);
+       sv_make_cell_visible (sv, sr.range.start.col, sr.range.start.row, FALSE);
+       if (wbcg_cur_sheet (wbcg) != sr.sheet)
+               wb_view_sheet_focus (wb_control_view (wbc), sr.sheet);
 
-       r = value_get_rangeref (vr);
-       tmp.col = r->a.col;
-       tmp.row = r->a.row;
-
-       target_sheet = r->a.sheet ? r->a.sheet : lnk->sheet;
-       sv = sheet_get_view (target_sheet,  wb_control_view (wbc));
-       sv_selection_set (sv, &tmp, r->a.col, r->a.row, r->b.col, r->b.row);
-       sv_make_cell_visible (sv, r->a.col, r->a.row, FALSE);
-       if (wbcg_cur_sheet (wbcg) != target_sheet)
-               wb_view_sheet_focus (wb_control_view (wbc), target_sheet);
-       value_release (vr);
        return TRUE;
 }
 
@@ -377,6 +368,76 @@ gnm_hlink_cur_wb_class_init (GObjectClass *object_class)
 GSF_CLASS (GnmHLinkCurWB, gnm_hlink_cur_wb,
           gnm_hlink_cur_wb_class_init, gnm_hlink_cur_wb_init,
           GNM_HLINK_TYPE)
+#if 0
+;
+#endif
+
+
+/**
+ * gnm_hlink_get_range_target:
+ * @lnk: the hyperlink to query
+ * @sr: location to start link target range
+ *
+ * This function determines the location that a link points to.  It will
+ * resolve names.
+ *
+ * Returns: %TRUE, if the link refers to a range.
+ */
+gboolean
+gnm_hlink_get_range_target (GnmHLink const *lnk, GnmSheetRange *sr)
+{
+       GnmHLinkCurWB *hlcwb;
+       GnmExprTop const *texpr;
+       GnmValue *vr;
+       GnmRangeRef const *r;
+       GnmParsePos pp;
+       Sheet *start_sheet, *end_sheet;
+
+       g_return_val_if_fail (GNM_IS_HLINK (lnk), FALSE);
+
+       if (!GNM_IS_HLINK_CUR_WB (lnk))
+               return FALSE;
+
+       hlcwb = (GnmHLinkCurWB *)lnk;
+       texpr = hlcwb->dep.texpr;
+       if (!texpr)
+               return FALSE;
+       vr = gnm_expr_top_get_range (texpr);
+       if (!vr)
+               return FALSE;
+       r = value_get_rangeref (vr);
+
+       parse_pos_init_sheet (&pp, lnk->sheet);
+       gnm_rangeref_normalize_pp (r, &pp, &start_sheet, &end_sheet,
+                                  &sr->range);
+       sr->sheet = start_sheet;
+       value_release (vr);
+
+       return TRUE;
+}
+
+
+GnmNamedExpr const *
+gnm_hlink_get_name_target (GnmHLink const *lnk)
+{
+       GnmHLinkCurWB *hlcwb;
+       GnmExprTop const *texpr;
+
+       g_return_val_if_fail (GNM_IS_HLINK (lnk), FALSE);
+
+       if (!GNM_IS_HLINK_CUR_WB (lnk))
+               return FALSE;
+
+       hlcwb = (GnmHLinkCurWB *)lnk;
+       texpr = hlcwb->dep.texpr;
+
+       if (!texpr || GNM_EXPR_GET_OPER (texpr->expr) != GNM_EXPR_OP_NAME)
+               return FALSE;
+
+       return texpr->expr->name.name;
+}
+
+
 
 /***************************************************************************/
 /* Link to arbitrary urls */
diff --git a/src/hlink.h b/src/hlink.h
index a7b9bfc..66a5aea 100644
--- a/src/hlink.h
+++ b/src/hlink.h
@@ -39,6 +39,10 @@ GType gnm_hlink_url_get_type (void);
 GType gnm_hlink_email_get_type (void);
 GType gnm_hlink_external_get_type (void);
 
+// For internal links only
+gboolean gnm_hlink_get_range_target (GnmHLink const *lnk, GnmSheetRange *sr);
+GnmNamedExpr const *gnm_hlink_get_name_target (GnmHLink const *lnk);
+
 /* Protected. */
 void _gnm_hlink_init (void);
 
diff --git a/src/position.c b/src/position.c
index c53a816..18329af 100644
--- a/src/position.c
+++ b/src/position.c
@@ -560,12 +560,6 @@ gnm_rangeref_get_type (void)
        return t;
 }
 
-/**
- * gnm_rangeref_normalize:
- *
- * Take a range_ref and normalize it by converting to absolute coords and handling
- * inversions.
- */
 void
 gnm_rangeref_normalize_pp (GnmRangeRef const *ref, GnmParsePos const *pp,
                           Sheet **start_sheet, Sheet **end_sheet,
@@ -590,6 +584,12 @@ gnm_rangeref_normalize_pp (GnmRangeRef const *ref, GnmParsePos const *pp,
        range_normalize (dest);
 }
 
+/**
+ * gnm_rangeref_normalize:
+ *
+ * Take a range_ref and normalize it by converting to absolute coords and
+ * handling inversions.
+ */
 void
 gnm_rangeref_normalize (GnmRangeRef const *ref, GnmEvalPos const *ep,
                        Sheet **start_sheet, Sheet **end_sheet, GnmRange *dest)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]