Hi,
I have a fix for fdo#32786 [1] and here's the patch. As stated in the
commit message, I copied the fix from the OOo repository [2] changing
just a few data types to the 'sal_' types.
When I wanted to commit, git complained about remaining tabs and so I
also replaced them with spaces. That makes the patch look bigger than it
actually was, but I didn't see another way.
The actual changes in the patch are in line 20 (import) and from line
580 down (removed lcl_TransliterateEditEngine and changed
ScDocument::TransliterateText).
This is my first contribution to LO, so I'm open for your feedback :)
[1] https://bugs.freedesktop.org/show_bug.cgi?id=32786
[2] http://hg.services.openoffice.org/OOO340/rev/de0464b37fb3
From d0aecac0b523f2e55c6ebeb29843f0106bebecfe Mon Sep 17 00:00:00 2001
From: Samuel Mehrbrodt <s.mehrbrodt@googlemail.com>
Date: Wed, 8 Jun 2011 12:16:24 +0200
Subject: [PATCH] Fix for fdo#32786: 'Capitalise Every Word' function
This fix is based on http://hg.services.openoffice.org/OOO340/rev/de0464b37fb3
Also replaced remaining tabs with spaces
---
sc/source/core/data/documen8.cxx | 326 +++++++++++++++++---------------------
1 files changed, 145 insertions(+), 181 deletions(-)
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index c8e5fda..f08445a 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -62,6 +62,8 @@
#include <vcl/virdev.hxx>
#include <vcl/msgbox.hxx>
+#include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
+
#include "inputopt.hxx"
#include "global.hxx"
#include "table.hxx"
@@ -87,7 +89,7 @@
#include "chartlis.hxx"
#include "chartlock.hxx"
#include "refupdat.hxx"
-#include "validat.hxx" // fuer HasMacroCalls
+#include "validat.hxx" // fuer HasMacroCalls
#include "markdata.hxx"
#include "scmod.hxx"
#include "printopt.hxx"
@@ -100,11 +102,11 @@
#include "docuno.hxx"
#include "scresid.hxx"
-#define GET_SCALEVALUE(set,id) ((const SfxUInt16Item&)(set.Get( id ))).GetValue()
+#define GET_SCALEVALUE(set,id) ((const SfxUInt16Item&)(set.Get( id ))).GetValue()
-// states for online spelling in the visible range (0 is set initially)
-#define VSPL_START 0
-#define VSPL_DONE 1
+//states for online spelling in the visible range (0 is set initially)
+#define VSPL_START 0
+#define VSPL_DONE 1
// STATIC DATA -----------------------------------------------------------
@@ -164,9 +166,9 @@ void ScDocument::SetPrinter( SfxPrinter* pNewPrinter )
{
if ( pNewPrinter == pPrinter )
{
- // #i6706# SetPrinter is called with the same printer again if
- // the JobSetup has changed. In that case just call UpdateDrawPrinter
- // (SetRefDevice for drawing layer) because of changed text sizes.
+ //#i6706# SetPrinter is called with the same printer again if
+ //the JobSetup has changed. In that case just call UpdateDrawPrinter
+ //(SetRefDevice for drawing layer) because of changed text sizes.
UpdateDrawPrinter();
}
else
@@ -241,10 +243,10 @@ void ScDocument::ModifyStyleSheet( SfxStyleSheetBase& rStyleSheet,
{
case SFX_STYLE_FAMILY_PAGE:
{
- const sal_uInt16 nOldScale = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALE);
+ const sal_uInt16 nOldScale = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALE);
const sal_uInt16 nOldScaleToPages = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALETOPAGES);
rSet.Put( rChanges );
- const sal_uInt16 nNewScale = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALE);
+ const sal_uInt16 nNewScale = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALE);
const sal_uInt16 nNewScaleToPages = GET_SCALEVALUE(rSet,ATTR_PAGE_SCALETOPAGES);
if ( (nOldScale != nNewScale) || (nOldScaleToPages != nNewScaleToPages) )
@@ -286,9 +288,9 @@ void ScDocument::ModifyStyleSheet( SfxStyleSheetBase& rStyleSheet,
}
// Bedeutung der Items in rChanges:
- // Item gesetzt - Aenderung uebernehmen
- // Dontcare - Default setzen
- // Default - keine Aenderung
+ // Item gesetzt - Aenderung uebernehmen
+ // Dontcare - Default setzen
+ // Default - keine Aenderung
// ("keine Aenderung" geht nicht mit PutExtended, darum Schleife)
for (sal_uInt16 nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; nWhich++)
{
@@ -336,7 +338,7 @@ void ScDocument::InvalidateTextWidth( const String& rStyleName )
void ScDocument::InvalidateTextWidth( SCTAB nTab )
{
- ScAddress aAdrFrom( 0, 0, nTab );
+ ScAddress aAdrFrom( 0, 0, nTab );
ScAddress aAdrTo ( MAXCOL, MAXROW, nTab );
InvalidateTextWidth( &aAdrFrom, &aAdrTo, false );
}
@@ -345,7 +347,7 @@ void ScDocument::InvalidateTextWidth( SCTAB nTab )
sal_Bool ScDocument::IsPageStyleInUse( const String& rStrPageStyle, SCTAB* pInTab )
{
- sal_Bool bInUse = false;
+ sal_Bool bInUse = false;
const SCTAB nCount = GetTableCount();
SCTAB i;
@@ -447,28 +449,28 @@ void ScDocument::InvalidateTextWidth( const ScAddress* pAdrFrom, const
ScAddress
//------------------------------------------------------------------------
-#define CALCMAX 1000 // Berechnungen
-#define ABORT_EVENTS (INPUT_ANY & ~INPUT_TIMER & ~INPUT_OTHER)
+#define CALCMAX 1000 // Berechnungen
+#define ABORT_EVENTS (INPUT_ANY & ~INPUT_TIMER & ~INPUT_OTHER)
-sal_Bool ScDocument::IdleCalcTextWidth() // sal_True = demnaechst wieder
versuchen
+sal_Bool ScDocument::IdleCalcTextWidth() // sal_True = demnaechst wieder versuchen
{
// #i75610# if a printer hasn't been set or created yet, don't create one for this
if ( bIdleDisabled || IsInLinkUpdate() || GetPrinter(false) == NULL )
return false;
bIdleDisabled = sal_True;
- const sal_uLong nStart = Time::GetSystemTicks();
- OutputDevice* pDev = NULL;
- MapMode aOldMap;
- ScStyleSheet* pStyle = NULL;
- ScColumnIterator* pColIter = NULL;
- ScTable* pTable = NULL;
- ScColumn* pColumn = NULL;
- ScBaseCell* pCell = NULL;
- SCTAB nTab = aCurTextWidthCalcPos.Tab();
- SCROW nRow = aCurTextWidthCalcPos.Row();
- SCsCOL nCol = aCurTextWidthCalcPos.Col();
- sal_Bool bNeedMore= false;
+ const sal_uLong nStart = Time::GetSystemTicks();
+ OutputDevice* pDev = NULL;
+ MapMode aOldMap;
+ ScStyleSheet* pStyle = NULL;
+ ScColumnIterator* pColIter = NULL;
+ ScTable* pTable = NULL;
+ ScColumn* pColumn = NULL;
+ ScBaseCell* pCell = NULL;
+ SCTAB nTab = aCurTextWidthCalcPos.Tab();
+ SCROW nRow = aCurTextWidthCalcPos.Row();
+ SCsCOL nCol = aCurTextWidthCalcPos.Col();
+ sal_Bool bNeedMore= false;
if ( !ValidRow(nRow) )
nRow = 0, nCol--;
@@ -477,9 +479,9 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True =
demnaechst wieder versu
if ( !ValidTab(nTab) || !pTab[nTab] )
nTab = 0;
- // SearchMask/Family muss gemerkt werden,
- // damit z.B. der Organizer nicht durcheinanderkommt, wenn zwischendurch eine
- // Query-Box aufgemacht wird !!!
+ //SearchMask/Family muss gemerkt werden,
+ //damit z.B. der Organizer nicht durcheinanderkommt, wenn zwischendurch eine
+ //Query-Box aufgemacht wird !!!
ScStyleSheetPool* pStylePool = xPoolHelper->GetStylePool();
sal_uInt16 nOldMask = pStylePool->GetSearchMask();
@@ -499,16 +501,16 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True =
demnaechst wieder versu
sal_uInt16 nZoom = 0;
sal_uInt16 nCount = 0;
- nZoom = GET_SCALEVALUE(pStyle->GetItemSet(),ATTR_PAGE_SCALE);
+ nZoom = GET_SCALEVALUE(pStyle->GetItemSet(),ATTR_PAGE_SCALE);
Fraction aZoomFract( nZoom, 100 );
- pColumn = &pTable->aCol[nCol];
+ pColumn = &pTable->aCol[nCol];
pColIter = new ScColumnIterator( pColumn, nRow, MAXROW );
while ( (nZoom > 0) && (nCount < CALCMAX) && (nRestart < 2) )
{
if ( pColIter->Next( nRow, pCell ) )
{
- if ( TEXTWIDTH_DIRTY == pCell->GetTextWidth() )
+ if ( TEXTWIDTH_DIRTY == pCell->GetTextWidth() )
{
double nPPTX = 0.0;
double nPPTY = 0.0;
@@ -516,7 +518,7 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True =
demnaechst wieder versu
{
pDev = GetPrinter();
aOldMap = pDev->GetMapMode();
- pDev->SetMapMode( MAP_PIXEL ); // wichtig fuer GetNeededSize
+ pDev->SetMapMode( MAP_PIXEL ); // wichtig fuer GetNeededSize
Point aPix1000 = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP );
nPPTX = aPix1000.X() / 1000.0;
@@ -532,7 +534,7 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True =
demnaechst wieder versu
sal_uInt16 nNewWidth = (sal_uInt16)GetNeededSize( nCol, nRow, nTab,
pDev, nPPTX, nPPTY,
aZoomFract,aZoomFract, sal_True,
- sal_True ); // bTotalSize
+ sal_True ); // bTotalSize
pCell->SetTextWidth( nNewWidth );
@@ -632,7 +634,7 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True =
demnaechst wieder versu
class ScSpellStatus
{
public:
- sal_Bool bModified;
+ sal_Bool bModified;
ScSpellStatus() : bModified(false) {};
@@ -648,38 +650,38 @@ IMPL_LINK( ScSpellStatus, EventHdl, EditStatus *, pStatus )
return 0;
}
-// SPELL_MAXCELLS muss mindestens 256 sein, solange am Iterator keine
-// Start-Spalte gesetzt werden kann
+// SPELL_MAXCELLS muss mindestens 256 sein, solange am Iterator keine
+// Start-Spalte gesetzt werden kann
-//! SPELL_MAXTEST fuer Timer und Idle unterschiedlich ???
+// !SPELL_MAXTEST fuer Timer und Idle unterschiedlich ???
-// SPELL_MAXTEST now divided between visible and rest of document
+// SPELL_MAXTEST now divided between visible and rest of document
-#define SPELL_MAXTEST_VIS 1
-#define SPELL_MAXTEST_ALL 3
-#define SPELL_MAXCELLS 256
+#define SPELL_MAXTEST_VIS 1
+#define SPELL_MAXTEST_ALL 3
+#define SPELL_MAXCELLS 256
sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress& rSpellPos,
sal_uInt16 nMaxTest )
{
- ScEditEngineDefaulter* pEngine = NULL; //! am Dokument speichern
+ ScEditEngineDefaulter* pEngine = NULL; //! am Dokument speichern
SfxItemSet* pDefaults = NULL;
ScSpellStatus aStatus;
- sal_uInt16 nCellCount = 0; // Zellen insgesamt
- sal_uInt16 nTestCount = 0; // Aufrufe Spelling
- sal_Bool bChanged = false; // Aenderungen?
+ sal_uInt16 nCellCount = 0; // Zellen insgesamt
+ sal_uInt16 nTestCount = 0; // Aufrufe Spelling
+ sal_Bool bChanged = false; // Aenderungen?
- SCCOL nCol = rSpellRange.aStart.Col(); // iterator always starts on the left edge
+ SCCOL nCol = rSpellRange.aStart.Col();// iterator always starts on the left edge
SCROW nRow = rSpellPos.Row();
SCTAB nTab = rSpellPos.Tab();
- if ( !pTab[nTab] ) // sheet deleted?
+ if ( !pTab[nTab] ) // sheet deleted?
{
nTab = rSpellRange.aStart.Tab();
nRow = rSpellRange.aStart.Row();
if ( !pTab[nTab] )
{
- // may happen for visible range
+ // may happen for visible range
return false;
}
}
@@ -687,7 +689,7 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress&
rSpellRange.aStart.Col(), nRow,
rSpellRange.aEnd.Col(), rSpellRange.aEnd.Row() );
ScBaseCell* pCell = aIter.GetNext( nCol, nRow );
- // skip everything left of rSpellPos:
+ //skip everything left of rSpellPos:
while ( pCell && nRow == rSpellPos.Row() && nCol < rSpellPos.Col() )
pCell = aIter.GetNext( nCol, nRow );
@@ -702,13 +704,13 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange,
ScAddress&
{
if (!pEngine)
{
- // ScTabEditEngine is needed
- // because MapMode must be set for some old documents
+ // ScTabEditEngine is needed
+ // because MapMode must be set for some old documents
pEngine = new ScTabEditEngine( this );
pEngine->SetControlWord( pEngine->GetControlWord() |
( EE_CNTRL_ONLINESPELLING | EE_CNTRL_ALLOWBIGOBJS ) );
pEngine->SetStatusEventHdl( LINK( &aStatus, ScSpellStatus, EventHdl ) );
- // Delimiters hier wie in inputhdl.cxx !!!
+ // Delimiters hier wie in inputhdl.cxx !!!
pEngine->SetWordDelimiters(
ScEditUtil::ModifyDelimiters( pEngine->GetWordDelimiters() ) );
pDefaults = new SfxItemSet( pEngine->GetEmptyItemSet() );
@@ -720,7 +722,7 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress&
const ScPatternAttr* pPattern = GetPattern( nCol, nRow, nTab );
pPattern->FillEditItemSet( pDefaults );
- pEngine->SetDefaults( pDefaults, false ); //! noetig ?
+ pEngine->SetDefaults( pDefaults, false ); //! noetig ?
sal_uInt16 nCellLang = ((const SvxLanguageItem&)
pPattern->GetItem(ATTR_FONT_LANGUAGE)).GetValue();
@@ -739,9 +741,9 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress&
aStatus.bModified = false;
pEngine->CompleteOnlineSpelling();
- if ( aStatus.bModified ) // Fehler dazu oder weggekommen?
+ if ( aStatus.bModified ) // Fehler dazu oder weggekommen?
{
- sal_Bool bNeedEdit = sal_True; //
Test auf einfachen Text
+ sal_Bool bNeedEdit = sal_True; // Test auf einfachen Text
if ( !pEngine->HasOnlineSpellErrors() )
{
ScEditAttrTester aTester( pEngine );
@@ -759,14 +761,14 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange,
ScAddress&
this, pEngine->GetEditTextObjectPool() ) );
delete pNewData;
}
- else // einfacher String
+ else // einfacher String
PutCell( nCol, nRow, nTab, new ScStringCell( pEngine->GetText() ) );
- // Paint
+ // Paint
if (pShell)
{
- // Seitenvorschau ist davon nicht betroffen
- // (sollte jedenfalls nicht)
+ // Seitenvorschau ist davon nicht betroffen
+ // (sollte jedenfalls nicht)
ScPaintHint aHint( ScRange( nCol, nRow, nTab ), PAINT_GRID );
aHint.SetPrintFlag( false );
pShell->Broadcast( aHint );
@@ -775,17 +777,17 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange,
ScAddress&
bChanged = sal_True;
}
- if ( ++nTestCount >= nMaxTest ) // checked enough text?
+ if ( ++nTestCount >= nMaxTest ) // checked enough text?
break;
}
- if ( ++nCellCount >= SPELL_MAXCELLS ) // seen enough cells?
+ if ( ++nCellCount >= SPELL_MAXCELLS ) // seen enough cells?
break;
}
if ( pCell )
{
- ++nCol;
// continue after last cell
+ ++nCol; // continue after last cell
if ( nCol > rSpellRange.aEnd.Col() )
{
nCol = rSpellRange.aStart.Col();
@@ -795,7 +797,7 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress&
}
}
- if (!pCell) // end of range reached -> next sheet
+ if (!pCell) // end of range reached -> next sheet
{
++nTab;
if ( nTab > rSpellRange.aEnd.Tab() || !pTab[nTab] )
@@ -803,12 +805,12 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange,
ScAddress&
nCol = rSpellRange.aStart.Col();
nRow = rSpellRange.aStart.Row();
- nVisSpellState = VSPL_DONE; //! only if this is for the visible range
+ nVisSpellState = VSPL_DONE; //! only if this is for the visible range
}
rSpellPos.Set( nCol, nRow, nTab );
delete pDefaults;
- delete pEngine; // bevor aStatus out of scope geht
+ delete pEngine; // bevor aStatus out of scope geht
return bChanged;
}
@@ -824,23 +826,23 @@ sal_Bool ScDocument::ContinueOnlineSpelling()
sal_Bool bOldInserting = IsInsertingFromOtherDoc();
SetInsertingFromOtherDoc( sal_True );
- //! use one EditEngine for both calls
+ //! use one EditEngine for both calls
- // first check visible range
+ // first check visible range
sal_Bool bResult = OnlineSpellInRange( aVisSpellRange, aVisSpellPos, SPELL_MAXTEST_VIS );
- // during first pass through visible range, always continue
+ // during first pass through visible range, always continue
if ( nVisSpellState == VSPL_START )
bResult = sal_True;
if (bResult)
{
- // if errors found, continue there
+ // if errors found, continue there
OnlineSpellInRange( aVisSpellRange, aVisSpellPos, SPELL_MAXTEST_ALL );
}
else
{
- // if nothing found there, continue with rest of document
+ // if nothing found there, continue with rest of document
ScRange aTotalRange( 0,0,0, MAXCOL,MAXROW,MAXTAB );
bResult = OnlineSpellInRange( aTotalRange, aOnlineSpellPos, SPELL_MAXTEST_ALL );
}
@@ -855,7 +857,7 @@ void ScDocument::SetOnlineSpellPos( const ScAddress& rPos )
{
aOnlineSpellPos = rPos;
- // skip visible area for aOnlineSpellPos
+ // skip visible area for aOnlineSpellPos
if ( aVisSpellRange.In( aOnlineSpellPos ) )
aOnlineSpellPos = aVisSpellRange.aEnd;
}
@@ -865,7 +867,7 @@ sal_Bool ScDocument::SetVisibleSpellRange( const ScRange& rNewRange )
sal_Bool bChange = ( aVisSpellRange != rNewRange );
if (bChange)
{
- // continue spelling through visible range when scrolling down
+ // continue spelling through visible range when scrolling down
sal_Bool bContDown = ( nVisSpellState == VSPL_START && rNewRange.In( aVisSpellPos ) &&
rNewRange.aStart.Row() > aVisSpellRange.aStart.Row() &&
rNewRange.aStart.Col() == aVisSpellRange.aStart.Col() &&
@@ -879,7 +881,7 @@ sal_Bool ScDocument::SetVisibleSpellRange( const ScRange& rNewRange )
nVisSpellState = VSPL_START;
}
- // skip visible area for aOnlineSpellPos
+ // skip visible area for aOnlineSpellPos
if ( aVisSpellRange.In( aOnlineSpellPos ) )
aOnlineSpellPos = aVisSpellRange.aEnd;
}
@@ -888,7 +890,7 @@ sal_Bool ScDocument::SetVisibleSpellRange( const ScRange& rNewRange )
void ScDocument::RemoveAutoSpellObj()
{
- // alle Spelling-Informationen entfernen
+ // alle Spelling-Informationen entfernen
for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++)
pTab[nTab]->RemoveAutoSpellObj();
@@ -906,7 +908,7 @@ void ScDocument::RepaintRange( const ScRange& rRange )
//------------------------------------------------------------------------
-sal_Bool ScDocument::IdleCheckLinks() // sal_True = demnaechst wieder versuchen
+sal_Bool ScDocument::IdleCheckLinks() // sal_True = demnaechst wieder versuchen
{
sal_Bool bAnyLeft = false;
@@ -935,13 +937,13 @@ sal_Bool ScDocument::IdleCheckLinks() // sal_True =
demnaechst wieder versuche
void ScDocument::SaveDdeLinks(SvStream& rStream) const
{
- // bei 4.0-Export alle mit Modus != DEFAULT weglassen
+ // bei 4.0-Export alle mit Modus != DEFAULT weglassen
sal_Bool bExport40 = ( rStream.GetVersion() <= SOFFICE_FILEFORMAT_40 );
const ::sfx2::SvBaseLinks& rLinks = GetLinkManager()->GetLinks();
sal_uInt16 nCount = rLinks.Count();
- // erstmal zaehlen...
+ // erstmal zaehlen...
sal_uInt16 nDdeCount = 0;
sal_uInt16 i;
@@ -953,12 +955,12 @@ void ScDocument::SaveDdeLinks(SvStream& rStream) const
++nDdeCount;
}
- // Header
+ // Header
ScMultipleWriteHeader aHdr( rStream );
rStream << nDdeCount;
- // Links speichern
+ // Links speichern
for (i=0; i<nCount; i++)
{
@@ -989,7 +991,7 @@ void ScDocument::LoadDdeLinks(SvStream& rStream)
bool ScDocument::HasDdeLinks() const
{
- if (GetLinkManager()) // Clipboard z.B. hat keinen LinkManager
+ if (GetLinkManager()) // Clipboard z.B. hat keinen LinkManager
{
const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
sal_uInt16 nCount = rLinks.Count();
@@ -1003,7 +1005,7 @@ bool ScDocument::HasDdeLinks() const
void ScDocument::SetInLinkUpdate(sal_Bool bSet)
{
- // called from TableLink and AreaLink
+ // called from TableLink and AreaLink
OSL_ENSURE( bInLinkUpdate != bSet, "SetInLinkUpdate twice" );
bInLinkUpdate = bSet;
@@ -1114,9 +1116,9 @@ void ScDocument::UpdateDdeLinks()
sal_Bool ScDocument::UpdateDdeLink( const String& rAppl, const String& rTopic, const String& rItem
)
{
- // fuer refresh() per StarOne Api
- // ResetValue() fuer einzelnen Link nicht noetig
- //! wenn's mal alles asynchron wird, aber auch hier
+ // fuer refresh() per StarOne Api
+ // ResetValue() fuer einzelnen Link nicht noetig
+ //! wenn's mal alles asynchron wird, aber auch hier
sal_Bool bFound = false;
if (GetLinkManager())
@@ -1153,14 +1155,14 @@ void ScDocument::DisconnectDdeLinks()
{
::sfx2::SvBaseLink* pBase = *rLinks[i];
if (pBase->ISA(ScDdeLink))
- pBase->Disconnect(); // bleibt im LinkManager eingetragen
+ pBase->Disconnect(); // bleibt im LinkManager eingetragen
}
}
}
void ScDocument::CopyDdeLinks( ScDocument* pDestDoc ) const
{
- if (bIsClip) // aus Stream erzeugen
+ if (bIsClip) // aus Stream erzeugen
{
if (pClipData)
{
@@ -1336,7 +1338,7 @@ bool ScDocument::SetDdeLinkResultMatrix( sal_uInt16 nDdePos, ScMatrixRef
pResult
bool ScDocument::HasAreaLinks() const
{
- if (GetLinkManager()) // Clipboard z.B. hat keinen LinkManager
+ if (GetLinkManager()) // Clipboard z.B. hat keinen LinkManager
{
const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
sal_uInt16 nCount = rLinks.Count();
@@ -1463,12 +1465,12 @@ void ScDocument::KeyInput( const KeyEvent& )
apTemporaryChartLock->StartOrContinueLocking();
}
-// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
sal_Bool ScDocument::CheckMacroWarn()
{
- // The check for macro configuration, macro warning and disabling is now handled
- // in SfxObjectShell::AdjustMacroMode, called by SfxObjectShell::CallBasic.
+ // The check for macro configuration, macro warning and disabling is now handled
+ // in SfxObjectShell::AdjustMacroMode, called by SfxObjectShell::CallBasic.
return sal_True;
}
@@ -1477,17 +1479,17 @@ sal_Bool ScDocument::CheckMacroWarn()
SfxBindings* ScDocument::GetViewBindings()
{
- // used to invalidate slots after changes to this document
+ // used to invalidate slots after changes to this document
if ( !pShell )
- return NULL; // no ObjShell -> no view
+ return NULL; // no ObjShell -> no view
- // first check current view
+ // first check current view
SfxViewFrame* pViewFrame = SfxViewFrame::Current();
- if ( pViewFrame && pViewFrame->GetObjectShell() != pShell ) // wrong document?
+ if ( pViewFrame && pViewFrame->GetObjectShell() != pShell ) // wrong document?
pViewFrame = NULL;
- // otherwise use first view for this doc
+ // otherwise use first view for this doc
if ( !pViewFrame )
pViewFrame = SfxViewFrame::GetFirst( pShell );
@@ -1499,57 +1501,6 @@ SfxBindings* ScDocument::GetViewBindings()
//------------------------------------------------------------------------
-void lcl_TransliterateEditEngine( ScEditEngineDefaulter& rEngine,
- utl::TransliterationWrapper& rTranslitarationWrapper,
- sal_Bool bConsiderLanguage, ScDocument* pDoc )
-{
- //! should use TransliterateText method of EditEngine instead, when available!
-
- sal_uInt16 nLanguage = LANGUAGE_SYSTEM;
-
- sal_uInt16 nParCount = rEngine.GetParagraphCount();
- for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
- {
- SvUShorts aPortions;
- rEngine.GetPortions( (sal_uInt16)nPar, aPortions );
-
- for ( sal_uInt16 nPos = aPortions.Count(); nPos; )
- {
- --nPos;
- sal_uInt16 nEnd = aPortions.GetObject( nPos );
- sal_uInt16 nStart = nPos ? aPortions.GetObject( nPos - 1 ) : 0;
-
- ESelection aSel( nPar, nStart, nPar, nEnd );
- String aOldStr = rEngine.GetText( aSel );
- SfxItemSet aAttr = rEngine.GetAttribs( aSel );
-
- if ( aAttr.GetItemState( EE_FEATURE_FIELD ) != SFX_ITEM_ON ) // fields are not
touched
- {
- if ( bConsiderLanguage )
- {
- sal_uInt8 nScript = pDoc->GetStringScriptType( aOldStr );
- sal_uInt16 nWhich = ( nScript == SCRIPTTYPE_ASIAN ) ? EE_CHAR_LANGUAGE_CJK :
- ( ( nScript == SCRIPTTYPE_COMPLEX ) ? EE_CHAR_LANGUAGE_CTL :
- EE_CHAR_LANGUAGE );
- nLanguage = ((const SvxLanguageItem&)aAttr.Get(nWhich)).GetValue();
- }
-
- com::sun::star::uno::Sequence<sal_Int32> aOffsets;
- String aNewStr = rTranslitarationWrapper.transliterate( aOldStr, nLanguage, 0,
aOldStr.Len(), &aOffsets );
-
- if ( aNewStr != aOldStr )
- {
- // replace string, keep attributes
-
- rEngine.QuickInsertText( aNewStr, aSel );
- aSel.nEndPos = aSel.nStartPos + aNewStr.Len();
- rEngine.QuickSetAttribs( aAttr, aSel );
- }
- }
- }
- }
-}
-
void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32 nType )
{
OSL_ENSURE( rMultiMark.IsMultiMarked(), "TransliterateText: no selection" );
@@ -1558,7 +1509,7 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32
nTyp
sal_Bool bConsiderLanguage = aTranslitarationWrapper.needLanguageForTheMode();
sal_uInt16 nLanguage = LANGUAGE_SYSTEM;
- ScEditEngineDefaulter* pEngine = NULL; // not using pEditEngine member because of
defaults
+ ScEditEngineDefaulter* pEngine = NULL; // not using pEditEngine member because of
defaults
SCTAB nCount = GetTableCount();
for (SCTAB nTab = 0; nTab < nCount; nTab++)
@@ -1575,29 +1526,12 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32
nTyp
{
const ScBaseCell* pCell = GetCell( ScAddress( nCol, nRow, nTab ) );
CellType eType = pCell ? pCell->GetCellType() : CELLTYPE_NONE;
-
- if ( eType == CELLTYPE_STRING )
- {
- String aOldStr;
- ((const ScStringCell*)pCell)->GetString(aOldStr);
- xub_StrLen nOldLen = aOldStr.Len();
-
- if ( bConsiderLanguage )
- {
- sal_uInt8 nScript = GetStringScriptType( aOldStr ); //! cell
script type?
- sal_uInt16 nWhich = ( nScript == SCRIPTTYPE_ASIAN ) ?
ATTR_CJK_FONT_LANGUAGE :
- ( ( nScript == SCRIPTTYPE_COMPLEX ) ?
ATTR_CTL_FONT_LANGUAGE :
- ATTR_FONT_LANGUAGE
);
- nLanguage = ((const SvxLanguageItem*)GetAttr( nCol, nRow, nTab, nWhich
))->GetValue();
- }
-
- com::sun::star::uno::Sequence<sal_Int32> aOffsets;
- String aNewStr = aTranslitarationWrapper.transliterate( aOldStr, nLanguage, 0,
nOldLen, &aOffsets );
-
- if ( aNewStr != aOldStr )
- PutCell( nCol, nRow, nTab, new ScStringCell( aNewStr ) );
- }
- else if ( eType == CELLTYPE_EDIT )
+ // fdo#32786 TITLE_CASE/SENTENCE_CASE need the extra handling in EditEngine (loop
over words/sentences).
+ // Still use TransliterationWrapper directly for text cells with other
transliteration types,
+ // for performance reasons.
+ if ( eType == CELLTYPE_EDIT ||
+ ( eType == CELLTYPE_STRING && ( nType ==
com::sun::star::i18n::TransliterationModulesExtra::SENTENCE_CASE ||
+ nType ==
com::sun::star::i18n::TransliterationModulesExtra::TITLE_CASE ) ) )
{
if (!pEngine)
pEngine = new ScFieldEditEngine( GetEnginePool(), GetEditPool() );
@@ -1608,12 +1542,22 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32
nTyp
pPattern->FillEditItemSet( pDefaults );
pEngine->SetDefaults( pDefaults, sal_True );
- const EditTextObject* pData = ((const ScEditCell*)pCell)->GetData();
- pEngine->SetText( *pData );
-
+ if ( eType == CELLTYPE_STRING )
+ pEngine->SetText( static_cast<const ScStringCell*>(pCell)->GetString() );
+ else
+ {
+ const EditTextObject* pData = static_cast<const
ScEditCell*>(pCell)->GetData();
+ pEngine->SetText( *pData );
+ }
pEngine->ClearModifyFlag();
- lcl_TransliterateEditEngine( *pEngine, aTranslitarationWrapper,
bConsiderLanguage, this );
+ sal_uInt16 nLastPar = pEngine->GetParagraphCount();
+ if (nLastPar)
+ --nLastPar;
+ xub_StrLen nTxtLen = pEngine->GetTextLen(nLastPar);
+ ESelection aSelAll( 0, 0, nLastPar, nTxtLen );
+
+ pEngine->TransliterateText( aSelAll, nType );
if ( pEngine->IsModified() )
{
@@ -1637,11 +1581,31 @@ void ScDocument::TransliterateText( const ScMarkData& rMultiMark, sal_Int32
nTyp
}
}
+ else if ( eType == CELLTYPE_STRING )
+ {
+ String aOldStr;
+ ((const ScStringCell*)pCell)->GetString(aOldStr);
+ xub_StrLen nOldLen = aOldStr.Len();
+
+ if ( bConsiderLanguage )
+ {
+ sal_uInt8 nScript = GetStringScriptType( aOldStr ); //! cell script
type?
+ sal_uInt16 nWhich = ( nScript == SCRIPTTYPE_ASIAN ) ?
ATTR_CJK_FONT_LANGUAGE :
+ ( ( nScript == SCRIPTTYPE_COMPLEX ) ?
ATTR_CTL_FONT_LANGUAGE :
+ ATTR_FONT_LANGUAGE
);
+ nLanguage = ((const SvxLanguageItem*)GetAttr( nCol, nRow, nTab, nWhich
))->GetValue();
+ }
+
+ com::sun::star::uno::Sequence<sal_Int32> aOffsets;
+ String aNewStr = aTranslitarationWrapper.transliterate( aOldStr, nLanguage, 0,
nOldLen, &aOffsets );
+
+ if ( aNewStr != aOldStr )
+ PutCell( nCol, nRow, nTab, new ScStringCell( aNewStr ) );
+ }
bFound = GetNextMarkedCell( nCol, nRow, nTab, rMultiMark );
}
}
-
delete pEngine;
}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
--
1.7.4.4
Context
- [Libreoffice] Patch for fdo#32786 · Samuel Mehrbrodt
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.