-- v2: shell32: Update view mode flags while creating IShellView for IExplorerBrowser. shell32: Reimplement IExplorerBrowser_SetFolderSettings() with support of setting flags. shell32/tests: Move tests of IExplorerBrowser_SetFolderSettings() to a separated function and more tests. shell32: Reimplement IFolderView2_SetCurrentViewMode() with modern behaviours. shell32: Implement IFolderView2_{Get, Set}CurrentFolderFlags(). shell32/tests: Add tests for IFolderView2_{Get, Set}CurrentFolderFlags().
From: Jactry Zeng jzeng@codeweavers.com
--- dlls/shell32/tests/shlview.c | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c index 0f6ad9f4158..28f9ec4252c 100644 --- a/dlls/shell32/tests/shlview.c +++ b/dlls/shell32/tests/shlview.c @@ -1493,10 +1493,26 @@ static void test_newmenu(void)
static void test_folder_flags(void) { + IFolderView2 *folderview; FOLDERSETTINGS settings; IShellFolder *desktop; IShellView *shellview; + DWORD flags; HRESULT hr; + int i; + static const struct + { + DWORD mask, flags; + DWORD expected; + } tests[] = + { + { FWF_USESEARCHFOLDER, FWF_NONE, FWF_NONE }, + { FWF_NONE, FWF_AUTOARRANGE, FWF_NONE }, + { FWF_AUTOARRANGE, FWF_AUTOARRANGE, FWF_AUTOARRANGE }, + { FWF_OWNERDATA, FWF_AUTOARRANGE, FWF_NONE }, + { FWF_AUTOARRANGE, FWF_OWNERDATA | FWF_AUTOARRANGE, FWF_AUTOARRANGE }, + { ~FWF_NONE, FWF_AUTOARRANGE, FWF_AUTOARRANGE }, + };
create_interfaces(&desktop, &shellview);
@@ -1507,6 +1523,37 @@ static void test_folder_flags(void) ok(settings.fFlags == FWF_USESEARCHFOLDER || broken(!settings.fFlags) /* pre vista */, "Got flags %#x.\n", settings.fFlags);
+ hr = IShellView_QueryInterface(shellview, &IID_IFolderView2, (void **)&folderview); + ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* pre vista */, "Got hr %#lx.\n", hr); + if (hr != S_OK) + { + win_skip("No IFolderView2 for the desktop folder.\n"); + destroy_interfaces(desktop, shellview); + return; + } + + hr = IFolderView2_GetCurrentFolderFlags(folderview, NULL); + todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + + flags = 0xdeadbeef; + hr = IFolderView2_GetCurrentFolderFlags(folderview, &flags); + todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(flags == FWF_USESEARCHFOLDER, "Got flags %#lx.\n", flags); + + for (i = 0; i < ARRAY_SIZE(tests); ++i) + { + hr = IFolderView2_SetCurrentFolderFlags(folderview, tests[i].mask, tests[i].flags); + todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + flags = 0xdeadbeef; + hr = IFolderView2_GetCurrentFolderFlags(folderview, &flags); + todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + todo_wine ok(flags == tests[i].expected, "Test %u: Got flags %#lx.\n", i, flags); + + hr = IFolderView2_SetCurrentFolderFlags(folderview, ~FWF_NONE, FWF_NONE); + todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + } + + IFolderView2_Release(folderview); destroy_interfaces(desktop, shellview); }
From: Jactry Zeng jzeng@codeweavers.com
--- dlls/shell32/shlview.c | 19 +++++++++++++------ dlls/shell32/tests/shlview.c | 14 +++++++------- 2 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index da60283393c..3d449223620 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -2945,16 +2945,23 @@ static HRESULT WINAPI FolderView2_SetText(IFolderView2 *iface, FVTEXTTYPE type,
static HRESULT WINAPI FolderView2_SetCurrentFolderFlags(IFolderView2 *iface, DWORD mask, DWORD flags) { - IShellViewImpl *This = impl_from_IFolderView2(iface); - FIXME("(%p)->(0x%08lx 0x%08lx), stub\n", This, mask, flags); - return E_NOTIMPL; + IShellViewImpl *shellview = impl_from_IFolderView2(iface); + + TRACE("folder view %p, mask %#lx, flags %#lx.\n", iface, mask, flags); + + shellview->FolderSettings.fFlags = (shellview->FolderSettings.fFlags & ~mask) | (flags & mask); + return S_OK; }
static HRESULT WINAPI FolderView2_GetCurrentFolderFlags(IFolderView2 *iface, DWORD *flags) { - IShellViewImpl *This = impl_from_IFolderView2(iface); - FIXME("(%p)->(%p), stub\n", This, flags); - return E_NOTIMPL; + IShellViewImpl *shellview = impl_from_IFolderView2(iface); + + TRACE("folder view %p, flags %p.\n", iface, flags); + + if (flags) + *flags = shellview->FolderSettings.fFlags; + return S_OK; }
static HRESULT WINAPI FolderView2_GetSortColumnCount(IFolderView2 *iface, int *columns) diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c index 28f9ec4252c..a030c723604 100644 --- a/dlls/shell32/tests/shlview.c +++ b/dlls/shell32/tests/shlview.c @@ -1533,24 +1533,24 @@ static void test_folder_flags(void) }
hr = IFolderView2_GetCurrentFolderFlags(folderview, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr);
flags = 0xdeadbeef; hr = IFolderView2_GetCurrentFolderFlags(folderview, &flags); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(flags == FWF_USESEARCHFOLDER, "Got flags %#lx.\n", flags); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(flags == FWF_USESEARCHFOLDER, "Got flags %#lx.\n", flags);
for (i = 0; i < ARRAY_SIZE(tests); ++i) { hr = IFolderView2_SetCurrentFolderFlags(folderview, tests[i].mask, tests[i].flags); - todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); flags = 0xdeadbeef; hr = IFolderView2_GetCurrentFolderFlags(folderview, &flags); - todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); - todo_wine ok(flags == tests[i].expected, "Test %u: Got flags %#lx.\n", i, flags); + ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(flags == tests[i].expected, "Test %u: Got flags %#lx.\n", i, flags);
hr = IFolderView2_SetCurrentFolderFlags(folderview, ~FWF_NONE, FWF_NONE); - todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); }
IFolderView2_Release(folderview);
From: Jactry Zeng jzeng@codeweavers.com
Only pre-win7 systems return E_INVALIDARG for invalid values, and only pre-vista systems accept FVM_AUTO as a view mode, others fall it back to FVM_ICON. Let's switch to modern behaviours, so that we don't need additional code for handling that when using it to implement IExplorerBrowser_SetFolderSettings(). --- dlls/shell32/shlview.c | 27 +++++++++++---------------- dlls/shell32/tests/shlview.c | 24 +++++++++++++++++++----- 2 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 3d449223620..d58435670c2 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -2709,25 +2709,20 @@ static HRESULT WINAPI FolderView_GetCurrentViewMode(IFolderView2 *iface, UINT *m
static HRESULT WINAPI FolderView_SetCurrentViewMode(IFolderView2 *iface, UINT mode) { - IShellViewImpl *This = impl_from_IFolderView2(iface); - DWORD dwStyle; - - TRACE("%p, %u.\n", This, mode); + IShellViewImpl *shellview = impl_from_IFolderView2(iface); + DWORD style;
- if((mode < FVM_FIRST || mode > FVM_LAST) && - (mode != FVM_AUTO)) - return E_INVALIDARG; + TRACE("folder view %p, mode %u.\n", iface, mode);
- /* Windows before Vista uses LVM_SETVIEW and possibly - LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview, - while later versions seem to accomplish this through other - means. */ - dwStyle = ViewModeToListStyle(mode); - SetStyle(This, dwStyle, LVS_TYPEMASK); + if (mode == FVM_AUTO) + mode = FVM_ICON;
- /* This will not necessarily be the actual mode set above. - This mimics the behavior of Windows XP. */ - This->FolderSettings.ViewMode = mode; + if (mode >= FVM_FIRST && mode <= FVM_LAST) + { + style = ViewModeToListStyle(mode); + SetStyle(shellview, style, LVS_TYPEMASK); + shellview->FolderSettings.ViewMode = mode; + }
return S_OK; } diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c index a030c723604..63d99dd086a 100644 --- a/dlls/shell32/tests/shlview.c +++ b/dlls/shell32/tests/shlview.c @@ -1110,13 +1110,23 @@ static void test_GetSetCurrentViewMode(void)
hr = IFolderView_SetCurrentViewMode(fview, FVM_AUTO); ok(hr == S_OK, "got (0x%08lx)\n", hr); + viewmode = 0xdeadbeef; + hr = IFolderView_GetCurrentViewMode(fview, &viewmode); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(viewmode == FVM_ICON || broken(viewmode == FVM_AUTO) /* pre vista */, "Got view mode %d.\n", viewmode);
+ hr = IFolderView_SetCurrentViewMode(fview, FVM_LIST); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + viewmode = 0xdeadbeef; + hr = IFolderView_GetCurrentViewMode(fview, &viewmode); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(viewmode == FVM_LIST, "Got view mode %d.\n", viewmode); hr = IFolderView_SetCurrentViewMode(fview, 0); - ok(hr == E_INVALIDARG || broken(hr == S_OK), - "got (0x%08lx)\n", hr); - + ok(hr == S_OK || broken(hr == E_INVALIDARG) /* pre win7 */, "Got hr %#lx.\n", hr); + viewmode = 0xdeadbeef; hr = IFolderView_GetCurrentViewMode(fview, &viewmode); ok(hr == S_OK, "got (0x%08lx)\n", hr); + ok(viewmode == FVM_LIST || broken(viewmode == 0) /* pre vista */, "Got view mode %d.\n", viewmode);
for(i = 1; i < 9; i++) { @@ -1134,8 +1144,12 @@ static void test_GetSetCurrentViewMode(void) }
hr = IFolderView_SetCurrentViewMode(fview, 9); - ok(hr == E_INVALIDARG || broken(hr == S_OK), - "got (0x%08lx)\n", hr); + ok(hr == S_OK || broken(hr == E_INVALIDARG) /* pre win7 */, "Got hr %#lx.\n", hr); + viewmode = 0xdeadbeef; + hr = IFolderView_GetCurrentViewMode(fview, &viewmode); + ok(hr == S_OK, "got (0x%08lx)\n", hr); + ok(viewmode == FVM_CONTENT || broken(viewmode == 9) /* pre vista */ || + broken(viewmode == FVM_THUMBSTRIP) /* vista */, "Got view mode %d.\n", viewmode);
/* Test messages */ hwnd_lv = subclass_listview(hwnd);
From: Jactry Zeng jzeng@codeweavers.com
--- dlls/shell32/tests/ebrowser.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/dlls/shell32/tests/ebrowser.c b/dlls/shell32/tests/ebrowser.c index 9402388f643..c9ec3fa5430 100644 --- a/dlls/shell32/tests/ebrowser.c +++ b/dlls/shell32/tests/ebrowser.c @@ -983,7 +983,6 @@ static void test_basics(void) { IExplorerBrowser *peb; IShellBrowser *psb; - FOLDERSETTINGS fs; ULONG lres; EXPLORER_BROWSER_OPTIONS flags; HDWP hdwp; @@ -1088,13 +1087,6 @@ static void test_basics(void) ebrowser_instantiate(&peb); ebrowser_initialize(peb);
- /* SetFolderSettings */ - hr = IExplorerBrowser_SetFolderSettings(peb, NULL); - ok(hr == E_INVALIDARG, "got (0x%08lx)\n", hr); - fs.ViewMode = 0; fs.fFlags = 0; - hr = IExplorerBrowser_SetFolderSettings(peb, &fs); - todo_wine ok(hr == E_INVALIDARG, "got (0x%08lx)\n", hr); - /* SetPropertyBag */ hr = IExplorerBrowser_SetPropertyBag(peb, NULL); ok(hr == E_INVALIDARG, "Got 0x%08lx\n", hr); @@ -1696,6 +1688,25 @@ static void setup_window(void) ok(hwnd != NULL, "Failed to create window for tests.\n"); }
+static void test_folder_settings(void) +{ + IExplorerBrowser *browser; + FOLDERSETTINGS settings; + HRESULT hr; + + ebrowser_instantiate(&browser); + ebrowser_initialize(browser); + + hr = IExplorerBrowser_SetFolderSettings(browser, NULL); + ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + settings.ViewMode = 0; settings.fFlags = FWF_NONE; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + IExplorerBrowser_Release(browser); +} + START_TEST(ebrowser) { OleInitialize(NULL); @@ -1719,6 +1730,7 @@ START_TEST(ebrowser) test_GetCurrentView(); test_SetSite(); test_InputObject(); + test_folder_settings();
DestroyWindow(hwnd); OleUninitialize();
From: Jactry Zeng jzeng@codeweavers.com
--- dlls/shell32/ebrowser.c | 47 ++++++++++++++--------------- dlls/shell32/tests/ebrowser.c | 57 ++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 26 deletions(-)
diff --git a/dlls/shell32/ebrowser.c b/dlls/shell32/ebrowser.c index 9704228d426..0abdac61cc3 100644 --- a/dlls/shell32/ebrowser.c +++ b/dlls/shell32/ebrowser.c @@ -340,24 +340,6 @@ static void size_panes(ExplorerBrowserImpl *This) TRUE); }
-static HRESULT change_viewmode(ExplorerBrowserImpl *This, UINT viewmode) -{ - IFolderView *pfv; - HRESULT hr; - - if(!This->psv) - return E_FAIL; - - hr = IShellView_QueryInterface(This->psv, &IID_IFolderView, (void*)&pfv); - if(SUCCEEDED(hr)) - { - hr = IFolderView_SetCurrentViewMode(pfv, This->fs.ViewMode); - IFolderView_Release(pfv); - } - - return hr; -} - static HRESULT create_new_shellview(ExplorerBrowserImpl *This, IShellItem *psi) { IShellBrowser *psb = &This->IShellBrowser_iface; @@ -988,17 +970,32 @@ static HRESULT WINAPI IExplorerBrowser_fnSetEmptyText(IExplorerBrowser *iface, static HRESULT WINAPI IExplorerBrowser_fnSetFolderSettings(IExplorerBrowser *iface, const FOLDERSETTINGS *pfs) { - ExplorerBrowserImpl *This = impl_from_IExplorerBrowser(iface); - TRACE("%p (%p)\n", This, pfs); + ExplorerBrowserImpl *browser = impl_from_IExplorerBrowser(iface); + IFolderView2 *view; + HRESULT hr; + + TRACE("explorer browser %p, settings %p.\n", iface, pfs);
- if(!pfs) + if (!pfs) return E_INVALIDARG;
- This->fs.ViewMode = pfs->ViewMode; - This->fs.fFlags = pfs->fFlags | FWF_NOCLIENTEDGE; + if (pfs->ViewMode) + browser->fs.ViewMode = pfs->ViewMode; + browser->fs.fFlags = pfs->fFlags;
- /* Change the settings of the current view, if any. */ - return change_viewmode(This, This->fs.ViewMode); + if (!browser->psv) + return E_INVALIDARG; + + hr = IShellView_QueryInterface(browser->psv, &IID_IFolderView2, (void **)&view); + if (SUCCEEDED(hr)) + { + hr = IFolderView2_SetCurrentViewMode(view, browser->fs.ViewMode); + if (SUCCEEDED(hr)) + if (SUCCEEDED(hr)) + hr = IFolderView2_SetCurrentFolderFlags(view, ~FWF_NONE, browser->fs.fFlags); + IFolderView2_Release(view); + } + return hr; }
static HRESULT WINAPI IExplorerBrowser_fnAdvise(IExplorerBrowser *iface, diff --git a/dlls/shell32/tests/ebrowser.c b/dlls/shell32/tests/ebrowser.c index c9ec3fa5430..8e2cc69c868 100644 --- a/dlls/shell32/tests/ebrowser.c +++ b/dlls/shell32/tests/ebrowser.c @@ -1688,6 +1688,23 @@ static void setup_window(void) ok(hwnd != NULL, "Failed to create window for tests.\n"); }
+#define CHECK_SETTINGS(browser,expected) _check_settings(browser, expected, __LINE__) +static void _check_settings(IExplorerBrowser *browser, FOLDERSETTINGS expected, int line) +{ + FOLDERSETTINGS settings; + IShellView *view; + HRESULT hr; + + hr = IExplorerBrowser_GetCurrentView(browser, &IID_IShellView, (void **)&view); + ok_(__FILE__,line)(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IShellView_GetCurrentInfo(view, &settings); + ok_(__FILE__,line)(hr == S_OK, "Got hr %#lx.\n", hr); + ok_(__FILE__,line)(!memcmp(&settings, &expected, sizeof(settings)), + "Got settings {view mode: %d, flags: %#x}, expected {view mode: %d, flags: %#x}.\n", + settings.ViewMode, settings.fFlags, expected.ViewMode, expected.fFlags); + IShellView_Release(view); +} + static void test_folder_settings(void) { IExplorerBrowser *browser; @@ -1702,7 +1719,45 @@ static void test_folder_settings(void)
settings.ViewMode = 0; settings.fFlags = FWF_NONE; hr = IExplorerBrowser_SetFolderSettings(browser, &settings); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + settings.ViewMode = FVM_ICON; settings.fFlags = FWF_SNAPTOGRID; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + ebrowser_browse_to_desktop(browser); + + settings.ViewMode = FVM_AUTO; settings.fFlags = FWF_AUTOARRANGE; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(settings.ViewMode == FVM_AUTO && settings.fFlags == FWF_AUTOARRANGE, + "Got view mode %d, flags %#x.\n", settings.ViewMode, settings.fFlags); + settings.ViewMode = FVM_ICON; settings.fFlags = FWF_AUTOARRANGE; + CHECK_SETTINGS(browser, settings); + + settings.ViewMode = FVM_LIST; settings.fFlags = FWF_AUTOARRANGE; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + settings.ViewMode = 0; settings.fFlags = FWF_SNAPTOGRID; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(settings.ViewMode == 0 && settings.fFlags == FWF_SNAPTOGRID, + "Got view mode %d, flags %#x.\n", settings.ViewMode, settings.fFlags); + settings.ViewMode = FVM_LIST; + CHECK_SETTINGS(browser, settings); + + settings.ViewMode = FVM_LAST + 1; settings.fFlags = FWF_AUTOARRANGE; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + settings.ViewMode = FVM_LIST; + CHECK_SETTINGS(browser, settings); + + settings.ViewMode = FVM_ICON; settings.fFlags = FWF_NONE; + hr = IExplorerBrowser_SetFolderSettings(browser, &settings); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(settings.ViewMode == FVM_ICON && settings.fFlags == FWF_NONE, + "Got view mode %d, flags %#x.\n", settings.ViewMode, settings.fFlags); + CHECK_SETTINGS(browser, settings);
IExplorerBrowser_Release(browser); }
From: Jactry Zeng jzeng@codeweavers.com
--- dlls/shell32/ebrowser.c | 1 + dlls/shell32/tests/ebrowser.c | 2 ++ 2 files changed, 3 insertions(+)
diff --git a/dlls/shell32/ebrowser.c b/dlls/shell32/ebrowser.c index 0abdac61cc3..347e539e018 100644 --- a/dlls/shell32/ebrowser.c +++ b/dlls/shell32/ebrowser.c @@ -362,6 +362,7 @@ static HRESULT create_new_shellview(ExplorerBrowserImpl *This, IShellItem *psi) This->hwnd_sv = NULL; }
+ This->fs.fFlags |= FWF_USESEARCHFOLDER | FWF_FULLROWSELECT | FWF_NOCLIENTEDGE; hr = IShellView_CreateViewWindow(psv, This->psv, &This->fs, psb, &This->sv_rc, &hwnd_new); if(SUCCEEDED(hr)) { diff --git a/dlls/shell32/tests/ebrowser.c b/dlls/shell32/tests/ebrowser.c index 8e2cc69c868..19eb1bc4cf6 100644 --- a/dlls/shell32/tests/ebrowser.c +++ b/dlls/shell32/tests/ebrowser.c @@ -1726,6 +1726,8 @@ static void test_folder_settings(void) ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr);
ebrowser_browse_to_desktop(browser); + settings.fFlags |= FWF_USESEARCHFOLDER | FWF_FULLROWSELECT | FWF_NOCLIENTEDGE; + CHECK_SETTINGS(browser, settings);
settings.ViewMode = FVM_AUTO; settings.fFlags = FWF_AUTOARRANGE; hr = IExplorerBrowser_SetFolderSettings(browser, &settings);
v2: - Improve tests of IFolderView2_{Get, Set}CurrentFolderFlags(). - Improve traces of IFolderView2_{Get, Set}CurrentFolderFlags() and IExplorerBrowser_SetFolderSettings(). - Reimplement IFolderView2_SetCurrentFolderFlags(). - Add missing IFolderView_GetCurrentViewMode() for tests of IFolderView_SetCurrentViewMode(). - Improve implementation of IExplorerBrowser_SetFolderSettings().