Update of /cvsroot/mahogany/M/src/classes
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12991/src/classes
Modified Files:
MessageView.cpp Moptions.cpp
Log Message:
automatically select the viewer best fit for the shown message
Index: MessageView.cpp
===================================================================
RCS file: /cvsroot/mahogany/M/src/classes/MessageView.cpp,v
retrieving revision 1.163
retrieving revision 1.164
diff -b -u -2 -r1.163 -r1.164
--- MessageView.cpp 23 Jun 2005 20:57:37 -0000 1.163
+++ MessageView.cpp 23 Jun 2005 23:44:35 -0000 1.164
@@ -105,6 +105,10 @@
extern const MOption MP_INLINE_GFX_SIZE;
extern const MOption MP_MAX_MESSAGE_SIZE;
+extern const MOption MP_MSGVIEW_ALLOW_HTML;
+extern const MOption MP_MSGVIEW_ALLOW_IMAGES;
+extern const MOption MP_MSGVIEW_AUTO_VIEWER;
extern const MOption MP_MSGVIEW_DEFAULT_ENCODING;
extern const MOption MP_MSGVIEW_HEADERS;
+extern const MOption MP_MSGVIEW_PREFER_HTML;
extern const MOption MP_MSGVIEW_VIEWER;
extern const MOption MP_MVIEW_TITLE_FMT;
@@ -452,5 +456,9 @@
inlinePlainText =
showFaces =
- highlightURLs = false;
+ highlightURLs =
+ autoViewer =
+ preferHTML =
+ allowHTML =
+ allowImages = false;
inlineGFX = -1;
@@ -478,5 +486,7 @@
CMP (autocollectNamed) CMP(autocollectBookName) &&
#endif // 0
- CMP(showFaces);
+ CMP(showFaces) &&
+ CMP(autoViewer) &&
+ (!autoViewer || CMP(preferHTML) && CMP(allowHTML) &&
CMP(allowImages));
#undef CMP
@@ -539,5 +549,5 @@
m_profile->IncRef();
- SetViewer(NULL, parent);
+ ResetViewer(parent);
m_usingDefViewer = true;
@@ -550,5 +560,6 @@
m_asyncFolder = NULL;
m_mailMessage = NULL;
- m_viewer = NULL;
+ m_viewer =
+ m_viewerOld = NULL;
m_filters = NULL;
m_virtualMimeParts = NULL;
@@ -578,4 +589,5 @@
delete m_filters;
delete m_viewer;
+ delete m_viewerOld;
}
@@ -592,5 +604,7 @@
void
-MessageView::SetViewer(MessageViewer *viewer, wxWindow *parent)
+MessageView::SetViewer(MessageViewer *viewer,
+ const String& viewerName,
+ wxWindow *parent)
{
if ( !viewer )
@@ -613,11 +627,11 @@
}
- viewer->Create(this, parent);
+ viewer->Create(this, parent ? parent : GetWindow()->GetParent());
- OnViewerChange(m_viewer, viewer);
- if ( m_viewer )
+ OnViewerChange(m_viewer, viewer, viewerName);
delete m_viewer;
m_viewer = viewer;
+ m_viewerName = viewerName;
}
@@ -633,5 +647,5 @@
@param nameAlt output parameter for the available viewer name if the given
one couldn't be loaded
- @return the viewer (to be DecRef()'d by caller) or NULL
+ @return the viewer (to be deleted by caller) or NULL
*/
static MessageViewer *LoadViewer(const String& name, String *nameAlt = NULL)
@@ -685,5 +699,5 @@
void
-MessageView::CreateViewer(wxWindow *parent)
+MessageView::CreateViewer()
{
String name = m_ProfileValues.msgViewer;
@@ -700,5 +714,5 @@
name.c_str(), nameAlt.c_str());
- viewer = LoadViewer(nameAlt);
+ viewer = LoadViewer(name = nameAlt);
}
@@ -710,5 +724,5 @@
}
- SetViewer(viewer, parent);
+ SetViewer(viewer, name);
}
@@ -1069,5 +1083,5 @@
if ( recreateViewer )
{
- CreateViewer(GetWindow()->GetParent());
+ CreateViewer();
}
else // use the same viewer
@@ -1146,4 +1160,9 @@
settings->showFaces = READ_CONFIG_BOOL(profile, MP_SHOW_XFACES);
+ settings->autoViewer = READ_CONFIG_BOOL(profile, MP_MSGVIEW_AUTO_VIEWER);
+ settings->preferHTML = READ_CONFIG_BOOL(profile, MP_MSGVIEW_PREFER_HTML);
+ settings->allowHTML = READ_CONFIG_BOOL(profile, MP_MSGVIEW_ALLOW_HTML);
+ settings->allowImages = READ_CONFIG_BOOL(profile, MP_MSGVIEW_ALLOW_IMAGES);
+
settings->highlightURLs = READ_CONFIG_BOOL(profile, MP_HIGHLIGHT_URLS);
@@ -1928,10 +1947,9 @@
// if the disposition is set to attachment we force the part to be shown
- // as an attachment
- bool isAttachment = mimepart->GetDisposition().IsSameAs(_T("attachment"),
false);
+ // as an attachment by disabling all the other heuristics
+ const bool isAttachment = mimepart->IsAttachment();
// first check for viewer specific formats, next for text, then for
// images and finally show all the rest as generic attachment
-
if ( !isAttachment && m_viewer->CanProcess(mimeType) )
{
@@ -2391,8 +2409,155 @@
// ----------------------------------------------------------------------------
+// bit flags returned by GetPartContent()
+enum
+{
+ PartContent_Text = 0x01,
+ PartContent_Image = 0x02,
+ PartContent_HTML = 0x04
+};
+
+int
+MessageView::DeterminePartContent(const MimePart *mimepart)
+{
+ int contents = 0;
+
+ // if the part is explicitely an attachment we show it as attachment anyhow
+ // so its real contents don't matter
+ if ( !mimepart->IsAttachment() )
+ {
+ const MimeType type = mimepart->GetType();
+ const String subtype = type.GetSubType();
+ switch ( type.GetPrimary() )
+ {
+ case MimeType::MESSAGE:
+ if ( !m_ProfileValues.inlineRFC822 )
+ break;
+ //else: fall through and handle it as embedded multipart
+
+ case MimeType::MULTIPART:
+ {
+ for ( const MimePart *partChild = mimepart->GetNested();
+ partChild;
+ partChild = partChild->GetNext() )
+ {
+ contents |= DeterminePartContent(partChild);
+ }
+ }
+ break;
+
+ case MimeType::TEXT:
+ if ( subtype == _T("TEXT") )
+ contents |= PartContent_Text;
+ else if ( subtype == _T("HTML") )
+ contents |= PartContent_HTML;
+ break;
+
+ case MimeType::IMAGE:
+ contents |= PartContent_Image;
+ break;
+
+ default:
+ wxFAIL_MSG( _T("Unknown MIME part type") );
+ // fall through
+
+ case MimeType::APPLICATION:
+ case MimeType::AUDIO:
+ case MimeType::VIDEO:
+ case MimeType::MODEL:
+ case MimeType::OTHER:
+ case MimeType::CUSTOM1:
+ case MimeType::CUSTOM2:
+ case MimeType::CUSTOM3:
+ case MimeType::CUSTOM4:
+ case MimeType::CUSTOM5:
+ case MimeType::CUSTOM6:
+ // these parts don't influence the viewer choice
+ break;
+ }
+ }
+
+ return contents;
+}
+
+void
+MessageView::AutoAdjustViewer(const MimePart *mimepart)
+{
+ // find out which viewer we want to use for this message
+ String viewerName;
+ const int contents = DeterminePartContent(mimepart);
+ if ( contents & PartContent_HTML )
+ {
+ // use HTML viewer when the user prefers HTML to plain text or when there
+ // is nothing but HTML
+ if ( m_ProfileValues.preferHTML ||
+ (!(contents & PartContent_Text) && m_ProfileValues.allowHTML) )
+ {
+ viewerName = _T("HtmlViewer");
+ }
+ }
+
+ if ( viewerName.empty() )
+ {
+ if ( contents & PartContent_Image )
+ {
+ if ( m_ProfileValues.allowImages )
+ {
+ // this is the best viewer for showing images currently
+ viewerName = _T("LayoutViewer");
+ }
+ }
+ }
+ //else: viewerName is already HTML and can show images anyhow
+
+
+ if ( viewerName == m_viewerName )
+ {
+ // nothing to do, we already use the correct viewer
+ return;
+ }
+
+ if ( viewerName.empty() || viewerName == m_viewerNameOld )
+ {
+ // either we don't have any specific viewer to set, in which case we need
+ // to just restore the user-chosen one if any, or we need the viewer
+ // which had been previously replaced
+ if ( m_viewerOld )
+ {
+ SetViewer(m_viewerOld, m_viewerNameOld);
+ m_viewerOld = NULL;
+ m_viewerNameOld.clear();
+ }
+ }
+ else // we need to switch to another viewer
+ {
+ MessageViewer *viewer = LoadViewer(viewerName);
+ if ( viewer )
+ {
+ if ( m_viewerOld )
+ {
+ // replace the last automatically set viewer
+ SetViewer(viewer, viewerName);
+ }
+ else // we're using the original user-chosen viewer, keep it as "old"
+ {
+ // we can't use SetViewer() because it deletes the current viewer
+ // and we want to keep it as m_viewerOld and restore it later
+ viewer->Create(this, GetWindow()->GetParent());
+
+ OnViewerChange(m_viewer, viewer, viewerName);
+
+ m_viewerNameOld = m_viewerName;
+ m_viewerName = viewerName;
+
+ m_viewerOld = m_viewer;
+ m_viewer = viewer;
+ }
+ }
+ }
+}
+
void
MessageView::Update()
{
- m_viewer->Clear();
if ( m_virtualMimeParts )
m_virtualMimeParts->clear();
@@ -2401,4 +2566,5 @@
{
// no message to display, but still call Update() after Clear()
+ m_viewer->Clear();
m_viewer->Update();
@@ -2418,4 +2584,10 @@
m_encodingAuto = mimepart->GetTextEncoding();
+ // adjust the viewer to the current message contents
+ if ( m_ProfileValues.autoViewer )
+ AutoAdjustViewer(mimepart);
+
+
+ m_viewer->Clear();
//#define PROFILE_VIEWER
@@ -3177,5 +3349,5 @@
// on the contrary, revert to the default ones if we don't have any
// folder any more
- SetViewer(NULL, GetWindow()->GetParent());
+ ResetViewer();
// make sure the viewer will be recreated the next time we are called
Index: Moptions.cpp
===================================================================
RCS file: /cvsroot/mahogany/M/src/classes/Moptions.cpp,v
retrieving revision 1.81
retrieving revision 1.82
diff -b -u -2 -r1.81 -r1.82
--- Moptions.cpp 15 May 2005 21:18:23 -0000 1.81
+++ Moptions.cpp 23 Jun 2005 23:44:35 -0000 1.82
@@ -315,4 +315,8 @@
const MOption MP_MSGVIEW_SHOWBAR;
const MOption MP_MSGVIEW_VIEWER;
+const MOption MP_MSGVIEW_AUTO_VIEWER;
+const MOption MP_MSGVIEW_PREFER_HTML;
+const MOption MP_MSGVIEW_ALLOW_HTML;
+const MOption MP_MSGVIEW_ALLOW_IMAGES;
const MOption MP_MSGVIEW_HEADERS;
const MOption MP_MSGVIEW_ALL_HEADERS;
@@ -727,4 +731,8 @@
DEFINE_OPTION(MP_MSGVIEW_SHOWBAR),
DEFINE_OPTION(MP_MSGVIEW_VIEWER),
+ DEFINE_OPTION(MP_MSGVIEW_AUTO_VIEWER),
+ DEFINE_OPTION(MP_MSGVIEW_PREFER_HTML),
+ DEFINE_OPTION(MP_MSGVIEW_ALLOW_HTML),
+ DEFINE_OPTION(MP_MSGVIEW_ALLOW_IMAGES),
DEFINE_OPTION(MP_MSGVIEW_HEADERS),
DEFINE_OPTION(MP_MSGVIEW_ALL_HEADERS),
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Mahogany-cvsupdates mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates