]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
use best size instead of hard coded 80*26 in SetSize(wxSIZE_AUTO)
[wxWidgets.git] / src / generic / dirctrlg.cpp
index 5439942a6e1c700020eb447ab9e9f112a1d4a57f..77ae7aa6401bd768d096387444d783804e78c6cd 100644 (file)
 
 #endif
 
-#ifdef __WXPM__
-
-#define INCL_BASE
-#include <os2.h>
-#ifndef __EMX__
-#include <direct.h>
-#endif
-#include <stdlib.h>
-#include <ctype.h>
-extern bool wxIsDriveAvailable(const wxString& dirName);
-#endif // __WXPM__
+#if defined(__OS2__) || defined(__DOS__)
+  #ifdef __OS2__
+    #define INCL_BASE
+    #include <os2.h>
+    #ifndef __EMX__
+      #include <direct.h>
+    #endif
+    #include <stdlib.h>
+    #include <ctype.h>
+  #endif
+  extern bool wxIsDriveAvailable(const wxString& dirName);
+#endif // __OS2__
 
 #if defined(__WXMAC__)
 #  ifdef __DARWIN__
@@ -103,12 +104,12 @@ extern bool wxIsDriveAvailable(const wxString& dirName);
 #endif
 
 // ----------------------------------------------------------------------------
-// wxGetAvailableDrives, for WINDOWS, DOS, WXPM, MAC, UNIX (returns "/")
+// wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/")
 // ----------------------------------------------------------------------------
 
 size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids)
 {
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
 
 #ifdef __WXWINCE__
     // No logical drives; return "\"
@@ -125,7 +126,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
         path.Printf(wxT("%c:\\"), driveBuffer[i]);
         name.Printf(wxT("%c:"), driveBuffer[i]);
 
-        int imageId = wxFileIconsTable::drive;
+        int imageId;
         int driveType = ::GetDriveType(path);
         switch (driveType)
         {
@@ -155,7 +156,34 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
         if (driveBuffer[i] == wxT('\0'))
             break;
     }
-#else // !__WIN32__
+#elif defined(__OS2__)
+    APIRET rc;
+    ULONG ulDriveNum = 0;
+    ULONG ulDriveMap = 0;
+    rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
+    if ( rc == 0){
+        size_t i = 0;
+        while (i < 26)
+        {
+           if (ulDriveMap & ( 1 << i ))
+           {
+               wxString path, name;
+               path.Printf(wxT("%c:\\"), 'A' + i);
+               name.Printf(wxT("%c:"), 'A' + i);
+
+               int imageId;
+               if (path == wxT("A:\\") || path == wxT("B:\\"))
+                 imageId = wxFileIconsTable::floppy;
+               else
+                 imageId = wxFileIconsTable::drive;
+               paths.Add(path);
+               names.Add(name);
+               icon_ids.Add(imageId);
+           }
+            i ++;
+       }
+    } 
+#else // !__WIN32__, !__OS2__
     int drive;
 
     /* If we can switch to the drive, it exists. */
@@ -291,7 +319,7 @@ bool wxIsDriveAvailable(const wxString& dirName)
         return TRUE;
 }
 
-#elif defined(__WINDOWS__) || defined(__WXPM__)
+#elif defined(__WINDOWS__) || defined(__OS2__)
 
 int setdrive(int drive)
 {
@@ -301,18 +329,23 @@ int setdrive(int drive)
     (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)
     return _chdrive(drive);
 #else
-       wxChar  newdrive[3];
+       wxChar  newdrive[4];
 
        if (drive < 1 || drive > 31)
                return -1;
        newdrive[0] = (wxChar)(wxT('A') + drive - 1);
        newdrive[1] = wxT(':');
+#ifdef __OS2__
+       newdrive[2] = wxT('\\');
+       newdrive[3] = wxT('\0');
+#else
        newdrive[2] = wxT('\0');
+#endif
 #if defined(__WXMSW__)
        if (::SetCurrentDirectory(newdrive))
 #else
     // VA doesn't know what LPSTR is and has its own set
-       if (DosSetCurrentDir((PSZ)newdrive))
+       if (!DosSetCurrentDir((PSZ)newdrive))
 #endif
                return 0;
        else
@@ -338,6 +371,11 @@ bool wxIsDriveAvailable(const wxString& dirName)
 #if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)
         success = wxPathExists(dirNameLower);
 #else
+        #if defined(__OS2__)
+        // Avoid changing to drive since no media may be inserted.
+        if (dirNameLower[(size_t)0] == 'a' || dirNameLower[(size_t)0] == 'b')
+            return success;
+        #endif
         int currentDrive = _getdrive();
         int thisDrive = (int) (dirNameLower[(size_t)0] - 'a' + 1) ;
         int err = setdrive( thisDrive ) ;
@@ -356,12 +394,12 @@ bool wxIsDriveAvailable(const wxString& dirName)
     return success;
 #endif
 }
-#endif // __WINDOWS__ || __WXPM__
+#endif // __WINDOWS__ || __OS2__
 
 
 // Function which is called by quick sort. We want to override the default wxArrayString behaviour,
 // and sort regardless of case.
-static int LINKAGEMODE wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond)
+static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond)
 {
     return strFirst->CmpNoCase(*strSecond);
 }
@@ -430,29 +468,67 @@ bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const
 
 
 #if wxUSE_EXTENDED_RTTI
+WX_DEFINE_FLAGS( wxGenericDirCtrlStyle )
+
+wxBEGIN_FLAGS( wxGenericDirCtrlStyle )
+    // new style border flags, we put them first to
+    // use them for streaming out
+    wxFLAGS_MEMBER(wxBORDER_SIMPLE)
+    wxFLAGS_MEMBER(wxBORDER_SUNKEN)
+    wxFLAGS_MEMBER(wxBORDER_DOUBLE)
+    wxFLAGS_MEMBER(wxBORDER_RAISED)
+    wxFLAGS_MEMBER(wxBORDER_STATIC)
+    wxFLAGS_MEMBER(wxBORDER_NONE)
+    
+    // old style border flags
+    wxFLAGS_MEMBER(wxSIMPLE_BORDER)
+    wxFLAGS_MEMBER(wxSUNKEN_BORDER)
+    wxFLAGS_MEMBER(wxDOUBLE_BORDER)
+    wxFLAGS_MEMBER(wxRAISED_BORDER)
+    wxFLAGS_MEMBER(wxSTATIC_BORDER)
+    wxFLAGS_MEMBER(wxBORDER)
+
+    // standard window styles
+    wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
+    wxFLAGS_MEMBER(wxCLIP_CHILDREN)
+    wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
+    wxFLAGS_MEMBER(wxWANTS_CHARS)
+    wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
+    wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
+    wxFLAGS_MEMBER(wxVSCROLL)
+    wxFLAGS_MEMBER(wxHSCROLL)
+
+    wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY)
+    wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL)
+    wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST)
+    wxFLAGS_MEMBER(wxDIRCTRL_SHOW_FILTERS)
+
+wxEND_FLAGS( wxGenericDirCtrlStyle )
+
 IMPLEMENT_DYNAMIC_CLASS_XTI(wxGenericDirCtrl, wxControl,"wx/dirctrl.h")
 
-WX_BEGIN_PROPERTIES_TABLE(wxGenericDirCtrl)
-    WX_HIDE_PROPERTY( Children )
-       WX_PROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath  , , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
-       WX_PROPERTY( Filter , wxString , SetFilter , GetFilter  ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
-       WX_PROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
-WX_END_PROPERTIES_TABLE()
+wxBEGIN_PROPERTIES_TABLE(wxGenericDirCtrl)
+    wxHIDE_PROPERTY( Children )
+       wxPROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath  , , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+       wxPROPERTY( Filter , wxString , SetFilter , GetFilter  ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
+       wxPROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
+    wxPROPERTY_FLAGS( WindowStyle, wxGenericDirCtrlStyle, long, SetWindowStyleFlag, GetWindowStyleFlag, , 0, wxT("Helpstring"), wxT("group") )
+wxEND_PROPERTIES_TABLE()
 
-WX_BEGIN_HANDLERS_TABLE(wxGenericDirCtrl)
-WX_END_HANDLERS_TABLE()
+wxBEGIN_HANDLERS_TABLE(wxGenericDirCtrl)
+wxEND_HANDLERS_TABLE()
 
-WX_CONSTRUCTOR_8( wxGenericDirCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , DefaultPath , 
+wxCONSTRUCTOR_8( wxGenericDirCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , DefaultPath , 
                  wxPoint , Position , wxSize , Size , long , WindowStyle , wxString , Filter , int , DefaultFilter ) 
 #else
 IMPLEMENT_DYNAMIC_CLASS(wxGenericDirCtrl, wxControl)
 #endif
 
 BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl)
-  EVT_TREE_ITEM_EXPANDING     (-1, wxGenericDirCtrl::OnExpandItem)
-  EVT_TREE_ITEM_COLLAPSED     (-1, wxGenericDirCtrl::OnCollapseItem)
-  EVT_TREE_BEGIN_LABEL_EDIT   (-1, wxGenericDirCtrl::OnBeginEditItem)
-  EVT_TREE_END_LABEL_EDIT     (-1, wxGenericDirCtrl::OnEndEditItem)
+  EVT_TREE_ITEM_EXPANDING     (wxID_TREECTRL, wxGenericDirCtrl::OnExpandItem)
+  EVT_TREE_ITEM_COLLAPSED     (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem)
+  EVT_TREE_BEGIN_LABEL_EDIT   (wxID_TREECTRL, wxGenericDirCtrl::OnBeginEditItem)
+  EVT_TREE_END_LABEL_EDIT     (wxID_TREECTRL, wxGenericDirCtrl::OnEndEditItem)
   EVT_SIZE                    (wxGenericDirCtrl::OnSize)
 END_EVENT_TABLE()
 
@@ -514,7 +590,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
 
     wxString rootName;
 
-#if defined(__WINDOWS__) || defined(__WXPM__) || defined(__DOS__)
+#if defined(__WINDOWS__) || defined(__OS2__) || defined(__DOS__)
     rootName = _("Computer");
 #else
     rootName = _("Sections");
@@ -703,7 +779,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
 
     wxString dirName(data->m_path);
 
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
     // Check if this is a root directory and if so,
     // whether the drive is avaiable.
     if (!wxIsDriveAvailable(dirName))
@@ -717,7 +793,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
     // This may take a longish time. Go to busy cursor
     wxBusyCursor busy;
 
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
     if (dirName.Last() == ':')
         dirName += wxString(wxFILE_SEP_PATH);
 #endif
@@ -744,7 +820,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
                     dirs.Add(eachFilename);
                 }
             }
-            while (d.GetNext(& eachFilename));
+            while (d.GetNext(&eachFilename));
         }
     }
     dirs.Sort(wxDirCtrlStringCompareFunction);
@@ -758,16 +834,26 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
 
         if (d.IsOpened())
         {
-            if (d.GetFirst(& eachFilename, m_currentFilterStr, wxDIR_FILES))
+            int style = wxDIR_FILES;
+            if (m_showHidden) style |= wxDIR_HIDDEN;
+            // Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg")
+            wxStringTokenizer strTok;
+            wxString curFilter;
+            strTok.SetString(m_currentFilterStr,wxT(";"));
+            while(strTok.HasMoreTokens())
             {
-                do
+                curFilter = strTok.GetNextToken();
+                if (d.GetFirst(& eachFilename, m_currentFilterStr, style))
                 {
-                    if ((eachFilename != wxT(".")) && (eachFilename != wxT("..")))
+                    do
                     {
-                        filenames.Add(eachFilename);
+                        if ((eachFilename != wxT(".")) && (eachFilename != wxT("..")))
+                        {
+                            filenames.Add(eachFilename);
+                        }
                     }
+                    while (d.GetNext(& eachFilename));
                 }
-                while (d.GetNext(& eachFilename));
             }
         }
         filenames.Sort(wxDirCtrlStringCompareFunction);
@@ -842,7 +928,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString&
     path2 += wxString(wxFILE_SEP_PATH);
 
     // In MSW or PM, case is not significant
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
     path2.MakeLower();
 #endif
 
@@ -859,7 +945,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString&
                 childPath += wxString(wxFILE_SEP_PATH);
 
             // In MSW and PM, case is not significant
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__)
             childPath.MakeLower();
 #endif
 
@@ -991,7 +1077,7 @@ void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayStri
 
     wxString dirName(data->m_path);
 
-#if defined(__WXMSW__) || defined(__WXPM__)
+#if defined(__WXMSW__) || defined(__OS2__)
     if (dirName.Last() == ':')
         dirName += wxString(wxFILE_SEP_PATH);
 #endif
