]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/mimetype.cpp
avoid trying to link QA if not required
[wxWidgets.git] / src / unix / mimetype.cpp
index 7a8cbfc2f1305de58f3adb484ef8d5f67f06398f..e0bce49d8d4c0d12a8782bd71a9a28620294beb6 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "mimetype.h"
-#endif
-
 // for compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #ifndef WX_PRECOMP
   #include "wx/string.h"
-  #if wxUSE_GUI
-    #include "wx/icon.h"
-
-  #endif
 #endif //WX_PRECOMP
 
 
@@ -78,6 +70,7 @@
 #include "wx/utils.h"
 #include "wx/tokenzr.h"
 #include "wx/iconloc.h"
+#include "wx/filename.h"
 
 #include "wx/unix/mimetype.h"
 
@@ -106,7 +99,7 @@ public:
     // add a new verb with the command or replace the old value
     void AddOrReplaceVerb(const wxString& verb, const wxString& cmd)
     {
-        int n = m_verbs.Index(verb, FALSE /* ignore case */);
+        int n = m_verbs.Index(verb, false /* ignore case */);
         if ( n == wxNOT_FOUND )
         {
             m_verbs.Add(verb);
@@ -168,7 +161,7 @@ public:
     wxMimeTextFile () : wxTextFile () {};
     wxMimeTextFile (const wxString& strFile) : wxTextFile (strFile)  {  };
 
-    int pIndexOf(const wxString & sSearch, bool bIncludeComments = FALSE, int iStart = 0)
+    int pIndexOf(const wxString & sSearch, bool bIncludeComments = false, int iStart = 0)
     {
         size_t i = iStart;
         int nResult = wxNOT_FOUND;
@@ -206,19 +199,19 @@ public:
 
     bool CommentLine(int nIndex)
     {
-        if (nIndex <0) return FALSE;
-        if (nIndex >= (int)GetLineCount() ) return FALSE;
+        if (nIndex <0) return false;
+        if (nIndex >= (int)GetLineCount() ) return false;
         GetLine(nIndex) = GetLine(nIndex).Prepend(wxT("#"));
-        return TRUE;
+        return true;
     }
 
     bool CommentLine(const wxString & sTest)
     {
         int nIndex = pIndexOf(sTest);
-        if (nIndex <0) return FALSE;
-        if (nIndex >= (int)GetLineCount() ) return FALSE;
+        if (nIndex <0) return false;
+        if (nIndex >= (int)GetLineCount() ) return false;
         GetLine(nIndex) = GetLine(nIndex).Prepend(wxT("#"));
-        return TRUE;
+        return true;
     }
 
     wxString GetVerb (size_t i)
@@ -371,7 +364,7 @@ bool wxMimeTypesManagerImpl::CheckGnomeDirsExist ()
         if (!wxMkdir ( sTmp ))
         {
             wxLogError(_("Failed to create directory %s/.gnome."), sTmp.c_str());
-            return FALSE;
+            return false;
         }
     }
     sTmp = sTmp + wxT("/mime-info");
@@ -380,10 +373,10 @@ bool wxMimeTypesManagerImpl::CheckGnomeDirsExist ()
         if (!wxMkdir ( sTmp ))
         {
             wxLogError(_("Failed to create directory %s/mime-info."), sTmp.c_str());
-            return FALSE;
+            return false;
         }
     }
-    return TRUE;
+    return true;
 
 }
 
@@ -404,8 +397,8 @@ bool wxMimeTypesManagerImpl::WriteGnomeKeyFile(int index, bool delete_index)
     if (! outfile.Open () )
 #endif
     {
-        if (delete_index) return FALSE;
-        if (!CheckGnomeDirsExist() ) return FALSE;
+        if (delete_index) return false;
+        if (!CheckGnomeDirsExist() ) return false;
         outfile.Create ();
     }
 
@@ -437,8 +430,8 @@ bool wxMimeTypesManagerImpl::WriteGnomeKeyFile(int index, bool delete_index)
 
         wxMimeTypeCommands sOld;
         size_t nOld = nIndex + 1;
-        bool oldEntryEnd = FALSE;
-        while ( (nOld < outfile.GetLineCount() )&& (oldEntryEnd == FALSE ))
+        bool oldEntryEnd = false;
+        while ( (nOld < outfile.GetLineCount() )&& (!oldEntryEnd))
         {
             sTmp = outfile.GetLine(nOld);
             if ( (sTmp[0u] == wxT('\t')) || (sTmp[0u] == wxT('#')) )
@@ -452,7 +445,7 @@ bool wxMimeTypesManagerImpl::WriteGnomeKeyFile(int index, bool delete_index)
             }
             // next mimetpye ??or blank line
             else
-                oldEntryEnd = TRUE;
+                oldEntryEnd = true;
         }
         // list of entries in our data; these should all be in sOld,
         // though sOld may also contain other entries , eg flags
@@ -494,8 +487,8 @@ bool wxMimeTypesManagerImpl::WriteGnomeMimeFile(int index, bool delete_index)
     // create it anyway as a private mime store
     if (! outfile.Open () )
     {
-        if (delete_index) return FALSE;
-        if (!CheckGnomeDirsExist() ) return FALSE;
+        if (delete_index) return false;
+        if (!CheckGnomeDirsExist() ) return false;
         outfile.Create ();
     }
     wxString strType = m_aTypes[index];
