GSOC work, show the cursor when typing 2

There are two cases:
a) TextView in focus: cursor is visible, typing works, except the arrow keys are not working for the ListBox
b) ListBox in focus: no cursor, everything works

Change-Id: Iaaec69c04370e4d05e226abeecd420bf4d4f52cd
This commit is contained in:
Gergo Mocsi 2013-08-02 12:32:13 +02:00
parent cbd61c3047
commit a1c1e89e43
2 changed files with 81 additions and 0 deletions

View File

@ -76,6 +76,7 @@ void setTextEngineText (ExtTextEngine&, OUString const&);
class EditorWindow : public Window, public SfxListener
{
friend class CodeCompleteListBox;
private:
class ChangesListener;
@ -475,6 +476,7 @@ private:
class CodeCompleteListBox: public ListBox
{
friend class CodeCompleteWindow;
friend class EditorWindow;
private:
OUStringBuffer aFuncBuffer;
/* a buffer to build up function name when typing
@ -489,9 +491,12 @@ public:
void InsertSelectedEntry(); //insert the selected entry
DECL_LINK(ImplDoubleClickHdl, void*);
//DECL_LINK(ImplSelectionChangeHdl, void*);
virtual long PreNotify( NotifyEvent& rNEvt );
protected:
virtual void KeyInput( const KeyEvent& rKeyEvt );
};
class CodeCompleteWindow: public Window
@ -519,6 +524,9 @@ public:
* clears if typed anything, then hides
* the window, clear internal variables
* */
OUStringBuffer& GetListBoxBuffer();
void SetVisibleEntries(); // sets the visible entries based on aFuncBuffer variable
CodeCompleteListBox* GetListBox(){return pListBox;}
};

View File

@ -508,6 +508,13 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
// see if there is an accelerator to be processed first
bool bDone = SfxViewShell::Current()->KeyInput( rKEvt );
//sal_Unicode aChar = rKEvt.GetKeyCode().GetCode();
if( pCodeCompleteWnd->IsVisible() )
{
std::cerr << "EditorWindow::KeyInput" << std::endl;
pCodeCompleteWnd->GetListBox()->KeyInput(rKEvt);
}
if( (rKEvt.GetKeyCode().GetCode() == KEY_SPACE ||
rKEvt.GetKeyCode().GetCode() == KEY_TAB ||
rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) && CodeCompleteOptions::IsAutoCorrectKeywordsOn() )
@ -763,6 +770,7 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
pCodeCompleteWnd->ResizeListBox();
pCodeCompleteWnd->SelectFirstEntry();
pEditView->GetWindow()->GrabFocus();
//pEditView->EnableCursor( true );
}
}
}
@ -2544,6 +2552,7 @@ CodeCompleteListBox::CodeCompleteListBox( CodeCompleteWindow* pPar )
pCodeCompleteWindow( pPar )
{
SetDoubleClickHdl(LINK(this, CodeCompleteListBox, ImplDoubleClickHdl));
//SetSelectHdl(LINK(this, CodeCompleteListBox, ImplSelectionChangeHdl));
}
IMPL_LINK_NOARG(CodeCompleteListBox, ImplDoubleClickHdl)
@ -2552,6 +2561,12 @@ IMPL_LINK_NOARG(CodeCompleteListBox, ImplDoubleClickHdl)
return 0;
}
/*IMPL_LINK_NOARG(CodeCompleteListBox, ImplSelectionChangeHdl)
{
pCodeCompleteWindow->pParent->GrabFocus();
return 0;
}*/
void CodeCompleteListBox::InsertSelectedEntry()
{
if( !aFuncBuffer.toString().isEmpty() )
@ -2592,6 +2607,7 @@ long CodeCompleteListBox::PreNotify( NotifyEvent& rNEvt )
{
if( rNEvt.GetType() == EVENT_KEYINPUT )
{
std::cerr << "CodeCompleteListBox::PreNotify" << std::endl;
KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
sal_Unicode aChar = aKeyEvt.GetKeyCode().GetCode();
if( ( aChar >= KEY_A ) && ( aChar <= KEY_Z ) )
@ -2599,6 +2615,7 @@ long CodeCompleteListBox::PreNotify( NotifyEvent& rNEvt )
pCodeCompleteWindow->pParent->GetEditView()->InsertText( OUString(aKeyEvt.GetCharCode()) );
aFuncBuffer.append(aKeyEvt.GetCharCode());
SetVisibleEntries();
//pCodeCompleteWindow->pParent->GetEditView()->GetWindow()->GrabFocus();
return 0;
}
else
@ -2635,9 +2652,13 @@ long CodeCompleteListBox::PreNotify( NotifyEvent& rNEvt )
case KEY_RETURN:
InsertSelectedEntry();
return 0;
/*case KEY_UP: case KEY_DOWN:
std::cerr << "up/down ke in PreNotify" << std::endl;
break;*/
}
}
}
//pCodeCompleteWindow->pParent->GrabFocus();
return ListBox::PreNotify( rNEvt );
}
@ -2654,6 +2675,48 @@ void CodeCompleteListBox::SetVisibleEntries()
}
}
void CodeCompleteListBox::KeyInput( const KeyEvent& rKeyEvt )
{
std::cerr << "CodeCompleteListBox::KeyInput" << std::endl;
//pCodeCompleteWindow->pParent->GetEditView()->KeyInput( rKeyEvt );
sal_Unicode aChar = rKeyEvt.GetKeyCode().GetCode();
if( ( aChar >= KEY_A ) && ( aChar <= KEY_Z ) )
{
//pCodeCompleteWindow->pParent->GetEditView()->InsertText( OUString(rKeyEvt.GetCharCode()) );
aFuncBuffer.append(rKeyEvt.GetCharCode());
SetVisibleEntries();
}
else
{
switch( aChar )
{
case KEY_ESCAPE: // hide, do nothing
pCodeCompleteWindow->ClearAndHide();
break;
case KEY_TAB: case KEY_SPACE:
pCodeCompleteWindow->Hide();
pCodeCompleteWindow->pParent->GetEditView()->SetSelection( pCodeCompleteWindow->pParent->GetEditView()->CursorEndOfLine(pCodeCompleteWindow->GetTextSelection().GetStart()) );
pCodeCompleteWindow->pParent->GrabFocus();
break;
case KEY_BACKSPACE: case KEY_DELETE:
if( aFuncBuffer.toString() != OUString("") )
{
aFuncBuffer = aFuncBuffer.remove(aFuncBuffer.getLength()-1, 1);
SetVisibleEntries();
}
else
{
pCodeCompleteWindow->ClearAndHide();
}
break;
case KEY_RETURN:
InsertSelectedEntry();
break;
}
}
ListBox::KeyInput(rKeyEvt);
}
CodeCompleteWindow::CodeCompleteWindow( EditorWindow* pPar )
: Window( pPar ),
pParent( pPar ),
@ -2663,6 +2726,11 @@ pListBox( new CodeCompleteListBox(this) )
InitListBox();
}
OUStringBuffer& CodeCompleteWindow::GetListBoxBuffer()
{
return pListBox->aFuncBuffer;
}
void CodeCompleteWindow::InitListBox()
{
pListBox->SetSizePixel( Size(150,150) ); //default, this will adopt the line length
@ -2754,6 +2822,11 @@ void CodeCompleteWindow::ClearAndHide()
pParent->GrabFocus();
}
void CodeCompleteWindow::SetVisibleEntries()
{
pListBox->SetVisibleEntries();
}
} // namespace basctl
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */