diff options
Diffstat (limited to 'extensions/source/propctrlr/taborder.cxx')
-rw-r--r-- | extensions/source/propctrlr/taborder.cxx | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/extensions/source/propctrlr/taborder.cxx b/extensions/source/propctrlr/taborder.cxx new file mode 100644 index 000000000000..c3e0268bbc7a --- /dev/null +++ b/extensions/source/propctrlr/taborder.cxx @@ -0,0 +1,424 @@ +/************************************************************************* + * + * 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 "taborder.hxx" +#ifndef EXTENSIONS_SOURCE_PROPCTRLR_TABORDER_HRC +#include "taborder.hrc" +#endif + +#ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_ +#include "modulepcr.hxx" +#endif +#ifndef _EXTENSIONS_FORMCTRLR_PROPRESID_HRC_ +#include "formresid.hrc" +#endif +#include "formstrings.hxx" +#include <comphelper/types.hxx> +#include <comphelper/property.hxx> +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/form/FormComponentType.hpp> +#include <com/sun/star/awt/XTabController.hpp> +#include <vcl/scrbar.hxx> + +//............................................................................ +namespace pcr +{ +//............................................................................ + + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::awt; + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::form; + using namespace ::com::sun::star::beans; + using namespace ::com::sun::star::datatransfer; + + //======================================================================== + //= OSimpleTabModel + //======================================================================== + class OSimpleTabModel : public ::cppu::WeakImplHelper1< XTabControllerModel> + { + Sequence< Reference< XControlModel > > m_aModels; + + public: + OSimpleTabModel( const Sequence< Reference< XControlModel > >& _rModels ) + :m_aModels( _rModels ) + { + } + + // XTabControllerModel + virtual void SAL_CALL setControlModels(const Sequence< Reference< XControlModel > >& rModels) throw( RuntimeException ) {m_aModels = rModels;} + virtual Sequence< Reference< XControlModel > > SAL_CALL getControlModels(void) throw( RuntimeException ) {return m_aModels;} + virtual void SAL_CALL setGroup(const Sequence< Reference< XControlModel > >& /*Group*/, const ::rtl::OUString& /*GroupName*/) throw( RuntimeException ) {} + virtual sal_Int32 SAL_CALL getGroupCount(void) throw( RuntimeException ) {return 0;} + virtual void SAL_CALL getGroup(sal_Int32 /*nGroup*/, Sequence< Reference< XControlModel > >& /*Group*/, ::rtl::OUString& /*Name*/) throw( RuntimeException ) {} + virtual void SAL_CALL getGroupByName(const ::rtl::OUString& /*Name*/, Sequence< Reference< XControlModel > >& /*Group*/) throw( RuntimeException ) {} + virtual sal_Bool SAL_CALL getGroupControl(void) throw( RuntimeException ){return sal_False;} ; + virtual void SAL_CALL setGroupControl(sal_Bool /*GroupControl*/) throw( RuntimeException ){}; + }; + + //======================================================================== + //= TabOrderDialog + //======================================================================== + DBG_NAME(TabOrderDialog) + //------------------------------------------------------------------------ + TabOrderDialog::TabOrderDialog( Window* _pParent, const Reference< XTabControllerModel >& _rxTabModel, + const Reference< XControlContainer >& _rxControlCont, const Reference< XMultiServiceFactory >& _rxORB ) + :ModalDialog( _pParent, PcrRes( RID_DLG_TABORDER ) ) + ,m_xModel( _rxTabModel ) + ,m_xControlContainer( _rxControlCont ) + ,m_xORB( _rxORB ) + ,aFT_Controls( this, PcrRes( FT_CONTROLS ) ) + ,aLB_Controls( this, PcrRes( CTRL_TREE ) ) + ,aPB_OK( this, PcrRes( PB_OK ) ) + ,aPB_CANCEL( this, PcrRes( PB_CANCEL ) ) + ,aPB_HELP( this, PcrRes( PB_HELP ) ) + ,aPB_MoveUp( this, PcrRes( PB_MOVE_UP ) ) + ,aPB_MoveDown( this, PcrRes( PB_MOVE_DOWN ) ) + ,aPB_AutoOrder( this, PcrRes( PB_AUTO_ORDER ) ) + ,pImageList( NULL ) + { + DBG_CTOR(TabOrderDialog,NULL); + + aPB_MoveUp.SetClickHdl( LINK( this, TabOrderDialog, MoveUpClickHdl ) ); + aPB_MoveDown.SetClickHdl( LINK( this, TabOrderDialog, MoveDownClickHdl ) ); + aPB_AutoOrder.SetClickHdl( LINK( this, TabOrderDialog, AutoOrderClickHdl ) ); + aPB_OK.SetClickHdl( LINK( this, TabOrderDialog, OKClickHdl ) ); + aPB_OK.Disable(); + + sal_Bool bIsHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); + pImageList = new ImageList( PcrRes( bIsHighContrast ? RID_IL_FORMEXPLORER_HC : RID_IL_FORMEXPLORER ) ); + + + if ( m_xModel.is() ) + m_xTempModel = new OSimpleTabModel( m_xModel->getControlModels() ); + + if ( m_xTempModel.is() && m_xControlContainer.is() ) + FillList(); + + if ( aLB_Controls.GetEntryCount() < 2 ) + { + aPB_MoveUp.Disable(); + aPB_MoveDown.Disable(); + aPB_AutoOrder.Disable(); + } + + FreeResource(); + } + + //------------------------------------------------------------------------ + void TabOrderDialog::SetModified() + { + aPB_OK.Enable(); + } + + //------------------------------------------------------------------------ + TabOrderDialog::~TabOrderDialog() + { + aLB_Controls.Hide(); + // delete pLB_Controls; + delete pImageList; + + DBG_DTOR(TabOrderDialog,NULL); + } + + //------------------------------------------------------------------------ + Image TabOrderDialog::GetImage( const Reference< XPropertySet >& _rxSet ) const + { + sal_uInt16 nImageId = RID_SVXIMG_CONTROL; + // TODO: classify controls also in Basic propbrw + if ( _rxSet.is() && ::comphelper::hasProperty( PROPERTY_CLASSID, _rxSet ) ) + { + switch( ::comphelper::getINT16( _rxSet->getPropertyValue( PROPERTY_CLASSID ) ) ) + { + case FormComponentType::COMMANDBUTTON: nImageId = RID_SVXIMG_BUTTON; break; + case FormComponentType::FIXEDTEXT: nImageId = RID_SVXIMG_FIXEDTEXT; break; + case FormComponentType::TEXTFIELD: nImageId = RID_SVXIMG_EDIT; break; + case FormComponentType::RADIOBUTTON: nImageId = RID_SVXIMG_RADIOBUTTON; break; + case FormComponentType::CHECKBOX: nImageId = RID_SVXIMG_CHECKBOX; break; + case FormComponentType::LISTBOX: nImageId = RID_SVXIMG_LISTBOX; break; + case FormComponentType::COMBOBOX: nImageId = RID_SVXIMG_COMBOBOX; break; + case FormComponentType::GROUPBOX: nImageId = RID_SVXIMG_GROUPBOX; break; + case FormComponentType::IMAGEBUTTON: nImageId = RID_SVXIMG_IMAGEBUTTON; break; + case FormComponentType::FILECONTROL: nImageId = RID_SVXIMG_FILECONTROL; break; + case FormComponentType::HIDDENCONTROL: nImageId = RID_SVXIMG_HIDDEN; break; + case FormComponentType::DATEFIELD: nImageId = RID_SVXIMG_DATEFIELD; break; + case FormComponentType::TIMEFIELD: nImageId = RID_SVXIMG_TIMEFIELD; break; + case FormComponentType::NUMERICFIELD: nImageId = RID_SVXIMG_NUMERICFIELD; break; + case FormComponentType::CURRENCYFIELD: nImageId = RID_SVXIMG_CURRENCYFIELD; break; + case FormComponentType::PATTERNFIELD: nImageId = RID_SVXIMG_PATTERNFIELD; break; + case FormComponentType::IMAGECONTROL: nImageId = RID_SVXIMG_IMAGECONTROL; break; + case FormComponentType::GRIDCONTROL: nImageId = RID_SVXIMG_GRID; break; + case FormComponentType::SCROLLBAR: nImageId = RID_SVXIMG_SCROLLBAR; break; + case FormComponentType::SPINBUTTON: nImageId = RID_SVXIMG_SPINBUTTON; break; + case FormComponentType::NAVIGATIONBAR: nImageId = RID_SVXIMG_NAVIGATIONBAR; break; + default: + DBG_ERROR( "TabOrderDialog::GetImage: unknown control type" ); + } + } + + return pImageList->GetImage( nImageId ); + } + + //------------------------------------------------------------------------ + void TabOrderDialog::FillList() + { + DBG_ASSERT( m_xTempModel.is() && m_xControlContainer.is(), "TabOrderDialog::FillList: invalid call!" ); + if ( !m_xTempModel.is() || !m_xControlContainer.is() ) + return; + + aLB_Controls.Clear(); + + try + { + Sequence< Reference< XControlModel > > aControlModels( m_xTempModel->getControlModels() ); + const Reference< XControlModel >* pControlModels = aControlModels.getConstArray(); + + ::rtl::OUString aName; + Image aImage; + + for ( sal_Int32 i=0; i < aControlModels.getLength(); ++i, ++pControlModels ) + { + Reference< XPropertySet > xControl( *pControlModels, UNO_QUERY ); + Reference< XPropertySetInfo > xPI; + if ( xControl.is() ) + xPI = xControl->getPropertySetInfo(); + + if ( xPI.is() ) + { + if ( xPI->hasPropertyByName( PROPERTY_TABSTOP ) ) + { + aName = ::comphelper::getString( xControl->getPropertyValue( PROPERTY_NAME ) ); + // TODO: do Basic controls have a name? + aImage = GetImage( xControl ); + aLB_Controls.InsertEntry( aName, aImage, aImage, 0, sal_False, LIST_APPEND, xControl.get() ); + } + } + else + { + // no property set -> no tab order + DBG_ERROR( "TabOrderDialog::FillList: invalid control encountered!" ); + aLB_Controls.Clear(); + break; + } + } + } + catch( const Exception& ) + { + DBG_ERROR( "TabOrderDialog::FillList: caught an exception!" ); + } + + // select first entry + SvLBoxEntry* pFirstEntry = aLB_Controls.GetEntry( 0 ); + if ( pFirstEntry ) + aLB_Controls.Select( pFirstEntry ); + } + + //------------------------------------------------------------------------ + IMPL_LINK( TabOrderDialog, MoveUpClickHdl, Button*, /*pButton*/ ) + { + aLB_Controls.MoveSelection( -1 ); + return 0; + } + + //------------------------------------------------------------------------ + IMPL_LINK( TabOrderDialog, MoveDownClickHdl, Button*, /*pButton*/ ) + { + aLB_Controls.MoveSelection( 1 ); + return 0; + } + + //------------------------------------------------------------------------ + IMPL_LINK( TabOrderDialog, AutoOrderClickHdl, Button*, /*pButton*/ ) + { + try + { + Reference< XTabController > xTabController; + if ( m_xORB.is() ) + xTabController = xTabController.query( m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.FormController" ) ) ) ); + DBG_ASSERT( xTabController.is(), "TabOrderDialog::AutoOrderClickHdl: could not instantiate a tab controller!" ); + if ( !xTabController.is() ) + return 0; + + xTabController->setModel( m_xTempModel ); + xTabController->setContainer( m_xControlContainer ); + xTabController->autoTabOrder(); + + SetModified(); + FillList(); + + ::comphelper::disposeComponent( xTabController ); + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "TabOrderDialog::AutoOrderClickHdl: caught an exception!" ); + } + + return 0; + } + + //------------------------------------------------------------------------ + IMPL_LINK( TabOrderDialog, OKClickHdl, Button*, /*pButton*/ ) + { + sal_uLong nEntryCount = aLB_Controls.GetEntryCount(); + Sequence< Reference< XControlModel > > aSortedControlModelSeq( nEntryCount ); + Sequence< Reference< XControlModel > > aControlModels( m_xTempModel->getControlModels()); + Reference< XControlModel > * pSortedControlModels = aSortedControlModelSeq.getArray(); + const Reference< XControlModel > * pControlModels = aControlModels.getConstArray(); + + for (sal_uLong i=0; i < nEntryCount; i++) + { + SvLBoxEntry* pEntry = aLB_Controls.GetEntry(i); + + for( sal_Int32 j=0; j<aControlModels.getLength(); j++ ) + { + Reference< XPropertySet > xSet(pControlModels[j], UNO_QUERY); + if ((XPropertySet*)xSet.get() == ((XPropertySet*)pEntry->GetUserData())) + { + pSortedControlModels[i] = pControlModels[j]; + break; + } + } + } + + // TODO: UNO action (to bracket all the single actions which are being created) +// pDrawModel->BegUndo(PcrRes(RID_STR_UNDO_TABORDER)); + m_xModel->setControlModels( aSortedControlModelSeq ); +// pDrawModel->EndUndo(); + + EndDialog( sal_True ); + return 0; + } + + //======================================================================== + //= TabOrderListBox + //======================================================================== + DBG_NAME(TabOrderListBox); + //------------------------------------------------------------------------ + TabOrderListBox::TabOrderListBox( Window* pParent, const ResId& rResId ) + :SvTreeListBox( pParent, rResId ) + { + DBG_CTOR(TabOrderListBox,NULL); + SetDragDropMode(0xFFFF/*SV_DRAGDROP_CTRL_MOVE*/); + // Hmm. The flag alone is not enough, so to be on the safe side ... + + SetSelectionMode( MULTIPLE_SELECTION ); + } + + //------------------------------------------------------------------------ + TabOrderListBox::~TabOrderListBox() + { + DBG_DTOR(TabOrderListBox,NULL); + } + + //------------------------------------------------------------------------ + void TabOrderListBox::ModelHasMoved( SvListEntry* _pSource ) + { + SvTreeListBox::ModelHasMoved( _pSource ); + + ((TabOrderDialog*)Window::GetParent())->SetModified(); + } + + //------------------------------------------------------------------------ + void TabOrderListBox::MoveSelection( long nRelPos ) + { + UniString aSelEntryPrevText,aSelEntryNextText; + Image aImage; + for (long i=0; i<labs(nRelPos); i++) + { + ((TabOrderDialog*)Window::GetParent())->SetModified(); + + ////////////////////////////////////////////////////////////////////// + // move entries + if( nRelPos < 0 ) + { + SvLBoxEntry* pFirstSelected = FirstSelected(); + if( !pFirstSelected ) return; + sal_uLong nFirstSelPos = GetModel()->GetAbsPos( pFirstSelected ); + if( nFirstSelPos == 0 ) return; + + SvLBoxEntry* pSelEntry = pFirstSelected; + while( pSelEntry ) + { + sal_uLong nSelEntryPos = GetModel()->GetAbsPos( pSelEntry ); + SvLBoxEntry* pSelEntryPrev = GetEntry( nSelEntryPos-1 ); + aSelEntryPrevText = GetEntryText( pSelEntryPrev ); + aImage = GetExpandedEntryBmp(pSelEntryPrev); + void* pData = pSelEntryPrev->GetUserData(); + + GetModel()->Remove( pSelEntryPrev ); + InsertEntry( aSelEntryPrevText, aImage, aImage, 0, sal_False, nSelEntryPos, pData ); + + pSelEntry = NextSelected( pSelEntry ); + } + } + + else if( nRelPos > 0 ) + { + SvLBoxEntry* pLastSelected = LastSelected(); + if( !pLastSelected ) return; + sal_uLong nLastSelPos = GetModel()->GetAbsPos( pLastSelected ); + + if( (nLastSelPos + nRelPos - i) > (GetEntryCount()-1) ) return; + +#if OSL_DEBUG_LEVEL > 0 + sal_uLong nSelCount = GetSelectionCount(); + (void)nSelCount; +#endif + + + SvLBoxEntry* pSelEntry = pLastSelected; + while( pSelEntry ) + { + sal_uLong nSelEntryPos = GetModel()->GetAbsPos( pSelEntry ); + SvLBoxEntry* pSelEntryNext = GetEntry( nSelEntryPos+1 ); + void* pData = pSelEntryNext->GetUserData(); + + aSelEntryNextText = GetEntryText( pSelEntryNext ); + aImage = GetExpandedEntryBmp(pSelEntryNext); + + GetModel()->Remove( pSelEntryNext ); + InsertEntry( aSelEntryNextText, aImage, aImage, 0, sal_False, nSelEntryPos, pData ); + + pSelEntry = PrevSelected( pSelEntry ); + } + long nThumbPos = GetVScroll()->GetThumbPos(); + long nVisibleSize = GetVScroll()->GetVisibleSize(); + long nFirstVisible = GetModel()->GetAbsPos( FirstVisible()); + + if ( ( nThumbPos + nVisibleSize + 1 ) < (long)( nLastSelPos + 3 ) ) + GetVScroll()->DoScrollAction(SCROLL_LINEDOWN); + else if((nThumbPos+nVisibleSize+1) >= (nFirstVisible)) + GetVScroll()->DoScrollAction(SCROLL_LINEUP); + } + } + } + +//............................................................................ +} // namespace pcr +//............................................................................ |