office-gobmx/sc/inc/editutil.hxx
Eike Rathke 2af1f5691e resolved fdo#35756 import more than 64k HTML table cells
Enhanced EditEngine to be able to hold more than 64k paragraphs. Used
also in RTF import Calc and Writer, so that could benefit as well.

* changed all EditEngine,Outliner,... related paragraph index/count
  variables from sal_uInt16 to sal_Int32
  * sal_Int32 instead of sal_uInt32 to match accessibility API
  * matched some Outliner methods' paragraph parameters from sal_uLong
    to sal_Int32
  * containers capable to hold size_t nevertheless are limited to a
    maximum of sal_Int32
* changed definition of EE_PARA_NOT_FOUND and EE_PARA_ALL to
  SAL_MAX_INT32
+ added EE_PARA_MAX_COUNT and EE_TEXTPOS_MAX_COUNT to initialize
  ESelection with what previously were hard coded 0xFFFF all over the
  place
+ for similar reason added EE_TEXTPOS_ALL corresponding to EE_PARA_ALL
  to initialize an ESelection spanning all available text like
  aSel(0,0,EE_PARA_ALL,EE_TEXTPOS_ALL)

Change-Id: I62d1b9c399cd709a4f93dbac31b219a61c46ec00
Reviewed-on: https://gerrit.libreoffice.org/3838
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
2013-05-10 14:01:38 +00:00

251 lines
9 KiB
C++

/* -*- 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 .
*/
#ifndef SC_EDITUTIL_HXX
#define SC_EDITUTIL_HXX
#include "scdllapi.h"
#include "address.hxx"
#include <editeng/editeng.hxx>
#include <svx/pageitem.hxx>
#include <tools/date.hxx>
#include <tools/time.hxx>
#include <tools/gen.hxx>
#include <tools/fract.hxx>
class OutputDevice;
class ScDocument;
class ScPatternAttr;
class ScEditEngineDefaulter;
class ScEditUtil
{
ScDocument* pDoc;
SCCOL nCol;
SCROW nRow;
SCTAB nTab;
Point aScrPos;
OutputDevice* pDev; // MapMode has to be set
double nPPTX;
double nPPTY;
Fraction aZoomX;
Fraction aZoomY;
static const char pCalcDelimiters[];
public:
static String ModifyDelimiters( const String& rOld );
/// Retrieves string with paragraphs delimited by spaces
static String GetSpaceDelimitedString( const EditEngine& rEngine );
/// Retrieves string with paragraphs delimited by new lines ('\n').
static String GetMultilineString( const EditEngine& rEngine );
SC_DLLPUBLIC static OUString GetString( const EditTextObject& rEditText );
static EditTextObject* CreateURLObjectFromURL(
ScDocument& rDoc, const OUString& rURL, const OUString& rText );
static void RemoveCharAttribs( EditTextObject& rEditText, const ScPatternAttr& rAttr );
public:
ScEditUtil( ScDocument* pDocument, SCCOL nX, SCROW nY, SCTAB nZ,
const Point& rScrPosPixel,
OutputDevice* pDevice, double nScaleX, double nScaleY,
const Fraction& rX, const Fraction& rY ) :
pDoc(pDocument),nCol(nX),nRow(nY),nTab(nZ),
aScrPos(rScrPosPixel),pDev(pDevice),
nPPTX(nScaleX),nPPTY(nScaleY),aZoomX(rX),aZoomY(rY) {}
Rectangle GetEditArea( const ScPatternAttr* pPattern, sal_Bool bForceToTop );
};
class ScEditAttrTester
{
ScEditEngineDefaulter* pEngine;
SfxItemSet* pEditAttrs;
sal_Bool bNeedsObject;
sal_Bool bNeedsCellAttr;
public:
ScEditAttrTester( ScEditEngineDefaulter* pEng );
~ScEditAttrTester();
sal_Bool NeedsObject() const { return bNeedsObject; }
sal_Bool NeedsCellAttr() const { return bNeedsCellAttr; }
const SfxItemSet& GetAttribs() const { return *pEditAttrs; }
};
// construct pool before constructing EditEngine, destroy pool after EditEngine
class ScEnginePoolHelper
{
protected:
SfxItemPool* pEnginePool;
SfxItemSet* pDefaults;
sal_Bool bDeleteEnginePool;
sal_Bool bDeleteDefaults;
ScEnginePoolHelper( SfxItemPool* pEnginePool,
sal_Bool bDeleteEnginePool = false );
ScEnginePoolHelper( const ScEnginePoolHelper& rOrg );
virtual ~ScEnginePoolHelper();
};
class SC_DLLPUBLIC ScEditEngineDefaulter : public ScEnginePoolHelper, public EditEngine
{
private:
using EditEngine::SetText;
public:
/// bDeleteEnginePool: Engine becomes the owner of the pool
/// and deletes it on destruction
ScEditEngineDefaulter( SfxItemPool* pEnginePool,
sal_Bool bDeleteEnginePool = false );
/// If rOrg.bDeleteEnginePool: pool gets cloned and will be
/// deleted on destruction. Defaults are not set.
ScEditEngineDefaulter( const ScEditEngineDefaulter& rOrg );
virtual ~ScEditEngineDefaulter();
/// Creates a copy of SfxItemSet if bRememberCopy set
void SetDefaults( const SfxItemSet& rDefaults, sal_Bool bRememberCopy = sal_True );
/// Becomes the owner of the SfxItemSet if bTakeOwnership set
void SetDefaults( SfxItemSet* pDefaults, sal_Bool bTakeOwnership = sal_True );
/// Set the item in the default ItemSet which is created
/// if it doesn't exist yet.
/// The default ItemSet is then applied to each paragraph.
void SetDefaultItem( const SfxPoolItem& rItem );
/// Returns the stored defaults, used to find non-default character attributes
const SfxItemSet& GetDefaults();
/// Overwritten method to be able to apply defaults already set
void SetText( const EditTextObject& rTextObject );
/// Current defaults are not applied, new defaults are applied
void SetTextNewDefaults( const EditTextObject& rTextObject,
const SfxItemSet& rDefaults, sal_Bool bRememberCopy = sal_True );
/// Current defaults are not applied, new defaults are applied
void SetTextNewDefaults( const EditTextObject& rTextObject,
SfxItemSet* pDefaults, sal_Bool bTakeOwnership = sal_True );
/// Overwritten method to be able to apply defaults already set
void SetText( const OUString& rText );
/// Current defaults are not applied, new defaults are applied
void SetTextNewDefaults( const String& rText,
const SfxItemSet& rDefaults, sal_Bool bRememberCopy = sal_True );
/// Current defaults are not applied, new defaults are applied
void SetTextNewDefaults( const String& rText,
SfxItemSet* pDefaults, sal_Bool bTakeOwnership = sal_True );
/// Paragraph attributes that are not defaults are copied to
/// character attributes and all paragraph attributes reset
void RemoveParaAttribs();
/// Re-apply existing defaults if set, same as in SetText,
/// but without EnableUndo/SetUpdateMode.
void RepeatDefaults();
};
// 1/100 mm
class SC_DLLPUBLIC ScTabEditEngine : public ScEditEngineDefaulter
{
private:
void Init(const ScPatternAttr& rPattern);
public:
ScTabEditEngine( ScDocument* pDoc ); // Default
ScTabEditEngine( const ScPatternAttr& rPattern,
SfxItemPool* pEnginePool,
SfxItemPool* pTextObjectPool = NULL );
};
struct ScHeaderFieldData
{
String aTitle; // title or file name (if no title)
String aLongDocName; // path and file name
String aShortDocName; // pure file name
String aTabName;
Date aDate;
Time aTime;
long nPageNo;
long nTotalPages;
SvxNumType eNumType;
ScHeaderFieldData();
};
// for field commands (or just fields?) in a table
class SC_DLLPUBLIC ScFieldEditEngine : public ScEditEngineDefaulter
{
private:
ScDocument* mpDoc;
bool bExecuteURL;
public:
ScFieldEditEngine(
ScDocument* pDoc, SfxItemPool* pEnginePool, SfxItemPool* pTextObjectPool = NULL,
bool bDeleteEnginePool = false);
void SetExecuteURL(bool bSet) { bExecuteURL = bSet; }
virtual void FieldClicked( const SvxFieldItem& rField, sal_Int32, sal_uInt16 );
virtual OUString CalcFieldValue( const SvxFieldItem& rField, sal_Int32 nPara, sal_uInt16 nPos, Color*& rTxtColor, Color*& rFldColor );
};
// for headers/footers with fields
class SC_DLLPUBLIC ScHeaderEditEngine : public ScEditEngineDefaulter
{
private:
ScHeaderFieldData aData;
public:
ScHeaderEditEngine( SfxItemPool* pEnginePool, sal_Bool bDeleteEnginePool = false );
virtual OUString CalcFieldValue( const SvxFieldItem& rField, sal_Int32 nPara, sal_uInt16 nPos, Color*& rTxtColor, Color*& rFldColor );
void SetNumType(SvxNumType eNew) { aData.eNumType = eNew; }
void SetData(const ScHeaderFieldData& rNew) { aData = rNew; }
};
// for Note text objects.
class ScNoteEditEngine : public ScEditEngineDefaulter
{
public:
ScNoteEditEngine( SfxItemPool* pEnginePool,
SfxItemPool* pTextObjectPool = NULL,
sal_Bool bDeleteEnginePool = false );
};
// SvxFieldData derivations were moved to Svx (comment can be deleted?)
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */