|
|
|
#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;
|
|
|
|
}
|