Rearrange code to make adding wxMimeTypesManagerFactory
at runtim possible. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38172 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
1d115baf4b
commit
2b850ae1a5
@ -938,6 +938,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
||||
src/gtk/frame.cpp
|
||||
src/gtk/gauge.cpp
|
||||
src/gtk/gnome/gprint.cpp
|
||||
src/gtk/gnome/gvfs.cpp
|
||||
src/gtk/listbox.cpp
|
||||
src/gtk/mdi.cpp
|
||||
src/gtk/menu.cpp
|
||||
@ -982,6 +983,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
||||
wx/gtk/frame.h
|
||||
wx/gtk/gauge.h
|
||||
wx/gtk/gnome/gprint.h
|
||||
wx/gtk/gnome/gvfs.h
|
||||
wx/gtk/listbox.h
|
||||
wx/gtk/mdi.h
|
||||
wx/gtk/menu.h
|
||||
|
29
configure.in
29
configure.in
@ -401,6 +401,7 @@ if test $DEBUG_CONFIGURE = 1; then
|
||||
DEFAULT_wxUSE_LIBMSPACK=no
|
||||
DEFAULT_wxUSE_LIBSDL=no
|
||||
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
||||
DEFAULT_wxUSE_LIBGNOMEVFS=no
|
||||
DEFAULT_wxUSE_LIBHILDON=no
|
||||
DEFAULT_wxUSE_ODBC=no
|
||||
DEFAULT_wxUSE_OPENGL=no
|
||||
@ -604,6 +605,7 @@ else
|
||||
DEFAULT_wxUSE_LIBMSPACK=yes
|
||||
DEFAULT_wxUSE_LIBSDL=no
|
||||
DEFAULT_wxUSE_LIBGNOMEPRINT=no
|
||||
DEFAULT_wxUSE_LIBGNOMEVFS=no
|
||||
DEFAULT_wxUSE_LIBHILDON=no
|
||||
DEFAULT_wxUSE_ODBC=no
|
||||
DEFAULT_wxUSE_OPENGL=no
|
||||
@ -830,7 +832,8 @@ WX_ARG_SYS_WITH(libtiff, [ --with-libtiff use libtiff (TIFF file for
|
||||
WX_ARG_SYS_WITH(libxpm, [ --with-libxpm use libxpm (XPM file format)], wxUSE_LIBXPM)
|
||||
WX_ARG_WITH(libmspack, [ --with-libmspack use libmspack (CHM help files loading)], wxUSE_LIBMSPACK)
|
||||
WX_ARG_WITH(sdl, [ --with-sdl use SDL for audio on Unix], wxUSE_LIBSDL)
|
||||
WX_ARG_WITH(gnomeprint, [ --with-gnomeprint use GNOME print for printing under Unix], wxUSE_LIBGNOMEPRINT)
|
||||
WX_ARG_WITH(gnomeprint, [ --with-gnomeprint use GNOME print for printing under GNOME], wxUSE_LIBGNOMEPRINT)
|
||||
WX_ARG_WITH(gnomevfs, [ --with-gnomevfs use GNOME VFS for associating MIME types], wxUSE_LIBGNOMEVFS)
|
||||
WX_ARG_WITH(hildon, [ --with-hildon use Hildon framework for Nokia 770], wxUSE_LIBHILDON)
|
||||
WX_ARG_WITH(opengl, [ --with-opengl use OpenGL (or Mesa)], wxUSE_OPENGL)
|
||||
|
||||
@ -5400,6 +5403,26 @@ dnl EXTRALIBS_GNOMEPRINT="$LIBGNOMEPRINTUI_LIBS"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$WXGTK20" = 1; then
|
||||
if test "$wxUSE_MIMETYPE" = "yes" ; then
|
||||
if test "$wxUSE_LIBGNOMEVFS" = "yes" ; then
|
||||
|
||||
PKG_CHECK_MODULES(GNOMEVFS,
|
||||
[gnome-vfs-2.0 >= 2.0],
|
||||
[
|
||||
dnl EXTRALIBS_GNOMEVFS="$LIBGNOMEVFS_LIBS"
|
||||
CXXFLAGS="$GNOMEVFS_CFLAGS $CXXFLAGS"
|
||||
AC_DEFINE(wxUSE_LIBGNOMEVFS)
|
||||
],
|
||||
[
|
||||
AC_MSG_WARN([libgnomevfs not found, library won't be able to associate MIME type])
|
||||
wxUSE_LIBGNOMEVFS="no"
|
||||
]
|
||||
)
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$WXGTK20" = 1; then
|
||||
if test "$wxUSE_LIBHILDON" = "yes" ; then
|
||||
PKG_CHECK_MODULES(HILDON,
|
||||
@ -7083,7 +7106,7 @@ EXTRALIBS_XML="$EXPAT_LINK"
|
||||
EXTRALIBS_HTML="$MSPACK_LINK"
|
||||
EXTRALIBS_ODBC="$ODBC_LINK"
|
||||
if test "$wxUSE_GUI" = "yes"; then
|
||||
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $PNG_LINK $JPEG_LINK $TIFF_LINK $WEBKIT_LINK $EXTRALIBS_HILDON $EXTRALIBS_GNOMEPRINT`
|
||||
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $PNG_LINK $JPEG_LINK $TIFF_LINK $WEBKIT_LINK $EXTRALIBS_HILDON $EXTRALIBS_GNOMEVFS $EXTRALIBS_GNOMEPRINT`
|
||||
fi
|
||||
if test "$wxUSE_OPENGL" = "yes"; then
|
||||
EXTRALIBS_OPENGL="$LDFLAGS_GL $OPENGL_LIBS"
|
||||
@ -7183,6 +7206,7 @@ AC_SUBST(EXTRALIBS_OPENGL)
|
||||
AC_SUBST(EXTRALIBS_SDL)
|
||||
AC_SUBST(WITH_PLUGIN_SDL)
|
||||
AC_SUBST(EXTRALIBS_GNOMEPRINT)
|
||||
AC_SUBST(EXTRALIBS_GNOMEVFS)
|
||||
AC_SUBST(EXTRALIBS_HILDON)
|
||||
AC_SUBST(UNICODE)
|
||||
AC_SUBST(BUILD)
|
||||
@ -7528,6 +7552,7 @@ echo " expat ${wxUSE_EXPAT}"
|
||||
echo " libmspack ${wxUSE_LIBMSPACK}"
|
||||
echo " sdl ${wxUSE_LIBSDL}"
|
||||
echo " gnomeprint ${wxUSE_LIBGNOMEPRINT-none}"
|
||||
echo " gnomevfs ${wxUSE_LIBGNOMEVFS-none}"
|
||||
echo " hildon ${wxUSE_LIBHILDON-none}"
|
||||
|
||||
echo ""
|
||||
|
@ -24,6 +24,7 @@
|
||||
// the things we really need
|
||||
#include "wx/string.h"
|
||||
#include "wx/dynarray.h"
|
||||
#include "wx/arrstr.h"
|
||||
|
||||
// fwd decls
|
||||
class WXDLLIMPEXP_BASE wxIconLocation;
|
||||
@ -66,6 +67,80 @@ public:
|
||||
|
||||
*/
|
||||
|
||||
// wxMimeTypeCommands stores the verbs defined for the given MIME type with
|
||||
// their values
|
||||
class WXDLLIMPEXP_BASE wxMimeTypeCommands
|
||||
{
|
||||
public:
|
||||
wxMimeTypeCommands() {}
|
||||
|
||||
wxMimeTypeCommands(const wxArrayString& verbs,
|
||||
const wxArrayString& commands)
|
||||
: m_verbs(verbs),
|
||||
m_commands(commands)
|
||||
{
|
||||
}
|
||||
|
||||
// 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 */);
|
||||
if ( n == wxNOT_FOUND )
|
||||
{
|
||||
m_verbs.Add(verb);
|
||||
m_commands.Add(cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_commands[n] = cmd;
|
||||
}
|
||||
}
|
||||
|
||||
void Add(const wxString& s)
|
||||
{
|
||||
m_verbs.Add(s.BeforeFirst(wxT('=')));
|
||||
m_commands.Add(s.AfterFirst(wxT('=')));
|
||||
}
|
||||
|
||||
// access the commands
|
||||
size_t GetCount() const { return m_verbs.GetCount(); }
|
||||
const wxString& GetVerb(size_t n) const { return m_verbs[n]; }
|
||||
const wxString& GetCmd(size_t n) const { return m_commands[n]; }
|
||||
|
||||
bool HasVerb(const wxString& verb) const
|
||||
{ return m_verbs.Index(verb) != wxNOT_FOUND; }
|
||||
|
||||
wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const
|
||||
{
|
||||
wxString s;
|
||||
|
||||
int n = m_verbs.Index(verb);
|
||||
if ( n != wxNOT_FOUND )
|
||||
{
|
||||
s = m_commands[(size_t)n];
|
||||
if ( idx )
|
||||
*idx = n;
|
||||
}
|
||||
else if ( idx )
|
||||
{
|
||||
// different from any valid index
|
||||
*idx = (size_t)-1;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
// get a "verb=command" string
|
||||
wxString GetVerbCmd(size_t n) const
|
||||
{
|
||||
return m_verbs[n] + wxT('=') + m_commands[n];
|
||||
}
|
||||
|
||||
private:
|
||||
wxArrayString m_verbs;
|
||||
wxArrayString m_commands;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxFileTypeInfo: static container of information accessed via wxFileType.
|
||||
//
|
||||
@ -269,6 +344,25 @@ private:
|
||||
wxFileTypeImpl *m_impl;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// wxMimeTypesManagerFactory
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
class WXDLLIMPEXP_BASE wxMimeTypesManagerFactory
|
||||
{
|
||||
public:
|
||||
wxMimeTypesManagerFactory() {}
|
||||
virtual ~wxMimeTypesManagerFactory() {}
|
||||
|
||||
virtual wxMimeTypesManagerImpl *CreateMimeTypesManagerImpl();
|
||||
|
||||
static void SetFactory( wxMimeTypesManagerFactory *factory );
|
||||
static wxMimeTypesManagerFactory *GetFactory();
|
||||
|
||||
private:
|
||||
static wxMimeTypesManagerFactory *m_factory;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMimeTypesManager: interface to system MIME database.
|
||||
//
|
||||
|
@ -26,7 +26,7 @@ class WXDLLEXPORT wxMimeTypesManagerImpl
|
||||
public:
|
||||
// ctor and dtor
|
||||
wxMimeTypesManagerImpl();
|
||||
~wxMimeTypesManagerImpl();
|
||||
virtual ~wxMimeTypesManagerImpl();
|
||||
|
||||
// load all data into memory - done when it is needed for the first time
|
||||
void Initialize(int mailcapStyles = wxMAILCAP_ALL,
|
||||
@ -66,7 +66,7 @@ public:
|
||||
// file type
|
||||
wxString GetExtension(size_t index) { return m_aExtensions[index]; }
|
||||
|
||||
private:
|
||||
protected:
|
||||
void InitIfNeeded();
|
||||
|
||||
wxArrayString m_aTypes, // MIME types
|
||||
@ -94,11 +94,6 @@ private:
|
||||
const wxArrayString& dirs);
|
||||
void GetGnomeMimeInfo(const wxString& sExtraDir);
|
||||
|
||||
// write gnome files
|
||||
bool CheckGnomeDirsExist();
|
||||
bool WriteGnomeKeyFile(int index, bool delete_index);
|
||||
bool WriteGnomeMimeFile(int index, bool delete_index);
|
||||
|
||||
// read KDE
|
||||
void LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
||||
const wxString& subdir,
|
||||
@ -127,20 +122,20 @@ private:
|
||||
|
||||
// functions used to do associations
|
||||
|
||||
int AddToMimeData(const wxString& strType,
|
||||
virtual int AddToMimeData(const wxString& strType,
|
||||
const wxString& strIcon,
|
||||
wxMimeTypeCommands *entry,
|
||||
const wxArrayString& strExtensions,
|
||||
const wxString& strDesc,
|
||||
bool replaceExisting = TRUE);
|
||||
|
||||
bool DoAssociation(const wxString& strType,
|
||||
virtual bool DoAssociation(const wxString& strType,
|
||||
const wxString& strIcon,
|
||||
wxMimeTypeCommands *entry,
|
||||
const wxArrayString& strExtensions,
|
||||
const wxString& strDesc);
|
||||
|
||||
bool WriteMimeInfo(int nIndex, bool delete_mime );
|
||||
virtual bool WriteMimeInfo(int nIndex, bool delete_mime );
|
||||
|
||||
// give it access to m_aXXX variables
|
||||
friend class WXDLLEXPORT wxFileTypeImpl;
|
||||
|
@ -602,6 +602,10 @@
|
||||
* Use GNOME print for printing under GTK+ 2.0
|
||||
*/
|
||||
#define wxUSE_LIBGNOMEPRINT 0
|
||||
/*
|
||||
* Use GNOME VFS for MIME types
|
||||
*/
|
||||
#define wxUSE_LIBGNOMEVFS 0
|
||||
/*
|
||||
* Use the Hildon framework
|
||||
*/
|
||||
|
@ -453,6 +453,34 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index)
|
||||
#endif
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// wxMimeTypesManagerFactory
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::m_factory = NULL;
|
||||
|
||||
/* static */
|
||||
void wxMimeTypesManagerFactory::SetFactory( wxMimeTypesManagerFactory *factory )
|
||||
{
|
||||
if (wxMimeTypesManagerFactory::m_factory)
|
||||
delete wxMimeTypesManagerFactory::m_factory;
|
||||
|
||||
wxMimeTypesManagerFactory::m_factory = factory;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::GetFactory()
|
||||
{
|
||||
if (!wxMimeTypesManagerFactory::m_factory)
|
||||
wxMimeTypesManagerFactory::m_factory = new wxMimeTypesManagerFactory;
|
||||
|
||||
return wxMimeTypesManagerFactory::m_factory;
|
||||
}
|
||||
|
||||
wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl()
|
||||
{
|
||||
return new wxMimeTypesManagerImpl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMimeTypesManager
|
||||
@ -461,7 +489,7 @@ bool wxFileType::SetDefaultIcon(const wxString& cmd, int index)
|
||||
void wxMimeTypesManager::EnsureImpl()
|
||||
{
|
||||
if ( !m_impl )
|
||||
m_impl = new wxMimeTypesManagerImpl;
|
||||
m_impl = wxMimeTypesManagerFactory::GetFactory()->CreateMimeTypesManagerImpl();
|
||||
}
|
||||
|
||||
bool wxMimeTypesManager::IsOfType(const wxString& mimeType,
|
||||
|
@ -78,6 +78,15 @@
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// link GnomeVFS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_LIBGNOMEVFS
|
||||
#include "wx/html/forcelnk.h"
|
||||
FORCE_LINK(gnome_vfs)
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// global data
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -62,6 +62,9 @@
|
||||
|
||||
#include "wx/unix/mimetype.h"
|
||||
|
||||
// Not GUI dependent
|
||||
#include "wx/gtk/gnome/gvfs.h"
|
||||
|
||||
// other standard headers
|
||||
#include <ctype.h>
|
||||
|
||||
@ -70,80 +73,6 @@
|
||||
# pragma message disable unscomzer
|
||||
#endif
|
||||
|
||||
// wxMimeTypeCommands stores the verbs defined for the given MIME type with
|
||||
// their values
|
||||
class wxMimeTypeCommands
|
||||
{
|
||||
public:
|
||||
wxMimeTypeCommands() {}
|
||||
|
||||
wxMimeTypeCommands(const wxArrayString& verbs,
|
||||
const wxArrayString& commands)
|
||||
: m_verbs(verbs),
|
||||
m_commands(commands)
|
||||
{
|
||||
}
|
||||
|
||||
// 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 */);
|
||||
if ( n == wxNOT_FOUND )
|
||||
{
|
||||
m_verbs.Add(verb);
|
||||
m_commands.Add(cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_commands[n] = cmd;
|
||||
}
|
||||
}
|
||||
|
||||
void Add(const wxString& s)
|
||||
{
|
||||
m_verbs.Add(s.BeforeFirst(wxT('=')));
|
||||
m_commands.Add(s.AfterFirst(wxT('=')));
|
||||
}
|
||||
|
||||
// access the commands
|
||||
size_t GetCount() const { return m_verbs.GetCount(); }
|
||||
const wxString& GetVerb(size_t n) const { return m_verbs[n]; }
|
||||
const wxString& GetCmd(size_t n) const { return m_commands[n]; }
|
||||
|
||||
bool HasVerb(const wxString& verb) const
|
||||
{ return m_verbs.Index(verb) != wxNOT_FOUND; }
|
||||
|
||||
wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const
|
||||
{
|
||||
wxString s;
|
||||
|
||||
int n = m_verbs.Index(verb);
|
||||
if ( n != wxNOT_FOUND )
|
||||
{
|
||||
s = m_commands[(size_t)n];
|
||||
if ( idx )
|
||||
*idx = n;
|
||||
}
|
||||
else if ( idx )
|
||||
{
|
||||
// different from any valid index
|
||||
*idx = (size_t)-1;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
// get a "verb=command" string
|
||||
wxString GetVerbCmd(size_t n) const
|
||||
{
|
||||
return m_verbs[n] + wxT('=') + m_commands[n];
|
||||
}
|
||||
|
||||
private:
|
||||
wxArrayString m_verbs;
|
||||
wxArrayString m_commands;
|
||||
};
|
||||
|
||||
// this class extends wxTextFile
|
||||
//
|
||||
// VZ: ???
|
||||
@ -349,200 +278,10 @@ static bool IsKnownUnimportantField(const wxString& field);
|
||||
// 1. xxx.keys files under /usr/share/mime-info
|
||||
// 2. xxx.keys files under ~/.gnome/mime-info
|
||||
//
|
||||
// The format of xxx.keys file is the following:
|
||||
//
|
||||
// mimetype/subtype:
|
||||
// field=value
|
||||
//
|
||||
// with blank lines separating the entries and indented lines starting with
|
||||
// TABs. We're interested in the field icon-filename whose value is the path
|
||||
// containing the icon.
|
||||
//
|
||||
// Update (Chris Elliott): apparently there may be an optional "[lang]" prefix
|
||||
// just before the field name.
|
||||
|
||||
|
||||
bool wxMimeTypesManagerImpl::CheckGnomeDirsExist()
|
||||
{
|
||||
wxString gnomedir;
|
||||
wxGetHomeDir( &gnomedir );
|
||||
wxString sTmp = gnomedir;
|
||||
sTmp = sTmp + wxT("/.gnome");
|
||||
if (! wxDir::Exists( sTmp ) )
|
||||
{
|
||||
if (!wxMkdir( sTmp ))
|
||||
{
|
||||
wxLogError(wxT("Failed to create directory %s/.gnome."), sTmp.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
sTmp = sTmp + wxT("/mime-info");
|
||||
if (! wxDir::Exists( sTmp ) )
|
||||
{
|
||||
if (!wxMkdir( sTmp ))
|
||||
{
|
||||
wxLogError(wxT("Failed to create directory %s/mime-info."), sTmp.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wxMimeTypesManagerImpl::WriteGnomeKeyFile(int index, bool delete_index)
|
||||
{
|
||||
wxString gnomedir;
|
||||
wxGetHomeDir( &gnomedir );
|
||||
|
||||
wxMimeTextFile outfile( gnomedir + wxT("/.gnome/mime-info/user.keys"));
|
||||
// if this fails probably Gnome is not installed ??
|
||||
// create it anyway as a private mime store
|
||||
|
||||
#if defined(__WXGTK20__) && wxUSE_UNICODE
|
||||
if (! outfile.Open( wxConvUTF8) )
|
||||
#else
|
||||
if (! outfile.Open() )
|
||||
#endif
|
||||
{
|
||||
if (delete_index)
|
||||
return false;
|
||||
if (!CheckGnomeDirsExist() )
|
||||
return false;
|
||||
|
||||
outfile.Create();
|
||||
}
|
||||
|
||||
wxString sTmp, strType = m_aTypes[index];
|
||||
int nIndex = outfile.pIndexOf(strType);
|
||||
if ( nIndex == wxNOT_FOUND )
|
||||
{
|
||||
outfile.AddLine( strType + wxT(':') );
|
||||
// see file:/usr/doc/gnome-libs-devel-1.0.40/devel-docs/mime-type-handling.txt
|
||||
// as this does not deal with internationalisation
|
||||
// wxT( "\t[en_US]") + verb + wxT ('=') + cmd + wxT(" %f");
|
||||
wxMimeTypeCommands * entries = m_aEntries[index];
|
||||
size_t count = entries->GetCount();
|
||||
for ( size_t i = 0; i < count; i++ )
|
||||
{
|
||||
sTmp = entries->GetVerbCmd( i );
|
||||
sTmp.Replace( wxT("%s"), wxT("%f") );
|
||||
sTmp = wxT( "\t") + sTmp;
|
||||
outfile.AddLine( sTmp );
|
||||
}
|
||||
|
||||
//for international use do something like this
|
||||
//outfile.AddLine( wxString( "\t[en_US]icon-filename=") + cmd );
|
||||
outfile.AddLine( wxT( "\ticon-filename=") + m_aIcons[index] );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (delete_index)
|
||||
outfile.CommentLine(nIndex);
|
||||
|
||||
wxMimeTypeCommands sOld;
|
||||
size_t nOld = nIndex + 1;
|
||||
bool oldEntryEnd = false;
|
||||
while ( (nOld < outfile.GetLineCount() ) && !oldEntryEnd)
|
||||
{
|
||||
sTmp = outfile.GetLine(nOld);
|
||||
if ( (sTmp[0u] == wxT('\t')) || (sTmp[0u] == wxT('#')) )
|
||||
{
|
||||
// we have another line to deal with
|
||||
outfile.CommentLine(nOld);
|
||||
nOld++;
|
||||
|
||||
// add the line to our store
|
||||
if ((!delete_index) && (sTmp[0u] == wxT('\t')))
|
||||
sOld.Add(sTmp);
|
||||
}
|
||||
// next mimetpye ?? or blank line
|
||||
else
|
||||
oldEntryEnd = true;
|
||||
}
|
||||
|
||||
// list of entries in our data; these should all be in sOld,
|
||||
// though sOld may also contain other entries , eg flags
|
||||
if (!delete_index)
|
||||
{
|
||||
wxMimeTypeCommands * entries = m_aEntries[index];
|
||||
size_t i;
|
||||
for (i=0; i < entries->GetCount(); i++)
|
||||
{
|
||||
// replace any entries in sold that match verbs we know
|
||||
sOld.AddOrReplaceVerb( entries->GetVerb(i), entries->GetCmd(i) );
|
||||
}
|
||||
|
||||
//sOld should also contain the icon
|
||||
if ( !m_aIcons[index].empty() )
|
||||
sOld.AddOrReplaceVerb( wxT("icon-filename"), m_aIcons[index] );
|
||||
|
||||
for (i=0; i < sOld.GetCount(); i++)
|
||||
{
|
||||
sTmp = sOld.GetVerbCmd( i );
|
||||
sTmp.Replace( wxT("%s"), wxT("%f") );
|
||||
sTmp = wxT("\t") + sTmp;
|
||||
nIndex++;
|
||||
outfile.InsertLine( sTmp, nIndex );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool bTmp = outfile.Write();
|
||||
return bTmp;
|
||||
}
|
||||
|
||||
bool wxMimeTypesManagerImpl::WriteGnomeMimeFile(int index, bool delete_index)
|
||||
{
|
||||
wxString gnomedir;
|
||||
wxGetHomeDir( &gnomedir );
|
||||
|
||||
wxMimeTextFile outfile( gnomedir + wxT("/.gnome/mime-info/user.mime") );
|
||||
// if this fails probably Gnome is not installed ??
|
||||
// create it anyway as a private mime store
|
||||
if (! outfile.Open() )
|
||||
{
|
||||
if (delete_index)
|
||||
return false;
|
||||
if (!CheckGnomeDirsExist() )
|
||||
return false;
|
||||
|
||||
outfile.Create();
|
||||
}
|
||||
|
||||
wxString strType = m_aTypes[index];
|
||||
int nIndex = outfile.pIndexOf(strType);
|
||||
if ( nIndex == wxNOT_FOUND )
|
||||
{
|
||||
outfile.AddLine( strType );
|
||||
outfile.AddLine( wxT("\text:") + m_aExtensions.Item(index) );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (delete_index)
|
||||
{
|
||||
outfile.CommentLine(nIndex);
|
||||
outfile.CommentLine(nIndex + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// check for next line being the right one to replace ??
|
||||
wxString sOld = outfile.GetLine(nIndex + 1);
|
||||
if (sOld.Contains( wxT("\text: ") ))
|
||||
{
|
||||
outfile.GetLine(nIndex + 1) = wxT("\text: ") + m_aExtensions.Item(index);
|
||||
}
|
||||
else
|
||||
{
|
||||
outfile.InsertLine( wxT("\text: ") + m_aExtensions.Item(index), nIndex + 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool bTmp = outfile.Write();
|
||||
return bTmp;
|
||||
}
|
||||
|
||||
void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
||||
const wxArrayString& dirs)
|
||||
{
|
||||
@ -557,11 +296,12 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
||||
wxLogTrace(TRACE_MIME, wxT("--- Opened Gnome file %s ---"),
|
||||
filename.c_str());
|
||||
|
||||
wxArrayString search_dirs( dirs );
|
||||
|
||||
// values for the entry being parsed
|
||||
wxString curMimeType, curIconFile;
|
||||
wxMimeTypeCommands * entry = new wxMimeTypeCommands;
|
||||
|
||||
// these are always empty in this file
|
||||
wxArrayString strExtensions;
|
||||
wxString strDesc;
|
||||
|
||||
@ -576,53 +316,83 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
||||
|
||||
wxLogTrace(TRACE_MIME, wxT("--- Reading from Gnome file %s '%s' ---"),
|
||||
filename.c_str(), pc);
|
||||
|
||||
// trim trailing space and tab
|
||||
while ((*pc == wxT(' ')) || (*pc == wxT('\t')))
|
||||
pc++;
|
||||
|
||||
wxString sTmp(pc);
|
||||
if (sTmp.Contains(wxT("=")) )
|
||||
int equal_pos = sTmp.Find( wxT('=') );
|
||||
if (equal_pos > 0)
|
||||
{
|
||||
if (sTmp.Contains( wxT("icon-filename=") ) )
|
||||
{
|
||||
// GNOME 1:
|
||||
curIconFile = sTmp.AfterFirst(wxT('='));
|
||||
}
|
||||
else if (sTmp.Contains( wxT("icon_filename=") ) )
|
||||
wxString left_of_equal = sTmp.Left( equal_pos );
|
||||
const wxChar *right_of_equal = pc;
|
||||
right_of_equal += equal_pos+1;
|
||||
|
||||
if (left_of_equal == wxT("icon_filename"))
|
||||
{
|
||||
// GNOME 2:
|
||||
curIconFile = sTmp.AfterFirst(wxT('='));
|
||||
|
||||
if (!wxFileExists(curIconFile))
|
||||
curIconFile = right_of_equal;
|
||||
|
||||
wxFileName newFile( curIconFile );
|
||||
if (newFile.IsRelative() || newFile.FileExists())
|
||||
{
|
||||
size_t nDirs = dirs.GetCount();
|
||||
size_t nDirs = search_dirs.GetCount();
|
||||
|
||||
for (size_t nDir = 0; nDir < nDirs; nDir++)
|
||||
{
|
||||
wxFileName newFile( curIconFile );
|
||||
newFile.SetPath( dirs[nDir] );
|
||||
newFile.SetPath( search_dirs[nDir] );
|
||||
newFile.AppendDir( wxT("pixmaps") );
|
||||
newFile.AppendDir( wxT("document-icons") );
|
||||
newFile.SetExt( wxT("png") );
|
||||
if (newFile.FileExists())
|
||||
{
|
||||
curIconFile = newFile.GetFullPath();
|
||||
// reorder search_dirs for speedup (fewer
|
||||
// calls to FileExist() required)
|
||||
if (nDir != 0)
|
||||
{
|
||||
wxString tmp = search_dirs[nDir];
|
||||
search_dirs.RemoveAt( nDir );
|
||||
search_dirs.Insert( tmp, 0 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else //: some other field,
|
||||
else if (left_of_equal == wxT("open"))
|
||||
{
|
||||
//may contain lines like this (RH7)
|
||||
// \t[lang]open.tex."TeX this file"=tex %f
|
||||
// \tflags.tex.flags=needsterminal
|
||||
// \topen.latex."LaTeX this file"=latex %f
|
||||
// \tflags.latex.flags=needsterminal
|
||||
|
||||
// \topen=xdvi %f
|
||||
// \tview=xdvi %f
|
||||
// \topen.convert.Convert file to Postscript=dvips %f -o `basename %f .dvi`.ps
|
||||
|
||||
// for now ignore lines with flags in...FIX
|
||||
sTmp = sTmp.AfterLast(wxT(']'));
|
||||
sTmp = sTmp.AfterLast(wxT('\t'));
|
||||
sTmp.Trim(false).Trim();
|
||||
if (0 == sTmp.Replace( wxT("%f"), wxT("%s") ))
|
||||
sTmp = sTmp + wxT(" %s");
|
||||
sTmp = right_of_equal;
|
||||
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||
sTmp.Prepend( wxT("open=") );
|
||||
entry->Add(sTmp);
|
||||
}
|
||||
else if (left_of_equal == wxT("view"))
|
||||
{
|
||||
sTmp = right_of_equal;
|
||||
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||
sTmp.Prepend( wxT("view=") );
|
||||
entry->Add(sTmp);
|
||||
}
|
||||
else if (left_of_equal == wxT("print"))
|
||||
{
|
||||
sTmp = right_of_equal;
|
||||
sTmp.Replace( wxT("%f"), wxT("%s") );
|
||||
sTmp.Prepend( wxT("print=") );
|
||||
entry->Add(sTmp);
|
||||
}
|
||||
else if (left_of_equal == wxT("description"))
|
||||
{
|
||||
strDesc = right_of_equal;
|
||||
}
|
||||
else if (left_of_equal == wxT("short_list_application_ids_for_novice_user_level"))
|
||||
{
|
||||
sTmp = right_of_equal;
|
||||
if (sTmp.Contains( wxT(",") ))
|
||||
sTmp = sTmp.BeforeFirst( wxT(',') );
|
||||
sTmp.Prepend( wxT("open=") );
|
||||
sTmp.Append( wxT(" %s") );
|
||||
entry->Add(sTmp);
|
||||
}
|
||||
|
||||
@ -1544,19 +1314,15 @@ void wxMimeTypesManagerImpl::InitIfNeeded()
|
||||
{
|
||||
// set the flag first to prevent recursion
|
||||
m_initialized = true;
|
||||
|
||||
#if 1
|
||||
Initialize();
|
||||
#else
|
||||
|
||||
wxString wm = wxGetenv( wxT("WINDOWMANAGER") );
|
||||
|
||||
if (wm.Find( wxT("kde") ) != wxNOT_FOUND)
|
||||
Initialize( wxMAILCAP_KDE | wxMAILCAP_STANDARD );
|
||||
Initialize( wxMAILCAP_KDE );
|
||||
else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND)
|
||||
Initialize( wxMAILCAP_GNOME | wxMAILCAP_STANDARD );
|
||||
Initialize( wxMAILCAP_GNOME );
|
||||
else
|
||||
Initialize();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -2003,7 +1769,7 @@ bool wxMimeTypesManagerImpl::DoAssociation(const wxString& strType,
|
||||
const wxString& strDesc)
|
||||
{
|
||||
int nIndex = AddToMimeData(strType, strIcon, entry, strExtensions, strDesc, true);
|
||||
|
||||
|
||||
if ( nIndex == wxNOT_FOUND )
|
||||
return false;
|
||||
|
||||
@ -2030,13 +1796,8 @@ bool wxMimeTypesManagerImpl::WriteMimeInfo(int nIndex, bool delete_mime )
|
||||
ok = false;
|
||||
}
|
||||
|
||||
if (m_mailcapStylesInited & wxMAILCAP_GNOME)
|
||||
{
|
||||
// write in Gnome format;
|
||||
if (WriteGnomeMimeFile(nIndex, delete_mime) )
|
||||
if (WriteGnomeKeyFile(nIndex, delete_mime) )
|
||||
ok = false;
|
||||
}
|
||||
// Don't write GNOME files here as this is not
|
||||
// allowed and simply doesn't work
|
||||
|
||||
if (m_mailcapStylesInited & wxMAILCAP_KDE)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user