diff --git a/K7Main.cpp b/K7Main.cpp index 81f004b..53ea50e 100644 --- a/K7Main.cpp +++ b/K7Main.cpp @@ -20,6 +20,7 @@ #include "GpgMEWorker.h" #include "GpgMECWorker.h" #include "Tools.h" +#include "SensitiveTreeTableNodeText.h" using namespace std; @@ -267,7 +268,8 @@ void K7Main::DisplayKeys(const vector& kList, const WString& grpLabe } } keyNode->setColumnWidget(2, unique_ptr (lblOwnerTrust)); - keyNode->setColumnWidget(3, cpp14::make_unique (k.primaryFingerprint())); + TreeTableNodeText * ttntFpr = new TreeTableNodeText(k.primaryFingerprint(), keyNode, 3); + keyNode->setColumnWidget(3, unique_ptr (ttntFpr)); grpNode->addChildNode(unique_ptr (keyNode)); } if (expand) @@ -315,7 +317,8 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) { UserID uid = k.userID(i); WTreeTableNode * uidNode = new WTreeTableNode(uid.name()); - uidNode->setColumnWidget(1, cpp14::make_unique (uid.email())); + TreeTableNodeText * ttntUidEmail = new TreeTableNodeText(uid.email(), uidNode, 1); + uidNode->setColumnWidget(1, unique_ptr (ttntUidEmail)); // Show key certify popup on double click WText * lblUidValidity = new WText(UidValidities[uid.validity()]); if (m_config->CanEditUidValidity()) { @@ -323,7 +326,8 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) lblUidValidity->doubleClicked().connect(std::bind(&KeyEdit::OnUidValidityClicked, m_keyEdit, uidNode, privateKeys, WString(k.primaryFingerprint()))); } uidNode->setColumnWidget(2, unique_ptr (lblUidValidity)); - uidNode->setColumnWidget(3, cpp14::make_unique (uid.comment())); + TreeTableNodeText * ttntUidComment = new TreeTableNodeText(uid.comment(), uidNode, 3); + uidNode->setColumnWidget(3, unique_ptr (ttntUidComment)); rootNode->addChildNode(unique_ptr (uidNode)); // uid.numSignatures() is always 0, even for signed keys ! for (uint s = 0; s < uid.numSignatures(); s++) @@ -332,11 +336,13 @@ void K7Main::DisplayUids(const WString& fullKeyID, bool secret) const WString signer = WString(sig.signerName()) + _SPACE_ + WString(sig.signerKeyID()); WTreeTableNode * sigNode = new WTreeTableNode(signer); - sigNode->setColumnWidget(1, cpp14::make_unique (sig.signerEmail())); + TreeTableNodeText * ttntEmail = new TreeTableNodeText(sig.signerEmail(), sigNode, 1); + sigNode->setColumnWidget(1, unique_ptr (ttntEmail)); WString exp = TR("Expiration") + _SPACE_ + _COLON_ + _SPACE_; exp += sig.neverExpires() ? TR("Never") : MakeDateTimeLabel(sig.expirationTime()); sigNode->setColumnWidget(2, cpp14::make_unique (exp)); - sigNode->setColumnWidget(3, cpp14::make_unique (sig.signerComment())); + TreeTableNodeText * ttntComment = new TreeTableNodeText(sig.signerComment(), sigNode, 3); + sigNode->setColumnWidget(3, unique_ptr (ttntComment)); uidNode->addChild(unique_ptr (sigNode)); } } @@ -370,7 +376,8 @@ void K7Main::DisplaySubKeys(const WString& fullKeyID, bool secret) { Subkey sk = k.subkey(i); WTreeTableNode * skNode = new WTreeTableNode(sk.keyID()); - skNode->setColumnWidget(1, cpp14::make_unique (sk.fingerprint())); + TreeTableNodeText * ttntFpr = new TreeTableNodeText(sk.fingerprint(), skNode, 1); + skNode->setColumnWidget(1, unique_ptr (ttntFpr)); WString exp = sk.neverExpires() ? TR("Never") : MakeDateTimeLabel(sk.expirationTime()); skNode->setColumnWidget(2, cpp14::make_unique (exp)); WString usage = sk.canAuthenticate() ? WString("A") : WString::Empty; diff --git a/SensitiveTreeTableNodeText.cpp b/SensitiveTreeTableNodeText.cpp new file mode 100644 index 0000000..d56c212 --- /dev/null +++ b/SensitiveTreeTableNodeText.cpp @@ -0,0 +1,90 @@ +/* + * File: SensitiveTreeTableNodeText.cpp + * Author: SET - nmset@yandex.com + * License : LGPL v2.1 + * Copyright SET - © 2019 + * + * Created on November 3, 2020, 8:26 PM + */ + +#include "SensitiveTreeTableNodeText.h" +#include + +using namespace std; + +TreeTableNodeText::TreeTableNodeText(WTreeTableNode * node, uint colIndex) +: WText() +{ + Init(node, colIndex); +} + +TreeTableNodeText::~TreeTableNodeText() +{ +} + +TreeTableNodeText::TreeTableNodeText(const WString& text, + WTreeTableNode * node, uint colIndex) +: WText(text) +{ + Init(node, colIndex); +} + +TreeTableNodeText::TreeTableNodeText(const WString& text, TextFormat textFormat, + WTreeTableNode * node, uint colIndex) +: WText(text, textFormat) +{ + Init(node, colIndex); +} + +void TreeTableNodeText::Init(WTreeTableNode * node, uint colIndex) +{ + m_node = node; + m_colIndex = colIndex; + m_lineEdit = NULL; + clicked().connect(this, &TreeTableNodeText::OnClick); + setToolTip(WString::tr("PrepareCopy")); +} + +void TreeTableNodeText::OnClick() +{ + m_lineEdit = new TreeTableNodeLineEdit(text(), m_node, m_colIndex); + m_lineEdit->setReadOnly(true); + m_lineEdit->blurred().connect(m_lineEdit, &TreeTableNodeLineEdit::OnBlurred); + m_lineEdit->setSelection(0, text().toUTF8().length()); + m_node->setColumnWidget(m_colIndex, unique_ptr (m_lineEdit)); + m_lineEdit->setFocus(true); // +++ +} + +/////////////////////////////////////////////////////////////////////////////// + +TreeTableNodeLineEdit::TreeTableNodeLineEdit(WTreeTableNode* node, uint colIndex) +: WLineEdit() +{ + Init(node, colIndex); +} + +TreeTableNodeLineEdit::~TreeTableNodeLineEdit() +{ +} + +TreeTableNodeLineEdit::TreeTableNodeLineEdit(const WString& content, + WTreeTableNode* node, uint colIndex) +: WLineEdit(content) +{ + Init(node, colIndex); +} + +void TreeTableNodeLineEdit::Init(WTreeTableNode* node, uint colIndex) +{ + m_node = node; + m_colIndex = colIndex; + m_text = NULL; + clicked().connect(this, &TreeTableNodeLineEdit::OnBlurred); +} + +void TreeTableNodeLineEdit::OnBlurred() +{ + m_text = new TreeTableNodeText(text(), m_node, m_colIndex); + m_text->clicked().connect(m_text, &TreeTableNodeText::OnClick); + m_node->setColumnWidget(m_colIndex, unique_ptr (m_text)); +} diff --git a/SensitiveTreeTableNodeText.h b/SensitiveTreeTableNodeText.h new file mode 100644 index 0000000..f716ad4 --- /dev/null +++ b/SensitiveTreeTableNodeText.h @@ -0,0 +1,73 @@ +/* + * File: SensitiveTreeTableNodeText.h + * Author: SET - nmset@yandex.com + * License : LGPL v2.1 + * Copyright SET - © 2019 + * + * Created on November 3, 2020, 8:26 PM + */ + +#ifndef TREETABLENODETEXT_H +#define TREETABLENODETEXT_H + +#include +#include +#include + +using namespace Wt; + +class TreeTableNodeText; +class TreeTableNodeLineEdit; + +/** + * An extended WText in a WTreeTableNode. + * It is replaced by a TreeTableNodeLineEdit on click. + * \n This allows to copy the text to clipboard. + */ +class TreeTableNodeText : public WText +{ +public: + TreeTableNodeText(WTreeTableNode * node, uint colIndex); + TreeTableNodeText(const WString& text, + WTreeTableNode * node, uint colIndex); + TreeTableNodeText(const WString& text, TextFormat textFormat, + WTreeTableNode * node, uint colIndex); + virtual ~TreeTableNodeText(); + /** + * Creates a read-only TreeTableNodeLineEdit replacing this + * TreeTableNodeText. + */ + void OnClick(); +private: + WTreeTableNode * m_node; + uint m_colIndex; + TreeTableNodeLineEdit * m_lineEdit; + + void Init(WTreeTableNode * node, uint colIndex); +}; + +/** + * An extended WLineEdit replacing a WText in a WTreeTableNode. + * Switches back to a WTreeTableNodeText when it loses focus. + */ +class TreeTableNodeLineEdit : public WLineEdit +{ +public: + TreeTableNodeLineEdit(WTreeTableNode * node, uint colIndex); + TreeTableNodeLineEdit(const WString& content, + WTreeTableNode * node, uint colIndex); + virtual ~TreeTableNodeLineEdit(); + /** + * Creates back a TreeTableNodeText replacing this TreeTableNodeLineEdit. + */ + void OnBlurred(); +private: + WTreeTableNode * m_node; + uint m_colIndex; + TreeTableNodeText * m_text; + + void Init(WTreeTableNode * node, uint colIndex); +}; + +#endif /* TREETABLENODETEXT_H */ + diff --git a/WTAPPROOT/K7/K7.xml b/WTAPPROOT/K7/K7.xml index 5413515..b30b2a1 100644 --- a/WTAPPROOT/K7/K7.xml +++ b/WTAPPROOT/K7/K7.xml @@ -79,4 +79,6 @@ Apply Key succesfully certified Key certification failed + + Click to be able to copy next \ No newline at end of file diff --git a/WTAPPROOT/K7/K7_fr.xml b/WTAPPROOT/K7/K7_fr.xml index 5fbc74c..fd259da 100644 --- a/WTAPPROOT/K7/K7_fr.xml +++ b/WTAPPROOT/K7/K7_fr.xml @@ -79,4 +79,6 @@ Appliquer Succès de certification de la clé Échec de certification de la clé + + Cliquez pour pouvoir ensuite copier diff --git a/nbproject/Makefile-ARM-Release.mk b/nbproject/Makefile-ARM-Release.mk index 621fc36..785fa7b 100644 --- a/nbproject/Makefile-ARM-Release.mk +++ b/nbproject/Makefile-ARM-Release.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -s -DLARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -O2 -s -DLARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index d7b0b80..592fb2b 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.cpp ${RM} "$@.d" $(COMPILE.cc) -g -DDEVTIME -I/usr/local/Wt-Debug/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -g -DDEVTIME -I/usr/local/Wt-Debug/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 8996b57..613bfc3 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -44,6 +44,7 @@ OBJECTFILES= \ ${OBJECTDIR}/PopupCertifyUserId.o \ ${OBJECTDIR}/PopupDeleter.o \ ${OBJECTDIR}/PopupUploader.o \ + ${OBJECTDIR}/SensitiveTreeTableNodeText.o \ ${OBJECTDIR}/Tools.o \ ${OBJECTDIR}/TransientMessageWidget.o \ ${OBJECTDIR}/main.o @@ -118,6 +119,11 @@ ${OBJECTDIR}/PopupUploader.o: PopupUploader.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -s -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/PopupUploader.o PopupUploader.cpp +${OBJECTDIR}/SensitiveTreeTableNodeText.o: SensitiveTreeTableNodeText.cpp + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -O2 -s -I/usr/local/Wt/include -I/usr/include/gpgme++ -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SensitiveTreeTableNodeText.o SensitiveTreeTableNodeText.cpp + ${OBJECTDIR}/Tools.o: Tools.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 0332d86..7fe494b 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -13,6 +13,7 @@ PopupCertifyUserId.h PopupDeleter.h PopupUploader.h + SensitiveTreeTableNodeText.h Tools.h TransientMessageWidget.h global.h @@ -37,6 +38,7 @@ PopupCertifyUserId.cpp PopupDeleter.cpp PopupUploader.cpp + SensitiveTreeTableNodeText.cpp Tools.cpp TransientMessageWidget.cpp main.cpp @@ -131,6 +133,10 @@ + + + + @@ -227,6 +233,10 @@ + + + + @@ -327,6 +337,10 @@ + + + +