diff --git a/components/fpspreadsheet/source/common/fpsopendocument.pas b/components/fpspreadsheet/source/common/fpsopendocument.pas index 43457c4ac..0a3542497 100644 --- a/components/fpspreadsheet/source/common/fpsopendocument.pas +++ b/components/fpspreadsheet/source/common/fpsopendocument.pas @@ -7271,6 +7271,9 @@ var r1,c1,r2,c2: Cardinal; roffs1,coffs1, roffs2, coffs2: Double; x, y, w, h: Double; + xml: String; + target, bookmark: String; + u: TURI; begin if (ASheet as TsWorksheet).GetImageCount = 0 then exit; @@ -7290,7 +7293,7 @@ begin roffs1, coffs1, roffs2, coffs2, // mm x, y, w, h); // mm - AppendToStream(AStream, Format( + xml := Format( ' '' then begin + SplitHyperlink(img.HyperlinkTarget, target, bookmark); + if (target <> '') and (pos('file:', target) = 0) then + begin + u := ParseURI(target); + if u.Protocol = '' then + target := '../' + target; + end; + + // ods absolutely wants "/" path delimiters in the file uri! + FixHyperlinkPathdelims(target); + + if (bookmark <> '') then + target := target + '#' + bookmark; + + xml := Format('%s', [target, xml]); + end; + + AppendToStream(AStream, xml); end; AppendToStream(AStream, diff --git a/components/fpspreadsheet/source/common/fpspreadsheet.pas b/components/fpspreadsheet/source/common/fpspreadsheet.pas index 35e273327..a01cf5bc8 100644 --- a/components/fpspreadsheet/source/common/fpspreadsheet.pas +++ b/components/fpspreadsheet/source/common/fpspreadsheet.pas @@ -555,6 +555,8 @@ type function WriteImage(ARow, ACol: Cardinal; AImageIndex: Integer; AOffsetX: Double = 0.0; AOffsetY: Double = 0.0; AScaleX: Double = 1.0; AScaleY: Double = 1.0): Integer; overload; + procedure AddHyperlinkToImage(AImageIndex: Integer; ATarget: String; + AToolTip: String = ''); { Protection } procedure Protect(AEnable: Boolean); @@ -4017,6 +4019,20 @@ begin Result := FImages.Add(img); end; +{@@ Assigns a hyperlink to an image. The image is specified by its index in the + internal image list} +procedure TsWorksheet.AddHyperlinkToImage(AImageIndex: Integer; ATarget: String; + AToolTip: String = ''); +var + img: PsImage; +begin + img := GetPointerToImage(AImageIndex); + if Assigned(img) then begin + img^.HyperlinkTarget := ATarget; + img^.HyperlinkToolTip := AToolTip; + end; +end; + {@@ ---------------------------------------------------------------------------- Removes an image from the internal image list. The image is identified by its index. @@ -4027,7 +4043,11 @@ var img: PsImage; begin img := PsImage(FImages[AIndex]); - if (img <> nil) and (img^.Bitmap <> nil) then img^.Bitmap.Free; + if (img <> nil) then begin + if (img^.Bitmap <> nil) then img^.Bitmap.Free; + img^.HyperlinkTarget := ''; + img^.HyperlinkToolTip := ''; + end; Dispose(img); FImages.Delete(AIndex); end; diff --git a/components/fpspreadsheet/source/common/fpstypes.pas b/components/fpspreadsheet/source/common/fpstypes.pas index 2abd17fa4..43a351c2e 100644 --- a/components/fpspreadsheet/source/common/fpstypes.pas +++ b/components/fpspreadsheet/source/common/fpstypes.pas @@ -823,6 +823,8 @@ type OffsetX, OffsetY: Double; // mm, relative to anchor ScaleX, ScaleY: Double; // scaling factor of image Bitmap: TObject; // used for bitmap for display in grid + HyperlinkTarget: String; // Hyperlink assigned to the image + HyperlinkToolTip: String; // Tooltip for hyperlink of the image end; PsImage = ^TsImage; diff --git a/components/fpspreadsheet/source/common/fpsutils.pas b/components/fpspreadsheet/source/common/fpsutils.pas index 7cec861ce..f045b75d8 100644 --- a/components/fpspreadsheet/source/common/fpsutils.pas +++ b/components/fpspreadsheet/source/common/fpsutils.pas @@ -2495,6 +2495,8 @@ begin AValue.ScaleY := AScaleY; AValue.Bitmap := nil; // to be initialized by viewing application AValue.Index := -1; + AValue.HyperlinkTarget := ''; + AValue.HyperlinkToolTip := ''; end; {@@ ----------------------------------------------------------------------------