1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 #include "notesuno.hxx" 28 29 #include <svl/smplhint.hxx> 30 #include <editeng/unotext.hxx> 31 #include <svx/svdpool.hxx> 32 #include <svx/svdobj.hxx> 33 #include <svx/unoshape.hxx> 34 #include <svx/svdocapt.hxx> 35 36 #include "postit.hxx" 37 #include "cellsuno.hxx" 38 #include "docsh.hxx" 39 #include "docfunc.hxx" 40 #include "hints.hxx" 41 #include "editsrc.hxx" 42 #include "miscuno.hxx" 43 #include "unoguard.hxx" 44 45 using namespace com::sun::star; 46 47 //------------------------------------------------------------------------ 48 49 // keine Properties fuer Text in Notizen 50 const SvxItemPropertySet* lcl_GetAnnotationPropertySet() 51 { 52 static SfxItemPropertyMapEntry aAnnotationPropertyMap_Impl[] = 53 { 54 {0,0,0,0,0,0} 55 }; 56 static SvxItemPropertySet aAnnotationPropertySet_Impl( aAnnotationPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); 57 return &aAnnotationPropertySet_Impl; 58 } 59 60 //------------------------------------------------------------------------ 61 62 SC_SIMPLE_SERVICE_INFO( ScAnnotationObj, "ScAnnotationObj", "com.sun.star.sheet.CellAnnotation" ) 63 //SC_SIMPLE_SERVICE_INFO( ScAnnotationShapeObj, "ScAnnotationShapeObj", "com.sun.star.sheet.CellAnnotationShape" ) 64 65 //------------------------------------------------------------------------ 66 67 ScAnnotationObj::ScAnnotationObj(ScDocShell* pDocSh, const ScAddress& rPos) : 68 pDocShell( pDocSh ), 69 aCellPos( rPos ), 70 pUnoText( NULL ) 71 { 72 pDocShell->GetDocument()->AddUnoObject(*this); 73 74 // pUnoText is allocated on demand (GetUnoText) 75 // can't be aggregated because getString/setString is handled here 76 } 77 78 ScAnnotationObj::~ScAnnotationObj() 79 { 80 if (pDocShell) 81 pDocShell->GetDocument()->RemoveUnoObject(*this); 82 83 if (pUnoText) 84 pUnoText->release(); 85 } 86 87 void ScAnnotationObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) 88 { 89 if ( rHint.ISA( ScUpdateRefHint ) ) 90 { 91 // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; 92 93 //! Ref-Update 94 } 95 else if ( rHint.ISA( SfxSimpleHint ) && 96 ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) 97 { 98 pDocShell = NULL; // ungueltig geworden 99 } 100 } 101 102 103 // XChild 104 105 uno::Reference<uno::XInterface> SAL_CALL ScAnnotationObj::getParent() throw(uno::RuntimeException) 106 { 107 ScUnoGuard aGuard; 108 109 // Parent der Notiz ist die zugehoerige Zelle 110 //! existierendes Objekt finden und zurueckgeben ??? 111 112 if (pDocShell) 113 return (cppu::OWeakObject*)new ScCellObj( pDocShell, aCellPos ); 114 115 return NULL; 116 } 117 118 void SAL_CALL ScAnnotationObj::setParent( const uno::Reference<uno::XInterface>& /* Parent */ ) 119 throw(lang::NoSupportException, uno::RuntimeException) 120 { 121 // hamma nich 122 //! Exception oder so ??! 123 } 124 125 // XSimpleText 126 127 uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursor() 128 throw(uno::RuntimeException) 129 { 130 ScUnoGuard aGuard; 131 // Notizen brauchen keine Extrawurst 132 return GetUnoText().createTextCursor(); 133 } 134 135 uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursorByRange( 136 const uno::Reference<text::XTextRange>& aTextPosition ) 137 throw(uno::RuntimeException) 138 { 139 ScUnoGuard aGuard; 140 // Notizen brauchen keine Extrawurst 141 return GetUnoText().createTextCursorByRange(aTextPosition); 142 } 143 144 rtl::OUString SAL_CALL ScAnnotationObj::getString() throw(uno::RuntimeException) 145 { 146 ScUnoGuard aGuard; 147 return GetUnoText().getString(); 148 } 149 150 void SAL_CALL ScAnnotationObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) 151 { 152 ScUnoGuard aGuard; 153 GetUnoText().setString(aText); 154 } 155 156 void SAL_CALL ScAnnotationObj::insertString( const uno::Reference<text::XTextRange>& xRange, 157 const rtl::OUString& aString, sal_Bool bAbsorb ) 158 throw(uno::RuntimeException) 159 { 160 ScUnoGuard aGuard; 161 GetUnoText().insertString( xRange, aString, bAbsorb ); 162 } 163 164 void SAL_CALL ScAnnotationObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange, 165 sal_Int16 nControlCharacter, sal_Bool bAbsorb ) 166 throw(lang::IllegalArgumentException, uno::RuntimeException) 167 { 168 ScUnoGuard aGuard; 169 GetUnoText().insertControlCharacter( xRange, nControlCharacter, bAbsorb ); 170 } 171 172 uno::Reference<text::XText> SAL_CALL ScAnnotationObj::getText() throw(uno::RuntimeException) 173 { 174 ScUnoGuard aGuard; 175 return GetUnoText().getText(); 176 } 177 178 uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getStart() throw(uno::RuntimeException) 179 { 180 ScUnoGuard aGuard; 181 return GetUnoText().getStart(); 182 } 183 184 uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getEnd() throw(uno::RuntimeException) 185 { 186 ScUnoGuard aGuard; 187 return GetUnoText().getEnd(); 188 } 189 190 // XSheetAnnotation 191 192 table::CellAddress SAL_CALL ScAnnotationObj::getPosition() throw(uno::RuntimeException) 193 { 194 ScUnoGuard aGuard; 195 table::CellAddress aAdr; 196 aAdr.Sheet = aCellPos.Tab(); 197 aAdr.Column = aCellPos.Col(); 198 aAdr.Row = aCellPos.Row(); 199 return aAdr; 200 } 201 202 rtl::OUString SAL_CALL ScAnnotationObj::getAuthor() throw(uno::RuntimeException) 203 { 204 ScUnoGuard aGuard; 205 const ScPostIt* pNote = ImplGetNote(); 206 return pNote ? pNote->GetAuthor() : rtl::OUString(); 207 } 208 209 rtl::OUString SAL_CALL ScAnnotationObj::getDate() throw(uno::RuntimeException) 210 { 211 ScUnoGuard aGuard; 212 const ScPostIt* pNote = ImplGetNote(); 213 return pNote ? pNote->GetDate() : rtl::OUString(); 214 } 215 216 sal_Bool SAL_CALL ScAnnotationObj::getIsVisible() throw(uno::RuntimeException) 217 { 218 ScUnoGuard aGuard; 219 const ScPostIt* pNote = ImplGetNote(); 220 return pNote && pNote->IsCaptionShown(); 221 } 222 223 void SAL_CALL ScAnnotationObj::setIsVisible( sal_Bool bIsVisible ) throw(uno::RuntimeException) 224 { 225 ScUnoGuard aGuard; 226 // show/hide note with undo action 227 if( pDocShell ) 228 pDocShell->GetDocFunc().ShowNote( aCellPos, bIsVisible ); 229 } 230 231 // XSheetAnnotationShapeSupplier 232 uno::Reference < drawing::XShape > SAL_CALL ScAnnotationObj::getAnnotationShape() 233 throw(::com::sun::star::uno::RuntimeException) 234 { 235 ScUnoGuard aGuard; 236 uno::Reference < drawing::XShape > xShape; 237 if( const ScPostIt* pNote = ImplGetNote() ) 238 if( SdrObject* pCaption = pNote->GetOrCreateCaption( aCellPos ) ) 239 xShape.set( pCaption->getUnoShape(), uno::UNO_QUERY ); 240 return xShape; 241 } 242 243 SvxUnoText& ScAnnotationObj::GetUnoText() 244 { 245 if (!pUnoText) 246 { 247 ScAnnotationEditSource aEditSource( pDocShell, aCellPos ); 248 pUnoText = new SvxUnoText( &aEditSource, lcl_GetAnnotationPropertySet(), 249 uno::Reference<text::XText>() ); 250 pUnoText->acquire(); 251 } 252 return *pUnoText; 253 } 254 255 const ScPostIt* ScAnnotationObj::ImplGetNote() const 256 { 257 return pDocShell ? pDocShell->GetDocument()->GetNote( aCellPos ) : 0; 258 } 259 260 //------------------------------------------------------------------------ 261