DragonNest/Third/XTToolkitPro/Samples/Utilities/CommandBarsDesigner/CommandBarsDesignerDoc.cpp
2024-12-19 09:48:26 +08:00

237 lines
5.6 KiB
C++

// CommandBarsDesignerDoc.cpp : implementation of the CCommandBarsDesignerDoc class
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CommandBarsDesigner.h"
#include "CommandBarsDesignerDoc.h"
#include "CommandBarsDesignerView.h"
#include "EmbeddedFrame.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const UINT WM_FILEDATA_RENDER = RegisterWindowMessage(_T("XCB File Data Render"));
const UINT m_cfFormat = RegisterClipboardFormat(_T("XCB File Data"));
/////////////////////////////////////////////////////////////////////////////
// CCommandBarsDesignerDoc
IMPLEMENT_DYNCREATE(CCommandBarsDesignerDoc, CDocument)
BEGIN_MESSAGE_MAP(CCommandBarsDesignerDoc, CDocument)
//{{AFX_MSG_MAP(CCommandBarsDesignerDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CCommandBarsDesignerDoc, CDocument)
//{{AFX_DISPATCH_MAP(CCommandBarsDesignerDoc)
DISP_FUNCTION(CCommandBarsDesignerDoc, "OnEdit", OnEdit, VT_BOOL, VTS_HANDLE)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
// Note: we add support for IID_ICommandBarsDesigner to support typesafe binding
// from VBA. This IID must match the GUID that is attached to the
// dispinterface in the .ODL file.
// {157FA069-D75C-4E71-A537-7C86F65FB7E9}
static const IID IID_ICommandBarsDesigner =
{ 0x157fa069, 0xd75c, 0x4e71, { 0xa5, 0x37, 0x7c, 0x86, 0xf6, 0x5f, 0xb7, 0xe9 } };
BEGIN_INTERFACE_MAP(CCommandBarsDesignerDoc, CDocument)
INTERFACE_PART(CCommandBarsDesignerDoc, IID_ICommandBarsDesigner, Dispatch)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommandBarsDesignerDoc construction/destruction
CCommandBarsDesignerDoc::CCommandBarsDesignerDoc()
{
m_hwndEdit = 0;
EnableAutomation();
AfxOleLockApp();
}
CCommandBarsDesignerDoc::~CCommandBarsDesignerDoc()
{
AfxOleUnlockApp();
}
BOOL CCommandBarsDesignerDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CCommandBarsDesignerDoc serialization
void CCommandBarsDesignerDoc::Serialize(CArchive& ar)
{
POSITION pos = GetFirstViewPosition();
if (pos)
{
CCommandBarsDesignerView* pView = (CCommandBarsDesignerView*)GetNextView(pos);
ASSERT(pView);
pView->Serialize(ar);
}
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CCommandBarsDesignerDoc diagnostics
#ifdef _DEBUG
void CCommandBarsDesignerDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CCommandBarsDesignerDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCommandBarsDesignerDoc commands
BOOL CCommandBarsDesignerDoc::OnEdit(HWND hWnd)
{
ASSERT(m_bEmbedded);
m_hwndEdit = hWnd;
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
pMainFrame->ShowWindow(SW_SHOW);
pMainFrame->UpdateWindow();
POSITION pos = GetFirstViewPosition();
CCommandBarsDesignerView* pView = (CCommandBarsDesignerView*)GetNextView(pos);
pView->GetParent()->ShowWindow(SW_SHOWMAXIMIZED);
if (!OpenClipboard(hWnd))
return FALSE;
if (::IsClipboardFormatAvailable(m_cfFormat))
{
HGLOBAL hGlobal = GetClipboardData (m_cfFormat);
LPVOID pData = GlobalLock(hGlobal);
CMemFile file((BYTE*)pData + sizeof(DWORD), *(DWORD*)pData);
CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete);
Serialize(ar);
GlobalUnlock(hGlobal);
}
else
{
pView->GetEmbeddedFrame()->Clear();
}
::CloseClipboard();
pView->OnInitialUpdate();
pMainFrame->RefreshPanes(TRUE);
return TRUE;
}
BOOL CCommandBarsDesignerDoc::DoFileSave()
{
if (m_bEmbedded)
{
ASSERT(m_hwndEdit);
m_bModified = FALSE;
CMemFile file;
CArchive ar(&file, CArchive::store);
Serialize(ar);
ar.Flush();
DWORD dwSize = (DWORD)file.GetPosition();
BYTE* pFileData = file.Detach();
HGLOBAL hDesignerData = GlobalAlloc(GMEM_FIXED, dwSize + sizeof(DWORD));
LPVOID pData = GlobalLock(hDesignerData);
*((DWORD*)pData) = dwSize;
memcpy((BYTE*)pData + sizeof(DWORD), pFileData, dwSize);
GlobalUnlock(hDesignerData);
ar.Abort();
file.Close();
if (!::OpenClipboard (0))
return TRUE;
if (!::EmptyClipboard ())
{
::CloseClipboard ();
return TRUE;
}
UINT uFormat = RegisterClipboardFormat(_T("XCB File Data"));
SetClipboardData(uFormat, hDesignerData);
::CloseClipboard();
SendMessage(m_hwndEdit, WM_FILEDATA_RENDER, 0, 0);
if (AfxGetMainWnd() && AfxGetMainWnd()->GetSafeHwnd())
{
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
return TRUE;
}
return CDocument::DoFileSave();
}