diff options
author | tagezi <lera.goncharuk@gmail.com> | 2018-03-28 21:25:33 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-04-21 08:12:22 +0200 |
commit | 3322661414a558d29146c40c0cd5e9db0a7b21dd (patch) | |
tree | 13eceea789349ee760c38334c897fb8333a9dd05 /basctl | |
parent | e82eeca67688a809317a0edeecf7d7b3fdf3a216 (diff) |
tdf#94498 add repeat search in Basic IDE by shortcut
additionally deduplicate code and remove unnecessary abstraction
Change-Id: Ib826b5cac74e95ce4ae8d02368b0983eb4942b29
Reviewed-on: https://gerrit.libreoffice.org/52027
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'basctl')
-rw-r--r-- | basctl/sdi/baside.sdi | 27 | ||||
-rw-r--r-- | basctl/source/basicide/basides1.cxx | 125 | ||||
-rw-r--r-- | basctl/source/basicide/iderdll.cxx | 6 | ||||
-rw-r--r-- | basctl/source/basicide/iderdll2.hxx | 5 | ||||
-rw-r--r-- | basctl/source/inc/basidesh.hxx | 32 |
5 files changed, 130 insertions, 65 deletions
diff --git a/basctl/sdi/baside.sdi b/basctl/sdi/baside.sdi index 180cdf2caa6a..5c413f89e6c4 100644 --- a/basctl/sdi/baside.sdi +++ b/basctl/sdi/baside.sdi @@ -99,30 +99,45 @@ shell basctl_Shell StateMethod = GetState; ] - SID_SEARCH_OPTIONS + SID_GOTOLINE [ ExecMethod = ExecuteCurrent; StateMethod = GetState; ] - SID_SEARCH_ITEM + + // Search in IDE Basic + + SID_SEARCH_OPTIONS [ - ExecMethod = ExecuteCurrent; + ExecMethod = ExecuteSearch; StateMethod = GetState; ] - SID_GOTOLINE + SID_SEARCH_ITEM [ - ExecMethod = ExecuteCurrent; + ExecMethod = ExecuteSearch; StateMethod = GetState; ] FID_SEARCH_NOW [ - ExecMethod = ExecuteCurrent; + ExecMethod = ExecuteSearch; StateMethod = GetState; ] + SID_BASICIDE_REPEAT_SEARCH + [ + ExecMethod = ExecuteSearch; + StateMethod = GetState; + ] + + FID_SEARCH_ON // status() + [ + ExecMethod = ExecuteSearch; + Export = FALSE; + ] + FID_SEARCH_OFF [ ExecMethod = ExecuteCurrent; diff --git a/basctl/source/basicide/basides1.cxx b/basctl/source/basicide/basides1.cxx index 95025f859bf9..da1c86f1872d 100644 --- a/basctl/source/basicide/basides1.cxx +++ b/basctl/source/basicide/basides1.cxx @@ -44,7 +44,6 @@ #include <svx/svxids.hrc> #include <svl/aeitem.hxx> #include <svl/intitem.hxx> -#include <svl/srchitem.hxx> #include <svl/visitem.hxx> #include <svl/whiter.hxx> #include <vcl/xtextedt.hxx> @@ -58,40 +57,56 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::frame; -void Shell::ExecuteCurrent( SfxRequest& rReq ) +void Shell::ExecuteSearch( SfxRequest& rReq ) { if ( !pCurWin ) return; - switch ( rReq.GetSlot() ) + const SfxItemSet* pArgs = rReq.GetArgs(); + sal_uInt16 nSlot = rReq.GetSlot(); + + // if searching has not been done before this time + if (nSlot == SID_BASICIDE_REPEAT_SEARCH && !mpSearchItem) { - case SID_BASICIDE_HIDECURPAGE: - { - pCurWin->StoreData(); - RemoveWindow( pCurWin, false ); - } - break; - case SID_BASICIDE_RENAMECURRENT: - { - pTabBar->StartEditMode( pTabBar->GetCurPageId() ); - } - break; + rReq.SetReturnValue(SfxBoolItem(nSlot, false)); + nSlot = 0; + } + + switch ( nSlot ) + { + case SID_SEARCH_OPTIONS: + break; + case SID_SEARCH_ITEM: + mpSearchItem.reset( static_cast<SvxSearchItem*>( pArgs->Get(SID_SEARCH_ITEM).Clone() )); + break; + case FID_SEARCH_ON: + mbJustOpened = true; + GetViewFrame()->GetBindings().Invalidate(SID_SEARCH_ITEM); + break; + case SID_BASICIDE_REPEAT_SEARCH: case FID_SEARCH_NOW: { if (!pCurWin->HasActiveEditor()) break; - DBG_ASSERT( rReq.GetArgs(), "arguments expected" ); - SfxItemSet const& rArgs = *rReq.GetArgs(); - // unfortunately I don't know the ID: - sal_uInt16 nWhich = rArgs.GetWhichByPos( 0 ); - DBG_ASSERT( nWhich, "Which for SearchItem?" ); - SfxPoolItem const& rItem = rArgs.Get(nWhich); - DBG_ASSERT(dynamic_cast<SvxSearchItem const*>(&rItem), "no searchitem!"); - SvxSearchItem const& rSearchItem = static_cast<SvxSearchItem const&>(rItem); - // memorize item because of the adjustments... - GetExtraData()->SetSearchItem(rSearchItem); + + // If it is a repeat searching + if ( nSlot == SID_BASICIDE_REPEAT_SEARCH ) + { + if( !mpSearchItem ) + mpSearchItem.reset( new SvxSearchItem( SID_SEARCH_ITEM )); + } + else + { + // Get SearchItem from request if it is the first searching + if ( pArgs ) + { + mpSearchItem.reset( static_cast<SvxSearchItem*>( pArgs->Get( SID_SEARCH_ITEM ).Clone() )); + } + } + sal_Int32 nFound = 0; - if (rSearchItem.GetCommand() == SvxSearchCmd::REPLACE_ALL) + + if ( mpSearchItem->GetCommand() == SvxSearchCmd::REPLACE_ALL ) { sal_uInt16 nActModWindows = 0; for (auto const& window : aWindowTable) @@ -116,11 +131,11 @@ void Shell::ExecuteCurrent( SfxRequest& rReq ) for (auto const& window : aWindowTable) { BaseWindow* pWin = window.second; - nFound += pWin->StartSearchAndReplace(rSearchItem); + nFound += pWin->StartSearchAndReplace( *mpSearchItem ); } } else - nFound = pCurWin->StartSearchAndReplace(rSearchItem); + nFound = pCurWin->StartSearchAndReplace( *mpSearchItem ); OUString aReplStr(IDEResId(RID_STR_SEARCHREPLACES)); aReplStr = aReplStr.replaceAll("XX", OUString::number(nFound)); @@ -133,8 +148,8 @@ void Shell::ExecuteCurrent( SfxRequest& rReq ) else { bool bCanceled = false; - nFound = pCurWin->StartSearchAndReplace(rSearchItem); - if ( !nFound && !rSearchItem.GetSelection() ) + nFound = pCurWin->StartSearchAndReplace( *mpSearchItem ); + if ( !nFound && !mpSearchItem->GetSelection() ) { // search other modules... bool bChangeCurWindow = false; @@ -176,7 +191,7 @@ void Shell::ExecuteCurrent( SfxRequest& rReq ) { if ( pCurWin ) pWin->SetSizePixel( pCurWin->GetSizePixel() ); - nFound = pWin->StartSearchAndReplace(rSearchItem, true); + nFound = pWin->StartSearchAndReplace( *mpSearchItem, true ); } if ( nFound ) { @@ -194,7 +209,7 @@ void Shell::ExecuteCurrent( SfxRequest& rReq ) pWin = nullptr; } if ( !nFound && bSearchedFromStart ) - nFound = pCurWin->StartSearchAndReplace(rSearchItem, true); + nFound = pCurWin->StartSearchAndReplace( *mpSearchItem, true ); if ( bChangeCurWindow ) SetCurWindow( pWin, true ); } @@ -208,6 +223,29 @@ void Shell::ExecuteCurrent( SfxRequest& rReq ) } rReq.Done(); + break; + } + default: + pCurWin->ExecuteCommand( rReq ); + } +} + +void Shell::ExecuteCurrent( SfxRequest& rReq ) +{ + if ( !pCurWin ) + return; + + switch ( rReq.GetSlot() ) + { + case SID_BASICIDE_HIDECURPAGE: + { + pCurWin->StoreData(); + RemoveWindow( pCurWin, false ); + } + break; + case SID_BASICIDE_RENAMECURRENT: + { + pTabBar->StartEditMode( pTabBar->GetCurPageId() ); } break; case SID_UNDO: @@ -889,10 +927,27 @@ void Shell::GetState(SfxItemSet &rSet) break; case SID_SEARCH_ITEM: { - OUString aSelected = GetSelectionText(true); - SvxSearchItem& rItem = GetExtraData()->GetSearchItem(); - rItem.SetSearchString( aSelected ); - rSet.Put( rItem ); + if ( !mpSearchItem ) + { + mpSearchItem.reset( new SvxSearchItem( SID_SEARCH_ITEM )); + mpSearchItem->SetSearchString( GetSelectionText( true )); + } + + if ( mbJustOpened && HasSelection() ) + { + OUString aText = GetSelectionText( true ); + + if ( !aText.isEmpty() ) + { + mpSearchItem->SetSearchString( aText ); + mpSearchItem->SetSelection( false ); + } + else + mpSearchItem->SetSelection( true ); + } + + mbJustOpened = false; + rSet.Put( *mpSearchItem ); } break; case SID_BASICIDE_STAT_DATE: diff --git a/basctl/source/basicide/iderdll.cxx b/basctl/source/basicide/iderdll.cxx index b80ce1f38970..7d7a6012355a 100644 --- a/basctl/source/basicide/iderdll.cxx +++ b/basctl/source/basicide/iderdll.cxx @@ -145,7 +145,6 @@ ExtraData* Dll::GetExtraData () ExtraData::ExtraData () : - pSearchItem(new SvxSearchItem(SID_SEARCH_ITEM)), bChoosingMacro(false), bShellInCriticalSection(false) { @@ -163,11 +162,6 @@ ExtraData::~ExtraData () // StarBASIC::setGlobalStarScriptListener( XEngineListenerRef() ); } -void ExtraData::SetSearchItem (const SvxSearchItem& rItem) -{ - pSearchItem.reset(static_cast<SvxSearchItem*>(rItem.Clone())); -} - IMPL_STATIC_LINK(ExtraData, GlobalBasicBreakHdl, StarBASIC *, pBasic, BasicDebugFlags) { BasicDebugFlags nRet = BasicDebugFlags::NONE; diff --git a/basctl/source/basicide/iderdll2.hxx b/basctl/source/basicide/iderdll2.hxx index 124e1d98adbc..0e1bff2be5e4 100644 --- a/basctl/source/basicide/iderdll2.hxx +++ b/basctl/source/basicide/iderdll2.hxx @@ -34,8 +34,6 @@ namespace basctl class ExtraData final { - std::unique_ptr<SvxSearchItem> pSearchItem; - LibInfo aLibInfo; EntryDescriptor m_aLastEntryDesc; @@ -60,9 +58,6 @@ public: bool& ChoosingMacro() { return bChoosingMacro; } bool& ShellInCriticalSection() { return bShellInCriticalSection; } - SvxSearchItem& GetSearchItem() const { return *pSearchItem; } - void SetSearchItem( const SvxSearchItem& rItem ); - const OUString& GetAddLibPath() const { return aAddLibPath; } void SetAddLibPath( const OUString& rPath ) { aAddLibPath = rPath; } diff --git a/basctl/source/inc/basidesh.hxx b/basctl/source/inc/basidesh.hxx index 7d8398e4e0bc..b6e8909efa65 100644 --- a/basctl/source/inc/basidesh.hxx +++ b/basctl/source/inc/basidesh.hxx @@ -26,6 +26,7 @@ #include <com/sun/star/container/XContainerListener.hpp> #include <sfx2/viewsh.hxx> #include <svx/ifaceids.hxx> +#include <svl/srchitem.hxx> #include <vcl/scrbar.hxx> #include <map> #include <memory> @@ -61,30 +62,34 @@ private: friend class LocalizationMgr; friend bool implImportDialog(weld::Window* pWin, const OUString& rCurPath, const ScriptDocument& rDocument, const OUString& rLibName); // defined in baside3.cxx - WindowTable aWindowTable; + WindowTable aWindowTable; sal_uInt16 nCurKey; - VclPtr<BaseWindow> pCurWin; + VclPtr<BaseWindow> pCurWin; ScriptDocument m_aCurDocument; OUString m_aCurLibName; std::shared_ptr<LocalizationMgr> m_pCurLocalizationMgr; - VclPtr<ScrollBar> aHScrollBar; - VclPtr<ScrollBar> aVScrollBar; - VclPtr<ScrollBarBox> aScrollBarBox; - VclPtr<TabBar> pTabBar; // basctl::TabBar - bool bCreatingWindow; + VclPtr<ScrollBar> aHScrollBar; + VclPtr<ScrollBar> aVScrollBar; + VclPtr<ScrollBarBox> aScrollBarBox; + VclPtr<TabBar> pTabBar; // basctl::TabBar + bool bCreatingWindow; + // layout windows - VclPtr<ModulWindowLayout> pModulLayout; - VclPtr<DialogWindowLayout> pDialogLayout; - // the active layout window - VclPtr<Layout> pLayout; + VclPtr<ModulWindowLayout> pModulLayout; + VclPtr<DialogWindowLayout> pDialogLayout; + VclPtr<Layout> pLayout; // the active layout window // common object catalog window - VclPtr<ObjectCatalog> aObjectCatalog; + VclPtr<ObjectCatalog> aObjectCatalog; + + bool m_bAppBasicModified; + bool mbJustOpened = false; - bool m_bAppBasicModified; DocumentEventNotifier m_aNotifier; + friend class ContainerListenerImpl; css::uno::Reference< css::container::XContainerListener > m_xLibListener; + std::unique_ptr<SvxSearchItem> mpSearchItem; void Init(); void InitTabBar(); @@ -170,6 +175,7 @@ public: void GetState( SfxItemSet& ); void ExecuteGlobal( SfxRequest& rReq ); + void ExecuteSearch( SfxRequest& rReq ); void ExecuteCurrent( SfxRequest& rReq ); void ExecuteBasic( SfxRequest& rReq ); void ExecuteDialog( SfxRequest& rReq ); |