1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #include "vbaheaderfooterhelper.hxx" 28 #include "wordvbahelper.hxx" 29 #include <comphelper/processfactory.hxx> 30 #include <com/sun/star/frame/XController.hpp> 31 #include <com/sun/star/text/XTextViewCursorSupplier.hpp> 32 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> 33 #include <com/sun/star/container/XNameAccess.hpp> 34 35 using namespace ::com::sun::star; 36 using namespace ::ooo::vba; 37 38 #define FIRST_PAGE 1; 39 40 // Class HeaderFooterHelper 41 42 sal_Bool HeaderFooterHelper::isHeader( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 43 { 44 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 45 uno::Reference< beans::XPropertySet > xStyleProps( word::getCurrentPageStyle( xModel ), uno::UNO_QUERY_THROW ); 46 47 sal_Bool isOn = sal_False; 48 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderIsOn"))) >>= isOn; 49 if( !isOn ) 50 return sal_False; 51 52 sal_Bool isShared = sal_False; 53 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderIsShared"))) >>= isShared; 54 55 rtl::OUString aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderText") ); 56 if( !isShared ) 57 { 58 if( 0 == xPageCursor->getPage() % 2 ) 59 { 60 aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderTextLeft") ); 61 } 62 else 63 { 64 aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderTextRight") ); 65 } 66 } 67 68 uno::Reference< text::XText > xText( xStyleProps->getPropertyValue( aPropText ), uno::UNO_QUERY_THROW ); 69 //FIXME: can not compare in this way? 70 return ( xText == xCurrentText ); 71 } 72 73 sal_Bool HeaderFooterHelper::isFirstPageHeader( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 74 { 75 if( isHeader( xModel, xCurrentText ) ) 76 { 77 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 78 // FIXME: getPage allways returns 1 79 sal_Int32 nPage = xPageCursor->getPage(); 80 return nPage == FIRST_PAGE; 81 } 82 return sal_False; 83 } 84 85 sal_Bool HeaderFooterHelper::isEvenPagesHeader( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 86 { 87 if( isHeader( xModel, xCurrentText ) ) 88 { 89 uno::Reference< beans::XPropertySet > xStyleProps( word::getCurrentPageStyle( xModel ), uno::UNO_QUERY_THROW ); 90 sal_Bool isShared = sal_False; 91 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HeaderIsShared"))) >>= isShared; 92 if( !isShared ) 93 { 94 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 95 return ( 0 == xPageCursor->getPage() % 2 ); 96 } 97 } 98 return sal_False; 99 } 100 101 sal_Bool HeaderFooterHelper::isFooter( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 102 { 103 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 104 uno::Reference< beans::XPropertySet > xStyleProps( word::getCurrentPageStyle( xModel ), uno::UNO_QUERY_THROW ); 105 106 sal_Bool isOn = sal_False; 107 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterIsOn"))) >>= isOn; 108 if( !isOn ) 109 return sal_False; 110 111 sal_Bool isShared = sal_False; 112 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterIsShared"))) >>= isShared; 113 114 rtl::OUString aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterText") ); 115 if( !isShared ) 116 { 117 if( 0 == xPageCursor->getPage() % 2 ) 118 { 119 aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterTextLeft") ); 120 } 121 else 122 { 123 aPropText = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterTextRight") ); 124 } 125 } 126 127 uno::Reference< text::XText > xText( xStyleProps->getPropertyValue( aPropText ), uno::UNO_QUERY_THROW ); 128 129 return ( xText == xCurrentText ); 130 } 131 132 sal_Bool HeaderFooterHelper::isFirstPageFooter( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 133 { 134 if( isFooter( xModel, xCurrentText ) ) 135 { 136 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 137 sal_Int32 nPage = xPageCursor->getPage(); 138 return nPage == FIRST_PAGE; 139 } 140 return sal_False; 141 } 142 143 sal_Bool HeaderFooterHelper::isEvenPagesFooter( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 144 { 145 if( isFooter( xModel, xCurrentText ) ) 146 { 147 uno::Reference< beans::XPropertySet > xStyleProps( word::getCurrentPageStyle( xModel ), uno::UNO_QUERY_THROW ); 148 sal_Bool isShared = sal_False; 149 xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FooterIsShared"))) >>= isShared; 150 if( !isShared ) 151 { 152 uno::Reference< text::XPageCursor > xPageCursor( word::getXTextViewCursor( xModel ), uno::UNO_QUERY_THROW ); 153 return ( 0 == xPageCursor->getPage() % 2 ); 154 } 155 } 156 return sal_False; 157 } 158 #ifdef TOMORROW 159 sal_Bool HeaderFooterHelper::isPrimaryHeader( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 160 { 161 if( isHeader( xModel, xCurrentText ) ) 162 { 163 return( !( isFirstPageHeader( xModel, xCurrentText ) && isEvenPagesHeader( xModel, xCurrentText ) ) ); 164 } 165 return sal_False; 166 } 167 168 sal_Bool HeaderFooterHelper::isPrimaryFooter( const uno::Reference< frame::XModel >& xModel, const uno::Reference< text::XText >& xCurrentText ) throw (uno::RuntimeException) 169 { 170 if( isHeader( xModel, xCurrentText ) ) 171 { 172 return( !( isFirstPageFooter( xModel, xCurrentText ) && isEvenPagesFooter( xModel, xCurrentText ) ) ); 173 } 174 return sal_False; 175 } 176 #endif 177