summaryrefslogtreecommitdiffstats
path: root/sc/source/ui/inc/output.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/inc/output.hxx')
-rw-r--r--sc/source/ui/inc/output.hxx388
1 files changed, 388 insertions, 0 deletions
diff --git a/sc/source/ui/inc/output.hxx b/sc/source/ui/inc/output.hxx
new file mode 100644
index 000000000..d44f70525
--- /dev/null
+++ b/sc/source/ui/inc/output.hxx
@@ -0,0 +1,388 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <address.hxx>
+#include <cellvalue.hxx>
+#include <tools/color.hxx>
+#include <tools/fract.hxx>
+#include <tools/gen.hxx>
+#include <editeng/svxenum.hxx>
+#include <vcl/outdev.hxx>
+#include <tools/degree.hxx>
+#include <o3tl/deleter.hxx>
+#include <optional>
+
+namespace sc {
+ class SpellCheckContext;
+}
+
+namespace editeng {
+ struct MisspellRanges;
+}
+namespace drawinglayer::processor2d { class BaseProcessor2D; }
+
+namespace vcl { class Font; }
+class EditEngine;
+class ScDocument;
+class ScPatternAttr;
+struct RowInfo;
+struct ScTableInfo;
+class ScTabViewShell;
+class ScPageBreakData;
+class FmFormView;
+class ScFieldEditEngine;
+class SdrPaintWindow;
+
+#define SC_SCENARIO_HSPACE 60
+#define SC_SCENARIO_VSPACE 50
+
+enum ScOutputType { OUTTYPE_WINDOW, OUTTYPE_PRINTER };
+
+class ClearableClipRegion;
+typedef std::unique_ptr<ClearableClipRegion, o3tl::default_delete<ClearableClipRegion>> ClearableClipRegionPtr;
+
+/// Describes reference mark to be drawn, position & size in TWIPs
+struct ReferenceMark {
+ tools::Long nX;
+ tools::Long nY;
+ tools::Long nWidth;
+ tools::Long nHeight;
+ tools::Long nTab;
+ Color aColor;
+
+ ReferenceMark()
+ : nX( 0 )
+ , nY( 0 )
+ , nWidth( 0 )
+ , nHeight( 0 )
+ , nTab( 0 )
+ , aColor( COL_AUTO ) {}
+
+ ReferenceMark( tools::Long aX,
+ tools::Long aY,
+ tools::Long aWidth,
+ tools::Long aHeight,
+ tools::Long aTab,
+ const Color& rColor )
+ : nX( aX )
+ , nY( aY )
+ , nWidth( aWidth )
+ , nHeight( aHeight )
+ , nTab( aTab )
+ , aColor( rColor ) {}
+
+ bool Is() const { return ( nWidth > 0 && nHeight > 0 ); }
+};
+
+class ScOutputData
+{
+friend class ScDrawStringsVars;
+friend class ScGridWindow;
+private:
+ struct OutputAreaParam
+ {
+ tools::Rectangle maAlignRect;
+ tools::Rectangle maClipRect;
+ tools::Long mnColWidth;
+ tools::Long mnLeftClipLength; /// length of the string getting cut off on the left.
+ tools::Long mnRightClipLength; /// length of the string getting cut off on the right.
+ bool mbLeftClip;
+ bool mbRightClip;
+ };
+
+ class DrawEditParam
+ {
+ public:
+ SvxCellHorJustify meHorJustAttr; ///< alignment attribute
+ SvxCellHorJustify meHorJustContext; ///< context depending on attribute, content and direction
+ SvxCellHorJustify meHorJustResult; ///< result for EditEngine
+ SvxCellVerJustify meVerJust;
+ SvxCellJustifyMethod meHorJustMethod;
+ SvxCellJustifyMethod meVerJustMethod;
+ SvxCellOrientation meOrient;
+ SCSIZE mnArrY;
+ SCCOL mnX;
+ SCCOL mnCellX;
+ SCROW mnCellY;
+ tools::Long mnPosX;
+ tools::Long mnPosY;
+ tools::Long mnInitPosX;
+ bool mbBreak:1;
+ bool mbCellIsValue:1;
+ bool mbAsianVertical:1;
+ bool mbPixelToLogic:1;
+ bool mbHyphenatorSet:1;
+ ScFieldEditEngine* mpEngine;
+ ScRefCellValue maCell;
+ const ScPatternAttr* mpPattern;
+ const SfxItemSet* mpCondSet;
+ const SfxItemSet* mpPreviewFontSet;
+ const ScPatternAttr* mpOldPattern;
+ const SfxItemSet* mpOldCondSet;
+ const SfxItemSet* mpOldPreviewFontSet;
+ RowInfo* mpThisRowInfo;
+ const std::vector<editeng::MisspellRanges>* mpMisspellRanges;
+
+ explicit DrawEditParam(const ScPatternAttr* pPattern, const SfxItemSet* pCondSet, bool bCellIsValue);
+
+ bool readCellContent(const ScDocument* pDoc, bool bShowNullValues, bool bShowFormulas, bool bSyntaxMode, bool bUseStyleColor, bool bForceAutoColor, bool& rWrapFields);
+ void setPatternToEngine(bool bUseStyleColor);
+ void calcMargins(tools::Long& rTop, tools::Long& rLeft, tools::Long& rBottom, tools::Long& rRight, double nPPTX, double nPPTY) const;
+ void calcPaperSize(Size& rPaperSize, const tools::Rectangle& rAlignRect, double nPPTX, double nPPTY) const;
+ void getEngineSize(ScFieldEditEngine* pEngine, tools::Long& rWidth, tools::Long& rHeight) const;
+ bool hasLineBreak() const;
+ bool isHyperlinkCell() const;
+
+ /**
+ * When the text is vertically oriented, the text is either rotated 90
+ * degrees to the right or 90 degrees to the left. Note that this is
+ * different from being vertically stacked.
+ */
+ bool isVerticallyOriented() const;
+
+ /**
+ * Calculate offset position for vertically oriented (either
+ * top-bottom or bottom-top orientation) text.
+ *
+ * @param rLogicStart initial position in pixels. When the call is
+ * finished, this parameter will store the new
+ * position.
+ */
+ void calcStartPosForVertical(Point& rLogicStart, tools::Long nCellWidth, tools::Long nEngineWidth, tools::Long nTopM, const OutputDevice* pRefDevice);
+
+ void setAlignmentToEngine();
+ bool adjustHorAlignment(ScFieldEditEngine* pEngine);
+ void adjustForHyperlinkInPDF(Point aURLStart, const OutputDevice* pDev);
+ };
+
+ VclPtr<OutputDevice> mpDev; // Device
+ VclPtr<OutputDevice> mpRefDevice; // printer if used for preview
+ VclPtr<OutputDevice> pFmtDevice; // reference for text formatting
+ ScTableInfo& mrTabInfo;
+ RowInfo* pRowInfo; // Info block
+ SCSIZE nArrCount; // occupied lines in info block
+ ScDocument* mpDoc; // Document
+ SCTAB nTab; // sheet
+ tools::Long nScrX; // Output Startpos. (Pixel)
+ tools::Long nScrY;
+ tools::Long nScrW; // Output size (Pixel)
+ tools::Long nScrH;
+ tools::Long nMirrorW; // Visible output width for mirroring (default: nScrW)
+ SCCOL nX1; // Start-/End coordinates
+ SCROW nY1; // ( incl. hidden )
+ SCCOL nX2;
+ SCROW nY2;
+ SCCOL nVisX1; // Start-/End coordinates
+ SCROW nVisY1; // ( visible range )
+ SCCOL nVisX2;
+ SCROW nVisY2;
+ ScOutputType eType; // Screen/Printer ...
+ double mnPPTX; // Pixel per Twips
+ double mnPPTY;
+ Fraction aZoomX;
+ Fraction aZoomY;
+
+ ScTabViewShell* pViewShell; // for connect from visible plug-ins
+
+ FmFormView* pDrawView; // SdrView to paint to
+
+ bool bEditMode; // InPlace edited cell - do not output
+ SCCOL nEditCol;
+ SCROW nEditRow;
+
+ bool bMetaFile; // Output to metafile (not pixels!)
+
+ bool bPagebreakMode; // Page break preview
+ bool bSolidBackground; // white instead of transparent
+
+ bool mbUseStyleColor;
+ bool mbForceAutoColor;
+
+ bool mbSyntaxMode; // Syntax highlighting
+ std::optional<Color> mxValueColor;
+ std::optional<Color> mxTextColor;
+ std::optional<Color> mxFormulaColor;
+
+ Color aGridColor;
+
+ bool mbShowNullValues;
+ bool mbShowFormulas;
+ bool bShowSpellErrors; // Show spelling errors in EditObjects
+ bool bMarkClipped;
+
+ bool bSnapPixel;
+
+ bool bAnyClipped; // internal
+ bool bVertical;
+ bool bTabProtected;
+ bool bLayoutRTL;
+
+ // #i74769# use SdrPaintWindow direct, remember it during BeginDrawLayers/EndDrawLayers
+ SdrPaintWindow* mpTargetPaintWindow;
+ const sc::SpellCheckContext* mpSpellCheckCxt;
+
+ // private methods
+
+ bool GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
+ SCCOL& rOverX, SCROW& rOverY, bool bVisRowChanged );
+ bool IsEmptyCellText( const RowInfo* pThisRowInfo, SCCOL nX, SCROW nY );
+ void GetVisibleCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScRefCellValue& rCell );
+
+ bool IsAvailable( SCCOL nX, SCROW nY );
+
+ void GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, tools::Long nPosY,
+ SCCOL nCellX, SCROW nCellY, tools::Long nNeeded,
+ const ScPatternAttr& rPattern,
+ sal_uInt16 nHorJustify, bool bCellIsValue,
+ bool bBreak, bool bOverwrite,
+ OutputAreaParam& rParam );
+
+ void ShrinkEditEngine( EditEngine& rEngine, const tools::Rectangle& rAlignRect,
+ tools::Long nLeftM, tools::Long nTopM, tools::Long nRightM, tools::Long nBottomM,
+ bool bWidth, SvxCellOrientation nOrient, Degree100 nAttrRotate, bool bPixelToLogic,
+ tools::Long& rEngineWidth, tools::Long& rEngineHeight, tools::Long& rNeededPixel,
+ bool& rLeftClip, bool& rRightClip );
+
+ void SetSyntaxColor( vcl::Font* pFont, const ScRefCellValue& rCell );
+ void SetEditSyntaxColor( EditEngine& rEngine, const ScRefCellValue& rCell );
+
+ double GetStretch() const;
+
+ void DrawRotatedFrame(vcl::RenderContext& rRenderContext); // pixel
+
+ std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> CreateProcessor2D( );
+
+ void DrawEditStandard(DrawEditParam& rParam);
+ void DrawEditBottomTop(DrawEditParam& rParam);
+ void DrawEditTopBottom(DrawEditParam& rParam);
+ void DrawEditStacked(DrawEditParam& rParam);
+ void DrawEditAsianVertical(DrawEditParam& rParam);
+
+ std::unique_ptr<ScFieldEditEngine> CreateOutputEditEngine();
+
+ void ShowClipMarks( DrawEditParam& rParam, tools::Long nEngineWidth, const Size& aCellSize,
+ bool bMerged, OutputAreaParam& aAreaParam, bool bTop );
+
+ ClearableClipRegionPtr Clip(DrawEditParam& rParam, const Size& aCellSize, OutputAreaParam& aAreaParam,
+ tools::Long nEngineWidth, bool bWrapFields, bool bTop);
+
+ bool AdjustAreaParamClipRect(OutputAreaParam& rAreaParam);
+ tools::Long SetEngineTextAndGetWidth( DrawEditParam& rParam, const OUString& rSetString,
+ tools::Long& rNeededPixel, tools::Long nAddWidthPixels );
+
+ // Check for and set cell rotations at OutputData to have it available
+ // in the svx tooling to render the borders. Moved to private section
+ // and the single call to end of constructor to be sure this always happens
+ void SetCellRotations();
+
+public:
+
+ /**
+ * @param nNewScrX: X-Offset in the output device for the table
+ * @param nNewScrY: Y-Offset in the output device for the table
+ *
+ */
+ ScOutputData( OutputDevice* pNewDev, ScOutputType eNewType,
+ ScTableInfo& rTabInfo, ScDocument* pNewDoc,
+ SCTAB nNewTab, tools::Long nNewScrX, tools::Long nNewScrY,
+ SCCOL nNewX1, SCROW nNewY1, SCCOL nNewX2, SCROW nNewY2,
+ double nPixelPerTwipsX, double nPixelPerTwipsY,
+ const Fraction* pZoomX = nullptr,
+ const Fraction* pZoomY = nullptr );
+
+ ~ScOutputData();
+
+ void SetSpellCheckContext( const sc::SpellCheckContext* pCxt );
+ void SetContentDevice( OutputDevice* pContentDev );
+
+ void SetRefDevice( OutputDevice* pRDev ) { mpRefDevice = pFmtDevice = pRDev; }
+ void SetFmtDevice( OutputDevice* pRDev ) { pFmtDevice = pRDev; }
+ void SetViewShell( ScTabViewShell* pSh ) { pViewShell = pSh; }
+
+ void SetDrawView( FmFormView* pNew ) { pDrawView = pNew; }
+
+ void SetSolidBackground( bool bSet ) { bSolidBackground = bSet; }
+ void SetUseStyleColor( bool bSet ) { mbUseStyleColor = bSet; }
+
+ void SetEditCell( SCCOL nCol, SCROW nRow );
+ void SetSyntaxMode( bool bNewMode );
+ void SetMetaFileMode( bool bNewMode );
+ void SetGridColor( const Color& rColor );
+ void SetMarkClipped( bool bSet );
+ void SetShowNullValues ( bool bSet );
+ void SetShowFormulas ( bool bSet );
+ void SetShowSpellErrors( bool bSet );
+ void SetMirrorWidth( tools::Long nNew );
+ tools::Long GetScrW() const { return nScrW; }
+ tools::Long GetScrH() const { return nScrH; }
+
+ void SetSnapPixel();
+
+ void DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool bPage, bool bMergeCover = false);
+ void DrawStrings( bool bPixelToLogic = false );
+
+ /// Draw all strings, or provide Rectangle where the text (defined by rAddress) would be drawn.
+ tools::Rectangle LayoutStrings(bool bPixelToLogic, bool bPaint = true, const ScAddress &rAddress = ScAddress());
+
+ void DrawDocumentBackground();
+ void DrawBackground(vcl::RenderContext& rRenderContext);
+ void DrawShadow();
+ void DrawExtraShadow(bool bLeft, bool bTop, bool bRight, bool bBottom);
+ void DrawFrame(vcl::RenderContext& rRenderContext);
+
+ // with logic MapMode set!
+ void DrawEdit(bool bPixelToLogic);
+ void DrawRotated(bool bPixelToLogic); // logical
+
+ void DrawClear();
+
+ // #i72502# printer only command set
+ Point PrePrintDrawingLayer(tools::Long nLogStX, tools::Long nLogStY );
+ void PostPrintDrawingLayer(const Point& rMMOffset); // #i74768# need offset for FormLayer
+ void PrintDrawingLayer(SdrLayerID nLayer, const Point& rMMOffset);
+
+ // only screen:
+ void DrawSelectiveObjects(SdrLayerID nLayer);
+
+ bool SetChangedClip(); // sal_False = not
+ vcl::Region GetChangedAreaRegion();
+
+ void FindChanged();
+ void SetPagebreakMode( ScPageBreakData* pPageData );
+ /// Draws reference mark and returns its properties
+ void DrawRefMark( SCCOL nRefStartX, SCROW nRefStartY,
+ SCCOL nRefEndX, SCROW nRefEndY,
+ const Color& rColor, bool bHandle );
+ ReferenceMark FillReferenceMark( SCCOL nRefStartX, SCROW nRefStartY,
+ SCCOL nRefEndX, SCROW nRefEndY,
+ const Color& rColor );
+ void DrawOneChange( SCCOL nRefStartX, SCROW nRefStartY,
+ SCCOL nRefEndX, SCROW nRefEndY,
+ const Color& rColor, sal_uInt16 nType );
+ void DrawChangeTrack();
+ void DrawClipMarks();
+
+ void DrawNoteMarks(vcl::RenderContext& rRenderContext);
+ void AddPDFNotes();
+ void DrawSparklines(vcl::RenderContext& rRenderContext);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */