xref: /trunk/main/sw/source/core/unocore/unocoll.cxx (revision ffd38472365e95f6a578737bc9a5eb0fac624a86)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sw.hxx"
24 
25 #include <swtypes.hxx>
26 #include <cmdid.h>
27 #include <hintids.hxx>
28 #include <svx/svxids.hrc>
29 #include <doc.hxx>
30 #include <docary.hxx>
31 #include <fmtcol.hxx>
32 #include <poolfmt.hxx>
33 #include <unocoll.hxx>
34 #include <unosett.hxx>
35 #include <fmtanchr.hxx>
36 #include <ndtxt.hxx>
37 #include <section.hxx>
38 #include <IMark.hxx>
39 #include <ftnidx.hxx>
40 #include <fmtftn.hxx>
41 #include <txtftn.hxx>
42 #include <fmtpdsc.hxx>
43 #include <pagedesc.hxx>
44 #include <vos/mutex.hxx>
45 #include <com/sun/star/text/XTextTableCursor.hpp>
46 #include <com/sun/star/text/XTextTablesSupplier.hpp>
47 #include <com/sun/star/text/TableColumnSeparator.hpp>
48 #include <com/sun/star/text/XTextTable.hpp>
49 #include <svl/PasswordHelper.hxx>
50 #include <svtools/unoimap.hxx>
51 #include <svtools/unoevent.hxx>
52 #include <unotbl.hxx>
53 #include <unostyle.hxx>
54 #include <unofield.hxx>
55 #include <unoidx.hxx>
56 #include <unoframe.hxx>
57 #include <unofootnote.hxx>
58 #include <vcl/svapp.hxx>
59 #include <fmtcntnt.hxx>
60 #include <authfld.hxx>
61 #include <SwXTextDefaults.hxx>
62 #include <unochart.hxx>
63 #include <comphelper/makesequence.hxx>
64 #include <comphelper/sequence.hxx>
65 #include <list>
66 #include <iterator>
67 #include <unosection.hxx>
68 #include <unoparagraph.hxx>
69 #include <unobookmark.hxx>
70 #include <unorefmark.hxx>
71 #include <unometa.hxx>
72 #include "docsh.hxx"
73 #include <switerator.hxx>
74 
75 using ::rtl::OUString;
76 using namespace ::com::sun::star;
77 using namespace ::com::sun::star::document;
78 using namespace ::com::sun::star::uno;
79 using namespace ::com::sun::star::text;
80 using namespace ::com::sun::star::container;
81 using namespace ::com::sun::star::lang;
82 
83 /******************************************************************************
84  *
85  ******************************************************************************/
86 struct  ProvNamesId_Type
87 {
88     const char *    pName;
89     sal_uInt16      nType;
90 };
91 
92 // note: this thing is indexed as an array, so do not insert/remove entries!
93 const ProvNamesId_Type __FAR_DATA aProvNamesId[] =
94 {
95     { "com.sun.star.text.TextTable",                          SW_SERVICE_TYPE_TEXTTABLE },
96     { "com.sun.star.text.TextFrame",                          SW_SERVICE_TYPE_TEXTFRAME },
97     { "com.sun.star.text.GraphicObject",                      SW_SERVICE_TYPE_GRAPHIC },
98     { "com.sun.star.text.TextEmbeddedObject",                 SW_SERVICE_TYPE_OLE },
99     { "com.sun.star.text.Bookmark",                           SW_SERVICE_TYPE_BOOKMARK },
100     { "com.sun.star.text.Footnote",                           SW_SERVICE_TYPE_FOOTNOTE },
101     { "com.sun.star.text.Endnote",                            SW_SERVICE_TYPE_ENDNOTE },
102     { "com.sun.star.text.DocumentIndexMark",                  SW_SERVICE_TYPE_INDEXMARK },
103     { "com.sun.star.text.DocumentIndex",                      SW_SERVICE_TYPE_INDEX },
104     { "com.sun.star.text.ReferenceMark",                      SW_SERVICE_REFERENCE_MARK },
105     { "com.sun.star.style.CharacterStyle",                    SW_SERVICE_STYLE_CHARACTER_STYLE },
106     { "com.sun.star.style.ParagraphStyle",                    SW_SERVICE_STYLE_PARAGRAPH_STYLE },
107     { "com.sun.star.style.FrameStyle",                        SW_SERVICE_STYLE_FRAME_STYLE },
108     { "com.sun.star.style.PageStyle",                         SW_SERVICE_STYLE_PAGE_STYLE },
109     { "com.sun.star.style.NumberingStyle",                    SW_SERVICE_STYLE_NUMBERING_STYLE },
110     { "com.sun.star.text.ContentIndexMark",                   SW_SERVICE_CONTENT_INDEX_MARK },
111     { "com.sun.star.text.ContentIndex",                       SW_SERVICE_CONTENT_INDEX },
112     { "com.sun.star.text.UserIndexMark",                      SW_SERVICE_USER_INDEX_MARK },
113     { "com.sun.star.text.UserIndex",                          SW_SERVICE_USER_INDEX },
114     { "com.sun.star.text.TextSection",                        SW_SERVICE_TEXT_SECTION },
115     { "com.sun.star.text.TextField.DateTime",                 SW_SERVICE_FIELDTYPE_DATETIME },
116     { "com.sun.star.text.TextField.User",                     SW_SERVICE_FIELDTYPE_USER },
117     { "com.sun.star.text.TextField.SetExpression",            SW_SERVICE_FIELDTYPE_SET_EXP },
118     { "com.sun.star.text.TextField.GetExpression",            SW_SERVICE_FIELDTYPE_GET_EXP },
119     { "com.sun.star.text.TextField.FileName",                 SW_SERVICE_FIELDTYPE_FILE_NAME },
120     { "com.sun.star.text.TextField.PageNumber",               SW_SERVICE_FIELDTYPE_PAGE_NUM },
121     { "com.sun.star.text.TextField.Author",                   SW_SERVICE_FIELDTYPE_AUTHOR },
122     { "com.sun.star.text.TextField.Chapter",                  SW_SERVICE_FIELDTYPE_CHAPTER },
123     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_0 },
124     { "com.sun.star.text.TextField.GetReference",             SW_SERVICE_FIELDTYPE_GET_REFERENCE },
125     { "com.sun.star.text.TextField.ConditionalText",          SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT },
126     { "com.sun.star.text.TextField.Annotation",               SW_SERVICE_FIELDTYPE_ANNOTATION },
127     { "com.sun.star.text.TextField.Input",                    SW_SERVICE_FIELDTYPE_INPUT },
128     { "com.sun.star.text.TextField.Macro",                    SW_SERVICE_FIELDTYPE_MACRO },
129     { "com.sun.star.text.TextField.DDE",                      SW_SERVICE_FIELDTYPE_DDE },
130     { "com.sun.star.text.TextField.HiddenParagraph",          SW_SERVICE_FIELDTYPE_HIDDEN_PARA },
131     { "" /*com.sun.star.text.TextField.DocumentInfo"*/,       SW_SERVICE_FIELDTYPE_DOC_INFO },
132     { "com.sun.star.text.TextField.TemplateName",             SW_SERVICE_FIELDTYPE_TEMPLATE_NAME },
133     { "com.sun.star.text.TextField.ExtendedUser",             SW_SERVICE_FIELDTYPE_USER_EXT },
134     { "com.sun.star.text.TextField.ReferencePageSet",         SW_SERVICE_FIELDTYPE_REF_PAGE_SET },
135     { "com.sun.star.text.TextField.ReferencePageGet",         SW_SERVICE_FIELDTYPE_REF_PAGE_GET },
136     { "com.sun.star.text.TextField.JumpEdit",                 SW_SERVICE_FIELDTYPE_JUMP_EDIT },
137     { "com.sun.star.text.TextField.Script",                   SW_SERVICE_FIELDTYPE_SCRIPT },
138     { "com.sun.star.text.TextField.DatabaseNextSet",          SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET },
139     { "com.sun.star.text.TextField.DatabaseNumberOfSet",      SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET },
140     { "com.sun.star.text.TextField.DatabaseSetNumber",        SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM },
141     { "com.sun.star.text.TextField.Database",                 SW_SERVICE_FIELDTYPE_DATABASE },
142     { "com.sun.star.text.TextField.DatabaseName",             SW_SERVICE_FIELDTYPE_DATABASE_NAME },
143     { "com.sun.star.text.TextField.TableFormula",             SW_SERVICE_FIELDTYPE_TABLE_FORMULA },
144     { "com.sun.star.text.TextField.PageCount",                SW_SERVICE_FIELDTYPE_PAGE_COUNT },
145     { "com.sun.star.text.TextField.ParagraphCount",           SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT },
146     { "com.sun.star.text.TextField.WordCount",                SW_SERVICE_FIELDTYPE_WORD_COUNT },
147     { "com.sun.star.text.TextField.CharacterCount",           SW_SERVICE_FIELDTYPE_CHARACTER_COUNT },
148     { "com.sun.star.text.TextField.TableCount",               SW_SERVICE_FIELDTYPE_TABLE_COUNT },
149     { "com.sun.star.text.TextField.GraphicObjectCount",       SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT },
150     { "com.sun.star.text.TextField.EmbeddedObjectCount",      SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT },
151     { "com.sun.star.text.TextField.DocInfo.ChangeAuthor",     SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR },
152     { "com.sun.star.text.TextField.DocInfo.ChangeDateTime",   SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME },
153     { "com.sun.star.text.TextField.DocInfo.EditTime",         SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME },
154     { "com.sun.star.text.TextField.DocInfo.Description",      SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION },
155     { "com.sun.star.text.TextField.DocInfo.CreateAuthor",     SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR },
156     { "com.sun.star.text.TextField.DocInfo.CreateDateTime",   SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME },
157     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_0 },
158     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_1 },
159     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_2 },
160     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_3 },
161     { "com.sun.star.text.TextField.DocInfo.Custom",           SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM },
162     { "com.sun.star.text.TextField.DocInfo.PrintAuthor",      SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR },
163     { "com.sun.star.text.TextField.DocInfo.PrintDateTime",    SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME },
164     { "com.sun.star.text.TextField.DocInfo.KeyWords",         SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS },
165     { "com.sun.star.text.TextField.DocInfo.Subject",          SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT },
166     { "com.sun.star.text.TextField.DocInfo.Title",            SW_SERVICE_FIELDTYPE_DOCINFO_TITLE },
167     { "com.sun.star.text.TextField.DocInfo.Revision",         SW_SERVICE_FIELDTYPE_DOCINFO_REVISION },
168     { "com.sun.star.text.TextField.Bibliography",             SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY },
169     { "com.sun.star.text.TextField.CombinedCharacters",       SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS },
170     { "com.sun.star.text.TextField.DropDown",                 SW_SERVICE_FIELDTYPE_DROPDOWN },
171     { "com.sun.star.text.textfield.MetadataField",            SW_SERVICE_FIELDTYPE_METAFIELD },
172     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_4 },
173     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_5 },
174     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_6 },
175     { "",                                                     SW_SERVICE_FIELDTYPE_DUMMY_7 },
176     { "com.sun.star.text.FieldMaster.User",                   SW_SERVICE_FIELDMASTER_USER },
177     { "com.sun.star.text.FieldMaster.DDE",                    SW_SERVICE_FIELDMASTER_DDE },
178     { "com.sun.star.text.FieldMaster.SetExpression",          SW_SERVICE_FIELDMASTER_SET_EXP },
179     { "com.sun.star.text.FieldMaster.Database",               SW_SERVICE_FIELDMASTER_DATABASE },
180     { "com.sun.star.text.FieldMaster.Bibliography",           SW_SERVICE_FIELDMASTER_BIBLIOGRAPHY },
181     { "",                                                     SW_SERVICE_FIELDMASTER_DUMMY2 },
182     { "",                                                     SW_SERVICE_FIELDMASTER_DUMMY3 },
183     { "",                                                     SW_SERVICE_FIELDMASTER_DUMMY4 },
184     { "",                                                     SW_SERVICE_FIELDMASTER_DUMMY5 },
185     { "com.sun.star.text.IllustrationsIndex",                 SW_SERVICE_INDEX_ILLUSTRATIONS },
186     { "com.sun.star.text.ObjectIndex",                        SW_SERVICE_INDEX_OBJECTS },
187     { "com.sun.star.text.TableIndex",                         SW_SERVICE_INDEX_TABLES },
188     { "com.sun.star.text.Bibliography",                       SW_SERVICE_INDEX_BIBLIOGRAPHY },
189     { "com.sun.star.text.Paragraph",                          SW_SERVICE_PARAGRAPH },
190     { "com.sun.star.text.TextField.InputUser",                SW_SERVICE_FIELDTYPE_INPUT_USER },
191     { "com.sun.star.text.TextField.HiddenText",               SW_SERVICE_FIELDTYPE_HIDDEN_TEXT },
192     { "com.sun.star.style.ConditionalParagraphStyle",         SW_SERVICE_STYLE_CONDITIONAL_PARAGRAPH_STYLE },
193     { "com.sun.star.text.NumberingRules",                     SW_SERVICE_NUMBERING_RULES },
194     { "com.sun.star.text.TextColumns",                        SW_SERVICE_TEXT_COLUMNS },
195     { "com.sun.star.text.IndexHeaderSection",                 SW_SERVICE_INDEX_HEADER_SECTION },
196     { "com.sun.star.text.Defaults",                           SW_SERVICE_DEFAULTS },
197     { "com.sun.star.image.ImageMapRectangleObject",           SW_SERVICE_IMAP_RECTANGLE },
198     { "com.sun.star.image.ImageMapCircleObject",              SW_SERVICE_IMAP_CIRCLE },
199     { "com.sun.star.image.ImageMapPolygonObject",             SW_SERVICE_IMAP_POLYGON },
200     { "com.sun.star.text.TextGraphicObject",                  SW_SERVICE_TYPE_TEXT_GRAPHIC },
201     { "com.sun.star.chart2.data.DataProvider",                SW_SERVICE_CHART2_DATA_PROVIDER },
202     { "com.sun.star.text.Fieldmark",                          SW_SERVICE_TYPE_FIELDMARK },
203     { "com.sun.star.text.FormFieldmark",                      SW_SERVICE_TYPE_FORMFIELDMARK },
204     { "com.sun.star.text.InContentMetadata",                  SW_SERVICE_TYPE_META },
205 
206     // case-correct versions of the service names (see #i67811)
207     { CSS_TEXT_TEXTFIELD_DATE_TIME,                   SW_SERVICE_FIELDTYPE_DATETIME },
208     { CSS_TEXT_TEXTFIELD_USER,                        SW_SERVICE_FIELDTYPE_USER },
209     { CSS_TEXT_TEXTFIELD_SET_EXPRESSION,              SW_SERVICE_FIELDTYPE_SET_EXP },
210     { CSS_TEXT_TEXTFIELD_GET_EXPRESSION,              SW_SERVICE_FIELDTYPE_GET_EXP },
211     { CSS_TEXT_TEXTFIELD_FILE_NAME,                   SW_SERVICE_FIELDTYPE_FILE_NAME },
212     { CSS_TEXT_TEXTFIELD_PAGE_NUMBER,                 SW_SERVICE_FIELDTYPE_PAGE_NUM },
213     { CSS_TEXT_TEXTFIELD_AUTHOR,                      SW_SERVICE_FIELDTYPE_AUTHOR },
214     { CSS_TEXT_TEXTFIELD_CHAPTER,                     SW_SERVICE_FIELDTYPE_CHAPTER },
215     { CSS_TEXT_TEXTFIELD_GET_REFERENCE,               SW_SERVICE_FIELDTYPE_GET_REFERENCE },
216     { CSS_TEXT_TEXTFIELD_CONDITIONAL_TEXT,            SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT },
217     { CSS_TEXT_TEXTFIELD_ANNOTATION,                  SW_SERVICE_FIELDTYPE_ANNOTATION },
218     { CSS_TEXT_TEXTFIELD_INPUT,                       SW_SERVICE_FIELDTYPE_INPUT },
219     { CSS_TEXT_TEXTFIELD_MACRO,                       SW_SERVICE_FIELDTYPE_MACRO },
220     { CSS_TEXT_TEXTFIELD_DDE,                         SW_SERVICE_FIELDTYPE_DDE },
221     { CSS_TEXT_TEXTFIELD_HIDDEN_PARAGRAPH,            SW_SERVICE_FIELDTYPE_HIDDEN_PARA },
222     { CSS_TEXT_TEXTFIELD_TEMPLATE_NAME,               SW_SERVICE_FIELDTYPE_TEMPLATE_NAME },
223     { CSS_TEXT_TEXTFIELD_EXTENDED_USER,               SW_SERVICE_FIELDTYPE_USER_EXT },
224     { CSS_TEXT_TEXTFIELD_REFERENCE_PAGE_SET,          SW_SERVICE_FIELDTYPE_REF_PAGE_SET },
225     { CSS_TEXT_TEXTFIELD_REFERENCE_PAGE_GET,          SW_SERVICE_FIELDTYPE_REF_PAGE_GET },
226     { CSS_TEXT_TEXTFIELD_JUMP_EDIT,                   SW_SERVICE_FIELDTYPE_JUMP_EDIT },
227     { CSS_TEXT_TEXTFIELD_SCRIPT,                      SW_SERVICE_FIELDTYPE_SCRIPT },
228     { CSS_TEXT_TEXTFIELD_DATABASE_NEXT_SET,           SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET },
229     { CSS_TEXT_TEXTFIELD_DATABASE_NUMBER_OF_SET,      SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET },
230     { CSS_TEXT_TEXTFIELD_DATABASE_SET_NUMBER,         SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM },
231     { CSS_TEXT_TEXTFIELD_DATABASE,                    SW_SERVICE_FIELDTYPE_DATABASE },
232     { CSS_TEXT_TEXTFIELD_DATABASE_NAME,               SW_SERVICE_FIELDTYPE_DATABASE_NAME },
233     { CSS_TEXT_TEXTFIELD_TABLE_FORMULA,               SW_SERVICE_FIELDTYPE_TABLE_FORMULA },
234     { CSS_TEXT_TEXTFIELD_PAGE_COUNT,                  SW_SERVICE_FIELDTYPE_PAGE_COUNT },
235     { CSS_TEXT_TEXTFIELD_PARAGRAPH_COUNT,             SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT },
236     { CSS_TEXT_TEXTFIELD_WORD_COUNT,                  SW_SERVICE_FIELDTYPE_WORD_COUNT },
237     { CSS_TEXT_TEXTFIELD_CHARACTER_COUNT,             SW_SERVICE_FIELDTYPE_CHARACTER_COUNT },
238     { CSS_TEXT_TEXTFIELD_TABLE_COUNT,                 SW_SERVICE_FIELDTYPE_TABLE_COUNT },
239     { CSS_TEXT_TEXTFIELD_GRAPHIC_OBJECT_COUNT,        SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT },
240     { CSS_TEXT_TEXTFIELD_EMBEDDED_OBJECT_COUNT,       SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT },
241     { CSS_TEXT_TEXTFIELD_DOCINFO_CHANGE_AUTHOR,       SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR },
242     { CSS_TEXT_TEXTFIELD_DOCINFO_CHANGE_DATE_TIME,    SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME },
243     { CSS_TEXT_TEXTFIELD_DOCINFO_EDIT_TIME,           SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME },
244     { CSS_TEXT_TEXTFIELD_DOCINFO_DESCRIPTION,         SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION },
245     { CSS_TEXT_TEXTFIELD_DOCINFO_CREATE_AUTHOR,       SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR },
246     { CSS_TEXT_TEXTFIELD_DOCINFO_CREATE_DATE_TIME,    SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME },
247     { CSS_TEXT_TEXTFIELD_DOCINFO_PRINT_AUTHOR,        SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR },
248     { CSS_TEXT_TEXTFIELD_DOCINFO_PRINT_DATE_TIME,     SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME },
249     { CSS_TEXT_TEXTFIELD_DOCINFO_KEY_WORDS,           SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS },
250     { CSS_TEXT_TEXTFIELD_DOCINFO_SUBJECT,             SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT },
251     { CSS_TEXT_TEXTFIELD_DOCINFO_TITLE,               SW_SERVICE_FIELDTYPE_DOCINFO_TITLE },
252     { CSS_TEXT_TEXTFIELD_DOCINFO_REVISION,            SW_SERVICE_FIELDTYPE_DOCINFO_REVISION },
253     { CSS_TEXT_TEXTFIELD_DOCINFO_CUSTOM,              SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM },
254     { CSS_TEXT_TEXTFIELD_BIBLIOGRAPHY,                SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY },
255     { CSS_TEXT_TEXTFIELD_COMBINED_CHARACTERS,         SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS },
256     { CSS_TEXT_TEXTFIELD_DROP_DOWN,                   SW_SERVICE_FIELDTYPE_DROPDOWN },
257     { CSS_TEXT_TEXTFIELD_INPUT_USER,                  SW_SERVICE_FIELDTYPE_INPUT_USER },
258     { CSS_TEXT_TEXTFIELD_HIDDEN_TEXT,                 SW_SERVICE_FIELDTYPE_HIDDEN_TEXT },
259     { CSS_TEXT_FIELDMASTER_USER,                      SW_SERVICE_FIELDMASTER_USER },
260     { CSS_TEXT_FIELDMASTER_DDE,                       SW_SERVICE_FIELDMASTER_DDE },
261     { CSS_TEXT_FIELDMASTER_SET_EXPRESSION,            SW_SERVICE_FIELDMASTER_SET_EXP },
262     { CSS_TEXT_FIELDMASTER_DATABASE,                  SW_SERVICE_FIELDMASTER_DATABASE },
263     { CSS_TEXT_FIELDMASTER_BIBLIOGRAPHY,              SW_SERVICE_FIELDMASTER_BIBLIOGRAPHY }
264 };
265 
266 const SvEventDescription* lcl_GetSupportedMacroItems()
267 {
268     static const SvEventDescription aMacroDescriptionsImpl[] =
269     {
270         { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" },
271         { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" },
272         { 0, NULL }
273     };
274 
275     return aMacroDescriptionsImpl;
276 }
277 
278 /******************************************************************
279  * SwXServiceProvider
280  ******************************************************************/
281 OUString    SwXServiceProvider::GetProviderName(sal_uInt16 nObjectType)
282 {
283     vos::OGuard aGuard(Application::GetSolarMutex());
284     OUString sRet;
285     sal_uInt16 nEntries = sizeof(aProvNamesId) / sizeof(aProvNamesId[0]);
286     if(nObjectType < nEntries)
287         sRet = C2U(aProvNamesId[nObjectType].pName);
288     return sRet;
289 }
290 
291 uno::Sequence<OUString>     SwXServiceProvider::GetAllServiceNames()
292 {
293     sal_uInt16 nEntries = sizeof(aProvNamesId) / sizeof(aProvNamesId[0]);
294     uno::Sequence<OUString> aRet(nEntries);
295     OUString* pArray = aRet.getArray();
296     sal_uInt16 n = 0;
297     for(sal_uInt16 i = 0; i < nEntries; i++)
298     {
299         String sProv(C2U(aProvNamesId[i].pName));
300         if(sProv.Len())
301         {
302             pArray[n] = sProv;
303             n++;
304         }
305     }
306     aRet.realloc(n);
307     return aRet;
308 
309 }
310 
311 sal_uInt16  SwXServiceProvider::GetProviderType(const OUString& rServiceName)
312 {
313     sal_uInt16 nEntries = sizeof(aProvNamesId) / sizeof(aProvNamesId[0]);
314     for(sal_uInt16 i = 0; i < nEntries; i++ )
315     {
316         if( COMPARE_EQUAL == rServiceName.compareToAscii(aProvNamesId[i].pName))
317             return aProvNamesId[i].nType;
318     }
319     return SW_SERVICE_INVALID;
320 }
321 
322 uno::Reference< uno::XInterface >   SwXServiceProvider::MakeInstance(sal_uInt16 nObjectType, SwDoc* pDoc)
323 {
324     vos::OGuard aGuard(Application::GetSolarMutex());
325     uno::Reference< uno::XInterface >  xRet;
326     switch(nObjectType)
327     {
328         case  SW_SERVICE_TYPE_TEXTTABLE:
329         {
330             SwXTextTable* pTextTable = new SwXTextTable();
331             xRet =  (cppu::OWeakObject*)pTextTable;
332         }
333         break;
334         case  SW_SERVICE_TYPE_TEXTFRAME:
335         {
336             SwXTextFrame* pTextFrame = new SwXTextFrame( pDoc );
337             xRet =  (cppu::OWeakObject*)(SwXFrame*)pTextFrame;
338         }
339         break;
340         case  SW_SERVICE_TYPE_GRAPHIC  :
341         case  SW_SERVICE_TYPE_TEXT_GRAPHIC /* #i47503# */ :
342         {
343             SwXTextGraphicObject* pGraphic = new SwXTextGraphicObject( pDoc );
344             xRet =  (cppu::OWeakObject*)(SwXFrame*)pGraphic;
345 
346         }
347         break;
348         case  SW_SERVICE_TYPE_OLE      :
349         {
350             SwXTextEmbeddedObject* pOle = new SwXTextEmbeddedObject( pDoc );
351             xRet =  (cppu::OWeakObject*)(SwXFrame*)pOle;
352         }
353         break;
354         case  SW_SERVICE_TYPE_BOOKMARK :
355         {
356             SwXBookmark* pBookmark = new SwXBookmark;
357             xRet =  (cppu::OWeakObject*)pBookmark;
358         }
359         break;
360         case  SW_SERVICE_TYPE_FIELDMARK :
361         {
362             SwXFieldmark* pFieldmark = new SwXFieldmark(false);
363             xRet =  (cppu::OWeakObject*)pFieldmark;
364         }
365         break;
366         case  SW_SERVICE_TYPE_FORMFIELDMARK :
367         {
368             SwXFieldmark* pFieldmark = new SwXFieldmark(true);
369             xRet =  (cppu::OWeakObject*)pFieldmark;
370         }
371         break;
372         case  SW_SERVICE_TYPE_FOOTNOTE :
373             xRet =  (cppu::OWeakObject*)new SwXFootnote(sal_False);
374         break;
375         case  SW_SERVICE_TYPE_ENDNOTE  :
376             xRet =  (cppu::OWeakObject*)new SwXFootnote(sal_True);
377         break;
378         case  SW_SERVICE_CONTENT_INDEX_MARK :
379         case  SW_SERVICE_USER_INDEX_MARK    :
380         case  SW_SERVICE_TYPE_INDEXMARK:
381         {
382             TOXTypes eType = TOX_INDEX;
383             if(SW_SERVICE_CONTENT_INDEX_MARK== nObjectType)
384                 eType = TOX_CONTENT;
385             else if(SW_SERVICE_USER_INDEX_MARK == nObjectType)
386                 eType = TOX_USER;
387             xRet =  (cppu::OWeakObject*)new SwXDocumentIndexMark(eType);
388         }
389         break;
390         case  SW_SERVICE_CONTENT_INDEX      :
391         case  SW_SERVICE_USER_INDEX         :
392         case  SW_SERVICE_TYPE_INDEX    :
393         case SW_SERVICE_INDEX_ILLUSTRATIONS:
394         case SW_SERVICE_INDEX_OBJECTS      :
395         case SW_SERVICE_INDEX_TABLES:
396         case SW_SERVICE_INDEX_BIBLIOGRAPHY :
397         {
398             TOXTypes eType = TOX_INDEX;
399             if(SW_SERVICE_CONTENT_INDEX == nObjectType)
400                 eType = TOX_CONTENT;
401             else if(SW_SERVICE_USER_INDEX == nObjectType)
402                 eType = TOX_USER;
403             else if(SW_SERVICE_INDEX_ILLUSTRATIONS == nObjectType)
404             {
405                 eType = TOX_ILLUSTRATIONS;
406             }
407             else if(SW_SERVICE_INDEX_OBJECTS       == nObjectType)
408             {
409                 eType = TOX_OBJECTS;
410             }
411             else if(SW_SERVICE_INDEX_BIBLIOGRAPHY  == nObjectType)
412             {
413                 eType = TOX_AUTHORITIES;
414             }
415             else if(SW_SERVICE_INDEX_TABLES == nObjectType)
416             {
417                 eType = TOX_TABLES;
418             }
419             xRet =  (cppu::OWeakObject*)new SwXDocumentIndex(eType, *pDoc);
420         }
421         break;
422         case SW_SERVICE_INDEX_HEADER_SECTION :
423         case SW_SERVICE_TEXT_SECTION :
424             xRet = SwXTextSection::CreateXTextSection(0,
425                     (SW_SERVICE_INDEX_HEADER_SECTION == nObjectType));
426 
427         break;
428         case SW_SERVICE_REFERENCE_MARK :
429             xRet =  (cppu::OWeakObject*)new SwXReferenceMark(0, 0);
430         break;
431         case SW_SERVICE_STYLE_CHARACTER_STYLE:
432         case SW_SERVICE_STYLE_PARAGRAPH_STYLE:
433         case SW_SERVICE_STYLE_CONDITIONAL_PARAGRAPH_STYLE:
434         case SW_SERVICE_STYLE_FRAME_STYLE:
435         case SW_SERVICE_STYLE_PAGE_STYLE:
436         case SW_SERVICE_STYLE_NUMBERING_STYLE:
437         {
438             SfxStyleFamily  eFamily = SFX_STYLE_FAMILY_CHAR;
439             switch(nObjectType)
440             {
441                 case SW_SERVICE_STYLE_PARAGRAPH_STYLE:
442                 case SW_SERVICE_STYLE_CONDITIONAL_PARAGRAPH_STYLE:
443                     eFamily = SFX_STYLE_FAMILY_PARA;
444                 break;
445                 case SW_SERVICE_STYLE_FRAME_STYLE:
446                     eFamily = SFX_STYLE_FAMILY_FRAME;
447                 break;
448                 case SW_SERVICE_STYLE_PAGE_STYLE:
449                     eFamily = SFX_STYLE_FAMILY_PAGE;
450                 break;
451                 case SW_SERVICE_STYLE_NUMBERING_STYLE:
452                     eFamily = SFX_STYLE_FAMILY_PSEUDO;
453                 break;
454             }
455             SwXStyle* pNewStyle = SFX_STYLE_FAMILY_PAGE == eFamily ?
456                 new SwXPageStyle(pDoc->GetDocShell()) :
457                     eFamily == SFX_STYLE_FAMILY_FRAME ?
458                         new SwXFrameStyle ( pDoc ):
459                             new SwXStyle( pDoc, eFamily, nObjectType == SW_SERVICE_STYLE_CONDITIONAL_PARAGRAPH_STYLE);
460             xRet = (cppu::OWeakObject*)pNewStyle;
461         }
462         break;
463 //      SW_SERVICE_DUMMY_5
464 //      SW_SERVICE_DUMMY_6
465 //      SW_SERVICE_DUMMY_7
466 //      SW_SERVICE_DUMMY_8
467 //      SW_SERVICE_DUMMY_9
468         case SW_SERVICE_FIELDTYPE_DATETIME:
469         case SW_SERVICE_FIELDTYPE_USER:
470         case SW_SERVICE_FIELDTYPE_SET_EXP:
471         case SW_SERVICE_FIELDTYPE_GET_EXP:
472         case SW_SERVICE_FIELDTYPE_FILE_NAME:
473         case SW_SERVICE_FIELDTYPE_PAGE_NUM:
474         case SW_SERVICE_FIELDTYPE_AUTHOR:
475         case SW_SERVICE_FIELDTYPE_CHAPTER:
476         case SW_SERVICE_FIELDTYPE_GET_REFERENCE:
477         case SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT:
478         case SW_SERVICE_FIELDTYPE_INPUT:
479         case SW_SERVICE_FIELDTYPE_MACRO:
480         case SW_SERVICE_FIELDTYPE_DDE:
481         case SW_SERVICE_FIELDTYPE_HIDDEN_PARA:
482         case SW_SERVICE_FIELDTYPE_DOC_INFO:
483         case SW_SERVICE_FIELDTYPE_TEMPLATE_NAME:
484         case SW_SERVICE_FIELDTYPE_USER_EXT:
485         case SW_SERVICE_FIELDTYPE_REF_PAGE_SET:
486         case SW_SERVICE_FIELDTYPE_REF_PAGE_GET:
487         case SW_SERVICE_FIELDTYPE_JUMP_EDIT:
488         case SW_SERVICE_FIELDTYPE_SCRIPT:
489         case SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET:
490         case SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET:
491         case SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM:
492         case SW_SERVICE_FIELDTYPE_DATABASE:
493         case SW_SERVICE_FIELDTYPE_DATABASE_NAME:
494         case SW_SERVICE_FIELDTYPE_PAGE_COUNT      :
495         case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT :
496         case SW_SERVICE_FIELDTYPE_WORD_COUNT      :
497         case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT :
498         case SW_SERVICE_FIELDTYPE_TABLE_COUNT     :
499         case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT    :
500         case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT   :
501         case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR     :
502         case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME  :
503         case SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME         :
504         case SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION       :
505         case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR     :
506         case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME  :
507         case SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM            :
508         case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR      :
509         case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME   :
510         case SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS         :
511         case SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT           :
512         case SW_SERVICE_FIELDTYPE_DOCINFO_TITLE             :
513         case SW_SERVICE_FIELDTYPE_DOCINFO_REVISION          :
514         case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY:
515         case SW_SERVICE_FIELDTYPE_INPUT_USER                :
516         case SW_SERVICE_FIELDTYPE_HIDDEN_TEXT               :
517         case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS       :
518         case SW_SERVICE_FIELDTYPE_DROPDOWN                  :
519         case SW_SERVICE_FIELDTYPE_TABLE_FORMULA:
520             xRet = (cppu::OWeakObject*)new SwXTextField(nObjectType);
521             break;
522         case SW_SERVICE_FIELDTYPE_ANNOTATION:
523             xRet = (cppu::OWeakObject*)new SwXTextField(nObjectType, pDoc);
524             break;
525         case SW_SERVICE_FIELDMASTER_USER:
526         case SW_SERVICE_FIELDMASTER_DDE:
527         case SW_SERVICE_FIELDMASTER_SET_EXP :
528         case SW_SERVICE_FIELDMASTER_DATABASE:
529         {
530             sal_uInt16 nResId = USHRT_MAX;
531             switch(nObjectType)
532             {
533                 case SW_SERVICE_FIELDMASTER_USER: nResId = RES_USERFLD; break;
534                 case SW_SERVICE_FIELDMASTER_DDE:  nResId = RES_DDEFLD; break;
535                 case SW_SERVICE_FIELDMASTER_SET_EXP : nResId = RES_SETEXPFLD; break;
536                 case SW_SERVICE_FIELDMASTER_DATABASE: nResId = RES_DBFLD; break;
537             }
538             xRet =  (cppu::OWeakObject*)new SwXFieldMaster(pDoc, nResId);
539         }
540         break;
541         case SW_SERVICE_FIELDMASTER_BIBLIOGRAPHY:
542         {
543             SwFieldType* pType = pDoc->GetFldType(RES_AUTHORITY, aEmptyStr, sal_True);
544             if(!pType)
545             {
546                 SwAuthorityFieldType aType(pDoc);
547                 pType = pDoc->InsertFldType(aType);
548             }
549             else
550             {
551                 SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
552                 if(pMaster)
553                     xRet = (cppu::OWeakObject*)pMaster;
554             }
555             if(!xRet.is())
556                 xRet =  (cppu::OWeakObject*)new SwXFieldMaster(*pType, pDoc);
557         }
558         break;
559         case SW_SERVICE_PARAGRAPH :
560             xRet = (cppu::OWeakObject*)new SwXParagraph();
561         break;
562         case SW_SERVICE_NUMBERING_RULES :
563             xRet = (cppu::OWeakObject*)new SwXNumberingRules(*pDoc);
564         break;
565         case SW_SERVICE_TEXT_COLUMNS :
566             xRet = (cppu::OWeakObject*)new SwXTextColumns(0);
567         break;
568         case SW_SERVICE_DEFAULTS:
569             xRet = (cppu::OWeakObject*)new SwXTextDefaults( pDoc );
570         break;
571         case SW_SERVICE_IMAP_RECTANGLE :
572             xRet = SvUnoImageMapRectangleObject_createInstance( lcl_GetSupportedMacroItems() );
573         break;
574         case SW_SERVICE_IMAP_CIRCLE    :
575             xRet = SvUnoImageMapCircleObject_createInstance( lcl_GetSupportedMacroItems() );
576         break;
577         case SW_SERVICE_IMAP_POLYGON   :
578             xRet = SvUnoImageMapPolygonObject_createInstance( lcl_GetSupportedMacroItems() );
579         break;
580         case SW_SERVICE_CHART2_DATA_PROVIDER :
581             // #i64497# If a chart is in a temporary document during clipboard
582             // paste, there should be no data provider, so that own data is used
583             // This should not happen during copy/paste, as this will unlink
584             // charts using table data.
585             OSL_ASSERT( pDoc->GetDocShell()->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED );
586             if( pDoc->GetDocShell()->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
587                 xRet = (cppu::OWeakObject*) pDoc->GetChartDataProvider( true /* create - if not yet available */ );
588         break;
589         case SW_SERVICE_TYPE_META:
590             xRet = static_cast< ::cppu::OWeakObject* >( new SwXMeta(pDoc) );
591         break;
592         case SW_SERVICE_FIELDTYPE_METAFIELD:
593             xRet = static_cast< ::cppu::OWeakObject* >(new SwXMetaField(pDoc));
594         break;
595         default:
596             throw uno::RuntimeException();
597     }
598     return xRet;
599 }
600 /******************************************************************
601  * SwXTextTables
602  ******************************************************************/
603 //SMART_UNO_IMPLEMENTATION( SwXTextTables, UsrObject );
604 
605 SwXTextTables::SwXTextTables(SwDoc* pDc) :
606         SwUnoCollection(pDc)
607 {
608 
609 }
610 
611 SwXTextTables::~SwXTextTables()
612 {
613 
614 }
615 
616 sal_Int32 SwXTextTables::getCount(void) throw( uno::RuntimeException )
617 {
618     vos::OGuard aGuard(Application::GetSolarMutex());
619     sal_Int32 nRet = 0;
620     if(IsValid())
621         nRet = GetDoc()->GetTblFrmFmtCount(sal_True);
622     return nRet;
623 }
624 
625 uno::Any SAL_CALL SwXTextTables::getByIndex(sal_Int32 nIndex)
626         throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
627 {
628     vos::OGuard aGuard(Application::GetSolarMutex());
629     uno::Any aRet;
630     if(IsValid())
631     {
632         if(0 <= nIndex && GetDoc()->GetTblFrmFmtCount(sal_True) > nIndex)
633         {
634             SwFrmFmt& rFmt = GetDoc()->GetTblFrmFmt( static_cast< xub_StrLen >(nIndex), sal_True);
635             uno::Reference< XTextTable >  xTbl = SwXTextTables::GetObject(rFmt);
636             aRet.setValue( &xTbl,
637                 ::getCppuType((uno::Reference< XTextTable>*)0));
638         }
639         else
640             throw IndexOutOfBoundsException();
641     }
642     else
643         throw uno::RuntimeException();
644     return aRet;
645 }
646 
647 uno::Any SwXTextTables::getByName(const OUString& rItemName)
648     throw( NoSuchElementException, WrappedTargetException, uno::RuntimeException )
649 {
650     vos::OGuard aGuard(Application::GetSolarMutex());
651     uno::Any aRet;
652     if(IsValid())
653     {
654         sal_uInt16 nCount = GetDoc()->GetTblFrmFmtCount(sal_True);
655         uno::Reference< XTextTable >  xTbl;
656         for( sal_uInt16 i = 0; i < nCount; i++)
657         {
658             String aName(rItemName);
659             SwFrmFmt& rFmt = GetDoc()->GetTblFrmFmt(i, sal_True);
660             if(aName == rFmt.GetName())
661             {
662                 xTbl = SwXTextTables::GetObject(rFmt);
663                 aRet.setValue(&xTbl,
664                     ::getCppuType(( uno::Reference< XTextTable >*)0));
665                 break;
666             }
667         }
668         if(!xTbl.is())
669             throw NoSuchElementException();
670     }
671     else
672         throw uno::RuntimeException();
673     return aRet;
674 }
675 
676 uno::Sequence< OUString > SwXTextTables::getElementNames(void)
677         throw( uno::RuntimeException )
678 {
679     vos::OGuard aGuard(Application::GetSolarMutex());
680     if(!IsValid())
681         throw uno::RuntimeException();
682     sal_uInt16 nCount = GetDoc()->GetTblFrmFmtCount(sal_True);
683     uno::Sequence<OUString> aSeq(nCount);
684     if(nCount)
685     {
686         OUString* pArray = aSeq.getArray();
687         for( sal_uInt16 i = 0; i < nCount; i++)
688         {
689             SwFrmFmt& rFmt = GetDoc()->GetTblFrmFmt(i, sal_True);
690 
691             pArray[i] = OUString(rFmt.GetName());
692         }
693     }
694     return aSeq;
695 }
696 
697 sal_Bool SwXTextTables::hasByName(const OUString& rName)
698     throw( uno::RuntimeException )
699 {
700     vos::OGuard aGuard(Application::GetSolarMutex());
701     sal_Bool bRet= sal_False;
702     if(IsValid())
703     {
704         sal_uInt16 nCount = GetDoc()->GetTblFrmFmtCount(sal_True);
705         for( sal_uInt16 i = 0; i < nCount; i++)
706         {
707             String aName(rName);
708             SwFrmFmt& rFmt = GetDoc()->GetTblFrmFmt(i, sal_True);
709             if(aName == rFmt.GetName())
710             {
711                 bRet = sal_True;
712                 break;
713             }
714         }
715     }
716     else
717         throw uno::RuntimeException();
718     return bRet;
719 }
720 
721 uno::Type SAL_CALL
722     SwXTextTables::getElementType(  )
723         throw(uno::RuntimeException)
724 {
725     return ::getCppuType((uno::Reference<XTextTable>*)0);
726 }
727 
728 sal_Bool SwXTextTables::hasElements(void) throw( uno::RuntimeException )
729 {
730     vos::OGuard aGuard(Application::GetSolarMutex());
731     if(!IsValid())
732         throw uno::RuntimeException();
733     return 0 != GetDoc()->GetTblFrmFmtCount(sal_True);
734 }
735 
736 OUString SwXTextTables::getImplementationName(void) throw( uno::RuntimeException )
737 {
738     return C2U("SwXTextTables");
739 }
740 
741 sal_Bool SwXTextTables::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
742 {
743     return rServiceName == C2U("com.sun.star.text.TextTables");
744 }
745 
746 uno::Sequence< OUString > SwXTextTables::getSupportedServiceNames(void) throw( uno::RuntimeException )
747 {
748     uno::Sequence< OUString > aRet(1);
749     OUString* pArr = aRet.getArray();
750     pArr[0] = C2U("com.sun.star.text.TextTables");
751     return aRet;
752 }
753 
754 XTextTable* SwXTextTables::GetObject( SwFrmFmt& rFmt )
755 {
756     vos::OGuard aGuard(Application::GetSolarMutex());
757     SwXTextTable* pTbl = SwIterator<SwXTextTable,SwFmt>::FirstElement( rFmt );
758     if( !pTbl )
759         pTbl = new SwXTextTable(rFmt);
760     return pTbl ;
761 }
762 
763 
764 /******************************************************************
765  *  SwXFrameEnumeration
766  ******************************************************************/
767 namespace
768 {
769     template<FlyCntType T> struct UnoFrameWrap_traits {};
770 
771     template<>
772     struct UnoFrameWrap_traits<FLYCNTTYPE_FRM>
773     {
774         typedef SwXTextFrame core_frame_t;
775         typedef XTextFrame uno_frame_t;
776         static inline bool filter(const SwNode* const pNode) { return !pNode->IsNoTxtNode(); };
777     };
778 
779     template<>
780     struct UnoFrameWrap_traits<FLYCNTTYPE_GRF>
781     {
782         typedef SwXTextGraphicObject core_frame_t;
783         typedef XTextContent uno_frame_t;
784         static inline bool filter(const SwNode* const pNode) { return pNode->IsGrfNode(); };
785     };
786 
787     template<>
788     struct UnoFrameWrap_traits<FLYCNTTYPE_OLE>
789     {
790         typedef SwXTextEmbeddedObject core_frame_t;
791         typedef XEmbeddedObjectSupplier uno_frame_t;
792         static inline bool filter(const SwNode* const pNode) { return pNode->IsOLENode(); };
793     };
794 
795     template<FlyCntType T>
796     static uno::Any lcl_UnoWrapFrame(SwFrmFmt* pFmt)
797     {
798         SwXFrame* pFrm = SwIterator<SwXFrame,SwFmt>::FirstElement( *pFmt );
799         if(!pFrm)
800             pFrm = new typename UnoFrameWrap_traits<T>::core_frame_t(*pFmt);
801         Reference< typename UnoFrameWrap_traits<T>::uno_frame_t > xFrm =
802             static_cast< typename UnoFrameWrap_traits<T>::core_frame_t* >(pFrm);
803         return uno::makeAny(xFrm);
804     }
805 
806     // runtime adapter for lcl_UnoWrapFrame
807     static uno::Any lcl_UnoWrapFrame(SwFrmFmt* pFmt, FlyCntType eType) throw(uno::RuntimeException())
808     {
809         switch(eType)
810         {
811             case FLYCNTTYPE_FRM:
812                 return lcl_UnoWrapFrame<FLYCNTTYPE_FRM>(pFmt);
813             case FLYCNTTYPE_GRF:
814                 return lcl_UnoWrapFrame<FLYCNTTYPE_GRF>(pFmt);
815             case FLYCNTTYPE_OLE:
816                 return lcl_UnoWrapFrame<FLYCNTTYPE_OLE>(pFmt);
817             default:
818                 throw uno::RuntimeException();
819         }
820     }
821 
822     template<FlyCntType T>
823     class SwXFrameEnumeration
824         : public SwSimpleEnumeration_Base
825     {
826         private:
827             typedef ::std::list< Any > frmcontainer_t;
828             frmcontainer_t m_aFrames;
829         protected:
830             virtual ~SwXFrameEnumeration() {};
831         public:
832             SwXFrameEnumeration(const SwDoc* const pDoc);
833 
834             //XEnumeration
835             virtual sal_Bool SAL_CALL hasMoreElements(void) throw( RuntimeException );
836             virtual Any SAL_CALL nextElement(void) throw( NoSuchElementException, WrappedTargetException, RuntimeException );
837 
838             //XServiceInfo
839             virtual OUString SAL_CALL getImplementationName(void) throw( RuntimeException );
840             virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw( RuntimeException );
841             virtual Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw( RuntimeException );
842     };
843 }
844 
845 template<FlyCntType T>
846 SwXFrameEnumeration<T>::SwXFrameEnumeration(const SwDoc* const pDoc)
847     : m_aFrames()
848 {
849     vos::OGuard aGuard(Application::GetSolarMutex());
850     const SwSpzFrmFmts* const pFmts = pDoc->GetSpzFrmFmts();
851     if(!pFmts->Count())
852         return;
853     // --> OD 2009-09-10 #i104937#
854 //    const SwFrmFmt* const pFmtsEnd = (*pFmts)[pFmts->Count()];
855     const sal_uInt16 nSize = pFmts->Count();
856     // <--
857     ::std::insert_iterator<frmcontainer_t> pInserter = ::std::insert_iterator<frmcontainer_t>(m_aFrames, m_aFrames.begin());
858     // --> OD 2009-09-10 #i104937#
859     SwFrmFmt* pFmt( 0 );
860     for( sal_uInt16 i = 0; i < nSize; ++i )
861 //    for(SwFrmFmt* pFmt = (*pFmts)[0]; pFmt < pFmtsEnd; ++pFmt)
862     // <--
863     {
864         // --> OD 2009-09-10 #i104937#
865         pFmt = (*pFmts)[i];
866         // <--
867         if(pFmt->Which() != RES_FLYFRMFMT)
868             continue;
869         const SwNodeIndex* pIdx =  pFmt->GetCntnt().GetCntntIdx();
870         if(!pIdx || !pIdx->GetNodes().IsDocNodes())
871             continue;
872         const SwNode* pNd = pDoc->GetNodes()[ pIdx->GetIndex() + 1 ];
873         if(UnoFrameWrap_traits<T>::filter(pNd))
874             *pInserter++ = lcl_UnoWrapFrame<T>(pFmt);
875     }
876 }
877 
878 template<FlyCntType T>
879 sal_Bool SwXFrameEnumeration<T>::hasMoreElements(void) throw( RuntimeException )
880 {
881     vos::OGuard aGuard(Application::GetSolarMutex());
882     return !m_aFrames.empty();
883 }
884 
885 template<FlyCntType T>
886 Any SwXFrameEnumeration<T>::nextElement(void) throw( NoSuchElementException, WrappedTargetException, RuntimeException )
887 {
888     vos::OGuard aGuard(Application::GetSolarMutex());
889     if(m_aFrames.empty())
890         throw NoSuchElementException();
891     Any aResult = *m_aFrames.begin();
892     m_aFrames.pop_front();
893     return aResult;
894 }
895 
896 template<FlyCntType T>
897 OUString SwXFrameEnumeration<T>::getImplementationName(void) throw( RuntimeException )
898 {
899     return C2U("SwXFrameEnumeration");
900 }
901 
902 template<FlyCntType T>
903 sal_Bool SwXFrameEnumeration<T>::supportsService(const OUString& ServiceName) throw( RuntimeException )
904 {
905     return C2U("com.sun.star.container.XEnumeration") == ServiceName;
906 }
907 
908 template<FlyCntType T>
909 Sequence< OUString > SwXFrameEnumeration<T>::getSupportedServiceNames(void) throw( RuntimeException )
910 {
911     return ::comphelper::makeSequence(C2U("com.sun.star.container.XEnumeration"));
912 }
913 
914 /******************************************************************
915  *  SwXFrames
916  ******************************************************************/
917 OUString SwXFrames::getImplementationName(void) throw( RuntimeException )
918 {
919     return C2U("SwXFrames");
920 }
921 
922 sal_Bool SwXFrames::supportsService(const OUString& rServiceName) throw( RuntimeException )
923 {
924     return C2U("com.sun.star.text.TextFrames") == rServiceName;
925 }
926 
927 Sequence<OUString> SwXFrames::getSupportedServiceNames(void) throw( RuntimeException )
928 {
929     return ::comphelper::makeSequence(C2U("com.sun.star.text.TextFrames"));
930 }
931 
932 SwXFrames::SwXFrames(SwDoc* _pDoc, FlyCntType eSet) :
933     SwUnoCollection(_pDoc),
934     eType(eSet)
935 {}
936 
937 SwXFrames::~SwXFrames()
938 {}
939 
940 uno::Reference<container::XEnumeration> SwXFrames::createEnumeration(void) throw(uno::RuntimeException)
941 {
942     vos::OGuard aGuard(Application::GetSolarMutex());
943     if(!IsValid())
944         throw uno::RuntimeException();
945     switch(eType)
946     {
947         case FLYCNTTYPE_FRM:
948             return uno::Reference< container::XEnumeration >(
949                 new SwXFrameEnumeration<FLYCNTTYPE_FRM>(GetDoc()));
950         case FLYCNTTYPE_GRF:
951             return uno::Reference< container::XEnumeration >(
952                 new SwXFrameEnumeration<FLYCNTTYPE_GRF>(GetDoc()));
953         case FLYCNTTYPE_OLE:
954             return uno::Reference< container::XEnumeration >(
955                 new SwXFrameEnumeration<FLYCNTTYPE_OLE>(GetDoc()));
956         default:
957             throw uno::RuntimeException();
958     }
959 }
960 
961 sal_Int32 SwXFrames::getCount(void) throw(uno::RuntimeException)
962 {
963     vos::OGuard aGuard(Application::GetSolarMutex());
964     if(!IsValid())
965         throw uno::RuntimeException();
966     return GetDoc()->GetFlyCount(eType);
967 }
968 
969 uno::Any SwXFrames::getByIndex(sal_Int32 nIndex)
970     throw(IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
971 {
972     vos::OGuard aGuard(Application::GetSolarMutex());
973     if(!IsValid())
974         throw uno::RuntimeException();
975     if(nIndex < 0 || nIndex >= USHRT_MAX)
976         throw IndexOutOfBoundsException();
977     SwFrmFmt* pFmt = GetDoc()->GetFlyNum(static_cast<sal_uInt16>(nIndex), eType);
978     if(!pFmt)
979         throw IndexOutOfBoundsException();
980     return lcl_UnoWrapFrame(pFmt, eType);
981 }
982 
983 uno::Any SwXFrames::getByName(const OUString& rName)
984     throw(NoSuchElementException, WrappedTargetException, uno::RuntimeException )
985 {
986     vos::OGuard aGuard(Application::GetSolarMutex());
987     if(!IsValid())
988         throw uno::RuntimeException();
989     const SwFrmFmt* pFmt;
990     switch(eType)
991     {
992         case FLYCNTTYPE_GRF:
993             pFmt = GetDoc()->FindFlyByName(rName, ND_GRFNODE);
994             break;
995         case FLYCNTTYPE_OLE:
996             pFmt = GetDoc()->FindFlyByName(rName, ND_OLENODE);
997             break;
998         default:
999             pFmt = GetDoc()->FindFlyByName(rName, ND_TEXTNODE);
1000             break;
1001     }
1002     if(!pFmt)
1003         throw NoSuchElementException();
1004     return lcl_UnoWrapFrame(const_cast<SwFrmFmt*>(pFmt), eType);
1005 }
1006 
1007 uno::Sequence<OUString> SwXFrames::getElementNames(void) throw( uno::RuntimeException )
1008 {
1009     vos::OGuard aGuard(Application::GetSolarMutex());
1010     if(!IsValid())
1011         throw uno::RuntimeException();
1012     const Reference<XEnumeration> xEnum = createEnumeration();
1013     ::std::vector<OUString> vNames;
1014     while(xEnum->hasMoreElements())
1015     {
1016         Reference<container::XNamed> xNamed;
1017         xEnum->nextElement() >>= xNamed;
1018         if(xNamed.is())
1019             vNames.push_back(xNamed->getName());
1020     }
1021     return ::comphelper::containerToSequence(vNames);
1022 }
1023 
1024 sal_Bool SwXFrames::hasByName(const OUString& rName) throw( uno::RuntimeException )
1025 {
1026     vos::OGuard aGuard(Application::GetSolarMutex());
1027     if(!IsValid())
1028         throw uno::RuntimeException();
1029     switch(eType)
1030     {
1031         case FLYCNTTYPE_GRF:
1032             return GetDoc()->FindFlyByName(rName, ND_GRFNODE) != NULL;
1033         case FLYCNTTYPE_OLE:
1034             return GetDoc()->FindFlyByName(rName, ND_OLENODE) != NULL;
1035         default:
1036             return GetDoc()->FindFlyByName(rName, ND_TEXTNODE) != NULL;
1037     }
1038 }
1039 
1040 uno::Type SAL_CALL SwXFrames::getElementType() throw(uno::RuntimeException)
1041 {
1042     vos::OGuard aGuard(Application::GetSolarMutex());
1043     switch(eType)
1044     {
1045         case FLYCNTTYPE_FRM:
1046             return ::getCppuType((uno::Reference<XTextFrame>*)0);
1047         case FLYCNTTYPE_GRF:
1048             return ::getCppuType((uno::Reference<XTextContent>*)0);
1049         case FLYCNTTYPE_OLE:
1050             return ::getCppuType((uno::Reference<XEmbeddedObjectSupplier>*)0);
1051         default:
1052             return uno::Type();
1053     }
1054 }
1055 
1056 sal_Bool SwXFrames::hasElements(void) throw(uno::RuntimeException)
1057 {
1058     vos::OGuard aGuard(Application::GetSolarMutex());
1059     if(!IsValid())
1060         throw uno::RuntimeException();
1061     return GetDoc()->GetFlyCount(eType) > 0;
1062 }
1063 
1064 SwXFrame* SwXFrames::GetObject(SwFrmFmt& rFmt, FlyCntType eType)
1065 {
1066     SwXFrame* pFrm = SwIterator<SwXFrame,SwFmt>::FirstElement( rFmt );
1067     if(pFrm) return pFrm;
1068     switch(eType)
1069     {
1070         case FLYCNTTYPE_FRM:
1071             return new SwXTextFrame(rFmt);
1072         case FLYCNTTYPE_GRF:
1073             return new SwXTextGraphicObject(rFmt);
1074         case FLYCNTTYPE_OLE:
1075             return new SwXTextEmbeddedObject(rFmt);
1076         default:
1077             return NULL;
1078     }
1079 }
1080 
1081 /******************************************************************
1082  * SwXTextFrames
1083  ******************************************************************/
1084 OUString SwXTextFrames::getImplementationName(void) throw( RuntimeException )
1085 {
1086     return C2U("SwXTextFrames");
1087 }
1088 
1089 sal_Bool SwXTextFrames::supportsService(const OUString& rServiceName) throw( RuntimeException )
1090 {
1091     return C2U("com.sun.star.text.TextFrames") == rServiceName;
1092 }
1093 
1094 Sequence< OUString > SwXTextFrames::getSupportedServiceNames(void) throw( RuntimeException )
1095 {
1096     Sequence< OUString > aRet(1);
1097     OUString* pArray = aRet.getArray();
1098     pArray[0] = C2U("com.sun.star.text.TextFrames");
1099     return aRet;
1100 }
1101 
1102 SwXTextFrames::SwXTextFrames(SwDoc* _pDoc) :
1103     SwXFrames(_pDoc, FLYCNTTYPE_FRM)
1104 {
1105 }
1106 
1107 SwXTextFrames::~SwXTextFrames()
1108 {
1109 }
1110 
1111 /******************************************************************
1112  *  SwXTextGraphicObjects
1113  ******************************************************************/
1114 
1115 OUString SwXTextGraphicObjects::getImplementationName(void) throw( RuntimeException )
1116 {
1117     return C2U("SwXTextGraphicObjects");
1118 }
1119 
1120 sal_Bool SwXTextGraphicObjects::supportsService(const OUString& rServiceName) throw( RuntimeException )
1121 {
1122     return C2U("com.sun.star.text.TextGraphicObjects") == rServiceName;
1123 }
1124 
1125 Sequence< OUString > SwXTextGraphicObjects::getSupportedServiceNames(void) throw( RuntimeException )
1126 {
1127     Sequence< OUString > aRet(1);
1128     OUString* pArray = aRet.getArray();
1129     pArray[0] = C2U("com.sun.star.text.TextGraphicObjects");
1130     return aRet;
1131 }
1132 
1133 SwXTextGraphicObjects::SwXTextGraphicObjects(SwDoc* _pDoc) :
1134     SwXFrames(_pDoc, FLYCNTTYPE_GRF)
1135 {
1136 }
1137 
1138 SwXTextGraphicObjects::~SwXTextGraphicObjects()
1139 {
1140 }
1141 
1142 /******************************************************************
1143  *  SwXTextEmbeddedObjects
1144  ******************************************************************/
1145 OUString SwXTextEmbeddedObjects::getImplementationName(void) throw( RuntimeException )
1146 {
1147     return C2U("SwXTextEmbeddedObjects");
1148 }
1149 
1150 sal_Bool SwXTextEmbeddedObjects::supportsService(const OUString& rServiceName) throw( RuntimeException )
1151 {
1152     return C2U("com.sun.star.text.TextEmbeddedObjects") == rServiceName;
1153 }
1154 
1155 Sequence< OUString > SwXTextEmbeddedObjects::getSupportedServiceNames(void) throw( RuntimeException )
1156 {
1157     Sequence< OUString > aRet(1);
1158     OUString* pArray = aRet.getArray();
1159     pArray[0] = C2U("com.sun.star.text.TextEmbeddedObjects");
1160     return aRet;
1161 }
1162 
1163 SwXTextEmbeddedObjects::SwXTextEmbeddedObjects(SwDoc* _pDoc) :
1164         SwXFrames(_pDoc, FLYCNTTYPE_OLE)
1165 {
1166 }
1167 
1168 SwXTextEmbeddedObjects::~SwXTextEmbeddedObjects()
1169 {
1170 }
1171 
1172 /******************************************************************
1173  *
1174  ******************************************************************/
1175 #define PASSWORD_STD_TIMEOUT 1000
1176 OUString SwXTextSections::getImplementationName(void) throw( RuntimeException )
1177 {
1178     return C2U("SwXTextSections");
1179 }
1180 
1181 sal_Bool SwXTextSections::supportsService(const OUString& rServiceName) throw( RuntimeException )
1182 {
1183     return C2U("com.sun.star.text.TextSections") == rServiceName;
1184 }
1185 
1186 Sequence< OUString > SwXTextSections::getSupportedServiceNames(void) throw( RuntimeException )
1187 {
1188     Sequence< OUString > aRet(1);
1189     OUString* pArray = aRet.getArray();
1190     pArray[0] = C2U("com.sun.star.text.TextSections");
1191     return aRet;
1192 }
1193 
1194 SwXTextSections::SwXTextSections(SwDoc* _pDoc) :
1195     SwUnoCollection(_pDoc)
1196 {
1197 }
1198 
1199 SwXTextSections::~SwXTextSections()
1200 {
1201 }
1202 
1203 sal_Int32 SwXTextSections::getCount(void) throw( uno::RuntimeException )
1204 {
1205     vos::OGuard aGuard(Application::GetSolarMutex());
1206     if(!IsValid())
1207         throw uno::RuntimeException();
1208     const SwSectionFmts& rSectFmts = GetDoc()->GetSections();
1209     sal_uInt16 nCount = rSectFmts.Count();
1210     for(sal_uInt16 i = nCount; i; i--)
1211     {
1212         if( !rSectFmts[i - 1]->IsInNodesArr())
1213             nCount--;
1214     }
1215     return nCount;
1216 }
1217 
1218 uno::Any SwXTextSections::getByIndex(sal_Int32 nIndex)
1219     throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
1220 {
1221     vos::OGuard aGuard(Application::GetSolarMutex());
1222     uno::Reference< XTextSection >  xRet;
1223     if(IsValid())
1224     {
1225         SwSectionFmts& rFmts = GetDoc()->GetSections();
1226 
1227         const SwSectionFmts& rSectFmts = GetDoc()->GetSections();
1228         sal_uInt16 nCount = rSectFmts.Count();
1229         for(sal_uInt16 i = 0; i < nCount; i++)
1230         {
1231             if( !rSectFmts[i]->IsInNodesArr())
1232                 nIndex ++;
1233             else if(nIndex == i)
1234                 break;
1235             if(nIndex == i)
1236                 break;
1237         }
1238         if(nIndex >= 0 && nIndex < rFmts.Count())
1239         {
1240             SwSectionFmt* pFmt = rFmts[(sal_uInt16)nIndex];
1241             xRet = GetObject(*pFmt);
1242         }
1243         else
1244             throw IndexOutOfBoundsException();
1245     }
1246     else
1247         throw uno::RuntimeException();
1248     return makeAny(xRet);
1249 }
1250 
1251 uno::Any SwXTextSections::getByName(const OUString& Name)
1252     throw( NoSuchElementException, WrappedTargetException, uno::RuntimeException )
1253 {
1254     vos::OGuard aGuard(Application::GetSolarMutex());
1255     uno::Any aRet;
1256     if(IsValid())
1257     {
1258         String aName(Name);
1259         SwSectionFmts& rFmts = GetDoc()->GetSections();
1260         uno::Reference< XTextSection >  xSect;
1261         for(sal_uInt16 i = 0; i < rFmts.Count(); i++)
1262         {
1263             SwSectionFmt* pFmt = rFmts[i];
1264             if (pFmt->IsInNodesArr()
1265                 && (aName == pFmt->GetSection()->GetSectionName()))
1266             {
1267                 xSect = GetObject(*pFmt);
1268                 aRet.setValue(&xSect, ::getCppuType((uno::Reference<XTextSection>*)0));
1269                 break;
1270             }
1271         }
1272         if(!xSect.is())
1273             throw NoSuchElementException();
1274     }
1275     else
1276         throw uno::RuntimeException();
1277     return aRet;
1278 }
1279 
1280 uno::Sequence< OUString > SwXTextSections::getElementNames(void)
1281     throw( uno::RuntimeException )
1282 {
1283     vos::OGuard aGuard(Application::GetSolarMutex());
1284     if(!IsValid())
1285         throw uno::RuntimeException();
1286     sal_uInt16 nCount = GetDoc()->GetSections().Count();
1287     SwSectionFmts& rSectFmts = GetDoc()->GetSections();
1288     for(sal_uInt16 i = nCount; i; i--)
1289     {
1290         if( !rSectFmts[i - 1]->IsInNodesArr())
1291             nCount--;
1292     }
1293 
1294     uno::Sequence<OUString> aSeq(nCount);
1295     if(nCount)
1296     {
1297         SwSectionFmts& rFmts = GetDoc()->GetSections();
1298         OUString* pArray = aSeq.getArray();
1299         sal_uInt16 nIndex = 0;
1300         for( sal_uInt16 i = 0; i < nCount; i++, nIndex++)
1301         {
1302             const SwSectionFmt* pFmt = rFmts[nIndex];
1303             while(!pFmt->IsInNodesArr())
1304             {
1305                 pFmt = rFmts[++nIndex];
1306             }
1307             pArray[i] = pFmt->GetSection()->GetSectionName();
1308         }
1309     }
1310     return aSeq;
1311 }
1312 
1313 sal_Bool SwXTextSections::hasByName(const OUString& Name)
1314     throw( uno::RuntimeException )
1315 {
1316     vos::OGuard aGuard(Application::GetSolarMutex());
1317     sal_Bool bRet = sal_False;
1318     String aName(Name);
1319     if(IsValid())
1320     {
1321         SwSectionFmts& rFmts = GetDoc()->GetSections();
1322         for(sal_uInt16 i = 0; i < rFmts.Count(); i++)
1323         {
1324             const SwSectionFmt* pFmt = rFmts[i];
1325             if (aName == pFmt->GetSection()->GetSectionName())
1326             {
1327                 bRet = sal_True;
1328                 break;
1329             }
1330         }
1331     }
1332     else
1333     {
1334         //Sonderbehandlung der dbg_ - Methoden
1335         if( COMPARE_EQUAL != aName.CompareToAscii("dbg_", 4))
1336             throw uno::RuntimeException();
1337     }
1338     return bRet;
1339 }
1340 
1341 uno::Type SAL_CALL SwXTextSections::getElementType() throw(uno::RuntimeException)
1342 {
1343     return ::getCppuType((uno::Reference<XTextSection>*)0);
1344 }
1345 
1346 sal_Bool SwXTextSections::hasElements(void) throw( uno::RuntimeException )
1347 {
1348     vos::OGuard aGuard(Application::GetSolarMutex());
1349     sal_uInt16 nCount = 0;
1350     if(IsValid())
1351     {
1352         SwSectionFmts& rFmts = GetDoc()->GetSections();
1353         nCount = rFmts.Count();
1354     }
1355     else
1356         throw uno::RuntimeException();
1357     return nCount > 0;
1358 }
1359 
1360 uno::Reference< XTextSection >  SwXTextSections::GetObject( SwSectionFmt& rFmt )
1361 {
1362     return SwXTextSection::CreateXTextSection(&rFmt);
1363 }
1364 
1365 OUString SwXBookmarks::getImplementationName(void) throw( RuntimeException )
1366 {
1367     return OUString::createFromAscii("SwXBookmarks");
1368 }
1369 
1370 sal_Bool SwXBookmarks::supportsService(const OUString& rServiceName) throw( RuntimeException )
1371 {
1372     return OUString::createFromAscii("com.sun.star.text.Bookmarks") == rServiceName;
1373 }
1374 
1375 Sequence< OUString > SwXBookmarks::getSupportedServiceNames(void) throw( RuntimeException )
1376 {
1377     Sequence< OUString > aRet(1);
1378     aRet[0] = OUString::createFromAscii("com.sun.star.text.Bookmarks");
1379     return aRet;
1380 }
1381 
1382 SwXBookmarks::SwXBookmarks(SwDoc* _pDoc) :
1383     SwUnoCollection(_pDoc)
1384 { }
1385 
1386 SwXBookmarks::~SwXBookmarks()
1387 { }
1388 
1389 sal_Int32 SwXBookmarks::getCount(void)
1390     throw( uno::RuntimeException )
1391 {
1392     vos::OGuard aGuard(Application::GetSolarMutex());
1393     if(!IsValid())
1394         throw uno::RuntimeException();
1395     return GetDoc()->getIDocumentMarkAccess()->getBookmarksCount();
1396 }
1397 
1398 uno::Any SwXBookmarks::getByIndex(sal_Int32 nIndex)
1399     throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
1400 {
1401     vos::OGuard aGuard(Application::GetSolarMutex());
1402     if(!IsValid())
1403         throw uno::RuntimeException();
1404     IDocumentMarkAccess* const pMarkAccess = GetDoc()->getIDocumentMarkAccess();
1405     if(nIndex < 0 || nIndex >= pMarkAccess->getBookmarksCount())
1406         throw IndexOutOfBoundsException();
1407 
1408     uno::Any aRet;
1409     ::sw::mark::IMark* pBkmk = pMarkAccess->getBookmarksBegin()[nIndex].get();
1410     const uno::Reference< text::XTextContent > xRef =
1411         SwXBookmark::CreateXBookmark(*GetDoc(), *pBkmk);
1412     aRet <<= xRef;
1413     return aRet;
1414 }
1415 
1416 uno::Any SwXBookmarks::getByName(const rtl::OUString& rName)
1417     throw( NoSuchElementException, WrappedTargetException, uno::RuntimeException )
1418 {
1419     vos::OGuard aGuard(Application::GetSolarMutex());
1420     if(!IsValid())
1421         throw uno::RuntimeException();
1422 
1423     IDocumentMarkAccess* const pMarkAccess = GetDoc()->getIDocumentMarkAccess();
1424     IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findBookmark(rName);
1425     if(ppBkmk == pMarkAccess->getBookmarksEnd())
1426         throw NoSuchElementException();
1427 
1428     uno::Any aRet;
1429     const uno::Reference< text::XTextContent > xRef =
1430         SwXBookmark::CreateXBookmark(*GetDoc(), *(ppBkmk->get()));
1431     aRet <<= xRef;
1432     return aRet;
1433 }
1434 
1435 uno::Sequence< OUString > SwXBookmarks::getElementNames(void)
1436     throw( uno::RuntimeException )
1437 {
1438     vos::OGuard aGuard(Application::GetSolarMutex());
1439     if(!IsValid())
1440         throw uno::RuntimeException();
1441 
1442     IDocumentMarkAccess* const pMarkAccess = GetDoc()->getIDocumentMarkAccess();
1443     uno::Sequence<OUString> aSeq(pMarkAccess->getBookmarksCount());
1444     sal_Int32 nCnt = 0;
1445     for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
1446         ppMark != pMarkAccess->getBookmarksEnd();)
1447         aSeq[nCnt++] = (*ppMark++)->GetName();
1448     return aSeq;
1449 }
1450 
1451 sal_Bool SwXBookmarks::hasByName(const OUString& rName)
1452     throw( uno::RuntimeException )
1453 {
1454     vos::OGuard aGuard(Application::GetSolarMutex());
1455     if(!IsValid())
1456         throw uno::RuntimeException();
1457 
1458     IDocumentMarkAccess* const pMarkAccess = GetDoc()->getIDocumentMarkAccess();
1459     return pMarkAccess->findBookmark(rName) != pMarkAccess->getBookmarksEnd();
1460 }
1461 
1462 uno::Type SAL_CALL SwXBookmarks::getElementType()
1463     throw(uno::RuntimeException)
1464 {
1465     return ::getCppuType((uno::Reference<XTextContent>*)0);
1466 }
1467 
1468 sal_Bool SwXBookmarks::hasElements(void)
1469     throw( uno::RuntimeException )
1470 {
1471     vos::OGuard aGuard(Application::GetSolarMutex());
1472     if(!IsValid())
1473         throw uno::RuntimeException();
1474     return GetDoc()->getIDocumentMarkAccess()->getBookmarksCount() != 0;
1475 }
1476 
1477 /******************************************************************
1478  *
1479  ******************************************************************/
1480 
1481 SwXNumberingRulesCollection::SwXNumberingRulesCollection( SwDoc* _pDoc ) :
1482     SwUnoCollection(_pDoc)
1483 {
1484 }
1485 
1486 SwXNumberingRulesCollection::~SwXNumberingRulesCollection()
1487 {
1488 }
1489 
1490 sal_Int32 SwXNumberingRulesCollection::getCount(void) throw( uno::RuntimeException )
1491 {
1492     vos::OGuard aGuard(Application::GetSolarMutex());
1493     if(!IsValid())
1494         throw uno::RuntimeException();
1495     return GetDoc()->GetNumRuleTbl().Count();
1496 }
1497 
1498 uno::Any SwXNumberingRulesCollection::getByIndex(sal_Int32 nIndex)
1499     throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
1500 {
1501     vos::OGuard aGuard(Application::GetSolarMutex());
1502     uno::Any aRet;
1503     if(IsValid())
1504     {
1505         uno::Reference< XIndexReplace >  xRef;
1506         if ( nIndex < GetDoc()->GetNumRuleTbl().Count() )
1507         {
1508             xRef = new SwXNumberingRules( *GetDoc()->GetNumRuleTbl()[ static_cast< sal_uInt16 >(nIndex) ] );
1509             aRet.setValue(&xRef, ::getCppuType((uno::Reference<XIndexReplace>*)0));
1510         }
1511 
1512         if(!xRef.is())
1513             throw IndexOutOfBoundsException();
1514     }
1515     else
1516         throw uno::RuntimeException();
1517     return aRet;
1518 }
1519 
1520 uno::Type SAL_CALL SwXNumberingRulesCollection::getElementType() throw(uno::RuntimeException)
1521 {
1522     return ::getCppuType((uno::Reference<XIndexReplace>*)0);
1523 }
1524 
1525 sal_Bool SwXNumberingRulesCollection::hasElements(void) throw( uno::RuntimeException )
1526 {
1527     vos::OGuard aGuard(Application::GetSolarMutex());
1528     if(!IsValid())
1529         throw uno::RuntimeException();
1530     return GetDoc()->GetNumRuleTbl().Count() > 0;
1531 }
1532 
1533 OUString SwXFootnotes::getImplementationName(void) throw( RuntimeException )
1534 {
1535     return C2U("SwXFootnotes");
1536 }
1537 
1538 sal_Bool SwXFootnotes::supportsService(const OUString& rServiceName) throw( RuntimeException )
1539 {
1540     return C2U("com.sun.star.text.Footnotes") == rServiceName;
1541 }
1542 
1543 Sequence< OUString > SwXFootnotes::getSupportedServiceNames(void) throw( RuntimeException )
1544 {
1545     Sequence< OUString > aRet(1);
1546     OUString* pArray = aRet.getArray();
1547     pArray[0] = C2U("com.sun.star.text.Footnotes");
1548     return aRet;
1549 }
1550 
1551 SwXFootnotes::SwXFootnotes(sal_Bool bEnd, SwDoc* _pDoc)
1552     : SwUnoCollection(_pDoc)
1553     , m_bEndnote(bEnd)
1554 {
1555 }
1556 
1557 SwXFootnotes::~SwXFootnotes()
1558 {
1559 }
1560 
1561 sal_Int32 SwXFootnotes::getCount(void) throw( uno::RuntimeException )
1562 {
1563     vos::OGuard aGuard(Application::GetSolarMutex());
1564     if(!IsValid())
1565         throw uno::RuntimeException();
1566     sal_Int32 nCount = 0;
1567     sal_uInt16 n, nFtnCnt = GetDoc()->GetFtnIdxs().Count();
1568     SwTxtFtn* pTxtFtn;
1569     for( n = 0; n < nFtnCnt; ++n )
1570     {
1571         pTxtFtn = GetDoc()->GetFtnIdxs()[ n ];
1572         const SwFmtFtn& rFtn = pTxtFtn->GetFtn();
1573         if ( rFtn.IsEndNote() != m_bEndnote )
1574             continue;
1575         nCount++;
1576     }
1577     return nCount;
1578 }
1579 
1580 uno::Any SwXFootnotes::getByIndex(sal_Int32 nIndex)
1581     throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
1582 {
1583     vos::OGuard aGuard(Application::GetSolarMutex());
1584     uno::Any aRet;
1585     sal_Int32 nCount = 0;
1586     if(IsValid())
1587     {
1588         sal_uInt16 n, nFtnCnt = GetDoc()->GetFtnIdxs().Count();
1589         SwTxtFtn* pTxtFtn;
1590         uno::Reference< XFootnote >  xRef;
1591         for( n = 0; n < nFtnCnt; ++n )
1592         {
1593             pTxtFtn = GetDoc()->GetFtnIdxs()[ n ];
1594             const SwFmtFtn& rFtn = pTxtFtn->GetFtn();
1595             if ( rFtn.IsEndNote() != m_bEndnote )
1596                 continue;
1597 
1598             if(nCount == nIndex)
1599             {
1600                 xRef = SwXFootnote::CreateXFootnote(*GetDoc(), rFtn);
1601                 aRet <<= xRef;
1602                 break;
1603             }
1604             nCount++;
1605         }
1606         if(!xRef.is())
1607             throw IndexOutOfBoundsException();
1608     }
1609     else
1610         throw uno::RuntimeException();
1611     return aRet;
1612 }
1613 
1614 uno::Type SAL_CALL SwXFootnotes::getElementType() throw(uno::RuntimeException)
1615 {
1616     return ::getCppuType((uno::Reference<XFootnote>*)0);
1617 }
1618 
1619 sal_Bool SwXFootnotes::hasElements(void) throw( uno::RuntimeException )
1620 {
1621     vos::OGuard aGuard(Application::GetSolarMutex());
1622     if(!IsValid())
1623         throw uno::RuntimeException();
1624     return GetDoc()->GetFtnIdxs().Count() > 0;
1625 }
1626 
1627 Reference<XFootnote>    SwXFootnotes::GetObject( SwDoc& rDoc, const SwFmtFtn& rFmt )
1628 {
1629     return SwXFootnote::CreateXFootnote(rDoc, rFmt);
1630 }
1631 
1632 /******************************************************************
1633  *
1634  ******************************************************************/
1635 
1636 OUString SwXReferenceMarks::getImplementationName(void) throw( RuntimeException )
1637 {
1638     return C2U("SwXReferenceMarks");
1639 }
1640 
1641 sal_Bool SwXReferenceMarks::supportsService(const OUString& rServiceName) throw( RuntimeException )
1642 {
1643     return C2U("com.sun.star.text.ReferenceMarks") == rServiceName;
1644 }
1645 
1646 Sequence< OUString > SwXReferenceMarks::getSupportedServiceNames(void) throw( RuntimeException )
1647 {
1648     Sequence< OUString > aRet(1);
1649     OUString* pArray = aRet.getArray();
1650     pArray[0] = C2U("com.sun.star.text.ReferenceMarks");
1651     return aRet;
1652 }
1653 
1654 SwXReferenceMarks::SwXReferenceMarks(SwDoc* _pDoc) :
1655     SwUnoCollection(_pDoc)
1656 {
1657 }
1658 
1659 SwXReferenceMarks::~SwXReferenceMarks()
1660 {
1661 }
1662 
1663 sal_Int32 SwXReferenceMarks::getCount(void) throw( uno::RuntimeException )
1664 {
1665     vos::OGuard aGuard(Application::GetSolarMutex());
1666     if(!IsValid())
1667         throw uno::RuntimeException();
1668     return GetDoc()->GetRefMarks();
1669 }
1670 
1671 uno::Any SwXReferenceMarks::getByIndex(sal_Int32 nIndex)
1672     throw( IndexOutOfBoundsException, WrappedTargetException, uno::RuntimeException )
1673 {
1674     vos::OGuard aGuard(Application::GetSolarMutex());
1675     uno::Any aRet;
1676     if(!IsValid())
1677         throw uno::RuntimeException();
1678     uno::Reference< XTextContent >  xRef;
1679     if(0 <= nIndex && nIndex < USHRT_MAX)
1680     {
1681         const SwFmtRefMark* pMark = GetDoc()->GetRefMark( (sal_uInt16) nIndex );
1682         if(pMark)
1683         {
1684             xRef = SwXReferenceMarks::GetObject( GetDoc(), pMark );
1685             aRet.setValue(&xRef, ::getCppuType((uno::Reference<XTextContent>*)0));
1686         }
1687     }
1688     if(!xRef.is())
1689         throw IndexOutOfBoundsException();
1690     return aRet;
1691 }
1692 
1693 uno::Any SwXReferenceMarks::getByName(const OUString& rName)
1694     throw( NoSuchElementException, WrappedTargetException, uno::RuntimeException )
1695 {
1696     vos::OGuard aGuard(Application::GetSolarMutex());
1697     uno::Any aRet;
1698     if(IsValid())
1699     {
1700         const SwFmtRefMark* pMark = GetDoc()->GetRefMark(rName);
1701         if(pMark)
1702         {
1703             uno::Reference< XTextContent >  xRef = SwXReferenceMarks::GetObject( GetDoc(), pMark );
1704             aRet.setValue(&xRef, ::getCppuType((uno::Reference<XTextContent>*)0));
1705         }
1706         else
1707             throw NoSuchElementException();
1708     }
1709     else
1710         throw uno::RuntimeException();
1711     return aRet;
1712 }
1713 
1714 uno::Sequence< OUString > SwXReferenceMarks::getElementNames(void) throw( uno::RuntimeException )
1715 {
1716     vos::OGuard aGuard(Application::GetSolarMutex());
1717     uno::Sequence<OUString> aRet;
1718     if(IsValid())
1719     {
1720         SvStringsDtor aStrings;
1721         sal_uInt16 nCount = GetDoc()->GetRefMarks( &aStrings );
1722         aRet.realloc(nCount);
1723         OUString* pNames = aRet.getArray();
1724         for(sal_uInt16 i = 0; i < nCount; i++)
1725             pNames[i] = *aStrings.GetObject(i);
1726     }
1727     else
1728         throw uno::RuntimeException();
1729     return aRet;
1730 }
1731 
1732 sal_Bool SwXReferenceMarks::hasByName(const OUString& rName) throw( uno::RuntimeException )
1733 {
1734     vos::OGuard aGuard(Application::GetSolarMutex());
1735     if(!IsValid())
1736         throw uno::RuntimeException();
1737     return 0 != GetDoc()->GetRefMark( rName);
1738 }
1739 
1740 uno::Type SAL_CALL SwXReferenceMarks::getElementType() throw(uno::RuntimeException)
1741 {
1742     return ::getCppuType((uno::Reference<XTextContent>*)0);
1743 }
1744 
1745 sal_Bool SwXReferenceMarks::hasElements(void) throw( uno::RuntimeException )
1746 {
1747     vos::OGuard aGuard(Application::GetSolarMutex());
1748     if(!IsValid())
1749         throw uno::RuntimeException();
1750     return 0 != GetDoc()->GetRefMarks();
1751 }
1752 
1753 SwXReferenceMark* SwXReferenceMarks::GetObject( SwDoc* pDoc, const SwFmtRefMark* pMark )
1754 {
1755     vos::OGuard aGuard(Application::GetSolarMutex());
1756 
1757     return SwXReferenceMark::CreateXReferenceMark(*pDoc, *pMark);
1758 }
1759 
1760 /******************************************************************
1761  *
1762  ******************************************************************/
1763 
1764 void SwUnoCollection::Invalidate()
1765 {
1766     bObjectValid = sal_False;
1767     pDoc = 0;
1768 }
1769 
1770 /* vim: set noet sw=4 ts=4: */
1771