diff options
-rw-r--r-- | sc/inc/cell.hxx | 2 | ||||
-rw-r--r-- | sc/inc/dociter.hxx | 2 | ||||
-rw-r--r-- | sc/inc/document.hxx | 1 | ||||
-rw-r--r-- | sc/inc/editutil.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/data/cell.cxx | 12 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/tool/editutil.cxx | 10 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh8.cxx | 50 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 47 |
9 files changed, 75 insertions, 61 deletions
diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx index 0b78f9878cac..c3443d269f02 100644 --- a/sc/inc/cell.hxx +++ b/sc/inc/cell.hxx @@ -105,8 +105,6 @@ public: bool HasValueData() const; bool HasStringData() const; rtl::OUString GetStringData() const; // only real strings - // default implementation, creates url object from passed url - static EditTextObject* CreateURLObjectFromURL( ScDocument& rDoc, const OUString& rURL, const OUString& rText ); static bool CellEqual( const ScBaseCell* pCell1, const ScBaseCell* pCell2 ); diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index 4477ba37ac44..5e9b16ddd400 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -425,7 +425,7 @@ private: SCTAB nTab; SCCOL nStartCol; SCCOL nEndCol; - SCROW nStartRow; + SCROW nStartRow; SCROW nEndRow; SCROW* pNextRows; SCSIZE* pNextIndices; diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index a245da805252..ec944f68ed50 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1227,6 +1227,7 @@ public: SC_DLLPUBLIC const SfxPoolItem* GetAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich ) const; SC_DLLPUBLIC const SfxPoolItem* GetAttr( const ScAddress& rPos, sal_uInt16 nWhich ) const; SC_DLLPUBLIC const ScPatternAttr* GetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab ) const; + SC_DLLPUBLIC const ScPatternAttr* GetPattern( const ScAddress& rPos ) const; SC_DLLPUBLIC const ScPatternAttr* GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) const; const ScPatternAttr* GetSelectionPattern( const ScMarkData& rMark, bool bDeep = true ); ScPatternAttr* CreateSelectionPattern( const ScMarkData& rMark, bool bDeep = true ); diff --git a/sc/inc/editutil.hxx b/sc/inc/editutil.hxx index ac8fc23d4f16..5f979cbe75aa 100644 --- a/sc/inc/editutil.hxx +++ b/sc/inc/editutil.hxx @@ -61,6 +61,9 @@ public: SC_DLLPUBLIC static OUString GetString( const EditTextObject& rEditText ); + static EditTextObject* CreateURLObjectFromURL( + ScDocument& rDoc, const OUString& rURL, const OUString& rText ); + public: ScEditUtil( ScDocument* pDocument, SCCOL nX, SCROW nY, SCTAB nZ, const Point& rScrPosPixel, diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx index c34e55c9d96d..03fbe680c352 100644 --- a/sc/source/core/data/cell.cxx +++ b/sc/source/core/data/cell.cxx @@ -600,16 +600,6 @@ bool ScBaseCell::CellEqual( const ScBaseCell* pCell1, const ScBaseCell* pCell2 ) return false; } -EditTextObject* ScBaseCell::CreateURLObjectFromURL( ScDocument& rDoc, const OUString& rURL, const OUString& rText ) -{ - SvxURLField aUrlField( rURL, rText, SVXURLFORMAT_APPDEFAULT); - EditEngine& rEE = rDoc.GetEditEngine(); - rEE.SetText( EMPTY_STRING ); - rEE.QuickInsertField( SvxFieldItem( aUrlField, EE_FEATURE_FIELD ), ESelection( 0xFFFF, 0xFFFF ) ); - - return rEE.CreateTextObject(); -} - // ============================================================================ ScNoteCell::ScNoteCell( SvtBroadcaster* pBC ) : @@ -1978,7 +1968,7 @@ EditTextObject* ScFormulaCell::CreateURLObject() rtl::OUString aURL; GetURLResult( aURL, aCellText ); - return CreateURLObjectFromURL( *pDocument, aURL, aCellText ); + return ScEditUtil::CreateURLObjectFromURL( *pDocument, aURL, aCellText ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 93ddc9feb584..97e66a77d823 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -4309,11 +4309,18 @@ const SfxPoolItem* ScDocument::GetAttr( const ScAddress& rPos, sal_uInt16 nWhich const ScPatternAttr* ScDocument::GetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) + if (TableExists(nTab)) return maTabs[nTab]->GetPattern( nCol, nRow ); return NULL; } +const ScPatternAttr* ScDocument::GetPattern( const ScAddress& rPos ) const +{ + if (TableExists(rPos.Tab())) + return maTabs[rPos.Tab()]->GetPattern(rPos.Col(), rPos.Row()); + + return NULL; +} const ScPatternAttr* ScDocument::GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) const { diff --git a/sc/source/core/tool/editutil.cxx b/sc/source/core/tool/editutil.cxx index 67ff54324e18..53f36adedf63 100644 --- a/sc/source/core/tool/editutil.cxx +++ b/sc/source/core/tool/editutil.cxx @@ -104,6 +104,16 @@ OUString ScEditUtil::GetString( const EditTextObject& rEditText ) return aRet.makeStringAndClear(); } +EditTextObject* ScEditUtil::CreateURLObjectFromURL( ScDocument& rDoc, const OUString& rURL, const OUString& rText ) +{ + SvxURLField aUrlField( rURL, rText, SVXURLFORMAT_APPDEFAULT); + EditEngine& rEE = rDoc.GetEditEngine(); + rEE.SetText( EMPTY_OUSTRING ); + rEE.QuickInsertField( SvxFieldItem( aUrlField, EE_FEATURE_FIELD ), ESelection( 0xFFFF, 0xFFFF ) ); + + return rEE.CreateTextObject(); +} + //------------------------------------------------------------------------ Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, sal_Bool bForceToTop ) diff --git a/sc/source/ui/docshell/docsh8.cxx b/sc/source/ui/docshell/docsh8.cxx index e17b8c4e1df2..2170b86d9fd3 100644 --- a/sc/source/ui/docshell/docsh8.cxx +++ b/sc/source/ui/docshell/docsh8.cxx @@ -72,6 +72,7 @@ #include "docpool.hxx" #include "segmenttree.hxx" #include "docparam.hxx" +#include "cellvalue.hxx" #include <vector> #include <boost/unordered_set.hpp> @@ -761,10 +762,13 @@ void lcl_GetColumnTypes( } } -inline void lcl_getLongVarCharEditString( rtl::OUString& rString, - const ScBaseCell* pCell, ScFieldEditEngine& rEditEngine ) +inline void lcl_getLongVarCharEditString( OUString& rString, + const ScRefCellValue& rCell, ScFieldEditEngine& rEditEngine ) { - rEditEngine.SetText( *((const ScEditCell*)pCell)->GetData() ); + if (!rCell.mpEditText) + return; + + rEditEngine.SetText(*rCell.mpEditText); rString = rEditEngine.GetText( LINEEND_CRLF ); } @@ -968,27 +972,26 @@ sal_uLong ScDocShell::DBaseExport( const rtl::OUString& rFullFileName, CharSet e switch (pColTypes[nCol]) { case sdbc::DataType::LONGVARCHAR: + { + ScRefCellValue aCell; + aCell.assign(aDocument, ScAddress(nDocCol, nDocRow, nTab)); + if (!aCell.isEmpty()) { - ScBaseCell* pCell; - aDocument.GetCell( nDocCol, nDocRow, nTab, pCell ); - if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE ) - { - if ( pCell->GetCellType() == CELLTYPE_EDIT ) - { // Paragraphs erhalten - lcl_getLongVarCharEditString( aString, - pCell, aEditEngine); - } - else - { - lcl_getLongVarCharString( - aString, aDocument, nDocCol, nDocRow, nTab, *pNumFmt); - } - xRowUpdate->updateString( nCol+1, aString ); + if (aCell.meType == CELLTYPE_EDIT) + { // Paragraphs erhalten + lcl_getLongVarCharEditString(aString, aCell, aEditEngine); } else - xRowUpdate->updateNull( nCol+1 ); + { + lcl_getLongVarCharString( + aString, aDocument, nDocCol, nDocRow, nTab, *pNumFmt); + } + xRowUpdate->updateString( nCol+1, aString ); } - break; + else + xRowUpdate->updateNull( nCol+1 ); + } + break; case sdbc::DataType::VARCHAR: aString = aDocument.GetString(nDocCol, nDocRow, nTab); @@ -1090,8 +1093,11 @@ sal_uLong ScDocShell::DBaseExport( const rtl::OUString& rFullFileName, CharSet e if ( pCell->GetCellType() != CELLTYPE_NOTE ) { if ( pCell->GetCellType() == CELLTYPE_EDIT ) - lcl_getLongVarCharEditString( aString, - pCell, aEditEngine); + { + ScRefCellValue aCell; + aCell.assign(*pCell); + lcl_getLongVarCharEditString(aString, aCell, aEditEngine); + } else lcl_getLongVarCharString( aString, aDocument, nDocCol, nDocRow, nTab, *pNumFmt); diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 1a47370d6f60..c31a2c3ef99c 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -379,13 +379,15 @@ static void lcl_UnLockComment( ScDrawView* pView, SdrPageView* pPV, SdrModel* pD } } -static sal_Bool lcl_GetHyperlinkCell(ScDocument* pDoc, SCCOL& rPosX, SCROW& rPosY, SCTAB nTab, ScBaseCell*& rpCell, OUString& rURL ) +static bool lcl_GetHyperlinkCell( + ScDocument* pDoc, SCCOL& rPosX, SCROW& rPosY, SCTAB nTab, ScRefCellValue& rCell, OUString& rURL ) { - sal_Bool bFound = false; + bool bFound = false; do { - pDoc->GetCell( rPosX, rPosY, nTab, rpCell ); - if ( !rpCell || rpCell->GetCellType() == CELLTYPE_NOTE ) + ScAddress aPos(rPosX, rPosY, nTab); + rCell.assign(*pDoc, aPos); + if (rCell.isEmpty()) { if ( rPosX <= 0 ) return false; // alles leer bis links @@ -394,17 +396,16 @@ static sal_Bool lcl_GetHyperlinkCell(ScDocument* pDoc, SCCOL& rPosX, SCROW& rPos } else { - const ScPatternAttr* pPattern = pDoc->GetPattern( rPosX, rPosY, nTab ); + const ScPatternAttr* pPattern = pDoc->GetPattern(aPos); if ( !((SfxStringItem&)pPattern->GetItem(ATTR_HYPERLINK)).GetValue().isEmpty() ) { rURL = ((SfxStringItem&)pPattern->GetItem(ATTR_HYPERLINK)).GetValue(); bFound = true; } - else if ( rpCell->GetCellType() == CELLTYPE_EDIT) - bFound = sal_True; - else if (rpCell->GetCellType() == CELLTYPE_FORMULA && - static_cast<ScFormulaCell*>(rpCell)->IsHyperLinkCell()) - bFound = sal_True; + else if (rCell.meType == CELLTYPE_EDIT) + bFound = true; + else if (rCell.meType == CELLTYPE_FORMULA && rCell.mpFormula->IsHyperLinkCell()) + bFound = true; else return false; // andere Zelle } @@ -2325,9 +2326,9 @@ void ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt ) SCsROW nPosY; SCTAB nTab = pViewData->GetTabNo(); pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY ); - ScBaseCell* pCell = NULL; OUString sURL; - if( lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell, sURL ) ) + ScRefCellValue aCell; + if (lcl_GetHyperlinkCell(pDoc, nPosX, nPosY, nTab, aCell, sURL)) { ScAddress aCellPos( nPosX, nPosY, nTab ); uno::Reference< table::XCell > xCell( new ScCellObj( pViewData->GetDocShell(), aCellPos ) ); @@ -5009,9 +5010,9 @@ bool ScGridWindow::GetEditUrlOrError( bool bSpellErr, const Point& rPos, SCTAB nTab = pViewData->GetTabNo(); ScDocShell* pDocSh = pViewData->GetDocShell(); ScDocument* pDoc = pDocSh->GetDocument(); - ScBaseCell* pCell = NULL; OUString sURL; - sal_Bool bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell, sURL ); + ScRefCellValue aCell; + bool bFound = lcl_GetHyperlinkCell(pDoc, nPosX, nPosY, nTab, aCell, sURL); if( !bFound ) return false; @@ -5067,7 +5068,7 @@ bool ScGridWindow::GetEditUrlOrError( bool bSpellErr, const Point& rPos, Rectangle aLogicEdit = PixelToLogic( aEditRect, aEditMode ); long nThisColLogic = aLogicEdit.Right() - aLogicEdit.Left() + 1; Size aPaperSize = Size( 1000000, 1000000 ); - if(pCell->GetCellType() == CELLTYPE_FORMULA) + if (aCell.meType == CELLTYPE_FORMULA) { long nSizeX = 0; long nSizeY = 0; @@ -5081,20 +5082,19 @@ bool ScGridWindow::GetEditUrlOrError( bool bSpellErr, const Point& rPos, aEngine.SetPaperSize( aPaperSize ); boost::scoped_ptr<EditTextObject> pTextObj; - if(pCell->GetCellType() == CELLTYPE_EDIT) + if (aCell.meType == CELLTYPE_EDIT) { - const EditTextObject* pData = static_cast<ScEditCell*>(pCell)->GetData(); - if (pData) - aEngine.SetText(*pData); + if (aCell.mpEditText) + aEngine.SetText(*aCell.mpEditText); } else // Not an Edit cell and is a formula cell with 'Hyperlink' // function if we have no URL, otherwise it could be a formula // cell ( or other type ? ) with a hyperlink associated with it. { - if ( sURL.isEmpty() ) - pTextObj.reset((static_cast<ScFormulaCell*>(pCell))->CreateURLObject()); + if (sURL.isEmpty()) + pTextObj.reset(aCell.mpFormula->CreateURLObject()); else - pTextObj.reset( ScBaseCell::CreateURLObjectFromURL( *pDoc, sURL, sURL ) ); + pTextObj.reset(ScEditUtil::CreateURLObjectFromURL(*pDoc, sURL, sURL)); if (pTextObj.get()) aEngine.SetText(*pTextObj); @@ -5119,8 +5119,7 @@ bool ScGridWindow::GetEditUrlOrError( bool bSpellErr, const Point& rPos, // There is one glitch when dealing with a hyperlink cell and // the cell content is NUMERIC. This defaults to right aligned and // we need to adjust accordingly. - if(pCell->GetCellType() == CELLTYPE_FORMULA && - static_cast<ScFormulaCell*>(pCell)->IsValue() && + if (aCell.meType == CELLTYPE_FORMULA && aCell.mpFormula->IsValue() && eHorJust == SVX_HOR_JUSTIFY_STANDARD) { aLogicEdit.Right() = aLogicEdit.Left() + nThisColLogic - 1; |