@@ -575,17 +568,19 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
                 else if (sTmp.Contains( wxT("icon_filename=") ) )
                 {
                     curIconFile = sTmp.AfterFirst(wxT('='));
+
                     if (!wxFileExists(curIconFile))
                     {
                         size_t nDirs = dirs.GetCount();
                         for (size_t nDir = 0; nDir < nDirs; nDir++)
                         {
-                            wxString newFile;
-                            newFile.Printf(wxT("%s/pixmaps/document-icons/%s.png"),
-                                           dirs[nDir].c_str(),
-                                           curIconFile.c_str());
-                            if (wxFileExists(newFile))
-                                curIconFile = newFile;
+                            wxFileName newFile( curIconFile );
+                            newFile.SetPath( dirs[nDir] );
+                            newFile.AppendDir( wxT("pixmaps") );
+                            newFile.AppendDir( wxT("document-icons") );
+                            newFile.SetExt( wxT("png") );
+                            if (newFile.FileExists())
+                                curIconFile = newFile.GetFullPath();
                         }
                     }
                 }
@@ -604,7 +599,7 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
                     // for now ignore lines with flags in...FIX
                     sTmp = sTmp.AfterLast(wxT(']'));
                     sTmp = sTmp.AfterLast(wxT('\t'));
-                    sTmp.Trim(FALSE).Trim();
+                    sTmp.Trim(false).Trim();
                     if (0 == sTmp.Replace ( wxT("%f"), wxT("%s") )) sTmp = sTmp + wxT(" %s");
                     entry->Add(sTmp);
 
@@ -632,11 +627,9 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
         // ignore blank lines
         nLine ++;
     } // end of while, save any data
+
     if (! curMimeType.empty())
-    {
         AddToMimeData ( curMimeType, curIconFile, entry, strExtensions, strDesc);
-    }
-
 }
 
 
