1 // This file is part of Desktop App Toolkit,
2 // a set of libraries for developing nice desktop applications.
3 //
4 // For license and copyright information please follow this link:
5 // https://github.com/desktop-app/legal/blob/master/LEGAL
6 //
7 #pragma once
8 
9 #include "base/algorithm.h"
10 #include "ui/click_handler.h"
11 
12 class TextClickHandler : public ClickHandler {
13 public:
14 	TextClickHandler(bool fullDisplayed = true)
_fullDisplayed(fullDisplayed)15 	: _fullDisplayed(fullDisplayed) {
16 	}
17 
copyToClipboardText()18 	QString copyToClipboardText() const override {
19 		return url();
20 	}
21 
tooltip()22 	QString tooltip() const override {
23 		return _fullDisplayed ? QString() : readable();
24 	}
25 
setFullDisplayed(bool full)26 	void setFullDisplayed(bool full) {
27 		_fullDisplayed = full;
28 	}
29 
30 protected:
31 	virtual QString url() const = 0;
32 	virtual QString readable() const;
33 
34 	bool _fullDisplayed;
35 
36 };
37 
38 class UrlClickHandler : public TextClickHandler {
39 public:
40 	UrlClickHandler(const QString &url, bool fullDisplayed = true);
41 
42 	QString copyToClipboardContextItemText() const override;
43 
dragText()44 	QString dragText() const override {
45 		return url();
46 	}
47 
48 	TextEntity getTextEntity() const override;
49 
50 	static void Open(QString url, QVariant context = {});
onClick(ClickContext context)51 	void onClick(ClickContext context) const override {
52 		const auto button = context.button;
53 		if (button == Qt::LeftButton || button == Qt::MiddleButton) {
54 			Open(url(), context.other);
55 		}
56 	}
57 
IsEmail(const QString & url)58 	[[nodiscard]] static bool IsEmail(const QString &url) {
59 		const auto at = url.indexOf('@'), slash = url.indexOf('/');
60 		return ((at > 0) && (slash < 0 || slash > at));
61 	}
62 	[[nodiscard]] static QString EncodeForOpening(const QString &originalUrl);
63 	[[nodiscard]] static bool IsSuspicious(const QString &url);
64 	[[nodiscard]] static QString ShowEncoded(const QString &url);
65 
66 protected:
originalUrl()67 	[[nodiscard]] QString originalUrl() const {
68 		return _originalUrl;
69 	}
url()70 	QString url() const override {
71 		return EncodeForOpening(_originalUrl);
72 	}
readable()73 	QString readable() const override {
74 		return _readable;
75 	}
76 
77 private:
isEmail()78 	[[nodiscard]] bool isEmail() const {
79 		return IsEmail(_originalUrl);
80 	}
81 
82 	QString _originalUrl, _readable;
83 
84 };
85