-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClipState.cs
213 lines (187 loc) · 8.13 KB
/
ClipState.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
using PropertyChanged;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
namespace ClipboardMonitor
{
class ClipState : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Visibility ToolTipVisibility { get; set; } = Visibility.Visible;
public ImageSource TooltipImageSource { get; set; }
public double TooltipImageWidth { get; set; }
public double TooltipImageHeight { get; set; }
public Visibility TooltipImageVisibility { get; set; } = Visibility.Collapsed;
public string TooltipContentText { get; set; }
public Visibility TooltipContentVisibility { get; set; } = Visibility.Collapsed;
public string TooltipFileNamesText { get; set; }
public Visibility TooltipFileNamesVisibility { get; set; } = Visibility.Collapsed;
public string TooltipFormatsText { get; set; }
public Visibility TooltipFormatsVisibility { get; set; } = Visibility.Visible;
public string PreviewText { get; set; }
public Brush PreviewTextBrush { get; set; }
public string TypeMessage { get; set; }
public Brush TypeMessageBrush { get; set; }
public Brush TypeMessageBackgroundBrush { get; set; }
void UpdateTooltipVisibility()
{
ToolTipVisibility =
(TooltipContentVisibility == Visibility.Visible ||
TooltipFileNamesVisibility == Visibility.Visible ||
TooltipFormatsVisibility == Visibility.Visible ||
TooltipImageVisibility == Visibility.Visible ) ? Visibility.Visible : Visibility.Hidden;
}
void OnTooltipContentVisibilityChanged() { UpdateTooltipVisibility(); }
void OnTooltipFileNamesVisibilityChanged() { UpdateTooltipVisibility(); }
void OnTooltipFormatsVisibilityChanged() { UpdateTooltipVisibility(); }
void OnTooltipImageVisibilityChanged() { UpdateTooltipVisibility(); }
public void OnTooltipImageSourceChanged()
{
if (TooltipImageSource == null)
TooltipImageVisibility = Visibility.Collapsed;
else
{
TooltipImageVisibility = Visibility.Visible;
TooltipImageHeight = TooltipImageSource.Height;
TooltipImageWidth = TooltipImageSource.Width;
}
}
public void OnTooltipFormatsTextChanged()
{
if (string.IsNullOrEmpty(TooltipFormatsText))
TooltipFormatsVisibility = Visibility.Collapsed;
else
TooltipFormatsVisibility = Visibility.Visible;
}
public void OnTooltipFileNamesTextChanged()
{
if (string.IsNullOrEmpty(TooltipFileNamesText))
TooltipFileNamesVisibility = Visibility.Collapsed;
else
TooltipFileNamesVisibility = Visibility.Visible;
}
public void OnTooltipContentTextChanged()
{
if (string.IsNullOrEmpty(TooltipContentText))
TooltipContentVisibility = Visibility.Collapsed;
else
TooltipContentVisibility = Visibility.Visible;
}
public void OnPreviewTextChanged()
{
if (string.IsNullOrEmpty(PreviewText))
TooltipContentText = "";
}
void SetMessage(string typeMessage, Brush foreground, Brush background, string previewText = "")
{
TypeMessage = typeMessage;
TypeMessageBrush = foreground;
TypeMessageBackgroundBrush = background;
PreviewText = previewText;
}
void SetMessage(string typeMessage, Brush foreground, string previewText = "") { SetMessage(typeMessage, foreground, Brushes.White, previewText); }
void SetFormats(string[] in_array, out string[] out_array)
{
// list formats in tooltip
TooltipFormatsText = String.Join(Environment.NewLine, in_array);
out_array = in_array;
}
public void Update()
{
string[] formats;
// Get formats of data in clipboard
try // prevent OOM Exception
{
SetFormats(Clipboard.GetDataObject().GetFormats(), out formats);
}
catch (Exception ex)
{
SetFormats(new string[] { "⚠ Unknown", ex.Message }, out formats);
// try one more time for robustness
if (Clipboard.ContainsText())
{
SetMessage("⚠ Text (?)", Application.Current.Resources["TypeUnknown"] as SolidColorBrush, Brushes.Black, Clipboard.GetText());
TooltipContentText = Clipboard.GetText();
}
else
{
SetMessage("⛔ Error (not empty)", Application.Current.Resources["TypeError"] as SolidColorBrush);
return;
}
}
// Check if clipboard is empty
if (formats.Length == 0)
{
SetMessage("✔ Clipboard is empty", Application.Current.Resources["TypeEmpty"] as SolidColorBrush, Brushes.Black);
TooltipImageSource = null;
TooltipFileNamesText = "";
return;
}
// Clipboard not empty, handle common types:
// (should be in this order)
// Text
if (Clipboard.ContainsText())
{
var text = Clipboard.GetText().Split(Environment.NewLine.ToCharArray());
var multiline = text.Length > 1; // bool flag
string message = (multiline ? "Multi" : "Single") + "-line text";
// try to get first non-empty string for preview
string trimmed_str, preview_text = "";
foreach (string str in text)
{
trimmed_str = str.Trim();
if (trimmed_str.Length > 0)
{
preview_text = $" {trimmed_str}" + (multiline ? " ↩" : "");
break;
}
}
SetMessage(message,
multiline ? Application.Current.Resources["TypeMultiLineText"] as SolidColorBrush :
Application.Current.Resources["TypeSingleLineText"] as SolidColorBrush,
Brushes.Black, preview_text);
// full text goes to tooltip
TooltipContentText = Clipboard.GetText();
}
else
{
SetMessage($"{formats[0]}", Application.Current.Resources["TypeUnknown"] as SolidColorBrush, Brushes.Black);
}
// Image
if (Clipboard.ContainsImage())
{
SetMessage("📷 Image, hover for preview", Application.Current.Resources["TypeImage"] as SolidColorBrush, Brushes.Black);
TooltipImageSource = Clipboard.GetImage();
}
else
{
TooltipImageSource = null;
}
// File(s)
if (Clipboard.ContainsFileDropList())
{
var files = Clipboard.GetFileDropList().Cast<string>().ToList();
string message = files.Count > 1 ? $"Files ({files.Count})" : $"File";
string text = files.Count > 1 ? $"{ Path.GetFileName(files[0])}, {Path.GetFileName(files[1])}, ..." : $"{Path.GetFileName(files[0])}";
if (string.IsNullOrEmpty(text))
text = files[0];
SetMessage(message, Application.Current.Resources["TypeFiles"] as SolidColorBrush, Brushes.Black, text);
TooltipFileNamesText = String.Join(Environment.NewLine, files);
}
else
{
TooltipFileNamesText = "";
}
}
public ClipState()
{
this.Update();
}
}
}