summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Yin <steve_y@apache.org>2013-11-25 13:15:27 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-11-25 14:12:36 +0000
commit79c0027c88fb64ffa7bbefcab2e291852733c223 (patch)
tree11b5f409b6c01064e37ad6fbb56d6b61edb745b4
parent57917b0c136520b478299f581bcd99ad5610c203 (diff)
Integrate branch of IAccessible2
Change-Id: I8c2fea0367ebfa53ce5e109ef48fd661cbfb78b3
-rw-r--r--include/vcl/combobox.hxx5
-rw-r--r--include/vcl/lstbox.hxx4
-rw-r--r--include/vcl/menu.hxx9
-rw-r--r--vcl/inc/ilstbox.hxx14
-rw-r--r--vcl/source/control/combobox.cxx12
-rw-r--r--vcl/source/control/edit.cxx31
-rw-r--r--vcl/source/control/ilstbox.cxx21
-rw-r--r--vcl/source/control/lstbox.cxx33
-rw-r--r--vcl/source/control/morebtn.cxx5
-rw-r--r--vcl/source/control/tabctrl.cxx3
-rw-r--r--vcl/source/window/btndlg.cxx7
-rw-r--r--vcl/source/window/dlgctrl.cxx8
-rw-r--r--vcl/source/window/menu.cxx48
-rw-r--r--vcl/source/window/toolbox.cxx5
-rw-r--r--vcl/source/window/toolbox2.cxx3
15 files changed, 176 insertions, 32 deletions
diff --git a/include/vcl/combobox.hxx b/include/vcl/combobox.hxx
index 6f9c5343ea0f..76533ab7ce16 100644
--- a/include/vcl/combobox.hxx
+++ b/include/vcl/combobox.hxx
@@ -74,6 +74,7 @@ private:
DECL_DLLPRIVATE_LINK( ImplSelectionChangedHdl, void* );
DECL_DLLPRIVATE_LINK( ImplUserDrawHdl, UserDrawEvent* );
DECL_DLLPRIVATE_LINK( ImplAutocompleteHdl, Edit* );
+ DECL_DLLPRIVATE_LINK( ImplListItemSelectHdl , void* );
protected:
using Window::ImplInit;
@@ -178,8 +179,8 @@ public:
void SetMRUEntries( const OUString& rEntries, sal_Unicode cSep = ';' );
OUString GetMRUEntries( sal_Unicode cSep = ';' ) const;
void SetMaxMRUCount( sal_uInt16 n );
- sal_uInt16 GetMaxMRUCount() const;
-
+ sal_uInt16 GetMaxMRUCount() const;
+ sal_uInt16 GetMRUCount() const;
void SetEntryData( sal_uInt16 nPos, void* pNewData );
void* GetEntryData( sal_uInt16 nPos ) const;
diff --git a/include/vcl/lstbox.hxx b/include/vcl/lstbox.hxx
index 6b3ab8c105dd..cc63c2fdd452 100644
--- a/include/vcl/lstbox.hxx
+++ b/include/vcl/lstbox.hxx
@@ -63,7 +63,8 @@ private:
DECL_DLLPRIVATE_LINK( ImplPopupModeEndHdl, void* );
DECL_DLLPRIVATE_LINK( ImplSelectionChangedHdl, void* );
DECL_DLLPRIVATE_LINK( ImplUserDrawHdl, UserDrawEvent* );
-
+ DECL_DLLPRIVATE_LINK( ImplFocusHdl, void* );
+ DECL_DLLPRIVATE_LINK( ImplListItemSelectHdl, void* );
protected:
using Window::ImplInit;
SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle );
@@ -198,6 +199,7 @@ public:
Size CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const;
void GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const;
+ sal_uInt16 GetMRUCount() const;
sal_uInt16 GetDisplayLineCount() const;
void EnableMirroring();
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index 637c701171e9..513187233039 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -134,6 +134,8 @@ private:
sal_uInt16 nDefaultItem; // Id of default item
sal_uInt16 nSelectedId;
+ sal_uInt16 nHighlightedItem;
+
// for output:
sal_uInt16 nImgOrChkPos;
sal_uInt16 nTextPos;
@@ -234,6 +236,13 @@ public:
sal_uInt16 GetCurItemId() const;
OString GetCurItemIdent() const;
+ void SetHightlightItem(sal_uInt16 nHighlightedItem);
+ sal_uInt16 GetHighlightItem() const;
+
+ OUString GetItemAccKeyStrFromPos(sal_uInt16 nPos) const;
+
+ sal_Bool IsTemporaryItemFromPos(sal_uInt16 nPos) const;
+
void SetDefaultItem( sal_uInt16 nItemId ) { nDefaultItem = nItemId; }
sal_uInt16 GetDefaultItem() const { return nDefaultItem; }
diff --git a/vcl/inc/ilstbox.hxx b/vcl/inc/ilstbox.hxx
index 315f4ce0f1df..18dfee8bebcb 100644
--- a/vcl/inc/ilstbox.hxx
+++ b/vcl/inc/ilstbox.hxx
@@ -253,6 +253,8 @@ private:
Link maDoubleClickHdl;
Link maUserDrawHdl;
Link maMRUChangedHdl;
+ Link maFocusHdl;
+ Link maListItemSelectHdl;
::vcl::QuickSelectionEngine maQuickSelectionEngine;
@@ -266,7 +268,7 @@ protected:
virtual void GetFocus();
virtual void LoseFocus();
- sal_Bool SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False );
+ sal_Bool SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False, sal_Bool bSelectPosChange = sal_False );
void ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false );
void ImplDoPaint( const Rectangle& rRect, bool bLayout = false );
void ImplCalcMetrics();
@@ -363,9 +365,13 @@ public:
const Link& GetUserDrawHdl() const { return maUserDrawHdl; }
void SetMRUChangedHdl( const Link& rLink ) { maMRUChangedHdl = rLink; }
const Link& GetMRUChangedHdl() const { return maMRUChangedHdl; }
+ void SetFocusHdl( const Link& rLink ) { maFocusHdl = rLink ; }
+ const Link& GetFocusHdl() const { return maFocusHdl; }
+ void SetListItemSelectHdl( const Link& rLink ) { maListItemSelectHdl = rLink ; }
+ const Link& GetListItemSelectHdl() const { return maListItemSelectHdl; }
bool IsSelectionChanged() const { return mbSelectionChanged; }
- sal_uInt16 GetSelectModifier() const { return mnSelectModifier; }
+ sal_uInt16 GetSelectModifier() const { return mnSelectModifier; }
void EnableSort( bool b ) { mbSort = b; }
@@ -499,6 +505,10 @@ public:
void SetUserDrawHdl( const Link& rLink ) { maLBWindow.SetUserDrawHdl( rLink ); }
const Link& GetUserDrawHdl() const { return maLBWindow.GetUserDrawHdl(); }
+ void SetFocusHdl( const Link& rLink ) { maLBWindow.SetFocusHdl( rLink ); }
+ const Link& GetFocusHdl() const { return maLBWindow.GetFocusHdl(); }
+ void SetListItemSelectHdl( const Link& rLink ) { maLBWindow.SetListItemSelectHdl( rLink ); }
+ const Link& GetListItemSelectHdl() const { return maLBWindow.GetListItemSelectHdl(); }
void SetSelectionChangedHdl( const Link& rLnk ) { maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); }
void SetCallSelectionChangedHdl( sal_Bool bCall ) { maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
sal_Bool IsSelectionChanged() const { return maLBWindow.IsSelectionChanged(); }
diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx
index bb304b123532..214bbf53f527 100644
--- a/vcl/source/control/combobox.cxx
+++ b/vcl/source/control/combobox.cxx
@@ -205,6 +205,7 @@ void ComboBox::ImplInit( Window* pParent, WinBits nStyle )
mpImplLB->SetDoubleClickHdl( LINK( this, ComboBox, ImplDoubleClickHdl ) );
mpImplLB->SetUserDrawHdl( LINK( this, ComboBox, ImplUserDrawHdl ) );
mpImplLB->SetSelectionChangedHdl( LINK( this, ComboBox, ImplSelectionChangedHdl ) );
+ mpImplLB->SetListItemSelectHdl( LINK( this, ComboBox, ImplListItemSelectHdl ) );
mpImplLB->Show();
if ( mpFloatWin )
@@ -460,7 +461,11 @@ IMPL_LINK_NOARG(ComboBox, ImplSelectHdl)
return 0;
}
-// -----------------------------------------------------------------------
+IMPL_LINK( ComboBox, ImplListItemSelectHdl, void*, EMPTYARG )
+{
+ ImplCallEventListeners( VCLEVENT_LISTBOX_SELECT );
+ return 1;
+}
IMPL_LINK_NOARG(ComboBox, ImplCancelHdl)
{
@@ -1364,6 +1369,11 @@ sal_uInt16 ComboBox::GetMaxMRUCount() const
return mpImplLB->GetMaxMRUCount();
}
+sal_uInt16 ComboBox::GetMRUCount() const
+{
+ return mpImplLB->GetEntryList()->GetMRUCount();
+}
+
// -----------------------------------------------------------------------
sal_uInt16 ComboBox::GetDisplayLineCount() const
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index 98edce1a5883..904a502ef501 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -2491,8 +2491,7 @@ void Edit::Modify()
return;
// #i13677# notify edit listeners about caret position change
- ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
-
+ ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
// FIXME: this is currently only on aqua
// check for other platforms that need similar handling
if( ImplGetSVData()->maNWFData.mbNoFocusRects &&
@@ -2647,15 +2646,35 @@ void Edit::ImplSetSelection( const Selection& rSelection, sal_Bool bPaint )
if ( aNew != maSelection )
{
ImplClearLayoutData();
+ Selection aTemp = maSelection;
maSelection = aNew;
if ( bPaint && ( aOld.Len() || aNew.Len() || IsPaintTransparent() ) )
ImplInvalidateOrRepaint( 0, maText.getLength() );
ImplShowCursor();
- if ( mbIsSubEdit )
- ((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
- else
- ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
+
+ sal_Bool bCaret = sal_False, bSelection = sal_False;
+ long nB=aNew.Max(), nA=aNew.Min(),oB=aTemp.Max(), oA=aTemp.Min();
+ long nGap = nB-nA, oGap = oB-oA;
+ if (nB != oB)
+ bCaret = sal_True;
+ if (nGap != 0 || oGap != 0)
+ bSelection = sal_True;
+ if (bCaret)
+ {
+ if ( mbIsSubEdit )
+ ((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
+ else
+ ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
+ }
+ if (bSelection)
+ {
+ if ( mbIsSubEdit )
+ ((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
+ else
+ ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
+ }
+
// #103511# notify combobox listeners of deselection
if( !maSelection && GetParent() && GetParent()->GetType() == WINDOW_COMBOBOX )
((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_COMBOBOX_DESELECT );
diff --git a/vcl/source/control/ilstbox.cxx b/vcl/source/control/ilstbox.cxx
index fa9c2773657a..e15898defa45 100644
--- a/vcl/source/control/ilstbox.cxx
+++ b/vcl/source/control/ilstbox.cxx
@@ -929,7 +929,8 @@ void ImplListBoxWindow::MouseButtonDown( const MouseEvent& rMEvt )
mnCurrentPos = nSelect;
mbTrackingSelect = true;
- SelectEntries( nSelect, LET_MBDOWN, rMEvt.IsShift(), rMEvt.IsMod1() );
+ sal_Bool bCurPosChange = (mnCurrentPos != nSelect);
+ SelectEntries( nSelect, LET_MBDOWN, rMEvt.IsShift(), rMEvt.IsMod1() ,bCurPosChange);
mbTrackingSelect = false;
if ( mbGrabFocus )
GrabFocus();
@@ -1000,6 +1001,12 @@ void ImplListBoxWindow::MouseMove( const MouseEvent& rMEvt )
ImplCallSelect();
mbTravelSelect = false;
}
+ // When list box selection change by mouse move, notity
+ // VCLEVENT_LISTBOX_SELECT vcl event.
+ else
+ {
+ maListItemSelectHdl.Call(NULL);
+ }
}
mbTrackingSelect = false;
}
@@ -1087,7 +1094,7 @@ void ImplListBoxWindow::SelectEntry( sal_uInt16 nPos, sal_Bool bSelect )
// -----------------------------------------------------------------------
-sal_Bool ImplListBoxWindow::SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift, sal_Bool bCtrl )
+sal_Bool ImplListBoxWindow::SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift, sal_Bool bCtrl, sal_Bool bSelectPosChange /*=FALSE*/ )
{
bool bFocusChanged = false;
sal_Bool bSelectionChanged = sal_False;
@@ -1232,6 +1239,10 @@ sal_Bool ImplListBoxWindow::SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLE
maFocusRect.SetSize( aSz );
if( HasFocus() )
ImplShowFocusRect();
+ if (bSelectPosChange)
+ {
+ maFocusHdl.Call(reinterpret_cast<void*>(nSelect));
+ }
}
ImplClearLayoutData();
}
@@ -1690,8 +1701,9 @@ sal_Bool ImplListBoxWindow::ProcessKeyInput( const KeyEvent& rKEvt )
DBG_ASSERT( !mpEntryList->IsEntryPosSelected( nSelect ) || mbMulti, "ImplListBox: Selecting same Entry" );
if( nSelect >= mpEntryList->GetEntryCount() )
nSelect = mpEntryList->GetEntryCount()-1;
+ sal_Bool bCurPosChange = (mnCurrentPos != nSelect);
mnCurrentPos = nSelect;
- if ( SelectEntries( nSelect, eLET, bShift, bCtrl ) )
+ if(SelectEntries( nSelect, eLET, bShift, bCtrl, bCurPosChange))
{
mbTravelSelect = true;
mnSelectModifier = rKEvt.GetKeyCode().GetModifier();
@@ -2159,12 +2171,11 @@ Rectangle ImplListBoxWindow::GetBoundingRectangle( sal_uInt16 nItem ) const
{
const ImplEntryType* pEntry = mpEntryList->GetEntryPtr( nItem );
Size aSz( GetSizePixel().Width(), pEntry ? pEntry->mnHeight : GetEntryHeight() );
- long nY = mpEntryList->GetAddedHeight( nItem, GetTopEntry() ) - mpEntryList->GetAddedHeight( GetTopEntry() );
+ long nY = mpEntryList->GetAddedHeight( nItem, GetTopEntry() ) + GetEntryList()->GetMRUCount()*GetEntryHeight();
Rectangle aRect( Point( 0, nY ), aSz );
return aRect;
}
-
// -----------------------------------------------------------------------
void ImplListBoxWindow::StateChanged( StateChangedType nType )
diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx
index b1e5df0d195a..fe358ae30b55 100644
--- a/vcl/source/control/lstbox.cxx
+++ b/vcl/source/control/lstbox.cxx
@@ -162,6 +162,8 @@ void ListBox::ImplInit( Window* pParent, WinBits nStyle )
mpImplLB->SetCancelHdl( LINK( this, ListBox, ImplCancelHdl ) );
mpImplLB->SetDoubleClickHdl( LINK( this, ListBox, ImplDoubleClickHdl ) );
mpImplLB->SetUserDrawHdl( LINK( this, ListBox, ImplUserDrawHdl ) );
+ mpImplLB->SetFocusHdl( LINK( this, ListBox, ImplFocusHdl ) );
+ mpImplLB->SetListItemSelectHdl( LINK( this, ListBox, ImplListItemSelectHdl ) );
mpImplLB->SetPosPixel( Point() );
mpImplLB->SetEdgeBlending(GetEdgeBlending());
mpImplLB->Show();
@@ -239,6 +241,18 @@ IMPL_LINK_NOARG(ListBox, ImplSelectHdl)
return 1;
}
+IMPL_LINK( ListBox, ImplFocusHdl, void *, nPos )
+{
+ ImplCallEventListeners( VCLEVENT_LISTBOX_FOCUS , nPos);
+ return 1;
+}
+
+IMPL_LINK( ListBox, ImplListItemSelectHdl, void*, EMPTYARG )
+{
+ ImplCallEventListeners( VCLEVENT_LISTBOX_SELECT );
+ return 1;
+}
+
IMPL_LINK_NOARG(ListBox, ImplScrollHdl)
{
@@ -1013,6 +1027,7 @@ void ListBox::SetNoSelection()
mpImplWin->SetImage( aImage );
mpImplWin->Invalidate();
}
+ ImplCallEventListeners(VCLEVENT_LISTBOX_STATEUPDATE);
}
@@ -1131,7 +1146,20 @@ void ListBox::SelectEntry( const OUString& rStr, sal_Bool bSelect )
void ListBox::SelectEntryPos( sal_uInt16 nPos, sal_Bool bSelect )
{
if ( nPos < mpImplLB->GetEntryList()->GetEntryCount() )
+ {
+ sal_uInt16 oldSelectCount = GetSelectEntryCount(), newSelectCount = 0, nCurrentPos = mpImplLB->GetCurrentPos();
mpImplLB->SelectEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), bSelect );
+ newSelectCount = GetSelectEntryCount();
+ if (oldSelectCount == 0 && newSelectCount > 0)
+ ImplCallEventListeners(VCLEVENT_LISTBOX_STATEUPDATE);
+ //Only when bSelect == true, send both Selection & Focus events
+ if (nCurrentPos != nPos && bSelect)
+ {
+ ImplCallEventListeners( VCLEVENT_LISTBOX_SELECT, reinterpret_cast<void*>(nPos));
+ if (HasFocus())
+ ImplCallEventListeners( VCLEVENT_LISTBOX_FOCUS, reinterpret_cast<void*>(nPos));
+ }
+ }
}
@@ -1538,6 +1566,11 @@ void ListBox::SetEdgeBlending(bool bNew)
}
}
+sal_uInt16 ListBox::GetMRUCount() const
+{
+ return mpImplLB->GetEntryList()->GetMRUCount();
+}
+
// =======================================================================
MultiListBox::MultiListBox( Window* pParent, WinBits nStyle ) :
ListBox( WINDOW_MULTILISTBOX )
diff --git a/vcl/source/control/morebtn.cxx b/vcl/source/control/morebtn.cxx
index 0e697769cd7b..c1cc320648e8 100644
--- a/vcl/source/control/morebtn.cxx
+++ b/vcl/source/control/morebtn.cxx
@@ -127,9 +127,6 @@ void MoreButton::Click()
mbState = !mbState;
ShowState();
- // Call Click handler here, so that we can initialize the Controls
- PushButton::Click();
-
// Update the windows according to the status
if ( mbState )
{
@@ -170,6 +167,8 @@ void MoreButton::Click()
}
}
}
+ // Call Click handler here, so that we can initialize the Controls
+ PushButton::Click();
}
void MoreButton::AddWindow( Window* pWindow )
diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx
index 93ee0cdbabcc..640af54cb4a7 100644
--- a/vcl/source/control/tabctrl.cxx
+++ b/vcl/source/control/tabctrl.cxx
@@ -702,6 +702,7 @@ void TabControl::ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId )
}
pPage->ActivatePage();
+ pPage->Show();
if ( pOldPage && pOldPage->HasChildPathFocus() )
{
@@ -712,8 +713,6 @@ void TabControl::ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId )
else
GrabFocus();
}
-
- pPage->Show();
}
if ( pOldPage )
diff --git a/vcl/source/window/btndlg.cxx b/vcl/source/window/btndlg.cxx
index 84694beac4c3..212b5c65df1e 100644
--- a/vcl/source/window/btndlg.cxx
+++ b/vcl/source/window/btndlg.cxx
@@ -231,11 +231,16 @@ void ButtonDialog::StateChanged( StateChangedType nType )
if ( nType == STATE_CHANGE_INITSHOW )
{
ImplPosControls();
+ for (btn_iterator it = maItemList.begin(); it != maItemList.end(); ++it)
+ {
+ if ( it->mpPushButton && it->mbOwnButton )
+ it->mpPushButton->SetZOrder(0, WINDOW_ZORDER_LAST);
+ }
// Set focus on default button.
if ( mnFocusButtonId != BUTTONDIALOG_BUTTON_NOTFOUND )
{
- for ( btn_iterator it = maItemList.begin(); it != maItemList.end(); ++it)
+ for (btn_iterator it = maItemList.begin(); it != maItemList.end(); ++it)
{
if (it->mnId == mnFocusButtonId )
{
diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx
index 6da32aa6a9da..29f02ea5530e 100644
--- a/vcl/source/window/dlgctrl.cxx
+++ b/vcl/source/window/dlgctrl.cxx
@@ -541,7 +541,13 @@ namespace
{
bool isSuitableDestination(Window *pWindow)
{
- return (pWindow && isVisibleInLayout(pWindow) && isEnabledInLayout(pWindow) && pWindow->IsInputEnabled());
+ return (pWindow && isVisibleInLayout(pWindow) &&
+ isEnabledInLayout(pWindow) && pWindow->IsInputEnabled() &&
+ //Pure window shouldn't get window after controls such as
+ //buttons.
+ (pWindow->GetType() != WINDOW_WINDOW && pWindow->GetType() != WINDOW_SYSWINDOW &&
+ pWindow->GetType() != WINDOW_WORKWINDOW && pWindow->GetType() != WINDOW_CONTROL)
+ );
}
bool focusNextInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup)
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 4a3e784f81a0..2a83c97424c0 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -1577,6 +1577,36 @@ MenuItemType Menu::GetItemType( sal_uInt16 nPos ) const
return MENUITEM_DONTKNOW;
}
+void Menu::SetHightlightItem( sal_uInt16 nItem )
+{
+ nHighlightedItem = nItem;
+}
+
+sal_uInt16 Menu::GetHighlightItem() const
+{
+ return nHighlightedItem;
+}
+
+OUString Menu::GetItemAccKeyStrFromPos(sal_uInt16 nPos) const
+{
+ MenuItemData* pData = pItemList->GetDataFromPos( nPos );
+ if (pData)
+ {
+ return pData->aAccelKey.GetName();
+ }
+ return OUString();
+}
+
+sal_Bool Menu::IsTemporaryItemFromPos(sal_uInt16 nPos ) const
+{
+ MenuItemData* pData = pItemList->GetDataFromPos( nPos );
+ if (pData)
+ {
+ return pData->bIsTemporary;
+ }
+ return sal_False;
+}
+
sal_uInt16 Menu::GetCurItemId() const
{
return nSelectedId;
@@ -2981,12 +3011,12 @@ Menu* Menu::ImplGetStartMenu()
return pStart;
}
-void Menu::ImplCallHighlight( sal_uInt16 nHighlightedItem )
+void Menu::ImplCallHighlight(sal_uInt16 nItem)
{
ImplMenuDelData aDelData( this );
nSelectedId = 0;
- MenuItemData* pData = pItemList->GetDataFromPos( nHighlightedItem );
+ MenuItemData* pData = pItemList->GetDataFromPos(nItem);
if ( pData )
nSelectedId = pData->nId;
ImplCallEventListeners( VCLEVENT_MENU_HIGHLIGHT, GetItemPos( GetCurItemId() ) );
@@ -3666,7 +3696,10 @@ sal_uInt16 PopupMenu::ImplExecute( Window* pW, const Rectangle& rRect, sal_uLong
OUString aTmpEntryText( ResId( SV_RESID_STRING_NOSELECTIONPOSSIBLE, *pResMgr ) );
MenuItemData* pData = pItemList->Insert(
0xFFFF, MENUITEM_STRING, 0, aTmpEntryText, Image(), NULL, 0xFFFF, OString() );
- pData->bIsTemporary = true;
+ size_t nPos;
+ pData = pItemList->GetData( pData->nId, nPos );
+ pData->bIsTemporary = true;
+ ImplCallEventListeners(VCLEVENT_MENU_SUBMENUCHANGED, nPos);
}
}
else if ( Application::GetSettings().GetStyleSettings().GetAutoMnemonic() && !( nMenuFlags & MENU_FLAG_NOAUTOMNEMONICS ) )
@@ -3978,7 +4011,7 @@ void MenuFloatingWindow::doShutdown()
// otherwise the entry will not be read when the menu is opened again
if( nHighlightedItem != ITEMPOS_INVALID )
pMenu->ImplCallEventListeners( VCLEVENT_MENU_DEHIGHLIGHT, nHighlightedItem );
-
+ pMenu->SetHightlightItem(ITEMPOS_INVALID);
if( !bKeyInput && pMenu && pMenu->pStartedFrom && !pMenu->pStartedFrom->bIsMenuBar )
{
// #102461# remove highlight in parent
@@ -4631,6 +4664,7 @@ void MenuFloatingWindow::ChangeHighlightItem( sal_uInt16 n, sal_Bool bStartPopup
}
}
HighlightItem( nHighlightedItem, sal_True );
+ pMenu->SetHightlightItem(nHighlightedItem);
pMenu->ImplCallHighlight( nHighlightedItem );
}
else
@@ -4931,6 +4965,8 @@ void MenuFloatingWindow::KeyInput( const KeyEvent& rKEvent )
MenuFloatingWindow* pFloat = ((PopupMenu*)pMenu->pStartedFrom)->ImplGetFloatingWindow();
pFloat->GrabFocus();
pFloat->KillActivePopup();
+ sal_uInt16 highlightItem = pFloat->GetHighlightedItem();
+ pFloat->ChangeHighlightItem(highlightItem, sal_False);
}
}
}
@@ -5534,8 +5570,8 @@ void MenuBarWindow::ChangeHighlightItem( sal_uInt16 n, sal_Bool bSelectEntry, sa
HighlightItem( nHighlightedItem, sal_True );
else if ( nRolloveredItem != ITEMPOS_INVALID )
HighlightItem( nRolloveredItem, sal_True );
-
- pMenu->ImplCallHighlight( nHighlightedItem );
+ pMenu->SetHightlightItem(nHighlightedItem);
+ pMenu->ImplCallHighlight(nHighlightedItem);
if( mbAutoPopup )
ImplCreatePopup( bSelectEntry );
diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx
index 7a3e0a45ad52..4d555a387df9 100644
--- a/vcl/source/window/toolbox.cxx
+++ b/vcl/source/window/toolbox.cxx
@@ -5423,7 +5423,10 @@ void ToolBox::ImplChangeHighlight( ImplToolItem* pItem, sal_Bool bNoGrabFocus )
mnCurPos = aPos;
ImplShowFocus();
- ImplCallEventListeners( VCLEVENT_TOOLBOX_HIGHLIGHT );
+ if( pItem->mpWindow )
+ pItem->mpWindow->GrabFocus();
+ if( pItem != pOldItem )
+ ImplCallEventListeners( VCLEVENT_TOOLBOX_HIGHLIGHT );
}
}
else
diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx
index 62544c655d9a..4d0de02b184e 100644
--- a/vcl/source/window/toolbox2.cxx
+++ b/vcl/source/window/toolbox2.cxx
@@ -1691,7 +1691,8 @@ void ToolBox::SetItemState( sal_uInt16 nItemId, TriState eState )
ImplCallEventListeners( VCLEVENT_TOOLBOX_BUTTONSTATECHANGED, reinterpret_cast< void* >( nPos ) );
// Notify
- ImplCallEventListeners( VCLEVENT_TOOLBOX_CLICK, reinterpret_cast< void* >( nPos ) );
+ //Solution:Call accessible listener to notify state_changed event
+ ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMUPDATED, reinterpret_cast< void* >(nPos) );
}
}
}