Disable button and fix msgs if no mail selected
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 9 Jan 2017 12:09:27 +0000 (13:09 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 9 Jan 2017 12:09:27 +0000 (13:09 +0100)
* src/gpgoladdin.cpp (GpgolRibbonExtender::GetIDsOfNames)
(GpgolRibbonExtender::Invoke, GetCustomUI_MIME): Update
for get_is_details_enabled.
* src/ribbon-callbacks.cpp (get_is_details_enabled): New.
(get_mail_from_control): Extend with selection state.

src/gpgoladdin.cpp
src/ribbon-callbacks.cpp
src/ribbon-callbacks.h

index 15ba34d..9eda8c2 100644 (file)
@@ -646,7 +646,7 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames,
       ID_MAPPER (L"getSigSTip", ID_GET_SIG_STIP)
       ID_MAPPER (L"getSigTip", ID_GET_SIG_TTIP)
       ID_MAPPER (L"launchDetails", ID_LAUNCH_CERT_DETAILS)
-      ID_MAPPER (L"getIsCrypto", ID_GET_IS_CRYPTO)
+      ID_MAPPER (L"getIsDetailsEnabled", ID_GET_IS_DETAILS_ENABLED)
     }
 
   if (cNames > 1)
@@ -741,8 +741,8 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid,
         return get_sig_label (parms->rgvarg[0].pdispVal, result);
       case ID_LAUNCH_CERT_DETAILS:
         return launch_cert_details (parms->rgvarg[0].pdispVal);
-      case ID_GET_IS_CRYPTO:
-        return get_is_crypto (parms->rgvarg[0].pdispVal, result);
+      case ID_GET_IS_DETAILS_ENABLED:
+        return get_is_details_enabled (parms->rgvarg[0].pdispVal, result);
 
       case ID_ON_LOAD:
           {
@@ -925,8 +925,8 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml)
         "               getLabel=\"getSigLabel\""
         "               getScreentip=\"getSigTip\""
         "               getSupertip=\"getSigSTip\""
-        "               onAction=\"launchDetails\"/>"
-       /* "               getEnabled=\"getIsCrypto\"/>" */
+        "               onAction=\"launchDetails\""
+        "               getEnabled=\"getIsDetailsEnabled\"/>"
         "       <dialogBoxLauncher>"
         "         <button id=\"optsBtn_read\""
         "                 onAction=\"openOptions\""
index 503c773..34a964d 100644 (file)
@@ -1421,11 +1421,12 @@ done:
 }
 
 static Mail *
-get_mail_from_control (LPDISPATCH ctrl)
+get_mail_from_control (LPDISPATCH ctrl, bool *none_selected)
 {
   HRESULT hr;
   LPDISPATCH context = NULL,
              mailitem = NULL;
+  *none_selected = false;
   if (!ctrl)
     {
       log_error ("%s:%s:%i", SRCNAME, __func__, __LINE__);
@@ -1457,6 +1458,10 @@ get_mail_from_control (LPDISPATCH ctrl)
   else if (!strcmp (ctx_name, "_Explorer"))
     {
       mailitem = get_oom_object (context, "Selection.Item(1)");
+      if (!mailitem)
+        {
+          *none_selected = true;
+        }
     }
 
   gpgol_release (context);
@@ -1504,23 +1509,22 @@ get_mail_from_control (LPDISPATCH ctrl)
       log_error ("%s:%s:%i", SRCNAME, __func__, __LINE__); \
       return E_FAIL; \
     } \
-  const auto mail = get_mail_from_control (ctrl); \
+  bool none_selected; \
+  const auto mail = get_mail_from_control (ctrl, &none_selected); \
+  (void)none_selected; \
   if (!mail) \
     { \
       log_oom ("%s:%s:%i Failed to get mail", \
                SRCNAME, __func__, __LINE__); \
     }
 
-HRESULT get_is_crypto (LPDISPATCH ctrl, VARIANT *result)
+HRESULT get_is_details_enabled (LPDISPATCH ctrl, VARIANT *result)
 {
   MY_MAIL_GETTER
 
   result->vt = VT_BOOL | VT_BYREF;
   result->pboolVal = (VARIANT_BOOL*) xmalloc (sizeof (VARIANT_BOOL));
-  *(result->pboolVal) = !mail ?
-                        VARIANT_FALSE :
-                        (mail->is_signed () || mail->is_encrypted ()) ?
-                        VARIANT_TRUE : VARIANT_FALSE;
+  *(result->pboolVal) = none_selected ? VARIANT_FALSE : VARIANT_TRUE;
 
   return S_OK;
 }
@@ -1556,10 +1560,14 @@ HRESULT get_sig_ttip (LPDISPATCH ctrl, VARIANT *result)
     {
       w_result = utf8_to_wchar (mail->get_crypto_one_line().c_str());
     }
-  else
+  else if (!none_selected)
     {
       w_result = utf8_to_wchar (_("Insecure message"));
     }
+  else
+    {
+      w_result = utf8_to_wchar (_("No message selected"));
+    }
   result->bstrVal = SysAllocString (w_result);
   xfree (w_result);
   return S_OK;
@@ -1570,6 +1578,11 @@ HRESULT get_sig_stip (LPDISPATCH ctrl, VARIANT *result)
   MY_MAIL_GETTER
 
   result->vt = VT_BSTR;
+  if (none_selected)
+    {
+      result->bstrVal = SysAllocString (L"");
+      return S_OK;
+    }
   if (!mail || (!mail->is_signed () && !mail->is_encrypted ()))
     {
       wchar_t *w_result;
index 7b4bd37..b131481 100644 (file)
@@ -42,7 +42,7 @@
 #define ID_GET_ENCRYPT_PRESSED  16
 #define ID_ON_LOAD              17
 #define ID_CMD_OPEN_OPTIONS     18
-#define ID_GET_IS_CRYPTO        19
+#define ID_GET_IS_DETAILS_ENABLED 19
 #define ID_CMD_MIME_SIGN_EX     21
 #define ID_CMD_MIME_ENCRYPT_EX  22
 #define ID_GET_SIGN_PRESSED_EX  23
@@ -85,8 +85,8 @@ HRESULT verifyBody (LPDISPATCH ctrl);
 HRESULT get_crypt_pressed (LPDISPATCH ctrl, int flags, VARIANT *result, bool is_explorer);
 /* Mark the mail to be mime encrypted on send. Flags as above */
 HRESULT mark_mime_action (LPDISPATCH ctrl, int flags, bool is_explorer);
-/* Check the if the mail was signed. Returns BOOL */
-HRESULT get_is_crypto (LPDISPATCH ctrl, VARIANT *result);
+/* Check the if the gpgol button should be enabled */
+HRESULT get_is_details_enabled (LPDISPATCH ctrl, VARIANT *result);
 /* Get the label for the signature. Returns BSTR */
 HRESULT get_sig_label (LPDISPATCH ctrl, VARIANT *result);
 /* Get the tooltip for the signature. Returns BSTR */