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

Reply via email to