/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include "taborder.hxx" #include "taborder.hrc" #include "modulepcr.hxx" #include "formresid.hrc" #include "formstrings.hxx" #include #include #include #include #include #include #include "svtools/treelistentry.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 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*/, OUString& /*Name*/) throw( RuntimeException ) {} virtual void SAL_CALL getGroupByName(const 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< XComponentContext >& _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(); pImageList = new ImageList( PcrRes( 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: OSL_FAIL( "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(); 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 OSL_FAIL( "TabOrderDialog::FillList: invalid control encountered!" ); aLB_Controls.Clear(); break; } } } catch( const Exception& ) { OSL_FAIL( "TabOrderDialog::FillList: caught an exception!" ); } // select first entry SvTreeListEntry* 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< css::form::runtime::XFormController > xTabController = css::form::runtime::FormController::create( m_xORB ); xTabController->setModel( m_xTempModel ); xTabController->setContainer( m_xControlContainer ); xTabController->autoTabOrder(); SetModified(); FillList(); ::comphelper::disposeComponent( xTabController ); } catch( const Exception& ) { OSL_FAIL( "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++) { SvTreeListEntry* pEntry = aLB_Controls.GetEntry(i); for( sal_Int32 j=0; j 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) m_xModel->setControlModels( aSortedControlModelSeq ); 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( SvTreeListEntry* _pSource ) { SvTreeListBox::ModelHasMoved( _pSource ); ((TabOrderDialog*)GetParentDialog())->SetModified(); } //------------------------------------------------------------------------ void TabOrderListBox::MoveSelection( long nRelPos ) { OUString aSelEntryPrevText, aSelEntryNextText; Image aImage; for (long i=0; iSetModified(); ////////////////////////////////////////////////////////////////////// // move entries if( nRelPos < 0 ) { SvTreeListEntry* pFirstSelected = FirstSelected(); if( !pFirstSelected ) return; sal_uLong nFirstSelPos = GetModel()->GetAbsPos( pFirstSelected ); if( nFirstSelPos == 0 ) return; SvTreeListEntry* pSelEntry = pFirstSelected; while( pSelEntry ) { sal_uLong nSelEntryPos = GetModel()->GetAbsPos( pSelEntry ); SvTreeListEntry* 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 ) { SvTreeListEntry* 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 SvTreeListEntry* pSelEntry = pLastSelected; while( pSelEntry ) { sal_uLong nSelEntryPos = GetModel()->GetAbsPos( pSelEntry ); SvTreeListEntry* 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 //............................................................................ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */