| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the 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 |
| //............................................................................ |