diff options
-rw-r--r-- | basctl/source/basicide/baside2b.cxx | 24 | ||||
-rw-r--r-- | basctl/source/basicide/codecompleteoptionsdlg.cxx | 5 | ||||
-rw-r--r-- | basic/source/classes/codecompletecache.cxx | 2 | ||||
-rw-r--r-- | basic/source/classes/sbxmod.cxx | 29 | ||||
-rw-r--r-- | include/basic/codecompletecache.hxx | 16 | ||||
-rw-r--r-- | include/basic/sbmod.hxx | 20 |
6 files changed, 62 insertions, 34 deletions
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx index 8ae1d5ba7d97..a6acaea0f1ea 100644 --- a/basctl/source/basicide/baside2b.cxx +++ b/basctl/source/basicide/baside2b.cxx @@ -505,6 +505,29 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt ) // see if there is an accelerator to be processed first bool bDone = SfxViewShell::Current()->KeyInput( rKEvt ); + if( rKEvt.GetKeyCode().GetCode() == KEY_RETURN && CodeCompleteOptions::IsProcedureAutoCompleteOn() ) + {//autoclose implementation + TextSelection aSel = GetEditView()->GetSelection(); + sal_uLong nLine = aSel.GetStart().GetPara(); + OUString sActSub = GetActualSubName( nLine ); + IncompleteProcedures aProcData = rModulWindow.GetSbModule()->GetIncompleteProcedures(); + for( unsigned int i = 0; i < aProcData.size(); ++i ) + { + if( aProcData[i].sProcName == sActSub ) + {//found the procedure to autocomplete + TextPaM aEnd( aProcData[i].nLine, 0 ); + TextPaM aStart( aProcData[i].nLine, 0 ); + GetEditView()->SetSelection( TextSelection( aStart, aEnd ) ); + if( aProcData[i].aType == AutocompleteType::ACSUB ) + GetEditView()->InsertText( OUString("\nEnd Sub\n") ); + if( aProcData[i].aType == AutocompleteType::ACFUNC ) + GetEditView()->InsertText( OUString("\nEnd Function\n") ); + GetEditView()->SetSelection( aSel ); + break; + } + } + } + if( rKEvt.GetKeyCode().GetCode() == KEY_POINT && CodeCompleteOptions::IsCodeCompleteOn() ) { rModulWindow.UpdateModule(); @@ -512,7 +535,6 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt ) TextSelection aSel = GetEditView()->GetSelection(); sal_uLong nLine = aSel.GetStart().GetPara(); OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified - //OUString sActSub = GetActualSubName( nLine ); std::vector< OUString > aVect; HighlightPortions aPortions; diff --git a/basctl/source/basicide/codecompleteoptionsdlg.cxx b/basctl/source/basicide/codecompleteoptionsdlg.cxx index 6dcde740f214..0f4ab3a8cac8 100644 --- a/basctl/source/basicide/codecompleteoptionsdlg.cxx +++ b/basctl/source/basicide/codecompleteoptionsdlg.cxx @@ -41,9 +41,8 @@ CodeCompleteOptionsDlg::CodeCompleteOptionsDlg( Window* pWindow ) pCancelBtn->SetClickHdl( LINK( this, CodeCompleteOptionsDlg, CancelHdl ) ); pCodeCompleteChk->Check( CodeCompleteOptions::IsCodeCompleteOn() ); - //pAutocloseProcChk->Check( CodeCompleteOptions::IsProcedureAutoCompleteOn() ); + pAutocloseProcChk->Check( CodeCompleteOptions::IsProcedureAutoCompleteOn() ); - pAutocloseProcChk->Enable( false ); pAutocloseBracesChk->Enable( false ); pAutocloseQuotesChk->Enable( false ); } @@ -55,7 +54,7 @@ CodeCompleteOptionsDlg::~CodeCompleteOptionsDlg() IMPL_LINK_NOARG(CodeCompleteOptionsDlg, OkHdl) { CodeCompleteOptions::SetCodeCompleteOn( pCodeCompleteChk->IsChecked() ); - //CodeCompleteOptions::SetProcedureAutoCompleteOn( pCodeCompleteChk->IsChecked() ); + CodeCompleteOptions::SetProcedureAutoCompleteOn( pAutocloseProcChk->IsChecked() ); Close(); return 0; } diff --git a/basic/source/classes/codecompletecache.cxx b/basic/source/classes/codecompletecache.cxx index 952e4ee7538a..51eee1c84c0a 100644 --- a/basic/source/classes/codecompletecache.cxx +++ b/basic/source/classes/codecompletecache.cxx @@ -28,7 +28,7 @@ namespace CodeCompleteOptions::CodeCompleteOptions() : bIsCodeCompleteOn( false ), -bIsProcedureAutoCompleteOn( false ) +bIsProcedureAutoCompleteOn( true ) { } diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx index 694fbf338fe0..fa04809b7c54 100644 --- a/basic/source/classes/sbxmod.cxx +++ b/basic/source/classes/sbxmod.cxx @@ -894,6 +894,10 @@ void SbModule::SetSource32( const OUString& r ) StartDefinitions(); SbiTokenizer aTok( r ); aTok.SetCompatible( IsVBACompat() ); + if( CodeCompleteOptions::IsProcedureAutoCompleteOn() ) + { + aIncompleteProcs.clear(); + } while( !aTok.IsEof() ) { SbiToken eEndTok = NIL; @@ -976,24 +980,29 @@ void SbModule::SetSource32( const OUString& r ) if( aTok.IsEof() ) { pMeth->nLine2 = aTok.GetLine(); - std::cerr << "EOF reached, no end for "<< sMethName <<", line " << aTok.GetLine() << std::endl; - //std::cerr << "write end to: " << aOUSource.getLength() / pMeth->nLine2 << std::endl; - sal_Int32 nPos=0; - sal_Int32 nCounter = 0; - std::cerr << "source length: " << aOUSource.getLength() << std::endl; - for(sal_uInt32 i=0; i < aOUSource.getLength() ; ++i) + if( CodeCompleteOptions::IsProcedureAutoCompleteOn() ) { - nPos++; - if( aOUSource[i] == '\n' && nCounter != aTok.GetLine() ) - nCounter++; + IncompleteProcData aProcData; + aProcData.sProcName = sMethName; + aProcData.nLine = pMeth->nLine2; + + if( eEndTok == ENDSUB ) + aProcData.aType = ACSUB; + if( eEndTok == ENDFUNC ) + aProcData.aType = ACFUNC; + aIncompleteProcs.push_back(aProcData); } - std::cerr << "newline index: " << nPos << std::endl; } } } EndDefinitions( sal_True ); } +IncompleteProcedures SbModule::GetIncompleteProcedures() const +{ + return aIncompleteProcs; +} + // Broadcast of a hint to all Basics static void _SendHint( SbxObject* pObj, sal_uIntPtr nId, SbMethod* p ) diff --git a/include/basic/codecompletecache.hxx b/include/basic/codecompletecache.hxx index 480c3c1dcf4c..e03c0576fdb7 100644 --- a/include/basic/codecompletecache.hxx +++ b/include/basic/codecompletecache.hxx @@ -27,12 +27,26 @@ #include <boost/unordered_map.hpp> #include <rtl/ustring.hxx> #include <svtools/miscopt.hxx> +#include <vector> + +enum BASIC_DLLPUBLIC AutocompleteType +{ + ACSUB, + ACFUNC +}; + +struct IncompleteProcData +{ + OUString sProcName; + sal_uInt16 nLine; + AutocompleteType aType; +}; typedef boost::unordered_map< OUString, OUString, OUStringHash > CodeCompleteVarTypes; /* variable name, type */ typedef boost::unordered_map< OUString, CodeCompleteVarTypes, OUStringHash > CodeCompleteVarScopes; /* procedure, CodeCompleteVarTypes */ - +typedef std::vector< IncompleteProcData > IncompleteProcedures; class BASIC_DLLPUBLIC CodeCompleteOptions { diff --git a/include/basic/sbmod.hxx b/include/basic/sbmod.hxx index b3e694bf624c..dbf3e69fb115 100644 --- a/include/basic/sbmod.hxx +++ b/include/basic/sbmod.hxx @@ -45,24 +45,6 @@ class ModuleInitDependencyMap; struct ClassModuleRunInitItem; struct SbClassData; -/* -struct CodeCompleteData -{ - OUString sVarName; - OUString sVarParent; - OUString sVarType; - - inline bool operator==( const CodeCompleteData& aOther ) - { - return (sVarName == aOther.sVarName && sVarParent == aOther.sVarParent); - } - - inline bool IsGlobal() const - { - return ( sVarParent == OUString("") ); - } -};*/ - class BASIC_DLLPUBLIC SbModule : public SbxObject, private ::boost::noncopyable { friend class SbiCodeGen; @@ -74,6 +56,7 @@ class BASIC_DLLPUBLIC SbModule : public SbxObject, private ::boost::noncopyable std::vector< OUString > mModuleVariableNames; BASIC_DLLPRIVATE void implClearIfVarDependsOnDeletedBasic( SbxVariable* pVar, StarBASIC* pDeletedBasic ); + IncompleteProcedures aIncompleteProcs; protected: com::sun::star::uno::Reference< com::sun::star::script::XInvocation > mxWrapper; @@ -155,6 +138,7 @@ public: //CodeCompleteDataCache GetCodeCompleteDataFromParse(); void GetCodeCompleteDataFromParse(CodeCompleteDataCache& aCache); SbxArrayRef GetMethods(); + IncompleteProcedures GetIncompleteProcedures() const; }; SV_DECL_IMPL_REF(SbModule) |