menumgr.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 465 行 · 第 1/2 页
CPP
465 行
_clientWin = NULL;
break;
}
}
void MenuManager::enableMenu( const MIMenuID & id, bool enable )
//--------------------------------------------------------------
{
if( _clientWin ) {
_topMenus[ id.mainID() ]->enableItem( enable, id.subID() );
}
}
bool MenuManager::menuEnabled( const MIMenuID & id )
//--------------------------------------------------
{
if( _clientWin ) {
return _topMenus[ id.mainID() ]->itemEnabled( id.subID() );
}
return FALSE;
}
void MenuManager::checkMenu( const MIMenuID & id, bool enable )
//-------------------------------------------------------------
{
if( _clientWin ) {
_topMenus[ id.mainID() ]->checkItem( enable, id.subID() );
}
}
void MenuManager::registerForMenu( MenuHandler * hdlr, const MIMenuID & id, bool enable )
//---------------------------------------------------------------------------------------
{
ASSERTION( !_receivers->contains( id ) );
(*_receivers)[ id ] = hdlr;
enableMenu( id, enable );
}
void MenuManager::unRegister( const MIMenuID & id )
//-------------------------------------------------
{
bool found;
enableMenu( id, FALSE );
found = (bool) _receivers->remove( id );
ASSERTION( found );
}
void MenuManager::menuSelected( WMenuItem * item )
//------------------------------------------------
{
const SubMenuInfo * info;
MenuHandler * handler;
info = (const SubMenuInfo *) item->tagPtr();
MIMenuID id( info->mainId, info->subId );
if( _receivers->find( id, handler ) ) {
if( handler != NULL ) {
handler->menuSelected( id );
}
}
}
void MenuManager::menuPopup( WPopupMenu * pop )
//---------------------------------------------
{
int i;
ASSERTION( (_clientWin != NULL) );
for( i = 0; i < MMNumMainMenus; i += 1 ) {
if( pop == _topMenus[ i ] ) {
_clientWin->statusText( MainMenuInfo[ i ].hint );
break;
}
}
}
void MenuManager::hintText( WMenuItem *, const char * hint )
//----------------------------------------------------------
{
ASSERTION( (_clientWin != NULL) );
_clientWin->statusText( hint );
}
void MenuManager::makeItem( WPopupMenu * pop, const SubMenuInfo * info,
int idx, bool disable )
//-------------------------------------------------------------------------------
{
WMenuItem * item;
if( info[ idx ].menuName != NULL ) {
item = new WMenuItem( info[ idx ].menuName, this, (cbm) &MenuManager::menuSelected,
(cbh) &MenuManager::hintText, info[ idx ].hint );
item->setTagPtr( (void *) (info + idx) );
} else {
item = new WMenuSeparator;
}
pop->insertItem( item );
if( disable ) {
pop->enableItem( FALSE, idx );
}
}
void MenuManager::setupMenus( Browse * client )
//---------------------------------------------
{
int i;
WPopupMenu * pop;
WPopupMenu * subPop;
WMenu * menu;
_clientWin = client;
menu = new WMenu;
typedef WPopupMenu * popMenuStar; // to use new []
_topMenus = new popMenuStar[ MMNumMainMenus + CMNumCascadeMenus ];
_receivers = new WCValHashDict< MIMenuID, MenuHandler * >( &MenuHash );
for( i = 0; i < MMNumMainMenus; i += 1 ) {
if( i == MMWindows ) {
// Windows menu handled by WCLASS
_topMenus[ i ] = NULL;
} else {
_topMenus[ i ] = new WPopupMenu( MainMenuInfo[ i ].menuName );
_topMenus[ i ]->onPopup( this, (cbp) &MenuManager::menuPopup );
}
}
for( i = 0; i < CMNumCascadeMenus; i += 1 ) {
_topMenus[ i + MMNumMainMenus ] = new WPopupMenu( CascadeMenuInfo[ i ].menuName );
_topMenus[ i + MMNumMainMenus ]->onPopup( this, (cbp) &MenuManager::menuPopup );
}
//------- File Menu ---------//
pop = _topMenus[ MMFile ];
menu->insertPopup( pop );
for( i = 0; i < FMNumFileMenus; i += 1 ) {
makeItem( pop, FileMenuInfo, i );
}
//------- View Menu --------//
pop = _topMenus[ MMView ];
menu->insertPopup( pop );
makeItem( pop, ViewMenuInfo, VMList );
subPop = _topMenus[ CMViewInherit ];
pop->insertPopup( subPop );
for( i = 0; i < VMNumViewInheritMenus; i += 1 ) {
makeItem( subPop, ViewInheritMenuInfo, i );
}
subPop = _topMenus[ CMViewCall ];
pop->insertPopup( subPop );
for( i = 0; i < VMNumViewCallMenus; i += 1 ) {
makeItem( subPop, ViewCallMenuInfo, i );
}
//------- Detail Menu ---------//
pop = _topMenus[ MMDetail ];
menu->insertPopup( pop );
for( i = 0; i < DMNumDetailMenus; i += 1 ) {
makeItem( pop, DetailMenuInfo, i );
}
//------- Tree Menu ---------//
pop = _topMenus[ MMTree ];
menu->insertPopup( pop );
for( i = 0; i < TMNumTreeMenus; i += 1 ) {
makeItem( pop, TreeMenuInfo, i );
}
//------- Locate Menu ---------//
pop = _topMenus[ MMLocate ];
menu->insertPopup( pop );
for( i = 0; i < LMNumLocateMenus; i += 1 ) {
makeItem( pop, LocateMenuInfo, i );
}
//------- Options Menu ---------//
pop = _topMenus[ MMOptions ];
menu->insertPopup( pop );
for( i = 0; i < OMNumOptionsMenus; i += 1 ) {
makeItem( pop, OptionsMenuInfo, i );
}
//-------- Windows Menu ----------//
// WCLASS handles this one for us //
pop = _clientWin->getMdiPopup();
menu->insertPopup( pop );
//------- Help Menu ---------//
pop = _topMenus[ MMHelp ];
menu->insertPopup( pop );
for( i = 0; i < HMNumHelpMenus; i += 1 ) {
makeItem( pop, HelpMenuInfo, i );
}
_clientWin->setMenu( menu );
}
void MenuManager::trackPopup( WWindow * win, MIMainMenu pop )
//-----------------------------------------------------------
{
if( _clientWin ) {
win->setPopup( _topMenus[ pop ] );
}
}
MIMenuID::MIMenuID()
: _main( 0 )
, _sub( 0 )
//---------------------
{
}
bool MIMenuID::operator == ( const MIMenuID & o ) const
//-----------------------------------------------------
{
return( ( _main == o._main ) && ( _sub == o._sub ) );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?