Author: stippi Date: Tue May 18 18:59:34 2010 New Revision: 501 URL: http://mmlr.dyndns.org/changeset/501 Log: Extend the auto-completion framework in order to support using page-up/down to navigate the choices list. Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.cpp webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.h webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.cpp webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.h webkit/trunk/WebKit/haiku/WebPositive/autocompletion/TextViewCompleter.cpp Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.cpp ============================================================================== --- webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.cpp Tue May 18 16:59:34 2010 (r500) +++ webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.cpp Tue May 18 18:59:34 2010 (r501) @@ -158,6 +158,36 @@ } +int32 +BAutoCompleter::CountChoices() const +{ + if (fCompletionStyle && fCompletionStyle->GetChoiceModel()) + return fCompletionStyle->GetChoiceModel()->CountChoices(); + else + return 0; +} + + +int32 +BAutoCompleter::CountVisibleChoices() const +{ + if (fCompletionStyle && fCompletionStyle->GetChoiceView()) + return fCompletionStyle->GetChoiceView()->CountVisibleChoices(); + else + return 0; +} + + +int32 +BAutoCompleter::SelectedChoiceIndex() const +{ + if (fCompletionStyle) + return fCompletionStyle->SelectedChoiceIndex(); + else + return -1; +} + + void BAutoCompleter::ApplyChoice(bool hideChoices) { Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.h ============================================================================== --- webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.h Tue May 18 16:59:34 2010 (r500) +++ webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleter.h Tue May 18 18:59:34 2010 (r501) @@ -83,6 +83,7 @@ = 0; virtual void HideChoices() = 0; virtual bool ChoicesAreShown() = 0; + virtual int32 CountVisibleChoices() const = 0; }; class CompletionStyle { @@ -97,6 +98,7 @@ virtual bool SelectNext(bool wrap = false) = 0; virtual bool SelectPrevious(bool wrap = false) = 0; virtual bool IsChoiceSelected() const = 0; + virtual int32 SelectedChoiceIndex() const = 0; virtual void ApplyChoice(bool hideChoices = true) = 0; virtual void CancelChoice() = 0; @@ -137,6 +139,9 @@ bool SelectNext(bool wrap = false); bool SelectPrevious(bool wrap = false); bool IsChoiceSelected() const; + int32 CountChoices() const; + int32 CountVisibleChoices() const; + int32 SelectedChoiceIndex() const; void ApplyChoice(bool hideChoices = true); void CancelChoice(); Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.cpp ============================================================================== --- webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.cpp Tue May 18 16:59:34 2010 (r500) +++ webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.cpp Tue May 18 18:59:34 2010 (r501) @@ -105,6 +105,13 @@ } +int32 +BDefaultCompletionStyle::SelectedChoiceIndex() const +{ + return fSelectedIndex; +} + + void BDefaultCompletionStyle::ApplyChoice(bool hideChoices) { @@ -187,13 +194,13 @@ // #pragma mark - BDefaultChoiceView::ListView -static const int32 BM_INVOKED = 'bmin'; +static const int32 MSG_INVOKED = 'invk'; BDefaultChoiceView::ListView::ListView( BAutoCompleter::CompletionStyle* completer) : - BListView(BRect(0,0,100,100), "ChoiceViewList"), + BListView(BRect(0, 0, 100, 100), "ChoiceViewList"), fCompleter(completer) { // we need to check if user clicks outside of window-bounds: @@ -205,7 +212,7 @@ BDefaultChoiceView::ListView::AttachedToWindow() { SetTarget(this); - SetInvocationMessage(new BMessage(BM_INVOKED)); + SetInvocationMessage(new BMessage(MSG_INVOKED)); BListView::AttachedToWindow(); } @@ -221,7 +228,7 @@ BDefaultChoiceView::ListView::MessageReceived(BMessage* message) { switch(message->what) { - case BM_INVOKED: + case MSG_INVOKED: fCompleter->ApplyChoice(); break; default: @@ -316,7 +323,8 @@ BDefaultChoiceView::BDefaultChoiceView() : fWindow(NULL), - fListView(NULL) + fListView(NULL), + fMaxVisibleChoices(5) { } @@ -359,7 +367,7 @@ fListView = new ListView(completer); int32 count = choiceModel->CountChoices(); - for(int32 i=0; i<count; ++i) { + for(int32 i = 0; i<count; ++i) { fListView->AddItem( new ListItem(choiceModel->ChoiceAt(i)) ); @@ -370,7 +378,7 @@ | B_AVOID_FOCUS | B_ASYNCHRONOUS_CONTROLS); fWindow->AddChild(fListView); - int32 visibleCount = min_c(count, 5); + int32 visibleCount = min_c(count, fMaxVisibleChoices); float listHeight = fListView->ItemFrame(visibleCount - 1).bottom + 1; BRect pvRect = editView->GetAdjustmentFrame(); @@ -407,3 +415,31 @@ return (fWindow != NULL); } + +int32 +BDefaultChoiceView::CountVisibleChoices() const +{ + return min_c(fMaxVisibleChoices, fListView->CountItems()); +} + + +void +BDefaultChoiceView::SetMaxVisibleChoices(int32 choices) +{ + if (choices < 1) + choices = 1; + if (choices == fMaxVisibleChoices) + return; + + fMaxVisibleChoices = choices; + + // TODO: Update live? +} + + +int32 +BDefaultChoiceView::MaxVisibleChoices() const +{ + return fMaxVisibleChoices; +} + Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.h ============================================================================== --- webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.h Tue May 18 16:59:34 2010 (r500) +++ webkit/trunk/WebKit/haiku/WebPositive/autocompletion/AutoCompleterDefaultImpl.h Tue May 18 18:59:34 2010 (r501) @@ -35,6 +35,7 @@ virtual bool SelectNext(bool wrap = false); virtual bool SelectPrevious(bool wrap = false); virtual bool IsChoiceSelected() const; + virtual int32 SelectedChoiceIndex() const; virtual void ApplyChoice(bool hideChoices = true); virtual void CancelChoice(); @@ -60,6 +61,7 @@ virtual void MessageReceived(BMessage* msg); virtual void MouseDown(BPoint point); virtual void AttachedToWindow(); + private: BAutoCompleter::CompletionStyle* fCompleter; }; @@ -84,10 +86,15 @@ BAutoCompleter::CompletionStyle* completer); virtual void HideChoices(); virtual bool ChoicesAreShown(); + virtual int32 CountVisibleChoices() const; + + void SetMaxVisibleChoices(int32 choices); + int32 MaxVisibleChoices() const; private: BWindow* fWindow; ListView* fListView; + int32 fMaxVisibleChoices; }; #endif // _AUTO_COMPLETER_DEFAULT_IMPL_H Modified: webkit/trunk/WebKit/haiku/WebPositive/autocompletion/TextViewCompleter.cpp ============================================================================== --- webkit/trunk/WebKit/haiku/WebPositive/autocompletion/TextViewCompleter.cpp Tue May 18 16:59:34 2010 (r500) +++ webkit/trunk/WebKit/haiku/WebPositive/autocompletion/TextViewCompleter.cpp Tue May 18 18:59:34 2010 (r501) @@ -122,6 +122,23 @@ // See above. ApplyChoice(false); return B_SKIP_MESSAGE; + case B_PAGE_UP: + { + int32 index = SelectedChoiceIndex() - CountVisibleChoices(); + index = max_c(index, 0); + Select(index); + ApplyChoice(false); + return B_SKIP_MESSAGE; + } + case B_PAGE_DOWN: + { + int32 index = SelectedChoiceIndex() + CountVisibleChoices(); + index = min_c(index, CountChoices() - 1); + Select(index); + ApplyChoice(false); + return B_SKIP_MESSAGE; + } + case B_ESCAPE: CancelChoice(); return B_SKIP_MESSAGE;