📄 commands.cpp
字号:
// Commands.cpp : implementation file
/*********************************************************************
* Author: Simon Wang
* Date: 2000-11-16
* Contact us: inte2000@263.net
* Web Page: http://www.winmsg.com/cn/orbit.htm (for Chinese version)
* http://www.winmsg.com/orbit.htm (for English version)
**********************************************************************/
#include "stdafx.h"
#include "TabBars.h"
#include "Commands.h"
#include "TabManagerWnd.h"
#include "DevStudioWnd.h"
#include "DSWindow.h"
#include "TabBarWnd.h"
#include "DS_MDIWnd.h"
#include "OptionSheet.h"
#include "FuncParaDlg.h"
#include "SelectDswDlg.h"
#include "ZipPrjFolderDlg.h"
#include "DiagramDlg.h"
#include "Zip\zipper.h"
#include "Zip\unzipper.h"
#include "Common\DirDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#import "C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\devshl.dll" no_namespace named_guids
//callback function protype
typedef BOOL (*LPZIPCALLBACK)(BOOL bSuccess,LPCTSTR lpszFilePathName);
BOOL ZipFolder(CZipper & zip,LPCTSTR lpszFolder,LPCTSTR lpszTypes,LPZIPCALLBACK lpCallBack = NULL);
int FindWorkspaceFiles(CUnzipper& uzip, LPCTSTR szFolder, CStringArray& aFiles);
//for prase windows title of VC IDE
static LPCTSTR lpszDevStudioDefaultTitle = _T("Microsoft Visual C++");
/////////////////////////////////////////////////////////////////////////////
// CCommands
CTabManagerWindow * pGlobalActiveManager = NULL;
CDSWindow * pGlobalActiveDSWindow = NULL;
CDS_MDIWnd * pGlobalMDIManager = NULL;
// locating a window through it's title:
HWND __searchWnd;
BOOL CALLBACK __enumerator(HWND hwnd, LPARAM lParam)
{
char buffer[1024];
GetWindowText(hwnd, buffer, 1024);
if (!strcmp(buffer, (char *)lParam))
{
__searchWnd = hwnd;
return FALSE;
}
return TRUE;
}
HWND GetHWND(LPCTSTR cTitle)
{
if (g_pDevStudioWnd == NULL) return NULL;
__searchWnd = NULL;
EnumChildWindows(g_pDevStudioWnd->m_hWnd, __enumerator, (LPARAM)cTitle);
return __searchWnd;
}
HWND GetHWND(CComBSTR& bStr)
{
CString cStr = bStr;
return GetHWND(cStr);
}
HWND GetHWND(IGenericWindow *pWindow)
{
CComBSTR bStr;
pWindow->get_Caption(&bStr);
return GetHWND(bStr);
}
CCommands::CCommands()
{
m_pApplication = NULL;
m_pApplicationEventsObj = NULL;
m_pDebuggerEventsObj = NULL;
pGlobalMDIManager = new CDS_MDIWnd(NULL);
}
CCommands::~CCommands()
{
ASSERT (m_pApplication != NULL);
delete pGlobalActiveDSWindow;
pGlobalActiveDSWindow = NULL;
delete pGlobalMDIManager;
pGlobalMDIManager = NULL;
delete pGlobalTabs;
pGlobalTabs = NULL;
ASSERT (m_pApplication != NULL);
m_pApplication->Release();
}
void CCommands::SetApplicationObject(IApplication* pApplication)
{
// This function assumes pApplication has already been AddRef'd
// for us, which CDSAddIn did in its QueryInterface call
// just before it called us.
m_pApplication = pApplication;
// Create Application event handlers
XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj);
m_pApplicationEventsObj->AddRef();
m_pApplicationEventsObj->Connect(m_pApplication);
m_pApplicationEventsObj->m_pCommands = this;
// Create Debugger event handler
CComPtr<IDispatch> pDebugger;
if (SUCCEEDED(m_pApplication->get_Debugger(&pDebugger))
&& pDebugger != NULL)
{
XDebuggerEventsObj::CreateInstance(&m_pDebuggerEventsObj);
m_pDebuggerEventsObj->AddRef();
m_pDebuggerEventsObj->Connect(pDebugger);
m_pDebuggerEventsObj->m_pCommands = this;
}
}
void CCommands::UnadviseFromEvents()
{
ASSERT (m_pApplicationEventsObj != NULL);
m_pApplicationEventsObj->Disconnect(m_pApplication);
m_pApplicationEventsObj->Release();
m_pApplicationEventsObj = NULL;
if (m_pDebuggerEventsObj != NULL)
{
// Since we were able to connect to the Debugger events, we
// should be able to access the Debugger object again to
// unadvise from its events (thus the VERIFY_OK below--see stdafx.h).
CComPtr<IDispatch> pDebugger;
VERIFY_OK(m_pApplication->get_Debugger(&pDebugger));
ASSERT (pDebugger != NULL);
m_pDebuggerEventsObj->Disconnect(pDebugger);
m_pDebuggerEventsObj->Release();
m_pDebuggerEventsObj = NULL;
}
}
void CCommands::ForceWindowReactivate()
{
CComPtr<IDispatch> pDisp;
CComQIPtr<IGenericWindow, &IID_IGenericWindow> pActiveWindow;
m_pApplication->get_ActiveWindow(&pDisp);
if (pDisp != NULL)
{
pActiveWindow = pDisp;
pDisp = NULL;
pActiveWindow->put_Active(VARIANT_FALSE);
pActiveWindow->put_Active(VARIANT_TRUE);
}
}
/////////////////////////////////////////////////////////////////////////////
// Event handlers
// TODO: Fill out the implementation for those events you wish handle
// Use m_pCommands->GetApplicationObject() to access the Developer
// Studio Application object
// Application events
HRESULT CCommands::XApplicationEvents::BeforeBuildStart()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
BOOL bAddlog;
CIni ini(g_szIniPathName);
ini.GetBoolValue(lpszGeneral,lpszSaveLog,bAddlog,FALSE);
if(bAddlog)
{
CComPtr<IGenericProject> pProj = NULL;
pGlobalTabs->m_pApplication->get_ActiveProject((IDispatch **)&pProj.p);
if(pProj)
{
CComBSTR bStr;
BOOL bBuilds,bStartTime,bCompileUser;
ini.GetBoolValue(lpszGeneral,_T("bBuildTimes"),bBuilds,FALSE);
ini.GetBoolValue(lpszGeneral,_T("bStartTime"),bStartTime,FALSE);
ini.GetBoolValue(lpszGeneral,_T("bOperater"),bCompileUser,FALSE);
int nBuilds;
pProj->get_FullName(&bStr);
CString strFileName = bStr;
strFileName.MakeLower();
int idx = strFileName.Find(_T(".dsp"),0);
if(idx != -1)
strFileName = strFileName.Left(idx);
strFileName += _T(".log");
CIni log((LPCTSTR)strFileName);
log.GetValue(_T("MAIN"),_T("nBuildNumber"),nBuilds,0);
if(nBuilds == 0)//First start Tabbar Addin,Create LOG file
{
CStringArray strARemark;
CString strRemark;
strRemark.LoadString(IDS_LOGFILEREMARK1);
strARemark.Add(strRemark);
strRemark.LoadString(IDS_LOGFILEREMARK2);
strRemark += bStr.m_str;
strARemark.Add(strRemark);
strRemark.LoadString(IDS_LOGFILEREMARK3);
strARemark.Add(strRemark);
log.AddRemarkLine(strARemark,0);
strARemark.RemoveAll();
}
if(bBuilds)
{
nBuilds++;
log.SetValue(_T("MAIN"),_T("nBuildNumber"),nBuilds);
}
TCHAR szSection[64];
TCHAR sztmp[128];
wsprintf(szSection,_T("Build%08d"),nBuilds);
if(bStartTime)
{
SYSTEMTIME st;
::GetLocalTime(&st);
wsprintf(sztmp,_T("%4d-%02d-%02d %02d:%02d:%02d"),st.wYear,st.wMonth,st.wDay,
st.wHour,st.wMinute,st.wSecond);
log.SetValue(szSection,_T("sStartTime"),sztmp);
}
if(bCompileUser)
{
DWORD dwSize = 128;
if(!::GetUserName(sztmp,&dwSize))
_tcscpy(sztmp,lpszNull);
log.SetValue(szSection,_T("sCompileUser"),sztmp);
}
log.Write((LPCTSTR)strFileName);//do not forget this line
log.Clear();
}
}
ini.Clear();
return S_OK;
}
HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
BOOL bAddlog;
CIni ini(g_szIniPathName);
ini.GetBoolValue(lpszGeneral,lpszSaveLog,bAddlog,FALSE);
if(bAddlog)
{
CComPtr<IGenericProject> pProj = NULL;
pGlobalTabs->m_pApplication->get_ActiveProject((IDispatch **)&pProj.p);
if(pProj)
{
CComBSTR bStr;
BOOL bErrors,bWarns,bEndTime;
ini.GetBoolValue(lpszGeneral,_T("bErrors"),bErrors,FALSE);
ini.GetBoolValue(lpszGeneral,_T("bWarns"),bWarns,FALSE);
ini.GetBoolValue(lpszGeneral,_T("bEndTime"),bEndTime,FALSE);
int nBuilds;
pProj->get_FullName(&bStr);
CString strFileName = bStr;
strFileName.MakeLower();
int idx = strFileName.Find(_T(".dsp"),0);
if(idx != -1)
strFileName = strFileName.Left(idx);
strFileName += _T(".log");
CIni log((LPCTSTR)strFileName);
log.GetValue(_T("MAIN"),_T("nBuildNumber"),nBuilds,0);
//向OutPut窗口输出信息 (something error)
CString strTmp;
strTmp.Format(IDS_BUILDSNUMBER,nBuilds);
bStr = strTmp;
pGlobalTabs->m_pApplication->PrintToOutputWindow(bStr);
TCHAR szSection[64];
TCHAR sztmp[128];
wsprintf(szSection,_T("Build%08d"),nBuilds);
if(bErrors)
log.SetValue(szSection,_T("nErrors"),(int)nNumErrors);
if(bWarns)
log.SetValue(szSection,_T("nWarns"),(int)nNumWarnings);
if(bEndTime)
{
SYSTEMTIME st;
::GetLocalTime(&st);
wsprintf(sztmp,_T("%4d-%02d-%02d %02d:%02d:%02d"),st.wYear,st.wMonth,st.wDay,
st.wHour,st.wMinute,st.wSecond);
log.SetValue(szSection,_T("sEndTime"),sztmp);
}
log.Write((LPCTSTR)strFileName);
log.Clear();
}
}
ini.Clear();
return S_OK;
}
HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK;
}
HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch* theDocument)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK;
}
HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch* theDocument)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (pGlobalActiveDSWindow->GetSaferHwnd())
{
CComBSTR bStr;
CString cStr1, cStr2;
CComPtr<IDispatch> pDisp;
CComQIPtr<IGenericWindow, &IID_IGenericWindow> pActiveWindow;
m_pCommands->GetApplicationObject()->get_ActiveWindow(&pDisp);
if (pDisp != NULL)
{
pActiveWindow = pDisp;
pDisp = NULL;
pActiveWindow->get_Caption(&bStr);
pGlobalActiveDSWindow->GetWindowText(cStr1);
cStr2 = bStr;
if (cStr1 == cStr2)
{
// reactivate the window that was active before
HWND hWnd = GetHWND(pActiveWindow);
::PostMessage(::GetParent(hWnd), WM_MDIACTIVATE, (WPARAM)hWnd, 0);
}
}
}
return S_OK;
}
HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch* theDocument)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(pGlobalTabs);
ASSERT(pGlobalActiveManager);
pGlobalActiveManager->PostUpdateMessage();
return S_OK;
}
HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch* theDocument)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK;
}
HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch* theWindow)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
IGenericWindow* genWindow = (IGenericWindow*)theWindow;
CComBSTR bStr;
CString cStr;
HWND hSearchWnd;
hSearchWnd = GetHWND(genWindow);
ASSERT(hSearchWnd != NULL);
// are we really activating a new window?
if (pGlobalActiveDSWindow->GetSaferHwnd() == NULL || hSearchWnd != pGlobalActiveDSWindow->m_hWnd)
{
delete pGlobalActiveDSWindow;
pGlobalActiveDSWindow = NULL;
pGlobalActiveDSWindow = new CDSWindow(genWindow, hSearchWnd, pGlobalTabs);
if (!pGlobalActiveManager)
{
pGlobalActiveManager = pGlobalActiveDSWindow;
}
pGlobalTabs->UpdateTabs();
pGlobalActiveManager->SetManaging(true);
}
return S_OK;
}
HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch* theWindow)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
delete pGlobalActiveDSWindow;
pGlobalActiveDSWindow = NULL;
return S_OK;
}
HRESULT CCommands::XApplicationEvents::WorkspaceOpen()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(pGlobalTabs);
CComBSTR bStr;
pGlobalTabs->m_pApplication->get_CurrentDirectory(&bStr);
g_strPrjSetFile = bStr;
g_strPrjSetFile += _T("\\BookMark.dat");
InitGlobalVar();
//@**#---2001-03-12 17:30:43 (orbit)---#**@
// CComPtr<IGenericProject> pProj = NULL;
// pGlobalTabs->m_pApplication->get_ActiveProject((IDispatch **)&pProj.p);
// if(pProj)
// {
// pProj->get_FullName(&bStr);
// }
pGlobalTabs->UpdateTabs();
return S_OK;
}
HRESULT CCommands::XApplicationEvents::WorkspaceClose()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(pGlobalTabs);
pGlobalTabs->UpdateTabs();
return S_OK;
}
HRESULT CCommands::XApplicationEvents::NewWorkspace()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(pGlobalTabs);
ASSERT(pGlobalActiveManager);
pGlobalActiveManager->PostUpdateMessage();
CComBSTR bStr;
pGlobalTabs->m_pApplication->get_CurrentDirectory(&bStr);
g_strPrjSetFile = bStr;
g_strPrjSetFile += _T("\\BookMark.dat");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -