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 "vbacomment.hxx" 28 29 #include <ooo/vba/excel/XlCreator.hpp> 30 #include <com/sun/star/drawing/XDrawPageSupplier.hpp> 31 #include <com/sun/star/sheet/XSpreadsheet.hpp> 32 #include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp> 33 #include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp> 34 #include <com/sun/star/sheet/XSheetAnnotationShapeSupplier.hpp> 35 #include <com/sun/star/sheet/XSheetCellRange.hpp> 36 #include <com/sun/star/table/CellAddress.hpp> 37 #include <com/sun/star/table/XCell.hpp> 38 #include <com/sun/star/text/XText.hpp> 39 40 #include <vbahelper/vbashape.hxx> 41 #include "vbaglobals.hxx" 42 #include "vbacomments.hxx" 43 44 45 using namespace ::ooo::vba; 46 using namespace ::com::sun::star; 47 48 ScVbaComment::ScVbaComment( 49 const uno::Reference< XHelperInterface >& xParent, 50 const uno::Reference< uno::XComponentContext >& xContext, 51 const uno::Reference< frame::XModel >& xModel, 52 const uno::Reference< table::XCellRange >& xRange ) throw( lang::IllegalArgumentException ) : 53 ScVbaComment_BASE( xParent, xContext ), 54 mxModel( xModel, uno::UNO_SET_THROW ), 55 mxRange( xRange ) 56 { 57 if ( !xRange.is() ) 58 throw lang::IllegalArgumentException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "range is not set " ) ), uno::Reference< uno::XInterface >() , 1 ); 59 uno::Reference< text::XSimpleText > xAnnoText( getAnnotation(), uno::UNO_QUERY ); 60 } 61 62 // private helper functions 63 64 uno::Reference< sheet::XSheetAnnotation > SAL_CALL 65 ScVbaComment::getAnnotation() throw (uno::RuntimeException) 66 { 67 uno::Reference< table::XCell > xCell( mxRange->getCellByPosition(0, 0), uno::UNO_QUERY_THROW ); 68 uno::Reference< sheet::XSheetAnnotationAnchor > xAnnoAnchor( xCell, uno::UNO_QUERY_THROW ); 69 return uno::Reference< sheet::XSheetAnnotation > ( xAnnoAnchor->getAnnotation(), uno::UNO_QUERY_THROW ); 70 } 71 72 uno::Reference< sheet::XSheetAnnotations > SAL_CALL 73 ScVbaComment::getAnnotations() throw (uno::RuntimeException) 74 { 75 uno::Reference< sheet::XSheetCellRange > xSheetCellRange(mxRange, ::uno::UNO_QUERY_THROW ); 76 uno::Reference< sheet::XSpreadsheet > xSheet = xSheetCellRange->getSpreadsheet(); 77 uno::Reference< sheet::XSheetAnnotationsSupplier > xAnnosSupp( xSheet, uno::UNO_QUERY_THROW ); 78 79 return uno::Reference< sheet::XSheetAnnotations > ( xAnnosSupp->getAnnotations(), uno::UNO_QUERY_THROW ); 80 } 81 82 sal_Int32 SAL_CALL 83 ScVbaComment::getAnnotationIndex() throw (uno::RuntimeException) 84 { 85 uno::Reference< sheet::XSheetAnnotations > xAnnos = getAnnotations(); 86 table::CellAddress aAddress = getAnnotation()->getPosition(); 87 88 sal_Int32 aIndex = 0; 89 sal_Int32 aCount = xAnnos->getCount(); 90 91 for ( ; aIndex < aCount ; aIndex++ ) 92 { 93 uno::Reference< sheet::XSheetAnnotation > xAnno( xAnnos->getByIndex( aIndex ), uno::UNO_QUERY_THROW ); 94 table::CellAddress xAddress = xAnno->getPosition(); 95 96 if ( xAddress.Column == aAddress.Column && xAddress.Row == aAddress.Row && xAddress.Sheet == aAddress.Sheet ) 97 { 98 OSL_TRACE("** terminating search, index is %d", aIndex ); 99 break; 100 } 101 } 102 OSL_TRACE("** returning index is %d", aIndex ); 103 104 return aIndex; 105 } 106 107 uno::Reference< excel::XComment > SAL_CALL 108 ScVbaComment::getCommentByIndex( sal_Int32 Index ) throw (uno::RuntimeException) 109 { 110 uno::Reference< container::XIndexAccess > xIndexAccess( getAnnotations(), uno::UNO_QUERY_THROW ); 111 // parent is sheet ( parent of the range which is the parent of the comment ) 112 uno::Reference< XCollection > xColl( new ScVbaComments( getParent()->getParent(), mxContext, mxModel, xIndexAccess ) ); 113 114 return uno::Reference< excel::XComment > ( xColl->Item( uno::makeAny( Index ), uno::Any() ), uno::UNO_QUERY_THROW ); 115 } 116 117 // public vba functions 118 119 rtl::OUString SAL_CALL 120 ScVbaComment::getAuthor() throw (uno::RuntimeException) 121 { 122 return getAnnotation()->getAuthor(); 123 } 124 125 void SAL_CALL 126 ScVbaComment::setAuthor( const rtl::OUString& /*_author*/ ) throw (uno::RuntimeException) 127 { 128 // #TODO #FIXME implementation needed 129 } 130 131 uno::Reference< msforms::XShape > SAL_CALL 132 ScVbaComment::getShape() throw (uno::RuntimeException) 133 { 134 uno::Reference< sheet::XSheetAnnotationShapeSupplier > xAnnoShapeSupp( getAnnotation(), uno::UNO_QUERY_THROW ); 135 uno::Reference< drawing::XShape > xAnnoShape( xAnnoShapeSupp->getAnnotationShape(), uno::UNO_SET_THROW ); 136 uno::Reference< sheet::XSheetCellRange > xCellRange( mxRange, uno::UNO_QUERY_THROW ); 137 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupp( xCellRange->getSpreadsheet(), uno::UNO_QUERY_THROW ); 138 uno::Reference< drawing::XShapes > xShapes( xDrawPageSupp->getDrawPage(), uno::UNO_QUERY_THROW ); 139 return new ScVbaShape( this, mxContext, xAnnoShape, xShapes, mxModel, office::MsoShapeType::msoComment ); 140 } 141 142 sal_Bool SAL_CALL 143 ScVbaComment::getVisible() throw (uno::RuntimeException) 144 { 145 return getAnnotation()->getIsVisible(); 146 } 147 148 void SAL_CALL 149 ScVbaComment::setVisible( sal_Bool _visible ) throw (uno::RuntimeException) 150 { 151 getAnnotation()->setIsVisible( _visible ); 152 } 153 154 void SAL_CALL 155 ScVbaComment::Delete() throw (uno::RuntimeException) 156 { 157 getAnnotations()->removeByIndex( getAnnotationIndex() ); 158 } 159 160 uno::Reference< excel::XComment > SAL_CALL 161 ScVbaComment::Next() throw (uno::RuntimeException) 162 { 163 // index: uno = 0, vba = 1 164 return getCommentByIndex( getAnnotationIndex() + 2 ); 165 } 166 167 uno::Reference< excel::XComment > SAL_CALL 168 ScVbaComment::Previous() throw (uno::RuntimeException) 169 { 170 // index: uno = 0, vba = 1 171 return getCommentByIndex( getAnnotationIndex() ); 172 } 173 174 rtl::OUString SAL_CALL 175 ScVbaComment::Text( const uno::Any& aText, const uno::Any& aStart, const uno::Any& Overwrite ) throw (uno::RuntimeException) 176 { 177 rtl::OUString sText; 178 aText >>= sText; 179 180 uno::Reference< text::XSimpleText > xAnnoText( getAnnotation(), uno::UNO_QUERY_THROW ); 181 rtl::OUString sAnnoText = xAnnoText->getString(); 182 183 if ( aStart.hasValue() ) 184 { 185 sal_Int16 nStart = 0; 186 sal_Bool bOverwrite = sal_True; 187 Overwrite >>= bOverwrite; 188 189 if ( aStart >>= nStart ) 190 { 191 uno::Reference< text::XTextCursor > xTextCursor( xAnnoText->createTextCursor(), uno::UNO_QUERY_THROW ); 192 193 if ( bOverwrite ) 194 { 195 xTextCursor->collapseToStart(); 196 xTextCursor->gotoStart( sal_False ); 197 xTextCursor->goRight( nStart - 1, sal_False ); 198 xTextCursor->gotoEnd( sal_True ); 199 } 200 else 201 { 202 xTextCursor->collapseToStart(); 203 xTextCursor->gotoStart( sal_False ); 204 xTextCursor->goRight( nStart - 1 , sal_True ); 205 } 206 207 uno::Reference< text::XTextRange > xRange( xTextCursor, uno::UNO_QUERY_THROW ); 208 xAnnoText->insertString( xRange, sText, bOverwrite ); 209 return xAnnoText->getString(); 210 } 211 throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ScVbaComment::Text - bad Start value " ) ), uno::Reference< uno::XInterface >() ); 212 } 213 else if ( aText.hasValue() ) 214 { 215 xAnnoText->setString( sText ); 216 return sText; 217 } 218 219 return sAnnoText; 220 } 221 222 rtl::OUString& 223 ScVbaComment::getServiceImplName() 224 { 225 static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaComment") ); 226 return sImplName; 227 } 228 229 uno::Sequence< rtl::OUString > 230 ScVbaComment::getServiceNames() 231 { 232 static uno::Sequence< rtl::OUString > aServiceNames; 233 if ( aServiceNames.getLength() == 0 ) 234 { 235 aServiceNames.realloc( 1 ); 236 aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.ScVbaComment" ) ); 237 } 238 return aServiceNames; 239 } 240