@@ -676,7 +669,7 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& file
         if ( !pc || !*pc )
         {
             // end of the entry
-            if ( !!curMimeType && !!curExtList )
+            if ( !curMimeType.empty() && !curExtList.empty() )
             {
                  wxLogTrace(TRACE_MIME,
                             wxT("--- At end of Gnome file  finding mimetype %s  ---"),
@@ -734,7 +727,7 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& file
 void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
                       const wxString& dirbase, const wxArrayString& dirs)
 {
-    wxASSERT_MSG( !!dirbase && !wxEndsWithPathSeparator(dirbase),
+    wxASSERT_MSG( !dirbase.empty() && !wxEndsWithPathSeparator(dirbase),
                   _T("base directory shouldn't end with a slash") );
 
     wxString dirname = dirbase;
@@ -751,7 +744,8 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
     dirname += wxT('/');
 
     wxString filename;
-    bool cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
+    bool cont;
+    cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
     while ( cont )
     {
         LoadGnomeMimeTypesFromMimeFile(dirname + filename);
@@ -766,21 +760,65 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
 
         cont = dir.GetNext(&filename);
     }
-}
 
+    // Hack alert: We scan all icons and deduce the
+    //             mime-type from the file name.
+    dirname = dirbase;
+    dirname << wxT("/pixmaps/document-icons");
+
+    // these are always empty in this file
+    wxArrayString strExtensions;
+    wxString strDesc;
+
+    if ( !wxDir::Exists(dirname) )
+    {
+        // Jst test for default GPE dir also
+        dirname = wxT("/usr/share/gpe/pixmaps/default/filemanager/document-icons");
 
+        if ( !wxDir::Exists(dirname) )
+           return;
+    }
+
+    wxDir dir2( dirname );
+
+    cont = dir2.GetFirst(&filename, wxT("gnome-*.png"), wxDIR_FILES);
+    while ( cont )
+    {
+        wxString mimeType = filename;
+        mimeType.Remove( 0, 6 ); // remove "gnome-"
+        mimeType.Remove( mimeType.Len()-4, 4 ); // remove ".png"
+        int pos = mimeType.Find( wxT("-") );
+        if (pos != wxNOT_FOUND)
+        {
+            mimeType.SetChar( pos, wxT('/') );
+            wxString iconFile = dirname;
+            iconFile << wxT("/");
+            iconFile << filename;
+            AddToMimeData ( mimeType, iconFile, NULL, strExtensions, strDesc, true );
+        }
 
+        cont = dir2.GetNext(&filename);
+    }
+}
 
 void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir)
 {
     wxArrayString dirs;
+
+    wxString gnomedir = wxGetenv( wxT("GNOMEDIR") );;
+    if (!gnomedir.empty())
+    {
+        gnomedir << wxT("/share");
+        dirs.Add( gnomedir );
+    }
+
     dirs.Add(wxT("/usr/share"));
     dirs.Add(wxT("/usr/local/share"));
 
-    wxString gnomedir;
-    wxGetHomeDir( &gnomedir );
-    gnomedir += wxT("/.gnome");
+    gnomedir = wxGetHomeDir();
+    gnomedir << wxT("/.gnome");
     dirs.Add( gnomedir );
+
     if (!sExtraDir.empty()) dirs.Add( sExtraDir );
 
     size_t nDirs = dirs.GetCount();
@@ -808,20 +846,21 @@ void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir)
 // kde writing; see http://webcvs.kde.org/cgi-bin/cvsweb.cgi/~checkout~/kdelibs/kio/DESKTOP_ENTRY_STANDARD
 // for now write to .kdelnk but should eventually do .desktop instead (in preference??)
 
-bool wxMimeTypesManagerImpl::CheckKDEDirsExist ( const wxString & sOK, const wxString & sTest )
-
-    {
+bool wxMimeTypesManagerImpl::CheckKDEDirsExist ( const wxString &sOK, const wxString &sTest )
+{
     if (sTest.empty())
-        {
-            if (wxDir::Exists(sOK)) return TRUE;
-            else return FALSE;
-        }
+    {
+        if (wxDir::Exists(sOK))
+            return true;
+        else
+            return false;
+    }
     else
-        {
-            wxString sStart = sOK + wxT("/") + sTest.BeforeFirst(wxT('/'));
-            if (!wxDir::Exists(sStart))  wxMkdir(sStart);
-            wxString sEnd = sTest.AfterFirst(wxT('/'));
-            return CheckKDEDirsExist(sStart, sEnd);
+    {
+        wxString sStart = sOK + wxT("/") + sTest.BeforeFirst(wxT('/'));
+        if (!wxDir::Exists(sStart))  wxMkdir(sStart);
+        wxString sEnd = sTest.AfterFirst(wxT('/'));
+        return CheckKDEDirsExist(sStart, sEnd);
     }
 }
 
@@ -840,7 +879,7 @@ bool wxMimeTypesManagerImpl::WriteKDEMimeFile(int index, bool delete_index)
     {
         bTemp = mimeoutfile.Create (sTmp);
         // some unknown error eg out of disk space
-        if (!bTemp) return FALSE;
+        if (!bTemp) return false;
     }
 
     sTmp = wxT(".kde/share/applnk/");
@@ -853,7 +892,7 @@ bool wxMimeTypesManagerImpl::WriteKDEMimeFile(int index, bool delete_index)
     {
         bTemp = appoutfile.Create (sTmp);
         // some unknown error eg out of disk space
-        if (!bTemp) return FALSE;
+        if (!bTemp) return false;
     }
 
     // fixed data; write if new file
@@ -922,15 +961,13 @@ bool wxMimeTypesManagerImpl::WriteKDEMimeFile(int index, bool delete_index)
         //other actions as well as open
 
     }
-    bTemp = FALSE;
-    if (mimeoutfile.Write ()) bTemp = TRUE;
+    bTemp = false;
+    if (mimeoutfile.Write ()) bTemp = true;
     mimeoutfile.Close ();
-    if (appoutfile.Write ()) bTemp = TRUE;
+    if (appoutfile.Write ()) bTemp = true;
     appoutfile.Close ();
 
     return bTemp;
-
-
 }
 
 void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
@@ -943,7 +980,7 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
 
     wxLogTrace(TRACE_MIME, wxT("loading KDE file %s"),
                            (dirbase+filename).c_str());
-    
+
     wxMimeTypeCommands * entry = new wxMimeTypeCommands;
     wxArrayString sExts;
     wxString mimetype, mime_desc, strIcon;
@@ -987,7 +1024,7 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
     nIndex = file.pIndexOf(_T("Patterns="));
     if ( nIndex != wxNOT_FOUND )
     {
-        wxString exts = file.GetCmd (nIndex);;
+        wxString exts = file.GetCmd (nIndex);
 
         wxStringTokenizer tokenizer(exts, _T(";"));
         while ( tokenizer.HasMoreTokens() )
@@ -1007,7 +1044,6 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
     }
     sExts.Add(mime_extension);
 
-
     // ok, now we can take care of icon:
 
     nIndex = file.pIndexOf(_T("Icon="));
@@ -1016,6 +1052,8 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
         strIcon = file.GetCmd(nIndex);
         wxLogTrace(TRACE_MIME, wxT("  icon %s"), strIcon.c_str());
         //it could be the real path, but more often a short name
+
+
         if (!wxFileExists(strIcon))
         {
             // icon is just the short name
@@ -1025,12 +1063,17 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
                 // in many locations, at least ~/.kde and $KDEDIR
                 size_t nDir, nDirs = icondirs.GetCount();
                 for ( nDir = 0; nDir < nDirs; nDir++ )
-                    if (wxFileExists(icondirs[nDir] + strIcon))
+                {
+                    wxFileName fnameIcon( strIcon );
+                    wxFileName fname( icondirs[nDir], fnameIcon.GetName() );
+                    fname.SetExt( wxT("png") );
+                    if (fname.FileExists())
                     {
-                        strIcon.Prepend(icondirs[nDir]);
+                        strIcon = fname.GetFullPath();
                         wxLogTrace(TRACE_MIME, wxT("  iconfile %s"), strIcon.c_str());
                         break;
                     }
+                }
             }
         }
     }
