1125 lines
32 KiB
C++
1125 lines
32 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// SplitFrm.cpp
|
|
//
|
|
// Abstract:
|
|
// Implementation of the CSplitterFrame class.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) May 1, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "ConstDef.h"
|
|
#include "SplitFrm.h"
|
|
#include "MainFrm.h"
|
|
#include "TreeView.h"
|
|
#include "ListView.h"
|
|
#include "TraceTag.h"
|
|
#include "ExtDll.h"
|
|
#include "ClusItem.h"
|
|
#include "ClusDoc.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global Variables
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _DEBUG
|
|
CTraceTag g_tagSplitFrame(_T("UI"), _T("SPLITTER FRAME"), 0);
|
|
CTraceTag g_tagSplitFrameMenu(_T("Menu"), _T("SPLITTER FRAME MENU"), 0);
|
|
CTraceTag g_tagSplitFrameDrag(_T("Drag&Drop"), _T("SPLITTER FRAME DRAG"), 0);
|
|
CTraceTag g_tagSplitFrameDragMouse(_T("Drag&Drop"), _T("SPLITTER FRAME DRAG MOUSE"), 0);
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSplitterFrame
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
|
|
BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
|
|
//{{AFX_MSG_MAP(CSplitterFrame)
|
|
ON_WM_CONTEXTMENU()
|
|
ON_WM_DESTROY()
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_LARGE_ICONS, OnUpdateLargeIconsView)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_SMALL_ICONS, OnUpdateSmallIconsView)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateListView)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_DETAILS, OnUpdateDetailsView)
|
|
ON_COMMAND(ID_VIEW_LARGE_ICONS, OnLargeIconsView)
|
|
ON_COMMAND(ID_VIEW_SMALL_ICONS, OnSmallIconsView)
|
|
ON_COMMAND(ID_VIEW_LIST, OnListView)
|
|
ON_COMMAND(ID_VIEW_DETAILS, OnDetailsView)
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_RBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
#ifdef _DEBUG
|
|
ON_WM_MDIACTIVATE()
|
|
#endif
|
|
ON_MESSAGE(WM_CAM_UNLOAD_EXTENSION, OnUnloadExtension)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 0, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 1, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 2, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 3, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 4, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 5, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 6, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 7, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 8, OnUpdateExtMenu)
|
|
ON_UPDATE_COMMAND_UI(CAEXT_MENU_FIRST_ID + 9, OnUpdateExtMenu)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::CSplitterFrame
|
|
//
|
|
// Routine Description:
|
|
// Default constructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CSplitterFrame::CSplitterFrame(void)
|
|
{
|
|
m_pdoc = NULL;
|
|
m_iFrame = 0;
|
|
m_pext = NULL;
|
|
|
|
// Initialize drag & drop.
|
|
m_bDragging = FALSE;
|
|
m_pimagelist = NULL;
|
|
m_pciDrag = NULL;
|
|
|
|
} //*** CSplitterFrame::CSplitterFrame()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::CSplitterFrame
|
|
//
|
|
// Routine Description:
|
|
// Destructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CSplitterFrame::~CSplitterFrame(void)
|
|
{
|
|
// Cleanup after ourselves.
|
|
if ((Pdoc() != NULL) && (Pdoc()->PtiCluster() != NULL))
|
|
Pdoc()->PtiCluster()->PreRemoveFromFrameWithChildren(this);
|
|
|
|
// Cleanup any extensions.
|
|
delete Pext();
|
|
|
|
} //*** CSplitterFrame::~CSplitterFrame()
|
|
|
|
#ifdef _DEBUG
|
|
void CSplitterFrame::AssertValid(void) const
|
|
{
|
|
CMDIChildWnd::AssertValid();
|
|
|
|
} //*** CSplitterFrame::AssertValid()
|
|
|
|
void CSplitterFrame::Dump(CDumpContext& dc) const
|
|
{
|
|
CMDIChildWnd::Dump(dc);
|
|
|
|
} //*** CSplitterFrame::Dump()
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::CalculateFrameNumber
|
|
//
|
|
// Routine Description:
|
|
// Calculate the number of this frame connected to the document. This
|
|
// should only be called before the views have been created.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::CalculateFrameNumber(void)
|
|
{
|
|
POSITION pos;
|
|
CView * pview;
|
|
|
|
if (Pdoc() != NULL)
|
|
{
|
|
// At least frame # 1 'cause we exist.
|
|
m_iFrame = 1;
|
|
|
|
pos = Pdoc()->GetFirstViewPosition();
|
|
while (pos != NULL)
|
|
{
|
|
pview = Pdoc()->GetNextView(pos);
|
|
ASSERT_VALID(pview);
|
|
if (pview->IsKindOf(RUNTIME_CLASS(CClusterTreeView)))
|
|
{
|
|
if (pview->GetParentFrame() == this)
|
|
break;
|
|
m_iFrame++;
|
|
} // if: found another tree view
|
|
} // while: more views in the list
|
|
} // if: document associated with frame
|
|
|
|
} //*** CSplitterFrame::CalculateFrameNumber()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::InitFrame
|
|
//
|
|
// Routine Description:
|
|
// Called to initialize the frame after being initially created and
|
|
// after the document has been initialized.
|
|
//
|
|
// Arguments:
|
|
// pDoc Document associated with the frame.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::InitFrame(IN OUT CClusterDoc * pDoc)
|
|
{
|
|
m_pdoc = pDoc;
|
|
ASSERT_VALID(Pdoc());
|
|
|
|
// Calculate the number of our frame so the views can use it.
|
|
CalculateFrameNumber();
|
|
|
|
// Read from the profile.
|
|
{
|
|
CString strSection;
|
|
|
|
strSection.Format(REGPARAM_CONNECTIONS _T("\\%s"), Pdoc()->StrNode());
|
|
// Set window placement.
|
|
{
|
|
WINDOWPLACEMENT wp;
|
|
|
|
if (ReadWindowPlacement(&wp, strSection, NFrameNumber()))
|
|
SetWindowPlacement(&wp);
|
|
|
|
} // Set window placement
|
|
|
|
// Set splitter bar position.
|
|
{
|
|
CString strValueName;
|
|
CString strPosition;
|
|
int nCurWidth;
|
|
int nMaxWidth;
|
|
int nRead;
|
|
|
|
try
|
|
{
|
|
ConstructProfileValueName(strValueName, REGPARAM_SPLITTER_BAR_POS);
|
|
strPosition = AfxGetApp()->GetProfileString(strSection, strValueName);
|
|
nRead = _stscanf(strPosition, _T("%d,%d"), &nCurWidth, &nMaxWidth);
|
|
if (nRead == 2)
|
|
{
|
|
m_wndSplitter.SetColumnInfo(0, nCurWidth, nMaxWidth);
|
|
m_wndSplitter.RecalcLayout();
|
|
} // if: correct number of parameters specified
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->Delete();
|
|
} // catch: CException
|
|
} // Save the splitter bar position
|
|
|
|
// Set the view style of the list view.
|
|
{
|
|
DWORD dwView;
|
|
CString strValueName;
|
|
|
|
try
|
|
{
|
|
// Construct the value name.
|
|
ConstructProfileValueName(strValueName, REGPARAM_VIEW);
|
|
|
|
// Read the view setting.
|
|
dwView = AfxGetApp()->GetProfileInt(strSection, strValueName, (LVS_ICON | LVS_REPORT));
|
|
PviewList()->SetView(dwView);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->Delete();
|
|
} // catch: CException
|
|
} // Set the view style of the list view
|
|
} // Read from the profile
|
|
|
|
} //*** CSplitterFrame::InitFrame()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnCreateClient
|
|
//
|
|
// Routine Description:
|
|
// Called to create the client views for the frame. Here we create
|
|
// a splitter window with two views -- a tree view and a list view.
|
|
//
|
|
// Arguments:
|
|
// lpcs Pointer to a CREATESTRUCT.
|
|
// pContext Pointer to a create context.
|
|
//
|
|
// Return Value:
|
|
// TRUE Client created successfully.
|
|
// FALSE Failed to create client.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
|
|
{
|
|
// Create a splitter window with 1 row & 2 columns.
|
|
if (!m_wndSplitter.CreateStatic(this, 1, 2))
|
|
{
|
|
Trace(g_tagSplitFrame, _T("Failed to CreateStaticSplitter"));
|
|
return FALSE;
|
|
} // if: error creating splitter window
|
|
|
|
// Add the first splitter pane.
|
|
if (!m_wndSplitter.CreateView(0, 0, pContext->m_pNewViewClass, CSize(200, 50), pContext))
|
|
{
|
|
Trace(g_tagSplitFrame, _T("Failed to create first pane"));
|
|
return FALSE;
|
|
} // if: error creating first splitter pane
|
|
|
|
// Add the second splitter pane.
|
|
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CClusterListView), CSize(0, 0), pContext))
|
|
{
|
|
Trace(g_tagSplitFrame, _T("Failed to create second pane"));
|
|
return FALSE;
|
|
} // if: error creating second pane
|
|
|
|
// Activate the tree view.
|
|
// SetActiveView((CView *) PviewTree());
|
|
|
|
// If this is not the first frame on the document, initialize the frame.
|
|
{
|
|
CClusterDoc * pdoc = (CClusterDoc *) pContext->m_pCurrentDoc;
|
|
if (pdoc->StrNode().GetLength() > 0)
|
|
InitFrame(pdoc);
|
|
} // If this is not the first frame on the document, initialize the frame
|
|
|
|
return TRUE;
|
|
|
|
} //*** CSplitterFrame::OnCreateClient()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::ConstructProfileValueName
|
|
//
|
|
// Routine Description:
|
|
// Construct the name of a value that is to be written to the user's
|
|
// profile.
|
|
//
|
|
// Arguments:
|
|
// rstrName [OUT] String in which to return the constructed name.
|
|
// pszPrefix [IN] String to prefix the name with.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::ConstructProfileValueName(
|
|
OUT CString & rstrName,
|
|
IN LPCTSTR pszPrefix
|
|
) const
|
|
{
|
|
ASSERT(pszPrefix != NULL);
|
|
|
|
// Construct the name of the value to read.
|
|
if (NFrameNumber() <= 1)
|
|
rstrName = pszPrefix;
|
|
else
|
|
rstrName.Format(_T("%s-%d"), pszPrefix, NFrameNumber());
|
|
|
|
} //*** CSplitterFrame::ConstructProfileValueName()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::GetMessageString
|
|
//
|
|
// Routine Description:
|
|
// Get a string for a command ID.
|
|
//
|
|
// Arguments:
|
|
// nID [IN] Command ID for which a string should be returned.
|
|
// rMessage [OUT] String in which to return the message.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::GetMessageString(UINT nID, CString& rMessage) const
|
|
{
|
|
BOOL bHandled = FALSE;
|
|
|
|
if ((Pext() != NULL)
|
|
&& (CAEXT_MENU_FIRST_ID <= nID))
|
|
bHandled = Pext()->BGetCommandString(nID, rMessage);
|
|
|
|
if (!bHandled)
|
|
CMDIChildWnd::GetMessageString(nID, rMessage);
|
|
|
|
} //*** CSplitterFrame::GetMessageString()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnContextMenu
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CONTEXTMENU method.
|
|
//
|
|
// Arguments:
|
|
// pWnd Window in which the user right clicked the mouse.
|
|
// point Position of the cursor, in screen coordinates.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnContextMenu(CWnd * pWnd, CPoint point)
|
|
{
|
|
CView * pviewActive = GetActiveView();
|
|
CMenu * pmenu = NULL;
|
|
CClusterItem * pci = NULL;
|
|
|
|
Trace(g_tagSplitFrame, _T("OnContextMenu()"));
|
|
|
|
if (!BDragging())
|
|
{
|
|
if (pviewActive == PviewTree())
|
|
pmenu = PviewTree()->PmenuPopup(point, pci);
|
|
else if (pviewActive == PviewList())
|
|
pmenu = PviewList()->PmenuPopup(point, pci);
|
|
|
|
if (pmenu == NULL)
|
|
pmenu = PmenuPopup();
|
|
} // if: not dragging
|
|
|
|
if (pmenu != NULL)
|
|
{
|
|
// If there is an extension already loaded, unload it.
|
|
delete Pext();
|
|
m_pext = NULL;
|
|
|
|
// If there is an extension for this item, load it.
|
|
if ((pci != NULL)
|
|
&& (pci->PlstrExtensions() != NULL)
|
|
&& (pci->PlstrExtensions()->GetCount() > 0))
|
|
{
|
|
CWaitCursor wc;
|
|
|
|
try
|
|
{
|
|
m_pext = new CExtensions;
|
|
if ( m_pext == NULL )
|
|
{
|
|
AfxThrowMemoryException();
|
|
} // if: error allocating the extensions object
|
|
Pext()->AddContextMenuItems(
|
|
pmenu->GetSubMenu(0),
|
|
*pci->PlstrExtensions(),
|
|
pci
|
|
);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
#ifdef _DEBUG
|
|
TCHAR szError[256];
|
|
pe->GetErrorMessage(szError, sizeof(szError) / sizeof(TCHAR));
|
|
Trace(g_tagError, _T("CSplitterFrame::OnContextMenu() - Error loading extension DLL - %s"), szError);
|
|
#endif
|
|
pe->Delete();
|
|
|
|
delete Pext();
|
|
m_pext = NULL;
|
|
} // catch: CException
|
|
} // if: this item has an extension
|
|
|
|
// Display the menu.
|
|
if (!pmenu->GetSubMenu(0)->TrackPopupMenu(
|
|
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
|
point.x,
|
|
point.y,
|
|
AfxGetMainWnd()
|
|
))
|
|
{
|
|
delete Pext();
|
|
m_pext = NULL;
|
|
} // if: unsuccessfully displayed the menu
|
|
else if (Pext() != NULL)
|
|
PostMessage(WM_CAM_UNLOAD_EXTENSION, NULL, NULL);;
|
|
pmenu->DestroyMenu();
|
|
delete pmenu;
|
|
} // if: there is a menu to display
|
|
|
|
} //*** CSplitterFrame::OnContextMenu()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::PmenuPopup
|
|
//
|
|
// Routine Description:
|
|
// Returns a popup menu.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// pmenu A popup menu for the item.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CMenu * CSplitterFrame::PmenuPopup( void ) const
|
|
{
|
|
CMenu * pmenu;
|
|
|
|
// Load the menu.
|
|
pmenu = new CMenu;
|
|
if ( pmenu == NULL )
|
|
{
|
|
AfxThrowMemoryException();
|
|
} // if: error allocating the menu
|
|
|
|
if ( ! pmenu->LoadMenu( IDM_VIEW_POPUP ) )
|
|
{
|
|
delete pmenu;
|
|
pmenu = NULL;
|
|
} // if: error loading the menu
|
|
|
|
return pmenu;
|
|
|
|
} //*** CSplitterFrame::PmenuPopup()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnCmdMsg
|
|
//
|
|
// Routine Description:
|
|
// Processes command messages. If an extension DLL is loaded and the
|
|
// message is a command selection, pass it on to the DLL.
|
|
//
|
|
// Arguments:
|
|
// nID [IN] Command ID.
|
|
// nCode [IN] Notification code.
|
|
// pExtra [IN OUT] Used according to the value of nCode.
|
|
// pHandlerInfo [OUT] ???
|
|
//
|
|
// Return Value:
|
|
// TRUE Message has been handled.
|
|
// FALSE Message has NOT been handled.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CSplitterFrame::OnCmdMsg(
|
|
UINT nID,
|
|
int nCode,
|
|
void * pExtra,
|
|
AFX_CMDHANDLERINFO * pHandlerInfo
|
|
)
|
|
{
|
|
BOOL bHandled = FALSE;
|
|
|
|
// If there is an extension DLL loaded, see if it wants to handle this message.
|
|
if ((Pext() != NULL) && (nCode == 0))
|
|
{
|
|
Trace(g_tagSplitFrame, _T("OnCmdMsg() - Passing message to extension (ID = %d)"), nID);
|
|
bHandled = Pext()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
|
|
|
|
// Unload the extension DLL if there is one loaded.
|
|
if (bHandled)
|
|
{
|
|
delete Pext();
|
|
m_pext = NULL;
|
|
} // if: message was handled
|
|
} // if: there is an extension DLL loaded
|
|
|
|
// if ((CAEXT_MENU_FIRST_ID <= nID) && (nID <= CAEXT_MENU_LAST_ID))
|
|
// Trace(g_tagSplitFrame, _T("CSplitterFrame::OnCmdMsg() - nID = %d, nCode = 0x%08.8x, pExtra = 0x%08.8x\n"), nID, nCode, pExtra);
|
|
|
|
if (!bHandled)
|
|
bHandled = CMDIChildWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
|
|
|
|
return bHandled;
|
|
|
|
} //*** CSplitterFrame::OnCmdMsg()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnUpdateExtMenu
|
|
//
|
|
// Routine Description:
|
|
// Determines whether extension menu items should be enabled or not.
|
|
//
|
|
// Arguments:
|
|
// pCmdUI [IN OUT] Command routing object.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnUpdateExtMenu(CCmdUI * pCmdUI)
|
|
{
|
|
if (Pext() != NULL)
|
|
Pext()->OnUpdateCommand(pCmdUI);
|
|
|
|
} //*** CSplitterFrame::OnUpdateExtMenu()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnUnloadExtension
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_CAM_UNLOAD_EXTENSION message.
|
|
//
|
|
// Arguments:
|
|
// wparam 1st parameter.
|
|
// lparam 2nd parameter.
|
|
//
|
|
// Return Value:
|
|
// ERROR_SUCCESS
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT CSplitterFrame::OnUnloadExtension(WPARAM wparam, LPARAM lparam)
|
|
{
|
|
Trace(g_tagSplitFrame, _T("OnUnloadExtension() - m_pext = 0x%08.8x"), Pext());
|
|
delete Pext();
|
|
m_pext = NULL;
|
|
return ERROR_SUCCESS;
|
|
|
|
} //*** CSplitterFrame::OnUnloadExtension()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnDestroy
|
|
//
|
|
// Routine Description:
|
|
// Handler method for the WM_DESTROY message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnDestroy(void)
|
|
{
|
|
// Display information about the current menu.
|
|
TraceMenu(g_tagSplitFrameMenu, AfxGetMainWnd()->GetMenu(), _T("Menu before child wnd destroyed: "));
|
|
|
|
// Save current settings.
|
|
if (Pdoc() != NULL)
|
|
{
|
|
CString strSection;
|
|
|
|
// Construct the section name.
|
|
ASSERT_VALID(Pdoc());
|
|
strSection.Format(REGPARAM_CONNECTIONS _T("\\%s"), Pdoc()->StrNode());
|
|
|
|
// Save the current window position information.
|
|
{
|
|
WINDOWPLACEMENT wp;
|
|
|
|
wp.length = sizeof wp;
|
|
if (GetWindowPlacement(&wp))
|
|
{
|
|
wp.flags = 0;
|
|
if (IsZoomed())
|
|
wp.flags |= WPF_RESTORETOMAXIMIZED;
|
|
|
|
// and write it to the .INI file
|
|
WriteWindowPlacement(&wp, strSection, NFrameNumber());
|
|
} // if: window placement retrieved successfully
|
|
} // Save the current window position information
|
|
|
|
// Save the splitter bar position.
|
|
{
|
|
CString strValueName;
|
|
CString strPosition;
|
|
int nCurWidth;
|
|
int nMaxWidth;
|
|
|
|
m_wndSplitter.GetColumnInfo(0, nCurWidth, nMaxWidth);
|
|
ConstructProfileValueName(strValueName, REGPARAM_SPLITTER_BAR_POS);
|
|
strPosition.Format(_T("%d,%d"), nCurWidth, nMaxWidth);
|
|
AfxGetApp()->WriteProfileString(strSection, strValueName, strPosition);
|
|
} // Save the splitter bar position
|
|
|
|
// Save the current list view style.
|
|
{
|
|
DWORD dwView;
|
|
CString strValueName;
|
|
|
|
// Construct the value name.
|
|
ConstructProfileValueName(strValueName, REGPARAM_VIEW);
|
|
|
|
// Save the view setting.
|
|
dwView = PviewList()->GetView();
|
|
AfxGetApp()->WriteProfileInt(strSection, strValueName, dwView);
|
|
} // Save the current list view style
|
|
} // if: document is valid
|
|
|
|
// Call the base class method.
|
|
CMDIChildWnd::OnDestroy();
|
|
|
|
// Display information about the current menu.
|
|
TraceMenu(g_tagSplitFrameMenu, AfxGetMainWnd()->GetMenu(), _T("Menu after child wnd destroyed: "));
|
|
|
|
} //*** CSplitterFrame::OnDestroy()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnUpdateLargeIconsView
|
|
// CSplitterFrame::OnUpdateSmallIconsView
|
|
// CSplitterFrame::OnUpdateListView
|
|
// CSplitterFrame::OnUpdateDetailsView
|
|
//
|
|
// Routine Description:
|
|
// Determines whether menu items corresponding to ID_VIEW_LARGE_ICONS,
|
|
// ID_VIEW_SMALL_ICONS, ID_VIEW_LIST, and ID_VIEW_DETAILS should be
|
|
// enabled or not.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnUpdateLargeIconsView(CCmdUI * pCmdUI)
|
|
{
|
|
int nCheck;
|
|
|
|
nCheck = PviewList()->GetView();
|
|
pCmdUI->SetRadio(nCheck == LVS_ICON);
|
|
pCmdUI->Enable();
|
|
|
|
} //*** CSplitterFrame::OnUpdateLargeIconsView()
|
|
|
|
void CSplitterFrame::OnUpdateSmallIconsView(CCmdUI * pCmdUI)
|
|
{
|
|
int nCheck;
|
|
|
|
nCheck = PviewList()->GetView();
|
|
pCmdUI->SetRadio(nCheck == LVS_SMALLICON);
|
|
pCmdUI->Enable();
|
|
|
|
} //*** CSplitterFrame::OnUpdateSmallIconsView()
|
|
|
|
void CSplitterFrame::OnUpdateListView(CCmdUI * pCmdUI)
|
|
{
|
|
int nCheck;
|
|
|
|
nCheck = PviewList()->GetView();
|
|
pCmdUI->SetRadio(nCheck == LVS_LIST);
|
|
pCmdUI->Enable();
|
|
|
|
} //*** CSplitterFrame::OnUpdateListView()
|
|
|
|
void CSplitterFrame::OnUpdateDetailsView(CCmdUI * pCmdUI)
|
|
{
|
|
int nCheck;
|
|
|
|
nCheck = PviewList()->GetView();
|
|
pCmdUI->SetRadio(nCheck == (LVS_REPORT | LVS_ICON));
|
|
pCmdUI->Enable();
|
|
|
|
} //*** CSplitterFrame::OnUpdateDetailsView()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnCmdLargeIconsView
|
|
// CSplitterFrame::OnCmdSmallIconsView
|
|
// CSplitterFrame::OnCmdListView
|
|
// CSplitterFrame::OnCmdDetailsView
|
|
//
|
|
// Routine Description:
|
|
// Processes the ID_VIEW_LARGE_ICONS, ID_VIEW_SMALL_ICONS, ID_VIEW_LIST,
|
|
// and ID_VIEW_DETAILS menu commands.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnLargeIconsView(void)
|
|
{
|
|
PviewList()->SetView(LVS_ICON);
|
|
|
|
} //*** CSplitterFrame::OnLargeIconsView()
|
|
|
|
void CSplitterFrame::OnSmallIconsView(void)
|
|
{
|
|
PviewList()->SetView(LVS_SMALLICON);
|
|
|
|
} //*** CSplitterFrame::OnSmallIconsView()
|
|
|
|
void CSplitterFrame::OnListView(void)
|
|
{
|
|
PviewList()->SetView(LVS_LIST);
|
|
|
|
} //*** CSplitterFrame::OnListView()
|
|
|
|
void CSplitterFrame::OnDetailsView(void)
|
|
{
|
|
PviewList()->SetView(LVS_REPORT | LVS_ICON);
|
|
|
|
} //*** CSplitterFrame::OnDetailsView()
|
|
|
|
#ifdef _DEBUG
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnMDIActivate
|
|
//
|
|
// Routine Description:
|
|
// Handler method for the WM_MDIACTIVATE message.
|
|
//
|
|
// Arguments:
|
|
// bActivate [IN] TRUE if the child is being activated and FALSE
|
|
// if it is being deactivated.
|
|
// pActivateWnd [IN OUT] Child window to be activated.
|
|
// pDeactivateWnd [IN OUT] Child window being deactivated.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
|
|
{
|
|
if (g_tagSplitFrameMenu.BAny())
|
|
{
|
|
if (!bActivate)
|
|
{
|
|
CMDIFrameWnd * pFrame = GetMDIFrame();
|
|
CMenu menuDefault;
|
|
|
|
TraceMenu(g_tagSplitFrameMenu, AfxGetMainWnd()->GetMenu(), _T("Menu before deactivating: "));
|
|
menuDefault.Attach(pFrame->m_hMenuDefault);
|
|
TraceMenu(g_tagSplitFrameMenu, &menuDefault, _T("Frame menu before deactivating: "));
|
|
menuDefault.Detach();
|
|
} // if: deactivating
|
|
else
|
|
{
|
|
CMDIFrameWnd * pFrame = GetMDIFrame();
|
|
CMenu menuDefault;
|
|
|
|
menuDefault.Attach(pFrame->m_hMenuDefault);
|
|
TraceMenu(g_tagSplitFrameMenu, &menuDefault, _T("Frame menu before activating: "));
|
|
menuDefault.Detach();
|
|
} // else: activating
|
|
} // if: tag is active
|
|
|
|
CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
|
|
|
|
if (!bActivate)
|
|
TraceMenu(g_tagSplitFrameMenu, AfxGetMainWnd()->GetMenu(), _T("Menu after deactivating: "));
|
|
|
|
} //*** CSplitterFrame::OnMDIActivate()
|
|
#endif // _DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::BeginDrag
|
|
//
|
|
// Routine Description:
|
|
// Called by a view to begin a drag operation.
|
|
//
|
|
// Arguments:
|
|
// pimagelist [IN OUT] Image list to use for the drag operation.
|
|
// pci [IN OUT] Cluster item being dragged.
|
|
// ptImage [IN] Specifies the x- and y-coordinate of the cursor.
|
|
// ptStart [IN] Specifies the x- and y-coordinate of the start position.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::BeginDrag(
|
|
IN OUT CImageList * pimagelist,
|
|
IN OUT CClusterItem * pci,
|
|
IN CPoint ptImage,
|
|
IN CPoint ptStart
|
|
)
|
|
{
|
|
ASSERT(!BDragging());
|
|
ASSERT(pimagelist != NULL);
|
|
ASSERT_VALID(pci);
|
|
|
|
// Save the cluster item.
|
|
m_pciDrag = pci;
|
|
|
|
// Prepare the image list.
|
|
m_pimagelist = pimagelist;
|
|
VERIFY(Pimagelist()->BeginDrag(0, ptStart));
|
|
VERIFY(Pimagelist()->DragEnter(this, ptImage));
|
|
SetCapture();
|
|
|
|
// Set the dragging state.
|
|
m_bDragging = TRUE;
|
|
|
|
// Let each view initialize for the drag operation.
|
|
PviewTree()->BeginDrag();
|
|
PviewList()->BeginDrag();
|
|
|
|
} //*** CSplitterFrame::BeginDrag()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnMouseMove
|
|
//
|
|
// Routine Description:
|
|
// Handler method for the WM_MOUSEMOVE message during a drag operation.
|
|
//
|
|
// Arguments:
|
|
// nFlags Indicates whether various virtual keys are down.
|
|
// point Specifies the x- and y-coordinate of the cursor in frame
|
|
// coordinates.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
// If we are dragging, move the drag image.
|
|
if (BDragging())
|
|
{
|
|
CWnd * pwndDrop;
|
|
|
|
Trace(g_tagSplitFrameDragMouse, _T("OnMouseMove() - Moving to (%d,%d)"), point.x, point.y);
|
|
|
|
// Move the item.
|
|
ASSERT(Pimagelist() != NULL);
|
|
VERIFY(Pimagelist()->DragMove(point));
|
|
|
|
// Get the child window for this point.
|
|
pwndDrop = ChildWindowFromPoint(point);
|
|
if (pwndDrop == &m_wndSplitter)
|
|
pwndDrop = m_wndSplitter.ChildWindowFromPoint(point);
|
|
if ((pwndDrop == PviewTree()) || (pwndDrop == PviewList()))
|
|
pwndDrop->SetFocus();
|
|
PviewTree()->OnMouseMoveForDrag(nFlags, point, pwndDrop);
|
|
PviewList()->OnMouseMoveForDrag(nFlags, point, pwndDrop);
|
|
|
|
} // if: tree item is being dragged
|
|
|
|
// Call the base class method.
|
|
CMDIChildWnd::OnMouseMove(nFlags, point);
|
|
|
|
} //*** CSplitterFrame::OnMouseMove()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnLButtonUp
|
|
// CSplitterFrame::OnRButtonUp
|
|
// CSplitterFrame::OnButtonUp
|
|
//
|
|
// Routine Description:
|
|
// Handler method for the WM_LBUTTONUP and WM_RBUTTONUP messages.
|
|
//
|
|
// Arguments:
|
|
// nFlags Indicates whether various virtual keys are down.
|
|
// point Specifies the x- and y-coordinate of the cursor.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
CMDIChildWnd::OnLButtonUp(nFlags, point);
|
|
OnButtonUp(nFlags, point);
|
|
|
|
} //*** CSplitterFrame::OnLButtonUp()
|
|
|
|
void CSplitterFrame::OnRButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
CMDIChildWnd::OnRButtonUp(nFlags, point);
|
|
OnButtonUp(nFlags, point);
|
|
|
|
} //*** CSplitterFrame::OnRButtonUp()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::OnButtonUp
|
|
//
|
|
// Routine Description:
|
|
// Process a button up event by ending an active drag operation.
|
|
//
|
|
// Arguments:
|
|
// nFlags Indicates whether various virtual keys are down.
|
|
// point Specifies the x- and y-coordinate of the cursor.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::OnButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
// If we are dragging, process the drop.
|
|
if (BDragging())
|
|
{
|
|
CWnd * pwndChild;
|
|
|
|
Trace(g_tagSplitFrameDrag, _T("OnButtonUp() - Dropping at (%d,%d)"), point.x, point.y);
|
|
|
|
// Cleanup the image list.
|
|
ASSERT(Pimagelist() != NULL);
|
|
VERIFY(Pimagelist()->DragLeave(this));
|
|
Pimagelist()->EndDrag();
|
|
delete m_pimagelist;
|
|
m_pimagelist = NULL;
|
|
|
|
// Get the child window for this point.
|
|
pwndChild = ChildWindowFromPoint(point);
|
|
if (pwndChild == &m_wndSplitter)
|
|
pwndChild = m_wndSplitter.ChildWindowFromPoint(point);
|
|
if (pwndChild == PviewTree())
|
|
PviewTree()->OnButtonUpForDrag(nFlags, point);
|
|
else if (pwndChild == PviewList())
|
|
PviewList()->OnButtonUpForDrag(nFlags, point);
|
|
|
|
// Cleanup.
|
|
PviewTree()->EndDrag();
|
|
PviewList()->EndDrag();
|
|
VERIFY(ReleaseCapture());
|
|
m_bDragging = FALSE;
|
|
m_pciDrag = NULL;
|
|
} // if: tree item is being dragged
|
|
|
|
} //*** CSplitterFrame::OnButtonUp()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::ChangeDragCursor
|
|
//
|
|
// Routine Description:
|
|
// Changes the cursor used for dragging.
|
|
//
|
|
// Arguments:
|
|
// pszCursor [IN] System cursor to load.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::ChangeDragCursor(LPCTSTR pszCursor)
|
|
{
|
|
HCURSOR hcurDrag = LoadCursor(NULL, pszCursor);
|
|
ASSERT(hcurDrag != NULL);
|
|
SetCursor(hcurDrag);
|
|
Pimagelist()->SetDragCursorImage(0, CPoint(0, 0)); // define the hot spot for the new cursor image
|
|
|
|
} //*** CSplitterFrame::ChangeDragCursor()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSplitterFrame::AbortDrag
|
|
//
|
|
// Routine Description:
|
|
// Abort the drag & drop operation currently in progress.
|
|
//
|
|
// Arguments:
|
|
// pszCursor [IN] System cursor to load.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CSplitterFrame::AbortDrag(void)
|
|
{
|
|
ASSERT(BDragging());
|
|
|
|
Trace(g_tagSplitFrameDrag, _T("AbortDrag() - Aborting drag & drop"));
|
|
|
|
// Cleanup the image list.
|
|
ASSERT(Pimagelist() != NULL);
|
|
VERIFY(Pimagelist()->DragLeave(this));
|
|
Pimagelist()->EndDrag();
|
|
delete m_pimagelist;
|
|
m_pimagelist = NULL;
|
|
|
|
// Cleanup.
|
|
PviewTree()->EndDrag();
|
|
PviewList()->EndDrag();
|
|
VERIFY(ReleaseCapture());
|
|
m_bDragging = FALSE;
|
|
m_pciDrag = NULL;
|
|
|
|
} //*** CSplitterFrame::AbortDrag()
|