filter/source/msfilter/util.cxx | 121 +++++++++++++++++++++++++++++++ include/filter/msfilter/util.hxx | 15 +++ oovbaapi/ooo/vba/excel/XPageSetup.idl | 1 sc/qa/extras/testdocuments/pagesetup.xls |binary sc/source/filter/oox/pagesettings.cxx | 94 +----------------------- sc/source/ui/vba/vbapagesetup.cxx | 32 +++++++- sc/source/ui/vba/vbapagesetup.hxx | 4 + 7 files changed, 176 insertions(+), 91 deletions(-)
New commits: commit e85b47e5ade19718d935dc543e48487e30e095b9 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 7 16:34:30 2013 +0100 share spPaperSizeTable ( and associated access code ) in msfilter PageSetup.PaperSize implementation more or less copy&pasted the papersize conversion code from oox, this is a followup to remove the duplication. ( Probably the binary filter could be converted to use this also saving yet another nearly similar implementation ) Change-Id: I479f0322163161f7819c5d650a9511910ac2e781 (cherry picked from commit c76974576aa5eec6b86af39eaaadc8e382f214bd) diff --git a/filter/source/msfilter/util.cxx b/filter/source/msfilter/util.cxx index 45310f9..bf612c3 100644 --- a/filter/source/msfilter/util.cxx +++ b/filter/source/msfilter/util.cxx @@ -306,6 +306,127 @@ OString ConvertColor( const Color &rColor ) } return color; } + + +#define IN2MM100( v ) static_cast< sal_Int32 >( (v) * 2540.0 + 0.5 ) +#define MM2MM100( v ) static_cast< sal_Int32 >( (v) * 100.0 + 0.5 ) + +static const ApiPaperSize spPaperSizeTable[] = +{ + { 0, 0 }, // 0 - (undefined) + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 1 - Letter paper + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 2 - Letter small paper + { IN2MM100( 11 ), IN2MM100( 17 ) }, // 3 - Tabloid paper + { IN2MM100( 17 ), IN2MM100( 11 ) }, // 4 - Ledger paper + { IN2MM100( 8.5 ), IN2MM100( 14 ) }, // 5 - Legal paper + { IN2MM100( 5.5 ), IN2MM100( 8.5 ) }, // 6 - Statement paper + { IN2MM100( 7.25 ), IN2MM100( 10.5 ) }, // 7 - Executive paper + { MM2MM100( 297 ), MM2MM100( 420 ) }, // 8 - A3 paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 9 - A4 paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 10 - A4 small paper + { MM2MM100( 148 ), MM2MM100( 210 ) }, // 11 - A5 paper + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 12 - B4 paper + { MM2MM100( 176 ), MM2MM100( 250 ) }, // 13 - B5 paper + { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 14 - Folio paper + { MM2MM100( 215 ), MM2MM100( 275 ) }, // 15 - Quarto paper + { IN2MM100( 10 ), IN2MM100( 14 ) }, // 16 - Standard paper + { IN2MM100( 11 ), IN2MM100( 17 ) }, // 17 - Standard paper + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 18 - Note paper + { IN2MM100( 3.875 ), IN2MM100( 8.875 ) }, // 19 - #9 envelope + { IN2MM100( 4.125 ), IN2MM100( 9.5 ) }, // 20 - #10 envelope + { IN2MM100( 4.5 ), IN2MM100( 10.375 ) }, // 21 - #11 envelope + { IN2MM100( 4.75 ), IN2MM100( 11 ) }, // 22 - #12 envelope + { IN2MM100( 5 ), IN2MM100( 11.5 ) }, // 23 - #14 envelope + { IN2MM100( 17 ), IN2MM100( 22 ) }, // 24 - C paper + { IN2MM100( 22 ), IN2MM100( 34 ) }, // 25 - D paper + { IN2MM100( 34 ), IN2MM100( 44 ) }, // 26 - E paper + { MM2MM100( 110 ), MM2MM100( 220 ) }, // 27 - DL envelope + { MM2MM100( 162 ), MM2MM100( 229 ) }, // 28 - C5 envelope + { MM2MM100( 324 ), MM2MM100( 458 ) }, // 29 - C3 envelope + { MM2MM100( 229 ), MM2MM100( 324 ) }, // 30 - C4 envelope + { MM2MM100( 114 ), MM2MM100( 162 ) }, // 31 - C6 envelope + { MM2MM100( 114 ), MM2MM100( 229 ) }, // 32 - C65 envelope + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 33 - B4 envelope + { MM2MM100( 176 ), MM2MM100( 250 ) }, // 34 - B5 envelope + { MM2MM100( 176 ), MM2MM100( 125 ) }, // 35 - B6 envelope + { MM2MM100( 110 ), MM2MM100( 230 ) }, // 36 - Italy envelope + { IN2MM100( 3.875 ), IN2MM100( 7.5 ) }, // 37 - Monarch envelope + { IN2MM100( 3.625 ), IN2MM100( 6.5 ) }, // 38 - 6 3/4 envelope + { IN2MM100( 14.875 ), IN2MM100( 11 ) }, // 39 - US standard fanfold + { IN2MM100( 8.5 ), IN2MM100( 12 ) }, // 40 - German standard fanfold + { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 41 - German legal fanfold + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 42 - ISO B4 + { MM2MM100( 200 ), MM2MM100( 148 ) }, // 43 - Japanese double postcard + { IN2MM100( 9 ), IN2MM100( 11 ) }, // 44 - Standard paper + { IN2MM100( 10 ), IN2MM100( 11 ) }, // 45 - Standard paper + { IN2MM100( 15 ), IN2MM100( 11 ) }, // 46 - Standard paper + { MM2MM100( 220 ), MM2MM100( 220 ) }, // 47 - Invite envelope + { 0, 0 }, // 48 - (undefined) + { 0, 0 }, // 49 - (undefined) + { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 50 - Letter extra paper + { IN2MM100( 9.275 ), IN2MM100( 15 ) }, // 51 - Legal extra paper + { IN2MM100( 11.69 ), IN2MM100( 18 ) }, // 52 - Tabloid extra paper + { MM2MM100( 236 ), MM2MM100( 322 ) }, // 53 - A4 extra paper + { IN2MM100( 8.275 ), IN2MM100( 11 ) }, // 54 - Letter transverse paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 55 - A4 transverse paper + { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 56 - Letter extra transverse paper + { MM2MM100( 227 ), MM2MM100( 356 ) }, // 57 - SuperA/SuperA/A4 paper + { MM2MM100( 305 ), MM2MM100( 487 ) }, // 58 - SuperB/SuperB/A3 paper + { IN2MM100( 8.5 ), IN2MM100( 12.69 ) }, // 59 - Letter plus paper + { MM2MM100( 210 ), MM2MM100( 330 ) }, // 60 - A4 plus paper + { MM2MM100( 148 ), MM2MM100( 210 ) }, // 61 - A5 transverse paper + { MM2MM100( 182 ), MM2MM100( 257 ) }, // 62 - JIS B5 transverse paper + { MM2MM100( 322 ), MM2MM100( 445 ) }, // 63 - A3 extra paper + { MM2MM100( 174 ), MM2MM100( 235 ) }, // 64 - A5 extra paper + { MM2MM100( 201 ), MM2MM100( 276 ) }, // 65 - ISO B5 extra paper + { MM2MM100( 420 ), MM2MM100( 594 ) }, // 66 - A2 paper + { MM2MM100( 297 ), MM2MM100( 420 ) }, // 67 - A3 transverse paper + { MM2MM100( 322 ), MM2MM100( 445 ) } // 68 - A3 extra transverse paper +}; + +sal_Int32 PaperSizeConv::getMSPaperSizeIndex( const com::sun::star::awt::Size& rSize ) +{ + sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); + // Need to find the best match for current size + sal_Int32 nDeltaWidth = 0; + sal_Int32 nDeltaHeight = 0; + + sal_Int32 nPaperSizeIndex = 0; // Undefined + const ApiPaperSize* pItem = spPaperSizeTable; + const ApiPaperSize* pEnd = spPaperSizeTable + nElems; + for ( ; pItem != pEnd; ++pItem ) + { + sal_Int32 nCurDeltaHeight = std::abs( pItem->mnHeight - rSize.Height ); + sal_Int32 nCurDeltaWidth = std::abs( pItem->mnWidth - rSize.Width ); + if ( pItem == spPaperSizeTable ) // initialise delta with first item + { + nDeltaWidth = nCurDeltaWidth; + nDeltaHeight = nCurDeltaHeight; + } + else + { + if ( nCurDeltaWidth < nDeltaWidth && nCurDeltaHeight < nDeltaHeight ) + { + nDeltaWidth = nCurDeltaWidth; + nDeltaHeight = nCurDeltaHeight; + nPaperSizeIndex = (pItem - spPaperSizeTable); + } + } + } + sal_Int32 nTol = 10; // hmm not sure is this the best way + if ( nDeltaWidth <= nTol && nDeltaHeight <= nTol ) + return nPaperSizeIndex; + return 0; +} + +const ApiPaperSize& PaperSizeConv::getApiSizeForMSPaperSizeIndex( sal_Int32 nMSOPaperIndex ) +{ + sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); + if ( nMSOPaperIndex < 0 || nMSOPaperIndex > nElems - 1 ) + return spPaperSizeTable[ 0 ]; + return spPaperSizeTable[ nMSOPaperIndex ]; +} + } } diff --git a/include/filter/msfilter/util.hxx b/include/filter/msfilter/util.hxx index f50e4d1..e134199 100644 --- a/include/filter/msfilter/util.hxx +++ b/include/filter/msfilter/util.hxx @@ -15,6 +15,7 @@ #include <tools/color.hxx> #include <com/sun/star/lang/Locale.hpp> #include "filter/msfilter/msfilterdllapi.h" +#include <com/sun/star/awt/Size.hpp> namespace msfilter { namespace util { @@ -73,6 +74,20 @@ MSFILTER_DLLPUBLIC TextCategory categorizeCodePoint(sal_uInt32 codePoint, const /// Converts tools Color to HTML color (without leading hashmark). MSFILTER_DLLPUBLIC OString ConvertColor( const Color &rColor ); + +/** Paper size in 1/100 millimeters. */ +struct MSFILTER_DLLPUBLIC ApiPaperSize +{ + sal_Int32 mnWidth; + sal_Int32 mnHeight; +}; + +class MSFILTER_DLLPUBLIC PaperSizeConv +{ +public: + static sal_Int32 getMSPaperSizeIndex( const com::sun::star::awt::Size& rSize ); + static const ApiPaperSize& getApiSizeForMSPaperSizeIndex( sal_Int32 nMSOPaperIndex ); +}; } } diff --git a/sc/source/filter/oox/pagesettings.cxx b/sc/source/filter/oox/pagesettings.cxx index 00b5d5a..28553dc 100644 --- a/sc/source/filter/oox/pagesettings.cxx +++ b/sc/source/filter/oox/pagesettings.cxx @@ -42,6 +42,7 @@ #include "stylesbuffer.hxx" #include "unitconverter.hxx" #include "document.hxx" +#include <filter/msfilter/util.hxx> namespace oox { namespace xls { @@ -892,93 +893,6 @@ void HeaderFooterParser::setNewPortion( HFPortionId ePortion ) // ============================================================================ -namespace { - -/** Paper size in 1/100 millimeters. */ -struct ApiPaperSize -{ - sal_Int32 mnWidth; - sal_Int32 mnHeight; -}; - -#define IN2MM100( v ) static_cast< sal_Int32 >( (v) * 2540.0 + 0.5 ) -#define MM2MM100( v ) static_cast< sal_Int32 >( (v) * 100.0 + 0.5 ) - -static const ApiPaperSize spPaperSizeTable[] = -{ - { 0, 0 }, // 0 - (undefined) - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 1 - Letter paper - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 2 - Letter small paper - { IN2MM100( 11 ), IN2MM100( 17 ) }, // 3 - Tabloid paper - { IN2MM100( 17 ), IN2MM100( 11 ) }, // 4 - Ledger paper - { IN2MM100( 8.5 ), IN2MM100( 14 ) }, // 5 - Legal paper - { IN2MM100( 5.5 ), IN2MM100( 8.5 ) }, // 6 - Statement paper - { IN2MM100( 7.25 ), IN2MM100( 10.5 ) }, // 7 - Executive paper - { MM2MM100( 297 ), MM2MM100( 420 ) }, // 8 - A3 paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 9 - A4 paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 10 - A4 small paper - { MM2MM100( 148 ), MM2MM100( 210 ) }, // 11 - A5 paper - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 12 - B4 paper - { MM2MM100( 176 ), MM2MM100( 250 ) }, // 13 - B5 paper - { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 14 - Folio paper - { MM2MM100( 215 ), MM2MM100( 275 ) }, // 15 - Quarto paper - { IN2MM100( 10 ), IN2MM100( 14 ) }, // 16 - Standard paper - { IN2MM100( 11 ), IN2MM100( 17 ) }, // 17 - Standard paper - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 18 - Note paper - { IN2MM100( 3.875 ), IN2MM100( 8.875 ) }, // 19 - #9 envelope - { IN2MM100( 4.125 ), IN2MM100( 9.5 ) }, // 20 - #10 envelope - { IN2MM100( 4.5 ), IN2MM100( 10.375 ) }, // 21 - #11 envelope - { IN2MM100( 4.75 ), IN2MM100( 11 ) }, // 22 - #12 envelope - { IN2MM100( 5 ), IN2MM100( 11.5 ) }, // 23 - #14 envelope - { IN2MM100( 17 ), IN2MM100( 22 ) }, // 24 - C paper - { IN2MM100( 22 ), IN2MM100( 34 ) }, // 25 - D paper - { IN2MM100( 34 ), IN2MM100( 44 ) }, // 26 - E paper - { MM2MM100( 110 ), MM2MM100( 220 ) }, // 27 - DL envelope - { MM2MM100( 162 ), MM2MM100( 229 ) }, // 28 - C5 envelope - { MM2MM100( 324 ), MM2MM100( 458 ) }, // 29 - C3 envelope - { MM2MM100( 229 ), MM2MM100( 324 ) }, // 30 - C4 envelope - { MM2MM100( 114 ), MM2MM100( 162 ) }, // 31 - C6 envelope - { MM2MM100( 114 ), MM2MM100( 229 ) }, // 32 - C65 envelope - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 33 - B4 envelope - { MM2MM100( 176 ), MM2MM100( 250 ) }, // 34 - B5 envelope - { MM2MM100( 176 ), MM2MM100( 125 ) }, // 35 - B6 envelope - { MM2MM100( 110 ), MM2MM100( 230 ) }, // 36 - Italy envelope - { IN2MM100( 3.875 ), IN2MM100( 7.5 ) }, // 37 - Monarch envelope - { IN2MM100( 3.625 ), IN2MM100( 6.5 ) }, // 38 - 6 3/4 envelope - { IN2MM100( 14.875 ), IN2MM100( 11 ) }, // 39 - US standard fanfold - { IN2MM100( 8.5 ), IN2MM100( 12 ) }, // 40 - German standard fanfold - { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 41 - German legal fanfold - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 42 - ISO B4 - { MM2MM100( 200 ), MM2MM100( 148 ) }, // 43 - Japanese double postcard - { IN2MM100( 9 ), IN2MM100( 11 ) }, // 44 - Standard paper - { IN2MM100( 10 ), IN2MM100( 11 ) }, // 45 - Standard paper - { IN2MM100( 15 ), IN2MM100( 11 ) }, // 46 - Standard paper - { MM2MM100( 220 ), MM2MM100( 220 ) }, // 47 - Invite envelope - { 0, 0 }, // 48 - (undefined) - { 0, 0 }, // 49 - (undefined) - { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 50 - Letter extra paper - { IN2MM100( 9.275 ), IN2MM100( 15 ) }, // 51 - Legal extra paper - { IN2MM100( 11.69 ), IN2MM100( 18 ) }, // 52 - Tabloid extra paper - { MM2MM100( 236 ), MM2MM100( 322 ) }, // 53 - A4 extra paper - { IN2MM100( 8.275 ), IN2MM100( 11 ) }, // 54 - Letter transverse paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 55 - A4 transverse paper - { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 56 - Letter extra transverse paper - { MM2MM100( 227 ), MM2MM100( 356 ) }, // 57 - SuperA/SuperA/A4 paper - { MM2MM100( 305 ), MM2MM100( 487 ) }, // 58 - SuperB/SuperB/A3 paper - { IN2MM100( 8.5 ), IN2MM100( 12.69 ) }, // 59 - Letter plus paper - { MM2MM100( 210 ), MM2MM100( 330 ) }, // 60 - A4 plus paper - { MM2MM100( 148 ), MM2MM100( 210 ) }, // 61 - A5 transverse paper - { MM2MM100( 182 ), MM2MM100( 257 ) }, // 62 - JIS B5 transverse paper - { MM2MM100( 322 ), MM2MM100( 445 ) }, // 63 - A3 extra paper - { MM2MM100( 174 ), MM2MM100( 235 ) }, // 64 - A5 extra paper - { MM2MM100( 201 ), MM2MM100( 276 ) }, // 65 - ISO B5 extra paper - { MM2MM100( 420 ), MM2MM100( 594 ) }, // 66 - A2 paper - { MM2MM100( 297 ), MM2MM100( 420 ) }, // 67 - A3 transverse paper - { MM2MM100( 322 ), MM2MM100( 445 ) } // 68 - A3 extra transverse paper -}; - -} // namespace - // ---------------------------------------------------------------------------- PageSettingsConverter::HFHelperData::HFHelperData( sal_Int32 nLeftPropId, sal_Int32 nRightPropId ) : @@ -1043,11 +957,11 @@ void PageSettingsConverter::writePageSettingsProperties( awt::Size aSize; bool bValid = false; - if( (0 < rModel.mnPaperSize) && (rModel.mnPaperSize < static_cast< sal_Int32 >( STATIC_ARRAY_SIZE( spPaperSizeTable ) )) ) + if( (0 < rModel.mnPaperSize) ) { - const ApiPaperSize& rPaperSize = spPaperSizeTable[ rModel.mnPaperSize ]; + const msfilter::util::ApiPaperSize& rPaperSize = msfilter::util::PaperSizeConv::getApiSizeForMSPaperSizeIndex( rModel.mnPaperSize ); aSize = awt::Size( rPaperSize.mnWidth, rPaperSize.mnHeight ); - bValid = true; + bValid = ( rPaperSize.mnWidth != 0 && rPaperSize.mnHeight != 0 ); } if( rModel.mnPaperWidth > 0 && rModel.mnPaperHeight > 0 ) { diff --git a/sc/source/ui/vba/vbapagesetup.cxx b/sc/source/ui/vba/vbapagesetup.cxx index 0f6c82e..465467d 100644 --- a/sc/source/ui/vba/vbapagesetup.cxx +++ b/sc/source/ui/vba/vbapagesetup.cxx @@ -32,6 +32,7 @@ #include <i18nutil/paper.hxx> #include <sal/macros.h> #include <algorithm> +#include <filter/msfilter/util.hxx> using namespace ::com::sun::star; using namespace ::ooo::vba; @@ -626,141 +627,28 @@ OUString SAL_CALL ScVbaPageSetup::getPrintTitleColumns() throw (uno::RuntimeExce void SAL_CALL ScVbaPageSetup::setPrintTitleColumns( const OUString& /*_printtitlecolumns*/ ) throw (uno::RuntimeException) { } -/** Paper size in 1/100 millimeters. */ -struct ApiPaperSize -{ - sal_Int32 mnWidth; - sal_Int32 mnHeight; -}; - -// #FIXME ( this is cut'n'pasted from oox, we need to share it somewhere, msfilter ? ) - -#define IN2MM100( v ) static_cast< sal_Int32 >( (v) * 2540.0 + 0.5 ) -#define MM2MM100( v ) static_cast< sal_Int32 >( (v) * 100.0 + 0.5 ) - -static const ApiPaperSize spPaperSizeTable[] = -{ - { 0, 0 }, // 0 - (undefined) - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 1 - Letter paper - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 2 - Letter small paper - { IN2MM100( 11 ), IN2MM100( 17 ) }, // 3 - Tabloid paper - { IN2MM100( 17 ), IN2MM100( 11 ) }, // 4 - Ledger paper - { IN2MM100( 8.5 ), IN2MM100( 14 ) }, // 5 - Legal paper - { IN2MM100( 5.5 ), IN2MM100( 8.5 ) }, // 6 - Statement paper - { IN2MM100( 7.25 ), IN2MM100( 10.5 ) }, // 7 - Executive paper - { MM2MM100( 297 ), MM2MM100( 420 ) }, // 8 - A3 paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 9 - A4 paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 10 - A4 small paper - { MM2MM100( 148 ), MM2MM100( 210 ) }, // 11 - A5 paper - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 12 - B4 paper - { MM2MM100( 176 ), MM2MM100( 250 ) }, // 13 - B5 paper - { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 14 - Folio paper - { MM2MM100( 215 ), MM2MM100( 275 ) }, // 15 - Quarto paper - { IN2MM100( 10 ), IN2MM100( 14 ) }, // 16 - Standard paper - { IN2MM100( 11 ), IN2MM100( 17 ) }, // 17 - Standard paper - { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 18 - Note paper - { IN2MM100( 3.875 ), IN2MM100( 8.875 ) }, // 19 - #9 envelope - { IN2MM100( 4.125 ), IN2MM100( 9.5 ) }, // 20 - #10 envelope - { IN2MM100( 4.5 ), IN2MM100( 10.375 ) }, // 21 - #11 envelope - { IN2MM100( 4.75 ), IN2MM100( 11 ) }, // 22 - #12 envelope - { IN2MM100( 5 ), IN2MM100( 11.5 ) }, // 23 - #14 envelope - { IN2MM100( 17 ), IN2MM100( 22 ) }, // 24 - C paper - { IN2MM100( 22 ), IN2MM100( 34 ) }, // 25 - D paper - { IN2MM100( 34 ), IN2MM100( 44 ) }, // 26 - E paper - { MM2MM100( 110 ), MM2MM100( 220 ) }, // 27 - DL envelope - { MM2MM100( 162 ), MM2MM100( 229 ) }, // 28 - C5 envelope - { MM2MM100( 324 ), MM2MM100( 458 ) }, // 29 - C3 envelope - { MM2MM100( 229 ), MM2MM100( 324 ) }, // 30 - C4 envelope - { MM2MM100( 114 ), MM2MM100( 162 ) }, // 31 - C6 envelope - { MM2MM100( 114 ), MM2MM100( 229 ) }, // 32 - C65 envelope - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 33 - B4 envelope - { MM2MM100( 176 ), MM2MM100( 250 ) }, // 34 - B5 envelope - { MM2MM100( 176 ), MM2MM100( 125 ) }, // 35 - B6 envelope - { MM2MM100( 110 ), MM2MM100( 230 ) }, // 36 - Italy envelope - { IN2MM100( 3.875 ), IN2MM100( 7.5 ) }, // 37 - Monarch envelope - { IN2MM100( 3.625 ), IN2MM100( 6.5 ) }, // 38 - 6 3/4 envelope - { IN2MM100( 14.875 ), IN2MM100( 11 ) }, // 39 - US standard fanfold - { IN2MM100( 8.5 ), IN2MM100( 12 ) }, // 40 - German standard fanfold - { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 41 - German legal fanfold - { MM2MM100( 250 ), MM2MM100( 353 ) }, // 42 - ISO B4 - { MM2MM100( 200 ), MM2MM100( 148 ) }, // 43 - Japanese double postcard - { IN2MM100( 9 ), IN2MM100( 11 ) }, // 44 - Standard paper - { IN2MM100( 10 ), IN2MM100( 11 ) }, // 45 - Standard paper - { IN2MM100( 15 ), IN2MM100( 11 ) }, // 46 - Standard paper - { MM2MM100( 220 ), MM2MM100( 220 ) }, // 47 - Invite envelope - { 0, 0 }, // 48 - (undefined) - { 0, 0 }, // 49 - (undefined) - { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 50 - Letter extra paper - { IN2MM100( 9.275 ), IN2MM100( 15 ) }, // 51 - Legal extra paper - { IN2MM100( 11.69 ), IN2MM100( 18 ) }, // 52 - Tabloid extra paper - { MM2MM100( 236 ), MM2MM100( 322 ) }, // 53 - A4 extra paper - { IN2MM100( 8.275 ), IN2MM100( 11 ) }, // 54 - Letter transverse paper - { MM2MM100( 210 ), MM2MM100( 297 ) }, // 55 - A4 transverse paper - { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 56 - Letter extra transverse paper - { MM2MM100( 227 ), MM2MM100( 356 ) }, // 57 - SuperA/SuperA/A4 paper - { MM2MM100( 305 ), MM2MM100( 487 ) }, // 58 - SuperB/SuperB/A3 paper - { IN2MM100( 8.5 ), IN2MM100( 12.69 ) }, // 59 - Letter plus paper - { MM2MM100( 210 ), MM2MM100( 330 ) }, // 60 - A4 plus paper - { MM2MM100( 148 ), MM2MM100( 210 ) }, // 61 - A5 transverse paper - { MM2MM100( 182 ), MM2MM100( 257 ) }, // 62 - JIS B5 transverse paper - { MM2MM100( 322 ), MM2MM100( 445 ) }, // 63 - A3 extra paper - { MM2MM100( 174 ), MM2MM100( 235 ) }, // 64 - A5 extra paper - { MM2MM100( 201 ), MM2MM100( 276 ) }, // 65 - ISO B5 extra paper - { MM2MM100( 420 ), MM2MM100( 594 ) }, // 66 - A2 paper - { MM2MM100( 297 ), MM2MM100( 420 ) }, // 67 - A3 transverse paper - { MM2MM100( 322 ), MM2MM100( 445 ) } // 68 - A3 extra transverse paper -}; sal_Int32 SAL_CALL ScVbaPageSetup::getPaperSize() throw (uno::RuntimeException) { - sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); - // Need to find the best match for current size - sal_Int32 nDeltaWidth = 0; - sal_Int32 nDeltaHeight = 0; awt::Size aSize; // current papersize mxPageProps->getPropertyValue( "Size" ) >>= aSize; if ( mbIsLandscape ) ::std::swap( aSize.Width, aSize.Height ); - sal_Int32 nPaperSizeIndex = 0; // Undefined - const ApiPaperSize* pItem = spPaperSizeTable; - const ApiPaperSize* pEnd = spPaperSizeTable + nElems; - for ( ; pItem != pEnd; ++pItem ) - { - const ApiPaperSize& rSize = *pItem; - sal_Int32 nCurDeltaHeight = std::abs( rSize.mnHeight - aSize.Height ); - sal_Int32 nCurDeltaWidth = std::abs( rSize.mnWidth - aSize.Width ); - if ( pItem == spPaperSizeTable ) // initialise delta with first item - { - nDeltaWidth = nCurDeltaWidth; - nDeltaHeight = nCurDeltaHeight; - } - else - { - if ( nCurDeltaWidth < nDeltaWidth && nCurDeltaHeight < nDeltaHeight ) - { - nDeltaWidth = nCurDeltaWidth; - nDeltaHeight = nCurDeltaHeight; - nPaperSizeIndex = (pItem - spPaperSizeTable); - } - } - } - sal_Int32 nTol = 10; // hmm not sure is this the best way - if ( nDeltaWidth <= nTol && nDeltaHeight <= nTol ) - return nPaperSizeIndex; - return excel::XlPaperSize::xlPaperUser; + sal_Int32 nPaperSizeIndex = msfilter::util::PaperSizeConv::getMSPaperSizeIndex( aSize ); + if ( nPaperSizeIndex == 0 ) + nPaperSizeIndex = excel::XlPaperSize::xlPaperUser; + return nPaperSizeIndex; } void SAL_CALL ScVbaPageSetup::setPaperSize( sal_Int32 papersize ) throw (uno::RuntimeException) { - sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); if ( papersize != excel::XlPaperSize::xlPaperUser ) { - if ( papersize < 0 || papersize > nElems - 1 ) - throw uno::RuntimeException(); awt::Size aPaperSize; - aPaperSize.Height = spPaperSizeTable[ papersize ].mnHeight; - aPaperSize.Width = spPaperSizeTable[ papersize ].mnWidth; + const msfilter::util::ApiPaperSize& rConvertedSize = msfilter::util::PaperSizeConv::getApiSizeForMSPaperSizeIndex( papersize ); + aPaperSize.Height = rConvertedSize.mnHeight; + aPaperSize.Width = rConvertedSize.mnWidth; if ( mbIsLandscape ) ::std::swap( aPaperSize.Width, aPaperSize.Height ); mxPageProps->setPropertyValue( "Size", uno::makeAny( aPaperSize ) ); commit 2cc4bbdfc9a0e9681a0af011fcd5a837d4719b07 Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 7 13:04:43 2013 +0100 remove unintended changes ( from some aborted approach ) Change-Id: I793a635711475ebb1125611ec48d52c130cd20a0 (cherry picked from commit 0683a7b15ce668efd79fa556f5511de833c7ec12) diff --git a/sc/source/filter/inc/xlpage.hxx b/sc/source/filter/inc/xlpage.hxx index 1f9118a..2f5599f 100644 --- a/sc/source/filter/inc/xlpage.hxx +++ b/sc/source/filter/inc/xlpage.hxx @@ -23,7 +23,6 @@ #include <tools/gen.hxx> #include <boost/noncopyable.hpp> #include "xltools.hxx" -#include "scdllapi.h" // Constants and Enumerations ================================================= @@ -92,7 +91,7 @@ const sal_uInt16 EXC_PAPERSIZE_USER = 0xFFFF; class SvxBrushItem; /** Contains all page (print) settings for a single sheet. */ -struct SC_DLLPUBLIC XclPageData : private boost::noncopyable +struct XclPageData : private boost::noncopyable { typedef ::std::auto_ptr< SvxBrushItem > SvxBrushItemPtr; commit 533f7a484b4345de34b17a06d0e3f6cc37f922de Author: Noel Power <noel.po...@suse.com> Date: Fri Jun 7 12:48:54 2013 +0100 add missing PageSetup.PageSize api Change-Id: If52fb46f61962827acc08025617d9d61a6ab6d40 (cherry picked from commit 254a2d6c71f7615c7652ca401b9dd3eac1e0d570) diff --git a/oovbaapi/ooo/vba/excel/XPageSetup.idl b/oovbaapi/ooo/vba/excel/XPageSetup.idl index c83f2f1..6c39513 100644 --- a/oovbaapi/ooo/vba/excel/XPageSetup.idl +++ b/oovbaapi/ooo/vba/excel/XPageSetup.idl @@ -53,6 +53,7 @@ interface XPageSetup : com::sun::star::uno::XInterface [attribute] boolean PrintGridlines; [attribute] string PrintTitleRows; [attribute] string PrintTitleColumns; + [attribute] long PaperSize; }; diff --git a/sc/qa/extras/testdocuments/pagesetup.xls b/sc/qa/extras/testdocuments/pagesetup.xls index b1f0b9c..db1033a 100644 Binary files a/sc/qa/extras/testdocuments/pagesetup.xls and b/sc/qa/extras/testdocuments/pagesetup.xls differ diff --git a/sc/source/filter/inc/xlpage.hxx b/sc/source/filter/inc/xlpage.hxx index 2f5599f..1f9118a 100644 --- a/sc/source/filter/inc/xlpage.hxx +++ b/sc/source/filter/inc/xlpage.hxx @@ -23,6 +23,7 @@ #include <tools/gen.hxx> #include <boost/noncopyable.hpp> #include "xltools.hxx" +#include "scdllapi.h" // Constants and Enumerations ================================================= @@ -91,7 +92,7 @@ const sal_uInt16 EXC_PAPERSIZE_USER = 0xFFFF; class SvxBrushItem; /** Contains all page (print) settings for a single sheet. */ -struct XclPageData : private boost::noncopyable +struct SC_DLLPUBLIC XclPageData : private boost::noncopyable { typedef ::std::auto_ptr< SvxBrushItem > SvxBrushItemPtr; diff --git a/sc/source/ui/vba/vbapagesetup.cxx b/sc/source/ui/vba/vbapagesetup.cxx index 9f20b26..0f6c82e 100644 --- a/sc/source/ui/vba/vbapagesetup.cxx +++ b/sc/source/ui/vba/vbapagesetup.cxx @@ -31,6 +31,7 @@ #include <ooo/vba/excel/Constants.hpp> #include <i18nutil/paper.hxx> #include <sal/macros.h> +#include <algorithm> using namespace ::com::sun::star; using namespace ::ooo::vba; @@ -44,7 +45,7 @@ ScVbaPageSetup::ScVbaPageSetup(const uno::Reference< XHelperInterface >& xParent const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< sheet::XSpreadsheet >& xSheet, const uno::Reference< frame::XModel >& xModel) throw (uno::RuntimeException): - ScVbaPageSetup_BASE( xParent, xContext ), mxSheet( xSheet ) + ScVbaPageSetup_BASE( xParent, xContext ), mxSheet( xSheet ), mbIsLandscape( false ) { // query for current page style mxModel.set( xModel, uno::UNO_QUERY_THROW ); @@ -59,6 +60,7 @@ ScVbaPageSetup::ScVbaPageSetup(const uno::Reference< XHelperInterface >& xParent mxPageProps.set( xPageStyle->getByName(aStyleName), uno::UNO_QUERY_THROW ); mnOrientLandscape = excel::XlPageOrientation::xlLandscape; mnOrientPortrait = excel::XlPageOrientation::xlPortrait; + mxPageProps->getPropertyValue("IsLandscape") >>= mbIsLandscape; } OUString SAL_CALL ScVbaPageSetup::getPrintArea() throw (css::uno::RuntimeException) @@ -624,6 +626,146 @@ OUString SAL_CALL ScVbaPageSetup::getPrintTitleColumns() throw (uno::RuntimeExce void SAL_CALL ScVbaPageSetup::setPrintTitleColumns( const OUString& /*_printtitlecolumns*/ ) throw (uno::RuntimeException) { } +/** Paper size in 1/100 millimeters. */ +struct ApiPaperSize +{ + sal_Int32 mnWidth; + sal_Int32 mnHeight; +}; + +// #FIXME ( this is cut'n'pasted from oox, we need to share it somewhere, msfilter ? ) + +#define IN2MM100( v ) static_cast< sal_Int32 >( (v) * 2540.0 + 0.5 ) +#define MM2MM100( v ) static_cast< sal_Int32 >( (v) * 100.0 + 0.5 ) + +static const ApiPaperSize spPaperSizeTable[] = +{ + { 0, 0 }, // 0 - (undefined) + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 1 - Letter paper + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 2 - Letter small paper + { IN2MM100( 11 ), IN2MM100( 17 ) }, // 3 - Tabloid paper + { IN2MM100( 17 ), IN2MM100( 11 ) }, // 4 - Ledger paper + { IN2MM100( 8.5 ), IN2MM100( 14 ) }, // 5 - Legal paper + { IN2MM100( 5.5 ), IN2MM100( 8.5 ) }, // 6 - Statement paper + { IN2MM100( 7.25 ), IN2MM100( 10.5 ) }, // 7 - Executive paper + { MM2MM100( 297 ), MM2MM100( 420 ) }, // 8 - A3 paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 9 - A4 paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 10 - A4 small paper + { MM2MM100( 148 ), MM2MM100( 210 ) }, // 11 - A5 paper + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 12 - B4 paper + { MM2MM100( 176 ), MM2MM100( 250 ) }, // 13 - B5 paper + { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 14 - Folio paper + { MM2MM100( 215 ), MM2MM100( 275 ) }, // 15 - Quarto paper + { IN2MM100( 10 ), IN2MM100( 14 ) }, // 16 - Standard paper + { IN2MM100( 11 ), IN2MM100( 17 ) }, // 17 - Standard paper + { IN2MM100( 8.5 ), IN2MM100( 11 ) }, // 18 - Note paper + { IN2MM100( 3.875 ), IN2MM100( 8.875 ) }, // 19 - #9 envelope + { IN2MM100( 4.125 ), IN2MM100( 9.5 ) }, // 20 - #10 envelope + { IN2MM100( 4.5 ), IN2MM100( 10.375 ) }, // 21 - #11 envelope + { IN2MM100( 4.75 ), IN2MM100( 11 ) }, // 22 - #12 envelope + { IN2MM100( 5 ), IN2MM100( 11.5 ) }, // 23 - #14 envelope + { IN2MM100( 17 ), IN2MM100( 22 ) }, // 24 - C paper + { IN2MM100( 22 ), IN2MM100( 34 ) }, // 25 - D paper + { IN2MM100( 34 ), IN2MM100( 44 ) }, // 26 - E paper + { MM2MM100( 110 ), MM2MM100( 220 ) }, // 27 - DL envelope + { MM2MM100( 162 ), MM2MM100( 229 ) }, // 28 - C5 envelope + { MM2MM100( 324 ), MM2MM100( 458 ) }, // 29 - C3 envelope + { MM2MM100( 229 ), MM2MM100( 324 ) }, // 30 - C4 envelope + { MM2MM100( 114 ), MM2MM100( 162 ) }, // 31 - C6 envelope + { MM2MM100( 114 ), MM2MM100( 229 ) }, // 32 - C65 envelope + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 33 - B4 envelope + { MM2MM100( 176 ), MM2MM100( 250 ) }, // 34 - B5 envelope + { MM2MM100( 176 ), MM2MM100( 125 ) }, // 35 - B6 envelope + { MM2MM100( 110 ), MM2MM100( 230 ) }, // 36 - Italy envelope + { IN2MM100( 3.875 ), IN2MM100( 7.5 ) }, // 37 - Monarch envelope + { IN2MM100( 3.625 ), IN2MM100( 6.5 ) }, // 38 - 6 3/4 envelope + { IN2MM100( 14.875 ), IN2MM100( 11 ) }, // 39 - US standard fanfold + { IN2MM100( 8.5 ), IN2MM100( 12 ) }, // 40 - German standard fanfold + { IN2MM100( 8.5 ), IN2MM100( 13 ) }, // 41 - German legal fanfold + { MM2MM100( 250 ), MM2MM100( 353 ) }, // 42 - ISO B4 + { MM2MM100( 200 ), MM2MM100( 148 ) }, // 43 - Japanese double postcard + { IN2MM100( 9 ), IN2MM100( 11 ) }, // 44 - Standard paper + { IN2MM100( 10 ), IN2MM100( 11 ) }, // 45 - Standard paper + { IN2MM100( 15 ), IN2MM100( 11 ) }, // 46 - Standard paper + { MM2MM100( 220 ), MM2MM100( 220 ) }, // 47 - Invite envelope + { 0, 0 }, // 48 - (undefined) + { 0, 0 }, // 49 - (undefined) + { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 50 - Letter extra paper + { IN2MM100( 9.275 ), IN2MM100( 15 ) }, // 51 - Legal extra paper + { IN2MM100( 11.69 ), IN2MM100( 18 ) }, // 52 - Tabloid extra paper + { MM2MM100( 236 ), MM2MM100( 322 ) }, // 53 - A4 extra paper + { IN2MM100( 8.275 ), IN2MM100( 11 ) }, // 54 - Letter transverse paper + { MM2MM100( 210 ), MM2MM100( 297 ) }, // 55 - A4 transverse paper + { IN2MM100( 9.275 ), IN2MM100( 12 ) }, // 56 - Letter extra transverse paper + { MM2MM100( 227 ), MM2MM100( 356 ) }, // 57 - SuperA/SuperA/A4 paper + { MM2MM100( 305 ), MM2MM100( 487 ) }, // 58 - SuperB/SuperB/A3 paper + { IN2MM100( 8.5 ), IN2MM100( 12.69 ) }, // 59 - Letter plus paper + { MM2MM100( 210 ), MM2MM100( 330 ) }, // 60 - A4 plus paper + { MM2MM100( 148 ), MM2MM100( 210 ) }, // 61 - A5 transverse paper + { MM2MM100( 182 ), MM2MM100( 257 ) }, // 62 - JIS B5 transverse paper + { MM2MM100( 322 ), MM2MM100( 445 ) }, // 63 - A3 extra paper + { MM2MM100( 174 ), MM2MM100( 235 ) }, // 64 - A5 extra paper + { MM2MM100( 201 ), MM2MM100( 276 ) }, // 65 - ISO B5 extra paper + { MM2MM100( 420 ), MM2MM100( 594 ) }, // 66 - A2 paper + { MM2MM100( 297 ), MM2MM100( 420 ) }, // 67 - A3 transverse paper + { MM2MM100( 322 ), MM2MM100( 445 ) } // 68 - A3 extra transverse paper +}; + +sal_Int32 SAL_CALL ScVbaPageSetup::getPaperSize() throw (uno::RuntimeException) +{ + sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); + // Need to find the best match for current size + sal_Int32 nDeltaWidth = 0; + sal_Int32 nDeltaHeight = 0; + awt::Size aSize; // current papersize + mxPageProps->getPropertyValue( "Size" ) >>= aSize; + if ( mbIsLandscape ) + ::std::swap( aSize.Width, aSize.Height ); + + sal_Int32 nPaperSizeIndex = 0; // Undefined + const ApiPaperSize* pItem = spPaperSizeTable; + const ApiPaperSize* pEnd = spPaperSizeTable + nElems; + for ( ; pItem != pEnd; ++pItem ) + { + const ApiPaperSize& rSize = *pItem; + sal_Int32 nCurDeltaHeight = std::abs( rSize.mnHeight - aSize.Height ); + sal_Int32 nCurDeltaWidth = std::abs( rSize.mnWidth - aSize.Width ); + if ( pItem == spPaperSizeTable ) // initialise delta with first item + { + nDeltaWidth = nCurDeltaWidth; + nDeltaHeight = nCurDeltaHeight; + } + else + { + if ( nCurDeltaWidth < nDeltaWidth && nCurDeltaHeight < nDeltaHeight ) + { + nDeltaWidth = nCurDeltaWidth; + nDeltaHeight = nCurDeltaHeight; + nPaperSizeIndex = (pItem - spPaperSizeTable); + } + } + } + sal_Int32 nTol = 10; // hmm not sure is this the best way + if ( nDeltaWidth <= nTol && nDeltaHeight <= nTol ) + return nPaperSizeIndex; + return excel::XlPaperSize::xlPaperUser; +} + +void SAL_CALL ScVbaPageSetup::setPaperSize( sal_Int32 papersize ) throw (uno::RuntimeException) +{ + sal_Int32 nElems = SAL_N_ELEMENTS( spPaperSizeTable ); + if ( papersize != excel::XlPaperSize::xlPaperUser ) + { + if ( papersize < 0 || papersize > nElems - 1 ) + throw uno::RuntimeException(); + awt::Size aPaperSize; + aPaperSize.Height = spPaperSizeTable[ papersize ].mnHeight; + aPaperSize.Width = spPaperSizeTable[ papersize ].mnWidth; + if ( mbIsLandscape ) + ::std::swap( aPaperSize.Width, aPaperSize.Height ); + mxPageProps->setPropertyValue( "Size", uno::makeAny( aPaperSize ) ); + } +} OUString ScVbaPageSetup::getServiceImplName() diff --git a/sc/source/ui/vba/vbapagesetup.hxx b/sc/source/ui/vba/vbapagesetup.hxx index 52da079..8823a08 100644 --- a/sc/source/ui/vba/vbapagesetup.hxx +++ b/sc/source/ui/vba/vbapagesetup.hxx @@ -26,12 +26,14 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <vbahelper/vbahelperinterface.hxx> #include <vbahelper/vbapagesetupbase.hxx> +#include <ooo/vba/excel/XlPaperSize.hpp> typedef cppu::ImplInheritanceHelper1< VbaPageSetupBase, ov::excel::XPageSetup > ScVbaPageSetup_BASE; class ScVbaPageSetup : public ScVbaPageSetup_BASE { css::uno::Reference< css::sheet::XSpreadsheet > mxSheet; + bool mbIsLandscape; public: ScVbaPageSetup( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, @@ -81,6 +83,8 @@ public: virtual void SAL_CALL setPrintTitleRows( const ::rtl::OUString& _printtitlerows ) throw (css::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getPrintTitleColumns() throw (css::uno::RuntimeException); virtual void SAL_CALL setPrintTitleColumns( const ::rtl::OUString& _printtitlecolumns ) throw (css::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getPaperSize() throw (css::uno::RuntimeException); + virtual void SAL_CALL setPaperSize( sal_Int32 papersize ) throw (css::uno::RuntimeException); // XHelperInterface virtual OUString getServiceImplName(); virtual css::uno::Sequence<OUString> getServiceNames(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits