diff options
author | Cao Cuong Ngo <cao.cuong.ngo@gmail.com> | 2013-06-03 15:04:32 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat.ooo@free.fr> | 2013-09-02 13:51:47 +0200 |
commit | ef3007ac2dc30fdcc1c1f2aae48b4306978806fe (patch) | |
tree | eab4fce244f369425ed58289f13d38a7baf38e07 | |
parent | 41d498c8b4c723c7805365abcd09146de88767eb (diff) |
CMIS properties dialog: load CMIS properties into the dialog
Change-Id: I40561de3ce944f017a79995d1ef38584443fbf02
-rw-r--r-- | include/sfx2/dinfdlg.hxx | 189 | ||||
-rw-r--r-- | sfx2/source/dialog/dinfdlg.cxx | 691 | ||||
-rw-r--r-- | sfx2/source/doc/objserv.cxx | 12 | ||||
-rw-r--r-- | sfx2/uiconfig/ui/cmisinfopage.ui | 14 | ||||
-rw-r--r-- | sfx2/uiconfig/ui/documentpropertiesdialog.ui | 8 |
5 files changed, 898 insertions, 16 deletions
diff --git a/include/sfx2/dinfdlg.hxx b/include/sfx2/dinfdlg.hxx index 6b94f638a303..effb45eaca72 100644 --- a/include/sfx2/dinfdlg.hxx +++ b/include/sfx2/dinfdlg.hxx @@ -79,6 +79,7 @@ private: sal_Bool m_bDeleteUserData; sal_Bool m_bUseUserData; std::vector< CustomProperty* > m_aCustomProperties; + std::vector< CustomProperty* > m_aCmisProperties; public: TYPEINFO(); @@ -86,6 +87,8 @@ public: SfxDocumentInfoItem( const OUString &rFileName, const ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentProperties> & i_xDocProps, + const ::com::sun::star::uno::Sequence< + ::com::sun::star::beans::PropertyValue> & i_cmisProps, sal_Bool bUseUserData ); SfxDocumentInfoItem( const SfxDocumentInfoItem& ); virtual ~SfxDocumentInfoItem(); @@ -158,6 +161,11 @@ public: void AddCustomProperty( const OUString& sName, const com::sun::star::uno::Any& rValue ); + std::vector< CustomProperty* > GetCmisProperties() const; + void ClearCmisProperties(); + void AddCmisProperty( const OUString& sName, + const com::sun::star::uno::Any& rValue ); + virtual SfxPoolItem* Clone( SfxItemPool* pPool = NULL ) const; virtual int operator==( const SfxPoolItem& ) const; virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const; @@ -502,12 +510,191 @@ public: static SfxTabPage* Create( Window* pParent, const SfxItemSet& ); }; +struct CmisPropertyLine; + +class CmisPropertiesEdit : public Edit +{ +private: + CmisPropertyLine* m_pLine; + +public: + inline CmisPropertiesEdit( + Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ) : + Edit( pParent, rResId ), m_pLine( pLine ) {} + + inline CmisPropertyLine* GetLine() const { return m_pLine; } +}; + +class CmisPropertiesTypeBox : public ListBox +{ +private: + CmisPropertyLine* m_pLine; + +public: + inline CmisPropertiesTypeBox( + Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ) : + ListBox( pParent, rResId ), m_pLine( pLine ) {} + + inline CmisPropertyLine* GetLine() const { return m_pLine; } +}; + +class CmisPropertiesDateField : public DateField +{ +private: + CmisPropertyLine* m_pLine; + +public: + inline CmisPropertiesDateField( + Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ) : + DateField( pParent, rResId ), m_pLine( pLine ) {} + + inline CmisPropertyLine* GetLine() const { return m_pLine; } +}; +class CmisPropertiesTimeField : public TimeField +{ +private: + CmisPropertyLine* m_pLine; + +public: + inline CmisPropertiesTimeField( + Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ) : + TimeField( pParent, rResId ), m_pLine( pLine ) {} + + inline CmisPropertyLine* GetLine() const { return m_pLine; } +}; + +class CmisPropertiesEditButton : public PushButton +{ + CmisPropertyLine* m_pLine; + +public: + CmisPropertiesEditButton( Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ); + ~CmisPropertiesEditButton(); + + DECL_LINK(ClickHdl, void *); +}; + +class CmisPropertiesYesNoButton : public Control +{ +private: + RadioButton m_aYesButton; + RadioButton m_aNoButton; + +public: + CmisPropertiesYesNoButton( Window* pParent, const ResId& rResId ); + + virtual void Resize(); + + inline void CheckYes() { m_aYesButton.Check(); } + inline void CheckNo() { m_aNoButton.Check(); } + inline bool IsYesChecked() const { return m_aYesButton.IsChecked() != sal_False; } +}; + +// struct CmisPropertyLine --------------------------------------------- + +struct CmisPropertyLine +{ + ComboBox m_aNameBox; + CmisPropertiesTypeBox m_aTypeBox; + CmisPropertiesEdit m_aValueEdit; + CmisPropertiesDateField m_aDateField; + CmisPropertiesTimeField m_aTimeField; + CmisPropertiesEditButton m_aEditButton; + CmisPropertiesYesNoButton m_aYesNoButton; + + Point m_aDatePos; + Point m_aTimePos; + Size m_aDateTimeSize; + bool m_bTypeLostFocus; + + CmisPropertyLine( Window* pParent ); + + void SetRemoved(); +}; + +// class CmisPropertiesWindow ------------------------------------------ + +class CmisPropertiesWindow : public Window +{ +private: + ComboBox m_aNameBox; + ListBox m_aTypeBox; + Edit m_aValueEdit; + DateField m_aDateField; + TimeField m_aTimeField; + PushButton m_aEditButton; + CmisPropertiesYesNoButton m_aYesNoButton; + + sal_Int32 m_nLineHeight; + sal_Int32 m_nScrollPos; + SvtSysLocale m_aSysLocale; + std::vector< CmisPropertyLine* > m_aCmisPropertiesLines; + CmisPropertyLine* m_pCurrentLine; + SvNumberFormatter m_aNumberFormatter; + Timer m_aEditLoseFocusTimer; + Timer m_aBoxLoseFocusTimer; + + DECL_LINK( TypeHdl, CmisPropertiesTypeBox* ); + DECL_LINK( EditLoseFocusHdl, CmisPropertiesEdit* ); + DECL_LINK( BoxLoseFocusHdl, CmisPropertiesTypeBox* ); + + bool IsLineValid( CmisPropertyLine* pLine ) const; + void ValidateLine( CmisPropertyLine* pLine, bool bIsFromTypeBox ); + +public: + CmisPropertiesWindow(Window* pParent, + const OUString &rHeaderAccName, + const OUString &rHeaderAccType, + const OUString &rHeaderAccValue); + ~CmisPropertiesWindow(); + + void InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ); + sal_uInt16 GetVisibleLineCount() const; + inline sal_Int32 GetLineHeight() const { return m_nLineHeight; } + void AddLine( const OUString& sName, com::sun::star::uno::Any& rAny ); + bool AreAllLinesValid() const; + void ClearAllLines(); + void DoScroll( sal_Int32 nNewPos ); + + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > + GetCmisProperties() const; + void updateLineWidth(); +}; + +// class CmisPropertiesControl ----------------------------------------- + +class CmisPropertiesControl : public VclVBox +{ +private: + HeaderBar* m_pHeaderBar; + VclHBox* m_pBody; + CmisPropertiesWindow* m_pPropertiesWin; + ScrollBar* m_pVertScroll; + sal_Int32 m_nThumbPos; + + DECL_LINK( ScrollHdl, ScrollBar* ); + +public: + CmisPropertiesControl(Window* pParent); + ~CmisPropertiesControl(); + + void AddLine( const OUString& sName, com::sun::star::uno::Any& rAny, bool bInteractive ); + + inline bool AreAllLinesValid() const { return m_pPropertiesWin->AreAllLinesValid(); } + inline void ClearAllLines() { m_pPropertiesWin->ClearAllLines(); } + inline ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > + GetCmisProperties() const + { return m_pPropertiesWin->GetCmisProperties(); } + void Init(VclBuilderContainer& rParent); + virtual void setAllocation(const Size &rAllocation); +}; + // class SfxCmisPropertiesPage ------------------------------------------------- class SfxCmisPropertiesPage : public SfxTabPage { private: - + CmisPropertiesControl* m_pPropertiesCtrl; using TabPage::DeactivatePage; protected: diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx index 9a4970709a66..04de2b19875a 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -222,6 +222,7 @@ SfxDocumentInfoItem::SfxDocumentInfoItem() SfxDocumentInfoItem::SfxDocumentInfoItem( const OUString& rFile, const uno::Reference<document::XDocumentProperties>& i_xDocProps, + const uno::Sequence<beans::PropertyValue>& i_cmisProps, sal_Bool bIs ) : SfxStringItem( SID_DOCINFO, rFile ) , m_AutoloadDelay( i_xDocProps->getAutoloadSecs() ) @@ -270,6 +271,12 @@ SfxDocumentInfoItem::SfxDocumentInfoItem( const OUString& rFile, m_aCustomProperties.push_back( pProp ); } } + + for ( sal_Int32 i = 0; i < i_cmisProps.getLength(); ++i ) + { + CustomProperty* pProp = new CustomProperty( i_cmisProps[i].Name, i_cmisProps[i].Value ); + m_aCmisProperties.push_back( pProp ); + } } catch ( Exception& ) {} } @@ -305,12 +312,19 @@ SfxDocumentInfoItem::SfxDocumentInfoItem( const SfxDocumentInfoItem& rItem ) rItem.m_aCustomProperties[i]->m_aValue ); m_aCustomProperties.push_back( pProp ); } + for ( sal_uInt32 i = 0; i < rItem.m_aCmisProperties.size(); i++ ) + { + CustomProperty* pProp = new CustomProperty( rItem.m_aCmisProperties[i]->m_sName, + rItem.m_aCmisProperties[i]->m_aValue ); + m_aCmisProperties.push_back( pProp ); + } } //------------------------------------------------------------------------ SfxDocumentInfoItem::~SfxDocumentInfoItem() { ClearCustomProperties(); + ClearCmisProperties(); } //------------------------------------------------------------------------ @@ -346,6 +360,10 @@ int SfxDocumentInfoItem::operator==( const SfxPoolItem& rItem) const m_aCustomProperties.size() == rInfoItem.m_aCustomProperties.size() && std::equal(m_aCustomProperties.begin(), m_aCustomProperties.end(), rInfoItem.m_aCustomProperties.begin()); + + m_aCmisProperties.size() == rInfoItem.m_aCmisProperties.size() && + std::equal(m_aCmisProperties.begin(), m_aCmisProperties.end(), + rInfoItem.m_aCmisProperties.begin()); } //------------------------------------------------------------------------ @@ -483,6 +501,33 @@ void SfxDocumentInfoItem::AddCustomProperty( const OUString& sName, const Any& r m_aCustomProperties.push_back( pProp ); } + +std::vector< CustomProperty* > SfxDocumentInfoItem::GetCmisProperties() const +{ + std::vector< CustomProperty* > aRet; + for ( sal_uInt32 i = 0; i < m_aCmisProperties.size(); i++ ) + { + CustomProperty* pProp = new CustomProperty( m_aCmisProperties[i]->m_sName, + m_aCmisProperties[i]->m_aValue ); + aRet.push_back( pProp ); + } + + return aRet; +} + +void SfxDocumentInfoItem::ClearCmisProperties() +{ + for ( sal_uInt32 i = 0; i < m_aCmisProperties.size(); i++ ) + delete m_aCmisProperties[i]; + m_aCmisProperties.clear(); +} + +void SfxDocumentInfoItem::AddCmisProperty( const OUString& sName, const Any& rValue ) +{ + CustomProperty* pProp = new CustomProperty( sName, rValue ); + m_aCmisProperties.push_back( pProp ); +} + bool SfxDocumentInfoItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const { OUString aValue; @@ -1149,8 +1194,8 @@ SfxDocumentInfoDialog::SfxDocumentInfoDialog( Window* pParent, m_nDocInfoId = AddTabPage("general", SfxDocumentPage::Create, 0); AddTabPage("description", SfxDocumentDescPage::Create, 0); AddTabPage("customprops", SfxCustomPropertiesPage::Create, 0); - AddTabPage("security", SfxSecurityPage::Create, 0); AddTabPage("cmisprops", SfxCmisPropertiesPage::Create, 0); + AddTabPage("security", SfxSecurityPage::Create, 0); } // ----------------------------------------------------------------------- @@ -2118,27 +2163,661 @@ SfxTabPage* SfxCustomPropertiesPage::Create( Window* pParent, const SfxItemSet& return new SfxCustomPropertiesPage( pParent, rItemSet ); } + +// class CmisPropertiesYesNoButton ------------------------------------- + +CmisPropertiesYesNoButton::CmisPropertiesYesNoButton( Window* pParent, const ResId& rResId ) : + Control( pParent, rResId ), + m_aYesButton( this, ResId( RB_PROPERTY_YES, *rResId.GetResMgr() ) ), + m_aNoButton ( this, ResId( RB_PROPERTY_NO, *rResId.GetResMgr() ) ) +{ + FreeResource(); + Wallpaper aWall( Color( COL_TRANSPARENT ) ); + SetBackground( aWall ); + SetBorderStyle( WINDOW_BORDER_MONO ); + CheckNo(); + m_aYesButton.SetBackground( aWall ); + m_aNoButton.SetBackground( aWall ); +} + +CmisPropertiesEditButton::CmisPropertiesEditButton( Window* pParent, const ResId& rResId, CmisPropertyLine* pLine ) : + PushButton( pParent, rResId ), m_pLine( pLine ) +{ + SetClickHdl( LINK( this, CmisPropertiesEditButton, ClickHdl )); +} + +CmisPropertiesEditButton::~CmisPropertiesEditButton() +{ +} + +IMPL_LINK_NOARG(CmisPropertiesEditButton, ClickHdl) +{ + return 1; +} +//-------------------------------------------------------------------------- +void CmisPropertiesYesNoButton::Resize() +{ + const long nWidth = GetSizePixel().Width(); + const long n3Width = LogicToPixel( Size( 3, 3 ), MAP_APPFONT ).Width(); + const long nNewWidth = ( nWidth / 2 ) - n3Width - 2; + Size aSize = m_aYesButton.GetSizePixel(); + const long nDelta = aSize.Width() - nNewWidth; + aSize.Width() = nNewWidth; + m_aYesButton.SetSizePixel( aSize ); + Point aPos = m_aNoButton.GetPosPixel(); + aPos.X() -= nDelta; + m_aNoButton.SetPosSizePixel( aPos, aSize ); +} + +// struct CmisPropertyLine --------------------------------------------- +CmisPropertyLine::CmisPropertyLine( Window* pParent ) : + m_aNameBox ( pParent, SfxResId( SFX_CB_PROPERTY_NAME ) ), + m_aTypeBox ( pParent, SfxResId( SFX_LB_PROPERTY_TYPE ), this ), + m_aValueEdit ( pParent, SfxResId( SFX_ED_PROPERTY_VALUE ), this ), + m_aDateField ( pParent, SfxResId( SFX_FLD_DATE), this), + m_aTimeField ( pParent, SfxResId( SFX_FLD_TIME), this), + m_aEditButton( pParent, SfxResId( SFX_PB_EDIT ), this), + m_aYesNoButton ( pParent, SfxResId( SFX_WIN_PROPERTY_YESNO ) ), + m_bTypeLostFocus( false ) + +{ + m_aTimeField.SetExtFormat( EXTTIMEF_24H_LONG ); + m_aDateField.SetExtDateFormat( XTDATEF_SYSTEM_SHORT_YYYY ); +} + +// class CmisPropertiesWindow ----------------------------------------- + +CmisPropertiesWindow::CmisPropertiesWindow(Window* pParent, + const OUString &rHeaderAccName, + const OUString &rHeaderAccType, + const OUString &rHeaderAccValue) : + Window(pParent), + m_aNameBox ( this, SfxResId( SFX_CB_PROPERTY_NAME ) ), + m_aTypeBox ( this, SfxResId( SFX_LB_PROPERTY_TYPE ) ), + m_aValueEdit ( this, SfxResId( SFX_ED_PROPERTY_VALUE ) ), + m_aDateField ( this, SfxResId( SFX_FLD_DATE) ), + m_aTimeField ( this, SfxResId( SFX_FLD_TIME) ), + m_aEditButton( this, SfxResId( SFX_PB_EDIT )), + m_aYesNoButton ( this, SfxResId( SFX_WIN_PROPERTY_YESNO ) ), + m_nScrollPos (0), + m_aNumberFormatter( ::comphelper::getProcessComponentContext(), + Application::GetSettings().GetLanguageTag().getLanguageType() ) + +{ + m_aNameBox.SetAccessibleName(rHeaderAccName); + m_aTypeBox.SetAccessibleName(rHeaderAccType); + m_aValueEdit.SetAccessibleName(rHeaderAccValue); +} + +CmisPropertiesWindow::~CmisPropertiesWindow() +{ + m_aEditLoseFocusTimer.Stop(); + m_aBoxLoseFocusTimer.Stop(); + ClearAllLines(); +} + +IMPL_LINK( CmisPropertiesWindow, TypeHdl, CmisPropertiesTypeBox*, pBox ) +{ + sal_Int64 nType = sal_Int64( (long)pBox->GetEntryData( pBox->GetSelectEntryPos() ) ); + CmisPropertyLine* pLine = pBox->GetLine(); + pLine->m_aValueEdit.Show( (CUSTOM_TYPE_TEXT == nType) || (CUSTOM_TYPE_NUMBER == nType) ); + pLine->m_aDateField.Show( (CUSTOM_TYPE_DATE == nType) || (CUSTOM_TYPE_DATETIME == nType) ); + pLine->m_aTimeField.Show( CUSTOM_TYPE_DATETIME == nType ); + pLine->m_aYesNoButton.Show( CUSTOM_TYPE_BOOLEAN == nType ); + + if ( nType == CUSTOM_TYPE_DATE ) + pLine->m_aDateField.SetPosSizePixel(pLine->m_aValueEdit.GetPosPixel(), pLine->m_aValueEdit.GetSizePixel()); + else if ( nType == CUSTOM_TYPE_DATETIME) + { + pLine->m_aDateField.SetPosSizePixel( pLine->m_aDatePos, pLine->m_aDateTimeSize ); + pLine->m_aTimeField.SetPosSizePixel(pLine->m_aTimePos, pLine->m_aDateTimeSize ); + } + + return 0; +} + +IMPL_LINK( CmisPropertiesWindow, EditLoseFocusHdl, CmisPropertiesEdit*, pEdit ) +{ + if ( pEdit ) + { + CmisPropertyLine* pLine = pEdit->GetLine(); + if ( !pLine->m_bTypeLostFocus ) + { + m_pCurrentLine = pLine; + m_aEditLoseFocusTimer.Start(); + } + else + pLine->m_bTypeLostFocus = false; + } + return 0; +} + +IMPL_LINK( CmisPropertiesWindow, BoxLoseFocusHdl, CmisPropertiesTypeBox*, pBox ) +{ + if ( pBox ) + { + m_pCurrentLine = pBox->GetLine(); + m_aBoxLoseFocusTimer.Start(); + } + + return 0; +} + +bool CmisPropertiesWindow::IsLineValid( CmisPropertyLine* pLine ) const +{ + bool bIsValid = true; + pLine->m_bTypeLostFocus = false; + sal_Int64 nType = sal_Int64( + (long)pLine->m_aTypeBox.GetEntryData( pLine->m_aTypeBox.GetSelectEntryPos() ) ); + String sValue = pLine->m_aValueEdit.GetText(); + if ( sValue.Len() == 0 ) + return true; + + sal_uInt32 nIndex = 0xFFFFFFFF; + if ( CUSTOM_TYPE_NUMBER == nType ) + nIndex = const_cast< SvNumberFormatter& >( + m_aNumberFormatter ).GetFormatIndex( NF_NUMBER_SYSTEM ); + else if ( CUSTOM_TYPE_DATE == nType ) + nIndex = const_cast< SvNumberFormatter& >( + m_aNumberFormatter).GetFormatIndex( NF_DATE_SYS_DDMMYYYY ); + + if ( nIndex != 0xFFFFFFFF ) + { + sal_uInt32 nTemp = nIndex; + double fDummy = 0.0; + bIsValid = const_cast< SvNumberFormatter& >( + m_aNumberFormatter ).IsNumberFormat( sValue, nIndex, fDummy ) != sal_False; + if ( bIsValid && nTemp != nIndex ) + // sValue is a number but the format doesn't match the index + bIsValid = false; + } + + return bIsValid; +} + +void CmisPropertiesWindow::ValidateLine( CmisPropertyLine* pLine, bool bIsFromTypeBox ) +{ + if ( !IsLineValid( pLine ) ) + { + if ( bIsFromTypeBox ) + pLine->m_bTypeLostFocus = true; + Window* pParent = GetParent()->GetParent(); + if ( QueryBox( pParent, SfxResId( SFX_QB_WRONG_TYPE ) ).Execute() == RET_OK ) + pLine->m_aTypeBox.SelectEntryPos( m_aTypeBox.GetEntryPos( (void*)CUSTOM_TYPE_TEXT ) ); + else + pLine->m_aValueEdit.GrabFocus(); + } +} + +void CmisPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ) +{ + DBG_ASSERT( pHeaderBar, "CmisPropertiesWindow::InitControls(): invalid headerbar" ); + DBG_ASSERT( pScrollBar, "CmisPropertiesWindow::InitControls(): invalid scrollbar" ); + + m_aNameBox.Hide(); + m_aTypeBox.Hide(); + m_aValueEdit.Hide(); + m_aDateField.Hide(); + m_aTimeField.Hide(); + m_aEditButton.Hide(); + m_aYesNoButton.Hide(); + + m_nLineHeight = m_aTypeBox.GetSizePixel().Height(); + + const long nOffset = 4; + const long nScrollBarWidth = pScrollBar->GetSizePixel().Width(); + const long nButtonWidth = nScrollBarWidth + nOffset; + long nTypeWidth = m_aTypeBox.CalcMinimumSize().Width() + ( 2 * nOffset ); + long nFullWidth = pHeaderBar->GetSizePixel().Width(); + long nItemWidth = ( nFullWidth - nTypeWidth - nButtonWidth ) / 2; + pHeaderBar->SetItemSize( HI_NAME, nItemWidth ); + pHeaderBar->SetItemSize( HI_TYPE, nTypeWidth ); + pHeaderBar->SetItemSize( HI_VALUE, nItemWidth ); + pHeaderBar->SetItemSize( HI_ACTION, nButtonWidth ); + + Window* pWindows[] = { &m_aNameBox, &m_aTypeBox, &m_aValueEdit, NULL }; + Window** pCurrent = pWindows; + sal_uInt16 nPos = 0; + while ( *pCurrent ) + { + Rectangle aRect = pHeaderBar->GetItemRect( pHeaderBar->GetItemId( nPos++ ) ); + Size aSize = (*pCurrent)->GetSizePixel(); + Point aPos = (*pCurrent)->GetPosPixel(); + long nWidth = aRect.GetWidth() - nOffset; + + aSize.Width() = nWidth; + aPos.X() = aRect.getX() + ( nOffset / 2 ); + (*pCurrent)->SetPosSizePixel( aPos, aSize ); + + if ( *pCurrent == &m_aValueEdit ) + { + aSize = m_aYesNoButton.GetSizePixel(); + aPos = m_aYesNoButton.GetPosPixel(); + aSize.Width() = nWidth; + aPos.X() = aRect.getX() + ( nOffset / 2 ); + m_aYesNoButton.SetPosSizePixel( aPos, aSize ); + aSize.Width() /= 2; + aSize.Width() -= 2; + m_aDateField.SetPosSizePixel( aPos, aSize ); + aPos.X() += aSize.Width() + 4; + m_aTimeField.SetPosSizePixel( aPos, aSize ); + } + + pCurrent++; + } + +} + +sal_uInt16 CmisPropertiesWindow::GetVisibleLineCount() const +{ + sal_uInt16 nCount = 0; + std::vector< CmisPropertyLine* >::const_iterator pIter; + for ( pIter = m_aCmisPropertiesLines.begin(); + pIter != m_aCmisPropertiesLines.end(); ++pIter ) + nCount++; + return nCount; +} + +void CmisPropertiesWindow::updateLineWidth() +{ + Window* pWindows[] = { &m_aNameBox, &m_aTypeBox, &m_aValueEdit, + &m_aDateField, &m_aTimeField, + &m_aEditButton, &m_aYesNoButton, NULL }; + + for (std::vector< CmisPropertyLine* >::iterator aI = + m_aCmisPropertiesLines.begin(), aEnd = m_aCmisPropertiesLines.end(); + aI != aEnd; ++aI) + { + CmisPropertyLine* pNewLine = *aI; + + Window* pNewWindows[] = + { &pNewLine->m_aNameBox, &pNewLine->m_aTypeBox, &pNewLine->m_aValueEdit, + &pNewLine->m_aDateField, &pNewLine->m_aTimeField, &pNewLine->m_aEditButton, + &pNewLine->m_aYesNoButton, NULL }; + + Window** pCurrent = pWindows; + Window** pNewCurrent = pNewWindows; + while ( *pCurrent ) + { + Size aSize = (*pCurrent)->GetSizePixel(); + Point aPos = (*pCurrent)->GetPosPixel(); + aPos.Y() = (*pNewCurrent)->GetPosPixel().Y(); + (*pNewCurrent)->SetPosSizePixel( aPos, aSize ); + pCurrent++; + pNewCurrent++; + } + } +} + +void CmisPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) +{ + CmisPropertyLine* pNewLine = new CmisPropertyLine( this ); + pNewLine->m_aTypeBox.SetSelectHdl( LINK( this, CmisPropertiesWindow, TypeHdl ) ); + pNewLine->m_aValueEdit.SetLoseFocusHdl( LINK( this, CmisPropertiesWindow, EditLoseFocusHdl ) ); + + pNewLine->m_aTypeBox.SetLoseFocusHdl( LINK( this, CmisPropertiesWindow, BoxLoseFocusHdl ) ); + + pNewLine->m_aNameBox.SetAccessibleName(m_aNameBox.GetAccessibleName()); + pNewLine->m_aTypeBox.SetAccessibleName(m_aTypeBox.GetAccessibleName()); + pNewLine->m_aValueEdit.SetAccessibleName(m_aValueEdit.GetAccessibleName()); + + m_nLineHeight = m_aTypeBox.GetSizePixel().Height(); + + long nPos = GetVisibleLineCount() * GetLineHeight(); + m_aCmisPropertiesLines.push_back( pNewLine ); + Window* pWindows[] = { &m_aNameBox, &m_aTypeBox, &m_aValueEdit, + &m_aDateField, &m_aTimeField, &m_aEditButton, + &m_aYesNoButton, NULL }; + Window* pNewWindows[] = + { &pNewLine->m_aNameBox, &pNewLine->m_aTypeBox, &pNewLine->m_aValueEdit, + &pNewLine->m_aDateField, &pNewLine->m_aTimeField, &pNewLine->m_aEditButton, + &pNewLine->m_aYesNoButton, NULL }; + Window** pCurrent = pWindows; + Window** pNewCurrent = pNewWindows; + while ( *pCurrent ) + { + Size aSize = (*pCurrent)->GetSizePixel(); + Point aPos = (*pCurrent)->GetPosPixel(); + aPos.Y() += nPos; + aPos.Y() += m_nScrollPos; + (*pNewCurrent)->SetPosSizePixel( aPos, aSize ); + (*pNewCurrent)->Show(); + pCurrent++; + pNewCurrent++; + } + + pNewLine->m_aDatePos = pNewLine->m_aDateField.GetPosPixel(); + pNewLine->m_aTimePos = pNewLine->m_aTimeField.GetPosPixel(); + pNewLine->m_aDateTimeSize = pNewLine->m_aDateField.GetSizePixel(); + + double nTmpValue = 0; + bool bTmpValue = false; + OUString sTmpValue; + util::DateTime aTmpDateTime; + util::Date aTmpDate; + SvtSysLocale aSysLocale; + const LocaleDataWrapper& rLocaleWrapper = aSysLocale.GetLocaleData(); + pNewLine->m_aNameBox.SetText( sName ); + sal_IntPtr nType = CUSTOM_TYPE_UNKNOWN; + String sValue; + + if ( rAny >>= nTmpValue ) + { + sal_uInt32 nIndex = m_aNumberFormatter.GetFormatIndex( NF_NUMBER_SYSTEM ); + m_aNumberFormatter.GetInputLineString( nTmpValue, nIndex, sValue ); + pNewLine->m_aValueEdit.SetText( sValue ); + nType = CUSTOM_TYPE_NUMBER; + } + else if ( rAny >>= bTmpValue ) + { + sValue = ( bTmpValue ? rLocaleWrapper.getTrueWord() : rLocaleWrapper.getFalseWord() ); + nType = CUSTOM_TYPE_BOOLEAN; + } + else if ( rAny >>= sTmpValue ) + { + pNewLine->m_aValueEdit.SetText( sTmpValue ); + nType = CUSTOM_TYPE_TEXT; + } + else if ( rAny >>= aTmpDate ) + { + nType = CUSTOM_TYPE_DATE; + pNewLine->m_aDateField.SetDate( Date( aTmpDate.Day, aTmpDate.Month, aTmpDate.Year ) ); + + } + else if ( rAny >>= aTmpDateTime ) + { + pNewLine->m_aDateField.SetDate( Date( aTmpDateTime.Day, aTmpDateTime.Month, aTmpDateTime.Year ) ); + pNewLine->m_aTimeField.SetTime( Time( aTmpDateTime.Hours, aTmpDateTime.Minutes, aTmpDateTime.Seconds, aTmpDateTime.NanoSeconds ) ); + + nType = CUSTOM_TYPE_DATETIME; + } + + if ( nType != CUSTOM_TYPE_UNKNOWN ) + { + if ( CUSTOM_TYPE_BOOLEAN == nType ) + { + if ( bTmpValue ) + pNewLine->m_aYesNoButton.CheckYes(); + else + pNewLine->m_aYesNoButton.CheckNo(); + } + pNewLine->m_aTypeBox.SelectEntryPos( m_aTypeBox.GetEntryPos( (void*)nType ) ); + } + + TypeHdl( &pNewLine->m_aTypeBox ); + pNewLine->m_aNameBox.GrabFocus(); +} + +bool CmisPropertiesWindow::AreAllLinesValid() const +{ + bool bRet = true; + std::vector< CmisPropertyLine* >::const_iterator pIter; + for ( pIter = m_aCmisPropertiesLines.begin(); + pIter != m_aCmisPropertiesLines.end(); ++pIter ) + { + CmisPropertyLine* pLine = *pIter; + if ( !IsLineValid( pLine ) ) + { + bRet = false; + break; + } + } + + return bRet; +} + +void CmisPropertiesWindow::ClearAllLines() +{ + std::vector< CmisPropertyLine* >::iterator pIter; + for ( pIter = m_aCmisPropertiesLines.begin(); + pIter != m_aCmisPropertiesLines.end(); ++pIter ) + { + CmisPropertyLine* pLine = *pIter; + delete pLine; + } + m_aCmisPropertiesLines.clear(); + m_nScrollPos = 0; +} + +void CmisPropertiesWindow::DoScroll( sal_Int32 nNewPos ) +{ + m_nScrollPos += nNewPos; + std::vector< CmisPropertyLine* >::iterator pIter; + for ( pIter = m_aCmisPropertiesLines.begin(); + pIter != m_aCmisPropertiesLines.end(); ++pIter ) + { + CmisPropertyLine* pLine = *pIter; + + Window* pWindows[] = { &pLine->m_aNameBox, &pLine->m_aTypeBox, &pLine->m_aValueEdit, &pLine->m_aDateField, + &pLine->m_aTimeField, &pLine->m_aEditButton, &pLine->m_aYesNoButton, NULL }; + Window** pCurrent = pWindows; + while ( *pCurrent ) + { + Point aPos = (*pCurrent)->GetPosPixel(); + aPos.Y() += nNewPos; + (*pCurrent)->SetPosPixel( aPos ); + pCurrent++; + } + } +} + +Sequence< beans::PropertyValue > CmisPropertiesWindow::GetCmisProperties() const +{ + Sequence< beans::PropertyValue > aPropertiesSeq( m_aCmisPropertiesLines.size() ); + sal_Int32 i = 0; + std::vector< CmisPropertyLine* >::const_iterator pIter; + for ( pIter = m_aCmisPropertiesLines.begin(); + pIter != m_aCmisPropertiesLines.end(); ++pIter, ++i ) + { + CmisPropertyLine* pLine = *pIter; + + String sPropertyName = pLine->m_aNameBox.GetText(); + if ( sPropertyName.Len() > 0 ) + { + aPropertiesSeq[i].Name = sPropertyName; + sal_Int64 nType = sal_Int64( + (long)pLine->m_aTypeBox.GetEntryData( pLine->m_aTypeBox.GetSelectEntryPos() ) ); + if ( CUSTOM_TYPE_NUMBER == nType ) + { + double nValue = 0; + sal_uInt32 nIndex = const_cast< SvNumberFormatter& >( + m_aNumberFormatter ).GetFormatIndex( NF_NUMBER_SYSTEM ); + sal_Bool bIsNum = const_cast< SvNumberFormatter& >( m_aNumberFormatter ). + IsNumberFormat( pLine->m_aValueEdit.GetText(), nIndex, nValue ); + if ( bIsNum ) + aPropertiesSeq[i].Value <<= makeAny( nValue ); + } + else if ( CUSTOM_TYPE_BOOLEAN == nType ) + { + bool bValue = pLine->m_aYesNoButton.IsYesChecked(); + aPropertiesSeq[i].Value <<= makeAny( bValue ); + } + else if ( CUSTOM_TYPE_DATETIME == nType ) + { + Date aTmpDate = pLine->m_aDateField.GetDate(); + Time aTmpTime = pLine->m_aTimeField.GetTime(); + util::DateTime aDateTime(aTmpTime.GetNanoSec(), aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), + aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear() ); + aPropertiesSeq[i].Value <<= aDateTime; + } + else if ( CUSTOM_TYPE_DATE == nType ) + { + Date aTmpDate = pLine->m_aDateField.GetDate(); + util::Date aDate(aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear()); + aPropertiesSeq[i].Value <<= aDate; + + } + else + { + OUString sValue( pLine->m_aValueEdit.GetText() ); + aPropertiesSeq[i].Value <<= makeAny( sValue ); + } + } + } + + return aPropertiesSeq; +} + +CmisPropertiesControl::CmisPropertiesControl(Window* pParent) + : VclVBox(pParent) + , m_nThumbPos(0) +{ +} + +void CmisPropertiesControl::Init(VclBuilderContainer& rBuilder) +{ + m_pHeaderBar = new HeaderBar(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER); + m_pBody = new VclHBox(this); + OUString sName = rBuilder.get<FixedText>("name")->GetText(); + OUString sType = rBuilder.get<FixedText>("type")->GetText(); + OUString sValue = rBuilder.get<FixedText>("value")->GetText(); + m_pPropertiesWin = new CmisPropertiesWindow(m_pBody, sName, sType, sValue); + m_pVertScroll = new ScrollBar(m_pBody, WB_VERT); + + set_hexpand(true); + set_vexpand(true); + set_expand(true); + set_fill(true); + + m_pBody->set_hexpand(true); + m_pBody->set_vexpand(true); + m_pBody->set_expand(true); + m_pBody->set_fill(true); + m_pBody->Show(); + + m_pPropertiesWin->set_hexpand(true); + m_pPropertiesWin->set_vexpand(true); + m_pPropertiesWin->set_expand(true); + m_pPropertiesWin->set_fill(true); + m_pPropertiesWin->Show(); + + m_pPropertiesWin->SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFieldColor() ) ); + m_pVertScroll->EnableDrag(); + m_pVertScroll->Show(); + + m_pHeaderBar->set_height_request(GetTextHeight() + 6); + + const HeaderBarItemBits nHeadBits = HIB_VCENTER | HIB_FIXED | HIB_FIXEDPOS | HIB_LEFT; + + m_pHeaderBar->InsertItem( HI_NAME, sName, 0, nHeadBits ); + m_pHeaderBar->InsertItem( HI_TYPE, sType, 0, nHeadBits ); + m_pHeaderBar->InsertItem( HI_VALUE, sValue, 0, nHeadBits ); + m_pHeaderBar->InsertItem( HI_ACTION, OUString(), 0, nHeadBits ); + m_pHeaderBar->Show(); + + m_pVertScroll->SetRangeMin( 0 ); + m_pVertScroll->SetRangeMax( 0 ); + m_pVertScroll->SetVisibleSize( 0xFFFF ); + + Link aScrollLink = LINK( this, CmisPropertiesControl, ScrollHdl ); + m_pVertScroll->SetScrollHdl( aScrollLink ); +} + +void CmisPropertiesControl::setAllocation(const Size &rAllocation) +{ + VclVBox::setAllocation(rAllocation); + + m_pPropertiesWin->InitControls( m_pHeaderBar, m_pVertScroll ); + sal_Int32 nScrollOffset = m_pPropertiesWin->GetLineHeight(); + sal_Int32 nVisibleEntries = m_pPropertiesWin->GetSizePixel().Height() / nScrollOffset; + m_pVertScroll->SetPageSize( nVisibleEntries - 1 ); + m_pVertScroll->SetVisibleSize( nVisibleEntries ); + m_pPropertiesWin->updateLineWidth(); +} + +extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCmisPropertiesControl(Window *pParent, + VclBuilder::stringmap &) +{ + return new CmisPropertiesControl(pParent); +} + +CmisPropertiesControl::~CmisPropertiesControl() +{ + delete m_pVertScroll; + delete m_pPropertiesWin; + delete m_pBody; + delete m_pHeaderBar; +} + +IMPL_LINK( CmisPropertiesControl, ScrollHdl, ScrollBar*, pScrollBar ) +{ + sal_Int32 nOffset = m_pPropertiesWin->GetLineHeight(); + nOffset *= ( m_nThumbPos - pScrollBar->GetThumbPos() ); + m_nThumbPos = pScrollBar->GetThumbPos(); + m_pPropertiesWin->DoScroll( nOffset ); + return 0; +} + + +void CmisPropertiesControl::AddLine( const OUString& sName, Any& rAny, bool bInteractive ) +{ + m_pPropertiesWin->AddLine( sName, rAny ); + m_pVertScroll->SetRangeMax( m_pPropertiesWin->GetVisibleLineCount() + 1 ); + if ( bInteractive && m_pPropertiesWin->GetOutputSizePixel().Height() < m_pPropertiesWin->GetVisibleLineCount() * m_pPropertiesWin->GetLineHeight() ) + m_pVertScroll->DoScroll( m_pPropertiesWin->GetVisibleLineCount() + 1 ); +} + // class SfxCmisPropertiesPage ----------------------------------------- SfxCmisPropertiesPage::SfxCmisPropertiesPage( Window* pParent, const SfxItemSet& rItemSet ) : SfxTabPage(pParent, "CmisInfoPage", "sfx/ui/cmisinfopage.ui", rItemSet) { + get(m_pPropertiesCtrl, "cmisproperties"); + m_pPropertiesCtrl->Init(*this); } -sal_Bool SfxCmisPropertiesPage::FillItemSet( SfxItemSet& /*rSet*/ ) +sal_Bool SfxCmisPropertiesPage::FillItemSet( SfxItemSet& rSet ) { - sal_Bool bModified = sal_False; + sal_Bool bModified = sal_True; + const SfxPoolItem* pItem = NULL; + SfxDocumentInfoItem* pInfo = NULL; + bool bMustDelete = false; + + if ( GetTabDialog() && GetTabDialog()->GetExampleSet() ) + { + if ( SFX_ITEM_SET != + GetTabDialog()->GetExampleSet()->GetItemState( SID_DOCINFO, sal_True, &pItem ) ) + pInfo = &( SfxDocumentInfoItem& )rSet.Get( SID_DOCINFO ); + else + { + bMustDelete = true; + pInfo = new SfxDocumentInfoItem( *( const SfxDocumentInfoItem* ) pItem ); + } + } + + if ( pInfo ) + { + pInfo->ClearCmisProperties(); + Sequence< beans::PropertyValue > aPropertySeq = m_pPropertiesCtrl->GetCmisProperties(); + sal_Int32 i = 0, nCount = aPropertySeq.getLength(); + for ( ; i < nCount; ++i ) + { + if ( !aPropertySeq[i].Name.isEmpty() ) + pInfo->AddCmisProperty( aPropertySeq[i].Name, aPropertySeq[i].Value ); + } + } + + rSet.Put( *pInfo ); + if ( bMustDelete ) + delete pInfo; return bModified; } -void SfxCmisPropertiesPage::Reset( const SfxItemSet& /*rItemSet*/ ) +void SfxCmisPropertiesPage::Reset( const SfxItemSet& rItemSet ) { - + m_pPropertiesCtrl->ClearAllLines(); + const SfxDocumentInfoItem* m_pInfoItem = &(const SfxDocumentInfoItem &)rItemSet.Get(SID_DOCINFO); + std::vector< CustomProperty* > aCmisProps = m_pInfoItem->GetCmisProperties(); + for ( sal_uInt32 i = 0; i < aCmisProps.size(); i++ ) + { + m_pPropertiesCtrl->AddLine( aCmisProps[i]->m_sName, aCmisProps[i]->m_aValue, false ); + } } int SfxCmisPropertiesPage::DeactivatePage( SfxItemSet* /*pSet*/ ) { int nRet = LEAVE_PAGE; - + if ( !m_pPropertiesCtrl->AreAllLinesValid() ) + nRet = KEEP_PAGE; return nRet; } diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index 415723c61bf9..4777be6d7468 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -491,7 +491,10 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) aTitle = GetTitle(); } - SfxDocumentInfoItem aDocInfoItem( aURL, getDocProperties(), + Reference< XCmisDocument > xCmisDoc( GetModel(), uno::UNO_QUERY ); + beans::PropertyValues aCmisProperties = xCmisDoc->getCmisPropertiesValues(); + + SfxDocumentInfoItem aDocInfoItem( aURL, getDocProperties(), aCmisProperties, IsUseUserData() ); if ( !GetSlotState( SID_DOCTEMPLATE ) ) // templates not supported @@ -516,10 +519,9 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) // user has done some changes to DocumentInfo pDocInfoItem->UpdateDocumentInfo(getDocProperties()); SetUseUserData( ((const SfxDocumentInfoItem *)pDocInfoItem)->IsUseUserData() ); - - // add data from dialog for possible recording purposes + // add data from dialog for possible recording purpose rReq.AppendItem( SfxDocumentInfoItem( GetTitle(), - getDocProperties(), IsUseUserData() ) ); + getDocProperties(), aCmisProperties, IsUseUserData() ) ); } rReq.Done(); @@ -921,7 +923,7 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) { bool bShow = false; Reference< XCmisDocument > xCmisDoc( GetModel(), uno::UNO_QUERY ); - beans::PropertyValues aCmisProperties = xCmisDoc->getCmisPropertiesValues( ); + beans::PropertyValues aCmisProperties = xCmisDoc->getCmisPropertiesValues(); if ( xCmisDoc->isVersionable( ) && aCmisProperties.hasElements( ) ) { diff --git a/sfx2/uiconfig/ui/cmisinfopage.ui b/sfx2/uiconfig/ui/cmisinfopage.ui index f39344186c00..f03494d08efc 100644 --- a/sfx2/uiconfig/ui/cmisinfopage.ui +++ b/sfx2/uiconfig/ui/cmisinfopage.ui @@ -24,6 +24,20 @@ </packing> </child> <child> + <object class="sfxlo-CmisPropertiesControl" id="cmisproperties"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> <object class="GtkBox" id="box1"> <property name="can_focus">False</property> <property name="no_show_all">True</property> diff --git a/sfx2/uiconfig/ui/documentpropertiesdialog.ui b/sfx2/uiconfig/ui/documentpropertiesdialog.ui index 876e9ec085f8..4d963b88e2a1 100644 --- a/sfx2/uiconfig/ui/documentpropertiesdialog.ui +++ b/sfx2/uiconfig/ui/documentpropertiesdialog.ui @@ -130,10 +130,10 @@ <placeholder/> </child> <child type="tab"> - <object class="GtkLabel" id="security"> + <object class="GtkLabel" id="cmisprops"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Security</property> + <property name="label" translatable="yes">CMIS Properties</property> </object> <packing> <property name="position">3</property> @@ -144,10 +144,10 @@ <placeholder/> </child> <child type="tab"> - <object class="GtkLabel" id="cmisprops"> + <object class="GtkLabel" id="security"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">CMIS Properties</property> + <property name="label" translatable="yes">Security</property> </object> <packing> <property name="position">4</property> |