You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/plugins/src/accessible/widgets/qaccessiblemenu.cpp

324 lines
7.4 KiB

#include "qaccessiblemenu.h"
#include <ntqpopupmenu.h>
#include <ntqmenubar.h>
#include <ntqstyle.h>
class MyPopupMenu : public TQPopupMenu
{
friend class TQAccessiblePopup;
};
TQAccessiblePopup::TQAccessiblePopup( TQObject *o )
: TQAccessibleWidget( o )
{
Q_ASSERT( o->inherits("TQPopupMenu") );
}
TQPopupMenu *TQAccessiblePopup::popupMenu() const
{
return (TQPopupMenu*)object();
}
int TQAccessiblePopup::childCount() const
{
return popupMenu()->count();
}
TQRESULT TQAccessiblePopup::queryChild( int /*control*/, TQAccessibleInterface **iface ) const
{
*iface = 0;
return TQS_FALSE;
}
TQRect TQAccessiblePopup::rect( int control ) const
{
if ( !control )
return TQAccessibleWidget::rect( control );
TQRect r = popupMenu()->itemGeometry( control - 1 );
TQPoint tlp = popupMenu()->mapToGlobal( TQPoint( 0,0 ) );
return TQRect( tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height() );
}
int TQAccessiblePopup::controlAt( int x, int y ) const
{
TQPoint p = popupMenu()->mapFromGlobal( TQPoint( x,y ) );
MyPopupMenu *mp = (MyPopupMenu*)popupMenu();
return mp->itemAtPos( p, FALSE ) + 1;
}
int TQAccessiblePopup::navigate( NavDirection direction, int startControl ) const
{
if ( direction != NavFirstChild && direction != NavLastChild && direction != NavFocusChild && !startControl )
return TQAccessibleWidget::navigate( direction, startControl );
switch ( direction ) {
case NavFirstChild:
return 1;
case NavLastChild:
return childCount();
case NavNext:
case NavDown:
return (startControl + 1) > childCount() ? -1 : startControl + 1;
case NavPrevious:
case NavUp:
return (startControl - 1) < 1 ? -1 : startControl - 1;
default:
break;
}
return -1;
}
TQString TQAccessiblePopup::text( Text t, int control ) const
{
TQString tx = TQAccessibleWidget::text( t, control );
if ( !!tx )
return tx;
int id;
TQMenuItem *item = 0;
if ( control ) {
id = popupMenu()->idAt( control - 1 );
item = popupMenu()->findItem( id );
}
switch ( t ) {
case Name:
if ( !control )
return popupMenu()->caption();
return stripAmp( popupMenu()->text( id ) );
case Help:
return popupMenu()->whatsThis( id );
case Accelerator:
return hotKey( popupMenu()->text( id ) );
case DefaultAction:
if ( !item || item->isSeparator() || !item->isEnabled() )
break;
if ( item->popup() )
return TQPopupMenu::tr("Open");
return TQPopupMenu::tr("Execute");
default:
break;
}
return tx;
}
TQAccessible::Role TQAccessiblePopup::role( int control ) const
{
if ( !control )
return PopupMenu;
TQMenuItem *item = popupMenu()->findItem( popupMenu()->idAt( control -1 ) );
if ( item && item->isSeparator() )
return Separator;
return MenuItem;
}
TQAccessible::State TQAccessiblePopup::state( int control ) const
{
int s = TQAccessibleWidget::state( control );
if ( !control )
return (State)s;
int id = popupMenu()->idAt( control -1 );
TQMenuItem *item = popupMenu()->findItem( id );
if ( !item )
return (State)s;
if ( popupMenu()->style().styleHint( TQStyle::SH_PopupMenu_MouseTracking ) )
s |= HotTracked;
if ( item->isSeparator() || !item->isEnabled() )
s |= Unavailable;
if ( popupMenu()->isCheckable() && item->isChecked() )
s |= Checked;
if ( popupMenu()->isItemActive( id ) )
s |= Focused;
return (State)s;
}
bool TQAccessiblePopup::doDefaultAction( int control )
{
if ( !control )
return FALSE;
int id = popupMenu()->idAt( control -1 );
TQMenuItem *item = popupMenu()->findItem( id );
if ( !item || !item->isEnabled() )
return FALSE;
popupMenu()->activateItemAt( control - 1);
return TRUE;
}
bool TQAccessiblePopup::setFocus( int control )
{
if ( !control )
return FALSE;
int id = popupMenu()->idAt( control -1 );
TQMenuItem *item = popupMenu()->findItem( id );
if ( !item || !item->isEnabled() )
return FALSE;
popupMenu()->setActiveItem( control - 1 );
return TRUE;
}
class MyMenuBar : public TQMenuBar
{
friend class TQAccessibleMenuBar;
};
TQAccessibleMenuBar::TQAccessibleMenuBar( TQObject *o )
: TQAccessibleWidget( o )
{
Q_ASSERT( o->inherits( "TQMenuBar" ) );
}
TQMenuBar *TQAccessibleMenuBar::menuBar() const
{
return (TQMenuBar*)object();
}
int TQAccessibleMenuBar::childCount() const
{
return menuBar()->count();
}
TQRESULT TQAccessibleMenuBar::queryChild( int /*control*/, TQAccessibleInterface **iface ) const
{
*iface = 0;
return TQS_FALSE;
}
TQRect TQAccessibleMenuBar::rect( int control ) const
{
if ( !control )
return TQAccessibleWidget::rect( control );
MyMenuBar *mb = (MyMenuBar*)menuBar();
TQRect r = mb->itemRect( control - 1 );
TQPoint tlp = mb->mapToGlobal( TQPoint( 0,0 ) );
return TQRect( tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height() );
}
int TQAccessibleMenuBar::controlAt( int x, int y ) const
{
MyMenuBar *mb = (MyMenuBar*)menuBar();
TQPoint p = mb->mapFromGlobal( TQPoint( x,y ) );
return mb->itemAtPos( p ) + 1;
}
int TQAccessibleMenuBar::navigate( NavDirection direction, int startControl ) const
{
if ( direction != NavFirstChild && direction != NavLastChild && direction != NavFocusChild && !startControl )
return TQAccessibleWidget::navigate( direction, startControl );
switch ( direction ) {
case NavFirstChild:
return 1;
case NavLastChild:
return childCount();
case NavNext:
case NavRight:
return (startControl + 1) > childCount() ? -1 : startControl + 1;
case NavPrevious:
case NavLeft:
return (startControl - 1) < 1 ? -1 : startControl - 1;
default:
break;
}
return -1;
}
TQString TQAccessibleMenuBar::text( Text t, int control ) const
{
TQString tx = TQAccessibleWidget::text( t, control );
if ( !!tx )
return tx;
if ( !control )
return tx;
int id = menuBar()->idAt( control - 1 );
switch ( t ) {
case Name:
return stripAmp( menuBar()->text( id ) );
case Accelerator:
tx = hotKey( menuBar()->text( id ) );
if ( !!tx )
return "Alt + "+tx;
break;
case DefaultAction:
return TQMenuBar::tr("Open");
default:
break;
}
return tx;
}
TQAccessible::Role TQAccessibleMenuBar::role( int control ) const
{
if ( !control )
return MenuBar;
TQMenuItem *item = menuBar()->findItem( menuBar()->idAt( control -1 ) );
if ( item && item->isSeparator() )
return Separator;
return MenuItem;
}
TQAccessible::State TQAccessibleMenuBar::state( int control ) const
{
int s = TQAccessibleWidget::state( control );
if ( !control )
return (State)s;
int id = menuBar()->idAt( control -1 );
TQMenuItem *item = menuBar()->findItem( id );
if ( !item )
return (State)s;
if ( menuBar()->style().styleHint( TQStyle::SH_PopupMenu_MouseTracking ) )
s |= HotTracked;
if ( item->isSeparator() || !item->isEnabled() )
s |= Unavailable;
if ( menuBar()->isItemActive( id ) )
s |= Focused;
return (State)s;
}
bool TQAccessibleMenuBar::doDefaultAction( int control )
{
if ( !control )
return FALSE;
int id = menuBar()->idAt( control -1 );
TQMenuItem *item = menuBar()->findItem( id );
if ( !item || !item->isEnabled() )
return FALSE;
menuBar()->activateItemAt( control - 1);
return TRUE;
}
bool TQAccessibleMenuBar::setFocus( int control )
{
if ( !control )
return FALSE;
int id = menuBar()->idAt( control -1 );
TQMenuItem *item = menuBar()->findItem( id );
if ( !item || !item->isEnabled() )
return FALSE;
return TRUE;
}