To: vim-dev@vim.org Subject: Patch 7.2.150 (extra) Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Note: I haven't tested this myself, since I don't have a compiler that works for this code. Patch 7.2.150 (extra) Problem: Can't use tab pages from VisVim. Solution: Add tab page support to VisVim. (Adam Slater) Files: src/VisVim/Commands.cpp, src/VisVim/Resource.h, src/VisVim/VisVim.rc *** ../vim-7.2.149/src/VisVim/Commands.cpp Thu May 10 20:45:34 2007 --- src/VisVim/Commands.cpp Mon Mar 2 00:52:15 2009 *************** *** 20,39 **** static BOOL g_bEnableVim = TRUE; // Vim enabled static BOOL g_bDevStudioEditor = FALSE; // Open file in Dev Studio editor simultaneously static int g_ChangeDir = CD_NONE; // CD after file open? ! static void VimSetEnableState (BOOL bEnableState); ! static BOOL VimOpenFile (BSTR& FileName, long LineNr); ! static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method); ! static void VimErrDiag (COleAutomationControl& VimOle); ! static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName); ! static void DebugMsg (char* Msg, char* Arg = NULL); ///////////////////////////////////////////////////////////////////////////// // CCommands ! CCommands::CCommands () { // m_pApplication == NULL; M$ Code generation bug!!! m_pApplication = NULL; --- 20,40 ---- static BOOL g_bEnableVim = TRUE; // Vim enabled 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 void VimSetEnableState(BOOL bEnableState); ! static BOOL VimOpenFile(BSTR& FileName, long LineNr); ! static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method); ! static void VimErrDiag(COleAutomationControl& VimOle); ! static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName); ! static void DebugMsg(char* Msg, char* Arg = NULL); ///////////////////////////////////////////////////////////////////////////// // CCommands ! CCommands::CCommands() { // m_pApplication == NULL; M$ Code generation bug!!! m_pApplication = NULL; *************** *** 41,57 **** m_pDebuggerEventsObj = NULL; } ! CCommands::~CCommands () { ! ASSERT (m_pApplication != NULL); if (m_pApplication) { ! m_pApplication->Release (); m_pApplication = NULL; } } ! void CCommands::SetApplicationObject (IApplication * pApplication) { // This function assumes pApplication has already been AddRef'd // for us, which CDSAddIn did in it's QueryInterface call --- 42,58 ---- m_pDebuggerEventsObj = NULL; } ! CCommands::~CCommands() { ! ASSERT(m_pApplication != NULL); if (m_pApplication) { ! m_pApplication->Release(); m_pApplication = NULL; } } ! void CCommands::SetApplicationObject(IApplication * pApplication) { // This function assumes pApplication has already been AddRef'd // for us, which CDSAddIn did in it's QueryInterface call *************** *** 61,115 **** return; // Create Application event handlers ! XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj); if (! m_pApplicationEventsObj) { ! ReportInternalError ("XApplicationEventsObj::CreateInstance"); return; } ! m_pApplicationEventsObj->AddRef (); ! m_pApplicationEventsObj->Connect (m_pApplication); m_pApplicationEventsObj->m_pCommands = this; #ifdef NEVER // 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; } #endif // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim ! HKEY hAppKey = GetAppKey ("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); if (hSectionKey) { ! g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim", g_bEnableVim); ! g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor", ! g_bDevStudioEditor); ! g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir); ! RegCloseKey (hSectionKey); } ! RegCloseKey (hAppKey); } } ! void CCommands::UnadviseFromEvents () { ! ASSERT (m_pApplicationEventsObj != NULL); if (m_pApplicationEventsObj) { ! m_pApplicationEventsObj->Disconnect (m_pApplication); ! m_pApplicationEventsObj->Release (); m_pApplicationEventsObj = NULL; } --- 62,118 ---- return; // Create Application event handlers ! XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj); if (! m_pApplicationEventsObj) { ! ReportInternalError("XApplicationEventsObj::CreateInstance"); return; } ! m_pApplicationEventsObj->AddRef(); ! m_pApplicationEventsObj->Connect(m_pApplication); m_pApplicationEventsObj->m_pCommands = this; #ifdef NEVER // 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; } #endif // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim ! HKEY hAppKey = GetAppKey("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); if (hSectionKey) { ! g_bEnableVim = GetRegistryInt(hSectionKey, "EnableVim", g_bEnableVim); ! g_bDevStudioEditor = GetRegistryInt(hSectionKey, ! "DevStudioEditor", g_bDevStudioEditor); ! g_bNewTabs = GetRegistryInt(hSectionKey, "NewTabs", ! g_bNewTabs); ! g_ChangeDir = GetRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir); ! RegCloseKey(hSectionKey); } ! RegCloseKey(hAppKey); } } ! void CCommands::UnadviseFromEvents() { ! ASSERT(m_pApplicationEventsObj != NULL); if (m_pApplicationEventsObj) { ! m_pApplicationEventsObj->Disconnect(m_pApplication); ! m_pApplicationEventsObj->Release(); m_pApplicationEventsObj = NULL; } *************** *** 121,130 **** // 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; } #endif --- 124,133 ---- // 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; } #endif *************** *** 136,156 **** // Application events ! HRESULT CCommands::XApplicationEvents::BeforeBuildStart () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } --- 139,159 ---- // Application events ! HRESULT CCommands::XApplicationEvents::BeforeBuildStart() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } *************** *** 158,166 **** // is done. // Vim gets called from here. // ! HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); if (! g_bEnableVim) // Vim not enabled or empty command line entered --- 161,169 ---- // is done. // Vim gets called from here. // ! HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch * theDocument) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (! g_bEnableVim) // Vim not enabled or empty command line entered *************** *** 169,175 **** // First get the current file name and line number // Get the document object ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); if (! pDoc) return S_OK; --- 172,178 ---- // First get the current file name and line number // Get the document object ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument); if (! pDoc) return S_OK; *************** *** 177,202 **** long LineNr = -1; // Get the document name ! if (FAILED (pDoc->get_FullName (&FileName))) return S_OK; LPDISPATCH pDispSel; // Get a selection object dispatch pointer ! if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) { // Get the selection object ! CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); if (pSel) // Get the selection line number ! pSel->get_CurrentLine (&LineNr); ! pDispSel->Release (); } // Open the file in Vim and position to the current line ! if (VimOpenFile (FileName, LineNr)) { if (! g_bDevStudioEditor) { --- 180,205 ---- long LineNr = -1; // Get the document name ! if (FAILED(pDoc->get_FullName(&FileName))) return S_OK; LPDISPATCH pDispSel; // Get a selection object dispatch pointer ! if (SUCCEEDED(pDoc->get_Selection(&pDispSel))) { // Get the selection object ! CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel); if (pSel) // Get the selection line number ! pSel->get_CurrentLine(&LineNr); ! pDispSel->Release(); } // Open the file in Vim and position to the current line ! if (VimOpenFile(FileName, LineNr)) { if (! g_bDevStudioEditor) { *************** *** 204,233 **** CComVariant vSaveChanges = dsSaveChangesPrompt; DsSaveStatus Saved; ! pDoc->Close (vSaveChanges, &Saved); } } // We're done here ! SysFreeString (FileName); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); if (! g_bEnableVim) // Vim not enabled or empty command line entered --- 207,236 ---- CComVariant vSaveChanges = dsSaveChangesPrompt; DsSaveStatus Saved; ! pDoc->Close(vSaveChanges, &Saved); } } // We're done here ! SysFreeString(FileName); return S_OK; } ! HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch * theDocument) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch * theDocument) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch * theDocument) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (! g_bEnableVim) // Vim not enabled or empty command line entered *************** *** 235,253 **** // First get the current file name and line number ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); if (! pDoc) return S_OK; BSTR FileName; HRESULT hr; ! hr = pDoc->get_FullName (&FileName); ! if (FAILED (hr)) return S_OK; // Open the file in Vim and position to the current line ! if (VimOpenFile (FileName, 0)) { if (! g_bDevStudioEditor) { --- 238,256 ---- // First get the current file name and line number ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument); if (! pDoc) return S_OK; BSTR FileName; HRESULT hr; ! hr = pDoc->get_FullName(&FileName); ! if (FAILED(hr)) return S_OK; // Open the file in Vim and position to the current line ! if (VimOpenFile(FileName, 0)) { if (! g_bDevStudioEditor) { *************** *** 255,303 **** CComVariant vSaveChanges = dsSaveChangesPrompt; DsSaveStatus Saved; ! pDoc->Close (vSaveChanges, &Saved); } } ! SysFreeString (FileName); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WorkspaceOpen () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WorkspaceClose () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::NewWorkspace () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } // Debugger event ! HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint) { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); return S_OK; } --- 258,306 ---- CComVariant vSaveChanges = dsSaveChangesPrompt; DsSaveStatus Saved; ! pDoc->Close(vSaveChanges, &Saved); } } ! SysFreeString(FileName); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch * theWindow) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch * theWindow) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WorkspaceOpen() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::WorkspaceClose() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } ! HRESULT CCommands::XApplicationEvents::NewWorkspace() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } // Debugger event ! HRESULT CCommands::XDebuggerEvents::BreakpointHit(IDispatch * pBreakpoint) { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); return S_OK; } *************** *** 308,324 **** class CMainDialog : public CDialog { public: ! CMainDialog (CWnd * pParent = NULL); // Standard constructor //{{AFX_DATA(CMainDialog) enum { IDD = IDD_ADDINMAIN }; int m_ChangeDir; BOOL m_bDevStudioEditor; //}}AFX_DATA //{{AFX_VIRTUAL(CMainDialog) protected: ! virtual void DoDataExchange (CDataExchange * pDX); // DDX/DDV support //}}AFX_VIRTUAL protected: --- 311,328 ---- class CMainDialog : public CDialog { public: ! CMainDialog(CWnd * pParent = NULL); // Standard constructor //{{AFX_DATA(CMainDialog) enum { IDD = IDD_ADDINMAIN }; int m_ChangeDir; BOOL m_bDevStudioEditor; + BOOL m_bNewTabs; //}}AFX_DATA //{{AFX_VIRTUAL(CMainDialog) protected: ! virtual void DoDataExchange(CDataExchange * pDX); // DDX/DDV support //}}AFX_VIRTUAL protected: *************** *** 326,425 **** afx_msg void OnEnable(); afx_msg void OnDisable(); //}}AFX_MSG ! DECLARE_MESSAGE_MAP () }; ! CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ ) ! : CDialog (CMainDialog::IDD, pParent) { //{{AFX_DATA_INIT(CMainDialog) m_ChangeDir = -1; m_bDevStudioEditor = FALSE; //}}AFX_DATA_INIT } ! void CMainDialog::DoDataExchange (CDataExchange * pDX) { ! CDialog::DoDataExchange (pDX); //{{AFX_DATA_MAP(CMainDialog) DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir); ! DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor); //}}AFX_DATA_MAP } ! BEGIN_MESSAGE_MAP (CMainDialog, CDialog) //{{AFX_MSG_MAP(CMainDialog) //}}AFX_MSG_MAP ! END_MESSAGE_MAP () ///////////////////////////////////////////////////////////////////////////// // CCommands methods ! STDMETHODIMP CCommands::VisVimDialog () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); // Use m_pApplication to access the Developer Studio Application // object, // and VERIFY_OK to see error strings in DEBUG builds of your add-in // (see stdafx.h) ! VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE)); CMainDialog Dlg; Dlg.m_bDevStudioEditor = g_bDevStudioEditor; Dlg.m_ChangeDir = g_ChangeDir; ! if (Dlg.DoModal () == IDOK) { g_bDevStudioEditor = Dlg.m_bDevStudioEditor; g_ChangeDir = Dlg.m_ChangeDir; // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim ! HKEY hAppKey = GetAppKey ("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); if (hSectionKey) { ! WriteRegistryInt (hSectionKey, "DevStudioEditor", g_bDevStudioEditor); ! WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir); ! RegCloseKey (hSectionKey); } ! RegCloseKey (hAppKey); } } ! VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE)); return S_OK; } ! STDMETHODIMP CCommands::VisVimEnable () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); ! VimSetEnableState (true); return S_OK; } ! STDMETHODIMP CCommands::VisVimDisable () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); ! VimSetEnableState (false); return S_OK; } ! STDMETHODIMP CCommands::VisVimToggle () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); ! VimSetEnableState (! g_bEnableVim); return S_OK; } ! STDMETHODIMP CCommands::VisVimLoad () { ! AFX_MANAGE_STATE (AfxGetStaticModuleState ()); // Use m_pApplication to access the Developer Studio Application object, // and VERIFY_OK to see error strings in DEBUG builds of your add-in --- 330,435 ---- afx_msg void OnEnable(); afx_msg void OnDisable(); //}}AFX_MSG ! DECLARE_MESSAGE_MAP() }; ! CMainDialog::CMainDialog(CWnd * pParent /* =NULL */ ) ! : CDialog(CMainDialog::IDD, pParent) { //{{AFX_DATA_INIT(CMainDialog) m_ChangeDir = -1; m_bDevStudioEditor = FALSE; + m_bNewTabs = FALSE; //}}AFX_DATA_INIT } ! void CMainDialog::DoDataExchange(CDataExchange * pDX) { ! CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMainDialog) DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir); ! DDX_Check(pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor); ! DDX_Check(pDX, IDC_NEW_TABS, m_bNewTabs); //}}AFX_DATA_MAP } ! BEGIN_MESSAGE_MAP(CMainDialog, CDialog) //{{AFX_MSG_MAP(CMainDialog) //}}AFX_MSG_MAP ! END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCommands methods ! STDMETHODIMP CCommands::VisVimDialog() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Use m_pApplication to access the Developer Studio Application // object, // and VERIFY_OK to see error strings in DEBUG builds of your add-in // (see stdafx.h) ! VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE)); CMainDialog Dlg; Dlg.m_bDevStudioEditor = g_bDevStudioEditor; + Dlg.m_bNewTabs = g_bNewTabs; Dlg.m_ChangeDir = g_ChangeDir; ! if (Dlg.DoModal() == IDOK) { g_bDevStudioEditor = Dlg.m_bDevStudioEditor; + g_bNewTabs = Dlg.m_bNewTabs; g_ChangeDir = Dlg.m_ChangeDir; // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim ! HKEY hAppKey = GetAppKey("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); if (hSectionKey) { ! WriteRegistryInt(hSectionKey, "DevStudioEditor", g_bDevStudioEditor); ! WriteRegistryInt(hSectionKey, "NewTabs", ! g_bNewTabs); ! WriteRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir); ! RegCloseKey(hSectionKey); } ! RegCloseKey(hAppKey); } } ! VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE)); return S_OK; } ! STDMETHODIMP CCommands::VisVimEnable() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); ! VimSetEnableState(true); return S_OK; } ! STDMETHODIMP CCommands::VisVimDisable() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); ! VimSetEnableState(false); return S_OK; } ! STDMETHODIMP CCommands::VisVimToggle() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); ! VimSetEnableState(! g_bEnableVim); return S_OK; } ! STDMETHODIMP CCommands::VisVimLoad() { ! AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Use m_pApplication to access the Developer Studio Application object, // and VERIFY_OK to see error strings in DEBUG builds of your add-in *************** *** 430,436 **** CComPtr < IDispatch > pDispDoc, pDispSel; // Get a document object dispatch pointer ! VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc)); if (! pDispDoc) return S_OK; --- 440,446 ---- CComPtr < IDispatch > pDispDoc, pDispSel; // Get a document object dispatch pointer ! VERIFY_OK(m_pApplication->get_ActiveDocument(&pDispDoc)); if (! pDispDoc) return S_OK; *************** *** 438,467 **** long LineNr = -1; // Get the document object ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc); if (! pDoc) return S_OK; // Get the document name ! if (FAILED (pDoc->get_FullName (&FileName))) return S_OK; // Get a selection object dispatch pointer ! if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) { // Get the selection object ! CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); if (pSel) // Get the selection line number ! pSel->get_CurrentLine (&LineNr); } // Open the file in Vim ! VimOpenFile (FileName, LineNr); ! SysFreeString (FileName); return S_OK; } --- 448,477 ---- long LineNr = -1; // Get the document object ! CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(pDispDoc); if (! pDoc) return S_OK; // Get the document name ! if (FAILED(pDoc->get_FullName(&FileName))) return S_OK; // Get a selection object dispatch pointer ! if (SUCCEEDED(pDoc->get_Selection(&pDispSel))) { // Get the selection object ! CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel); if (pSel) // Get the selection line number ! pSel->get_CurrentLine(&LineNr); } // Open the file in Vim ! VimOpenFile(FileName, LineNr); ! SysFreeString(FileName); return S_OK; } *************** *** 472,487 **** // Set the enable state and save to registry // ! static void VimSetEnableState (BOOL bEnableState) { g_bEnableVim = bEnableState; ! HKEY hAppKey = GetAppKey ("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); if (hSectionKey) ! WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim); ! RegCloseKey (hAppKey); } } --- 482,497 ---- // Set the enable state and save to registry // ! static void VimSetEnableState(BOOL bEnableState) { g_bEnableVim = bEnableState; ! HKEY hAppKey = GetAppKey("Vim"); if (hAppKey) { ! HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); if (hSectionKey) ! WriteRegistryInt(hSectionKey, "EnableVim", g_bEnableVim); ! RegCloseKey(hAppKey); } } *************** *** 490,496 **** // letter. // 'LineNr' must contain a valid line number or 0, e. g. for a new file // ! static BOOL VimOpenFile (BSTR& FileName, long LineNr) { // OLE automation object for com. with Vim --- 500,506 ---- // letter. // 'LineNr' must contain a valid line number or 0, e. g. for a new file // ! static BOOL VimOpenFile(BSTR& FileName, long LineNr) { // OLE automation object for com. with Vim *************** *** 507,513 **** // Get a dispatch id for the SendKeys method of Vim; // enables connection to Vim if necessary DISPID DispatchId; ! DispatchId = VimGetDispatchId (VimOle, "SendKeys"); if (! DispatchId) // OLE error, can't obtain dispatch id goto OleError; --- 517,523 ---- // Get a dispatch id for the SendKeys method of Vim; // enables connection to Vim if necessary DISPID DispatchId; ! DispatchId = VimGetDispatchId(VimOle, "SendKeys"); if (! DispatchId) // OLE error, can't obtain dispatch id goto OleError; *************** *** 525,544 **** #ifdef SINGLE_WINDOW // Update the current file in Vim if it has been modified. // Disabled, because it could write the file when you don't want to. ! sprintf (VimCmd + 2, ":up\n"); #endif ! if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) goto OleError; // Change Vim working directory to where the file is if desired if (g_ChangeDir != CD_NONE) ! VimChangeDir (VimOle, DispatchId, FileName); // Make Vim open the file. // In the filename convert all \ to /, put a \ before a space. ! sprintf(VimCmd, ":drop "); sprintf(FileNameTmp, "%S", (char *)FileName); - s = VimCmd + 6; for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4; ++p) if (*p == '\\') --- 535,562 ---- #ifdef SINGLE_WINDOW // Update the current file in Vim if it has been modified. // Disabled, because it could write the file when you don't want to. ! sprintf(VimCmd + 2, ":up\n"); #endif ! if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) goto OleError; // Change Vim working directory to where the file is if desired if (g_ChangeDir != CD_NONE) ! VimChangeDir(VimOle, DispatchId, FileName); // Make Vim open the file. // In the filename convert all \ to /, put a \ before a space. ! if (g_bNewTabs) ! { ! sprintf(VimCmd, ":tab drop "); ! s = VimCmd + 11; ! } ! else ! { ! sprintf(VimCmd, ":drop "); ! s = VimCmd + 6; ! } sprintf(FileNameTmp, "%S", (char *)FileName); for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4; ++p) if (*p == '\\') *************** *** 552,571 **** *s++ = '\n'; *s = '\0'; ! if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) goto OleError; if (LineNr > 0) { // Goto line ! sprintf (VimCmd, ":%d\n", LineNr); ! if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) goto OleError; } // Make Vim come to the foreground ! if (! VimOle.Method ("SetForeground")) ! VimOle.ErrDiag (); // We're done return true; --- 570,589 ---- *s++ = '\n'; *s = '\0'; ! if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) goto OleError; if (LineNr > 0) { // Goto line ! sprintf(VimCmd, ":%d\n", LineNr); ! if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) goto OleError; } // Make Vim come to the foreground ! if (! VimOle.Method("SetForeground")) ! VimOle.ErrDiag(); // We're done return true; *************** *** 573,579 **** OleError: // There was an OLE error // Check if it's the "unknown class string" error ! VimErrDiag (VimOle); return false; } --- 591,597 ---- OleError: // There was an OLE error // Check if it's the "unknown class string" error ! VimErrDiag(VimOle); return false; } *************** *** 581,598 **** // Create the Vim OLE object if necessary // Returns a valid dispatch id or null on error // ! static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method) { // Initialize Vim OLE connection if not already done ! if (! VimOle.IsCreated ()) { ! if (! VimOle.CreateObject ("Vim.Application")) return NULL; } // Get the dispatch id for the SendKeys method. // By doing this, we are checking if Vim is still there... ! DISPID DispatchId = VimOle.GetDispatchId ("SendKeys"); if (! DispatchId) { // We can't get a dispatch id. --- 599,616 ---- // Create the Vim OLE object if necessary // Returns a valid dispatch id or null on error // ! static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method) { // Initialize Vim OLE connection if not already done ! if (! VimOle.IsCreated()) { ! if (! VimOle.CreateObject("Vim.Application")) return NULL; } // Get the dispatch id for the SendKeys method. // By doing this, we are checking if Vim is still there... ! DISPID DispatchId = VimOle.GetDispatchId("SendKeys"); if (! DispatchId) { // We can't get a dispatch id. *************** *** 604,615 **** // 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 // collection for those damned OLE memory chunks???). ! VimOle.DeleteObject (); ! if (! VimOle.CreateObject ("Vim.Application")) // If this create fails, it's time for an error msg return NULL; ! if (! (DispatchId = VimOle.GetDispatchId ("SendKeys"))) // There is something wrong... return NULL; } --- 622,633 ---- // 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 // collection for those damned OLE memory chunks???). ! VimOle.DeleteObject(); ! if (! VimOle.CreateObject("Vim.Application")) // If this create fails, it's time for an error msg return NULL; ! if (! (DispatchId = VimOle.GetDispatchId("SendKeys"))) // There is something wrong... return NULL; } *************** *** 620,639 **** // Output an error message for an OLE error // Check on the classstring error, which probably means Vim wasn't registered. // ! static void VimErrDiag (COleAutomationControl& VimOle) { ! SCODE sc = GetScode (VimOle.GetResult ()); if (sc == CO_E_CLASSSTRING) { char Buf[256]; ! sprintf (Buf, "There is no registered OLE automation server named " "\"Vim.Application\".\n" "Use the OLE-enabled version of Vim with VisVim and " "make sure to register Vim by running \"vim -register\"."); ! MessageBox (NULL, Buf, "OLE Error", MB_OK); } else ! VimOle.ErrDiag (); } // Change directory to the directory the file 'FileName' is in or it's parent --- 638,657 ---- // Output an error message for an OLE error // Check on the classstring error, which probably means Vim wasn't registered. // ! static void VimErrDiag(COleAutomationControl& VimOle) { ! SCODE sc = GetScode(VimOle.GetResult()); if (sc == CO_E_CLASSSTRING) { char Buf[256]; ! sprintf(Buf, "There is no registered OLE automation server named " "\"Vim.Application\".\n" "Use the OLE-enabled version of Vim with VisVim and " "make sure to register Vim by running \"vim -register\"."); ! MessageBox(NULL, Buf, "OLE Error", MB_OK); } else ! VimOle.ErrDiag(); } // Change directory to the directory the file 'FileName' is in or it's parent *************** *** 644,650 **** // CD_SOURCE_PATH // CD_SOURCE_PARENT // ! static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName) { // Do a :cd first --- 662,668 ---- // CD_SOURCE_PATH // CD_SOURCE_PARENT // ! static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName) { // Do a :cd first *************** *** 655,661 **** char DirUnix[_MAX_DIR * 2]; char *s, *t; ! _splitpath (StrFileName, Drive, Dir, NULL, NULL); // Convert to Unix path name format, escape spaces. t = DirUnix; --- 673,679 ---- char DirUnix[_MAX_DIR * 2]; char *s, *t; ! _splitpath(StrFileName, Drive, Dir, NULL, NULL); // Convert to Unix path name format, escape spaces. t = DirUnix; *************** *** 676,694 **** OLECHAR Buf[MAX_OLE_STR]; char VimCmd[MAX_OLE_STR]; ! sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix, g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : ""); ! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)); } #ifdef _DEBUG // Print out a debug message // ! static void DebugMsg (char* Msg, char* Arg) { char Buf[400]; ! sprintf (Buf, Msg, Arg); ! AfxMessageBox (Buf); } #endif - --- 694,711 ---- OLECHAR Buf[MAX_OLE_STR]; char VimCmd[MAX_OLE_STR]; ! sprintf(VimCmd, ":cd %s%s%s\n", Drive, DirUnix, g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : ""); ! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)); } #ifdef _DEBUG // Print out a debug message // ! static void DebugMsg(char* Msg, char* Arg) { char Buf[400]; ! sprintf(Buf, Msg, Arg); ! AfxMessageBox(Buf); } #endif *** ../vim-7.2.149/src/VisVim/Resource.h Sun Jun 13 19:17:32 2004 --- src/VisVim/Resource.h Mon Mar 2 00:39:21 2009 *************** *** 16,21 **** --- 16,22 ---- #define IDC_CD_SOURCE_PATH 1001 #define IDC_CD_SOURCE_PARENT 1002 #define IDC_CD_NONE 1003 + #define IDC_NEW_TABS 1004 // Next default values for new objects // *** ../vim-7.2.149/src/VisVim/VisVim.rc Sun Jun 13 19:38:03 2004 --- src/VisVim/VisVim.rc Mon Mar 2 00:40:19 2009 *************** *** 122,127 **** --- 122,130 ---- CONTROL "&Open file in DevStudio editor simultaneously", IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | 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 CONTROL "Set to &source file path",IDC_CD_SOURCE_PATH,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10 *** ../vim-7.2.149/src/version.c Wed Apr 22 12:53:31 2009 --- src/version.c Wed Apr 22 13:04:32 2009 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 150, /**/ -- A poem: read aloud: <> !*''# Waka waka bang splat tick tick hash, ^"`$$- Caret quote back-tick dollar dollar dash, !*=@$_ Bang splat equal at dollar under-score, %*<> ~#4 Percent splat waka waka tilde number four, &[]../ Ampersand bracket bracket dot dot slash, |{,,SYSTEM HALTED Vertical-bar curly-bracket comma comma CRASH. Fred Bremmer and Steve Kroese (Calvin College & Seminary of Grand Rapids, MI.) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///