@@ -1069,7 +1112,7 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeType(const wxString& dirbase,
 
     wxLogTrace(TRACE_MIME, wxT("--- Loading from KDE directory %s  ---"),
                            dirname.c_str());
-    
+
     dirname += _T('/');
 
     wxString filename;
@@ -1093,7 +1136,7 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeType(const wxString& dirbase,
 void wxMimeTypesManagerImpl::LoadKDELinkFilesFromDir(const wxString& dirbase,
                                             const wxArrayString& icondirs)
 {
-    wxASSERT_MSG( !!dirbase && !wxEndsWithPathSeparator(dirbase),
+    wxASSERT_MSG( !dirbase.empty() && !wxEndsWithPathSeparator(dirbase),
                   _T("base directory shouldn't end with a slash") );
 
     wxString dirname = dirbase;
@@ -1124,13 +1167,100 @@ void wxMimeTypesManagerImpl::GetKDEMimeInfo(const wxString& sExtraDir)
     wxArrayString dirs;
     wxArrayString icondirs;
 
+    // FIXME: This code is heavily broken. There are three bugs in it:
+    //        1) it uses only KDEDIR, which is deprecated, instead of using
+    //           list of paths from KDEDIRS and using KDEDIR only if KDEDIRS
+    //           is not set
+    //        2) it doesn't look into ~/.kde/share/config/kdeglobals where
+    //           user's settings are stored and thus *ignores* user's settings
+    //           instead of respecting them
+    //        3) it "tries to guess KDEDIR" and "tries a few likely theme
+    //           names", both of which is completely arbitrary; instead, the
+    //           code should give up if KDEDIR(S) is not set and/or the icon
+    //           theme cannot be determined, because it means that the user is
+    //           not using KDE (and thus is not interested in KDE icons anyway)
+
+    // the variable $KDEDIR is set when KDE is running
+    wxString kdedir = wxGetenv( wxT("KDEDIR") );
+
+    if (!kdedir.empty())
+    {
+        // $(KDEDIR)/share/config/kdeglobals holds info
+        // the current icons theme
+        wxFileName configFile( kdedir, wxEmptyString );
+        configFile.AppendDir( wxT("share") );
+        configFile.AppendDir( wxT("config") );
+        configFile.SetName( wxT("kdeglobals") );
+
+        wxTextFile config;
+        if (configFile.FileExists() && config.Open(configFile.GetFullPath()))
+        {
+            // $(KDEDIR)/share/config -> $(KDEDIR)/share
+            configFile.RemoveDir( configFile.GetDirCount()-1 );
+            // $(KDEDIR)/share/ -> $(KDEDIR)/share/icons
+            configFile.AppendDir( wxT("icons") );
+
+            // Check for entry
+            wxString theme(wxT("default.kde"));
+            size_t cnt = config.GetLineCount();
+            for (size_t i = 0; i < cnt; i++)
+            {
+                if (config[i].StartsWith(wxT("Theme="), &theme/*rest*/))
+                    break;
+            }
+            configFile.AppendDir(theme);
+        }
+        else
+        {
+            // $(KDEDIR)/share/config -> $(KDEDIR)/share
+            configFile.RemoveDir( configFile.GetDirCount()-1 );
+            // $(KDEDIR)/share/ -> $(KDEDIR)/share/icons
+            configFile.AppendDir( wxT("icons") );
+            // $(KDEDIR)/share/icons -> $(KDEDIR)/share/icons/default.kde
+            configFile.AppendDir( wxT("default.kde") );
+        }
+
+        configFile.SetName( wxEmptyString );
+        configFile.AppendDir( wxT("32x32") );
+        configFile.AppendDir( wxT("mimetypes") );
+
+        // Just try a few likely icons theme names
+
+        int pos = configFile.GetDirCount()-3;
+
+        if (!wxDir::Exists(configFile.GetPath()))
+        {
+            configFile.RemoveDir( pos );
+            configFile.InsertDir( pos, wxT("default.kde") );
+        }
+
+        if (!wxDir::Exists(configFile.GetPath()))
+        {
+            configFile.RemoveDir( pos );
+            configFile.InsertDir( pos, wxT("default") );
+        }
+
+        if (!wxDir::Exists(configFile.GetPath()))
+        {
+            configFile.RemoveDir( pos );
+            configFile.InsertDir( pos, wxT("crystalsvg") );
+        }
+
+        if (!wxDir::Exists(configFile.GetPath()))
+        {
+            configFile.RemoveDir( pos );
+            configFile.InsertDir( pos, wxT("crystal") );
+        }
+
+        if (wxDir::Exists(configFile.GetPath()))
+            icondirs.Add( configFile.GetFullPath() );
+    }
+
     // settings in ~/.kde have maximal priority
     dirs.Add(wxGetHomeDir() + wxT("/.kde/share"));
     icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/"));
 
-    // the variable KDEDIR is set when KDE is running
-    const wxChar *kdedir = wxGetenv( wxT("KDEDIR") );
-    if ( kdedir )
+    if (kdedir)
     {
         dirs.Add( wxString(kdedir) + wxT("/share") );
         icondirs.Add( wxString(kdedir) + wxT("/share/icons/") );
@@ -1183,14 +1313,14 @@ bool wxFileTypeImpl::GetIcon(wxIconLocation *iconLoc) const
         i ++;
     }
     if ( sTmp.empty () )
-        return FALSE;
+        return false;
 
     if ( iconLoc )
     {
         iconLoc->SetFileName(sTmp);
     }
 
-    return TRUE;
+    return true;
 }
 
 
@@ -1200,7 +1330,7 @@ wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
     mimeTypes.Clear();
     for (size_t i = 0; i < m_index.GetCount(); i++)
         mimeTypes.Add(m_manager->m_aTypes[m_index[i]]);
-    return TRUE;
+    return true;
 }
 
 
@@ -1280,14 +1410,17 @@ bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions)
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 // set an arbitrary command,
 // could adjust the code to ask confirmation if it already exists and
-// overwriteprompt is TRUE, but this is currently ignored as *Associate* has
+// overwriteprompt is true, but this is currently ignored as *Associate* has
 // no overwrite prompt
-bool wxFileTypeImpl::SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt /*= TRUE*/)
+bool
+wxFileTypeImpl::SetCommand(const wxString& cmd,
+                           const wxString& verb,
+                           bool WXUNUSED(overwriteprompt))
 {
     wxArrayString strExtensions;
     wxString strDesc, strIcon;
@@ -1297,23 +1430,23 @@ bool wxFileTypeImpl::SetCommand(const wxString& cmd, const wxString& verb, bool
 
     wxArrayString strTypes;
     GetMimeTypes (strTypes);
-    if (strTypes.GetCount() < 1) return FALSE;
+    if (strTypes.GetCount() < 1) return false;
 
     size_t i;
-    bool Ok = TRUE;
+    bool Ok = true;
     for (i = 0; i < strTypes.GetCount(); i++)
     {
         if (!m_manager->DoAssociation (strTypes[i], strIcon, entry, strExtensions, strDesc))
-            Ok = FALSE;
+            Ok = false;
     }
 
     return Ok;
 }
 
 // ignore index on the grouds that we only have one icon in a Unix file
-bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon /*= wxEmptyString*/, int /*index = 0*/)
+bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon, int WXUNUSED(index))
 {
-    if (strIcon.empty()) return FALSE;
+    if (strIcon.empty()) return false;
     wxArrayString strExtensions;
     wxString strDesc;
 
@@ -1321,14 +1454,14 @@ bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon /*= wxEmptyString*/,
 
     wxArrayString strTypes;
     GetMimeTypes (strTypes);
-    if (strTypes.GetCount() < 1) return FALSE;
+    if (strTypes.GetCount() < 1) return false;
 
     size_t i;
-    bool Ok = TRUE;
+    bool Ok = true;
     for (i = 0; i < strTypes.GetCount(); i++)
     {
         if (!m_manager->DoAssociation (strTypes[i], strIcon, entry, strExtensions, strDesc))
-            Ok = FALSE;
+            Ok = false;
     }
 
     return Ok;
@@ -1341,10 +1474,30 @@ bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon /*= wxEmptyString*/,
 
 wxMimeTypesManagerImpl::wxMimeTypesManagerImpl()
 {
-    m_initialized = FALSE;
+    m_initialized = false;
     m_mailcapStylesInited = 0;
 }
 
+void wxMimeTypesManagerImpl::InitIfNeeded()
+{
+    if ( !m_initialized )
+    {
+        // set the flag first to prevent recursion
+        m_initialized = true;
+
+#if 0
+    wxString wm = wxGetenv( wxT("WINDOWMANAGER") );
+
+    if (wm.Find( wxT("kde") ) != wxNOT_FOUND)
+        Initialize( wxMAILCAP_KDE|wxMAILCAP_STANDARD );
+    else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND)
+        Initialize( wxMAILCAP_GNOME|wxMAILCAP_STANDARD );
+    else
+#endif
+            Initialize();
+    }
+}
+
 // read system and user mailcaps and other files
 void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
                                         const wxString& sExtraDir)
@@ -1355,11 +1508,11 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
         GetMimeInfo(sExtraDir);
 
     // read GNOME tables
-    if ( mailcapStyles & wxMAILCAP_GNOME)
+    if (mailcapStyles & wxMAILCAP_GNOME)
         GetGnomeMimeInfo(sExtraDir);
 
     // read KDE tables
-    if ( mailcapStyles & wxMAILCAP_KDE)
+    if (mailcapStyles & wxMAILCAP_KDE)
         GetKDEMimeInfo(sExtraDir);
 
     m_mailcapStylesInited |= mailcapStyles;
@@ -1431,7 +1584,7 @@ bool wxMimeTypesManagerImpl::WriteToMimeTypes (int index, bool delete_index)
 {
     // check we have the right manager
     if (! ( m_mailcapStylesInited & wxMAILCAP_STANDARD) )
-        return FALSE;
+        return false;
 
     bool bTemp;
     wxString strHome = wxGetenv(wxT("HOME"));
@@ -1446,18 +1599,18 @@ bool wxMimeTypesManagerImpl::WriteToMimeTypes (int index, bool delete_index)
     }
     else
     {
-        if (delete_index) return FALSE;
+        if (delete_index) return false;
         bTemp = file.Create(strUserMailcap);
     }
     if (bTemp)
     {
         int nIndex;
-        // test for netscape's header and return FALSE if its found
+        // test for netscape's header and return false if its found
         nIndex = file.pIndexOf (wxT("#--Netscape"));
         if (nIndex != wxNOT_FOUND)
         {
-            wxASSERT_MSG(FALSE,wxT("Error in .mime.types \nTrying to mix Netscape and Metamail formats\nFile not modiifed"));
-            return FALSE;
+            wxASSERT_MSG(false,wxT("Error in .mime.types \nTrying to mix Netscape and Metamail formats\nFile not modiifed"));
+            return false;
         }
         // write it in alternative format
         // get rid of unwanted entries
@@ -1485,7 +1638,7 @@ bool wxMimeTypesManagerImpl::WriteToNSMimeTypes (int index, bool delete_index)
 {
     //check we have the right managers
     if (! ( m_mailcapStylesInited & wxMAILCAP_NETSCAPE) )
-        return FALSE;
+        return false;
 
     bool bTemp;
     wxString strHome = wxGetenv(wxT("HOME"));
@@ -1500,7 +1653,7 @@ bool wxMimeTypesManagerImpl::WriteToNSMimeTypes (int index, bool delete_index)
     }
     else
     {
-        if (delete_index) return FALSE;
+        if (delete_index) return false;
         bTemp = file.Create(strUserMailcap);
     }
     if (bTemp)
@@ -1509,8 +1662,8 @@ bool wxMimeTypesManagerImpl::WriteToNSMimeTypes (int index, bool delete_index)
         // write it in the format that Netscape uses
         int nIndex;
         // test for netscape's header and insert if required...
-        // this is a comment so use TRUE
-        nIndex = file.pIndexOf (wxT("#--Netscape"), TRUE);
+        // this is a comment so use true
+        nIndex = file.pIndexOf (wxT("#--Netscape"), true);
         if (nIndex == wxNOT_FOUND)
         {
             // either empty file or metamail format
@@ -1518,8 +1671,8 @@ bool wxMimeTypesManagerImpl::WriteToNSMimeTypes (int index, bool delete_index)
             // metamail entreies
             if (file.GetLineCount () > 0)
             {
-                wxASSERT_MSG(FALSE, wxT(".mime.types File not in Netscape format\nNo entries written to\n.mime.types or to .mailcap"));
-                return FALSE;
+                wxASSERT_MSG(false, wxT(".mime.types File not in Netscape format\nNo entries written to\n.mime.types or to .mailcap"));
+                return false;
             }
             file.InsertLine (wxT( "#--Netscape Communications Corporation MIME Information" ), 0);
             nIndex = 0;
@@ -1554,7 +1707,7 @@ bool wxMimeTypesManagerImpl::WriteToNSMimeTypes (int index, bool delete_index)
             }
         }
         wxString sExts =  m_aExtensions.Item(index);
-        sTmp =     wxT("exts=\"") + sExts.Trim(FALSE).Trim() + wxT("\"");
+        sTmp =     wxT("exts=\"") + sExts.Trim(false).Trim() + wxT("\"");
         if (!delete_index)
         {
             nIndex ++;
@@ -1573,7 +1726,7 @@ bool wxMimeTypesManagerImpl::WriteToMailCap (int index, bool delete_index)
     //check we have the right managers
     if ( !( ( m_mailcapStylesInited & wxMAILCAP_NETSCAPE) ||
             ( m_mailcapStylesInited & wxMAILCAP_STANDARD) ) )
-        return FALSE;
+        return false;
 
     bool bTemp;
     wxString strHome = wxGetenv(wxT("HOME"));
@@ -1588,7 +1741,7 @@ bool wxMimeTypesManagerImpl::WriteToMailCap (int index, bool delete_index)
     }
     else
     {
-        if (delete_index) return FALSE;
+        if (delete_index) return false;
         bTemp = file.Create(strUserMailcap);
     }
     if (bTemp)
@@ -1650,13 +1803,13 @@ bool wxMimeTypesManagerImpl::WriteToMailCap (int index, bool delete_index)
                 s = sT.GetNextToken();
                 while ( ! s.empty() )
                 {
-                    bool bKnownToken = FALSE;
-                    if (s.Contains(wxT("description="))) bKnownToken = TRUE;
-                    if (s.Contains(wxT("x11-bitmap="))) bKnownToken = TRUE;
+                    bool bKnownToken = false;
+                    if (s.Contains(wxT("description="))) bKnownToken = true;
+                    if (s.Contains(wxT("x11-bitmap="))) bKnownToken = true;
                     size_t i;
                     for (i=0; i < entries->GetCount(); i++)
                     {
-                        if (s.Contains(entries->GetVerb(i))) bKnownToken = TRUE;
+                        if (s.Contains(entries->GetVerb(i))) bKnownToken = true;
                     }
                     if (!bKnownToken)
                     {
@@ -1732,7 +1885,7 @@ wxMimeTypesManagerImpl::Associate(const wxFileTypeInfo& ftInfo)
         {
         sExt = sA_Exts.Item(i);
         //clean up to just a space before and after
-        sExt.Trim().Trim(FALSE);
+        sExt.Trim().Trim(false);
         sExt = wxT(' ') + sExt + wxT(' ');
         for (nIndex = 0; nIndex < m_aExtensions.GetCount(); nIndex ++)
             {
@@ -1755,44 +1908,44 @@ bool wxMimeTypesManagerImpl::DoAssociation(const wxString& strType,
                                            const wxArrayString& strExtensions,
                                            const wxString& strDesc)
 {
-    int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, TRUE);
+    int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, true);
 
     if ( nIndex == wxNOT_FOUND )
-        return FALSE;
+        return false;
 
-    return WriteMimeInfo (nIndex, FALSE);
+    return WriteMimeInfo (nIndex, false);
 }
 
 bool wxMimeTypesManagerImpl::WriteMimeInfo(int nIndex, bool delete_mime )
 {
-    bool ok = TRUE;
+    bool ok = true;
 
     if ( m_mailcapStylesInited & wxMAILCAP_STANDARD )
     {
         // write in metamail  format;
         if (WriteToMimeTypes (nIndex, delete_mime) )
             if ( WriteToMailCap   (nIndex, delete_mime) )
-                ok = FALSE;
+                ok = false;
     }
     if ( m_mailcapStylesInited & wxMAILCAP_NETSCAPE )
     {
         // write in netsacpe format;
         if (WriteToNSMimeTypes (nIndex, delete_mime) )
             if ( WriteToMailCap   (nIndex, delete_mime) )
-                ok = FALSE;
+                ok = false;
     }
     if (m_mailcapStylesInited & wxMAILCAP_GNOME)
     {
         // write in Gnome format;
         if (WriteGnomeMimeFile (nIndex, delete_mime) )
             if (WriteGnomeKeyFile   (nIndex, delete_mime) )
-                ok = FALSE;
+                ok = false;
     }
     if (m_mailcapStylesInited & wxMAILCAP_KDE)
     {
         // write in KDE format;
         if (WriteKDEMimeFile (nIndex, delete_mime) )
-            ok = FALSE;
+            ok = false;
     }
 
     return ok;
@@ -1916,7 +2069,7 @@ wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext)
         while ( tk.HasMoreTokens() )
         {
             // consider extensions as not being case-sensitive
-            if ( tk.GetNextToken().IsSameAs(ext, FALSE /* no case */) )
+            if ( tk.GetNextToken().IsSameAs(ext, false /* no case */) )
             {
                 // found
                 wxFileType *fileType = new wxFileType;
@@ -2027,7 +2180,7 @@ void wxMimeTypesManagerImpl::AddMimeTypeInfo(const wxString& strMimeType,
     wxString sTmp = strExtensions;
 
     wxArrayString sExts;
-    sTmp.Trim().Trim(FALSE);
+    sTmp.Trim().Trim(false);
 
     while (!sTmp.empty())
     {
@@ -2035,7 +2188,7 @@ void wxMimeTypesManagerImpl::AddMimeTypeInfo(const wxString& strMimeType,
         sTmp = sTmp.BeforeLast(wxT(' '));
     }
 
-    AddToMimeData (strMimeType, strIcon, NULL, sExts, strDesc, TRUE);
+    AddToMimeData (strMimeType, strIcon, NULL, sExts, strDesc, true);
 }
 
 void wxMimeTypesManagerImpl::AddMailcapInfo(const wxString& strType,
@@ -2054,7 +2207,7 @@ void wxMimeTypesManagerImpl::AddMailcapInfo(const wxString& strType,
     wxString strIcon;
     wxArrayString strExtensions;
 
-    AddToMimeData (strType, strIcon, entry, strExtensions, strDesc, TRUE);
+    AddToMimeData (strType, strIcon, entry, strExtensions, strDesc, true);
 
 }
 
@@ -2069,7 +2222,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
 #else
     if ( !file.Open() )
 #endif
-        return FALSE;
+        return false;
 
     // the information we extract
     wxString strMimeType, strDesc, strExtensions;
@@ -2135,8 +2288,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
                 // the string is quoted and ends at the matching quote
                 pEnd = wxStrchr(++pc, wxT('"'));
                 if ( pEnd == NULL ) {
-                    wxLogWarning(_("Mime.types file %s, line %d: unterminated "
-                                   "quoted string."),
+                    wxLogWarning(_("Mime.types file %s, line %d: unterminated quoted string."),
                                  strFileName.c_str(), nLine + 1);
                 }
             }
@@ -2162,7 +2314,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
             // if there is something left, it may be either a '\\' to continue
             // the line or the next field of the same entry
             bool entryEnded = *pc == wxT('\0'),
-                 nextFieldOnSameLine = FALSE;
+                 nextFieldOnSameLine = false;
             if ( !entryEnded ) {
                 nextFieldOnSameLine = ((*pc != wxT('\\')) || (pc[1] != wxT('\0')));
             }
@@ -2177,7 +2329,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
             else if ( strLHS == wxT("exts") ) {
                 strExtensions = strRHS;
             }
-            else if ( strLHS != _T("icon") )
+            else if ( strLHS == _T("icon") )
             {
                 // this one is simply ignored: it usually refers to Netscape
                 // built in icons which are useless for us anyhow
@@ -2225,7 +2377,7 @@ bool wxMimeTypesManagerImpl::ReadMimeTypes(const wxString& strFileName)
         pc = NULL;
     }
 
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
@@ -2250,7 +2402,7 @@ struct MailcapLineData
          needsterminal,
          copiousoutput;
 
-    MailcapLineData() { testfailed = needsterminal = copiousoutput = FALSE; }
+    MailcapLineData() { testfailed = needsterminal = copiousoutput = false; }
 };
 
 // process a non-standard (i.e. not the first or second one) mailcap field
@@ -2261,7 +2413,7 @@ wxMimeTypesManagerImpl::ProcessOtherMailcapField(MailcapLineData& data,
     if ( curField.empty() )
     {
         // we don't care
-        return TRUE;
+        return true;
     }
 
     // is this something of the form foo=bar?
@@ -2272,8 +2424,8 @@ wxMimeTypesManagerImpl::ProcessOtherMailcapField(MailcapLineData& data,
         wxString lhs = curField.BeforeFirst(wxT('=')),
                  rhs = curField.AfterFirst(wxT('='));
 
-        lhs.Trim(TRUE);     // from right
-        rhs.Trim(FALSE);    // from left
+        lhs.Trim(true);     // from right
+        rhs.Trim(false);    // from left
 
         // it might be quoted
         if ( !rhs.empty() && rhs[0u] == wxT('"') && rhs.Last() == wxT('"') )
@@ -2298,7 +2450,7 @@ wxMimeTypesManagerImpl::ProcessOtherMailcapField(MailcapLineData& data,
                            wxT("Test '%s' for mime type '%s' failed, skipping."),
                            rhs.c_str(), data.type.c_str());
 
-                data.testfailed = TRUE;
+                data.testfailed = true;
             }
         }
         else if ( lhs == wxT("desc") )
@@ -2324,21 +2476,21 @@ wxMimeTypesManagerImpl::ProcessOtherMailcapField(MailcapLineData& data,
         // so it must be a simple flag
         if ( curField == wxT("needsterminal") )
         {
-            data.needsterminal = TRUE;
+            data.needsterminal = true;
         }
         else if ( curField == wxT("copiousoutput"))
         {
             // copiousoutput impies that the viewer is a console program
             data.needsterminal =
-            data.copiousoutput = TRUE;
+            data.copiousoutput = true;
         }
         else if ( !IsKnownUnimportantField(curField) )
         {
-            return FALSE;
+            return false;
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
@@ -2353,7 +2505,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
 #else
     if ( !file.Open() )
 #endif
-        return FALSE;
+        return false;
 
     // indices of MIME types (in m_aTypes) we already found in this file
     //
@@ -2396,7 +2548,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
         // the flags and field values on the current line
         MailcapLineData data;
 
-        bool cont = TRUE;
+        bool cont = true;
         while ( cont )
         {
             switch ( *pc )
@@ -2410,11 +2562,9 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
                         if ( nLine == nLineCount - 1 )
                         {
                             // something is wrong, bail out
-                            cont = FALSE;
+                            cont = false;
 
-                            wxLogDebug(wxT("Mailcap file %s, line %lu: "
-                                           "'\\' on the end of the last line "
-                                           "ignored."),
+                            wxLogDebug(wxT("Mailcap file %s, line %lu: '\\' on the end of the last line ignored."),
                                        strFileName.c_str(),
                                        (unsigned long)nLine + 1);
                         }
@@ -2435,13 +2585,13 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
                     break;
 
                 case wxT('\0'):
-                    cont = FALSE;   // end of line reached, exit the loop
+                    cont = false;   // end of line reached, exit the loop
 
                     // fall through to still process this field
 
                 case wxT(';'):
                     // trim whitespaces from both sides
-                    curField.Trim(TRUE).Trim(FALSE);
+                    curField.Trim(true).Trim(false);
 
                     switch ( currentToken )
                     {
@@ -2478,9 +2628,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
                                 // this might be useful for the programmer
                                 wxLogDebug
                                 (
-                                    wxT("Mailcap file %s, line %lu: "
-                                        "unknown field '%s' for the "
-                                        "MIME type '%s' ignored."),
+                                    wxT("Mailcap file %s, line %lu: unknown field '%s' for the MIME type '%s' ignored."),
                                     strFileName.c_str(),
                                     (unsigned long)nLine + 1,
                                     curField.c_str(),
@@ -2490,7 +2638,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
                             else if ( data.testfailed )
                             {
                                 // skip this entry entirely
-                                cont = FALSE;
+                                cont = false;
                             }
 
                             // it already has this value
@@ -2519,8 +2667,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
         // check that we really read something reasonable
         if ( currentToken < Field_Other )
         {
-            wxLogWarning(_("Mailcap file %s, line %d: incomplete entry "
-                           "ignored."),
+            wxLogWarning(_("Mailcap file %s, line %d: incomplete entry ignored."),
                          strFileName.c_str(), nLine + 1);
 
             continue;
@@ -2566,16 +2713,17 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
         // the fall back entries have the lowest priority, by definition
         if ( fallback )
         {
-            overwrite = FALSE;
+            overwrite = false;
         }
         else
         {
             // have we seen this one before?
             int nIndex = m_aTypes.Index(data.type);
 
-            // and if we have, was it in this file?
+            // and if we have, was it in this file? if not, we should
+            // overwrite the previously seen one
             overwrite = nIndex == wxNOT_FOUND ||
-                            aIndicesSeenHere.Index(nIndex) != wxNOT_FOUND;
+                            aIndicesSeenHere.Index(nIndex) == wxNOT_FOUND;
         }
 
         wxLogTrace(TRACE_MIME, _T("mailcap %s: %s [%s]"),
@@ -2598,7 +2746,7 @@ bool wxMimeTypesManagerImpl::ReadMailcap(const wxString& strFileName,
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 size_t wxMimeTypesManagerImpl::EnumAllFileTypes(wxArrayString& mimetypes)
@@ -2640,11 +2788,11 @@ bool wxMimeTypesManagerImpl::Unassociate(wxFileType *ft)
         if ( nIndex == wxNOT_FOUND)
         {
             // error if we get here ??
-            return FALSE;
+            return false;
         }
         else
         {
-            WriteMimeInfo(nIndex, TRUE );
+            WriteMimeInfo(nIndex, true );
             m_aTypes.RemoveAt(nIndex);
             m_aEntries.RemoveAt(nIndex);
             m_aExtensions.RemoveAt(nIndex);
@@ -2658,7 +2806,7 @@ bool wxMimeTypesManagerImpl::Unassociate(wxFileType *ft)
             m_aTypes.Count() == m_aIcons.Count() &&
             m_aTypes.Count() == m_aDescriptions.Count() );
 
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
@@ -2678,10 +2826,10 @@ static bool IsKnownUnimportantField(const wxString& fieldAll)
     for ( size_t n = 0; n < WXSIZEOF(knownFields); n++ )
     {
         if ( field.CmpNoCase(knownFields[n]) == 0 )
-            return TRUE;
+            return true;
     }
 
-    return FALSE;
+    return false;
 }
 
 #endif