0
0
mirror of https://github.com/vim/vim.git synced 2025-07-04 23:07:33 -04:00

updated for version 7.2-150

This commit is contained in:
Bram Moolenaar 2009-04-22 11:08:26 +00:00
parent 798b30bdfd
commit 99133038dc
4 changed files with 177 additions and 154 deletions

View File

@ -20,20 +20,21 @@ static char THIS_FILE[] = __FILE__;
static BOOL g_bEnableVim = TRUE; // Vim enabled static BOOL g_bEnableVim = TRUE; // Vim enabled
static BOOL g_bDevStudioEditor = FALSE; // Open file in Dev Studio editor simultaneously static BOOL g_bDevStudioEditor = FALSE; // Open file in Dev Studio editor simultaneously
static BOOL g_bNewTabs = FALSE;
static int g_ChangeDir = CD_NONE; // CD after file open? static int g_ChangeDir = CD_NONE; // CD after file open?
static void VimSetEnableState (BOOL bEnableState); static void VimSetEnableState(BOOL bEnableState);
static BOOL VimOpenFile (BSTR& FileName, long LineNr); static BOOL VimOpenFile(BSTR& FileName, long LineNr);
static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method); static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method);
static void VimErrDiag (COleAutomationControl& VimOle); static void VimErrDiag(COleAutomationControl& VimOle);
static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName); static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
static void DebugMsg (char* Msg, char* Arg = NULL); static void DebugMsg(char* Msg, char* Arg = NULL);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CCommands // CCommands
CCommands::CCommands () CCommands::CCommands()
{ {
// m_pApplication == NULL; M$ Code generation bug!!! // m_pApplication == NULL; M$ Code generation bug!!!
m_pApplication = NULL; m_pApplication = NULL;
@ -41,17 +42,17 @@ CCommands::CCommands ()
m_pDebuggerEventsObj = NULL; m_pDebuggerEventsObj = NULL;
} }
CCommands::~CCommands () CCommands::~CCommands()
{ {
ASSERT (m_pApplication != NULL); ASSERT(m_pApplication != NULL);
if (m_pApplication) if (m_pApplication)
{ {
m_pApplication->Release (); m_pApplication->Release();
m_pApplication = NULL; m_pApplication = NULL;
} }
} }
void CCommands::SetApplicationObject (IApplication * pApplication) void CCommands::SetApplicationObject(IApplication * pApplication)
{ {
// This function assumes pApplication has already been AddRef'd // This function assumes pApplication has already been AddRef'd
// for us, which CDSAddIn did in it's QueryInterface call // for us, which CDSAddIn did in it's QueryInterface call
@ -61,55 +62,57 @@ void CCommands::SetApplicationObject (IApplication * pApplication)
return; return;
// Create Application event handlers // Create Application event handlers
XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj); XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj);
if (! m_pApplicationEventsObj) if (! m_pApplicationEventsObj)
{ {
ReportInternalError ("XApplicationEventsObj::CreateInstance"); ReportInternalError("XApplicationEventsObj::CreateInstance");
return; return;
} }
m_pApplicationEventsObj->AddRef (); m_pApplicationEventsObj->AddRef();
m_pApplicationEventsObj->Connect (m_pApplication); m_pApplicationEventsObj->Connect(m_pApplication);
m_pApplicationEventsObj->m_pCommands = this; m_pApplicationEventsObj->m_pCommands = this;
#ifdef NEVER #ifdef NEVER
// Create Debugger event handler // Create Debugger event handler
CComPtr < IDispatch > pDebugger; CComPtr < IDispatch > pDebugger;
if (SUCCEEDED (m_pApplication->get_Debugger (&pDebugger)) if (SUCCEEDED(m_pApplication->get_Debugger(&pDebugger))
&& pDebugger != NULL) && pDebugger != NULL)
{ {
XDebuggerEventsObj::CreateInstance (&m_pDebuggerEventsObj); XDebuggerEventsObj::CreateInstance(&m_pDebuggerEventsObj);
m_pDebuggerEventsObj->AddRef (); m_pDebuggerEventsObj->AddRef();
m_pDebuggerEventsObj->Connect (pDebugger); m_pDebuggerEventsObj->Connect(pDebugger);
m_pDebuggerEventsObj->m_pCommands = this; m_pDebuggerEventsObj->m_pCommands = this;
} }
#endif #endif
// Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim
HKEY hAppKey = GetAppKey ("Vim"); HKEY hAppKey = GetAppKey("Vim");
if (hAppKey) if (hAppKey)
{ {
HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
if (hSectionKey) if (hSectionKey)
{ {
g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim", g_bEnableVim = GetRegistryInt(hSectionKey, "EnableVim",
g_bEnableVim); g_bEnableVim);
g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor", g_bDevStudioEditor = GetRegistryInt(hSectionKey,
g_bDevStudioEditor); "DevStudioEditor", g_bDevStudioEditor);
g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir", g_bNewTabs = GetRegistryInt(hSectionKey, "NewTabs",
g_bNewTabs);
g_ChangeDir = GetRegistryInt(hSectionKey, "ChangeDir",
g_ChangeDir); g_ChangeDir);
RegCloseKey (hSectionKey); RegCloseKey(hSectionKey);
} }
RegCloseKey (hAppKey); RegCloseKey(hAppKey);
} }
} }
void CCommands::UnadviseFromEvents () void CCommands::UnadviseFromEvents()
{ {
ASSERT (m_pApplicationEventsObj != NULL); ASSERT(m_pApplicationEventsObj != NULL);
if (m_pApplicationEventsObj) if (m_pApplicationEventsObj)
{ {
m_pApplicationEventsObj->Disconnect (m_pApplication); m_pApplicationEventsObj->Disconnect(m_pApplication);
m_pApplicationEventsObj->Release (); m_pApplicationEventsObj->Release();
m_pApplicationEventsObj = NULL; m_pApplicationEventsObj = NULL;
} }
@ -121,10 +124,10 @@ void CCommands::UnadviseFromEvents ()
// unadvise from its events (thus the VERIFY_OK below--see // unadvise from its events (thus the VERIFY_OK below--see
// stdafx.h). // stdafx.h).
CComPtr < IDispatch > pDebugger; CComPtr < IDispatch > pDebugger;
VERIFY_OK (m_pApplication->get_Debugger (&pDebugger)); VERIFY_OK(m_pApplication->get_Debugger(&pDebugger));
ASSERT (pDebugger != NULL); ASSERT(pDebugger != NULL);
m_pDebuggerEventsObj->Disconnect (pDebugger); m_pDebuggerEventsObj->Disconnect(pDebugger);
m_pDebuggerEventsObj->Release (); m_pDebuggerEventsObj->Release();
m_pDebuggerEventsObj = NULL; m_pDebuggerEventsObj = NULL;
} }
#endif #endif
@ -136,21 +139,21 @@ void CCommands::UnadviseFromEvents ()
// Application events // Application events
HRESULT CCommands::XApplicationEvents::BeforeBuildStart () HRESULT CCommands::XApplicationEvents::BeforeBuildStart()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings) HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown () HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
@ -158,9 +161,9 @@ HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown ()
// is done. // is done.
// Vim gets called from here. // Vim gets called from here.
// //
HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument) HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch * theDocument)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (! g_bEnableVim) if (! g_bEnableVim)
// Vim not enabled or empty command line entered // Vim not enabled or empty command line entered
@ -169,7 +172,7 @@ HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
// First get the current file name and line number // First get the current file name and line number
// Get the document object // Get the document object
CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
if (! pDoc) if (! pDoc)
return S_OK; return S_OK;
@ -177,26 +180,26 @@ HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
long LineNr = -1; long LineNr = -1;
// Get the document name // Get the document name
if (FAILED (pDoc->get_FullName (&FileName))) if (FAILED(pDoc->get_FullName(&FileName)))
return S_OK; return S_OK;
LPDISPATCH pDispSel; LPDISPATCH pDispSel;
// Get a selection object dispatch pointer // Get a selection object dispatch pointer
if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
{ {
// Get the selection object // Get the selection object
CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
if (pSel) if (pSel)
// Get the selection line number // Get the selection line number
pSel->get_CurrentLine (&LineNr); pSel->get_CurrentLine(&LineNr);
pDispSel->Release (); pDispSel->Release();
} }
// Open the file in Vim and position to the current line // Open the file in Vim and position to the current line
if (VimOpenFile (FileName, LineNr)) if (VimOpenFile(FileName, LineNr))
{ {
if (! g_bDevStudioEditor) if (! g_bDevStudioEditor)
{ {
@ -204,30 +207,30 @@ HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
CComVariant vSaveChanges = dsSaveChangesPrompt; CComVariant vSaveChanges = dsSaveChangesPrompt;
DsSaveStatus Saved; DsSaveStatus Saved;
pDoc->Close (vSaveChanges, &Saved); pDoc->Close(vSaveChanges, &Saved);
} }
} }
// We're done here // We're done here
SysFreeString (FileName); SysFreeString(FileName);
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument) HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch * theDocument)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument) HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch * theDocument)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument) HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch * theDocument)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (! g_bEnableVim) if (! g_bEnableVim)
// Vim not enabled or empty command line entered // Vim not enabled or empty command line entered
@ -235,19 +238,19 @@ HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument)
// First get the current file name and line number // First get the current file name and line number
CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
if (! pDoc) if (! pDoc)
return S_OK; return S_OK;
BSTR FileName; BSTR FileName;
HRESULT hr; HRESULT hr;
hr = pDoc->get_FullName (&FileName); hr = pDoc->get_FullName(&FileName);
if (FAILED (hr)) if (FAILED(hr))
return S_OK; return S_OK;
// Open the file in Vim and position to the current line // Open the file in Vim and position to the current line
if (VimOpenFile (FileName, 0)) if (VimOpenFile(FileName, 0))
{ {
if (! g_bDevStudioEditor) if (! g_bDevStudioEditor)
{ {
@ -255,49 +258,49 @@ HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument)
CComVariant vSaveChanges = dsSaveChangesPrompt; CComVariant vSaveChanges = dsSaveChangesPrompt;
DsSaveStatus Saved; DsSaveStatus Saved;
pDoc->Close (vSaveChanges, &Saved); pDoc->Close(vSaveChanges, &Saved);
} }
} }
SysFreeString (FileName); SysFreeString(FileName);
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow) HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch * theWindow)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow) HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch * theWindow)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::WorkspaceOpen () HRESULT CCommands::XApplicationEvents::WorkspaceOpen()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::WorkspaceClose () HRESULT CCommands::XApplicationEvents::WorkspaceClose()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
HRESULT CCommands::XApplicationEvents::NewWorkspace () HRESULT CCommands::XApplicationEvents::NewWorkspace()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
// Debugger event // Debugger event
HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint) HRESULT CCommands::XDebuggerEvents::BreakpointHit(IDispatch * pBreakpoint)
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
return S_OK; return S_OK;
} }
@ -308,17 +311,18 @@ HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint)
class CMainDialog : public CDialog class CMainDialog : public CDialog
{ {
public: public:
CMainDialog (CWnd * pParent = NULL); // Standard constructor CMainDialog(CWnd * pParent = NULL); // Standard constructor
//{{AFX_DATA(CMainDialog) //{{AFX_DATA(CMainDialog)
enum { IDD = IDD_ADDINMAIN }; enum { IDD = IDD_ADDINMAIN };
int m_ChangeDir; int m_ChangeDir;
BOOL m_bDevStudioEditor; BOOL m_bDevStudioEditor;
BOOL m_bNewTabs;
//}}AFX_DATA //}}AFX_DATA
//{{AFX_VIRTUAL(CMainDialog) //{{AFX_VIRTUAL(CMainDialog)
protected: protected:
virtual void DoDataExchange (CDataExchange * pDX); // DDX/DDV support virtual void DoDataExchange(CDataExchange * pDX); // DDX/DDV support
//}}AFX_VIRTUAL //}}AFX_VIRTUAL
protected: protected:
@ -326,100 +330,106 @@ class CMainDialog : public CDialog
afx_msg void OnEnable(); afx_msg void OnEnable();
afx_msg void OnDisable(); afx_msg void OnDisable();
//}}AFX_MSG //}}AFX_MSG
DECLARE_MESSAGE_MAP () DECLARE_MESSAGE_MAP()
}; };
CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ ) CMainDialog::CMainDialog(CWnd * pParent /* =NULL */ )
: CDialog (CMainDialog::IDD, pParent) : CDialog(CMainDialog::IDD, pParent)
{ {
//{{AFX_DATA_INIT(CMainDialog) //{{AFX_DATA_INIT(CMainDialog)
m_ChangeDir = -1; m_ChangeDir = -1;
m_bDevStudioEditor = FALSE; m_bDevStudioEditor = FALSE;
m_bNewTabs = FALSE;
//}}AFX_DATA_INIT //}}AFX_DATA_INIT
} }
void CMainDialog::DoDataExchange (CDataExchange * pDX) void CMainDialog::DoDataExchange(CDataExchange * pDX)
{ {
CDialog::DoDataExchange (pDX); CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMainDialog) //{{AFX_DATA_MAP(CMainDialog)
DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir); DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir);
DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor); DDX_Check(pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
DDX_Check(pDX, IDC_NEW_TABS, m_bNewTabs);
//}}AFX_DATA_MAP //}}AFX_DATA_MAP
} }
BEGIN_MESSAGE_MAP (CMainDialog, CDialog) BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
//{{AFX_MSG_MAP(CMainDialog) //{{AFX_MSG_MAP(CMainDialog)
//}}AFX_MSG_MAP //}}AFX_MSG_MAP
END_MESSAGE_MAP () END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CCommands methods // CCommands methods
STDMETHODIMP CCommands::VisVimDialog () STDMETHODIMP CCommands::VisVimDialog()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Use m_pApplication to access the Developer Studio Application // Use m_pApplication to access the Developer Studio Application
// object, // object,
// and VERIFY_OK to see error strings in DEBUG builds of your add-in // and VERIFY_OK to see error strings in DEBUG builds of your add-in
// (see stdafx.h) // (see stdafx.h)
VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE)); VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));
CMainDialog Dlg; CMainDialog Dlg;
Dlg.m_bDevStudioEditor = g_bDevStudioEditor; Dlg.m_bDevStudioEditor = g_bDevStudioEditor;
Dlg.m_bNewTabs = g_bNewTabs;
Dlg.m_ChangeDir = g_ChangeDir; Dlg.m_ChangeDir = g_ChangeDir;
if (Dlg.DoModal () == IDOK) if (Dlg.DoModal() == IDOK)
{ {
g_bDevStudioEditor = Dlg.m_bDevStudioEditor; g_bDevStudioEditor = Dlg.m_bDevStudioEditor;
g_bNewTabs = Dlg.m_bNewTabs;
g_ChangeDir = Dlg.m_ChangeDir; g_ChangeDir = Dlg.m_ChangeDir;
// Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim
HKEY hAppKey = GetAppKey ("Vim"); HKEY hAppKey = GetAppKey("Vim");
if (hAppKey) if (hAppKey)
{ {
HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
if (hSectionKey) if (hSectionKey)
{ {
WriteRegistryInt (hSectionKey, "DevStudioEditor", WriteRegistryInt(hSectionKey, "DevStudioEditor",
g_bDevStudioEditor); g_bDevStudioEditor);
WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir); WriteRegistryInt(hSectionKey, "NewTabs",
RegCloseKey (hSectionKey); g_bNewTabs);
WriteRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir);
RegCloseKey(hSectionKey);
} }
RegCloseKey (hAppKey); RegCloseKey(hAppKey);
} }
} }
VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE)); VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));
return S_OK; return S_OK;
} }
STDMETHODIMP CCommands::VisVimEnable () STDMETHODIMP CCommands::VisVimEnable()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
VimSetEnableState (true); VimSetEnableState(true);
return S_OK; return S_OK;
} }
STDMETHODIMP CCommands::VisVimDisable () STDMETHODIMP CCommands::VisVimDisable()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
VimSetEnableState (false); VimSetEnableState(false);
return S_OK; return S_OK;
} }
STDMETHODIMP CCommands::VisVimToggle () STDMETHODIMP CCommands::VisVimToggle()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
VimSetEnableState (! g_bEnableVim); VimSetEnableState(! g_bEnableVim);
return S_OK; return S_OK;
} }
STDMETHODIMP CCommands::VisVimLoad () STDMETHODIMP CCommands::VisVimLoad()
{ {
AFX_MANAGE_STATE (AfxGetStaticModuleState ()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Use m_pApplication to access the Developer Studio Application object, // Use m_pApplication to access the Developer Studio Application object,
// and VERIFY_OK to see error strings in DEBUG builds of your add-in // and VERIFY_OK to see error strings in DEBUG builds of your add-in
@ -430,7 +440,7 @@ STDMETHODIMP CCommands::VisVimLoad ()
CComPtr < IDispatch > pDispDoc, pDispSel; CComPtr < IDispatch > pDispDoc, pDispSel;
// Get a document object dispatch pointer // Get a document object dispatch pointer
VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc)); VERIFY_OK(m_pApplication->get_ActiveDocument(&pDispDoc));
if (! pDispDoc) if (! pDispDoc)
return S_OK; return S_OK;
@ -438,30 +448,30 @@ STDMETHODIMP CCommands::VisVimLoad ()
long LineNr = -1; long LineNr = -1;
// Get the document object // Get the document object
CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc); CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(pDispDoc);
if (! pDoc) if (! pDoc)
return S_OK; return S_OK;
// Get the document name // Get the document name
if (FAILED (pDoc->get_FullName (&FileName))) if (FAILED(pDoc->get_FullName(&FileName)))
return S_OK; return S_OK;
// Get a selection object dispatch pointer // Get a selection object dispatch pointer
if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
{ {
// Get the selection object // Get the selection object
CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
if (pSel) if (pSel)
// Get the selection line number // Get the selection line number
pSel->get_CurrentLine (&LineNr); pSel->get_CurrentLine(&LineNr);
} }
// Open the file in Vim // Open the file in Vim
VimOpenFile (FileName, LineNr); VimOpenFile(FileName, LineNr);
SysFreeString (FileName); SysFreeString(FileName);
return S_OK; return S_OK;
} }
@ -472,16 +482,16 @@ STDMETHODIMP CCommands::VisVimLoad ()
// Set the enable state and save to registry // Set the enable state and save to registry
// //
static void VimSetEnableState (BOOL bEnableState) static void VimSetEnableState(BOOL bEnableState)
{ {
g_bEnableVim = bEnableState; g_bEnableVim = bEnableState;
HKEY hAppKey = GetAppKey ("Vim"); HKEY hAppKey = GetAppKey("Vim");
if (hAppKey) if (hAppKey)
{ {
HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
if (hSectionKey) if (hSectionKey)
WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim); WriteRegistryInt(hSectionKey, "EnableVim", g_bEnableVim);
RegCloseKey (hAppKey); RegCloseKey(hAppKey);
} }
} }
@ -490,7 +500,7 @@ static void VimSetEnableState (BOOL bEnableState)
// letter. // letter.
// 'LineNr' must contain a valid line number or 0, e. g. for a new file // 'LineNr' must contain a valid line number or 0, e. g. for a new file
// //
static BOOL VimOpenFile (BSTR& FileName, long LineNr) static BOOL VimOpenFile(BSTR& FileName, long LineNr)
{ {
// OLE automation object for com. with Vim // OLE automation object for com. with Vim
@ -507,7 +517,7 @@ static BOOL VimOpenFile (BSTR& FileName, long LineNr)
// Get a dispatch id for the SendKeys method of Vim; // Get a dispatch id for the SendKeys method of Vim;
// enables connection to Vim if necessary // enables connection to Vim if necessary
DISPID DispatchId; DISPID DispatchId;
DispatchId = VimGetDispatchId (VimOle, "SendKeys"); DispatchId = VimGetDispatchId(VimOle, "SendKeys");
if (! DispatchId) if (! DispatchId)
// OLE error, can't obtain dispatch id // OLE error, can't obtain dispatch id
goto OleError; goto OleError;
@ -525,20 +535,28 @@ static BOOL VimOpenFile (BSTR& FileName, long LineNr)
#ifdef SINGLE_WINDOW #ifdef SINGLE_WINDOW
// Update the current file in Vim if it has been modified. // Update the current file in Vim if it has been modified.
// Disabled, because it could write the file when you don't want to. // Disabled, because it could write the file when you don't want to.
sprintf (VimCmd + 2, ":up\n"); sprintf(VimCmd + 2, ":up\n");
#endif #endif
if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
goto OleError; goto OleError;
// Change Vim working directory to where the file is if desired // Change Vim working directory to where the file is if desired
if (g_ChangeDir != CD_NONE) if (g_ChangeDir != CD_NONE)
VimChangeDir (VimOle, DispatchId, FileName); VimChangeDir(VimOle, DispatchId, FileName);
// Make Vim open the file. // Make Vim open the file.
// In the filename convert all \ to /, put a \ before a space. // In the filename convert all \ to /, put a \ before a space.
sprintf(VimCmd, ":drop "); if (g_bNewTabs)
{
sprintf(VimCmd, ":tab drop ");
s = VimCmd + 11;
}
else
{
sprintf(VimCmd, ":drop ");
s = VimCmd + 6;
}
sprintf(FileNameTmp, "%S", (char *)FileName); sprintf(FileNameTmp, "%S", (char *)FileName);
s = VimCmd + 6;
for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4; for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4;
++p) ++p)
if (*p == '\\') if (*p == '\\')
@ -552,20 +570,20 @@ static BOOL VimOpenFile (BSTR& FileName, long LineNr)
*s++ = '\n'; *s++ = '\n';
*s = '\0'; *s = '\0';
if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
goto OleError; goto OleError;
if (LineNr > 0) if (LineNr > 0)
{ {
// Goto line // Goto line
sprintf (VimCmd, ":%d\n", LineNr); sprintf(VimCmd, ":%d\n", LineNr);
if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
goto OleError; goto OleError;
} }
// Make Vim come to the foreground // Make Vim come to the foreground
if (! VimOle.Method ("SetForeground")) if (! VimOle.Method("SetForeground"))
VimOle.ErrDiag (); VimOle.ErrDiag();
// We're done // We're done
return true; return true;
@ -573,7 +591,7 @@ static BOOL VimOpenFile (BSTR& FileName, long LineNr)
OleError: OleError:
// There was an OLE error // There was an OLE error
// Check if it's the "unknown class string" error // Check if it's the "unknown class string" error
VimErrDiag (VimOle); VimErrDiag(VimOle);
return false; return false;
} }
@ -581,18 +599,18 @@ static BOOL VimOpenFile (BSTR& FileName, long LineNr)
// Create the Vim OLE object if necessary // Create the Vim OLE object if necessary
// Returns a valid dispatch id or null on error // Returns a valid dispatch id or null on error
// //
static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method) static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method)
{ {
// Initialize Vim OLE connection if not already done // Initialize Vim OLE connection if not already done
if (! VimOle.IsCreated ()) if (! VimOle.IsCreated())
{ {
if (! VimOle.CreateObject ("Vim.Application")) if (! VimOle.CreateObject("Vim.Application"))
return NULL; return NULL;
} }
// Get the dispatch id for the SendKeys method. // Get the dispatch id for the SendKeys method.
// By doing this, we are checking if Vim is still there... // By doing this, we are checking if Vim is still there...
DISPID DispatchId = VimOle.GetDispatchId ("SendKeys"); DISPID DispatchId = VimOle.GetDispatchId("SendKeys");
if (! DispatchId) if (! DispatchId)
{ {
// We can't get a dispatch id. // We can't get a dispatch id.
@ -604,12 +622,12 @@ static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method)
// should not be kept long enough to allow the user to terminate Vim // should not be kept long enough to allow the user to terminate Vim
// to avoid memory corruption (why the heck is there no system garbage // to avoid memory corruption (why the heck is there no system garbage
// collection for those damned OLE memory chunks???). // collection for those damned OLE memory chunks???).
VimOle.DeleteObject (); VimOle.DeleteObject();
if (! VimOle.CreateObject ("Vim.Application")) if (! VimOle.CreateObject("Vim.Application"))
// If this create fails, it's time for an error msg // If this create fails, it's time for an error msg
return NULL; return NULL;
if (! (DispatchId = VimOle.GetDispatchId ("SendKeys"))) if (! (DispatchId = VimOle.GetDispatchId("SendKeys")))
// There is something wrong... // There is something wrong...
return NULL; return NULL;
} }
@ -620,20 +638,20 @@ static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method)
// Output an error message for an OLE error // Output an error message for an OLE error
// Check on the classstring error, which probably means Vim wasn't registered. // Check on the classstring error, which probably means Vim wasn't registered.
// //
static void VimErrDiag (COleAutomationControl& VimOle) static void VimErrDiag(COleAutomationControl& VimOle)
{ {
SCODE sc = GetScode (VimOle.GetResult ()); SCODE sc = GetScode(VimOle.GetResult());
if (sc == CO_E_CLASSSTRING) if (sc == CO_E_CLASSSTRING)
{ {
char Buf[256]; char Buf[256];
sprintf (Buf, "There is no registered OLE automation server named " sprintf(Buf, "There is no registered OLE automation server named "
"\"Vim.Application\".\n" "\"Vim.Application\".\n"
"Use the OLE-enabled version of Vim with VisVim and " "Use the OLE-enabled version of Vim with VisVim and "
"make sure to register Vim by running \"vim -register\"."); "make sure to register Vim by running \"vim -register\".");
MessageBox (NULL, Buf, "OLE Error", MB_OK); MessageBox(NULL, Buf, "OLE Error", MB_OK);
} }
else else
VimOle.ErrDiag (); VimOle.ErrDiag();
} }
// Change directory to the directory the file 'FileName' is in or it's parent // Change directory to the directory the file 'FileName' is in or it's parent
@ -644,7 +662,7 @@ static void VimErrDiag (COleAutomationControl& VimOle)
// CD_SOURCE_PATH // CD_SOURCE_PATH
// CD_SOURCE_PARENT // CD_SOURCE_PARENT
// //
static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName) static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
{ {
// Do a :cd first // Do a :cd first
@ -655,7 +673,7 @@ static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR
char DirUnix[_MAX_DIR * 2]; char DirUnix[_MAX_DIR * 2];
char *s, *t; char *s, *t;
_splitpath (StrFileName, Drive, Dir, NULL, NULL); _splitpath(StrFileName, Drive, Dir, NULL, NULL);
// Convert to Unix path name format, escape spaces. // Convert to Unix path name format, escape spaces.
t = DirUnix; t = DirUnix;
@ -676,19 +694,18 @@ static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR
OLECHAR Buf[MAX_OLE_STR]; OLECHAR Buf[MAX_OLE_STR];
char VimCmd[MAX_OLE_STR]; char VimCmd[MAX_OLE_STR];
sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix, sprintf(VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : ""); g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : "");
VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)); VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf));
} }
#ifdef _DEBUG #ifdef _DEBUG
// Print out a debug message // Print out a debug message
// //
static void DebugMsg (char* Msg, char* Arg) static void DebugMsg(char* Msg, char* Arg)
{ {
char Buf[400]; char Buf[400];
sprintf (Buf, Msg, Arg); sprintf(Buf, Msg, Arg);
AfxMessageBox (Buf); AfxMessageBox(Buf);
} }
#endif #endif

View File

@ -16,6 +16,7 @@
#define IDC_CD_SOURCE_PATH 1001 #define IDC_CD_SOURCE_PATH 1001
#define IDC_CD_SOURCE_PARENT 1002 #define IDC_CD_SOURCE_PARENT 1002
#define IDC_CD_NONE 1003 #define IDC_CD_NONE 1003
#define IDC_NEW_TABS 1004
// Next default values for new objects // Next default values for new objects
// //

View File

@ -122,6 +122,9 @@ BEGIN
CONTROL "&Open file in DevStudio editor simultaneously", CONTROL "&Open file in DevStudio editor simultaneously",
IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP |
WS_TABSTOP,7,7,153,10 WS_TABSTOP,7,7,153,10
CONTROL "Open files in new tabs",
IDC_NEW_TABS,"Button",BS_AUTOCHECKBOX | WS_GROUP |
WS_TABSTOP,7,21,153,10
GROUPBOX "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP GROUPBOX "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP
CONTROL "Set to &source file path",IDC_CD_SOURCE_PATH,"Button", CONTROL "Set to &source file path",IDC_CD_SOURCE_PATH,"Button",
BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10 BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10

View File

@ -676,6 +676,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
150,
/**/ /**/
149, 149,
/**/ /**/