⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commands.cpp

📁 TabBars的开源源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -