applied MIME patch(es) from Chris Elliott
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -32,6 +32,18 @@ class WXDLLEXPORT wxIcon;
|
||||
class WXDLLEXPORT wxFileTypeImpl;
|
||||
class WXDLLEXPORT wxMimeTypesManagerImpl;
|
||||
|
||||
// these constants define the MIME informations source under UNIX and are used
|
||||
// by wxMimeTypesManager::Initialize()
|
||||
enum wxMailcapStyle
|
||||
{
|
||||
wxMAILCAP_STANDARD = 1,
|
||||
wxMAILCAP_NETSCAPE = 2,
|
||||
wxMAILCAP_KDE = 4,
|
||||
wxMAILCAP_GNOME = 8,
|
||||
|
||||
wxMAILCAP_ALL = 15
|
||||
};
|
||||
|
||||
/*
|
||||
TODO: would it be more convenient to have this class?
|
||||
|
||||
@@ -75,6 +87,10 @@ public:
|
||||
// extensions
|
||||
...);
|
||||
|
||||
// the array elements correspond to the parameters of the ctor above in
|
||||
// the same order
|
||||
wxFileTypeInfo(const wxArrayString& sArray);
|
||||
|
||||
// invalid item - use this to terminate the array passed to
|
||||
// wxMimeTypesManager::AddFallbacks
|
||||
wxFileTypeInfo() { }
|
||||
@@ -105,6 +121,7 @@ public:
|
||||
const wxString& GetDescription() const { return m_desc; }
|
||||
// get the array of all extensions
|
||||
const wxArrayString& GetExtensions() const { return m_exts; }
|
||||
int GetExtensionsCount() const {return m_exts.GetCount(); }
|
||||
// get the icon info
|
||||
const wxString& GetIconFile() const { return m_iconFile; }
|
||||
int GetIconIndex() const { return m_iconIndex; }
|
||||
@@ -122,6 +139,7 @@ private:
|
||||
|
||||
wxArrayString m_exts; // the extensions which are mapped on this filetype
|
||||
|
||||
|
||||
#if 0 // TODO
|
||||
// the additional (except "open" and "print") command names and values
|
||||
wxArrayString m_commandNames,
|
||||
@@ -210,6 +228,14 @@ public:
|
||||
size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands,
|
||||
const wxFileType::MessageParameters& params) const;
|
||||
|
||||
// set an arbitrary command, ask confirmation if it already exists and
|
||||
// overwriteprompt is TRUE
|
||||
bool SetCommand(const wxString& cmd, const wxString& verb,
|
||||
bool overwriteprompt = TRUE);
|
||||
|
||||
bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0);
|
||||
|
||||
|
||||
// remove the association for this filetype from the system MIME database:
|
||||
// notice that it will only work if the association is defined in the user
|
||||
// file/registry part, we will never modify the system-wide settings
|
||||
@@ -265,6 +291,20 @@ public:
|
||||
// ctor
|
||||
wxMimeTypesManager();
|
||||
|
||||
// NB: the following 2 functions are for Unix only and don't do anything
|
||||
// elsewhere
|
||||
|
||||
// loads data from standard files according to the mailcap styles
|
||||
// specified: this is a bitwise OR of wxMailcapStyle values
|
||||
//
|
||||
// use the extraDir parameter if you want to look for files in another
|
||||
// directory
|
||||
void Initialize(int mailcapStyle = wxMAILCAP_STANDARD,
|
||||
const wxString& extraDir = wxEmptyString);
|
||||
|
||||
// and this function clears all the data from the manager
|
||||
void ClearData();
|
||||
|
||||
// Database lookup: all functions return a pointer to wxFileType object
|
||||
// whose methods may be used to query it for the information you're
|
||||
// interested in. If the return value is !NULL, caller is responsible for
|
||||
@@ -276,6 +316,9 @@ public:
|
||||
|
||||
// other operations: return TRUE if there were no errors or FALSE if there
|
||||
// were some unreckognized entries (the good entries are always read anyhow)
|
||||
//
|
||||
// FIXME: These ought to be private ??
|
||||
|
||||
// read in additional file (the standard ones are read automatically)
|
||||
// in mailcap format (see mimetype.cpp for description)
|
||||
//
|
||||
@@ -283,6 +326,7 @@ public:
|
||||
// settings from other, previously parsed, files by this one: normally,
|
||||
// the files read most recently would override the older files, but with
|
||||
// fallback == TRUE this won't happen
|
||||
|
||||
bool ReadMailcap(const wxString& filename, bool fallback = FALSE);
|
||||
// read in additional file in mime.types format
|
||||
bool ReadMimeTypes(const wxString& filename);
|
||||
@@ -306,10 +350,11 @@ public:
|
||||
|
||||
// create a new association using the fields of wxFileTypeInfo (at least
|
||||
// the MIME type and the extension should be set)
|
||||
// if the other fields are empty, the existing values should be left alone
|
||||
wxFileType *Associate(const wxFileTypeInfo& ftInfo);
|
||||
|
||||
// undo Associate()
|
||||
bool Unassociate(wxFileType *ft) { return ft->Unassociate(); }
|
||||
bool Unassociate(wxFileType *ft) ;
|
||||
|
||||
// dtor (not virtual, shouldn't be derived from)
|
||||
~wxMimeTypesManager();
|
||||
@@ -342,5 +387,3 @@ WXDLLEXPORT_DATA(extern wxMimeTypesManager *) wxTheMimeTypesManager;
|
||||
|
||||
#endif
|
||||
//_WX_MIMETYPE_H_
|
||||
|
||||
/* vi: set cin tw=80 ts=4 sw=4: */
|
||||
|
@@ -54,18 +54,16 @@ public:
|
||||
|
||||
bool Unassociate();
|
||||
|
||||
// these methods are not publicly accessible (as wxMimeTypesManager
|
||||
// doesn't know about them), and generally not very useful - they could be
|
||||
// removed in the (near) future
|
||||
bool SetCommand(const wxString& cmd, const wxString& verb,
|
||||
bool overwriteprompt = true);
|
||||
bool SetMimeType(const wxString& mimeType);
|
||||
// set an arbitrary command, ask confirmation if it already exists and
|
||||
// overwriteprompt is TRUE
|
||||
bool SetCommand(const wxString& cmd,
|
||||
const wxString& verb,
|
||||
bool overwriteprompt = TRUE);
|
||||
|
||||
bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0);
|
||||
|
||||
bool RemoveOpenCommand();
|
||||
bool RemoveCommand(const wxString& verb);
|
||||
bool RemoveMimeType();
|
||||
bool RemoveDefaultIcon();
|
||||
// this is called by Associate
|
||||
bool SetDescription (const wxString& desc);
|
||||
|
||||
private:
|
||||
// helper function: reads the command corresponding to the specified verb
|
||||
@@ -81,6 +79,15 @@ private:
|
||||
|
||||
wxString m_strFileType, // may be empty
|
||||
m_ext;
|
||||
|
||||
// these methods are not publicly accessible (as wxMimeTypesManager
|
||||
// doesn't know about them), and should only be called by Unassociate
|
||||
|
||||
bool RemoveOpenCommand();
|
||||
bool RemoveCommand(const wxString& verb);
|
||||
bool RemoveMimeType();
|
||||
bool RemoveDefaultIcon();
|
||||
bool RemoveDescription();
|
||||
};
|
||||
|
||||
class WXDLLEXPORT wxMimeTypesManagerImpl
|
||||
@@ -97,7 +104,7 @@ public:
|
||||
|
||||
size_t EnumAllFileTypes(wxArrayString& mimetypes);
|
||||
|
||||
// this are NOPs under Windows
|
||||
// these are NOPs under Windows
|
||||
bool ReadMailcap(const wxString& filename, bool fallback = TRUE)
|
||||
{ return TRUE; }
|
||||
bool ReadMimeTypes(const wxString& filename)
|
||||
|
@@ -12,7 +12,6 @@
|
||||
#ifndef _MIMETYPE_IMPL_H
|
||||
#define _MIMETYPE_IMPL_H
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "mimetype.h"
|
||||
#endif
|
||||
@@ -21,11 +20,9 @@
|
||||
|
||||
#if (wxUSE_FILE && wxUSE_TEXTFILE)
|
||||
|
||||
class MailCapEntry;
|
||||
class wxMimeTypeIconHandler;
|
||||
class wxMimeArrayString;
|
||||
|
||||
WX_DEFINE_ARRAY(wxMimeTypeIconHandler *, ArrayIconHandlers);
|
||||
WX_DEFINE_ARRAY(MailCapEntry *, ArrayTypeEntries);
|
||||
WX_DEFINE_ARRAY(wxMimeArrayString *, wxArrayTypeEntries);
|
||||
|
||||
// this is the real wxMimeTypesManager for Unix
|
||||
class WXDLLEXPORT wxMimeTypesManagerImpl
|
||||
@@ -36,7 +33,11 @@ public:
|
||||
~wxMimeTypesManagerImpl();
|
||||
|
||||
// load all data into memory - done when it is needed for the first time
|
||||
void Initialize();
|
||||
void Initialize(int mailcapStyles,
|
||||
const wxString& extraDir = wxEmptyString);
|
||||
|
||||
// and delete the data here
|
||||
void ClearData();
|
||||
|
||||
// implement containing class functions
|
||||
wxFileType *GetFileTypeFromExtension(const wxString& ext);
|
||||
@@ -61,15 +62,14 @@ public:
|
||||
|
||||
// add a new record to the user .mailcap/.mime.types files
|
||||
wxFileType *Associate(const wxFileTypeInfo& ftInfo);
|
||||
// remove association
|
||||
bool Unassociate(wxFileType *ft);
|
||||
|
||||
// accessors
|
||||
// get the string containing space separated extensions for the given
|
||||
// file type
|
||||
wxString GetExtension(size_t index) { return m_aExtensions[index]; }
|
||||
|
||||
// get the array of icon handlers
|
||||
static ArrayIconHandlers& GetIconHandlers();
|
||||
|
||||
private:
|
||||
void InitIfNeeded()
|
||||
{
|
||||
@@ -82,14 +82,70 @@ private:
|
||||
|
||||
wxArrayString m_aTypes, // MIME types
|
||||
m_aDescriptions, // descriptions (just some text)
|
||||
m_aExtensions; // space separated list of extensions
|
||||
ArrayTypeEntries m_aEntries; // commands and tests for this file type
|
||||
m_aExtensions, // space separated list of extensions
|
||||
m_aIcons; // Icon filenames
|
||||
|
||||
// verb=command pairs for this file type
|
||||
wxArrayTypeEntries m_aEntries;
|
||||
|
||||
// are we initialized?
|
||||
bool m_initialized;
|
||||
|
||||
// head of the linked list of the icon handlers
|
||||
static ArrayIconHandlers ms_iconHandlers;
|
||||
// keep track of the files we had already loaded (this is a bitwise OR of
|
||||
// wxMailcapStyle values)
|
||||
int m_mailcapStylesInited;
|
||||
|
||||
wxString GetCommand(const wxString &verb, size_t nIndex) const;
|
||||
|
||||
// read Gnome files
|
||||
void LoadGnomeDataFromKeyFile(const wxString& filename);
|
||||
void LoadGnomeMimeTypesFromMimeFile(const wxString& filename);
|
||||
void LoadGnomeMimeFilesFromDir(const wxString& dirbase);
|
||||
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,
|
||||
const wxString& filename,
|
||||
const wxArrayString& icondirs);
|
||||
void LoadKDELinksForMimeType(const wxString& dirbase,
|
||||
const wxString& subdir,
|
||||
const wxArrayString& icondirs);
|
||||
void LoadKDELinkFilesFromDir(const wxString& dirbase,
|
||||
const wxArrayString& icondirs);
|
||||
void GetKDEMimeInfo(const wxString& sExtraDir);
|
||||
|
||||
// write KDE
|
||||
bool WriteKDEMimeFile(int index, bool delete_index);
|
||||
bool CheckKDEDirsExist(const wxString & sOK, const wxString& sTest);
|
||||
|
||||
//read write Netscape and MetaMail formats
|
||||
void GetMimeInfo (const wxString& sExtraDir);
|
||||
bool WriteToMailCap (int index, bool delete_index);
|
||||
bool WriteToMimeTypes (int index, bool delete_index);
|
||||
bool WriteToNSMimeTypes (int index, bool delete_index);
|
||||
|
||||
// functions used to do associations
|
||||
|
||||
int AddToMimeData(const wxString& strType,
|
||||
const wxString& strIcon,
|
||||
wxMimeArrayString *entry,
|
||||
const wxArrayString& strExtensions,
|
||||
const wxString& strDesc,
|
||||
bool replaceExisting = TRUE);
|
||||
|
||||
bool DoAssociation(const wxString& strType,
|
||||
const wxString& strIcon,
|
||||
wxMimeArrayString *entry,
|
||||
const wxArrayString& strExtensions,
|
||||
const wxString& strDesc);
|
||||
|
||||
bool WriteMimeInfo(int nIndex, bool delete_mime );
|
||||
|
||||
// give it access to m_aXXX variables
|
||||
friend class WXDLLEXPORT wxFileTypeImpl;
|
||||
@@ -101,6 +157,12 @@ class WXDLLEXPORT wxFileTypeImpl
|
||||
{
|
||||
public:
|
||||
// initialization functions
|
||||
// this is used to construct a list of mimetypes which match;
|
||||
// if built with GetFileTypeFromMimetype index 0 has the exact match and
|
||||
// index 1 the type / * match
|
||||
// if built with GetFileTypeFromExtension, index 0 has the mimetype for
|
||||
// the first extension found, index 1 for the second and so on
|
||||
|
||||
void Init(wxMimeTypesManagerImpl *manager, size_t index)
|
||||
{ m_manager = manager; m_index.Add(index); }
|
||||
|
||||
@@ -109,33 +171,47 @@ public:
|
||||
bool GetMimeType(wxString *mimeType) const
|
||||
{ *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; }
|
||||
bool GetMimeTypes(wxArrayString& mimeTypes) const;
|
||||
bool GetIcon(wxIcon *icon) const;
|
||||
bool GetIcon(wxIcon *icon, wxString *iconFile = NULL,
|
||||
int *iconIndex = NULL) const;
|
||||
|
||||
bool GetDescription(wxString *desc) const
|
||||
{ *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; }
|
||||
|
||||
bool GetOpenCommand(wxString *openCmd,
|
||||
const wxFileType::MessageParameters& params) const
|
||||
{
|
||||
return GetExpandedCommand(openCmd, params, TRUE);
|
||||
*openCmd = GetExpandedCommand(wxT("open"), params);
|
||||
return (! openCmd -> IsEmpty() );
|
||||
}
|
||||
|
||||
bool GetPrintCommand(wxString *printCmd,
|
||||
const wxFileType::MessageParameters& params) const
|
||||
{
|
||||
return GetExpandedCommand(printCmd, params, FALSE);
|
||||
*printCmd = GetExpandedCommand(wxT("print"), params);
|
||||
return (! printCmd -> IsEmpty() );
|
||||
}
|
||||
|
||||
// return the number of commands defined for this file type, 0 if none
|
||||
size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands,
|
||||
const wxFileType::MessageParameters& params) const;
|
||||
|
||||
|
||||
// remove the record for this file type
|
||||
bool Unassociate();
|
||||
// probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead
|
||||
bool Unassociate(wxFileType *ft)
|
||||
{
|
||||
return m_manager->Unassociate(ft);
|
||||
}
|
||||
|
||||
// set an arbitrary command, ask confirmation if it already exists and
|
||||
// overwriteprompt is TRUE
|
||||
bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE);
|
||||
bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0);
|
||||
|
||||
private:
|
||||
// get the entry which passes the test (may return NULL)
|
||||
MailCapEntry *GetEntry(const wxFileType::MessageParameters& params) const;
|
||||
|
||||
// choose the correct entry to use and expand the command
|
||||
bool GetExpandedCommand(wxString *expandedCmd,
|
||||
const wxFileType::MessageParameters& params,
|
||||
bool open) const;
|
||||
wxString
|
||||
GetExpandedCommand(const wxString & verb,
|
||||
const wxFileType::MessageParameters& params) const;
|
||||
|
||||
wxMimeTypesManagerImpl *m_manager;
|
||||
wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays
|
||||
|
@@ -99,6 +99,21 @@ wxFileTypeInfo::wxFileTypeInfo(const char *mimeType,
|
||||
va_end(argptr);
|
||||
}
|
||||
|
||||
|
||||
wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray)
|
||||
{
|
||||
m_mimeType = sArray [0u];
|
||||
m_openCmd = sArray [1u];
|
||||
m_printCmd = sArray [2u];
|
||||
m_desc = sArray [3u];
|
||||
|
||||
size_t count = sArray.GetCount();
|
||||
for ( size_t i = 4; i < count; i++ )
|
||||
{
|
||||
m_exts.Add(sArray[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#include "wx/arrimpl.cpp"
|
||||
WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo);
|
||||
|
||||
@@ -182,6 +197,8 @@ wxString wxFileType::ExpandCommand(const wxString& command,
|
||||
// behave like this, in particular a common test is 'test -n "$DISPLAY"'
|
||||
// and appending "< %s" to this command makes the test fail... I don't
|
||||
// know of the correct solution, try to guess what we have to do.
|
||||
|
||||
// test now carried out on reading file so test should never get here
|
||||
if ( !hasFilename && !str.IsEmpty()
|
||||
#ifdef __UNIX__
|
||||
&& !str.StartsWith(_T("test "))
|
||||
@@ -271,7 +288,7 @@ bool wxFileType::GetIcon(wxIcon *icon,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#if defined(__WXMSW__) || defined(__UNIX__)
|
||||
return m_impl->GetIcon(icon, iconFile, iconIndex);
|
||||
#else
|
||||
return m_impl->GetIcon(icon);
|
||||
@@ -334,9 +351,9 @@ size_t wxFileType::GetAllCommands(wxArrayString *verbs,
|
||||
if ( commands )
|
||||
commands->Clear();
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#if defined (__WXMSW__) || (__UNIX__)
|
||||
return m_impl->GetAllCommands(verbs, commands, params);
|
||||
#else // !__WXMSW__
|
||||
#else // !__WXMSW__ || Unix
|
||||
// we don't know how to retrieve all commands, so just try the 2 we know
|
||||
// about
|
||||
size_t count = 0;
|
||||
@@ -361,19 +378,57 @@ size_t wxFileType::GetAllCommands(wxArrayString *verbs,
|
||||
}
|
||||
|
||||
return count;
|
||||
#endif // __WXMSW__/!__WXMSW__
|
||||
#endif // __WXMSW__/| __UNIX__
|
||||
}
|
||||
|
||||
bool wxFileType::Unassociate()
|
||||
{
|
||||
#if defined(__WXMSW__) || defined(__UNIX__)
|
||||
#if defined(__WXMSW__)
|
||||
return m_impl->Unassociate();
|
||||
#else
|
||||
#endif
|
||||
|
||||
#if defined(__UNIX__)
|
||||
return m_impl->Unassociate(this);
|
||||
#endif
|
||||
|
||||
wxFAIL_MSG( _T("not implemented") ); // TODO
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
bool wxFileType::SetCommand(const wxString& cmd, const wxString& verb,
|
||||
bool overwriteprompt)
|
||||
{
|
||||
#if defined (__WXMSW__) || (__UNIX__)
|
||||
return m_impl->SetCommand(cmd, verb, overwriteprompt);
|
||||
#else
|
||||
wxFAIL_MSG(_T("not implemented"));
|
||||
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool wxFileType::SetDefaultIcon(const wxString& cmd, int index)
|
||||
{
|
||||
wxString sTmp = cmd;
|
||||
#ifdef __WXMSW__
|
||||
// VZ: should we do this?
|
||||
// chris elliott : only makes sense in MS windows
|
||||
if ( sTmp.empty() )
|
||||
GetOpenCommand(&sTmp, wxFileType::MessageParameters("", ""));
|
||||
#endif
|
||||
wxCHECK_MSG( !sTmp.empty(), FALSE, _T("need the icon file") );
|
||||
|
||||
#if defined (__WXMSW__) || (__UNIX__)
|
||||
return m_impl->SetDefaultIcon (cmd, index);
|
||||
#else
|
||||
wxFAIL_MSG(_T("not implemented"));
|
||||
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMimeTypesManager
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -418,6 +473,16 @@ wxMimeTypesManager::~wxMimeTypesManager()
|
||||
delete m_impl;
|
||||
}
|
||||
|
||||
bool wxMimeTypesManager::Unassociate(wxFileType *ft)
|
||||
{
|
||||
#if defined(__UNIX__)
|
||||
return m_impl->Unassociate(ft);
|
||||
#else
|
||||
return ft->Unassociate();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
wxFileType *
|
||||
wxMimeTypesManager::Associate(const wxFileTypeInfo& ftInfo)
|
||||
{
|
||||
@@ -517,6 +582,26 @@ size_t wxMimeTypesManager::EnumAllFileTypes(wxArrayString& mimetypes)
|
||||
return countAll;
|
||||
}
|
||||
|
||||
void wxMimeTypesManager::Initialize(int mcapStyle,
|
||||
const wxString& sExtraDir)
|
||||
{
|
||||
#ifdef __UNIX__
|
||||
EnsureImpl();
|
||||
|
||||
m_impl->Initialize(mcapStyle, sExtraDir);
|
||||
#endif // Unix
|
||||
}
|
||||
|
||||
// and this function clears all the data from the manager
|
||||
void wxMimeTypesManager::ClearData()
|
||||
{
|
||||
#ifdef __UNIX__
|
||||
EnsureImpl();
|
||||
|
||||
m_impl->ClearData();
|
||||
#endif // Unix
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// global data and wxMimeTypeCmnModule
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -546,4 +631,3 @@ public:
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxMimeTypeCmnModule, wxModule)
|
||||
|
||||
|
@@ -360,7 +360,7 @@ bool wxFileTypeImpl::GetIcon(wxIcon *icon,
|
||||
|
||||
wxString strExpPath = wxExpandEnvVars(strFullPath);
|
||||
// here we need C based counting!
|
||||
int nIndex = wxAtoi(strIndex) - 1 ;
|
||||
int nIndex = wxAtoi(strIndex);
|
||||
|
||||
HICON hIcon = ExtractIcon(GetModuleHandle(NULL), strExpPath, nIndex);
|
||||
switch ( (int)hIcon ) {
|
||||
@@ -453,6 +453,7 @@ wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& ext)
|
||||
return CreateFileType(wxEmptyString, ext);
|
||||
}
|
||||
|
||||
/*
|
||||
wxFileType *
|
||||
wxMimeTypesManagerImpl::GetOrAllocateFileTypeFromExtension(const wxString& ext)
|
||||
{
|
||||
@@ -464,7 +465,7 @@ wxMimeTypesManagerImpl::GetOrAllocateFileTypeFromExtension(const wxString& ext)
|
||||
|
||||
return fileType;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// MIME type -> extension -> file type
|
||||
wxFileType *
|
||||
@@ -515,31 +516,36 @@ wxFileType *wxMimeTypesManagerImpl::Associate(const wxFileTypeInfo& ftInfo)
|
||||
wxCHECK_MSG( !ftInfo.GetExtensions().IsEmpty(), NULL,
|
||||
_T("Associate() needs extension") );
|
||||
|
||||
const wxString& ext = ftInfo.GetExtensions()[0u];
|
||||
bool ok = FALSE ;
|
||||
int iExtCount = 0 ;
|
||||
wxString filetype;
|
||||
wxString extWithDot;
|
||||
|
||||
wxString ext = ftInfo.GetExtensions()[iExtCount];
|
||||
|
||||
wxCHECK_MSG( !ext.empty(), NULL,
|
||||
_T("Associate() needs non empty extension") );
|
||||
|
||||
wxString extWithDot;
|
||||
if ( ext[0u] != _T('.') )
|
||||
extWithDot = _T('.');
|
||||
extWithDot += ext;
|
||||
|
||||
// start by setting the HKCR\\.ext entries
|
||||
// default is filetype; content type is mimetype
|
||||
const wxString& filetypeOrig = ftInfo.GetShortDesc();
|
||||
|
||||
wxRegKey key(wxRegKey::HKCR, extWithDot);
|
||||
wxFileType *ft = NULL;
|
||||
if ( !key.Exists() )
|
||||
{
|
||||
wxString filetype;
|
||||
|
||||
// create the mapping from the extension to the filetype
|
||||
bool ok = key.Create();
|
||||
ok = key.Create();
|
||||
if ( ok )
|
||||
{
|
||||
const wxString& filetypeOrig = ftInfo.GetShortDesc();
|
||||
|
||||
if ( filetypeOrig.empty() )
|
||||
{
|
||||
// make it up from the extension
|
||||
filetype << extWithDot.c_str() + 1 << _T("_auto_file");
|
||||
filetype << extWithDot.c_str() + 1 << _T("_file");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -549,9 +555,23 @@ wxFileType *wxMimeTypesManagerImpl::Associate(const wxFileTypeInfo& ftInfo)
|
||||
|
||||
ok = key.SetValue(_T(""), filetype);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// key already exists, maybe we want to change it ??
|
||||
if (!filetypeOrig.empty())
|
||||
{
|
||||
filetype = filetypeOrig;
|
||||
ok = key.SetValue(_T(""), filetype);
|
||||
}
|
||||
else
|
||||
{
|
||||
ok = key.QueryValue(_T(""), filetype);
|
||||
}
|
||||
}
|
||||
// now set a mimetypeif we have it, but ignore it if none
|
||||
const wxString& mimetype = ftInfo.GetMimeType();
|
||||
if ( ok && !mimetype.empty() )
|
||||
if ( !mimetype.empty() )
|
||||
{
|
||||
// set the MIME type
|
||||
ok = key.SetValue(_T("Content Type"), mimetype);
|
||||
@@ -572,30 +592,63 @@ wxFileType *wxMimeTypesManagerImpl::Associate(const wxFileTypeInfo& ftInfo)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// now make other extensions have the same filetype
|
||||
|
||||
for (iExtCount=1; iExtCount < ftInfo.GetExtensionsCount(); iExtCount++ )
|
||||
{
|
||||
ext = ftInfo.GetExtensions()[iExtCount];
|
||||
if ( ext[0u] != _T('.') )
|
||||
extWithDot = _T('.');
|
||||
extWithDot += ext;
|
||||
|
||||
wxRegKey key(wxRegKey::HKCR, extWithDot);
|
||||
if ( !key.Exists() ) ok = key.Create();
|
||||
ok = key.SetValue(_T(""), filetype);
|
||||
|
||||
// now set any mimetypes we may have, but ignore it if none
|
||||
const wxString& mimetype = ftInfo.GetMimeType();
|
||||
if ( !mimetype.empty() )
|
||||
{
|
||||
// set the MIME type
|
||||
ok = key.SetValue(_T("Content Type"), mimetype);
|
||||
|
||||
if ( ok )
|
||||
{
|
||||
// create the MIME key
|
||||
wxString strKey = MIME_DATABASE_KEY;
|
||||
strKey << mimetype;
|
||||
wxRegKey keyMIME(wxRegKey::HKCR, strKey);
|
||||
ok = keyMIME.Create();
|
||||
|
||||
if ( ok )
|
||||
{
|
||||
// and provide a back link to the extension
|
||||
ok = keyMIME.SetValue(_T("Extension"), extWithDot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // end of for loop; all extensions now point to HKCR\.ext\Default
|
||||
|
||||
// create the filetype key itself (it will be empty for now, but
|
||||
// SetCommand(), SetDefaultIcon() &c will use it later)
|
||||
wxRegKey keyFT(wxRegKey::HKCR, filetype);
|
||||
ok = keyFT.Create();
|
||||
}
|
||||
|
||||
if ( ok )
|
||||
{
|
||||
// ok, we've created everything correctly
|
||||
wxFileType *ft = NULL;
|
||||
ft = CreateFileType(filetype, extWithDot);
|
||||
}
|
||||
else
|
||||
{
|
||||
// one of the registry operations failed
|
||||
wxLogError(_("Failed to register extension '%s'."), ext.c_str());
|
||||
}
|
||||
}
|
||||
else // key already exists
|
||||
{
|
||||
// FIXME we probably should return an existing file type then?
|
||||
}
|
||||
|
||||
if (ft)
|
||||
{
|
||||
if (! ftInfo.GetOpenCommand ().IsEmpty() ) ft->SetCommand (ftInfo.GetOpenCommand (), wxT("open" ) );
|
||||
if (! ftInfo.GetPrintCommand().IsEmpty() ) ft->SetCommand (ftInfo.GetPrintCommand(), wxT("print" ) );
|
||||
// chris: I don't like the ->m_impl-> here FIX this ??
|
||||
if (! ftInfo.GetDescription ().IsEmpty() ) ft->m_impl->SetDescription (ftInfo.GetDescription ()) ;
|
||||
if (! ftInfo.GetIconFile().IsEmpty() ) ft->SetDefaultIcon (ftInfo.GetIconFile(), ftInfo.GetIconIndex() );
|
||||
|
||||
}
|
||||
return ft;
|
||||
}
|
||||
|
||||
@@ -610,7 +663,7 @@ bool wxFileTypeImpl::SetCommand(const wxString& cmd,
|
||||
return FALSE;
|
||||
|
||||
wxRegKey rkey(wxRegKey::HKCR, GetVerbPath(verb));
|
||||
|
||||
#if 0
|
||||
if ( rkey.Exists() && overwriteprompt )
|
||||
{
|
||||
#if wxUSE_GUI
|
||||
@@ -620,8 +673,8 @@ bool wxFileTypeImpl::SetCommand(const wxString& cmd,
|
||||
(
|
||||
wxString::Format(
|
||||
_("Do you want to overwrite the command used to %s "
|
||||
"files with extension \"%s\" (current value is '%s', "
|
||||
"new value is '%s')?"),
|
||||
"files with extension \"%s\" ?\nCurrent value is \n%s, "
|
||||
"\nNew value is \n%s %1"), // bug here FIX need %1 ??
|
||||
verb.c_str(),
|
||||
m_ext.c_str(),
|
||||
old.c_str(),
|
||||
@@ -635,13 +688,14 @@ bool wxFileTypeImpl::SetCommand(const wxString& cmd,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
// TODO:
|
||||
// 1. translate '%s' to '%1' instead of always adding it
|
||||
// 2. create DDEExec value if needed (undo GetCommand)
|
||||
return rkey.Create() && rkey.SetValue(_T(""), cmd + _T(" \"%1\"") );
|
||||
}
|
||||
|
||||
/* // no longer used
|
||||
bool wxFileTypeImpl::SetMimeType(const wxString& mimeTypeOrig)
|
||||
{
|
||||
wxCHECK_MSG( !m_ext.IsEmpty(), FALSE, _T("SetMimeType() needs extension") );
|
||||
@@ -666,11 +720,14 @@ bool wxFileTypeImpl::SetMimeType(const wxString& mimeTypeOrig)
|
||||
wxRegKey rkey(wxRegKey::HKCR, m_ext);
|
||||
return rkey.Create() && rkey.SetValue(_T("Content Type"), mimeType);
|
||||
}
|
||||
*/
|
||||
|
||||
bool wxFileTypeImpl::SetDefaultIcon(const wxString& cmd, int index)
|
||||
{
|
||||
wxCHECK_MSG( !m_ext.IsEmpty(), FALSE, _T("SetMimeType() needs extension") );
|
||||
wxCHECK_MSG( wxFileExists(cmd), FALSE, _T("Icon file not found.") );
|
||||
wxCHECK_MSG( !m_ext.IsEmpty(), FALSE, _T("SetDefaultIcon() needs extension") );
|
||||
wxCHECK_MSG( !m_strFileType.IsEmpty(), FALSE, _T("File key not found") );
|
||||
// the next line fails on a SMBshare, I think because it is case mangled
|
||||
// wxCHECK_MSG( !wxFileExists(cmd), FALSE, _T("Icon file not found.") );
|
||||
|
||||
if ( !EnsureExtKeyExists() )
|
||||
return FALSE;
|
||||
@@ -682,6 +739,20 @@ bool wxFileTypeImpl::SetDefaultIcon(const wxString& cmd, int index)
|
||||
wxString::Format(_T("%s,%d"), cmd.c_str(), index));
|
||||
}
|
||||
|
||||
bool wxFileTypeImpl::SetDescription (const wxString& desc)
|
||||
{
|
||||
wxCHECK_MSG( !m_strFileType.IsEmpty(), FALSE, _T("File key not found") );
|
||||
wxCHECK_MSG( !desc.IsEmpty(), FALSE, _T("No file description supplied") );
|
||||
|
||||
if ( !EnsureExtKeyExists() )
|
||||
return FALSE;
|
||||
|
||||
wxRegKey rkey(wxRegKey::HKCR, m_strFileType );
|
||||
|
||||
return rkey.Create() &&
|
||||
rkey.SetValue(_T(""), desc);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// remove file association
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -695,7 +766,11 @@ bool wxFileTypeImpl::Unassociate()
|
||||
result = FALSE;
|
||||
if ( !RemoveMimeType() )
|
||||
result = FALSE;
|
||||
if ( !RemoveDescription() )
|
||||
result = FALSE;
|
||||
|
||||
/*
|
||||
//this might hold other keys, eg some have CSLID keys
|
||||
if ( result )
|
||||
{
|
||||
// delete the root key
|
||||
@@ -703,7 +778,7 @@ bool wxFileTypeImpl::Unassociate()
|
||||
if ( key.Exists() )
|
||||
result = key.DeleteSelf();
|
||||
}
|
||||
|
||||
*/
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -741,5 +816,14 @@ bool wxFileTypeImpl::RemoveDefaultIcon()
|
||||
return !rkey.Exists() || rkey.DeleteSelf();
|
||||
}
|
||||
|
||||
bool wxFileTypeImpl::RemoveDescription()
|
||||
{
|
||||
wxCHECK_MSG( !m_ext.IsEmpty(), FALSE,
|
||||
_T("RemoveDescription() needs extension") );
|
||||
|
||||
wxRegKey rkey (wxRegKey::HKCR, m_strFileType );
|
||||
return !rkey.Exists() || rkey.DeleteSelf();
|
||||
}
|
||||
|
||||
#endif
|
||||
// __WIN16__
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user