From: <sag...@us...> - 2013-11-10 22:22:11
|
Revision: 3186 http://sourceforge.net/p/modplug/code/3186 Author: saga-games Date: 2013-11-10 22:22:01 +0000 (Sun, 10 Nov 2013) Log Message: ----------- [Ref] More unicode conversion in treeview + select plugin dialog. Introduce a new class, CTreeCtrlW, which adds unicode variants of some CTreeCtrl functions in non-unicode builds. [Fix] Deleting files in treeview broke during unicode conversion. Modified Paths: -------------- trunk/OpenMPT/common/mptPathString.cpp trunk/OpenMPT/common/mptPathString.h trunk/OpenMPT/mptrack/SelectPluginDialog.cpp trunk/OpenMPT/mptrack/SelectPluginDialog.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/mptrack/CTreeCtrl.h Modified: trunk/OpenMPT/common/mptPathString.cpp =================================================================== --- trunk/OpenMPT/common/mptPathString.cpp 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/common/mptPathString.cpp 2013-11-10 22:22:01 UTC (rev 3186) @@ -60,6 +60,12 @@ SplitPath(nullptr, nullptr, nullptr, &ext); return ext; } +PathString PathString::GetFullFileName() const +{ + PathString name, ext; + SplitPath(nullptr, nullptr, &name, &ext); + return name + ext; +} } // namespace mpt Modified: trunk/OpenMPT/common/mptPathString.h =================================================================== --- trunk/OpenMPT/common/mptPathString.h 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/common/mptPathString.h 2013-11-10 22:22:01 UTC (rev 3186) @@ -90,21 +90,23 @@ #if defined(MODPLUG_TRACKER) void SplitPath(PathString *drive, PathString *dir, PathString *fname, PathString *ext) const; - PathString GetDrive() const; - PathString GetDir() const; - PathString GetPath() const; - PathString GetFileName() const; - PathString GetFileExt() const; + PathString GetDrive() const; // Drive letter + colon, e.g. "C:" + PathString GetDir() const; // Directory, e.g. "\OpenMPT\" + PathString GetPath() const; // Drive + Dir, e.g. "C:\OpenMPT\" + PathString GetFileName() const; // File name without extension, e.g. "mptrack" + PathString GetFileExt() const; // Extension including dot, e.g. ".exe" + PathString GetFullFileName() const; // File name + extension, e.g. "mptrack.exe" bool HasTrailingSlash() const { if(empty()) return false; + const RawPathString::value_type &c = path[path.length() - 1]; #if defined(WIN32) - if(path[path.length()-1] == L'\\' || path[path.length()-1] == L'/') + if(c == L'\\' || c == L'/') return true; #else - if(path[path.length()-1] == '/') + if(c == '/') return true; #endif return false; Added: trunk/OpenMPT/mptrack/CTreeCtrl.h =================================================================== --- trunk/OpenMPT/mptrack/CTreeCtrl.h (rev 0) +++ trunk/OpenMPT/mptrack/CTreeCtrl.h 2013-11-10 22:22:01 UTC (rev 3186) @@ -0,0 +1,123 @@ +/* + * CTreeCtrl.h + * ----------- + * Purpose: A class that extends MFC's CTreeCtrl to handle unicode strings in ANSI builds. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + + +class CTreeCtrlW : public CTreeCtrl +{ +public: + +#ifndef UNICODE + BOOL GetItem(TVITEMW *pItem) const + { + return ::SendMessage(m_hWnd, TVM_GETITEMW, 0, (LPARAM)pItem) ? TRUE : FALSE; + } + + BOOL SetItem(TVITEMW *pItem) + { + return ::SendMessage(m_hWnd, TVM_SETITEMW, 0, (LPARAM)pItem) ? TRUE : FALSE; + } + BOOL SetItem(HTREEITEM hItem, UINT nMask, const WCHAR *lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) + { + TVITEMW tvi; + MemsetZero(tvi); + tvi.hItem = hItem; + tvi.mask = nMask; + tvi.state = nState; + tvi.stateMask = nStateMask; + tvi.iImage = nImage; + tvi.iSelectedImage = nSelectedImage; + tvi.pszText = const_cast<WCHAR *>(lpszItem); + tvi.lParam = lParam; + return SetItem(&tvi); + } + + HTREEITEM InsertItem(TVINSERTSTRUCTW &tvi) + { + return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEMW, 0, (LPARAM)&tvi); + } + HTREEITEM InsertItem(UINT nMask, const WCHAR *lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter) + { + TVINSERTSTRUCTW tvi; + MemsetZero(tvi); + tvi.hInsertAfter = hInsertAfter; + tvi.hParent = hParent; + tvi.item.mask = nMask; + tvi.item.state = nState; + tvi.item.stateMask = nStateMask; + tvi.item.iImage = nImage; + tvi.item.iSelectedImage = nSelectedImage; + tvi.item.pszText = const_cast<WCHAR *>(lpszItem); + tvi.item.lParam = lParam; + return InsertItem(tvi); + } + HTREEITEM InsertItem(const WCHAR *lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST) + { + TVINSERTSTRUCTW tvi; + MemsetZero(tvi); + tvi.hInsertAfter = hInsertAfter; + tvi.hParent = hParent; + tvi.item.mask = TVIF_TEXT; + tvi.item.pszText = const_cast<WCHAR *>(lpszItem); + return InsertItem(tvi); + } + HTREEITEM InsertItem(const WCHAR *lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST) + { + TVINSERTSTRUCTW tvi; + MemsetZero(tvi); + tvi.hInsertAfter = hInsertAfter; + tvi.hParent = hParent; + tvi.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; + tvi.item.iImage = nImage; + tvi.item.iSelectedImage = nSelectedImage; + tvi.item.pszText = const_cast<WCHAR *>(lpszItem); + return InsertItem(tvi); + } + + void SetItemText(HTREEITEM item, const WCHAR *text) + { + TVITEMW tvi; + MemsetZero(tvi); + tvi.hItem = item; + tvi.mask = TVIF_TEXT; + tvi.pszText = const_cast<WCHAR *>(text); + ::SendMessage(m_hWnd, TVM_SETITEMW, 0, (LPARAM)&tvi); + } + +#endif // UNICODE + + std::wstring GetItemTextW(HTREEITEM item) const + { +#ifdef UNICODE + return GetItemText(item); +#else + WCHAR name[MAX_PATH]; // Maximum displayed text length according to documentation. + TVITEMW tvi; + MemsetZero(tvi); + tvi.hItem = item; + tvi.mask = TVIF_TEXT; + tvi.pszText = name; + tvi.cchTextMax = CountOf(name); + if(GetItem(&tvi)) + { + return tvi.pszText; + } else + { + return std::wstring(); + } +#endif // UNICODE + } + + using CTreeCtrl::GetItem; + using CTreeCtrl::SetItem; + using CTreeCtrl::SetItemText; + using CTreeCtrl::InsertItem; +}; Modified: trunk/OpenMPT/mptrack/SelectPluginDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/SelectPluginDialog.cpp 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/SelectPluginDialog.cpp 2013-11-10 22:22:01 UTC (rev 3186) @@ -250,22 +250,22 @@ static const struct { VSTPluginLib::PluginCategory category; - const char *description; + const WCHAR *description; } categories[] = { - { VSTPluginLib::catEffect, "Audio Effects" }, - { VSTPluginLib::catGenerator, "Tone Generators" }, - { VSTPluginLib::catRestoration, "Audio Restauration" }, - { VSTPluginLib::catSurroundFx, "Surround Effects" }, - { VSTPluginLib::catRoomFx, "Room Effects" }, - { VSTPluginLib::catSpacializer, "Spacializers" }, - { VSTPluginLib::catMastering, "Mastering Plugins" }, - { VSTPluginLib::catAnalysis, "Analysis Plugins" }, - { VSTPluginLib::catOfflineProcess, "Offline Processing" }, - { VSTPluginLib::catShell, "Shell Plugins" }, - { VSTPluginLib::catUnknown, "Unsorted" }, - { VSTPluginLib::catDMO, "DirectX Media Audio Effects" }, - { VSTPluginLib::catSynth, "Instrument Plugins" }, + { VSTPluginLib::catEffect, L"Audio Effects" }, + { VSTPluginLib::catGenerator, L"Tone Generators" }, + { VSTPluginLib::catRestoration, L"Audio Restauration" }, + { VSTPluginLib::catSurroundFx, L"Surround Effects" }, + { VSTPluginLib::catRoomFx, L"Room Effects" }, + { VSTPluginLib::catSpacializer, L"Spacializers" }, + { VSTPluginLib::catMastering, L"Mastering Plugins" }, + { VSTPluginLib::catAnalysis, L"Analysis Plugins" }, + { VSTPluginLib::catOfflineProcess, L"Offline Processing" }, + { VSTPluginLib::catShell, L"Shell Plugins" }, + { VSTPluginLib::catUnknown, L"Unsorted" }, + { VSTPluginLib::catDMO, L"DirectX Media Audio Effects" }, + { VSTPluginLib::catSynth, L"Instrument Plugins" }, }; std::bitset<VSTPluginLib::numCategories> categoryUsed; @@ -276,7 +276,7 @@ categoryFolders[categories[i].category] = AddTreeItem(categories[i].description, IMAGE_FOLDER, false); } - HTREEITEM noPlug = AddTreeItem("No plugin (empty slot)", IMAGE_NOPLUGIN, false); + HTREEITEM noPlug = AddTreeItem(L"No plugin (empty slot)", IMAGE_NOPLUGIN, false); HTREEITEM currentPlug = noPlug; bool foundCurrentPlug = false; @@ -299,7 +299,7 @@ } } - HTREEITEM h = AddTreeItem(p->libraryName.ToCString(), p->isInstrument ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN, true, categoryFolders[p->category], reinterpret_cast<LPARAM>(p)); + HTREEITEM h = AddTreeItem(p->libraryName.AsNative().c_str(), p->isInstrument ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN, true, categoryFolders[p->category], reinterpret_cast<LPARAM>(p)); categoryUsed[p->category] = true; if(nameFilterActive) @@ -375,18 +375,9 @@ } -HTREEITEM CSelectPluginDlg::AddTreeItem(const TCHAR *title, int image, bool sort, HTREEITEM hParent, LPARAM lParam) +HTREEITEM CSelectPluginDlg::AddTreeItem(const WCHAR *title, int image, bool sort, HTREEITEM hParent, LPARAM lParam) //----------------------------------------------------------------------------------------------------------------- { - /*TVINSERTSTRUCTW tvi; - MemsetZero(tvi); - tvi.hInsertAfter = (sort ? TVI_SORT : TVI_FIRST); - tvi.hParent = hParent; - tvi.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT; - tvi.item.iImage = tvi.item.iSelectedImage = image; - tvi.item.pszText = title; - tvi.item.lParam = lParam; - return (HTREEITEM)::SendMessage(m_treePlugins.m_hWnd, TVM_INSERTITEMW, 0, (LPARAM)&tvi);*/ return m_treePlugins.InsertItem( TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, title, Modified: trunk/OpenMPT/mptrack/SelectPluginDialog.h =================================================================== --- trunk/OpenMPT/mptrack/SelectPluginDialog.h 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/SelectPluginDialog.h 2013-11-10 22:22:01 UTC (rev 3186) @@ -14,6 +14,7 @@ #define SELECTPLUGINDIALOG_H #include "Vstplug.h" +#include "CTreeCtrl.h" //==================================== class CSelectPluginDlg: public CDialog @@ -23,10 +24,10 @@ int m_nPlugSlot; SNDMIXPLUGIN *m_pPlugin; CModDoc *m_pModDoc; - CTreeCtrl m_treePlugins; + CTreeCtrlW m_treePlugins; CString m_sNameFilter; - HTREEITEM AddTreeItem(const TCHAR *title, int image, bool sort, HTREEITEM hParent = TVI_ROOT, LPARAM lParam = NULL); + HTREEITEM AddTreeItem(const WCHAR *title, int image, bool sort, HTREEITEM hParent = TVI_ROOT, LPARAM lParam = NULL); public: CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2013-11-10 22:22:01 UTC (rev 3186) @@ -113,21 +113,18 @@ ///////////////////////////////////////////////////////////////////////////// // CViewModTree construction/destruction -CModTree::CModTree(CModTree *pDataTree) +CModTree::CModTree(CModTree *pDataTree) : + m_pDataTree(pDataTree), + m_hDropWnd(nullptr), + m_dwStatus(0), + m_nDocNdx(0), m_nDragDocNdx(0), + m_hItemDrag(nullptr), m_hItemDrop(nullptr), + m_hInsLib(nullptr), m_hMidiLib(nullptr), + m_bShowAllFiles(false), doLabelEdit(false) //------------------------------------- { - m_pDataTree = pDataTree; - m_dwStatus = 0; - m_bShowAllFiles = false; - m_hItemDrag = m_hItemDrop = NULL; - m_hDropWnd = NULL; - m_hInsLib = m_hMidiLib = NULL; - m_nDocNdx = m_nDragDocNdx = 0; - doLabelEdit = false; - MemsetZero(m_tiMidiGrp); MemsetZero(m_tiMidi); MemsetZero(m_tiPerc); - DocInfo.clear(); } @@ -190,7 +187,7 @@ m_hMidiLib = InsertItem("MIDI Library", IMAGE_FOLDER, IMAGE_FOLDER, TVI_ROOT, TVI_LAST); for (UINT iMidGrp=0; iMidGrp<17; iMidGrp++) { - m_tiMidiGrp[iMidGrp] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szMidiGroupNames[iMidGrp], IMAGE_FOLDER, IMAGE_FOLDER, 0, 0, (MODITEM_HDR_MIDIGROUP << MIDILIB_SHIFT) | iMidGrp, m_hMidiLib, TVI_LAST); + InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szMidiGroupNames[iMidGrp], IMAGE_FOLDER, IMAGE_FOLDER, 0, 0, (MODITEM_HDR_MIDIGROUP << MIDILIB_SHIFT) | iMidGrp, m_hMidiLib, TVI_LAST); } } m_hInsLib = InsertItem("Instrument Library", IMAGE_FOLDER, IMAGE_FOLDER, TVI_ROOT, TVI_LAST); @@ -266,38 +263,6 @@ } -std::wstring CModTree::GetItemTextW(HTREEITEM item) const -//------------------------------------------------------- -{ - WCHAR name[MAX_PATH]; // Maximum displayed text length according to documentation. - TVITEMW tvi; - MemsetZero(tvi); - tvi.hItem = item; - tvi.mask = TVIF_TEXT; - tvi.pszText = name; - tvi.cchTextMax = CountOf(name); - if(::SendMessage(m_hWnd, TVM_GETITEMW, 0, (LPARAM)&tvi)) - { - return tvi.pszText; - } else - { - return L""; - } -} - - -void CModTree::SetItemTextW(HTREEITEM item, const WCHAR *text) -//------------------------------------------------------------ -{ - TVITEMW tvi; - MemsetZero(tvi); - tvi.hItem = item; - tvi.mask = TVIF_TEXT; - tvi.pszText = const_cast<WCHAR *>(text); - ::SendMessage(m_hWnd, TVM_SETITEMW, 0, (LPARAM)&tvi); -} - - mpt::PathString CModTree::InsLibGetFullPath(HTREEITEM hItem) const //---------------------------------------------------------------- { @@ -447,33 +412,28 @@ void CModTree::RefreshMidiLibrary() //--------------------------------- { - CHAR s[256], stmp[256]; - TV_ITEM tvi; - CHAR szName[_MAX_FNAME], szExt[_MAX_EXT]; + std::wstring s; + WCHAR stmp[256]; + TV_ITEMW tvi; const MIDILIBSTRUCT &midiLib = CTrackApp::GetMidiLibrary(); if (IsSampleBrowser()) return; // Midi Programs - for (UINT iMidi=0; iMidi<128; iMidi++) + HTREEITEM parent = GetChildItem(m_hMidiLib); + for(UINT iMidi = 0; iMidi < 128; iMidi++) { DWORD dwImage = IMAGE_NOINSTRUMENT; - wsprintf(s, "%u: %s", iMidi, szMidiProgramNames[iMidi]); + s = StringifyW(iMidi) + L": " + mpt::String::Decode(szMidiProgramNames[iMidi], mpt::CharsetUTF8); const LPARAM param = (MODITEM_MIDIINSTRUMENT << MIDILIB_SHIFT) | iMidi; if(!midiLib.MidiMap[iMidi].empty()) { - _splitpath(midiLib.MidiMap[iMidi].ToLocale().c_str(), NULL, NULL, szName, szExt); - strncat(s, ": ", sizeof(s)); - s[sizeof(s)-1] = 0; - strncat(s, szName, sizeof(s)); - s[sizeof(s)-1] = 0; - strncat(s, szExt, sizeof(s)); - s[sizeof(s)-1] = 0; - if (szName[0]) dwImage = IMAGE_INSTRUMENTS; + s += L": " + midiLib.MidiMap[iMidi].GetFullFileName().ToWide(); + dwImage = IMAGE_INSTRUMENTS; } if (!m_tiMidi[iMidi]) { m_tiMidi[iMidi] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, m_tiMidiGrp[iMidi/8], TVI_LAST); + s.c_str(), dwImage, dwImage, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; @@ -482,34 +442,32 @@ tvi.cchTextMax = sizeof(stmp); tvi.iImage = tvi.iSelectedImage = dwImage; GetItem(&tvi); - if ((strcmp(s, stmp)) || (tvi.iImage != (int)dwImage)) + if(s != stmp || tvi.iImage != (int)dwImage) { SetItem(m_tiMidi[iMidi], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param); + s.c_str(), dwImage, dwImage, 0, 0, param); } } + if((iMidi % 8u) == 7u) + { + parent = GetNextSiblingItem(parent); + } } // Midi Percussions for (UINT iPerc=24; iPerc<=84; iPerc++) { DWORD dwImage = IMAGE_NOSAMPLE; - wsprintf(s, "%s: %s", szDefaultNoteNames[iPerc], szMidiPercussionNames[iPerc-24]); + s = mpt::String::Decode(szDefaultNoteNames[iPerc], mpt::CharsetUTF8) + L": " + mpt::String::Decode(szMidiPercussionNames[iPerc - 24], mpt::CharsetUTF8); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; - if(!midiLib.MidiMap[iPerc|0x80].empty()) + if(!midiLib.MidiMap[iPerc | 0x80].empty()) { - _splitpath(midiLib.MidiMap[iPerc|0x80].ToLocale().c_str(), NULL, NULL, szName, szExt); - strncat(s, ": ", sizeof(s)); - mpt::String::SetNullTerminator(s); - strncat(s, szName, sizeof(s)); - mpt::String::SetNullTerminator(s); - strncat(s, szExt, sizeof(s)); - mpt::String::SetNullTerminator(s); - if (szName[0]) dwImage = IMAGE_SAMPLES; + s += L": " + midiLib.MidiMap[iPerc | 0x80].GetFullFileName().ToWide(); + dwImage = IMAGE_SAMPLES; } if (!m_tiPerc[iPerc]) { m_tiPerc[iPerc] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, m_tiMidiGrp[16], TVI_LAST); + s.c_str(), dwImage, dwImage, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; @@ -518,10 +476,10 @@ tvi.cchTextMax = sizeof(stmp); tvi.iImage = tvi.iSelectedImage = dwImage; GetItem(&tvi); - if ((strcmp(s, stmp)) || (tvi.iImage != (int)dwImage)) + if(s != stmp || tvi.iImage != (int)dwImage) { SetItem(m_tiPerc[iPerc], TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE, - s, dwImage, dwImage, 0, 0, param); + s.c_str(), dwImage, dwImage, 0, 0, param); } } } @@ -547,14 +505,12 @@ { if(!m_tiDLS[iDls]) { - CHAR szName[_MAX_PATH] = "", szExt[_MAX_EXT] = ".dls"; TV_SORTCB tvs; CDLSBank *pDlsBank = CTrackApp::gpDLSBanks[iDls]; // Add DLS file folder - _splitpath(pDlsBank->GetFileName().ToLocale().c_str(), NULL, NULL, szName, szExt); - strcat(szName, szExt); + std::wstring name = pDlsBank->GetFileName().GetFullFileName().ToWide(); m_tiDLS[iDls] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - szName, IMAGE_FOLDER, IMAGE_FOLDER, 0, 0, iDls, TVI_ROOT, hDlsRoot); + name.c_str(), IMAGE_FOLDER, IMAGE_FOLDER, 0, 0, iDls, TVI_ROOT, hDlsRoot); // Memorize Banks WORD wBanks[16]; HTREEITEM hBanks[16]; @@ -571,6 +527,7 @@ DLSINSTRUMENT *pDlsIns = pDlsBank->GetInstrument(iIns); if (pDlsIns) { + CHAR szName[256]; wsprintf(szName, "%u: %s", pDlsIns->ulInstrument & 0x7F, pDlsIns->szName); // Drum Kit if (pDlsIns->ulBank & F_INSTRUMENT_DRUMS) @@ -722,7 +679,7 @@ tvi.mask |= TVIF_TEXT | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = pInfo->hSong; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); tvi.iImage = tvi.iSelectedImage = IMAGE_FOLDER; GetItem(&tvi); if ((strcmp(s, stmp)) || (tvi.iImage != IMAGE_FOLDER)) @@ -857,7 +814,7 @@ tvi.stateMask = TVIS_BOLD; tvi.hItem = pInfo->tiSequences[nSeq]; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); LPARAM param = (nSeq << SEQU_SHIFT) | ORDERINDEX_INVALID; GetItem(&tvi); if(tvi.state != state || tvi.pszText != sSeqName || tvi.lParam != param) @@ -915,7 +872,7 @@ tvi.stateMask = TVIS_BOLD; tvi.hItem = pInfo->tiOrders[nSeq][iOrd]; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); GetItem(&tvi); if ((strcmp(s, stmp)) || (tvi.state != state)) SetItem(pInfo->tiOrders[nSeq][iOrd], TVIF_TEXT | TVIF_STATE | TVIF_PARAM, s, 0, 0, state, TVIS_BOLD, param); @@ -959,7 +916,7 @@ tvi.mask = TVIF_TEXT | TVIF_HANDLE; tvi.hItem = pInfo->tiPatterns[iPat]; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); GetItem(&tvi); if (strcmp(s, stmp)) SetItem(pInfo->tiPatterns[iPat], TVIF_TEXT, s, 0, 0, 0, 0, 0); } else @@ -1007,7 +964,7 @@ tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_IMAGE; tvi.hItem = hChild; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); tvi.iImage = tvi.iSelectedImage = nImage; GetItem(&tvi); if ((strcmp(s, stmp)) || (tvi.iImage != nImage)) @@ -1064,7 +1021,7 @@ tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_IMAGE; tvi.hItem = hChild; tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); + tvi.cchTextMax = CountOf(stmp); tvi.iImage = tvi.iSelectedImage = nImage; GetItem(&tvi); if ((strcmp(s, stmp)) || (tvi.iImage != nImage)) @@ -1501,12 +1458,13 @@ case MODITEM_INSLIB_SAMPLE: case MODITEM_INSLIB_INSTRUMENT: { + // Create double-null-terminated path + const std::wstring fullPath = InsLibGetFullPath(hItem).ToWide() + L'\0'; SHFILEOPSTRUCTW fos; - mpt::PathString fullPath = InsLibGetFullPath(hItem); - memset(&fos, 0, sizeof(fos)); + MemsetZero(fos); fos.hwnd = m_hWnd; fos.wFunc = FO_DELETE; - fos.pFrom = fullPath.AsNative().c_str(); + fos.pFrom = fullPath.c_str(); fos.fFlags = FOF_ALLOWUNDO; if ((0 == SHFileOperationW(&fos)) && (!fos.fAnyOperationsAborted)) RefreshInstrumentLibrary(); } @@ -1604,7 +1562,7 @@ if(!m_szSongName.empty() && IsSampleBrowser() && m_SongFile) { // Fill browser with samples / instruments of module file - SetItemTextW(m_hInsLib, m_szSongName.AsNative().c_str()); + SetItemText(m_hInsLib, m_szSongName.AsNative().c_str()); SetItemImage(m_hInsLib, IMAGE_FOLDERSONG, IMAGE_FOLDERSONG); for(INSTRUMENTINDEX ins = 1; ins <= m_SongFile->GetNumInstruments(); ins++) { @@ -1632,10 +1590,10 @@ if(!IsSampleBrowser()) { text = L"Instrument Library (" + m_szInstrLibPath.ToWide() + L")"; - SetItemTextW(m_hInsLib, text.c_str()); + SetItemText(m_hInsLib, text.c_str()); } else { - SetItemTextW(m_hInsLib, m_szInstrLibPath.ToWide().c_str()); + SetItemText(m_hInsLib, m_szInstrLibPath.ToWide().c_str()); SetItemImage(m_hInsLib, IMAGE_FOLDER, IMAGE_FOLDER); } @@ -1786,7 +1744,6 @@ void CModTree::ModTreeInsert(const WCHAR *name, int image) //-------------------------------------------------------- { - TV_INSERTSTRUCTW tvis; DWORD dwId = 0; switch(image) { @@ -1805,20 +1762,13 @@ dwId = 4; break; } - tvis.hParent = (!IsSampleBrowser()) ? m_hInsLib : TVI_ROOT; - tvis.hInsertAfter = TVI_LAST; - tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT; - tvis.item.hItem = 0; - tvis.item.state = 0; - tvis.item.stateMask = 0; - tvis.item.pszText = const_cast<WCHAR *>(name); - tvis.item.cchTextMax = 0; - tvis.item.iImage = image; - tvis.item.iSelectedImage = image; - tvis.item.cChildren = 0; - tvis.item.lParam = (LPARAM)dwId; - - ::SendMessage(m_hWnd, TVM_INSERTITEMW, 0, (LPARAM)&tvis); + InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT, + name, + image, image, + 0, 0, + (LPARAM)dwId, + (!IsSampleBrowser()) ? m_hInsLib : TVI_ROOT, + TVI_LAST); } @@ -1838,12 +1788,9 @@ lParam2 &= 0x7FFFFFFF; if ((lParam1 & 0xFF00FFFF) == (lParam2 & 0xFF00FFFF)) { - /*UINT iDls = (lParam1 >> 24) & 0xFF; - if ((iDls < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[iDls]))*/ if(pDLSBank) { - //CDLSBank *pDLSBank = CTrackApp::gpDLSBanks[iDls]; - DLSINSTRUMENT *pDlsIns = reinterpret_cast<CDLSBank *>(pDLSBank)->GetInstrument(lParam1 & 0xFFFF); + const DLSINSTRUMENT *pDlsIns = reinterpret_cast<CDLSBank *>(pDLSBank)->GetInstrument(lParam1 & 0xFFFF); lParam1 = (lParam1 >> 16) & 0xFF; lParam2 = (lParam2 >> 16) & 0xFF; if ((pDlsIns) && (lParam1 < (LONG)pDlsIns->nRegions) && (lParam2 < (LONG)pDlsIns->nRegions)) @@ -3283,17 +3230,12 @@ void CModTree::OnSoundBankProperties() //------------------------------------ { - HTREEITEM hItem = GetSelectedItem(); - - const ModItem modItem = GetModItem(hItem); - - if (modItem.type == MODITEM_DLSBANK_FOLDER) + const ModItem modItem = GetModItem(GetSelectedItem()); + if(modItem.type == MODITEM_DLSBANK_FOLDER + && modItem.val1 < CTrackApp::gpDLSBanks.size() && CTrackApp::gpDLSBanks[modItem.val1]) { - if ((modItem.val1 < CTrackApp::gpDLSBanks.size()) && (CTrackApp::gpDLSBanks[modItem.val1])) - { - CSoundBankProperties dlg(CTrackApp::gpDLSBanks[modItem.val1], this); - dlg.DoModal(); - } + CSoundBankProperties dlg(CTrackApp::gpDLSBanks[modItem.val1], this); + dlg.DoModal(); } } Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/View_tre.h 2013-11-10 22:22:01 UTC (rev 3186) @@ -36,7 +36,7 @@ std::bitset<MAX_SAMPLES> samplesPlaying; std::bitset<MAX_INSTRUMENTS> instrumentsPlaying; - + ModTreeDocInfo(const CSoundFile &sndFile) { pModDoc = sndFile.GetpModDoc(); @@ -70,9 +70,11 @@ }; -//============================== -class CModTree: public CTreeCtrl -//============================== +#include "CTreeCtrl.h" + +//=============================== +class CModTree: public CTreeCtrlW +//=============================== { protected: @@ -166,7 +168,6 @@ UINT m_nDocNdx, m_nDragDocNdx; HTREEITEM m_hItemDrag, m_hItemDrop; HTREEITEM m_hInsLib, m_hMidiLib; - HTREEITEM m_tiMidiGrp[17]; HTREEITEM m_tiMidi[128]; HTREEITEM m_tiPerc[128]; std::vector<HTREEITEM> m_tiDLS; @@ -213,9 +214,6 @@ bool IsSampleBrowser() const { return m_pDataTree == nullptr; } - std::wstring GetItemTextW(HTREEITEM item) const; - void SetItemTextW(HTREEITEM item, const WCHAR *text); - // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CModTree) Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2013-11-10 22:22:01 UTC (rev 3186) @@ -893,6 +893,10 @@ > </File> <File + RelativePath=".\CTreeCtrl.h" + > + </File> + <File RelativePath=".\ctrl_com.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2013-11-10 22:22:01 UTC (rev 3186) @@ -701,6 +701,7 @@ <ClInclude Include="ColourEdit.h" /> <ClInclude Include="CommandSet.h" /> <ClInclude Include="CreditStatic.h" /> + <ClInclude Include="CTreeCtrl.h" /> <ClInclude Include="Ctrl_com.h" /> <ClInclude Include="Ctrl_gen.h" /> <ClInclude Include="Ctrl_ins.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-11-10 19:16:46 UTC (rev 3185) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2013-11-10 22:22:01 UTC (rev 3186) @@ -951,6 +951,9 @@ <ClInclude Include="..\common\mptPathString.h"> <Filter>Header Files\common</Filter> </ClInclude> + <ClInclude Include="CTreeCtrl.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |