]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
Better alphabetized the event handler macros
[wxWidgets.git] / src / generic / dirctrlg.cpp
index 0a129d1b0ad7adbaba993650dc3d4f6455756afe..791b3a97a0087fa59845e508c6fc536169d4edd1 100644 (file)
 #pragma hdrstop
 #endif
 
-#if wxUSE_DIRDLG
+#if wxUSE_DIRDLG || wxUSE_FILEDLG
 
 #include "wx/generic/dirctrlg.h"
-
 #include "wx/module.h"
 #include "wx/utils.h"
 #include "wx/button.h"
 #endif // __OS2__
 
 #if defined(__WXMAC__)
-#  ifdef __DARWIN__
-#    include "MoreFilesX.h"
-#  else
-#    include "MoreFilesExtras.h"
-#  endif
+# include "MoreFilesX.h"
 #endif
 
 #ifdef __BORLANDC__
@@ -114,7 +109,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
     // No logical drives; return "\"
     paths.Add(wxT("\\"));
     names.Add(wxT("\\"));
-    return 1;
+    icon_ids.Add(wxFileIconsTable::computer);
 #elif defined(__WIN32__)
     wxChar driveBuffer[256];
     size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer);
@@ -203,87 +198,36 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
 #endif // __WIN32__/!__WIN32__
 
 #elif defined(__WXMAC__)
