xref: /trunk/main/sc/source/ui/unoobj/notesuno.cxx (revision cdf0e10c)
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 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 #include "notesuno.hxx"
32 
33 #include <svl/smplhint.hxx>
34 #include <editeng/unotext.hxx>
35 #include <svx/svdpool.hxx>
36 #include <svx/svdobj.hxx>
37 #include <svx/unoshape.hxx>
38 #include <svx/svdocapt.hxx>
39 
40 #include "postit.hxx"
41 #include "cellsuno.hxx"
42 #include "docsh.hxx"
43 #include "docfunc.hxx"
44 #include "hints.hxx"
45 #include "editsrc.hxx"
46 #include "miscuno.hxx"
47 #include "unoguard.hxx"
48 
49 using namespace com::sun::star;
50 
51 //------------------------------------------------------------------------
52 
53 //	keine Properties fuer Text in Notizen
54 const SvxItemPropertySet* lcl_GetAnnotationPropertySet()
55 {
56     static SfxItemPropertyMapEntry aAnnotationPropertyMap_Impl[] =
57 	{
58         {0,0,0,0,0,0}
59 	};
60 	static SvxItemPropertySet aAnnotationPropertySet_Impl( aAnnotationPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
61 	return &aAnnotationPropertySet_Impl;
62 }
63 
64 //------------------------------------------------------------------------
65 
66 SC_SIMPLE_SERVICE_INFO( ScAnnotationObj, "ScAnnotationObj", "com.sun.star.sheet.CellAnnotation" )
67 //SC_SIMPLE_SERVICE_INFO( ScAnnotationShapeObj, "ScAnnotationShapeObj", "com.sun.star.sheet.CellAnnotationShape" )
68 
69 //------------------------------------------------------------------------
70 
71 ScAnnotationObj::ScAnnotationObj(ScDocShell* pDocSh, const ScAddress& rPos) :
72 	pDocShell( pDocSh ),
73 	aCellPos( rPos ),
74 	pUnoText( NULL )
75 {
76 	pDocShell->GetDocument()->AddUnoObject(*this);
77 
78 	//	pUnoText is allocated on demand (GetUnoText)
79 	//	can't be aggregated because getString/setString is handled here
80 }
81 
82 ScAnnotationObj::~ScAnnotationObj()
83 {
84 	if (pDocShell)
85 		pDocShell->GetDocument()->RemoveUnoObject(*this);
86 
87 	if (pUnoText)
88 		pUnoText->release();
89 }
90 
91 void ScAnnotationObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
92 {
93 	if ( rHint.ISA( ScUpdateRefHint ) )
94 	{
95 //        const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
96 
97 		//!	Ref-Update
98 	}
99 	else if ( rHint.ISA( SfxSimpleHint ) &&
100 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
101 	{
102 		pDocShell = NULL;		// ungueltig geworden
103 	}
104 }
105 
106 
107 // XChild
108 
109 uno::Reference<uno::XInterface> SAL_CALL ScAnnotationObj::getParent() throw(uno::RuntimeException)
110 {
111 	ScUnoGuard aGuard;
112 
113 	//	Parent der Notiz ist die zugehoerige Zelle
114 	//!	existierendes Objekt finden und zurueckgeben ???
115 
116 	if (pDocShell)
117 		return (cppu::OWeakObject*)new ScCellObj( pDocShell, aCellPos );
118 
119 	return NULL;
120 }
121 
122 void SAL_CALL ScAnnotationObj::setParent( const uno::Reference<uno::XInterface>& /* Parent */ )
123 									throw(lang::NoSupportException, uno::RuntimeException)
124 {
125 	//	hamma nich
126 	//!	Exception oder so ??!
127 }
128 
129 // XSimpleText
130 
131 uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursor()
132 													throw(uno::RuntimeException)
133 {
134 	ScUnoGuard aGuard;
135 	//	Notizen brauchen keine Extrawurst
136 	return GetUnoText().createTextCursor();
137 }
138 
139 uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursorByRange(
140 									const uno::Reference<text::XTextRange>& aTextPosition )
141 													throw(uno::RuntimeException)
142 {
143 	ScUnoGuard aGuard;
144 	//	Notizen brauchen keine Extrawurst
145 	return GetUnoText().createTextCursorByRange(aTextPosition);
146 }
147 
148 rtl::OUString SAL_CALL ScAnnotationObj::getString() throw(uno::RuntimeException)
149 {
150 	ScUnoGuard aGuard;
151 	return GetUnoText().getString();
152 }
153 
154 void SAL_CALL ScAnnotationObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException)
155 {
156 	ScUnoGuard aGuard;
157     GetUnoText().setString(aText);
158 }
159 
160 void SAL_CALL ScAnnotationObj::insertString( const uno::Reference<text::XTextRange>& xRange,
161 											const rtl::OUString& aString, sal_Bool bAbsorb )
162 								throw(uno::RuntimeException)
163 {
164 	ScUnoGuard aGuard;
165 	GetUnoText().insertString( xRange, aString, bAbsorb );
166 }
167 
168 void SAL_CALL ScAnnotationObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange,
169 											sal_Int16 nControlCharacter, sal_Bool bAbsorb )
170 								throw(lang::IllegalArgumentException, uno::RuntimeException)
171 {
172 	ScUnoGuard aGuard;
173 	GetUnoText().insertControlCharacter( xRange, nControlCharacter, bAbsorb );
174 }
175 
176 uno::Reference<text::XText> SAL_CALL ScAnnotationObj::getText() throw(uno::RuntimeException)
177 {
178 	ScUnoGuard aGuard;
179 	return GetUnoText().getText();
180 }
181 
182 uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getStart() throw(uno::RuntimeException)
183 {
184 	ScUnoGuard aGuard;
185 	return GetUnoText().getStart();
186 }
187 
188 uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getEnd() throw(uno::RuntimeException)
189 {
190 	ScUnoGuard aGuard;
191 	return GetUnoText().getEnd();
192 }
193 
194 // XSheetAnnotation
195 
196 table::CellAddress SAL_CALL ScAnnotationObj::getPosition() throw(uno::RuntimeException)
197 {
198 	ScUnoGuard aGuard;
199 	table::CellAddress aAdr;
200 	aAdr.Sheet	= aCellPos.Tab();
201 	aAdr.Column	= aCellPos.Col();
202 	aAdr.Row	= aCellPos.Row();
203 	return aAdr;
204 }
205 
206 rtl::OUString SAL_CALL ScAnnotationObj::getAuthor() throw(uno::RuntimeException)
207 {
208     ScUnoGuard aGuard;
209     const ScPostIt* pNote = ImplGetNote();
210     return pNote ? pNote->GetAuthor() : rtl::OUString();
211 }
212 
213 rtl::OUString SAL_CALL ScAnnotationObj::getDate() throw(uno::RuntimeException)
214 {
215     ScUnoGuard aGuard;
216     const ScPostIt* pNote = ImplGetNote();
217     return pNote ? pNote->GetDate() : rtl::OUString();
218 }
219 
220 sal_Bool SAL_CALL ScAnnotationObj::getIsVisible() throw(uno::RuntimeException)
221 {
222     ScUnoGuard aGuard;
223     const ScPostIt* pNote = ImplGetNote();
224     return pNote && pNote->IsCaptionShown();
225 }
226 
227 void SAL_CALL ScAnnotationObj::setIsVisible( sal_Bool bIsVisible ) throw(uno::RuntimeException)
228 {
229     ScUnoGuard aGuard;
230     // show/hide note with undo action
231     if( pDocShell )
232         pDocShell->GetDocFunc().ShowNote( aCellPos, bIsVisible );
233 }
234 
235 // XSheetAnnotationShapeSupplier
236 uno::Reference < drawing::XShape > SAL_CALL ScAnnotationObj::getAnnotationShape()
237                                 throw(::com::sun::star::uno::RuntimeException)
238 {
239     ScUnoGuard aGuard;
240     uno::Reference < drawing::XShape > xShape;
241     if( const ScPostIt* pNote = ImplGetNote() )
242         if( SdrObject* pCaption = pNote->GetOrCreateCaption( aCellPos ) )
243             xShape.set( pCaption->getUnoShape(), uno::UNO_QUERY );
244 	return xShape;
245 }
246 
247 SvxUnoText& ScAnnotationObj::GetUnoText()
248 {
249     if (!pUnoText)
250     {
251         ScAnnotationEditSource aEditSource( pDocShell, aCellPos );
252         pUnoText = new SvxUnoText( &aEditSource, lcl_GetAnnotationPropertySet(),
253                                     uno::Reference<text::XText>() );
254         pUnoText->acquire();
255     }
256     return *pUnoText;
257 }
258 
259 const ScPostIt* ScAnnotationObj::ImplGetNote() const
260 {
261     return pDocShell ? pDocShell->GetDocument()->GetNote( aCellPos ) : 0;
262 }
263 
264 //------------------------------------------------------------------------
265