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 #ifndef _SECTION_HXX
25 #define _SECTION_HXX
26
27 #include <boost/utility.hpp>
28
29 #include <com/sun/star/uno/Sequence.h>
30
31 #include <tools/rtti.hxx>
32 #include <tools/ref.hxx>
33 #include <svl/svarray.hxx>
34 // --> OD #i117863#
35 #include <svl/smplhint.hxx>
36 // <--
37 #include <sfx2/lnkbase.hxx>
38 #include <sfx2/Metadatable.hxx>
39
40 #include <frmfmt.hxx>
41
42
43 namespace com { namespace sun { namespace star {
44 namespace text { class XTextSection; }
45 } } }
46
47 // Forward Deklaration
48 class SwSectionFmt;
49 class SwDoc;
50 class SwSection;
51 class SwSectionNode;
52 class SwTOXBase;
53
54 #ifndef SW_DECL_SWSERVEROBJECT_DEFINED
55 #define SW_DECL_SWSERVEROBJECT_DEFINED
56 SV_DECL_REF( SwServerObject )
57 #endif
58
59 SV_DECL_PTRARR( SwSections, SwSection*, 0, 4 )
60
61 enum SectionType { CONTENT_SECTION,
62 TOX_HEADER_SECTION,
63 TOX_CONTENT_SECTION,
64 DDE_LINK_SECTION = OBJECT_CLIENT_DDE,
65 FILE_LINK_SECTION = OBJECT_CLIENT_FILE
66 /*
67 // verbleiben noch:
68 OBJECT_CLIENT_SO = 0x80,
69 OBJECT_CLIENT_OLE = 0x82,
70 OBJECT_CLIENT_OLE_CACHE = 0x83,
71 */
72 };
73
74 enum LinkCreateType
75 {
76 CREATE_NONE, // nichts weiter tun
77 CREATE_CONNECT, // Link gleich connecten
78 CREATE_UPDATE // Link connecten und updaten
79 };
80
81 class SW_DLLPUBLIC SwSectionData
82 {
83 private:
84 SectionType m_eType;
85
86 String m_sSectionName;
87 String m_sCondition;
88 String m_sLinkFileName;
89 String m_sLinkFilePassword; // JP 27.02.2001: must be changed to Sequence
90 ::com::sun::star::uno::Sequence <sal_Int8> m_Password;
91
92 /// it seems this flag caches the current final "hidden" state
93 bool m_bHiddenFlag : 1;
94 /// flags that correspond to attributes in the format:
95 /// may have different value than format attribute:
96 /// format attr has value for this section, while flag is
97 /// effectively ORed with parent sections!
98 bool m_bProtectFlag : 1;
99 // --> FME 2004-06-22 #114856# edit in readonly sections
100 bool m_bEditInReadonlyFlag : 1;
101 // <--
102 bool m_bHidden : 1; // all paragraphs hidden?
103 bool m_bCondHiddenFlag : 1; // Hiddenflag for condition
104 bool m_bConnectFlag : 1; // connected to server?
105
106 public:
107
108 SwSectionData(SectionType const eType, String const& rName);
109 explicit SwSectionData(SwSection const&);
110 SwSectionData(SwSectionData const&);
111 SwSectionData & operator=(SwSectionData const&);
112 bool operator==(SwSectionData const&) const;
113
GetSectionName() const114 String const& GetSectionName() const { return m_sSectionName; }
SetSectionName(String const & rName)115 void SetSectionName(String const& rName){ m_sSectionName = rName; }
GetType() const116 SectionType GetType() const { return m_eType; }
SetType(SectionType const eNew)117 void SetType(SectionType const eNew) { m_eType = eNew; }
118
IsHidden() const119 bool IsHidden() const { return m_bHidden; }
SetHidden(bool const bFlag=true)120 void SetHidden(bool const bFlag = true) { m_bHidden = bFlag; }
121
IsHiddenFlag() const122 bool IsHiddenFlag() const { return m_bHiddenFlag; }
123 SW_DLLPRIVATE void
SetHiddenFlag(bool const bFlag)124 SetHiddenFlag(bool const bFlag) { m_bHiddenFlag = bFlag; }
IsProtectFlag() const125 bool IsProtectFlag() const { return m_bProtectFlag; }
126 SW_DLLPRIVATE void
SetProtectFlag(bool const bFlag)127 SetProtectFlag(bool const bFlag) { m_bProtectFlag = bFlag; }
128 // --> FME 2004-06-22 #114856# edit in readonly sections
IsEditInReadonlyFlag() const129 bool IsEditInReadonlyFlag() const { return m_bEditInReadonlyFlag; }
SetEditInReadonlyFlag(bool const bFlag)130 void SetEditInReadonlyFlag(bool const bFlag)
131 { m_bEditInReadonlyFlag = bFlag; }
132 // <--
133
SetCondHidden(bool const bFlag=true)134 void SetCondHidden(bool const bFlag = true) { m_bCondHiddenFlag = bFlag; };
IsCondHidden() const135 bool IsCondHidden() const { return m_bCondHiddenFlag; }
136
GetCondition() const137 String const& GetCondition() const { return m_sCondition; }
SetCondition(String const & rNew)138 void SetCondition(String const& rNew) { m_sCondition = rNew; }
139
GetLinkFileName() const140 String const& GetLinkFileName() const { return m_sLinkFileName; };
SetLinkFileName(String const & rNew,String const * pPassWd=0)141 void SetLinkFileName(String const& rNew, String const* pPassWd = 0)
142 {
143 m_sLinkFileName = rNew;
144 if (pPassWd) { SetLinkFilePassword(*pPassWd); }
145 }
146
GetLinkFilePassword() const147 String const& GetLinkFilePassword() const { return m_sLinkFilePassword; }
SetLinkFilePassword(String const & rS)148 void SetLinkFilePassword(String const& rS) { m_sLinkFilePassword = rS; }
149
GetPassword() const150 ::com::sun::star::uno::Sequence<sal_Int8> const& GetPassword() const
151 { return m_Password; }
SetPassword(::com::sun::star::uno::Sequence<sal_Int8> const & rNew)152 void SetPassword(::com::sun::star::uno::Sequence<sal_Int8> const& rNew)
153 { m_Password = rNew; }
IsLinkType() const154 bool IsLinkType() const
155 { return (DDE_LINK_SECTION == m_eType) || (FILE_LINK_SECTION == m_eType); }
156
IsConnectFlag() const157 bool IsConnectFlag() const { return m_bConnectFlag; }
SetConnectFlag(bool const bFlag=true)158 void SetConnectFlag(bool const bFlag = true){ m_bConnectFlag = bFlag; }
159 };
160
161 class SW_DLLPUBLIC SwSection
162 : public SwClient
163 {
164 // damit beim Anlegen/Loeschen von Frames das Flag richtig gepflegt wird!
165 friend class SwSectionNode;
166 // the "read CTOR" of SwSectionFrm have to change the Hiddenflag
167 friend class SwSectionFrm;
168
169 private:
170 SwSectionData m_Data;
171
172 SwServerObjectRef m_RefObj; // set if DataServer
173 ::sfx2::SvBaseLinkRef m_RefLink;
174
175 SW_DLLPRIVATE void ImplSetHiddenFlag(
176 bool const bHidden, bool const bCondition);
177
178 protected:
179 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
180
181 public:
182 TYPEINFO(); // rtti
183
184 SwSection(SectionType const eType, String const& rName,
185 SwSectionFmt & rFormat);
186 virtual ~SwSection();
187
188 bool DataEquals(SwSectionData const& rCmp) const;
189
190 void SetSectionData(SwSectionData const& rData);
191
GetSectionName() const192 String const& GetSectionName() const { return m_Data.GetSectionName(); }
SetSectionName(String const & rName)193 void SetSectionName(String const& rName){ m_Data.SetSectionName(rName); }
GetType() const194 SectionType GetType() const { return m_Data.GetType(); }
SetType(SectionType const eType)195 void SetType(SectionType const eType) { return m_Data.SetType(eType); }
196
GetFmt()197 SwSectionFmt* GetFmt() { return (SwSectionFmt*)GetRegisteredIn(); }
GetFmt() const198 SwSectionFmt* GetFmt() const { return (SwSectionFmt*)GetRegisteredIn(); }
199
200 // setze die Hidden/Protected -> gesamten Baum updaten !
201 // (Attribute/Flags werden gesetzt/erfragt)
IsHidden() const202 bool IsHidden() const { return m_Data.IsHidden(); }
203 void SetHidden (bool const bFlag = true);
204 bool IsProtect() const;
205 void SetProtect(bool const bFlag = true);
206 // --> FME 2004-06-22 #114856# edit in readonly sections
207 bool IsEditInReadonly() const;
208 void SetEditInReadonly(bool const bFlag = true);
209 // <--
210
211 // erfrage die internen Flags (Zustand inklusive Parents nicht, was
212 // aktuell an der Section gesetzt ist!!)
IsHiddenFlag() const213 bool IsHiddenFlag() const { return m_Data.IsHiddenFlag(); }
IsProtectFlag() const214 bool IsProtectFlag() const { return m_Data.IsProtectFlag(); }
215 // --> FME 2004-06-22 #114856# edit in readonly sections
IsEditInReadonlyFlag() const216 bool IsEditInReadonlyFlag() const { return m_Data.IsEditInReadonlyFlag(); }
217 // <--
218
219 void SetCondHidden(bool const bFlag = true);
IsCondHidden() const220 bool IsCondHidden() const { return m_Data.IsCondHidden(); }
221 // erfrage (auch ueber die Parents), ob diese Section versteckt sein soll.
222 sal_Bool CalcHiddenFlag() const;
223
224
225 inline SwSection* GetParent() const;
226
GetCondition() const227 String const& GetCondition() const { return m_Data.GetCondition(); }
SetCondition(String const & rNew)228 void SetCondition(String const& rNew) { m_Data.SetCondition(rNew); }
229
230 const String& GetLinkFileName() const;
231 void SetLinkFileName(String const& rNew, String const*const pPassWd = 0);
232 // password of linked file (only valid during runtime!)
GetLinkFilePassword() const233 String const& GetLinkFilePassword() const
234 { return m_Data.GetLinkFilePassword(); }
SetLinkFilePassword(String const & rS)235 void SetLinkFilePassword(String const& rS)
236 { m_Data.SetLinkFilePassword(rS); }
237
238 // get / set password of this section
GetPassword() const239 ::com::sun::star::uno::Sequence<sal_Int8> const& GetPassword() const
240 { return m_Data.GetPassword(); }
SetPassword(::com::sun::star::uno::Sequence<sal_Int8> const & rNew)241 void SetPassword(::com::sun::star::uno::Sequence <sal_Int8> const& rNew)
242 { m_Data.SetPassword(rNew); }
243
244 // Daten Server-Methoden
245 void SetRefObject( SwServerObject* pObj );
GetObject() const246 const SwServerObject* GetObject() const { return & m_RefObj; }
GetObject()247 SwServerObject* GetObject() { return & m_RefObj; }
IsServer() const248 bool IsServer() const { return m_RefObj.Is(); }
249
250 // Methoden fuer gelinkte Bereiche
GetUpdateType() const251 sal_uInt16 GetUpdateType() const { return m_RefLink->GetUpdateMode(); }
SetUpdateType(sal_uInt16 const nType)252 void SetUpdateType(sal_uInt16 const nType )
253 { m_RefLink->SetUpdateMode(nType); }
254
IsConnected() const255 bool IsConnected() const { return m_RefLink.Is(); }
UpdateNow()256 void UpdateNow() { m_RefLink->Update(); }
Disconnect()257 void Disconnect() { m_RefLink->Disconnect(); }
258
GetBaseLink() const259 const ::sfx2::SvBaseLink& GetBaseLink() const { return *m_RefLink; }
GetBaseLink()260 ::sfx2::SvBaseLink& GetBaseLink() { return *m_RefLink; }
261
262 void CreateLink( LinkCreateType eType );
263
264 void MakeChildLinksVisible( const SwSectionNode& rSectNd );
265
IsLinkType() const266 bool IsLinkType() const { return m_Data.IsLinkType(); }
267
268 // Flags fuer UI - Verbindung geklappt?
IsConnectFlag() const269 bool IsConnectFlag() const { return m_Data.IsConnectFlag(); }
SetConnectFlag(bool const bFlag=true)270 void SetConnectFlag(bool const bFlag = true)
271 { m_Data.SetConnectFlag(bFlag); }
272
273 // return the TOX base class if the section is a TOX section
274 const SwTOXBase* GetTOXBase() const;
275
276 // --> OD 2007-02-14 #b6521322#
277 void BreakLink();
278 // <--
279
280 };
281
282 // --> OD #i117863#
283 class SwSectionFrmMoveAndDeleteHint : public SfxSimpleHint
284 {
285 public:
SwSectionFrmMoveAndDeleteHint(const sal_Bool bSaveCntnt)286 SwSectionFrmMoveAndDeleteHint( const sal_Bool bSaveCntnt )
287 : SfxSimpleHint( SFX_HINT_DYING )
288 , mbSaveCntnt( bSaveCntnt )
289 {}
290
~SwSectionFrmMoveAndDeleteHint()291 ~SwSectionFrmMoveAndDeleteHint()
292 {}
293
IsSaveCntnt() const294 sal_Bool IsSaveCntnt() const
295 {
296 return mbSaveCntnt;
297 }
298
299 private:
300 const sal_Bool mbSaveCntnt;
301 };
302 // <--
303
304 enum SectionSort { SORTSECT_NOT, SORTSECT_NAME, SORTSECT_POS };
305
306 class SW_DLLPUBLIC SwSectionFmt
307 : public SwFrmFmt
308 , public ::sfx2::Metadatable
309 {
310 friend class SwDoc;
311
312 /** why does this exist in addition to the m_wXObject in SwFrmFmt?
313 in case of an index, both a SwXDocumentIndex and a SwXTextSection
314 register at this SwSectionFmt, so we need to have two refs.
315 */
316 ::com::sun::star::uno::WeakReference<
317 ::com::sun::star::text::XTextSection> m_wXTextSection;
318
319 SW_DLLPRIVATE void UpdateParent(); // Parent wurde veraendert
320
321 protected:
322 SwSectionFmt( SwSectionFmt* pDrvdFrm, SwDoc *pDoc );
323 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
324
325 public:
326 TYPEINFO(); //Bereits in Basisklasse Client drin.
327 ~SwSectionFmt();
328
329 //Vernichtet alle Frms in aDepend (Frms werden per PTR_CAST erkannt).
330 virtual void DelFrms();
331
332 //Erzeugt die Ansichten
333 virtual void MakeFrms();
334
335 // erfrage vom Format Informationen
336 virtual sal_Bool GetInfo( SfxPoolItem& ) const;
337
338 SwSection* GetSection() const;
339 inline SwSectionFmt* GetParent() const;
340 inline SwSection* GetParentSection() const;
341
342 // alle Sections, die von dieser abgeleitet sind
343 // - sortiert nach : Name oder Position oder unsortiert
344 // - alle oder nur die, die sich im normalten Nodes-Array befinden
345 sal_uInt16 GetChildSections( SwSections& rArr,
346 SectionSort eSort = SORTSECT_NOT,
347 sal_Bool bAllSections = sal_True ) const;
348
349 // erfrage, ob sich die Section im Nodes-Array oder UndoNodes-Array
350 // befindet.
351 sal_Bool IsInNodesArr() const;
352
353 SwSectionNode* GetSectionNode(bool const bEvenIfInUndo = false);
GetSectionNode(bool const bEvenIfInUndo=false) const354 const SwSectionNode* GetSectionNode(bool const bEvenIfInUndo = false) const
355 { return const_cast<SwSectionFmt *>(this)
356 ->GetSectionNode(bEvenIfInUndo); }
357
358 // ist die Section eine gueltige fuers GlobalDocument?
359 const SwSection* GetGlobalDocSection() const;
360
361 SW_DLLPRIVATE ::com::sun::star::uno::WeakReference<
GetXTextSection() const362 ::com::sun::star::text::XTextSection> const& GetXTextSection() const
363 { return m_wXTextSection; }
SetXTextSection(::com::sun::star::uno::Reference<::com::sun::star::text::XTextSection> const & xTextSection)364 SW_DLLPRIVATE void SetXTextSection(::com::sun::star::uno::Reference<
365 ::com::sun::star::text::XTextSection> const& xTextSection)
366 { m_wXTextSection = xTextSection; }
367
368 // sfx2::Metadatable
369 virtual ::sfx2::IXmlIdRegistry& GetRegistry();
370 virtual bool IsInClipboard() const;
371 virtual bool IsInUndo() const;
372 virtual bool IsInContent() const;
373 virtual ::com::sun::star::uno::Reference<
374 ::com::sun::star::rdf::XMetadatable > MakeUnoObject();
375
376 };
377
378 // -------------- inlines ---------------------------------
379
GetParent() const380 inline SwSection* SwSection::GetParent() const
381 {
382 SwSectionFmt* pFmt = GetFmt();
383 SwSection* pRet = 0;
384 if( pFmt )
385 pRet = pFmt->GetParentSection();
386 return pRet;
387 }
388
GetParent() const389 inline SwSectionFmt* SwSectionFmt::GetParent() const
390 {
391 SwSectionFmt* pRet = 0;
392 if( GetRegisteredIn() )
393 pRet = PTR_CAST( SwSectionFmt, GetRegisteredIn() );
394 return pRet;
395 }
396
GetParentSection() const397 inline SwSection* SwSectionFmt::GetParentSection() const
398 {
399 SwSectionFmt* pParent = GetParent();
400 SwSection* pRet = 0;
401 if( pParent )
402 {
403 pRet = pParent->GetSection();
404 }
405 return pRet;
406 }
407
408
409 #endif /* _SECTION_HXX */
410