-#ifdef __DARWIN__
-    FSRef     **theVolRefs;
-    ItemCount   theVolCount;
-    char        thePath[FILENAME_MAX];
-
-    if (FSGetMountedVolumes(&theVolRefs, &theVolCount) == noErr) {
-        ItemCount index;
-        ::HLock( (Handle)theVolRefs ) ;
-        for (index = 0; index < theVolCount; ++index) {
-            // get the POSIX path associated with the FSRef
-            if ( FSRefMakePath(&((*theVolRefs)[index]),
-                                 (UInt8 *)thePath, sizeof(thePath)) != noErr ) {
-                continue;
-            }
-            // add path separator at end if necessary
-            wxString path( thePath , wxConvLocal) ;
-            if (path.Last() != wxFILE_SEP_PATH) {
-                path += wxFILE_SEP_PATH;
-            }
-            // get Mac volume name for display
-            FSVolumeRefNum vRefNum ;
-            HFSUniStr255 volumeName ;
 
-            if ( FSGetVRefNum(&((*theVolRefs)[index]), &vRefNum) != noErr ) {
-                continue;
-            }
-            if ( FSGetVInfo(vRefNum, &volumeName, NULL, NULL) != noErr ) {
-                continue;
-            }
-            // get C string from Unicode HFS name
-            //   see: http://developer.apple.com/carbon/tipsandtricks.html
-            CFStringRef cfstr = CFStringCreateWithCharacters( kCFAllocatorDefault,
-                                                              volumeName.unicode,
-                                                              volumeName.length );
-            // Do something with str
-            char *cstr = NewPtr(CFStringGetLength(cfstr) + 1);
-            if (( cstr == NULL ) ||
-                !CFStringGetCString(cfstr, cstr, CFStringGetLength(cfstr) + 1,
-                                    kCFStringEncodingMacRoman))
+    ItemCount volumeIndex = 1;
+    OSErr err = noErr ;
+    
+    while( noErr == err )
+    {
+        HFSUniStr255 volumeName ;
+        FSRef fsRef ;
+        FSVolumeInfo volumeInfo ;
+               err = FSGetVolumeInfo(0, volumeIndex, NULL, kFSVolInfoFlags , &volumeInfo , &volumeName, &fsRef);
+               if( noErr == err )
+               {
+                   wxString path = wxMacFSRefToPath( &fsRef ) ;
+            wxString name = wxMacHFSUniStrToString( &volumeName ) ;
+            
+            if ( (volumeInfo.flags & kFSVolFlagSoftwareLockedMask) || (volumeInfo.flags & kFSVolFlagHardwareLockedMask) )
             {
-                CFRelease( cstr );
-                continue;
+                icon_ids.Add(wxFileIconsTable::cdrom);
             }
-            wxString name( cstr , wxConvLocal );
-            DisposePtr( cstr );
-            CFRelease( cfstr );
-
-            GetVolParmsInfoBuffer volParmsInfo;
-            UInt32 actualSize;
-            if ( FSGetVolParms(vRefNum, sizeof(volParmsInfo), &volParmsInfo, &actualSize) != noErr ) {
-                continue;
+            else
+            {
+                icon_ids.Add(wxFileIconsTable::drive);
             }
-
+            // todo other removable
+            
             paths.Add(path);
             names.Add(name);
-
-            if ( VolIsEjectable(&volParmsInfo) )
-                icon_ids.Add(wxFileIconsTable::cdrom);
-            else
-                icon_ids.Add(wxFileIconsTable::drive);
-        }
-        ::HUnlock( (Handle)theVolRefs );
-        ::DisposeHandle( (Handle)theVolRefs );
-    }
-#else // !__DARWIN__
-    FSSpec volume;
-    short index = 1;
-    while(1)
-    {
-        short actualCount = 0 ;
-        if (OnLine(&volume, 1, &actualCount, &index ) != noErr || actualCount==0)
-        {
-            break;
-        }
-
-        wxString name = wxMacFSSpec2MacFilename( &volume );
-        paths.Add(name + wxFILE_SEP_PATH);
-        names.Add(name);
-        icon_ids.Add(wxFileIconsTable::drive);
+            volumeIndex++ ;
+               }
     }
-#endif // __DARWIN__
 
 #elif defined(__UNIX__)
     paths.Add(wxT("/"));
@@ -292,6 +236,8 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
 #else
     #error "Unsupported platform in wxGenericDirCtrl!"
 #endif
+    wxASSERT_MSG( (paths.GetCount() == names.GetCount()), wxT("The number of paths and their human readable names should be equal in number."));
+    wxASSERT_MSG( (paths.GetCount() == icon_ids.GetCount()), wxT("Wrong number of icons for available drives."));
     return paths.GetCount();
 }
 
@@ -324,6 +270,7 @@ bool wxIsDriveAvailable(const wxString& dirName)
 int setdrive(int drive)
 {
 #ifdef __WXWINCE__
+    wxUnusedVar(drive);
     return 0;
 #elif defined(__GNUWIN32__) && \
     (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)
@@ -356,6 +303,7 @@ int setdrive(int drive)
 bool wxIsDriveAvailable(const wxString& dirName)
 {
 #ifdef __WXWINCE__
+    wxUnusedVar(dirName);
     return false;
 #else
 #ifdef __WIN32__
@@ -396,12 +344,17 @@ bool wxIsDriveAvailable(const wxString& dirName)
 }
 #endif // __WINDOWS__ || __OS2__
 
+#endif // wxUSE_DIRDLG || wxUSE_FILEDLG
+
+
+
+#if wxUSE_DIRDLG
 
 // Function which is called by quick sort. We want to override the default wxArrayString behaviour,
 // and sort regardless of case.
-static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond)
+static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(const wxString& strFirst, const wxString& strSecond)
 {
-    return strFirst->CmpNoCase(*strSecond);
+    return strFirst.CmpNoCase(strSecond);
 }
 
 //-----------------------------------------------------------------------------
@@ -422,10 +375,6 @@ wxDirItemData::wxDirItemData(const wxString& path, const wxString& name,
     m_isDir = isDir;
 }
 
-wxDirItemData::~wxDirItemData()
-{
-}
-
 void wxDirItemData::SetNewDirName(const wxString& path)
 {
     m_path = path;
@@ -570,7 +519,8 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
     else
         filterStyle |= wxBORDER_SUNKEN;
 
-    m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, pos, size, treeStyle);
+    m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL,
+                                wxPoint(0,0), GetClientSize(), treeStyle);
 
     if (!filter.IsEmpty() && (style & wxDIRCTRL_SHOW_FILTERS))
         m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL, wxDefaultPosition, wxDefaultSize, filterStyle);
@@ -601,8 +551,19 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
     ExpandDir(m_rootId); // automatically expand first level
 
     // Expand and select the default path
-    if (!m_defaultPath.IsEmpty())
+    if (!m_defaultPath.empty())
+    {
         ExpandPath(m_defaultPath);
+    }
+#ifdef __UNIX__
+    else
+    {
+        // On Unix, there's only one node under the (hidden) root node. It
+        // represents the / path, so the user would always have to expand it;
+        // let's do it ourselves
+        ExpandPath(wxT("/"));
+    }
+#endif
 
     SetBestSize(size);
     DoResize();
@@ -1132,7 +1093,7 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter)
 bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description)
 {
     wxArrayString filters, descriptions;
-    int count = wxParseWildcard(filterStr, filters, descriptions);
+    int count = wxParseCommonDialogsFilter(filterStr, descriptions, filters);
     if (count > 0 && n < count)
     {
         filter = filters[n];
@@ -1149,7 +1110,7 @@ bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxStrin
 // filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
 int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions)
 {
-    return wxParseWildcard(filterStr, descriptions, filters );
+    return wxParseCommonDialogsFilter(filterStr, descriptions, filters );
 }
 #endif // WXWIN_COMPATIBILITY_2_4
 
@@ -1167,15 +1128,15 @@ void wxGenericDirCtrl::DoResize()
             // correct control height to always be returned, rather
             // than the drop-down list height which is sometimes returned.
             wxSize oldSize = m_filterListCtrl->GetSize();
-            m_filterListCtrl->SetSize(wxDefaultPosition.x,
-                                      wxDefaultPosition.y,
+            m_filterListCtrl->SetSize(wxDefaultCoord,
+                                      wxDefaultCoord,
                                       oldSize.x+10,
-                                      wxDefaultSize.y,
+                                      wxDefaultCoord,
                                       wxSIZE_USE_EXISTING);
-            m_filterListCtrl->SetSize(wxDefaultPosition.x,
-                                      wxDefaultPosition.y,
+            m_filterListCtrl->SetSize(wxDefaultCoord,
+                                      wxDefaultCoord,
                                       oldSize.x,
-                                      wxDefaultSize.y,
+                                      wxDefaultCoord,
                                       wxSIZE_USE_EXISTING);
 #endif
             filterSz = m_filterListCtrl->GetSize();
@@ -1261,7 +1222,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt
 {
     Clear();
     wxArrayString descriptions, filters;
-    size_t n = (size_t) wxParseWildcard(filter, filters, descriptions);
+    size_t n = (size_t) wxParseCommonDialogsFilter(filter, descriptions, filters);
 
     if (n > 0 && defaultFilter < (int) n)
     {
@@ -1270,7 +1231,9 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt
         SetSelection(defaultFilter);
     }
 }
+#endif // wxUSE_DIRDLG
 
+#if wxUSE_DIRDLG || wxUSE_FILEDLG
 
 // ----------------------------------------------------------------------------
 // wxFileIconsTable icons
@@ -1502,7 +1465,9 @@ void wxFileIconsTable::Create()
     m_smallImageList = new wxImageList(16, 16);
 
     // folder:
-    m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG));
+    m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER,
+                                                   wxART_CMN_DIALOG,
+                                                   wxSize(16, 16)));
     // folder_open
     m_smallImageList->Add(wxIcon(file_icons_tbl_folder_open_xpm));
     // computer
@@ -1516,11 +1481,15 @@ void wxFileIconsTable::Create()
     // removeable
     m_smallImageList->Add(wxIcon(file_icons_tbl_removeable_xpm));
     // file
-    m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, wxART_CMN_DIALOG));
+    m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE,
+                                                   wxART_CMN_DIALOG,
+                                                   wxSize(16, 16)));
     // executable
     if (GetIconID(wxEmptyString, _T("application/x-executable")) == file)
     {
-        m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG));
+        m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE,
+                                                       wxART_CMN_DIALOG,
+                                                       wxSize(16, 16)));
         delete m_HashTable->Get(_T("exe"));
         m_HashTable->Delete(_T("exe"));
         m_HashTable->Put(_T("exe"), new wxFileIconEntry(executable));
@@ -1583,7 +1552,11 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
             if (smask > 2)
                 ps[0] = ps[1] = ps[2] = mr;
             else
-                ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
+            {
+                ps[0] = (unsigned char)(sr >> 2);
+                ps[1] = (unsigned char)(sg >> 2);
+                ps[2] = (unsigned char)(sb >> 2);
+            }
             ps += 3;
         }
         p1 += size*2 * 3, p2 += size*2 * 3;
@@ -1712,6 +1685,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
 
 #else // !wxUSE_MIMETYPE
 
+    wxUnusedVar(mime);
     if (extension == wxT("exe"))
         return executable;
     else
@@ -1719,4 +1693,4 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
 #endif // wxUSE_MIMETYPE/!wxUSE_MIMETYPE
 }
 
-#endif // wxUSE_DIRDLG
+#endif // wxUSE_DIRDLG || wxUSE_FILEDLG