viewmgr.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 360 行
CPP
360 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include <wcvector.h>
#include "wstd.h"
#include "assure.h"
#include "browse.h"
#include "gbvlist.h"
#include "gbvolinh.h"
#include "gbvolcll.h"
#include "gtclass.h"
#include "gtfunc.h"
#include "util.h"
#include "menuids.h"
#include "viewmgr.h"
//------------------------- EventReceiver -----------------------------------
ViewManager::EventReceiver::EventReceiver()
: _receiver( NULL )
, _wantsEvents( VENoEvent )
//-----------------------------------------
{
}
ViewManager::EventReceiver::EventReceiver( const EventReceiver & o )
: _receiver( o._receiver )
, _wantsEvents( o._wantsEvents )
//------------------------------------------------------------------
{
}
ViewManager::EventReceiver::EventReceiver( ViewEventReceiver * rec )
: _receiver( rec )
, _wantsEvents( rec->wantEvents() )
//------------------------------------------------------------------
{
}
bool ViewManager::EventReceiver::operator == ( const EventReceiver & o ) const
//----------------------------------------------------------------------------
{
return( _receiver == o._receiver );
}
ViewManager::EventReceiver &
ViewManager::EventReceiver::operator=( const EventReceiver & o )
//--------------------------------------------------------------
{
_receiver = o._receiver;
_wantsEvents = o._wantsEvents;
return *this;
}
//------------------------- ViewManager -----------------------------------
ViewManager::ViewManager()
: _hasFocus( NULL )
, _menuManager( NULL )
//----------------------------
{
_detailViews = new WCPtrOrderedVector<DetailView>;
_eventReceivers = new WCValOrderedVector<EventReceiver>;
_killList = new WCValOrderedVector<View *>;
}
ViewManager::~ViewManager()
//-------------------------
{
_detailViews->clear();
delete _detailViews;
_eventReceivers->clear();
delete _eventReceivers;
kill();
delete _killList;
}
void ViewManager::kill()
//----------------------
{
int i;
for( i = _killList->entries(); i > 0; --i ) {
View *tmp = (*_killList)[i-1];
_killList->removeLast();
delete tmp;
}
}
static MIMenuID ViewManagerMenus[] = {
MIMenuID( MMView, VMList ),
MIMenuID( CMViewInherit, VMInheritTree ),
MIMenuID( CMViewInherit, VMInheritOutline ),
MIMenuID( CMViewCall, VMCallTree ),
MIMenuID( CMViewCall, VMCallOutline ),
};
#define NumViewMgrMenus ( sizeof( ViewManagerMenus ) / sizeof( MIMenuID ) )
void ViewManager::setMenus( MenuManager * mgr )
//---------------------------------------------
{
int i;
_menuManager = mgr;
for( i = 0; i < NumViewMgrMenus; i += 1 ) {
_menuManager->registerForMenu( this, ViewManagerMenus[ i ] );
}
}
void ViewManager::unsetMenus()
//----------------------------
{
int i;
for( i = 0; i < NumViewMgrMenus; i += 1 ) {
_menuManager->unRegister( ViewManagerMenus[ i ] );
}
}
void ViewManager::enableMenus( bool enabled )
//-------------------------------------------
{
int i;
if( _menuManager ) {
for( i = 0; i < NumViewMgrMenus; i += 1 ) {
_menuManager->enableMenu( ViewManagerMenus[ i ], enabled );
}
}
}
void ViewManager::menuSelected( const MIMenuID & id )
//---------------------------------------------------
{
switch( id.mainID() ) {
case MMView:
switch( id.subID() ) {
case VMList:
showGlobalView( GlobalView::GlobalViewSymbolList );
break;
};
break;
case CMViewInherit:
switch( id.subID() ) {
case VMInheritTree:
showGlobalView( GlobalView::GlobalViewInheritTree );
break;
case VMInheritOutline:
showGlobalView( GlobalView::GlobalViewInheritOutline );
break;
};
break;
case CMViewCall:
switch( id.subID() ) {
case VMCallTree:
showGlobalView( GlobalView::GlobalViewCallTree );
break;
case VMCallOutline:
showGlobalView( GlobalView::GlobalViewCallOutline );
break;
}
break;
}
}
DetailView * ViewManager::findDetailView( const Symbol * sym,
DetailView::ViewType vt )
//-------------------------------------------------------------------
{
return findDetailView( sym->getHandle(), vt );
}
DetailView * ViewManager::findDetailView( dr_handle hdl, DetailView::ViewType vt )
//--------------------------------------------------------------------------------
{
int i;
DetailView * testView;
for( i = 0; i < _detailViews->entries(); i += 1 ) {
testView = (*_detailViews)[ i ];
if( ( testView->symHandle() == hdl ) && ( testView->viewType() == vt ) ) {
return testView;
}
}
return NULL;
}
void ViewManager::showDetailView( const Symbol * sym, DetailView::ViewType vt )
//-----------------------------------------------------------------------------
{
DetailView * dtv;
dtv = findDetailView( sym, vt );
if( !dtv ) {
dtv = DetailView::createView( sym, vt );
#if DEBUG // FIXME -- TAKE OUT AS SOON AS TEXTREE, STRUCVIEW ARE VIEWS
if( dtv == NULL ) {
return;
}
#endif
_detailViews->append( dtv );
eventOccured( VECreate, dtv );
eventOccured( VEGettingFocus, dtv );
}
REQUIRE( dtv != NULL, "ViewManager::showDetailView -- dtv == NULL" );
dtv->showWin( WWinStateShowNormal );
dtv->setFocusWin();
}
void ViewManager::showGlobalView( GlobalView::GlobalViewType vt )
//---------------------------------------------------------------
{
GlobalView * gbv;
gbv = GlobalView::createView( vt );
REQUIRE( gbv != NULL, "ViewManager::showGlobalView -- gbv == NULL" );
eventOccured( VECreate, gbv );
eventOccured( VEGettingFocus, gbv );
}
void ViewManager::registerForEvents( ViewEventReceiver * rec )
//------------------------------------------------------------
{
_eventReceivers->append( EventReceiver( rec ) );
}
void ViewManager::unregister( ViewEventReceiver * rec )
//-----------------------------------------------------
{
_eventReceivers->remove( EventReceiver( rec ) );
}
void ViewManager::sendEvent( ViewEvent ve, View * view )
//------------------------------------------------------
{
int i;
for( i = 0; i < _eventReceivers->entries(); i += 1 ) {
EventReceiver & er( (*_eventReceivers)[ i ] );
if( er._wantsEvents & ve ) {
er._receiver->event( ve, view );
}
}
}
void ViewManager::eventOccured( ViewEvent ve, View * view )
//---------------------------------------------------------
// call kill on VEGettingFocus and VELosingFocus events
// since under OS/2, these occur before the window is
// destroyed!!
{
int i;
// perform special actions on some events //
switch( ve ) {
case VEGettingFocus:
if( view != _hasFocus ) {
_hasFocus = view;
sendEvent( ve, view );
}
break;
case VELosingFocus:
if( view == _hasFocus ) {
sendEvent( ve, view );
}
_hasFocus = NULL;
break;
case VEBrowseFileChange:
/* the loop has to be in reverse order since the aboutToClose
* call removes the receiver from the array
*/
for( i = _detailViews->entries(); i > 0; i -= 1 ) {
DetailView * dtv = (*_detailViews)[ i - 1 ];
dtv->aboutToClose();
}
sendEvent( ve, view );
kill();
break;
default:
sendEvent( ve, view );
kill();
}
}
void ViewManager::viewDying( View * view )
//----------------------------------------
{
if( view->identity() == VIDetailView ) {
_detailViews->remove( (DetailView *) view );
}
unregister( view );
eventOccured( VELosingFocus, view );
eventOccured( VEClose, view );
_killList->append( view ); // will be deleted next event
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?