1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #ifndef INCLUDED_SFX2_DINFDLG_HXX
20 #define INCLUDED_SFX2_DINFDLG_HXX
21 
22 #include <sal/config.h>
23 #include <sfx2/dllapi.h>
24 
25 #include <com/sun/star/beans/PropertyValue.hpp>
26 #include <com/sun/star/util/DateTime.hpp>
27 #include <com/sun/star/util/Duration.hpp>
28 #include <com/sun/star/document/CmisProperty.hpp>
29 
30 #include <svl/stritem.hxx>
31 #include <svl/zforlist.hxx>
32 
33 #include <svtools/ctrlbox.hxx>
34 
35 #include <vcl/idle.hxx>
36 
37 #include <sfx2/tabdlg.hxx>
38 
39 #include <boost/optional/optional.hpp>
40 #include <memory>
41 
42 namespace com::sun::star::beans { struct PropertyValue; }
43 
44 namespace com { namespace sun { namespace star {
45     namespace document {
46         class XDocumentProperties;
47     }
48 } } }
49 
50 struct CustomProperty;
51 
52 // class SfxDocumentInfoItem ---------------------------------------------
53 
54 class SFX2_DLLPUBLIC SfxDocumentInfoItem final : public SfxStringItem
55 {
56 private:
57     sal_Int32                    m_AutoloadDelay;
58     OUString                     m_AutoloadURL;
59     bool                         m_isAutoloadEnabled;
60     OUString                     m_DefaultTarget;
61     OUString const               m_TemplateName;
62     OUString                     m_Author;
63     css::util::DateTime          m_CreationDate;
64     OUString                     m_ModifiedBy;
65     css::util::DateTime          m_ModificationDate;
66     OUString                     m_PrintedBy;
67     css::util::DateTime          m_PrintDate;
68     sal_Int16                    m_EditingCycles;
69     sal_Int32                    m_EditingDuration;
70     OUString                     m_Description;
71     OUString                     m_Keywords;
72     OUString                     m_Subject;
73     OUString                     m_Title;
74     bool                         m_bHasTemplate;
75     bool                         m_bDeleteUserData;
76     bool                         m_bUseUserData;
77     bool                         m_bUseThumbnailSave;
78     std::vector< std::unique_ptr<CustomProperty> >    m_aCustomProperties;
79     css::uno::Sequence< css::document::CmisProperty > m_aCmisProperties;
80 
81 public:
82     static SfxPoolItem* CreateDefault();
83     SfxDocumentInfoItem();
84     SfxDocumentInfoItem( const OUString &rFileName,
85         const css::uno::Reference< css::document::XDocumentProperties> & i_xDocProps,
86         const css::uno::Sequence< css::document::CmisProperty> & i_cmisProps,
87         bool bUseUserData, bool bUseThumbnailSave );
88     SfxDocumentInfoItem( const SfxDocumentInfoItem& );
89     virtual ~SfxDocumentInfoItem() override;
90 
91     /// update i_xDocProps with the data in this object
92     void UpdateDocumentInfo(
93         const css::uno::Reference< css::document::XDocumentProperties> & i_xDocProps,
94         bool i_bDoNotUpdateUserDefined = false)
95         const;
isCmisDocument() const96     bool        isCmisDocument() const { return m_aCmisProperties.hasElements();}
97 
isAutoloadEnabled() const98     bool        isAutoloadEnabled() const { return m_isAutoloadEnabled; }
setAutoloadEnabled(bool i_val)99     void        setAutoloadEnabled(bool i_val) { m_isAutoloadEnabled = i_val; }
getAutoloadDelay() const100     sal_Int32   getAutoloadDelay() const { return m_AutoloadDelay; }
setAutoloadDelay(sal_Int32 i_val)101     void        setAutoloadDelay(sal_Int32 i_val) { m_AutoloadDelay = i_val; }
getAutoloadURL() const102     const OUString& getAutoloadURL() const { return m_AutoloadURL; }
setAutoloadURL(const OUString & i_val)103     void        setAutoloadURL(const OUString& i_val) { m_AutoloadURL = i_val; }
getDefaultTarget() const104     const OUString& getDefaultTarget() const { return m_DefaultTarget; }
setDefaultTarget(const OUString & i_val)105     void        setDefaultTarget(const OUString& i_val) { m_DefaultTarget = i_val; }
getTemplateName() const106     const OUString& getTemplateName() const { return m_TemplateName; }
getAuthor() const107     const OUString& getAuthor() const { return m_Author; }
setAuthor(const OUString & i_val)108     void        setAuthor(const OUString& i_val) { m_Author = i_val; }
109 
110     const css::util::DateTime&
getCreationDate() const111                 getCreationDate() const { return m_CreationDate; }
getModifiedBy() const112     const OUString& getModifiedBy() const { return m_ModifiedBy; }
setModifiedBy(const OUString & i_val)113     void        setModifiedBy(const OUString& i_val) { m_ModifiedBy = i_val; }
114 
115     const css::util::DateTime&
getModificationDate() const116                 getModificationDate() const { return m_ModificationDate; }
getPrintedBy() const117     const OUString& getPrintedBy() const { return m_PrintedBy; }
setPrintedBy(const OUString & i_val)118     void        setPrintedBy(const OUString& i_val) { m_PrintedBy = i_val; }
119     const css::util::DateTime&
getPrintDate() const120                 getPrintDate() const { return m_PrintDate; }
getEditingCycles() const121     sal_Int16   getEditingCycles() const { return m_EditingCycles; }
setEditingCycles(sal_Int16 i_val)122     void        setEditingCycles(sal_Int16 i_val) { m_EditingCycles = i_val; }
getEditingDuration() const123     sal_Int32   getEditingDuration() const { return m_EditingDuration; }
setEditingDuration(sal_Int32 i_val)124     void        setEditingDuration(sal_Int32 i_val) { m_EditingDuration = i_val; }
getDescription() const125     const OUString& getDescription() const { return m_Description; }
setDescription(const OUString & i_val)126     void        setDescription(const OUString& i_val) { m_Description = i_val; }
getKeywords() const127     const OUString& getKeywords() const { return m_Keywords; }
setKeywords(const OUString & i_val)128     void        setKeywords(const OUString& i_val) { m_Keywords = i_val; }
getSubject() const129     const OUString& getSubject() const { return m_Subject; }
setSubject(const OUString & i_val)130     void        setSubject(const OUString& i_val) { m_Subject = i_val; }
getTitle() const131     const OUString& getTitle() const { return m_Title; }
setTitle(const OUString & i_val)132     void        setTitle(const OUString& i_val) { m_Title = i_val; }
133 
134     /// reset user-specific data (author, modified-by, ...)
135     void        resetUserData(const OUString & i_rAuthor);
136 
SetTemplate(bool b)137     void        SetTemplate( bool b ) { m_bHasTemplate = b; }
HasTemplate() const138     bool        HasTemplate() const { return m_bHasTemplate; }
139     void        SetDeleteUserData( bool bSet );
140     void        SetUseUserData( bool bSet );
141     void        SetUseThumbnailSave( bool bSet );
IsDeleteUserData() const142     bool        IsDeleteUserData() const { return m_bDeleteUserData;}
IsUseUserData() const143     bool        IsUseUserData() const { return m_bUseUserData;}
IsUseThumbnailSave() const144     bool        IsUseThumbnailSave() const { return m_bUseThumbnailSave;}
145 
146 
147     std::vector< std::unique_ptr<CustomProperty> > GetCustomProperties() const;
148     void        ClearCustomProperties();
149     void        AddCustomProperty(  const OUString& sName,
150                                     const css::uno::Any& rValue );
151 
152     const css::uno::Sequence< css::document::CmisProperty >&
GetCmisProperties() const153                         GetCmisProperties() const { return m_aCmisProperties;}
154 
155     void        SetCmisProperties(const css::uno::Sequence< css::document::CmisProperty >& cmisProps );
156     virtual SfxPoolItem*    Clone( SfxItemPool* pPool = nullptr ) const override;
157     virtual bool            operator==( const SfxPoolItem& ) const override;
158     virtual bool        QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const override;
159     virtual bool        PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId ) override;
160 };
161 
162 // class SfxDocumentPage -------------------------------------------------
163 
164 class SfxDocumentPage final : public SfxTabPage
165 {
166 private:
167     OUString                    m_aUnknownSize;
168     OUString                    m_aMultiSignedStr;
169 
170     bool                        bEnableUseUserData  : 1,
171                                 bHandleDelete       : 1;
172 
173     std::unique_ptr<weld::Image> m_xBmp;
174     std::unique_ptr<weld::Label> m_xNameED;
175     std::unique_ptr<weld::Button> m_xChangePassBtn;
176 
177     std::unique_ptr<weld::Label> m_xShowTypeFT;
178     std::unique_ptr<weld::Label> m_xFileValEd;
179     std::unique_ptr<weld::Label> m_xShowSizeFT;
180 
181     std::unique_ptr<weld::Label> m_xCreateValFt;
182     std::unique_ptr<weld::Label> m_xChangeValFt;
183     std::unique_ptr<weld::Label> m_xSignedValFt;
184     std::unique_ptr<weld::Button> m_xSignatureBtn;
185     std::unique_ptr<weld::Label> m_xPrintValFt;
186     std::unique_ptr<weld::Label> m_xTimeLogValFt;
187     std::unique_ptr<weld::Label> m_xDocNoValFt;
188 
189     std::unique_ptr<weld::CheckButton> m_xUseUserDataCB;
190     std::unique_ptr<weld::Button> m_xDeleteBtn;
191     std::unique_ptr<weld::CheckButton> m_xUseThumbnailSaveCB;
192 
193     std::unique_ptr<weld::Label> m_xTemplFt;
194     std::unique_ptr<weld::Label> m_xTemplValFt;
195 
196     DECL_LINK(DeleteHdl, weld::Button&, void);
197     DECL_LINK(SignatureHdl, weld::Button&, void);
198     DECL_LINK(ChangePassHdl, weld::Button&, void);
199     void                ImplUpdateSignatures();
200     void                ImplCheckPasswordState();
201 
202     virtual bool        FillItemSet( SfxItemSet* ) override;
203     virtual void        Reset( const SfxItemSet* ) override;
204 
205 public:
206     SfxDocumentPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet&);
207     static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
208     virtual ~SfxDocumentPage() override;
209 
210     void                EnableUseUserData();
211 };
212 
213 // class SfxDocumentDescPage ---------------------------------------------
214 
215 class SfxDocumentDescPage final : public SfxTabPage
216 {
217 private:
218     SfxDocumentInfoItem* m_pInfoItem;
219     std::unique_ptr<weld::Entry> m_xTitleEd;
220     std::unique_ptr<weld::Entry> m_xThemaEd;
221     std::unique_ptr<weld::Entry> m_xKeywordsEd;
222     std::unique_ptr<weld::TextView> m_xCommentEd;
223 
224     virtual bool            FillItemSet( SfxItemSet* ) override;
225     virtual void            Reset( const SfxItemSet* ) override;
226 
227 public:
228     SfxDocumentDescPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet&);
229     virtual ~SfxDocumentDescPage() override;
230     static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
231 };
232 
233 // class SfxDocumentInfoDialog -------------------------------------------
234 
235 class SFX2_DLLPUBLIC SfxDocumentInfoDialog final : public SfxTabDialogController
236 {
237     virtual void PageCreated(const OString& rId, SfxTabPage& rPage) override;
238 
239 public:
240     SfxDocumentInfoDialog(weld::Window* pParent, const SfxItemSet&);
241     void AddFontTabPage();
242 };
243 
244 // class CustomPropertiesRemoveButton ------------------------------------
245 struct CustomPropertyLine;
246 
247 class CustomPropertiesDateField
248 {
249 private:
250     std::unique_ptr<SvtCalendarBox> m_xDateField;
251 public:
252     ::boost::optional<sal_Int16> m_TZ;
253 
254     CustomPropertiesDateField(SvtCalendarBox* pDateField);
set_visible(bool bVisible)255     void set_visible(bool bVisible) { m_xDateField->set_visible(bVisible); }
get_date() const256     Date get_date() const { return m_xDateField->get_date(); }
set_date(const Date & rDate)257     void set_date(const Date& rDate) { m_xDateField->set_date(rDate); }
258     ~CustomPropertiesDateField();
259 };
260 
261 class CustomPropertiesTimeField
262 {
263 public:
264     std::unique_ptr<weld::TimeSpinButton> m_xTimeField;
265     bool m_isUTC;
266 
267     CustomPropertiesTimeField(std::unique_ptr<weld::TimeSpinButton> xTimeField);
set_visible(bool bVisible)268     void set_visible(bool bVisible) { m_xTimeField->set_visible(bVisible); }
get_value() const269     tools::Time get_value() const { return m_xTimeField->get_value(); }
set_value(const tools::Time & rTime)270     void set_value(const tools::Time& rTime) { m_xTimeField->set_value(rTime); }
271     ~CustomPropertiesTimeField();
272 };
273 
274 class CustomPropertiesDurationField
275 {
276     css::util::Duration             m_aDuration;
277     std::unique_ptr<weld::Entry>    m_xEntry;
278     std::unique_ptr<weld::Button>   m_xEditButton;
279 
280     DECL_LINK(ClickHdl, weld::Button&, void);
281 public:
282     CustomPropertiesDurationField(std::unique_ptr<weld::Entry> xEntry,
283                                   std::unique_ptr<weld::Button> xEditButton);
284 
285     void SetDuration( const css::util::Duration& rDuration );
GetDuration() const286     const css::util::Duration& GetDuration() const { return m_aDuration; }
287 
288     void set_visible(bool bVisible);
289 };
290 
291 class CustomPropertiesYesNoButton
292 {
293 private:
294     std::unique_ptr<weld::Widget> m_xTopLevel;
295     std::unique_ptr<weld::RadioButton> m_xYesButton;
296     std::unique_ptr<weld::RadioButton> m_xNoButton;
297 
298 public:
299     CustomPropertiesYesNoButton(std::unique_ptr<weld::Widget>,
300                                 std::unique_ptr<weld::RadioButton> xYesButton,
301                                 std::unique_ptr<weld::RadioButton> xNoButton);
302     ~CustomPropertiesYesNoButton();
303 
CheckYes()304     void     CheckYes() { m_xYesButton->set_active(true); }
CheckNo()305     void     CheckNo() { m_xNoButton->set_active(true); }
IsYesChecked() const306     bool     IsYesChecked() const { return m_xYesButton->get_active(); }
set_visible(bool bVisible)307     void     set_visible(bool bVisible) { m_xTopLevel->set_visible(bVisible); }
308 };
309 
310 class CustomPropertiesWindow;
311 
312 // struct CustomPropertyLine ---------------------------------------------
313 struct CustomPropertyLine
314 {
315     CustomPropertiesWindow* m_pParent;
316 
317     std::unique_ptr<weld::Builder> m_xBuilder;
318     std::unique_ptr<weld::Container> m_xLine;
319     std::unique_ptr<weld::ComboBox> m_xNameBox;
320     std::unique_ptr<weld::ComboBox> m_xTypeBox;
321     std::unique_ptr<weld::Entry> m_xValueEdit;
322     std::unique_ptr<weld::Widget> m_xDateTimeBox;
323     std::unique_ptr<CustomPropertiesDateField> m_xDateField;
324     std::unique_ptr<CustomPropertiesTimeField> m_xTimeField;
325     std::unique_ptr<weld::Widget> m_xDurationBox;
326     std::unique_ptr<CustomPropertiesDurationField> m_xDurationField;
327     std::unique_ptr<CustomPropertiesYesNoButton> m_xYesNoButton;
328     std::unique_ptr<weld::Button> m_xRemoveButton;
329 
330     bool m_bTypeLostFocus;
331 
332     CustomPropertyLine(CustomPropertiesWindow* pParent, weld::Widget* pContainer);
333     DECL_LINK(TypeHdl, weld::ComboBox&, void);
334     DECL_LINK(RemoveHdl, weld::Button&, void);
335     DECL_LINK(EditLoseFocusHdl, weld::Widget&, void);
336     DECL_LINK(BoxLoseFocusHdl, weld::Widget&, void);
337 
338     void DoTypeHdl(const weld::ComboBox& rBox);
339 
340     void Clear();
341     void Hide();
342 };
343 
344 // class CustomPropertiesWindow ------------------------------------------
345 
346 class CustomPropertiesWindow
347 {
348 private:
349     sal_Int32                           m_nHeight;
350     sal_Int32                           m_nLineHeight;
351     sal_Int32                           m_nScrollPos;
352     std::vector<std::unique_ptr<CustomProperty>> m_aCustomProperties;
353     std::vector<std::unique_ptr<CustomPropertyLine>> m_aCustomPropertiesLines;
354     CustomPropertyLine*                 m_pCurrentLine;
355     SvNumberFormatter                   m_aNumberFormatter;
356     Idle                                m_aEditLoseFocusIdle;
357     Idle                                m_aBoxLoseFocusIdle;
358     Link<void*,void>                    m_aRemovedHdl;
359 
360     weld::Container& m_rBody;
361     weld::Label& m_rHeaderAccName;
362     weld::Label& m_rHeaderAccType;
363     weld::Label& m_rHeaderAccValue;
364 
365     DECL_LINK(EditTimeoutHdl, Timer *, void);
366     DECL_LINK(BoxTimeoutHdl, Timer *, void);
367 
368     bool        IsLineValid( CustomPropertyLine* pLine ) const;
369     void        ValidateLine( CustomPropertyLine* pLine, bool bIsFromTypeBox );
370     void        CreateNewLine();
371     void        StoreCustomProperties();
GetCurrentDataModelPosition() const372     sal_uInt32  GetCurrentDataModelPosition() const { return -1 * m_nScrollPos / m_nLineHeight; }
373 
374 public:
375     CustomPropertiesWindow(weld::Container& rParent, weld::Label& rHeaderAccName,
376                            weld::Label& rHeaderAccType, weld::Label& rHeaderAccValue);
377     ~CustomPropertiesWindow();
378 
GetExistingLineCount() const379     sal_uInt16          GetExistingLineCount() const { return m_aCustomPropertiesLines.size(); }
GetTotalLineCount() const380     sal_uInt16          GetTotalLineCount() const { return m_aCustomProperties.size(); }
381     void                SetVisibleLineCount(sal_uInt32 nCount);
GetHeight() const382     sal_Int32           GetHeight() const { return m_nHeight; }
SetHeight(int nHeight)383     void                SetHeight(int nHeight) { m_nHeight = nHeight; }
GetLineHeight() const384     sal_Int32           GetLineHeight() const { return m_nLineHeight; }
SetLineHeight(sal_Int32 nLineHeight)385     void                SetLineHeight(sal_Int32 nLineHeight) { m_nLineHeight = nLineHeight; }
386     void                AddLine( const OUString& sName, css::uno::Any const & rAny );
387     bool                AreAllLinesValid() const;
388     void                ClearAllLines();
389     void                DoScroll( sal_Int32 nNewPos );
390     void                ReloadLinesContent();
391 
392     css::uno::Sequence< css::beans::PropertyValue >
393                         GetCustomProperties();
394     void                SetCustomProperties(std::vector< std::unique_ptr<CustomProperty> >&& rProperties);
SetRemovedHdl(const Link<void *,void> & rLink)395     void                SetRemovedHdl( const Link<void*,void>& rLink ) { m_aRemovedHdl = rLink; }
396 
397     void                BoxLoseFocus(CustomPropertyLine* pLine);
398     void                EditLoseFocus(CustomPropertyLine* pLine);
399     void                Remove(const CustomPropertyLine* pLine);
400 };
401 
402 // class CustomPropertiesControl -----------------------------------------
403 
404 class CustomPropertiesControl
405 {
406 private:
407     sal_Int32               m_nThumbPos;
408 
409     std::unique_ptr<weld::Widget> m_xBox;
410     std::unique_ptr<weld::Container> m_xBody;
411     std::unique_ptr<weld::ScrolledWindow> m_xVertScroll;
412     std::unique_ptr<CustomPropertiesWindow> m_xPropertiesWin;
413     std::unique_ptr<weld::Label> m_xName;
414     std::unique_ptr<weld::Label> m_xType;
415     std::unique_ptr<weld::Label> m_xValue;
416 
417     DECL_LINK( ResizeHdl, const Size&, void );
418     DECL_LINK( ScrollHdl, weld::ScrolledWindow&, void );
419     DECL_LINK( RemovedHdl, void*, void );
420 
421 public:
422     CustomPropertiesControl();
423     ~CustomPropertiesControl();
424 
425     void         AddLine(css::uno::Any const & rAny);
426 
AreAllLinesValid() const427     bool         AreAllLinesValid() const { return m_xPropertiesWin->AreAllLinesValid(); }
ClearAllLines()428     void         ClearAllLines() { m_xPropertiesWin->ClearAllLines(); }
429 
430     css::uno::Sequence<css::beans::PropertyValue>
GetCustomProperties() const431                  GetCustomProperties() const
432                         { return m_xPropertiesWin->GetCustomProperties(); }
433     void         SetCustomProperties(std::vector< std::unique_ptr<CustomProperty> >&& rProperties);
434 
435     void         Init(weld::Builder& rParent);
436 };
437 
438 // class SfxCustomPropertiesPage -----------------------------------------
439 
440 class SfxCustomPropertiesPage final : public SfxTabPage
441 {
442 private:
443     DECL_LINK(AddHdl, weld::Button&, void);
444 
445     std::unique_ptr<CustomPropertiesControl> m_xPropertiesCtrl;
446     std::unique_ptr<weld::Button> m_xAdd;
447 
448     virtual bool        FillItemSet( SfxItemSet* ) override;
449     virtual void        Reset( const SfxItemSet* ) override;
450     virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override;
451 
452 public:
453     SfxCustomPropertiesPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet&);
454     static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
455     virtual ~SfxCustomPropertiesPage() override;
456 };
457 
458 struct CmisValue
459 {
460     std::unique_ptr<weld::Builder> m_xBuilder;
461     std::unique_ptr<weld::Frame>  m_xFrame;
462     std::unique_ptr<weld::Entry> m_xValueEdit;
463 
464     CmisValue(weld::Widget* pParent, const OUString& rStr);
465 };
466 
467 struct CmisDateTime
468 {
469     std::unique_ptr<weld::Builder> m_xBuilder;
470     std::unique_ptr<weld::Frame>  m_xFrame;
471     std::unique_ptr<SvtCalendarBox>  m_xDateField;
472     std::unique_ptr<weld::TimeSpinButton> m_xTimeField;
473 
474     CmisDateTime(weld::Widget* pParent, const css::util::DateTime& rDateTime);
475 };
476 
477 struct CmisYesNo
478 {
479     std::unique_ptr<weld::Builder> m_xBuilder;
480     std::unique_ptr<weld::Frame>  m_xFrame;
481     std::unique_ptr<weld::RadioButton> m_xYesButton;
482     std::unique_ptr<weld::RadioButton> m_xNoButton;
483 
484     CmisYesNo(weld::Widget* pParent, bool bValue);
485 };
486 
487 // struct CmisPropertyLine ---------------------------------------------
488 
489 struct CmisPropertyLine
490 {
491     std::unique_ptr<weld::Builder> m_xBuilder;
492     OUString                      m_sId;
493     OUString                      m_sType;
494     bool                          m_bUpdatable;
495     bool                          m_bRequired;
496     bool                          m_bMultiValued;
497     bool                          m_bOpenChoice;
498     std::unique_ptr<weld::Frame>  m_xFrame;
499     std::unique_ptr<weld::Label>  m_xName;
500     std::unique_ptr<weld::Label>  m_xType;
501     std::vector< std::unique_ptr<CmisValue> >     m_aValues;
502     std::vector< std::unique_ptr<CmisDateTime> >  m_aDateTimes;
503     std::vector< std::unique_ptr<CmisYesNo> >     m_aYesNos;
504     CmisPropertyLine(weld::Widget* pParent);
505     ~CmisPropertyLine();
506 };
507 
508 // class CmisPropertiesWindow ------------------------------------------
509 
510 class CmisPropertiesWindow
511 {
512 private:
513     std::unique_ptr<weld::Container>    m_xBox;
514     SvNumberFormatter                   m_aNumberFormatter;
515     std::vector< std::unique_ptr<CmisPropertyLine> > m_aCmisPropertiesLines;
516 public:
517     CmisPropertiesWindow(std::unique_ptr<weld::Container> xParent);
518     ~CmisPropertiesWindow();
519 
520     void AddLine( const OUString& sId, const OUString& sName,
521                   const OUString& sType, const bool bUpdatable,
522                   const bool bRequired, const bool bMultiValued,
523                   const bool bOpenChoice,
524                   css::uno::Any& aChoices,
525                   css::uno::Any const & rAny );
526     void ClearAllLines();
527 
528     css::uno::Sequence< css::document::CmisProperty >
529                         GetCmisProperties() const;
530 };
531 
532 // class CmisPropertiesControl -----------------------------------------
533 
534 class CmisPropertiesControl
535 {
536 private:
537     CmisPropertiesWindow m_aPropertiesWin;
538     std::unique_ptr<weld::ScrolledWindow> m_xScrolledWindow;
539 
540 public:
541     CmisPropertiesControl(weld::Builder& rBuilder);
542 
543     void AddLine( const OUString& sId, const OUString& sName,
544                   const OUString& sType, const bool bUpdatable,
545                   const bool bRequired, const bool bMultiValude,
546                   const bool bOpenChoice,
547                   css::uno::Any& aChoices,
548                   css::uno::Any const & rAny );
549 
550     void ClearAllLines();
551     css::uno::Sequence< css::document::CmisProperty >
GetCmisProperties() const552                     GetCmisProperties() const
553                         { return m_aPropertiesWin.GetCmisProperties(); }
554 };
555 
556 // class SfxCmisPropertiesPage -------------------------------------------------
557 
558 class SfxCmisPropertiesPage final : public SfxTabPage
559 {
560 private:
561     std::unique_ptr<CmisPropertiesControl> m_xPropertiesCtrl;
562 
563     virtual bool        FillItemSet( SfxItemSet* ) override;
564     virtual void        Reset( const SfxItemSet* ) override;
565     virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override;
566 
567 public:
568     SfxCmisPropertiesPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet&);
569     virtual ~SfxCmisPropertiesPage() override;
570     static std::unique_ptr<SfxTabPage> Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet*);
571 };
572 
573 #endif // #ifndef _ INCLUDED_SFX2_DINFDLG_HXX
574 
575 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
576