diff options
Diffstat (limited to 'extensions/source/propctrlr/browserlistbox.hxx')
-rw-r--r-- | extensions/source/propctrlr/browserlistbox.hxx | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/extensions/source/propctrlr/browserlistbox.hxx b/extensions/source/propctrlr/browserlistbox.hxx new file mode 100644 index 000000000000..edd9d9bd40eb --- /dev/null +++ b/extensions/source/propctrlr/browserlistbox.hxx @@ -0,0 +1,250 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _EXTENSIONS_PROPCTRLR_BROWSERLISTBOX_HXX_ +#define _EXTENSIONS_PROPCTRLR_BROWSERLISTBOX_HXX_ + +#include "browserline.hxx" +#ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_ +#include "modulepcr.hxx" +#endif +#include "pcrcommon.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/inspection/XPropertyControl.hpp> +#include <com/sun/star/inspection/XPropertyHandler.hpp> +/** === end UNO includes === **/ +#include <vcl/scrbar.hxx> +#include <vcl/lstbox.hxx> +#ifndef _SV_BUTTON_HXX +#include <vcl/button.hxx> +#endif +#include <tools/link.hxx> +#include <rtl/ref.hxx> + +#include <set> +#include <vector> +#include <hash_map> +#include <boost/shared_ptr.hpp> + +//............................................................................ +namespace pcr +{ +//............................................................................ + + class IPropertyLineListener; + class IPropertyControlObserver; + struct OLineDescriptor; + class InspectorHelpWindow; + class PropertyControlContext_Impl; + + //======================================================================== + //= administrative structures for OBrowserListBox + //======================================================================== + typedef ::boost::shared_ptr< OBrowserLine > BrowserLinePointer; + struct ListBoxLine + { + BrowserLinePointer pLine; + ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler > + xHandler; + + ListBoxLine() { } + ListBoxLine( BrowserLinePointer _pLine, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler >& _rxHandler ) + :pLine( _pLine ) + ,xHandler( _rxHandler ) + { + } + }; + typedef ::std::hash_map< ::rtl::OUString, ListBoxLine, ::rtl::OUStringHash > ListBoxLines; + typedef ::std::vector< ListBoxLines::iterator > OrderedListBoxLines; + + //======================================================================== + //= IControlContext + //======================================================================== + /** non-UNO version of XPropertyControlContext + */ + class SAL_NO_VTABLE IControlContext + { + public: + virtual void SAL_CALL focusGained( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& Control ) throw (::com::sun::star::uno::RuntimeException) = 0; + virtual void SAL_CALL valueChanged( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& Control ) throw (::com::sun::star::uno::RuntimeException) = 0; + virtual void SAL_CALL activateNextControl( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& CurrentControl ) throw (::com::sun::star::uno::RuntimeException) = 0; + }; + + //======================================================================== + //= OBrowserListBox + //======================================================================== + class OBrowserListBox :public Control + ,public IButtonClickListener + ,public IControlContext + ,public PcrClient + { + protected: + Window m_aLinesPlayground; + ScrollBar m_aVScroll; + ::std::auto_ptr< InspectorHelpWindow > + m_pHelpWindow; + ListBoxLines m_aLines; + OrderedListBoxLines m_aOrderedLines; + IPropertyLineListener* m_pLineListener; + IPropertyControlObserver* m_pControlObserver; + long m_nYOffset; + long m_nCurrentPreferredHelpHeight; + ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl > + m_xActiveControl; + sal_uInt16 m_nTheNameSize; + sal_uInt16 m_nRowHeight; + ::std::set< sal_uInt16 > m_aOutOfDateLines; + sal_Bool m_bIsActive : 1; + sal_Bool m_bUpdate : 1; + ::rtl::Reference< PropertyControlContext_Impl > + m_pControlContextImpl; + + protected: + void PositionLine( sal_uInt16 _nIndex ); + void UpdatePosNSize(); + void UpdatePlayGround(); + void UpdateVScroll(); + void ShowEntry(sal_uInt16 nPos); + void MoveThumbTo(sal_Int32 nNewThumbPos); + void Resize(); + + public: + OBrowserListBox( Window* pParent, WinBits nWinStyle = WB_DIALOGCONTROL ); + + ~OBrowserListBox(); + + void UpdateAll(); + + void ActivateListBox( sal_Bool _bActive ); + + sal_uInt16 CalcVisibleLines(); + void EnableUpdate(); + void DisableUpdate(); + long Notify( NotifyEvent& _rNEvt ); + long PreNotify( NotifyEvent& _rNEvt ); + + void SetListener( IPropertyLineListener* _pListener ); + void SetObserver( IPropertyControlObserver* _pObserver ); + + void EnableHelpSection( bool _bEnable ); + bool HasHelpSection() const; + void SetHelpText( const ::rtl::OUString& _rHelpText ); + void SetHelpLineLimites( sal_Int32 _nMinLines, sal_Int32 _nMaxLines ); + + void Clear(); + + sal_uInt16 InsertEntry( const OLineDescriptor&, sal_uInt16 nPos = EDITOR_LIST_APPEND ); + sal_Bool RemoveEntry( const ::rtl::OUString& _rName ); + void ChangeEntry( const OLineDescriptor&, sal_uInt16 nPos ); + + void SetPropertyValue( const ::rtl::OUString& rEntryName, const ::com::sun::star::uno::Any& rValue, bool _bUnknownValue ); + sal_uInt16 GetPropertyPos( const ::rtl::OUString& rEntryName ) const; + ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl > + GetPropertyControl( const ::rtl::OUString& rEntryName ); + void EnablePropertyControls( const ::rtl::OUString& _rEntryName, sal_Int16 _nControls, bool _bEnable ); + void EnablePropertyLine( const ::rtl::OUString& _rEntryName, bool _bEnable ); + + sal_Int32 GetMinimumWidth(); + sal_Int32 GetMinimumHeight(); + + + sal_Bool IsModified( ) const; + void CommitModified( ); + + protected: + // IControlContext + virtual void SAL_CALL focusGained( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& Control ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL valueChanged( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& Control ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL activateNextControl( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& CurrentControl ) throw (::com::sun::star::uno::RuntimeException); + + // IButtonClickListener + void buttonClicked( OBrowserLine* _pLine, sal_Bool _bPrimary ); + + using Window::SetHelpText; + private: + DECL_LINK( ScrollHdl, ScrollBar* ); + + /** retrieves the index of a given control in our line list + @param _rxControl + The control to lookup. Must denote a control of one of the lines in ->m_aLines + */ + sal_uInt16 impl_getControlPos( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& _rxControl ) const; + + /** retrieves (a reference to) the ->ListBoxLine for a given control + @param _rxControl + The control to lookup. Must denote a control of one of the lines in ->m_aLines + */ + inline const ListBoxLine& + impl_getControlLine( const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControl >& _rxControl ) const + { + return m_aOrderedLines[ impl_getControlPos( _rxControl ) ]->second; + } + + /** sets the given property value at the given control, after converting it as necessary + @param _rLine + The line whose at which the value is to be set. + @param _rPropertyValue + the property value to set. If it's not compatible with the control value, + it will be converted, using <member>XPropertyHandler::convertToControlValue</member> + */ + void impl_setControlAsPropertyValue( const ListBoxLine& _rLine, const ::com::sun::star::uno::Any& _rPropertyValue ); + + /** retrieves the value for the given control, as a property value, after converting it as necessary + @param _rLine + The line whose at which the value is to be set. + */ + ::com::sun::star::uno::Any + impl_getControlAsPropertyValue( const ListBoxLine& _rLine ) const; + + /** retrieves the ->BrowserLinePointer for a given entry name + @param _rEntryName + the name whose line is to be looked up + @param _out_rpLine + contains, upon return, the found browser line, if any + @return + <TRUE/> if and only if a non-<NULL/> line for the given entry name could be + found. + */ + bool impl_getBrowserLineForName( const ::rtl::OUString& _rEntryName, BrowserLinePointer& _out_rpLine ) const; + + /** returns the preferred height (in pixels) of the help section, or 0 if we + currently don't have a help section + */ + long impl_getPrefererredHelpHeight(); + + private: + using Window::Activate; + }; + +//............................................................................ +} // namespace pcr +//............................................................................ + +#endif // _EXTENSIONS_PROPCTRLR_BROWSERLISTBOX_HXX_ + + |