|
发表于 2005-12-13 17:36:00
|
显示全部楼层
// (C) Copyright 1998-2002 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
// MDITestDialog.cpp : implementation file
//
#include "stdafx.h"
#include "acdocman.h"
#include "MDITestDialog.h"
#include "common.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern "C" HWND adsw_acadMainWnd();
/////////////////////////////////////////////////////////////////////////////
// MDITestDialog message handlers
/////////////////////////////////////////////////////////////////////////////
// CMDITestDialog dialog
CMDITestDialog::CMDITestDialog(CWnd* pParent /*=NULL*/)
: CDialog(CMDITestDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CMDITestDialog)
//}}AFX_DATA_INIT
}
void CMDITestDialog:oDataExchange(CDataExchange* pDX)
{
CDialog:oDataExchange(pDX);
//{{AFX_DATA_MAP(CMDITestDialog)
DDX_Control(pDX, IDC_ACT_MYLK_STATUS_FIELD_STATIC, m_staticActDocMyLockStatus);
DDX_Control(pDX, IDC_CURDOC_FIELD_STATIC, m_staticCurrentDoc);
DDX_Control(pDX, IDC_CUR_LK_STATUS_FIELD_STATIC, m_staticCurDocLockStatus);
DDX_Control(pDX, IDC_CUR_MYLK_STATUS_FIELD_STATIC, m_staticCurDocMyLockStatus);
DDX_Control(pDX, IDC_ACT_LK_STATUS_FIELD_STATIC, m_staticActDocLockStatus);
DDX_Control(pDX, IDC_LOCK_COMBO, m_lockCombo);
DDX_Control(pDX, IDC_ACTIVEDOC_FIELD_STATIC, m_staticActiveDoc);
DDX_Control(pDX, IDC_TOBECURRDOC_FIELD_STATIC, m_staticToBeCurrDoc);
DDX_Control(pDX, IDC_ACTIVATION_CHECK, m_activationCheck);
DDX_Control(pDX, IDC_NUMDOCS_STATIC, m_staticDocNum);
DDX_Control(pDX, IDC_DOC_LIST, m_docListBox);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMDITestDialog, CDialog)
ON_MESSAGE( WM_ACAD_KEEPFOCUS, onAcadKeepFocus )
ON_MESSAGE( WM_ACAD_UPDATEDIALOG, onAcadUpdateDialog )
ON_MESSAGE( WM_ACAD_CREATEDOC, onAcadCreateDoc )
ON_MESSAGE( WM_ACAD_DESTROYDOC, onAcadDestroyDoc )
ON_MESSAGE( WM_ACAD_LOCKMODCHANGED, onAcadLockModeChanged )
ON_MESSAGE( WM_ACAD_LOCKMODWILLCHANGE, onAcadLockModeWillChange )
ON_MESSAGE( WM_ACAD_CURRENTDOC, onAcadCurrDoc )
ON_MESSAGE( WM_ACAD_ACTIVATEDOC, onAcadActivateDoc )
ON_MESSAGE( WM_ACAD_DEACTIVATEDOC, onAcadDeactivateDoc )
ON_MESSAGE( WM_ACAD_ACTMODIFIED, onAcadActModifiedDoc )
//{{AFX_MSG_MAP(CMDITestDialog)
ON_BN_CLICKED(IDC_NEWDOC_BUTTON, OnNewdocButton)
ON_BN_CLICKED(IDC_APPNEWDOC_BUTTON, OnAppnewdocButton)
ON_BN_CLICKED(IDC_APPOPENDOC_BUTTON, OnAppopendocButton)
ON_BN_CLICKED(IDC_ACTIVATION_CHECK, OnActivationCheck)
ON_BN_CLICKED(IDC_SENDSTRING_BUTTON, OnSendstringButton)
ON_BN_CLICKED(IDC_OPENDOC_BUTTON, OnOpendocButton)
ON_BN_CLICKED(IDC_ISQUIESCENT_BUTTON, OnIsquiescentButton)
ON_BN_CLICKED(IDC_CLOSEDOC_BUTTON, OnClosedocButton)
ON_BN_CLICKED(IDC_ACTIVATEDOC_BUTTON, OnActivatedocButton)
ON_BN_CLICKED(IDC_SETCURRENTDOC_BUTTON, OnSetcurrentdocButton)
ON_BN_CLICKED(ID_REFRESH_BUTTON, OnRefreshButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMDITestDialog message handlers
BOOL CMDITestDialog::Create( CWnd* pParent )
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::Create(CMDITestDialog::IDD, pParent);
}
// This function gets called repeatedly whenever the mouse is moved over
// the AutoCAD window.
//
LRESULT CMDITestDialog:nAcadKeepFocus( WPARAM, LPARAM )
{
return TRUE;
}
LRESULT CMDITestDialog:nAcadUpdateDialog( WPARAM, LPARAM )
{
// update elements of the dialog to reflect the current
// state of the documents
// get the current number of documents
m_staticDocNum.SetWindowText( getDocCount() );
// check/uncheck document activation
m_activationCheck.SetCheck( acDocManager->isDocumentActivationEnabled() );
// set the current document fields
CString fName;
AcApDocument *pCurrDoc = acDocManager->curDocument();
if( pCurrDoc ) {
fName = pCurrDoc->docTitle();
m_staticCurrentDoc.SetWindowText(fName);
m_staticToBeCurrDoc.SetWindowText(fName);
m_staticCurDocLockStatus.SetWindowText( modeStr(pCurrDoc->lockMode()) );
m_staticCurDocMyLockStatus.SetWindowText( modeStr(pCurrDoc->myLockMode()) );
}
else {
m_staticCurrentDoc.SetWindowText(fName);
m_staticToBeCurrDoc.SetWindowText("");
m_staticCurDocLockStatus.SetWindowText("");
m_staticCurDocMyLockStatus.SetWindowText("");
}
// set the active document data
AcApDocument *pActDoc = acDocManager->mdiActiveDocument();
if( pActDoc ) {
// active document name
fName = pActDoc->docTitle();
m_staticActiveDoc.SetWindowText(fName);
// active document lock modes
m_staticActDocLockStatus.SetWindowText( modeStr(pActDoc->lockMode()) );
m_staticActDocMyLockStatus.SetWindowText( modeStr(pActDoc->myLockMode()) );
}
else {
m_staticActiveDoc.SetWindowText("");
m_staticActDocLockStatus.SetWindowText("");
m_staticActDocMyLockStatus.SetWindowText("");
}
// rebuild listbox
RebuildListBox();
return TRUE;
}
///////////////////////////////////////////////////////////////
// Note: here you could do different actions for each reactor
// intercepted. For this sample I use a brute force approach:
// everything just updates the ui (with few exceptions)
///////////////////////////////////////////////////////////////
LRESULT CMDITestDialog:nAcadCreateDoc ( WPARAM, LPARAM )
{
onAcadUpdateDialog(0,0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadDestroyDoc ( WPARAM, LPARAM )
{
// if we went to 0 doc state, clean all the pertinent
// ui elememnts of the dialog. Note however, that this function is
// activated upon SendMessage (instead of PostMessage) so the document
// count right here is still one more than the end result.
// That's why 1 is subtracked from nDoc in the comparison.
int nDoc = acDocManager->documentCount();
if( 0 == nDoc - 1 )
cleanUpUI();
else
onAcadUpdateDialog(0,0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadLockModeChanged ( WPARAM, LPARAM pCh )
{
onAcadUpdateDialog(0,0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadLockModeWillChange ( WPARAM, LPARAM pCh )
{
onAcadUpdateDialog(0,0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadCurrDoc ( WPARAM, LPARAM )
{
onAcadUpdateDialog(0, 0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadActivateDoc ( WPARAM, LPARAM )
{
onAcadUpdateDialog(0, 0L);
return TRUE;
}
LRESULT CMDITestDialog:nAcadDeactivateDoc ( WPARAM, LPARAM )
{
// clear the fields related to the active document
m_staticActiveDoc.SetWindowText("");
m_staticActDocLockStatus.SetWindowText("");
m_staticActDocMyLockStatus.SetWindowText("");
return TRUE;
}
LRESULT CMDITestDialog:nAcadActModifiedDoc ( WPARAM, LPARAM bValue )
{
// check/uncheck document activation depending on the activation value sent
if( 1L == bValue )
m_activationCheck.SetCheck( TRUE );
else
m_activationCheck.SetCheck( FALSE );
return TRUE;
}
/////////////////////////////////////////////////////////////////
// ui related actions
void CMDITestDialog::OnNewdocButton()
{
// document context.
Acad::ErrorStatus st = acDocManager->newDocument();
}
void CMDITestDialog::OnOpendocButton()
{
// document context.
Acad::ErrorStatus st = acDocManager->openDocument();
}
void CMDITestDialog::OnAppnewdocButton()
{
static char pData[] = "acad.dwt";
Acad::ErrorStatus st = acDocManager->appContextNewDocument((const char *)pData);
}
void CMDITestDialog::OnAppopendocButton()
{
static char pData[] = "test1.dwg";
Acad::ErrorStatus st = acDocManager->appContextOpenDocument((const char *)pData);
}
void CMDITestDialog::OnActivationCheck()
{
Acad::ErrorStatus st;
// get status of the button and set the activation state from it.
UINT check = m_activationCheck.GetCheck();
if( (check && 0x0003) == 0 ) {
// unchecked - we need to disable the activation
st = acDocManager->disableDocumentActivation();
}
else {
// checked - we need to enable the activation
st = acDocManager->enableDocumentActivation();
}
}
void CMDITestDialog::OnSendstringButton()
{
if( acDocManager->documentCount() == 0 )
return;
AcApDocument *pDoc = getSelectedDocument();
if(pDoc) {
Acad::ErrorStatus st = acDocManager->sendStringToExecute( pDoc, "_line 0,0 1,1 \n",
false, true);
// Acad::ErrorStatus st = acDocManager->sendStringToExecute( pDoc, "_text 5,5 0.2 15 Testing\r\r");
}
else
AfxMessageBox("Please select a document on the list box");
}
void CMDITestDialog::OnIsquiescentButton()
{
AcApDocument *pDoc = acDocManager->curDocument();
if(pDoc) {
CString tempStr;
tempStr.Format("Current Doc is %s\nlockMode() returned %s\nand myLockMode() returned %s.",
pDoc->isQuiescent() ? "Quiescent." : "NOT Quiescent.",
modeStr(pDoc->lockMode()),
modeStr(pDoc->myLockMode()) );
AfxMessageBox( tempStr );
}
}
void CMDITestDialog::OnClosedocButton()
{
if( acDocManager->documentCount() == 0 )
return;
AcApDocument *pDoc = getSelectedDocument();
if(pDoc) {
// if you close the doc, update the UI
if( acDocManager->closeDocument(pDoc) == Acad::eOk ) {
onAcadUpdateDialog(0, 0L);
}
}
else
AfxMessageBox("Please select a document on the list box");
}
void CMDITestDialog::OnActivatedocButton()
{
if( acDocManager->documentCount() == 0 )
return;
AcApDocument *pDoc = getSelectedDocument();
if( pDoc )
acDocManager->activateDocument( pDoc );
else
AfxMessageBox("Please select a document on the list box");
}
BOOL CMDITestDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// select one of the elements of the CComboBox to be displayed
m_lockCombo.SetCurSel(2);
// set up all the UI elements
// here I call the functions that update the ui elements directly
// instead of waiting for posted messages.
onAcadUpdateDialog(0, 0L);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMDITestDialog::OnSetcurrentdocButton()
{
AcApDocument *pDoc = getSelectedDocument();
if( !pDoc ) {
AfxMessageBox("Please select a document on the list box");
return;
}
// get the lock mode to be used from the combo box
AcAp:ocLockMode lockMode = getSelectedLockMode();
acDocManager->unlockDocument( pDoc ); // in case we had lock it before
acDocManager->setCurDocument( pDoc, lockMode );
}
/////////////////////////////////////////////////////////////////////////////
// other MDITestDialog member functions
/////////////////////////////////////////////////////////////////////////////
void CMDITestDialog::cleanUpUI( void )
{
m_staticActDocMyLockStatus.SetWindowText("");
m_staticCurrentDoc.SetWindowText("");
m_staticCurDocLockStatus.SetWindowText("");
m_staticCurDocMyLockStatus.SetWindowText("");
m_staticActDocLockStatus.SetWindowText("");
m_staticActiveDoc.SetWindowText("");
m_staticToBeCurrDoc.SetWindowText("");
m_activationCheck.SetCheck( acDocManager->isDocumentActivationEnabled() );
m_staticDocNum.SetWindowText( "0" );
m_docListBox.ResetContent();
}
CString CMDITestDialog::getDocCount( void )
{
// get the current number of documents
int nDoc = acDocManager->documentCount();
CString tempStr;
tempStr.Format("%d",nDoc);
return tempStr;
}
CString CMDITestDialog::makeStringFromPtr( LONG pCh )
{
CString tempStr;
char *pChar = (char*) pCh;
if( pChar ) {
tempStr.Format("%s",pChar);
if( *pChar )
delete pChar;
}
else
tempStr = "";
return tempStr;
}
// getDocFromFilename()
// Passed a filename, it finds the corresponding document pointer
// Returns true if successful
bool CMDITestDialog::getDocFromFilename(CString csFileName, AcApDocument* &pNewDocument)
{
// Iterate over the open documents. We will match the filename if:
// The filename specified matches the fully qualified path
// name, as returned by AcApDocument::filename()
// -or-
// The filename specified matches the filename portion of the
// document name
AcApDocumentIterator* iter = acDocManager->newAcApDocumentIterator();
AcApDocument* pThisDocument = NULL;
CString csThisFilename;
CString csThisFilenameShort;
csFileName.MakeUpper(); // uppercase comparisons
while(!iter->done()) { // Tiptoe through the tulips
pThisDocument = iter->document();
csThisFilename = pThisDocument->docTitle();
csThisFilename.MakeUpper();
csThisFilenameShort = csThisFilename.Right(csThisFilename.GetLength() -
csThisFilename.ReverseFind('\\') - 1);
if(csFileName == csThisFilename || // Full path match
csFileName == csThisFilenameShort || // Matches filename only
csFileName == csThisFilenameShort.Left( // Filename less extension
csThisFilenameShort.GetLength() - 4))
{
pNewDocument = pThisDocument;
if( iter )
delete iter;
return true;
}
iter->step();
}
pNewDocument = NULL;
if( iter )
delete iter;
// no match found
return false;
}
AcApDocument* CMDITestDialog::getSelectedDocument( void )
{
AcApDocument *pDoc = NULL;
CString fName;
int ndx = m_docListBox.GetCurSel();
if( LB_ERR != ndx ) {
m_docListBox.GetText(ndx, fName);
// find out which document has this file name and get its document pointer.
if( !getDocFromFilename( fName, pDoc ) )
AfxMessageBox("Document NOT found.");
}
return pDoc;
}
AcAp:ocLockMode CMDITestDialog::getSelectedLockMode( void )
{
AcAp:ocLockMode lm = AcAp::kNone;
int ndx = m_lockCombo.GetCurSel();
CString lModeStr;
if( LB_ERR != ndx ) {
m_lockCombo.GetLBText(ndx, lModeStr);
// to activate the document, first I need to find out which document
// has this file name and get its document pointer.
if( !getLockModeFromStr( lModeStr, lm ) )
AfxMessageBox("Error with lock mode combo box"); //should never get here.
}
return lm;
}
void CMDITestDialog::RebuildListBox()
{
m_docListBox.ResetContent(); // start from an empty list box
// at this moment, get all drawing names and add them to the list box.
AcApDocumentIterator* iter = acDocManager->newAcApDocumentIterator();
AcApDocument* pDoc = NULL;
CString csFilename;
while(!iter->done()) {
pDoc = iter->document();
if(pDoc) { // #### make sure pDoc is not NULL ####
csFilename = pDoc->docTitle();
m_docListBox.AddString( csFilename );
}
iter->step();
}
if( iter )
delete iter;
}
void CMDITestDialog::OnRefreshButton()
{
// Just to give peace of mind: if you think something is displayed wrong
// in the dialog, this button will update all ui of the dialog
onAcadUpdateDialog(0,0L);
} |
|