@@ -1169,8 +1255,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt
 
     if (n > 0 && defaultFilter < (int) n)
     {
-        size_t i = 0;
-        for (i = 0; i < n; i++)
+        for (size_t i = 0; i < n; i++)
             Append(descriptions[i]);
         SetSelection(defaultFilter);
     }
@@ -1443,13 +1528,15 @@ wxImageList *wxFileIconsTable::GetSmallImageList()
     return m_smallImageList;
 }
 
-#if wxUSE_MIMETYPE
+#if wxUSE_MIMETYPE && wxUSE_IMAGE
 // VS: we don't need this function w/o wxMimeTypesManager because we'll only have
 //     one icon and we won't resize it
 
 static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
 {
-    wxImage smallimg (16, 16);
+    const unsigned int size = 16;
+    
+    wxImage smallimg (size, size);
     unsigned char *p1, *p2, *ps;
     unsigned char mr = img.GetMaskRed(),
                   mg = img.GetMaskGreen(),
@@ -1458,12 +1545,12 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
     unsigned x, y;
     unsigned sr, sg, sb, smask;
 
-    p1 = img.GetData(), p2 = img.GetData() + 3 * 32, ps = smallimg.GetData();
+    p1 = img.GetData(), p2 = img.GetData() + 3 * size*2, ps = smallimg.GetData();
     smallimg.SetMaskColour(mr, mr, mr);
 
-    for (y = 0; y < 16; y++)
+    for (y = 0; y < size; y++)
     {
-        for (x = 0; x < 16; x++)
+        for (x = 0; x < size; x++)
         {
             sr = sg = sb = smask = 0;
             if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
@@ -1489,12 +1576,14 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
                 ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
             ps += 3;
         }
-        p1 += 32 * 3, p2 += 32 * 3;
+        p1 += size*2 * 3, p2 += size*2 * 3;
     }
-
+    
     return wxBitmap(smallimg);
 }
 
+// This function is currently not unused anymore
+#if 0
 // finds empty borders and return non-empty area of image:
 static wxImage CutEmptyBorders(const wxImage& img)
 {
@@ -1538,6 +1627,8 @@ static wxImage CutEmptyBorders(const wxImage& img)
 
     return img.GetSubImage(wxRect(left, top, right - left + 1, bottom - top + 1));
 }
+#endif // #if 0
+
 #endif // wxUSE_MIMETYPE
 
 int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
@@ -1558,11 +1649,15 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
 
     wxIconLocation iconLoc;
     wxIcon ic;
-    if ( ft && ft->GetIcon(&iconLoc) )
+
     {
-        ic = wxIcon(iconLoc);
+        wxLogNull logNull;
+        if ( ft && ft->GetIcon(&iconLoc) )
+        {
+            ic = wxIcon( iconLoc.GetFileName() );
+        }
     }
-
+    
     delete ft;
 
     if ( !ic.Ok() )
@@ -1572,20 +1667,36 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
         return newid;
     }
 
-    wxBitmap tmpBmp;
-    tmpBmp.CopyFromIcon(ic);
-    wxImage img = tmpBmp.ConvertToImage();
+    wxBitmap bmp;
+    bmp.CopyFromIcon(ic);
 
+    if ( !bmp.Ok() )
+    {
+        int newid = file;
+        m_HashTable->Put(extension, new wxFileIconEntry(newid));
+        return newid;
+    }
+
+    const unsigned int size = 16;
+    
     int id = m_smallImageList->GetImageCount();
-    if (img.GetWidth() == 16 && img.GetHeight() == 16)
-        m_smallImageList->Add(wxBitmap(img));
+    if ((bmp.GetWidth() == (int) size) && (bmp.GetHeight() == (int) size))
+    {
+        m_smallImageList->Add(bmp);
+    }
+#if wxUSE_IMAGE
     else
     {
-        if (img.GetWidth() != 32 || img.GetHeight() != 32)
-            m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32)));
+        wxImage img = bmp.ConvertToImage();
+
+        if ((img.GetWidth() != size*2) || (img.GetHeight() != size*2))
+//            m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(size*2, size*2)));
+            m_smallImageList->Add(CreateAntialiasedBitmap(img.Rescale(size*2, size*2)));
         else
             m_smallImageList->Add(CreateAntialiasedBitmap(img));
     }
+#endif // wxUSE_IMAGE
+
     m_HashTable->Put(extension, new wxFileIconEntry(id));
     return id;