diff options
Diffstat (limited to 'CPP/7zip/UI/FileManager/ViewSettings.cpp')
-rw-r--r--[-rwxr-xr-x] | CPP/7zip/UI/FileManager/ViewSettings.cpp | 360 |
1 files changed, 140 insertions, 220 deletions
diff --git a/CPP/7zip/UI/FileManager/ViewSettings.cpp b/CPP/7zip/UI/FileManager/ViewSettings.cpp index f11f68d6..9688a4a5 100755..100644 --- a/CPP/7zip/UI/FileManager/ViewSettings.cpp +++ b/CPP/7zip/UI/FileManager/ViewSettings.cpp @@ -1,13 +1,16 @@ -// ViewSettings.h +// ViewSettings.cpp #include "StdAfx.h" + +#include "../../../../C/CpuArch.h" -#include "Common/IntToString.h" -#include "Common/StringConvert.h" +#include "../../../Common/IntToString.h" +#include "../../../Common/StringConvert.h" + +#include "../../../Windows/Registry.h" +#include "../../../Windows/Synchronization.h" #include "ViewSettings.h" -#include "Windows/Registry.h" -#include "Windows/Synchronization.h" using namespace NWindows; using namespace NRegistry; @@ -27,163 +30,95 @@ static const TCHAR *kFolderHistoryValueName = TEXT("FolderHistory"); static const TCHAR *kFastFoldersValueName = TEXT("FolderShortcuts"); static const TCHAR *kCopyHistoryValueName = TEXT("CopyHistory"); -/* -class CColumnInfoSpec -{ - UInt32 PropID; - Byte IsVisible; - UInt32 Width; -}; +static NSynchronization::CCriticalSection g_CS; + +#define Set32(p, v) SetUi32(((Byte *)p), v) +#define SetBool(p, v) Set32(p, ((v) ? 1 : 0)) +#define Get32(p, dest) dest = GetUi32((const Byte *)p) +#define GetBool(p, dest) dest = (GetUi32(p) != 0); + +/* struct CColumnHeader { UInt32 Version; UInt32 SortID; - Byte Ascending; + UInt32 Ascending; // bool }; */ -static const UInt32 kColumnInfoSpecHeader = 12; -static const UInt32 kColumnHeaderSize = 12; - -static const UInt32 kColumnInfoVersion = 1; - -static NSynchronization::CCriticalSection g_CS; - -class CTempOutBufferSpec -{ - CByteBuffer Buffer; - UInt32 Size; - UInt32 Pos; -public: - operator const Byte *() const { return (const Byte *)Buffer; } - void Init(UInt32 dataSize) - { - Buffer.SetCapacity(dataSize); - Size = dataSize; - Pos = 0; - } - void WriteByte(Byte value) - { - if (Pos >= Size) - throw "overflow"; - ((Byte *)Buffer)[Pos++] = value; - } - void WriteUInt32(UInt32 value) - { - for (int i = 0; i < 4; i++) - { - WriteByte((Byte)value); - value >>= 8; - } - } - void WriteBool(bool value) - { - WriteUInt32(value ? 1 : 0); - } -}; +static const UInt32 kListViewHeaderSize = 3 * 4; +static const UInt32 kColumnInfoSize = 3 * 4; +static const UInt32 kListViewVersion = 1; -class CTempInBufferSpec +void CListViewInfo::Save(const UString &id) const { -public: - Byte *Buffer; - UInt32 Size; - UInt32 Pos; - Byte ReadByte() - { - if (Pos >= Size) - throw "overflow"; - return Buffer[Pos++]; - } - UInt32 ReadUInt32() - { - UInt32 value = 0; - for (int i = 0; i < 4; i++) - value |= (((UInt32)ReadByte()) << (8 * i)); - return value; - } - bool ReadBool() - { - return (ReadUInt32() != 0); - } -}; + const UInt32 dataSize = kListViewHeaderSize + kColumnInfoSize * Columns.Size(); + CByteArr buf(dataSize); -void SaveListViewInfo(const UString &id, const CListViewInfo &viewInfo) -{ - const CObjectVector<CColumnInfo> &columns = viewInfo.Columns; - CTempOutBufferSpec buffer; - UInt32 dataSize = kColumnHeaderSize + kColumnInfoSpecHeader * columns.Size(); - buffer.Init(dataSize); - - buffer.WriteUInt32(kColumnInfoVersion); - buffer.WriteUInt32(viewInfo.SortID); - buffer.WriteBool(viewInfo.Ascending); - for(int i = 0; i < columns.Size(); i++) + Set32(buf, kListViewVersion); + Set32(buf + 4, SortID); + SetBool(buf + 8, Ascending); + FOR_VECTOR (i, Columns) { - const CColumnInfo &column = columns[i]; - buffer.WriteUInt32(column.PropID); - buffer.WriteBool(column.IsVisible); - buffer.WriteUInt32(column.Width); + const CColumnInfo &column = Columns[i]; + Byte *p = buf + kListViewHeaderSize + i * kColumnInfoSize; + Set32(p, column.PropID); + SetBool(p + 4, column.IsVisible); + Set32(p + 8, column.Width); } { NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; key.Create(HKEY_CURRENT_USER, kCulumnsKeyName); - key.SetValue(GetSystemString(id), (const Byte *)buffer, dataSize); + key.SetValue(GetSystemString(id), (const Byte *)buf, dataSize); } } -void ReadListViewInfo(const UString &id, CListViewInfo &viewInfo) +void CListViewInfo::Read(const UString &id) { - viewInfo.Clear(); - CObjectVector<CColumnInfo> &columns = viewInfo.Columns; - CByteBuffer buffer; + Clear(); + CByteBuffer buf; UInt32 size; { NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; if (key.Open(HKEY_CURRENT_USER, kCulumnsKeyName, KEY_READ) != ERROR_SUCCESS) return; - if (key.QueryValue(GetSystemString(id), buffer, size) != ERROR_SUCCESS) + if (key.QueryValue(GetSystemString(id), buf, size) != ERROR_SUCCESS) return; } - if (size < kColumnHeaderSize) + if (size < kListViewHeaderSize) return; - CTempInBufferSpec inBuffer; - inBuffer.Size = size; - inBuffer.Buffer = (Byte *)buffer; - inBuffer.Pos = 0; - - - UInt32 version = inBuffer.ReadUInt32(); - if (version != kColumnInfoVersion) + UInt32 version; + Get32(buf, version); + if (version != kListViewVersion) return; - viewInfo.SortID = inBuffer.ReadUInt32(); - viewInfo.Ascending = inBuffer.ReadBool(); + Get32(buf + 4, SortID); + GetBool(buf + 8, Ascending); - size -= kColumnHeaderSize; - if (size % kColumnInfoSpecHeader != 0) + size -= kListViewHeaderSize; + if (size % kColumnInfoSize != 0) return; - int numItems = size / kColumnInfoSpecHeader; - columns.Reserve(numItems); - for(int i = 0; i < numItems; i++) + unsigned numItems = size / kColumnInfoSize; + Columns.ClearAndReserve(numItems); + for (unsigned i = 0; i < numItems; i++) { - CColumnInfo columnInfo; - columnInfo.PropID = inBuffer.ReadUInt32(); - columnInfo.IsVisible = inBuffer.ReadBool(); - columnInfo.Width = inBuffer.ReadUInt32(); - columns.Add(columnInfo); + CColumnInfo column; + const Byte *p = buf + kListViewHeaderSize + i * kColumnInfoSize; + Get32(p, column.PropID); + GetBool(p + 4, column.IsVisible); + Get32(p + 8, column.Width); + Columns.AddInReserved(column); } } -static const UInt32 kWindowPositionHeaderSize = 5 * 4; -static const UInt32 kPanelsInfoHeaderSize = 3 * 4; /* struct CWindowPosition { RECT Rect; - UInt32 Maximized; + UInt32 Maximized; // bool }; struct CPanelsInfo @@ -194,114 +129,125 @@ struct CPanelsInfo }; */ -void SaveWindowSize(const RECT &rect, bool maximized) +static const UInt32 kWindowPositionHeaderSize = 5 * 4; +static const UInt32 kPanelsInfoHeaderSize = 3 * 4; + +void CWindowInfo::Save() const { - CSysString keyName = kCUBasePath; NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - key.Create(HKEY_CURRENT_USER, keyName); - // CWindowPosition position; - CTempOutBufferSpec buffer; - buffer.Init(kWindowPositionHeaderSize); - buffer.WriteUInt32(rect.left); - buffer.WriteUInt32(rect.top); - buffer.WriteUInt32(rect.right); - buffer.WriteUInt32(rect.bottom); - buffer.WriteBool(maximized); - key.SetValue(kPositionValueName, (const Byte *)buffer, kWindowPositionHeaderSize); + key.Create(HKEY_CURRENT_USER, kCUBasePath); + { + Byte buf[kWindowPositionHeaderSize]; + Set32(buf, rect.left); + Set32(buf + 4, rect.top); + Set32(buf + 8, rect.right); + Set32(buf + 12, rect.bottom); + SetBool(buf + 16, maximized); + key.SetValue(kPositionValueName, buf, kWindowPositionHeaderSize); + } + { + Byte buf[kPanelsInfoHeaderSize]; + Set32(buf, numPanels); + Set32(buf + 4, currentPanel); + Set32(buf + 8, splitterPos); + key.SetValue(kPanelsInfoValueName, buf, kPanelsInfoHeaderSize); + } } -bool ReadWindowSize(RECT &rect, bool &maximized) +static bool QueryBuf(CKey &key, LPCTSTR name, CByteBuffer &buf, UInt32 dataSize) { - CSysString keyName = kCUBasePath; - NSynchronization::CCriticalSectionLock lock(g_CS); - CKey key; - if (key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) - return false; - CByteBuffer buffer; UInt32 size; - if (key.QueryValue(kPositionValueName, buffer, size) != ERROR_SUCCESS) - return false; - if (size != kWindowPositionHeaderSize) - return false; - CTempInBufferSpec inBuffer; - inBuffer.Size = size; - inBuffer.Buffer = (Byte *)buffer; - inBuffer.Pos = 0; - rect.left = inBuffer.ReadUInt32(); - rect.top = inBuffer.ReadUInt32(); - rect.right = inBuffer.ReadUInt32(); - rect.bottom = inBuffer.ReadUInt32(); - maximized = inBuffer.ReadBool(); - return true; + return key.QueryValue(name, buf, size) == ERROR_SUCCESS && size == dataSize; } -void SavePanelsInfo(UInt32 numPanels, UInt32 currentPanel, UInt32 splitterPos) +void CWindowInfo::Read(bool &windowPosDefined, bool &panelInfoDefined) { - CSysString keyName = kCUBasePath; + windowPosDefined = false; + panelInfoDefined = false; NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - key.Create(HKEY_CURRENT_USER, keyName); - - CTempOutBufferSpec buffer; - buffer.Init(kPanelsInfoHeaderSize); - buffer.WriteUInt32(numPanels); - buffer.WriteUInt32(currentPanel); - buffer.WriteUInt32(splitterPos); - key.SetValue(kPanelsInfoValueName, (const Byte *)buffer, kPanelsInfoHeaderSize); + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) + return; + CByteBuffer buf; + if (QueryBuf(key, kPositionValueName, buf, kWindowPositionHeaderSize)) + { + Get32(buf, rect.left); + Get32(buf + 4, rect.top); + Get32(buf + 8, rect.right); + Get32(buf + 12, rect.bottom); + GetBool(buf + 16, maximized); + windowPosDefined = true; + } + if (QueryBuf(key, kPanelsInfoValueName, buf, kPanelsInfoHeaderSize)) + { + Get32(buf, numPanels); + Get32(buf + 4, currentPanel); + Get32(buf + 8, splitterPos); + panelInfoDefined = true; + } + return; +} + + +void SaveUi32Val(const TCHAR *name, UInt32 value) +{ + CKey key; + key.Create(HKEY_CURRENT_USER, kCUBasePath); + key.SetValue(name, value); } -bool ReadPanelsInfo(UInt32 &numPanels, UInt32 ¤tPanel, UInt32 &splitterPos) +bool ReadUi32Val(const TCHAR *name, UInt32 &value) { - CSysString keyName = kCUBasePath; - NSynchronization::CCriticalSectionLock lock(g_CS); CKey key; - if (key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS) - return false; - CByteBuffer buffer; - UInt32 size; - if (key.QueryValue(kPanelsInfoValueName, buffer, size) != ERROR_SUCCESS) - return false; - if (size != kPanelsInfoHeaderSize) + if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) return false; - CTempInBufferSpec inBuffer; - inBuffer.Size = size; - inBuffer.Buffer = (Byte *)buffer; - inBuffer.Pos = 0; - numPanels = inBuffer.ReadUInt32(); - currentPanel = inBuffer.ReadUInt32(); - splitterPos = inBuffer.ReadUInt32(); - return true; + return key.QueryValue(name, value) == ERROR_SUCCESS; } void SaveToolbarsMask(UInt32 toolbarMask) { - CKey key; - key.Create(HKEY_CURRENT_USER, kCUBasePath); - key.SetValue(kToolbars, toolbarMask); + SaveUi32Val(kToolbars, toolbarMask); } static const UInt32 kDefaultToolbarMask = ((UInt32)1 << 31) | 8 | 4 | 1; UInt32 ReadToolbarsMask() { - CKey key; - if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) - return kDefaultToolbarMask; UInt32 mask; - if (key.QueryValue(kToolbars, mask) != ERROR_SUCCESS) + if (!ReadUi32Val(kToolbars, mask)) return kDefaultToolbarMask; return mask; } -static UString GetPanelPathName(UInt32 panelIndex) +void CListMode::Save() const { - WCHAR panelString[16]; - ConvertUInt32ToString(panelIndex, panelString); - return UString(kPanelPathValueName) + panelString; + UInt32 t = 0; + for (int i = 0; i < 2; i++) + t |= ((Panels[i]) & 0xFF) << (i * 8); + SaveUi32Val(kListMode, t); +} + +void CListMode::Read() +{ + Init(); + UInt32 t; + if (!ReadUi32Val(kListMode, t)) + return; + for (int i = 0; i < 2; i++) + { + Panels[i] = (t & 0xFF); + t >>= 8; + } } +static UString GetPanelPathName(UInt32 panelIndex) +{ + WCHAR s[16]; + ConvertUInt32ToString(panelIndex, s); + return (UString)kPanelPathValueName + s; +} void SavePanelPath(UInt32 panel, const UString &path) { @@ -320,32 +266,6 @@ bool ReadPanelPath(UInt32 panel, UString &path) return (key.QueryValue(GetPanelPathName(panel), path) == ERROR_SUCCESS); } -void SaveListMode(const CListMode &listMode) -{ - CKey key; - key.Create(HKEY_CURRENT_USER, kCUBasePath); - UInt32 t = 0; - for (int i = 0; i < 2; i++) - t |= ((listMode.Panels[i]) & 0xFF) << (i * 8); - key.SetValue(kListMode, t); -} - -void ReadListMode(CListMode &listMode) -{ - CKey key; - listMode.Init(); - if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS) - return; - UInt32 t; - if (key.QueryValue(kListMode, t) != ERROR_SUCCESS) - return; - for (int i = 0; i < 2; i++) - { - listMode.Panels[i] = (t & 0xFF); - t >>= 8; - } -} - static void SaveStringList(LPCTSTR valueName, const UStringVector &folders) { @@ -381,8 +301,8 @@ void ReadCopyHistory(UStringVector &folders) void AddUniqueStringToHeadOfList(UStringVector &list, const UString &s) { - for (int i = 0; i < list.Size();) - if (s.CompareNoCase(list[i]) == 0) + for (unsigned i = 0; i < list.Size();) + if (s.IsEqualToNoCase(list[i])) list.Delete(i); else i++; |