/************************************************************** * * 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_svx.hxx" #ifdef _TOOLS_DEBUG_HXX #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _VCL_MNEMONIC_HXX_ #include #endif #include #include #include #include "lboxctrl.hrc" using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::frame; class SvxPopupWindowListBox; ///////////////////////////////////////////////////////////////// class SvxPopupWindowListBox : public SfxPopupWindow { using FloatingWindow::StateChanged; FixedInfo aInfo; ListBox * pListBox; ToolBox & rToolBox; sal_Bool bUserSel; sal_uInt16 nTbxId; rtl::OUString maCommandURL; // disallow copy-constructor and assignment-operator SvxPopupWindowListBox(const int& ); SvxPopupWindowListBox & operator = (const int& ); // SvxPopupWindowListBox( sal_uInt16 nSlotId, ToolBox& rTbx, sal_uInt16 nTbxItemId ); public: SvxPopupWindowListBox( sal_uInt16 nSlotId, const rtl::OUString& rCommandURL, sal_uInt16 nTbxId, ToolBox& rTbx ); virtual ~SvxPopupWindowListBox(); // SfxPopupWindow virtual SfxPopupWindow * Clone() const; virtual void PopupModeEnd(); virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ); void StartSelection(); inline ListBox & GetListBox() { return *pListBox; } inline FixedInfo & GetInfo() { return aInfo; } sal_Bool IsUserSelected() const { return bUserSel; } void SetUserSelected( sal_Bool bVal ) { bUserSel = bVal; } /*virtual*/Window* GetPreferredKeyInputWindow(); }; ///////////////////////////////////////////////////////////////// SvxPopupWindowListBox::SvxPopupWindowListBox( sal_uInt16 nSlotId, const rtl::OUString& rCommandURL, sal_uInt16 nId, ToolBox& rTbx ) : SfxPopupWindow( nSlotId, Reference< XFrame >(), SVX_RES( RID_SVXTBX_UNDO_REDO_CTRL ) ), aInfo ( this, SVX_RES( FT_NUM_OPERATIONS ) ), rToolBox ( rTbx ), bUserSel ( sal_False ), nTbxId ( nId ), maCommandURL( rCommandURL ) { DBG_ASSERT( nSlotId == GetId(), "id mismatch" ); pListBox = new ListBox( this, SVX_RES( LB_SVXTBX_UNDO_REDO_CTRL ) ); FreeResource(); pListBox->EnableMultiSelection( sal_True, sal_True ); SetBackground( GetSettings().GetStyleSettings().GetDialogColor() ); AddStatusListener( rCommandURL ); } SvxPopupWindowListBox::~SvxPopupWindowListBox() { delete pListBox; } SfxPopupWindow* SvxPopupWindowListBox::Clone() const { return new SvxPopupWindowListBox( GetId(), maCommandURL, nTbxId, rToolBox ); } void SvxPopupWindowListBox::PopupModeEnd() { rToolBox.EndSelection(); SfxPopupWindow::PopupModeEnd(); //FloatingWindow::PopupModeEnd(); if( SfxViewShell::Current() ) { Window* pShellWnd = SfxViewShell::Current()->GetWindow(); if (pShellWnd) pShellWnd->GrabFocus(); } } void SvxPopupWindowListBox::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) { rToolBox.EnableItem( nTbxId, ( SfxToolBoxControl::GetItemState( pState ) != SFX_ITEM_DISABLED) ); SfxPopupWindow::StateChanged( nSID, eState, pState ); } void SvxPopupWindowListBox::StartSelection() { rToolBox.StartSelection(); } Window* SvxPopupWindowListBox::GetPreferredKeyInputWindow() { // allows forwarding key events in the correct window // without setting the focus return pListBox->GetPreferredKeyInputWindow(); } ///////////////////////////////////////////////////////////////// SFX_IMPL_TOOLBOX_CONTROL( SvxListBoxControl, SfxStringItem ); SvxListBoxControl::SvxListBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :SfxToolBoxControl( nSlotId, nId, rTbx ), pPopupWin ( 0 ) { rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) ); rTbx.Invalidate(); } SvxListBoxControl::~SvxListBoxControl() { } SfxPopupWindow* SvxListBoxControl::CreatePopupWindow() { DBG_ERROR( "not implemented" ); return 0; } SfxPopupWindowType SvxListBoxControl::GetPopupWindowType() const { return SFX_POPUPWINDOW_ONTIMEOUT; } void SvxListBoxControl::StateChanged( sal_uInt16, SfxItemState, const SfxPoolItem* pState ) { GetToolBox().EnableItem( GetId(), SFX_ITEM_DISABLED != GetItemState(pState) ); } IMPL_LINK( SvxListBoxControl, PopupModeEndHdl, void *, EMPTYARG ) { if( pPopupWin && 0 == pPopupWin->GetPopupModeFlags() && pPopupWin->IsUserSelected() ) { sal_uInt16 nCount = pPopupWin->GetListBox().GetSelectEntryCount(); INetURLObject aObj( m_aCommandURL ); Sequence< PropertyValue > aArgs( 1 ); aArgs[0].Name = aObj.GetURLPath(); aArgs[0].Value = makeAny( sal_Int16( nCount )); SfxToolBoxControl::Dispatch( m_aCommandURL, aArgs ); } return 0; } void SvxListBoxControl::Impl_SetInfo( sal_uInt16 nCount ) { DBG_ASSERT( pPopupWin, "NULL pointer, PopupWindow missing" ); // ListBox &rListBox = pPopupWin->GetListBox(); sal_uInt16 nId; if (nCount == 1) nId = SID_UNDO == GetSlotId() ? RID_SVXSTR_NUM_UNDO_ACTION : RID_SVXSTR_NUM_REDO_ACTION; else nId = SID_UNDO == GetSlotId() ? RID_SVXSTR_NUM_UNDO_ACTIONS : RID_SVXSTR_NUM_REDO_ACTIONS; aActionStr = String(SVX_RES(nId)); String aText( aActionStr ); aText.SearchAndReplaceAllAscii( "$(ARG1)", String::CreateFromInt32( nCount ) ); pPopupWin->GetInfo().SetText( aText ); } IMPL_LINK( SvxListBoxControl, SelectHdl, void *, EMPTYARG ) { if (pPopupWin) { //pPopupWin->SetUserSelected( sal_False ); ListBox &rListBox = pPopupWin->GetListBox(); if (rListBox.IsTravelSelect()) Impl_SetInfo( rListBox.GetSelectEntryCount() ); else { pPopupWin->SetUserSelected( sal_True ); pPopupWin->EndPopupMode( 0 ); } } return 0; } ///////////////////////////////////////////////////////////////// SFX_IMPL_TOOLBOX_CONTROL( SvxUndoRedoControl, SfxStringItem ); SvxUndoRedoControl::SvxUndoRedoControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) : SvxListBoxControl( nSlotId, nId, rTbx ) { rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) ); rTbx.Invalidate(); aDefaultText = MnemonicGenerator::EraseAllMnemonicChars( rTbx.GetItemText( nId ) ); } SvxUndoRedoControl::~SvxUndoRedoControl() { } void SvxUndoRedoControl::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) { if ( nSID == SID_UNDO || nSID == SID_REDO ) { if ( eState == SFX_ITEM_DISABLED ) { ToolBox& rBox = GetToolBox(); rBox.SetQuickHelpText( GetId(), aDefaultText ); } else if ( pState && pState->ISA( SfxStringItem ) ) { SfxStringItem& rItem = *(SfxStringItem *)pState; ToolBox& rBox = GetToolBox(); String aQuickHelpText = MnemonicGenerator::EraseAllMnemonicChars( rItem.GetValue() ); rBox.SetQuickHelpText( GetId(), aQuickHelpText ); } SvxListBoxControl::StateChanged( nSID, eState, pState ); } else { aUndoRedoList.clear(); if ( pState && pState->ISA( SfxStringListItem ) ) { SfxStringListItem &rItem = *(SfxStringListItem *)pState; const List* pLst = rItem.GetList(); DBG_ASSERT( pLst, "no undo actions available" ); if ( pLst ) { for( long nI = 0, nEnd = pLst->Count(); nI < nEnd; ++nI ) aUndoRedoList.push_back( rtl::OUString( *(String *)pLst->GetObject( nI ))); } } } } SfxPopupWindow* SvxUndoRedoControl::CreatePopupWindow() { DBG_ASSERT(( SID_UNDO == GetSlotId() || SID_REDO == GetSlotId() ), "mismatching ids" ); if ( m_aCommandURL.equalsAscii( ".uno:Undo" )) updateStatus( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GetUndoStrings" ))); else updateStatus( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GetRedoStrings" ))); ToolBox& rBox = GetToolBox(); pPopupWin = new SvxPopupWindowListBox( GetSlotId(), m_aCommandURL, GetId(), rBox ); pPopupWin->SetPopupModeEndHdl( LINK( this, SvxUndoRedoControl, PopupModeEndHdl ) ); ListBox &rListBox = pPopupWin->GetListBox(); rListBox.SetSelectHdl( LINK( this, SvxUndoRedoControl, SelectHdl ) ); for( sal_uInt32 n = 0; n < aUndoRedoList.size(); n++ ) rListBox.InsertEntry( String( aUndoRedoList[n] )); rListBox.SelectEntryPos( 0 ); aActionStr = String( SVX_RES( SID_UNDO == GetSlotId() ? RID_SVXSTR_NUM_UNDO_ACTIONS : RID_SVXSTR_NUM_REDO_ACTIONS ) ); Impl_SetInfo( rListBox.GetSelectEntryCount() ); // move focus in floating window without // closing it (GrabFocus() would close it!) pPopupWin->StartPopupMode( &rBox, FLOATWIN_POPUPMODE_GRABFOCUS ); //pPopupWin->GetListBox().GrabFocus(); return pPopupWin; }