@@ -1216,7 +1216,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text )
12161216 return false ;
12171217}
12181218
1219- bool BrowseLinkHelper ( HWND parent, wchar_t *text )
1219+ bool BrowseLinkHelper ( HWND parent, wchar_t *text, bool bFoldersOnly )
12201220{
12211221 DoEnvironmentSubst (text,_MAX_PATH);
12221222
@@ -1227,16 +1227,22 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text )
12271227 if (!pCustomize)
12281228 return false ;
12291229
1230- pDialog->SetTitle (LoadStringEx (IDS_PICK_LINK_TITLE));
1231- pDialog->SetOkButtonLabel (LoadStringEx (IDS_PICK_LINK_FILE));
1232- wchar_t button[256 ];
1233- Sprintf (button,_countof (button),L" %s " ,LoadStringEx (IDS_PICK_LINK_FOLDER));
1234- pCustomize->AddPushButton (101 ,button);
1230+ pDialog->SetTitle (LoadStringEx (bFoldersOnly?IDS_PICK_LINK_FOLDER:IDS_PICK_LINK_TITLE));
1231+ if (!bFoldersOnly) // add separate buttons for selecting files/folders to the dialog
1232+ {
1233+ pDialog->SetOkButtonLabel (LoadStringEx (IDS_PICK_LINK_FILE));
1234+ wchar_t button[256 ];
1235+ Sprintf (button,_countof (button),L" %s " ,LoadStringEx (IDS_PICK_LINK_FOLDER));
1236+ pCustomize->AddPushButton (101 ,button);
1237+ }
12351238
12361239 CBrowseLinkEvents events;
12371240 DWORD cookie;
12381241 pDialog->Advise (&events,&cookie);
1239- pDialog->SetOptions (FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS);
1242+ if (bFoldersOnly) // set FOS_PICKFOLDERS option to use dialog in folder-only mode
1243+ pDialog->SetOptions (FOS_PICKFOLDERS|FOS_ALLNONSTORAGEITEMS|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE);
1244+ else
1245+ pDialog->SetOptions (FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS);
12401246 {
12411247 const wchar_t *c=wcschr (text,' |' );
12421248 if (c)
@@ -2274,6 +2280,7 @@ class CTreeSettingsDlg: public CResizeableDlg<CTreeSettingsDlg>
22742280 EDIT_HOTKEY_ANY,
22752281 EDIT_COLOR,
22762282 EDIT_FONT,
2283+ EDIT_DIRECTORY,
22772284 };
22782285
22792286 BEGIN_MSG_MAP ( CTreeSettingsDlg )
@@ -2717,6 +2724,29 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO
27172724 m_EditBox.SetFocus ();
27182725 m_bIgnoreFocus=false ;
27192726 }
2727+ else if (m_EditMode==EDIT_DIRECTORY)
2728+ {
2729+ m_bIgnoreFocus=true ;
2730+ CString str;
2731+ m_EditBox.GetWindowText (str);
2732+ str.TrimLeft (); str.TrimRight ();
2733+ wchar_t text[1024 ];
2734+ DWORD dwAttrs=GetFileAttributes (str); // ensure directory exists before passing it to dialog
2735+ if (dwAttrs!=INVALID_FILE_ATTRIBUTES && dwAttrs&FILE_ATTRIBUTE_DIRECTORY)
2736+ {
2737+ Strcpy (text,_countof (text),str);
2738+ DoEnvironmentSubst (text,_countof (text));
2739+ }
2740+ else
2741+ text[0 ]=0 ;
2742+ Strcpy (text,_countof (text),str);
2743+ DoEnvironmentSubst (text,_countof (text));
2744+ if (BrowseLinkHelper (m_hWnd,text,true ))
2745+ m_EditBox.SetWindowText (text);
2746+ SendMessage (WM_NEXTDLGCTL,(LPARAM)m_EditBox.m_hWnd ,TRUE );
2747+ m_EditBox.SetFocus ();
2748+ m_bIgnoreFocus=false ;
2749+ }
27202750 return 0 ;
27212751}
27222752
@@ -3052,6 +3082,20 @@ void CTreeSettingsDlg::ApplyEditBox( void )
30523082 pSetting->flags &=~CSetting::FLAG_DEFAULT;
30533083 }
30543084 }
3085+ else if (pSetting->type ==CSetting::TYPE_DIRECTORY)
3086+ {
3087+ if (pSetting->value .vt !=VT_BSTR || str!=pSetting->value .bstrVal )
3088+ {
3089+ if (str.IsEmpty ()) // empty directory strings cause unexpected behavior, so we reset to avoid this
3090+ pSetting->value =pSetting->defValue ;
3091+ else // otherwise we are very lenient about what users can input as a path
3092+ pSetting->value =CComVariant (str);
3093+ if (pSetting->value ==pSetting->defValue )
3094+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3095+ else
3096+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3097+ }
3098+ }
30553099 else
30563100 {
30573101 if (pSetting->value .vt !=VT_BSTR || str!=pSetting->value .bstrVal )
@@ -3095,7 +3139,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
30953139 val=valVar.intVal ;
30963140 Sprintf (text,_countof (text),L" %d" ,val);
30973141 }
3098- else if (pSetting->type ==CSetting::TYPE_STRING || pSetting->type ==CSetting::TYPE_ICON || pSetting->type ==CSetting::TYPE_BITMAP || pSetting->type ==CSetting::TYPE_BITMAP_JPG || pSetting->type ==CSetting::TYPE_SOUND || pSetting->type ==CSetting::TYPE_FONT)
3142+ else if (pSetting->type ==CSetting::TYPE_STRING || pSetting->type ==CSetting::TYPE_ICON || pSetting->type ==CSetting::TYPE_BITMAP || pSetting->type ==CSetting::TYPE_BITMAP_JPG || pSetting->type ==CSetting::TYPE_SOUND || pSetting->type ==CSetting::TYPE_FONT || pSetting-> type ==CSetting::TYPE_DIRECTORY )
30993143 {
31003144 if (valVar.vt ==VT_BSTR)
31013145 Strcpy (text,_countof (text),valVar.bstrVal );
@@ -3111,8 +3155,10 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
31113155 mode=EDIT_BITMAP_JPG;
31123156 else if (pSetting->type ==CSetting::TYPE_SOUND)
31133157 mode=EDIT_SOUND;
3114- else
3158+ else if (pSetting-> type ==CSetting::TYPE_FONT)
31153159 mode=EDIT_FONT;
3160+ else
3161+ mode=EDIT_DIRECTORY;
31163162 }
31173163 else if (pSetting->type ==CSetting::TYPE_HOTKEY || pSetting->type ==CSetting::TYPE_HOTKEY_ANY)
31183164 {
@@ -3152,7 +3198,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
31523198 m_pEditSetting=pSetting;
31533199 }
31543200
3155- if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR)
3201+ if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR || mode==EDIT_DIRECTORY )
31563202 {
31573203 RECT rc2=rc;
31583204 int width=(rc2.bottom -rc2.top )*3 /2 ;
@@ -3210,14 +3256,15 @@ void CTreeSettingsDlg::UpdateEditPosition( void )
32103256 DeleteDC (hdc);
32113257 DWORD margins=(DWORD)m_EditBox.SendMessage (EM_GETMARGINS);
32123258 size.cx +=HIWORD (margins)+LOWORD (margins)+12 ;
3213- if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR)
3259+ // adjust size and position of edit boxes for settings that use browse/play buttons
3260+ if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR || m_EditMode==EDIT_DIRECTORY)
32143261 size.cx +=width;
32153262 if (m_EditMode==EDIT_SOUND)
32163263 size.cx +=width*2 ;
32173264 if (size.cx <w)
32183265 rc.right =rc.left +size.cx ;
32193266
3220- if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_SOUND || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR)
3267+ if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_SOUND || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR || m_EditMode==EDIT_DIRECTORY )
32213268 {
32223269 RECT rc2=rc;
32233270 rc2.left =rc2.right -width;
0 commit comments