summaryrefslogtreecommitdiff
path: root/extensions/source/propctrlr/listselectiondlg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/propctrlr/listselectiondlg.cxx')
-rw-r--r--extensions/source/propctrlr/listselectiondlg.cxx173
1 files changed, 173 insertions, 0 deletions
diff --git a/extensions/source/propctrlr/listselectiondlg.cxx b/extensions/source/propctrlr/listselectiondlg.cxx
new file mode 100644
index 000000000000..14e4ce7de68e
--- /dev/null
+++ b/extensions/source/propctrlr/listselectiondlg.cxx
@@ -0,0 +1,173 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "listselectiondlg.hxx"
+#ifndef EXTENSIONS_SOURCE_PROPCTRLR_LISTSELECTIONDLG_HRC
+#include "listselectiondlg.hrc"
+#endif
+
+#ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_
+#include "modulepcr.hxx"
+#endif
+#ifndef _EXTENSIONS_FORMCTRLR_PROPRESID_HRC_
+#include "formresid.hrc"
+#endif
+#include "formstrings.hxx"
+#include <vcl/msgbox.hxx>
+
+/** === begin UNO includes === **/
+/** === end UNO includes === **/
+
+//........................................................................
+namespace pcr
+{
+//........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::beans;
+
+ //====================================================================
+ //= ListSelectionDialog
+ //====================================================================
+ //--------------------------------------------------------------------
+ ListSelectionDialog::ListSelectionDialog( Window* _pParent, const Reference< XPropertySet >& _rxListBox,
+ const ::rtl::OUString& _rPropertyName, const String& _rPropertyUIName )
+ :ModalDialog( _pParent, PcrRes( RID_DLG_SELECTION ) )
+ ,m_aLabel ( this, PcrRes( FT_ENTRIES ) )
+ ,m_aEntries ( this, PcrRes( LB_ENTRIES ) )
+ ,m_aOK ( this, PcrRes( PB_OK ) )
+ ,m_aCancel ( this, PcrRes( PB_CANCEL ) )
+ ,m_aHelp ( this, PcrRes( PB_HELP ) )
+ ,m_xListBox ( _rxListBox )
+ ,m_sPropertyName( _rPropertyName )
+ {
+ FreeResource();
+
+ OSL_PRECOND( m_xListBox.is(), "ListSelectionDialog::ListSelectionDialog: invalid list box!" );
+
+ SetText( _rPropertyUIName );
+ m_aLabel.SetText( _rPropertyUIName );
+
+ initialize( );
+ }
+
+ //------------------------------------------------------------------------
+ short ListSelectionDialog::Execute()
+ {
+ short nResult = ModalDialog::Execute();
+
+ if ( RET_OK == nResult )
+ commitSelection();
+
+ return nResult;
+ }
+
+ //--------------------------------------------------------------------
+ void ListSelectionDialog::initialize( )
+ {
+ if ( !m_xListBox.is() )
+ return;
+
+ m_aEntries.SetStyle( GetStyle() | WB_SIMPLEMODE );
+
+ try
+ {
+ // initialize the multi-selection flag
+ sal_Bool bMultiSelection = sal_False;
+ OSL_VERIFY( m_xListBox->getPropertyValue( PROPERTY_MULTISELECTION ) >>= bMultiSelection );
+ m_aEntries.EnableMultiSelection( bMultiSelection );
+
+ // fill the list box with all entries
+ Sequence< ::rtl::OUString > aListEntries;
+ OSL_VERIFY( m_xListBox->getPropertyValue( PROPERTY_STRINGITEMLIST ) >>= aListEntries );
+ fillEntryList( aListEntries );
+
+ // select entries according to the property
+ Sequence< sal_Int16 > aSelection;
+ OSL_VERIFY( m_xListBox->getPropertyValue( m_sPropertyName ) >>= aSelection );
+ selectEntries( aSelection );
+ }
+ catch( const Exception& )
+ {
+ OSL_ENSURE( sal_False, "ListSelectionDialog::initialize: caught an exception!" );
+ }
+ }
+
+ //--------------------------------------------------------------------
+ void ListSelectionDialog::commitSelection()
+ {
+ if ( !m_xListBox.is() )
+ return;
+
+ Sequence< sal_Int16 > aSelection;
+ collectSelection( aSelection );
+
+ try
+ {
+ m_xListBox->setPropertyValue( m_sPropertyName, makeAny( aSelection ) );
+ }
+ catch( const Exception& )
+ {
+ OSL_ENSURE( sal_False, "ListSelectionDialog::commitSelection: caught an exception!" );
+ }
+ }
+
+ //--------------------------------------------------------------------
+ void ListSelectionDialog::fillEntryList( const Sequence< ::rtl::OUString >& _rListEntries )
+ {
+ m_aEntries.Clear();
+ const ::rtl::OUString* _pListEntries = _rListEntries.getConstArray();
+ const ::rtl::OUString* _pListEntriesEnd = _rListEntries.getConstArray() + _rListEntries.getLength();
+ for ( ; _pListEntries < _pListEntriesEnd; ++_pListEntries )
+ m_aEntries.InsertEntry( *_pListEntries );
+ }
+
+ //--------------------------------------------------------------------
+ void ListSelectionDialog::collectSelection( Sequence< sal_Int16 >& /* [out] */ _rSelection )
+ {
+ sal_uInt16 nSelectedCount = m_aEntries.GetSelectEntryCount( );
+ _rSelection.realloc( nSelectedCount );
+ sal_Int16* pSelection = _rSelection.getArray();
+ for ( sal_uInt16 selected = 0; selected < nSelectedCount; ++selected, ++pSelection )
+ *pSelection = static_cast< sal_Int16 >( m_aEntries.GetSelectEntryPos( selected ) );
+ }
+
+ //--------------------------------------------------------------------
+ void ListSelectionDialog::selectEntries( const Sequence< sal_Int16 >& /* [in ] */ _rSelection )
+ {
+ m_aEntries.SetNoSelection();
+ const sal_Int16* pSelection = _rSelection.getConstArray();
+ const sal_Int16* pSelectionEnd = _rSelection.getConstArray() + _rSelection.getLength();
+ for ( ; pSelection != pSelectionEnd; ++pSelection )
+ m_aEntries.SelectEntryPos( *pSelection );
+ }
+
+//........................................................................
+} // namespace pcr
+//........................................................................