diff options
author | Gergo Mocsi <gmocsi91@gmail.com> | 2013-07-15 15:14:23 +0200 |
---|---|---|
committer | Gergo Mocsi <gmocsi91@gmail.com> | 2013-09-02 18:16:44 +0200 |
commit | 5d95448341b155a55954e5d4ac8c5e07cc526f2e (patch) | |
tree | 9be8b03d0ede3de51c63da561cc7c037f391b375 /basctl | |
parent | 5dc05ade53891f67f781e18cd4909a21231bf9d2 (diff) |
GSOC work, Window instead a FloatingWindow
Changed CodeCompleteListBox into a Window which contains a single ListBox.
Navigation with arrows is enabled, window closes on ESC key.
Double click inserts the selected method into the source code.
Visible line count in ListBox is set to 8 lines, width is adopted from the
longest entry.
Change-Id: I6b6ceb0ce78f9fc727aed53952dc6ee24cba47df
Diffstat (limited to 'basctl')
-rw-r--r-- | basctl/source/basicide/baside2.hxx | 30 | ||||
-rw-r--r-- | basctl/source/basicide/baside2b.cxx | 96 |
2 files changed, 115 insertions, 11 deletions
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx index e949a192f086..3d8afde0d1ed 100644 --- a/basctl/source/basicide/baside2.hxx +++ b/basctl/source/basicide/baside2.hxx @@ -51,6 +51,9 @@ class SvxSearchItem; #include <set> #include <boost/scoped_ptr.hpp> +#include <vcl/floatwin.hxx> +#include <vcl/textdata.hxx> + namespace com { namespace sun { namespace star { namespace beans { class XMultiPropertySet; } } } } @@ -60,6 +63,7 @@ namespace basctl class ObjectCatalog; class CodeCompleteListBox; +class CodeCompleteFloatWindow; DBG_NAMEEX( ModulWindow ) @@ -112,7 +116,8 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > GetComponentInterface(sal_Bool bCreate = true); std::vector< CodeCompleteData > aCodeCompleteCache; - CodeCompleteListBox* aListBox; + CodeCompleteFloatWindow* pCodeCompleteWnd; + //CodeCompleteListBox* aListBox; OUString GetActualSubName( sal_uLong nLine ); // gets the actual subroutine name according to line number std::vector< OUString > Split( const OUString& sStr, const sal_Unicode& aChar ); @@ -469,6 +474,29 @@ private: } aSyntaxColors; }; +class CodeCompleteFloatWindow: public Window +{ +private: + EditorWindow* pParent; // parent window + TextSelection aTextSelection; + ListBox* pListBox; + + void InitListBox(); // initialize the ListBox + DECL_LINK(ImplDoubleClickHdl, void*); + +public: + CodeCompleteFloatWindow( EditorWindow* pPar ); + virtual ~CodeCompleteFloatWindow(); + + void InsertEntry( const OUString& aStr ); + void ClearListBox(); + void SetTextSelection( const TextSelection& aSel ); + void ResizeListBox(); + +protected: + virtual void KeyInput( const KeyEvent& rKeyEvt ); +}; + class CodeCompleteListBox: public ListBox { private: diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx index 00dcf754b984..585f7dcb6039 100644 --- a/basctl/source/basicide/baside2b.cxx +++ b/basctl/source/basicide/baside2b.cxx @@ -250,7 +250,9 @@ EditorWindow::EditorWindow (Window* pParent, ModulWindow* pModulWindow) : s[0] = OUString( "FontHeight" ); s[1] = OUString( "FontName" ); n->addPropertiesChangeListener(s, listener_.get()); - aListBox = new CodeCompleteListBox(this); + //aListBox = new CodeCompleteListBox(this); + //pCodeCopleteWnd = new CodeCompleteFloatWindow(this); + pCodeCompleteWnd = new CodeCompleteFloatWindow( this ); } @@ -272,7 +274,9 @@ EditorWindow::~EditorWindow() EndListening( *pEditEngine ); pEditEngine->RemoveView(pEditView.get()); } - delete aListBox; + + //delete aListBox; + delete pCodeCompleteWnd; } OUString EditorWindow::GetWordAtCursor() @@ -576,17 +580,21 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt ) if( aMethods.getLength() != 0 ) { Rectangle aRect = ( (TextEngine*) GetEditEngine() )->PaMtoEditCursor( aSel.GetEnd() , false ); - aListBox->SetPosPixel( aRect.TopLeft() ); - aListBox->SetSizePixel( Size(150,150) ); + GetEditView()->EnableCursor( false ); + + aSel.GetStart().GetIndex() += 1; + aSel.GetEnd().GetIndex() += 1; + pCodeCompleteWnd->ClearListBox(); + pCodeCompleteWnd->SetTextSelection(aSel); + pCodeCompleteWnd->SetPosPixel( aRect.BottomRight() ); for(sal_Int32 l = 0; l < aMethods.getLength(); ++l) { - aListBox->InsertEntry( OUString(aMethods[l]->getName()) ); - std::cerr << aMethods[l]->getName() << std::endl; + pCodeCompleteWnd->InsertEntry( OUString(aMethods[l]->getName()) ); } - - aListBox->GetFocus(); - aListBox->ToggleDropDown(); + pCodeCompleteWnd->ResizeListBox(); + pCodeCompleteWnd->Show(); + pCodeCompleteWnd->GrabFocus(); } } } @@ -2377,10 +2385,11 @@ void WatchTreeListBox::UpdateWatches( bool bBasicStopped ) } CodeCompleteListBox::CodeCompleteListBox(EditorWindow* pPar) -: ListBox(pPar, WB_DROPDOWN), +: ListBox(pPar, WB_DROPDOWN | WB_BORDER), pParent(pPar) { SetSelectHdl( LINK(this, CodeCompleteListBox, ImplSelectHdl) ); + SetDropDownLineCount( 8 ); } CodeCompleteListBox::~CodeCompleteListBox() @@ -2395,6 +2404,73 @@ IMPL_LINK_NOARG(CodeCompleteListBox, ImplSelectHdl) return 0; } +CodeCompleteFloatWindow::CodeCompleteFloatWindow( EditorWindow* pPar ) +: Window( pPar, WB_BORDER | WB_SYSTEMWINDOW | WB_NOSHADOW ), +pParent(pPar) +{ + InitListBox(); + SetSizePixel( Size(150,150) ); +} + +void CodeCompleteFloatWindow::InitListBox() +{ + pListBox = new ListBox( this ); + pListBox->SetSizePixel( Size(150,150) ); //default, this will adopt the line length + pListBox->SetDoubleClickHdl(LINK(this, CodeCompleteFloatWindow, ImplDoubleClickHdl)); + pListBox->Show(); +} + +CodeCompleteFloatWindow::~CodeCompleteFloatWindow() +{ + delete pListBox; +} + +void CodeCompleteFloatWindow::InsertEntry( const OUString& aStr ) +{ + pListBox->InsertEntry( aStr ); +} + +void CodeCompleteFloatWindow::ClearListBox() +{ + pListBox->Clear(); +} + +IMPL_LINK_NOARG(CodeCompleteFloatWindow, ImplDoubleClickHdl) +{ + if( pListBox->GetEntry( pListBox->GetSelectEntryPos() ) != OUString("") ) + { + pParent->GetEditView()->SetSelection( aTextSelection ); + pParent->GetEditView()->InsertText( (OUString) pListBox->GetEntry(pListBox->GetSelectEntryPos()) ); + pParent->GetEditView()->EnableCursor( true ); + LoseFocus(); + Hide(); + } + return 0; +} + +void CodeCompleteFloatWindow::KeyInput( const KeyEvent& rKeyEvt ) +{ + if( rKeyEvt.GetKeyCode().GetCode() == KEY_ESCAPE ) + {// ESC key closes the window: does not modify anything + pParent->GetEditView()->EnableCursor( true ); + Hide(); + } +} + +void CodeCompleteFloatWindow::SetTextSelection( const TextSelection& aSel ) +{ + aTextSelection = aSel; +} + +void CodeCompleteFloatWindow::ResizeListBox() +{ + Size aSize = pListBox->CalcMinimumSize(); + const Font& aFont = pListBox->GetUnzoomedControlPointFont(); + aSize.setHeight( aFont.GetSize().getHeight() * 16 ); + pListBox->SetSizePixel( aSize ); + SetSizePixel( aSize ); +} + } // namespace basctl /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |