joachim99@75: /* joachim99@75: * Copyright (c) 2003-2006, Sergey Zorin. All rights reserved. joachim99@75: * joachim99@75: * This software is distributable under the BSD license. See the terms joachim99@75: * of the BSD license in the LICENSE file provided with this software. joachim99@75: * joachim99@75: */ joachim99@75: #define _CRT_SECURE_NO_DEPRECATE joachim99@75: joachim99@75: #include joachim99@75: #include joachim99@75: #include joachim99@75: joachim99@75: #include "diff_ext.h" joachim99@75: #include joachim99@75: #include joachim99@75: joachim99@75: joachim99@75: #ifdef UNICODE joachim99@75: joachim99@75: static void parseString( const std::wstring& s, size_t& i /*pos*/, std::wstring& r /*result*/ ) joachim99@75: { joachim99@75: size_t size = s.size(); joachim99@75: ++i; // Skip initial '"' joachim99@75: for( ; i s_translationMap; joachim99@75: static tstring s_translationFileName; joachim99@75: joachim99@75: void readTranslationFile() joachim99@75: { joachim99@75: s_translationMap.clear(); joachim99@75: FILE* pFile = _tfopen( s_translationFileName.c_str(), TEXT("rb") ); joachim99@75: if ( pFile ) joachim99@75: { joachim99@75: MESSAGELOG( TEXT( "Reading translations: " ) + s_translationFileName ); joachim99@75: std::vector buffer; joachim99@75: try { joachim99@75: if ( fseek(pFile, 0, SEEK_END)==0 ) joachim99@75: { joachim99@75: size_t length = ftell(pFile); // Get the file length joachim99@75: buffer.resize(length); joachim99@75: fseek(pFile, 0, SEEK_SET ); joachim99@75: fread(&buffer[0], 1, length, pFile ); joachim99@75: } joachim99@75: } joachim99@75: catch(...) joachim99@75: { joachim99@75: } joachim99@75: fclose(pFile); joachim99@75: joachim99@75: if (buffer.size()>0) joachim99@75: { joachim99@75: size_t bufferSize = buffer.size(); joachim99@75: int offset = 0; joachim99@75: if ( buffer[0]=='\xEF' && buffer[1]=='\xBB' && buffer[2]=='\xBF' ) joachim99@75: { joachim99@75: offset += 3; joachim99@75: bufferSize -= 3; joachim99@75: } joachim99@75: joachim99@75: size_t sLength = MultiByteToWideChar(CP_UTF8,0,&buffer[offset], (int)bufferSize, 0, 0 ); joachim99@75: std::wstring s( sLength, L' ' ); joachim99@75: MultiByteToWideChar(CP_UTF8,0,&buffer[offset], (int)bufferSize, &s[0], (int)s.size() ); joachim99@75: joachim99@75: // Now analyse the file and extract translation strings joachim99@75: std::wstring msgid; joachim99@75: std::wstring msgstr; joachim99@75: msgid.reserve( 1000 ); joachim99@75: msgstr.reserve( 1000 ); joachim99@75: bool bExpectingId = true; joachim99@75: for( size_t i=0; i5 && wcsncmp( &s[i], L"msgid", 5 )==0 ) joachim99@75: { joachim99@75: if ( !msgid.empty() && !msgstr.empty() ) joachim99@75: { joachim99@75: s_translationMap[msgid] = msgstr; joachim99@75: } joachim99@75: bExpectingId = true; joachim99@75: msgid.clear(); joachim99@75: i+=4; joachim99@75: } joachim99@75: else if ( sLength-i>6 && wcsncmp( &s[i], L"msgstr", 6 )==0 ) joachim99@75: { joachim99@75: bExpectingId = false; joachim99@75: msgstr.clear(); joachim99@75: i+=5; joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: // Unexpected ? joachim99@75: } joachim99@75: } joachim99@75: } joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: ERRORLOG( TEXT( "Reading translations failed: " ) + s_translationFileName ); joachim99@75: } joachim99@75: } joachim99@75: joachim99@75: static tstring getTranslation( const tstring& fallback ) joachim99@75: { joachim99@75: std::map< std::wstring, std::wstring >::iterator i = s_translationMap.find( fallback ); joachim99@75: if (i!=s_translationMap.end()) joachim99@75: return i->second; joachim99@75: return fallback; joachim99@75: } joachim99@75: #else joachim99@75: joachim99@75: static tstring getTranslation( const tstring& fallback ) joachim99@75: { joachim99@75: return fallback; joachim99@75: } joachim99@75: joachim99@75: #endif joachim99@75: joachim99@75: joachim99@75: static void replaceArgs( tstring& s, const tstring& r1, const tstring& r2=TEXT(""), const tstring& r3=TEXT("") ) joachim99@75: { joachim99@75: tstring arg1 = TEXT("%1"); joachim99@75: size_t pos1 = s.find( arg1 ); joachim99@75: tstring arg2 = TEXT("%2"); joachim99@75: size_t pos2 = s.find( arg2 ); joachim99@75: tstring arg3 = TEXT("%3"); joachim99@75: size_t pos3 = s.find( arg3 ); joachim99@75: if ( pos1 != size_t(-1) ) joachim99@75: { joachim99@75: s.replace( pos1, arg1.length(), r1 ); joachim99@75: if ( pos2 != size_t(-1) && pos1recent_files() ) joachim99@75: { joachim99@75: LOG(); joachim99@75: _resource = SERVER::instance()->handle(); joachim99@75: joachim99@75: SERVER::instance()->lock(); joachim99@75: } joachim99@75: joachim99@75: DIFF_EXT::~DIFF_EXT() joachim99@75: { joachim99@75: LOG(); joachim99@77: if(_resource != SERVER::instance()->handle()) { joachim99@77: FreeLibrary(_resource); joachim99@77: } joachim99@75: joachim99@77: SERVER::instance()->release(); joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: DIFF_EXT::QueryInterface(REFIID refiid, void** ppv) joachim99@75: { joachim99@75: HRESULT ret = E_NOINTERFACE; joachim99@75: *ppv = 0; joachim99@75: joachim99@75: if(IsEqualIID(refiid, IID_IShellExtInit) || IsEqualIID(refiid, IID_IUnknown)) { joachim99@75: *ppv = static_cast(this); joachim99@75: } else if (IsEqualIID(refiid, IID_IContextMenu)) { joachim99@75: *ppv = static_cast(this); joachim99@75: } joachim99@75: joachim99@75: if(*ppv != 0) { joachim99@75: AddRef(); joachim99@75: joachim99@75: ret = NOERROR; joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP_(ULONG) joachim99@75: DIFF_EXT::AddRef() joachim99@75: { joachim99@75: return InterlockedIncrement((LPLONG)&_ref_count); joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP_(ULONG) joachim99@75: DIFF_EXT::Release() joachim99@75: { joachim99@75: ULONG ret = 0L; joachim99@75: joachim99@75: if(InterlockedDecrement((LPLONG)&_ref_count) != 0) { joachim99@75: ret = _ref_count; joachim99@75: } else { joachim99@75: delete this; joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: DIFF_EXT::Initialize(LPCITEMIDLIST /*folder not used*/, IDataObject* data, HKEY /*key not used*/) joachim99@75: { joachim99@75: LOG(); joachim99@75: joachim99@75: #ifdef UNICODE joachim99@75: tstring installDir = SERVER::instance()->getRegistryKeyString( TEXT(""), TEXT("InstallDir") ); joachim99@75: tstring language = SERVER::instance()->getRegistryKeyString( TEXT(""), TEXT("Language") ); joachim99@75: tstring translationFileName = installDir + TEXT("\\translations\\diff_ext_") + language + TEXT(".po"); joachim99@75: if ( s_translationFileName != translationFileName ) joachim99@75: { joachim99@75: s_translationFileName = translationFileName; joachim99@75: readTranslationFile(); joachim99@75: } joachim99@75: #endif joachim99@75: joachim99@75: FORMATETC format = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; joachim99@75: STGMEDIUM medium; joachim99@75: medium.tymed = TYMED_HGLOBAL; joachim99@75: HRESULT ret = E_INVALIDARG; joachim99@75: joachim99@75: if(data->GetData(&format, &medium) == S_OK) joachim99@75: { joachim99@75: HDROP drop = (HDROP)medium.hGlobal; joachim99@75: m_nrOfSelectedFiles = DragQueryFile(drop, 0xFFFFFFFF, 0, 0); joachim99@75: joachim99@75: TCHAR tmp[MAX_PATH]; joachim99@75: joachim99@75: //initialize_language(); joachim99@75: joachim99@75: if (m_nrOfSelectedFiles >= 1 && m_nrOfSelectedFiles <= 3) joachim99@75: { joachim99@75: DragQueryFile(drop, 0, tmp, MAX_PATH); joachim99@75: _file_name1 = tmp; joachim99@75: joachim99@75: if(m_nrOfSelectedFiles >= 2) joachim99@75: { joachim99@75: DragQueryFile(drop, 1, tmp, MAX_PATH); joachim99@75: _file_name2 = tmp; joachim99@75: } joachim99@75: joachim99@75: if( m_nrOfSelectedFiles == 3) joachim99@75: { joachim99@75: DragQueryFile(drop, 2, tmp, MAX_PATH); joachim99@75: _file_name3 = tmp; joachim99@75: } joachim99@75: joachim99@75: ret = S_OK; joachim99@75: } joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: SYSERRORLOG(TEXT("GetData")); joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: static int insertMenuItemHelper( HMENU menu, UINT id, UINT position, const tstring& text, joachim99@75: UINT fState = MFS_ENABLED, HMENU hSubMenu=0 ) joachim99@75: { joachim99@75: MENUITEMINFO item_info; joachim99@75: ZeroMemory(&item_info, sizeof(item_info)); joachim99@75: item_info.cbSize = sizeof(MENUITEMINFO); joachim99@75: item_info.wID = id; joachim99@75: if (text.empty()) joachim99@75: { // Separator joachim99@75: item_info.fMask = MIIM_TYPE; joachim99@75: item_info.fType = MFT_SEPARATOR; joachim99@75: item_info.dwTypeData = 0; joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: item_info.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | (hSubMenu!=0 ? MIIM_SUBMENU : 0); joachim99@75: item_info.fType = MFT_STRING; joachim99@75: item_info.fState = fState; joachim99@75: item_info.dwTypeData = (LPTSTR)text.c_str(); joachim99@75: item_info.hSubMenu = hSubMenu; joachim99@75: } joachim99@75: if ( 0 == InsertMenuItem(menu, position, TRUE, &item_info) ) joachim99@75: SYSERRORLOG(TEXT("InsertMenuItem")); joachim99@75: return id; joachim99@75: } joachim99@75: joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: DIFF_EXT::QueryContextMenu(HMENU menu, UINT position, UINT first_cmd, UINT /*last_cmd not used*/, UINT flags) joachim99@75: { joachim99@75: LOG(); joachim99@75: m_id_Diff = UINT(-1); joachim99@75: m_id_DiffWith = UINT(-1); joachim99@75: m_id_DiffLater = UINT(-1); joachim99@75: m_id_MergeWith = UINT(-1); joachim99@75: m_id_Merge3 = UINT(-1); joachim99@75: m_id_Diff3 = UINT(-1); joachim99@75: m_id_DiffWith_Base = UINT(-1); joachim99@77: m_id_ClearList = UINT(-1); joachim99@75: m_id_About = UINT(-1); joachim99@75: joachim99@75: HRESULT ret = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); joachim99@75: joachim99@75: if(!(flags & CMF_DEFAULTONLY)) joachim99@75: { joachim99@75: /* Menu structure: joachim99@75: KDiff3 -> (1 File selected): Save 'selection' for later comparison (push onto history stack) joachim99@75: Compare 'selection' with first file on history stack. joachim99@75: Compare 'selection' with -> choice from history stack joachim99@75: Merge 'selection' with first file on history stack. joachim99@75: Merge 'selection' with last two files on history stack. joachim99@75: (2 Files selected): Compare 's1' with 's2' joachim99@75: Merge 's1' with 's2' joachim99@75: (3 Files selected): Compare 's1', 's2' and 's3' joachim99@75: */ joachim99@75: HMENU subMenu = CreateMenu(); joachim99@75: joachim99@75: UINT id = first_cmd; joachim99@75: m_id_FirstCmd = first_cmd; joachim99@75: joachim99@75: insertMenuItemHelper( menu, id++, position++, TEXT("") ); // begin separator joachim99@75: joachim99@75: tstring menuString; joachim99@75: UINT pos2=0; joachim99@75: if(m_nrOfSelectedFiles == 1) joachim99@75: { joachim99@75: size_t nrOfRecentFiles = m_recentFiles.size(); joachim99@77: tstring menuStringCompare = i18n("Compare with %1"); joachim99@77: tstring menuStringMerge = i18n("Merge with %1"); joachim99@77: tstring firstFileName; joachim99@75: if( nrOfRecentFiles>=1 ) joachim99@75: { joachim99@80: firstFileName = TEXT("'") + cut_to_length( m_recentFiles.front() ) + TEXT("'"); joachim99@75: } joachim99@77: replaceArgs( menuStringCompare, firstFileName ); joachim99@77: replaceArgs( menuStringMerge, firstFileName ); joachim99@75: m_id_DiffWith = insertMenuItemHelper( subMenu, id++, pos2++, menuStringCompare, nrOfRecentFiles >=1 ? MFS_ENABLED : MFS_DISABLED ); joachim99@75: m_id_MergeWith = insertMenuItemHelper( subMenu, id++, pos2++, menuStringMerge, nrOfRecentFiles >=1 ? MFS_ENABLED : MFS_DISABLED ); joachim99@75: joachim99@75: //if( nrOfRecentFiles>=2 ) joachim99@75: //{ joachim99@75: // tstring firstFileName = cut_to_length( m_recentFiles.front() ); joachim99@75: // tstring secondFileName = cut_to_length( *(++m_recentFiles.begin()) ); joachim99@75: //} joachim99@75: m_id_Merge3 = insertMenuItemHelper( subMenu, id++, pos2++, i18n("3-way merge with base"), joachim99@75: nrOfRecentFiles >=2 ? MFS_ENABLED : MFS_DISABLED ); joachim99@75: joachim99@77: menuString = i18n("Save '%1' for later"); joachim99@75: replaceArgs( menuString, _file_name1 ); joachim99@75: m_id_DiffLater = insertMenuItemHelper( subMenu, id++, pos2++, menuString ); joachim99@75: joachim99@75: HMENU file_list = CreateMenu(); joachim99@75: std::list::iterator i; joachim99@75: m_id_DiffWith_Base = id; joachim99@75: int n = 0; joachim99@75: for( i = m_recentFiles.begin(); i!=m_recentFiles.end(); ++i ) joachim99@75: { joachim99@75: tstring s = cut_to_length( *i ); joachim99@75: insertMenuItemHelper( file_list, id++, n, s ); joachim99@75: ++n; joachim99@75: } joachim99@75: joachim99@77: insertMenuItemHelper( subMenu, id++, pos2++, i18n("Compare with ..."), joachim99@75: nrOfRecentFiles > 0 ? MFS_ENABLED : MFS_DISABLED, file_list ); joachim99@77: joachim99@77: m_id_ClearList = insertMenuItemHelper( subMenu, id++, pos2++, i18n("Clear list"), nrOfRecentFiles >=1 ? MFS_ENABLED : MFS_DISABLED ); joachim99@75: } joachim99@75: else if(m_nrOfSelectedFiles == 2) joachim99@75: { joachim99@75: //= "Diff " + cut_to_length(_file_name1, 20)+" and "+cut_to_length(_file_name2, 20); joachim99@75: m_id_Diff = insertMenuItemHelper( subMenu, id++, pos2++, i18n("Compare") ); joachim99@75: } joachim99@75: else if ( m_nrOfSelectedFiles == 3 ) joachim99@75: { joachim99@75: m_id_Diff3 = insertMenuItemHelper( subMenu, id++, pos2++, i18n("3 way comparison") ); joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: // More than 3 files selected? joachim99@75: } joachim99@75: m_id_About = insertMenuItemHelper( subMenu, id++, pos2++, i18n("About Diff-Ext ...") ); joachim99@75: joachim99@75: insertMenuItemHelper( menu, id++, position++, TEXT("KDiff3"), MFS_ENABLED, subMenu ); joachim99@75: joachim99@75: insertMenuItemHelper( menu, id++, position++, TEXT("") ); // final separator joachim99@75: joachim99@75: ret = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, id-first_cmd); joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: DIFF_EXT::InvokeCommand(LPCMINVOKECOMMANDINFO ici) joachim99@75: { joachim99@75: HRESULT ret = NOERROR; joachim99@75: joachim99@75: _hwnd = ici->hwnd; joachim99@75: joachim99@75: if(HIWORD(ici->lpVerb) == 0) joachim99@75: { joachim99@75: UINT id = m_id_FirstCmd + LOWORD(ici->lpVerb); joachim99@75: if(id == m_id_Diff) joachim99@75: { joachim99@75: LOG(); joachim99@75: diff( TEXT("\"") + _file_name1 + TEXT("\" \"") + _file_name2 + TEXT("\"") ); joachim99@75: } joachim99@75: else if(id == m_id_Diff3) joachim99@75: { joachim99@75: LOG(); joachim99@75: diff( TEXT("\"") + _file_name1 + TEXT("\" \"") + _file_name2 + TEXT("\" \"") + _file_name3 + TEXT("\"") ); joachim99@75: } joachim99@75: else if(id == m_id_Merge3) joachim99@75: { joachim99@75: LOG(); joachim99@75: std::list< tstring >::iterator iFrom = m_recentFiles.begin(); joachim99@75: std::list< tstring >::iterator iBase = iFrom; joachim99@75: ++iBase; joachim99@75: diff( TEXT("-m \"") + *iBase + TEXT("\" \"") + *iFrom + TEXT("\" \"") + _file_name1 + TEXT("\"") ); joachim99@75: } joachim99@75: else if(id == m_id_DiffWith) joachim99@75: { joachim99@75: LOG(); joachim99@75: diff_with(0, false); joachim99@75: } joachim99@75: else if(id == m_id_MergeWith) joachim99@75: { joachim99@75: LOG(); joachim99@75: diff_with(0, true); joachim99@75: } joachim99@77: else if(id == m_id_ClearList) joachim99@77: { joachim99@77: LOG(); joachim99@77: m_recentFiles.clear(); joachim99@77: } joachim99@75: else if(id == m_id_DiffLater) joachim99@75: { joachim99@75: MESSAGELOG(TEXT("Diff Later: ")+_file_name1); joachim99@75: m_recentFiles.remove( _file_name1 ); joachim99@75: m_recentFiles.push_front( _file_name1 ); joachim99@75: } joachim99@75: else if(id >= m_id_DiffWith_Base && id < m_id_DiffWith_Base+m_recentFiles.size()) joachim99@75: { joachim99@75: LOG(); joachim99@75: diff_with(id-m_id_DiffWith_Base, false); joachim99@75: } joachim99@75: else if(id == m_id_About) joachim99@75: { joachim99@75: LOG(); joachim99@75: MessageBox( _hwnd, (i18n("Diff-Ext Copyright (c) 2003-2006, Sergey Zorin. All rights reserved.\n") joachim99@75: + i18n("This software is distributable under the BSD license.\n") joachim99@75: + i18n("Some extensions for KDiff3 by Joachim Eibl.\n") joachim99@75: + i18n("Homepage for Diff-Ext: http://diff-ext.sourceforge.net\n") joachim99@75: + i18n("Homepage for KDiff3: http://kdiff3.sourceforge.net")).c_str() joachim99@75: , i18n("About Diff-Ext for KDiff3").c_str(), MB_OK ); joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: ret = E_INVALIDARG; joachim99@75: TCHAR verb[80]; joachim99@75: _sntprintf(verb, 79, TEXT("Command id: %d"), LOWORD(ici->lpVerb)); joachim99@75: verb[79]=0; joachim99@75: ERRORLOG(verb); joachim99@75: } joachim99@75: } joachim99@80: else joachim99@80: { joachim99@80: ret = E_INVALIDARG; joachim99@80: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: STDMETHODIMP joachim99@75: DIFF_EXT::GetCommandString(UINT idCmd, UINT uFlags, UINT*, LPSTR pszName, UINT cchMax) joachim99@75: { joachim99@75: // LOG(); // Gets called very often joachim99@75: HRESULT ret = NOERROR; joachim99@75: joachim99@75: if(uFlags == GCS_HELPTEXT) { joachim99@75: tstring helpString; joachim99@75: if( idCmd == m_id_Diff ) joachim99@75: { joachim99@75: helpString = i18n("Compare selected files"); joachim99@75: } joachim99@75: else if( idCmd == m_id_DiffWith ) joachim99@75: { joachim99@75: if(!m_recentFiles.empty()) joachim99@75: { joachim99@75: helpString = i18n("Compare '%1' with '%2'"); joachim99@75: replaceArgs( helpString, _file_name1, m_recentFiles.front() ); joachim99@75: } joachim99@75: } joachim99@75: else if(idCmd == m_id_DiffLater) joachim99@75: { joachim99@75: helpString = i18n("Save '%1' for later operation"); joachim99@75: replaceArgs( helpString, _file_name1 ); joachim99@75: } joachim99@75: else if((idCmd >= m_id_DiffWith_Base) && (idCmd < m_id_DiffWith_Base+m_recentFiles.size())) joachim99@75: { joachim99@75: if( !m_recentFiles.empty() ) joachim99@75: { joachim99@75: unsigned int num = idCmd - m_id_DiffWith_Base; joachim99@75: std::list::iterator i = m_recentFiles.begin(); joachim99@75: for(unsigned int j = 0; j < num && i != m_recentFiles.end(); j++) joachim99@75: i++; joachim99@75: joachim99@75: if ( i!=m_recentFiles.end() ) joachim99@75: { joachim99@75: helpString = i18n("Compare '%1' with '%2'"); joachim99@75: replaceArgs( helpString, _file_name1, *i ); joachim99@75: } joachim99@75: } joachim99@75: } joachim99@75: lstrcpyn( (LPTSTR)pszName, helpString.c_str(), cchMax ); joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: } joachim99@75: joachim99@75: void joachim99@75: DIFF_EXT::diff( const tstring& arguments ) joachim99@75: { joachim99@75: LOG(); joachim99@75: STARTUPINFO si; joachim99@75: PROCESS_INFORMATION pi; joachim99@75: bool bError = true; joachim99@75: tstring command = SERVER::instance()->getRegistryKeyString( TEXT(""), TEXT("diffcommand") ); joachim99@75: tstring commandLine = TEXT("\"") + command + TEXT("\" ") + arguments; joachim99@75: if ( ! command.empty() ) joachim99@75: { joachim99@75: ZeroMemory(&si, sizeof(si)); joachim99@75: si.cb = sizeof(si); joachim99@75: if (CreateProcess(command.c_str(), (LPTSTR)commandLine.c_str(), 0, 0, FALSE, 0, 0, 0, &si, &pi) == 0) joachim99@75: { joachim99@75: SYSERRORLOG(TEXT("CreateProcess") + command); joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: bError = false; joachim99@75: CloseHandle( pi.hProcess ); joachim99@75: CloseHandle( pi.hThread ); joachim99@75: } joachim99@75: } joachim99@75: joachim99@75: if (bError) joachim99@75: { joachim99@75: tstring message = i18n("Could not start KDiff3. Please rerun KDiff3 installation."); joachim99@75: message += TEXT("\n") + i18n("Command") + TEXT(": ") + command; joachim99@75: message += TEXT("\n") + i18n("CommandLine") + TEXT(": ") + commandLine; joachim99@75: MessageBox(_hwnd, message.c_str(), i18n("Diff-Ext For KDiff3").c_str(), MB_OK); joachim99@75: } joachim99@75: } joachim99@75: joachim99@75: void joachim99@75: DIFF_EXT::diff_with(unsigned int num, bool bMerge) joachim99@75: { joachim99@75: LOG(); joachim99@75: std::list::iterator i = m_recentFiles.begin(); joachim99@75: for(unsigned int j = 0; j < num && i!=m_recentFiles.end(); j++) { joachim99@75: i++; joachim99@75: } joachim99@75: joachim99@75: if ( i!=m_recentFiles.end() ) joachim99@75: _file_name2 = *i; joachim99@75: joachim99@77: diff( (bMerge ? TEXT("-m \"") : TEXT("\"") ) + _file_name2 + TEXT("\" \"") + _file_name1 + TEXT("\"") ); joachim99@75: } joachim99@75: joachim99@75: joachim99@75: tstring joachim99@75: DIFF_EXT::cut_to_length(const tstring& in, size_t max_len) joachim99@75: { joachim99@75: tstring ret; joachim99@75: if( in.length() > max_len) joachim99@75: { joachim99@75: ret = in.substr(0, (max_len-3)/2); joachim99@75: ret += TEXT("..."); joachim99@75: ret += in.substr( in.length()-(max_len-3)/2 ); joachim99@75: } joachim99@75: else joachim99@75: { joachim99@75: ret = in; joachim99@75: } joachim99@75: joachim99@75: return ret; joachim99@75: }