Leaked source code of windows server 2003
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.

602 lines
18 KiB

  1. //Copyright (c) 1998 - 1999 Microsoft Corporation
  2. /*******************************************************************************
  3. *
  4. * rtpane.cpp
  5. *
  6. * implementation of the CRightPane class
  7. *
  8. *
  9. *******************************************************************************/
  10. #include "stdafx.h"
  11. #include "winadmin.h"
  12. #include "rtpane.h"
  13. #include "admindoc.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. ////////////////////////////
  20. // MESSAGE MAP: CRightPane
  21. //
  22. IMPLEMENT_DYNCREATE(CRightPane, CView)
  23. BEGIN_MESSAGE_MAP(CRightPane, CView)
  24. //{{AFX_MSG_MAP(CRightPane)
  25. ON_WM_SIZE()
  26. ON_MESSAGE(WM_ADMIN_CHANGEVIEW, OnAdminChangeView)
  27. ON_MESSAGE(WM_ADMIN_ADD_SERVER, OnAdminAddServer)
  28. ON_MESSAGE(WM_ADMIN_REMOVE_SERVER, OnAdminRemoveServer)
  29. ON_MESSAGE(WM_ADMIN_UPDATE_SERVER, OnAdminUpdateServer)
  30. ON_MESSAGE(WM_ADMIN_UPDATE_PROCESSES, OnAdminUpdateProcesses)
  31. ON_MESSAGE(WM_ADMIN_REMOVE_PROCESS, OnAdminRemoveProcess)
  32. ON_MESSAGE(WM_ADMIN_REDISPLAY_PROCESSES, OnAdminRedisplayProcesses)
  33. ON_MESSAGE(WM_ADMIN_UPDATE_SERVER_INFO, OnAdminUpdateServerInfo)
  34. ON_MESSAGE(WM_ADMIN_REDISPLAY_LICENSES, OnAdminRedisplayLicenses)
  35. ON_MESSAGE(WM_ADMIN_UPDATE_WINSTATIONS, OnAdminUpdateWinStations)
  36. ON_MESSAGE(WM_ADMIN_TABBED_VIEW , OnTabbedView)
  37. ON_MESSAGE(WM_ADMIN_SHIFTTABBED_VIEW , OnShiftTabbedView )
  38. ON_MESSAGE( WM_ADMIN_CTRLTABBED_VIEW , OnCtrlTabbedView )
  39. ON_MESSAGE( WM_ADMIN_CTRLSHIFTTABBED_VIEW , OnCtrlShiftTabbedView )
  40. ON_MESSAGE( WM_ADMIN_NEXTPANE_VIEW , OnNextPane )
  41. ON_WM_SETFOCUS()
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. RightPaneView CRightPane::views[NUMBER_OF_VIEWS] = {
  45. { NULL, RUNTIME_CLASS( CBlankView ) },
  46. { NULL, RUNTIME_CLASS( CAllServersView ) },
  47. { NULL, RUNTIME_CLASS( CDomainView ) },
  48. { NULL, RUNTIME_CLASS( CServerView ) },
  49. { NULL, RUNTIME_CLASS( CMessageView ) },
  50. { NULL, RUNTIME_CLASS( CWinStationView ) },
  51. };
  52. /////////////////////////
  53. // CRightPane ctor
  54. //
  55. // - the view pointers are initially set to NULL
  56. // - the default view type is BLANK
  57. //
  58. CRightPane::CRightPane()
  59. {
  60. m_CurrViewType = VIEW_BLANK;
  61. } // end CRightPane ctor
  62. ////////////////////////////
  63. // CRightPane::OnDraw
  64. //
  65. void CRightPane::OnDraw(CDC* pDC)
  66. {
  67. } // end CRightPane::OnDraw
  68. /////////////////////////
  69. // CRightPane dtor
  70. //
  71. CRightPane::~CRightPane()
  72. {
  73. } // end CRightPane ctor
  74. #ifdef _DEBUG
  75. /////////////////////////////////
  76. // CRightPane::AssertValid
  77. //
  78. void CRightPane::AssertValid() const
  79. {
  80. CView::AssertValid();
  81. } // end CView::AssertValid
  82. //////////////////////////
  83. // CRightPane::Dump
  84. //
  85. void CRightPane::Dump(CDumpContext& dc) const
  86. {
  87. CView::Dump(dc);
  88. } // end CRightPane::Dump
  89. #endif //_DEBUG
  90. /////////////////////////////////////
  91. // CRightPane::OnInitialUpdate
  92. //
  93. // - each of the default view objects is created
  94. // - the CBlankView object is initially the 'active' view in the right pane
  95. //
  96. void CRightPane::OnInitialUpdate()
  97. {
  98. CView::OnInitialUpdate();
  99. CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
  100. CWinAdminDoc* pDoc = (CWinAdminDoc*)pMainWnd->GetActiveDocument();
  101. for(int vw = 0; vw < NUMBER_OF_VIEWS; vw++) {
  102. views[vw].m_pView = (CAdminView*)views[vw].m_pRuntimeClass->CreateObject();
  103. views[vw].m_pView->Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), this, vw);
  104. pDoc->AddView(views[vw].m_pView);
  105. }
  106. pDoc->UpdateAllViews(NULL);
  107. } // end CRightPane::OnInitialUpdate
  108. ////////////////////////////
  109. // CRightPane::OnSize
  110. //
  111. // - currently all views are sized to fit the view, whether they are 'active'
  112. // or not... this may change to sizing only the view that is 'active' if
  113. // it significantly impacts performance
  114. //
  115. void CRightPane::OnSize(UINT nType, int cx, int cy)
  116. {
  117. RECT rect;
  118. GetClientRect(&rect);
  119. for(int i = 0; i < NUMBER_OF_VIEWS; i++) {
  120. if(views[i].m_pView && views[i].m_pView->GetSafeHwnd())
  121. views[i].m_pView->MoveWindow(&rect, TRUE);
  122. }
  123. CView::OnSize(nType, cx, cy);
  124. } // end CRightPane::OnSize
  125. /////////////////////////////////////
  126. // CRightPane::OnAdminChangeView
  127. //
  128. // - if the new view type is different from the current
  129. // view type, the new view type is made 'active', reset, and invalidated
  130. // - if the new view type is the same as the current
  131. // view type, the current view is simply reset using the new
  132. // object pointer and then invalidated
  133. //
  134. // lParam contains pointer to CTreeNode of current item in tree
  135. // wParam is TRUE if message caused by user clicking on tree item
  136. //
  137. LRESULT CRightPane::OnAdminChangeView(WPARAM wParam, LPARAM lParam)
  138. {
  139. CTreeNode* pNode = (CTreeNode*)lParam;
  140. ((CWinAdminDoc*)GetDocument())->SetCurrentPage(PAGE_CHANGING);
  141. ODS( L"CRightPane::OnAdminChangeView\n" );
  142. if( pNode == NULL )
  143. {
  144. ODS( L"CRightPane!OnAdminChangeView pNode invalid\n" );
  145. return 0;
  146. }
  147. void *resetParam = pNode->GetTreeObject();
  148. VIEW newView = VIEW_BLANK;
  149. switch(pNode->GetNodeType()) {
  150. case NODE_THIS_COMP: // FALL THROUGH
  151. case NODE_FAV_LIST:
  152. resetParam = pNode;
  153. newView = VIEW_ALL_SERVERS;
  154. break;
  155. case NODE_ALL_SERVERS:
  156. newView = VIEW_ALL_SERVERS;
  157. ODS( L"CRightPane::OnAdminChangeView = VIEW_ALL_SERVERS\n" );
  158. break;
  159. case NODE_DOMAIN:
  160. {
  161. CDomain *pDomain = (CDomain*)pNode->GetTreeObject();
  162. // If we haven't fired off a background thread for this
  163. // domain yet, do it now
  164. if(!pDomain->GetThreadPointer()) {
  165. newView = VIEW_MESSAGE;
  166. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE\n" );
  167. // todo change message to let the user know that a dblclk action is required to
  168. // start the enumeration process.
  169. resetParam = (void*)IDS_DOMAIN_DBLCLK_MSG;
  170. // pDomain->StartEnumerating();
  171. }
  172. else if(pDomain->IsState(DS_INITIAL_ENUMERATION))
  173. {
  174. newView = VIEW_MESSAGE;
  175. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE\n" );
  176. resetParam = (void*)IDS_DOMAIN_FINDING_SERVERS;
  177. }
  178. else
  179. {
  180. newView = VIEW_DOMAIN;
  181. ODS( L"CRightPane::OnAdminChangeView = VIEW_DOMAIN\n" );
  182. }
  183. }
  184. break;
  185. case NODE_SERVER:
  186. {
  187. CServer *pServer = (CServer*)pNode->GetTreeObject();
  188. if(pServer->GetThreadHandle() == NULL) {
  189. newView = VIEW_MESSAGE;
  190. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE !pServer->GetThreadPointer\n" );
  191. // If we just disconnected from this server, we don't
  192. // want to reconnect
  193. if( ( pServer->IsState( SS_NOT_CONNECTED ) || pServer->IsPreviousState(SS_DISCONNECTING) ) && !wParam)
  194. {
  195. resetParam = (void*)IDS_CLICK_TO_CONNECT;
  196. }
  197. else
  198. {
  199. resetParam = (void*)IDS_GATHERING_SERVER_INFO;
  200. pServer->Connect();
  201. }
  202. }
  203. else if(!pServer->IsServerSane())
  204. {
  205. newView = VIEW_MESSAGE;
  206. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE !pServer->IsServerSane\n" );
  207. resetParam = (void*)IDS_NOT_AUTHENTICATED;
  208. }
  209. else if(!pServer->IsState(SS_GOOD))
  210. {
  211. newView = VIEW_MESSAGE;
  212. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE !pServer->IsState(SS_GOOD)\n" );
  213. resetParam = (void*)IDS_GATHERING_SERVER_INFO;
  214. }
  215. else
  216. {
  217. newView = VIEW_SERVER;
  218. ODS( L"CRightPane::OnAdminChangeView = VIEW_SERVER default\n" );
  219. }
  220. }
  221. break;
  222. case NODE_WINSTATION:
  223. {
  224. CWinStation *pWinStation = (CWinStation*)pNode->GetTreeObject();
  225. if(pWinStation->IsConnected() || pWinStation->IsState(State_Disconnected) ||
  226. pWinStation->IsState(State_Shadow))
  227. {
  228. newView = VIEW_WINSTATION;
  229. ODS( L"CRightPane::OnAdminChangeView = VIEW_WINSTATION\n" );
  230. }
  231. else if(pWinStation->IsState(State_Listen))
  232. {
  233. newView = VIEW_MESSAGE;
  234. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE\n" );
  235. resetParam = (void *)IDS_LISTENER_MSG;
  236. }
  237. else
  238. {
  239. newView = VIEW_MESSAGE;
  240. ODS( L"CRightPane::OnAdminChangeView = VIEW_MESSAGE\n" );
  241. resetParam = (void *)IDS_INACTIVE_MSG;
  242. }
  243. }
  244. break;
  245. }
  246. if(m_CurrViewType != newView)
  247. {
  248. //views[newView].m_pView->Reset(resetParam);
  249. views[m_CurrViewType].m_pView->ModifyStyle(WS_VISIBLE, WS_DISABLED);
  250. m_CurrViewType = newView;
  251. views[newView].m_pView->ModifyStyle(WS_DISABLED, WS_VISIBLE);
  252. views[newView].m_pView->Reset(resetParam);
  253. views[newView].m_pView->Invalidate();
  254. }
  255. else
  256. {
  257. views[newView].m_pView->Reset(resetParam);
  258. }
  259. ((CWinAdminDoc*)GetDocument())->SetCurrentView(newView);
  260. return 0;
  261. } // end CRightPane::OnAdminChangeView
  262. /////////////////////////////////////
  263. // CRightPane::OnAdminAddServer
  264. //
  265. LRESULT CRightPane::OnAdminAddServer(WPARAM wParam, LPARAM lParam)
  266. {
  267. ASSERT(lParam);
  268. // We only want to send this along if "All Listed Servers"
  269. // or "Domain" is the current view
  270. if(m_CurrViewType == VIEW_ALL_SERVERS || m_CurrViewType == VIEW_DOMAIN)
  271. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_ADD_SERVER, wParam, lParam);
  272. return 0;
  273. } // end CRightPane::OnAdminAddServer
  274. /////////////////////////////////////
  275. // CRightPane::OnAdminRemoveServer
  276. //
  277. LRESULT CRightPane::OnAdminRemoveServer(WPARAM wParam, LPARAM lParam)
  278. {
  279. ASSERT(lParam);
  280. // ODS( L"CRightPane::OnAdminRemoveServer\n" );
  281. // We only want to send this along if "All Listed Servers" or "Domain"
  282. // is the current view
  283. if(m_CurrViewType == VIEW_ALL_SERVERS || m_CurrViewType == VIEW_DOMAIN)
  284. {
  285. // ODS( L"view is ALL_SERVERS OR DOMAIN\n" );
  286. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_REMOVE_SERVER, wParam, lParam);
  287. }
  288. return 0;
  289. } // end CRightPane::OnAdminRemoveServer
  290. /////////////////////////////////////
  291. // CRightPane::OnAdminUpdateServer
  292. //
  293. LRESULT CRightPane::OnAdminUpdateServer(WPARAM wParam, LPARAM lParam)
  294. {
  295. ASSERT(lParam);
  296. // We only want to send this along if "All Listed Servers" or Domain
  297. // the current view
  298. if(m_CurrViewType == VIEW_ALL_SERVERS || m_CurrViewType == VIEW_DOMAIN)
  299. {
  300. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_UPDATE_SERVER, wParam, lParam);
  301. }
  302. return 0;
  303. } // end CRightPane::OnAdminUpdateServer
  304. /////////////////////////////////////
  305. // CRightPane::OnAdminUpdateProcesses
  306. //
  307. LRESULT CRightPane::OnAdminUpdateProcesses(WPARAM wParam, LPARAM lParam)
  308. {
  309. ASSERT(lParam);
  310. BOOL bSendMessage = FALSE;
  311. void *pCurrentSelectedNode = ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode();
  312. switch(m_CurrViewType) {
  313. case VIEW_ALL_SERVERS:
  314. bSendMessage = TRUE;
  315. break;
  316. case VIEW_DOMAIN:
  317. if((CDomain*)((CServer*)lParam)->GetDomain() == (CDomain*)pCurrentSelectedNode)
  318. bSendMessage = TRUE;
  319. break;
  320. case VIEW_SERVER:
  321. if((void*)lParam == pCurrentSelectedNode)
  322. bSendMessage = TRUE;
  323. break;
  324. case VIEW_WINSTATION:
  325. if((CServer*)lParam == (CServer*)((CWinStation*)pCurrentSelectedNode)->GetServer())
  326. bSendMessage = TRUE;
  327. break;
  328. }
  329. if(bSendMessage) {
  330. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_UPDATE_PROCESSES, wParam, lParam);
  331. }
  332. return 0;
  333. } // end CRightPane::OnAdminUpdateProcesses
  334. /////////////////////////////////////
  335. // CRightPane::OnAdminRemoveProcess
  336. //
  337. LRESULT CRightPane::OnAdminRemoveProcess(WPARAM wParam, LPARAM lParam)
  338. {
  339. ASSERT(lParam);
  340. // We only want to send this along if "All Listed Servers", VIEW_DOMAIN, or VIEW_SERVER is
  341. // the current view
  342. if(m_CurrViewType == VIEW_ALL_SERVERS || m_CurrViewType == VIEW_DOMAIN || m_CurrViewType == VIEW_WINSTATION) {
  343. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_REMOVE_PROCESS, wParam, lParam);
  344. return 0;
  345. }
  346. void *pCurrentSelectedNode = ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode();
  347. if(m_CurrViewType == VIEW_SERVER && ((CServer*)((CProcess*)lParam)->GetServer() == (CServer*)pCurrentSelectedNode))
  348. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_REMOVE_PROCESS, wParam, lParam);
  349. return 0;
  350. } // end CRightPane::OnAdminUpdateProcesses
  351. /////////////////////////////////////
  352. // CRightPane::OnAdminRedisplayProcesses
  353. //
  354. LRESULT CRightPane::OnAdminRedisplayProcesses(WPARAM wParam, LPARAM lParam)
  355. {
  356. ASSERT(lParam);
  357. void *pCurrentSelectedNode = NULL;
  358. if(m_CurrViewType == VIEW_ALL_SERVERS || m_CurrViewType == VIEW_DOMAIN
  359. || m_CurrViewType == VIEW_SERVER || m_CurrViewType == VIEW_WINSTATION)
  360. {
  361. if( m_CurrViewType == VIEW_ALL_SERVERS )
  362. {
  363. pCurrentSelectedNode = ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode();
  364. }
  365. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_REDISPLAY_PROCESSES, ( WPARAM )m_CurrViewType , ( LPARAM )pCurrentSelectedNode );
  366. }
  367. return 0;
  368. } // end CRightPane::OnAdminRedisplayProcesses
  369. /////////////////////////////////////
  370. // CRightPane::OnAdminUpdateWinStations
  371. //
  372. LRESULT CRightPane::OnAdminUpdateWinStations(WPARAM wParam, LPARAM lParam)
  373. {
  374. ASSERT(lParam);
  375. BOOL bSendMessage = FALSE;
  376. void *pCurrentSelectedNode = ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode();
  377. switch(m_CurrViewType) {
  378. case VIEW_ALL_SERVERS:
  379. ODS( L"CRightPane::OnAdminUpdateWinStations -- VIEW_ALL_SERVERS\n" );
  380. bSendMessage = TRUE;
  381. break;
  382. case VIEW_DOMAIN:
  383. ODS( L"CRightPane::OnAdminUpdateWinStations -- VIEW_DOMAIN\n" );
  384. if((CDomain*)((CServer*)lParam)->GetDomain() == (CDomain*)pCurrentSelectedNode)
  385. bSendMessage = TRUE;
  386. break;
  387. case VIEW_SERVER:
  388. ODS( L"CRightPane::OnAdminUpdateWinStations -- VIEW_SERVER\n" );
  389. if((void*)lParam == pCurrentSelectedNode)
  390. bSendMessage = TRUE;
  391. break;
  392. case VIEW_WINSTATION:
  393. ODS( L"CRightPane::OnAdminUpdateWinStations -- VIEW_WINSTATION\n" );
  394. if((CServer*)lParam == (CServer*)((CWinStation*)pCurrentSelectedNode)->GetServer())
  395. bSendMessage = TRUE;
  396. break;
  397. }
  398. if(bSendMessage) {
  399. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_UPDATE_WINSTATIONS, wParam, lParam);
  400. }
  401. return 0;
  402. } // end CRightPane::OnAdminUpdateWinStations
  403. /////////////////////////////////////
  404. // CRightPane::OnAdminUpdateServerInfo
  405. //
  406. LRESULT CRightPane::OnAdminUpdateServerInfo(WPARAM wParam, LPARAM lParam)
  407. {
  408. ASSERT(lParam);
  409. BOOL bSendMessage = FALSE;
  410. void *pCurrentSelectedNode = ((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode();
  411. switch(m_CurrViewType) {
  412. case VIEW_DOMAIN:
  413. if((CDomain*)((CServer*)lParam)->GetDomain() == (CDomain*)pCurrentSelectedNode)
  414. bSendMessage = TRUE;
  415. break;
  416. case VIEW_SERVER:
  417. if((void*)lParam == pCurrentSelectedNode)
  418. bSendMessage = TRUE;
  419. break;
  420. case VIEW_WINSTATION:
  421. if((CServer*)lParam == (CServer*)((CWinStation*)pCurrentSelectedNode)->GetServer())
  422. bSendMessage = TRUE;
  423. break;
  424. }
  425. if(bSendMessage) {
  426. views[m_CurrViewType].m_pView->SendMessage(WM_ADMIN_UPDATE_SERVER_INFO, wParam, lParam);
  427. }
  428. return 0;
  429. } // end CRightPane::OnAdminUpdateServerInfo
  430. /////////////////////////////////////
  431. // CRightPane::OnAdminRedisplayLicenses
  432. //
  433. LRESULT CRightPane::OnAdminRedisplayLicenses(WPARAM wParam, LPARAM lParam)
  434. {
  435. ASSERT(lParam);
  436. if(m_CurrViewType == VIEW_ALL_SERVERS)
  437. views[VIEW_ALL_SERVERS].m_pView->SendMessage(WM_ADMIN_REDISPLAY_LICENSES, wParam, lParam);
  438. else if(m_CurrViewType == VIEW_DOMAIN && (CDomain*)((CServer*)lParam)->GetDomain() == (CDomain*)((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode())
  439. views[VIEW_DOMAIN].m_pView->SendMessage(WM_ADMIN_REDISPLAY_LICENSES, wParam, lParam);
  440. else if(m_CurrViewType == VIEW_SERVER && (CServer*)lParam == (CServer*)((CWinAdminDoc*)((CWinAdminApp*)AfxGetApp())->GetDocument())->GetCurrentSelectedNode())
  441. views[VIEW_SERVER].m_pView->SendMessage(WM_ADMIN_REDISPLAY_LICENSES, wParam, lParam);
  442. return 0;
  443. } // end CRightPane::OnAdminRedisplayLicenses
  444. /////////////////////////////////////
  445. // CRightPane::OnSetFocus
  446. //
  447. void CRightPane::OnSetFocus(CWnd* pOldWnd)
  448. {
  449. CView::OnSetFocus(pOldWnd);
  450. views[m_CurrViewType].m_pView->SetFocus();
  451. } // end CRightPane::OnSetFocus
  452. LRESULT CRightPane::OnTabbedView(WPARAM wParam, LPARAM lParam)
  453. {
  454. return views[ m_CurrViewType ].m_pView->SendMessage( WM_ADMIN_TABBED_VIEW , 0 , 0 );
  455. }
  456. LRESULT CRightPane::OnShiftTabbedView( WPARAM , LPARAM )
  457. {
  458. return views[ m_CurrViewType ].m_pView->SendMessage( WM_ADMIN_SHIFTTABBED_VIEW , 0 , 0 );
  459. }
  460. LRESULT CRightPane::OnCtrlTabbedView( WPARAM , LPARAM )
  461. {
  462. return views[ m_CurrViewType ].m_pView->SendMessage( WM_ADMIN_CTRLTABBED_VIEW , 0 , 0 );
  463. }
  464. LRESULT CRightPane::OnCtrlShiftTabbedView( WPARAM , LPARAM )
  465. {
  466. return views[ m_CurrViewType ].m_pView->SendMessage( WM_ADMIN_CTRLSHIFTTABBED_VIEW , 0 , 0 );
  467. }
  468. LRESULT CRightPane::OnNextPane( WPARAM , LPARAM )
  469. {
  470. return views[ m_CurrViewType ].m_pView->SendMessage( WM_ADMIN_NEXTPANE_VIEW , 0 , 0 );
  471. }