mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-09-14 19:32:10 +02:00
Compare commits
110 Commits
Author | SHA1 | Date | |
---|---|---|---|
45bdd95dc8 | |||
569fdec380 | |||
3f15ff1c06 | |||
506cd52255 | |||
300c0c6195 | |||
7689fe97b0 | |||
99ed077dbc | |||
65aeb6656f | |||
e4f5766ffb | |||
353ac7c76b | |||
8073fa206b | |||
1a1cfa2220 | |||
5e93d866ad | |||
f29e03e250 | |||
3775b5968d | |||
ba6242e09d | |||
f6b0ddddb9 | |||
9e8d5c6768 | |||
ef78496d5d | |||
41a45a14df | |||
5d3721ad04 | |||
f75bcb505c | |||
fa365794a0 | |||
a747ab700e | |||
b51b017005 | |||
b9e1dd5950 | |||
56bf33229b | |||
5740dd8c8a | |||
d3f205287c | |||
53518cd6e6 | |||
0ff3896d51 | |||
c64e16471b | |||
2f2e2b82b8 | |||
af9a503f3c | |||
971affa607 | |||
2de5d6206e | |||
34e0bcc56a | |||
bb9f09c11f | |||
3f5cc24a10 | |||
109a330c54 | |||
3e4cd3c92f | |||
c6aaa4fb04 | |||
2de9570c38 | |||
3d88f57f8a | |||
23606f6d6c | |||
5a1ba1b0dc | |||
ced5a82e07 | |||
b4fc522f37 | |||
a7e222f2e7 | |||
511e5c483c | |||
a28fddbc4d | |||
780908f777 | |||
88e5681155 | |||
bc197e6942 | |||
afbfea6d43 | |||
662ee7382c | |||
12144a2bda | |||
e11f2e54b4 | |||
01cb4e32eb | |||
1ca3541b34 | |||
e209085960 | |||
d1a90612c2 | |||
0a21c61535 | |||
8583a55424 | |||
3a7a0f63de | |||
2e13d08018 | |||
f13515ba16 | |||
6f1884451b | |||
d9321a9acb | |||
19f9614c74 | |||
66ce355571 | |||
5108649ec6 | |||
9308478a59 | |||
97d778c31c | |||
740195146b | |||
6e0717bf22 | |||
b6a683dfe1 | |||
dc78c68f12 | |||
8e01d5ec84 | |||
b531016c7b | |||
188369e922 | |||
347c5054f9 | |||
6729b597c0 | |||
7bdbfe937c | |||
d955713335 | |||
8bb69ef0ee | |||
d258583a7f | |||
13d0e10dcd | |||
5557f79fe7 | |||
44ccaa0d26 | |||
49f12abeb3 | |||
b1859774bc | |||
4283403f0e | |||
379191751c | |||
9bf396f2a8 | |||
87af4c96c4 | |||
dd78a7c9de | |||
40e534090d | |||
973e0c489e | |||
5eb64829a5 | |||
5648e9e806 | |||
2a65e20fb9 | |||
1162e9b655 | |||
b8a5c2fb9b | |||
eccd37a3eb | |||
ee282713f8 | |||
c5edad9c4b | |||
293c01b12f | |||
162bbc3221 | |||
9f27020993 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -47,7 +47,6 @@ artifacts/
|
|||||||
*_p.c
|
*_p.c
|
||||||
*_i.h
|
*_i.h
|
||||||
*.ilk
|
*.ilk
|
||||||
*.meta
|
|
||||||
*.obj
|
*.obj
|
||||||
*.pch
|
*.pch
|
||||||
*.pdb
|
*.pdb
|
||||||
|
@@ -5,9 +5,10 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace TweetDck.Configuration{
|
namespace TweetDck.Configuration{
|
||||||
class LockManager{
|
class LockManager{
|
||||||
|
public Process LockingProcess { get; private set; }
|
||||||
|
|
||||||
private readonly string file;
|
private readonly string file;
|
||||||
private FileStream lockStream;
|
private FileStream lockStream;
|
||||||
private Process lockingProcess;
|
|
||||||
|
|
||||||
public LockManager(string file){
|
public LockManager(string file){
|
||||||
this.file = file;
|
this.file = file;
|
||||||
@@ -25,9 +26,9 @@ namespace TweetDck.Configuration{
|
|||||||
lockStream.Write(id,0,id.Length);
|
lockStream.Write(id,0,id.Length);
|
||||||
lockStream.Flush();
|
lockStream.Flush();
|
||||||
|
|
||||||
if (lockingProcess != null){
|
if (LockingProcess != null){
|
||||||
lockingProcess.Close();
|
LockingProcess.Close();
|
||||||
lockingProcess = null;
|
LockingProcess = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -58,12 +59,12 @@ namespace TweetDck.Configuration{
|
|||||||
|
|
||||||
using(Process currentProcess = Process.GetCurrentProcess()){
|
using(Process currentProcess = Process.GetCurrentProcess()){
|
||||||
if (foundProcess.ProcessName == currentProcess.ProcessName){
|
if (foundProcess.ProcessName == currentProcess.ProcessName){
|
||||||
lockingProcess = foundProcess;
|
LockingProcess = foundProcess;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}catch(ArgumentException){}
|
}catch(ArgumentException){}
|
||||||
|
|
||||||
return lockingProcess == null && CreateLockFile();
|
return LockingProcess == null && CreateLockFile();
|
||||||
}catch(DirectoryNotFoundException){
|
}catch(DirectoryNotFoundException){
|
||||||
string dir = Path.GetDirectoryName(file);
|
string dir = Path.GetDirectoryName(file);
|
||||||
|
|
||||||
@@ -80,29 +81,39 @@ namespace TweetDck.Configuration{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Unlock(){
|
public bool Unlock(){
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
if (lockStream != null){
|
if (lockStream != null){
|
||||||
lockStream.Dispose();
|
lockStream.Dispose();
|
||||||
|
|
||||||
|
try{
|
||||||
File.Delete(file);
|
File.Delete(file);
|
||||||
|
}catch(Exception e){
|
||||||
|
Program.Log(e.ToString());
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
lockStream = null;
|
lockStream = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CloseLockingProcess(int timeout){
|
public bool CloseLockingProcess(int timeout){
|
||||||
if (lockingProcess != null){
|
if (LockingProcess != null){
|
||||||
lockingProcess.CloseMainWindow();
|
LockingProcess.CloseMainWindow();
|
||||||
|
|
||||||
for(int waited = 0; waited < timeout && !lockingProcess.HasExited;){
|
for(int waited = 0; waited < timeout && !LockingProcess.HasExited;){
|
||||||
lockingProcess.Refresh();
|
LockingProcess.Refresh();
|
||||||
|
|
||||||
Thread.Sleep(100);
|
Thread.Sleep(100);
|
||||||
waited += 100;
|
waited += 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lockingProcess.HasExited){
|
if (LockingProcess.HasExited){
|
||||||
lockingProcess.Dispose();
|
LockingProcess.Dispose();
|
||||||
lockingProcess = null;
|
LockingProcess = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
using TweetDck.Core;
|
using TweetDck.Core;
|
||||||
using TweetDck.Core.Handling;
|
using TweetDck.Core.Handling;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
|
||||||
namespace TweetDck.Configuration{
|
namespace TweetDck.Configuration{
|
||||||
[Serializable]
|
[Serializable]
|
||||||
@@ -13,33 +16,37 @@ namespace TweetDck.Configuration{
|
|||||||
Binder = new SerializationCompatibilityHandler()
|
Binder = new SerializationCompatibilityHandler()
|
||||||
};
|
};
|
||||||
|
|
||||||
private const int CurrentFileVersion = 2;
|
private const int CurrentFileVersion = 4;
|
||||||
|
|
||||||
// START OF CONFIGURATION
|
// START OF CONFIGURATION
|
||||||
|
|
||||||
public bool IgnoreMigration { get; set; }
|
public bool IgnoreMigration { get; set; }
|
||||||
public bool IgnoreUninstallCheck { get; set; }
|
public bool IgnoreUninstallCheck { get; set; }
|
||||||
|
|
||||||
public bool IsMaximized { get; set; }
|
public WindowState BrowserWindow { get; set; }
|
||||||
public Point WindowLocation { get; set; }
|
|
||||||
public Size WindowSize { get; set; }
|
|
||||||
public bool DisplayNotificationTimer { get; set; }
|
public bool DisplayNotificationTimer { get; set; }
|
||||||
|
public bool NotificationTimerCountDown { get; set; }
|
||||||
|
|
||||||
public TweetNotification.Duration NotificationDuration { get; set; }
|
public TweetNotification.Duration NotificationDuration { get; set; }
|
||||||
public TweetNotification.Position NotificationPosition { get; set; }
|
public TweetNotification.Position NotificationPosition { get; set; }
|
||||||
public Point CustomNotificationPosition { get; set; }
|
public Point CustomNotificationPosition { get; set; }
|
||||||
public int NotificationEdgeDistance { get; set; }
|
public int NotificationEdgeDistance { get; set; }
|
||||||
public int NotificationDisplay { get; set; }
|
public int NotificationDisplay { get; set; }
|
||||||
|
public int NotificationDurationValue { get; set; }
|
||||||
|
public bool NotificationLegacyLoad { get; set; }
|
||||||
|
|
||||||
|
public bool ExpandLinksOnHover { get; set; }
|
||||||
|
public bool EnableTrayHighlight { get; set; }
|
||||||
|
|
||||||
public bool EnableUpdateCheck { get; set; }
|
public bool EnableUpdateCheck { get; set; }
|
||||||
public string DismissedUpdate { get; set; }
|
public string DismissedUpdate { get; set; }
|
||||||
public bool ExpandLinksOnHover { get; set; }
|
|
||||||
|
|
||||||
public bool IsCustomWindowLocationSet{
|
public PluginConfig Plugins { get; private set; }
|
||||||
get{
|
public WindowState PluginsWindow { get; set; }
|
||||||
return WindowLocation.X != -32000 && WindowLocation.X != 32000;
|
|
||||||
}
|
public string CustomCefArgs { get; set; }
|
||||||
}
|
public string CustomBrowserCSS { get; set; }
|
||||||
|
public string CustomNotificationCSS { get; set; }
|
||||||
|
|
||||||
public bool IsCustomNotificationPositionSet{
|
public bool IsCustomNotificationPositionSet{
|
||||||
get{
|
get{
|
||||||
@@ -97,15 +104,18 @@ namespace TweetDck.Configuration{
|
|||||||
private UserConfig(string file){
|
private UserConfig(string file){
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
|
||||||
IsMaximized = true;
|
BrowserWindow = new WindowState();
|
||||||
DisplayNotificationTimer = true;
|
DisplayNotificationTimer = true;
|
||||||
WindowLocation = new Point(-32000,-32000);
|
|
||||||
NotificationDuration = TweetNotification.Duration.Medium;
|
NotificationDuration = TweetNotification.Duration.Medium;
|
||||||
NotificationPosition = TweetNotification.Position.TopRight;
|
NotificationPosition = TweetNotification.Position.TopRight;
|
||||||
CustomNotificationPosition = new Point(-32000,-32000);
|
CustomNotificationPosition = new Point(-32000,-32000);
|
||||||
NotificationEdgeDistance = 8;
|
NotificationEdgeDistance = 8;
|
||||||
|
NotificationDurationValue = 25;
|
||||||
EnableUpdateCheck = true;
|
EnableUpdateCheck = true;
|
||||||
ExpandLinksOnHover = true;
|
ExpandLinksOnHover = true;
|
||||||
|
EnableTrayHighlight = true;
|
||||||
|
Plugins = new PluginConfig();
|
||||||
|
PluginsWindow = new WindowState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpgradeFile(){
|
private void UpgradeFile(){
|
||||||
@@ -125,6 +135,26 @@ namespace TweetDck.Configuration{
|
|||||||
++fileVersion;
|
++fileVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fileVersion == 2){
|
||||||
|
BrowserWindow = new WindowState();
|
||||||
|
Plugins = new PluginConfig();
|
||||||
|
PluginsWindow = new WindowState();
|
||||||
|
++fileVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileVersion == 3){
|
||||||
|
EnableTrayHighlight = true;
|
||||||
|
|
||||||
|
switch(NotificationDuration){
|
||||||
|
case TweetNotification.Duration.Short: NotificationDurationValue = 15; break;
|
||||||
|
case TweetNotification.Duration.Medium: NotificationDurationValue = 25; break;
|
||||||
|
case TweetNotification.Duration.Long: NotificationDurationValue = 35; break;
|
||||||
|
case TweetNotification.Duration.VeryLong: NotificationDurationValue = 45; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
++fileVersion;
|
||||||
|
}
|
||||||
|
|
||||||
// update the version
|
// update the version
|
||||||
fileVersion = CurrentFileVersion;
|
fileVersion = CurrentFileVersion;
|
||||||
Save();
|
Save();
|
||||||
@@ -179,7 +209,7 @@ namespace TweetDck.Configuration{
|
|||||||
return config ?? new UserConfig(file);
|
return config ?? new UserConfig(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetBackupFile(string file){
|
public static string GetBackupFile(string file){
|
||||||
return file+".bak";
|
return file+".bak";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +222,7 @@ namespace TweetDck.Configuration{
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typeName = typeName.Replace("TweetDick","TweetDck");
|
typeName = typeName.Replace("TweetDick","TweetDck");
|
||||||
return Type.GetType(string.Format("{0}, {1}",typeName,assemblyName));
|
return Type.GetType(string.Format(CultureInfo.CurrentCulture,"{0}, {1}",typeName,assemblyName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,9 +4,9 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Controls{
|
namespace TweetDck.Core.Controls{
|
||||||
static class ControlExtensions{
|
static class ControlExtensions{
|
||||||
public static void InvokeSafe(this Form form, Action func){
|
public static void InvokeSafe(this Control control, Action func){
|
||||||
if (form.InvokeRequired){
|
if (control.InvokeRequired){
|
||||||
form.Invoke(func);
|
control.Invoke(func);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
func();
|
func();
|
||||||
@@ -28,5 +28,11 @@ namespace TweetDck.Core.Controls{
|
|||||||
bar.Value = value;
|
bar.Value = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void SetValueSafe(this TrackBar trackBar, int value){
|
||||||
|
if (value >= trackBar.Minimum && value <= trackBar.Maximum){
|
||||||
|
trackBar.Value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
Core/Controls/FlatButton.cs
Normal file
20
Core/Controls/FlatButton.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Controls{
|
||||||
|
class FlatButton : Button{
|
||||||
|
protected override bool ShowFocusCues{
|
||||||
|
get{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FlatButton(){
|
||||||
|
GotFocus += FlatButton_GotFocus;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FlatButton_GotFocus(object sender, EventArgs e){ // removes extra border when focused
|
||||||
|
NotifyDefault(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
Core/Controls/FlatProgressBar.Designer.cs
generated
32
Core/Controls/FlatProgressBar.Designer.cs
generated
@@ -1,33 +1,3 @@
|
|||||||
namespace TweetDck.Core.Controls{
|
namespace TweetDck.Core.Controls{
|
||||||
partial class FlatProgressBar {
|
partial class FlatProgressBar{}
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing) {
|
|
||||||
if (brush != null)brush.Dispose();
|
|
||||||
|
|
||||||
if (disposing && (components != null)) {
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Component Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent() {
|
|
||||||
components = new System.ComponentModel.Container();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -3,9 +3,11 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Controls{
|
namespace TweetDck.Core.Controls{
|
||||||
public partial class FlatProgressBar : ProgressBar{
|
public partial class FlatProgressBar : ProgressBar{
|
||||||
private SolidBrush brush;
|
private readonly SolidBrush brush;
|
||||||
|
|
||||||
public FlatProgressBar(){
|
public FlatProgressBar(){
|
||||||
|
brush = new SolidBrush(Color.White);
|
||||||
|
|
||||||
SetStyle(ControlStyles.UserPaint,true);
|
SetStyle(ControlStyles.UserPaint,true);
|
||||||
SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
|
SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
|
||||||
}
|
}
|
||||||
@@ -15,13 +17,21 @@ namespace TweetDck.Core.Controls{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e){
|
protected override void OnPaint(PaintEventArgs e){
|
||||||
if (brush == null || brush.Color != ForeColor){
|
if (brush.Color != ForeColor){
|
||||||
brush = new SolidBrush(ForeColor);
|
brush.Color = ForeColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle rect = e.ClipRectangle;
|
Rectangle rect = e.ClipRectangle;
|
||||||
rect.Width = (int)(rect.Width*((double)Value/Maximum));
|
rect.Width = (int)(rect.Width*((double)Value/Maximum));
|
||||||
e.Graphics.FillRectangle(brush,rect);
|
e.Graphics.FillRectangle(brush,rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing){
|
||||||
|
base.Dispose(disposing);
|
||||||
|
|
||||||
|
if (disposing){
|
||||||
|
brush.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
Core/Controls/RichTextLabel.Designer.cs
generated
41
Core/Controls/RichTextLabel.Designer.cs
generated
@@ -1,41 +0,0 @@
|
|||||||
namespace TweetDck.Core.Controls {
|
|
||||||
partial class RichTextLabel {
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing) {
|
|
||||||
if (disposing && (components != null)) {
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Component Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent() {
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// RichTextLabel
|
|
||||||
//
|
|
||||||
this.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
|
||||||
this.ReadOnly = true;
|
|
||||||
this.TabStop = false;
|
|
||||||
this.MouseEnter += new System.EventHandler(this.RichTextLabel_MouseEnter);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,59 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using TweetDck.Core.Utils;
|
|
||||||
|
|
||||||
namespace TweetDck.Core.Controls{
|
|
||||||
public partial class RichTextLabel : RichTextBox{
|
|
||||||
/// <summary>
|
|
||||||
/// Wraps the body of a RTF formatted string with default tags and formatting.
|
|
||||||
/// </summary>
|
|
||||||
public static string Wrap(string str){
|
|
||||||
string rtf = @"{\rtf1\ansi\ansicpg1250\deff0\deflang1029{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}";
|
|
||||||
rtf += @"{\*\generator Msftedit 4.20.69.1337;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang1036\f0\fs16 ";
|
|
||||||
rtf += str;
|
|
||||||
return rtf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Wraps URL tags around a link.
|
|
||||||
/// </summary>
|
|
||||||
public static string AddLink(string url){
|
|
||||||
return @"{\field{\*\fldinst{HYPERLINK """+url+@"""}}{\fldrslt{\ul\cf1 "+url+@"}}}";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Uses v5 of RichTextBox, which fixes URLs and other crap.
|
|
||||||
/// </summary>
|
|
||||||
protected override CreateParams CreateParams{
|
|
||||||
get{
|
|
||||||
CreateParams createParams = base.CreateParams;
|
|
||||||
|
|
||||||
if (NativeMethods.LoadLibrary("msftedit.dll") != IntPtr.Zero){
|
|
||||||
createParams.ClassName = "RICHEDIT50W";
|
|
||||||
}
|
|
||||||
|
|
||||||
return createParams;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RichTextLabel(){
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
SetStyle(ControlStyles.Selectable,false);
|
|
||||||
SetStyle(ControlStyles.UserMouse,true);
|
|
||||||
SetStyle(ControlStyles.SupportsTransparentBackColor,true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RichTextLabel_MouseEnter(object sender, EventArgs e){
|
|
||||||
Cursor = Cursors.Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
|
||||||
if (m.Msg == 0x204 || m.Msg == 0x205){ // WM_RBUTTONDOWN, WM_RBUTTONUP
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
base.WndProc(ref m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
3
Core/Controls/TabButton.Designer.cs
generated
Normal file
3
Core/Controls/TabButton.Designer.cs
generated
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
namespace TweetDck.Core.Controls{
|
||||||
|
partial class TabButton{}
|
||||||
|
}
|
25
Core/Controls/TabButton.cs
Normal file
25
Core/Controls/TabButton.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Controls{
|
||||||
|
sealed partial class TabButton : FlatButton{
|
||||||
|
public Action Callback { get; private set; }
|
||||||
|
|
||||||
|
public void SetupButton(int locationX, int sizeWidth, string title, Action callback){
|
||||||
|
Callback = callback;
|
||||||
|
|
||||||
|
SuspendLayout();
|
||||||
|
FlatAppearance.BorderColor = Color.DimGray;
|
||||||
|
FlatAppearance.MouseDownBackColor = Color.White;
|
||||||
|
FlatAppearance.MouseOverBackColor = Color.White;
|
||||||
|
FlatStyle = FlatStyle.Flat;
|
||||||
|
Location = new Point(locationX,0);
|
||||||
|
Margin = new Padding(0);
|
||||||
|
Size = new Size(sizeWidth,30);
|
||||||
|
Text = title;
|
||||||
|
UseVisualStyleBackColor = true;
|
||||||
|
ResumeLayout(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
Core/Controls/TabPanel.Designer.cs
generated
Normal file
68
Core/Controls/TabPanel.Designer.cs
generated
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
namespace TweetDck.Core.Controls {
|
||||||
|
partial class TabPanel {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.panelButtons = new System.Windows.Forms.Panel();
|
||||||
|
this.panelContent = new System.Windows.Forms.Panel();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// panelButtons
|
||||||
|
//
|
||||||
|
this.panelButtons.Dock = System.Windows.Forms.DockStyle.Top;
|
||||||
|
this.panelButtons.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.panelButtons.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.panelButtons.Name = "panelButtons";
|
||||||
|
this.panelButtons.Size = new System.Drawing.Size(640, 30);
|
||||||
|
this.panelButtons.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// panelContent
|
||||||
|
//
|
||||||
|
this.panelContent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.panelContent.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||||
|
this.panelContent.Location = new System.Drawing.Point(0, 29);
|
||||||
|
this.panelContent.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.panelContent.Name = "panelContent";
|
||||||
|
this.panelContent.Size = new System.Drawing.Size(640, 451);
|
||||||
|
this.panelContent.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// TabPanel
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.panelContent);
|
||||||
|
this.Controls.Add(this.panelButtons);
|
||||||
|
this.Name = "TabPanel";
|
||||||
|
this.Size = new System.Drawing.Size(640, 480);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Panel panelButtons;
|
||||||
|
private System.Windows.Forms.Panel panelContent;
|
||||||
|
}
|
||||||
|
}
|
62
Core/Controls/TabPanel.cs
Normal file
62
Core/Controls/TabPanel.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Controls{
|
||||||
|
sealed partial class TabPanel : UserControl{
|
||||||
|
public IEnumerable<TabButton> Buttons{
|
||||||
|
get{
|
||||||
|
return panelButtons.Controls.Cast<TabButton>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TabButton ActiveButton { get; private set; }
|
||||||
|
|
||||||
|
// ReSharper disable once ConvertToAutoPropertyWithPrivateSetter
|
||||||
|
public Panel Content{
|
||||||
|
get{
|
||||||
|
return panelContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int btnWidth;
|
||||||
|
|
||||||
|
public TabPanel(){
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetupTabPanel(int buttonWidth){
|
||||||
|
this.btnWidth = buttonWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TabButton AddButton(string title, Action callback){
|
||||||
|
TabButton button = new TabButton();
|
||||||
|
button.SetupButton((btnWidth-1)*panelButtons.Controls.Count,btnWidth,title,callback);
|
||||||
|
button.Click += (sender, args) => SelectTab((TabButton)sender);
|
||||||
|
|
||||||
|
panelButtons.Controls.Add(button);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectTab(TabButton button){
|
||||||
|
if (ActiveButton != null){
|
||||||
|
ActiveButton.BackColor = SystemColors.Control;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.BackColor = Color.White;
|
||||||
|
button.Callback();
|
||||||
|
|
||||||
|
ActiveButton = button;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReplaceContent(Control newControl){
|
||||||
|
newControl.Dock = DockStyle.Fill;
|
||||||
|
Content.SuspendLayout();
|
||||||
|
Content.Controls.Clear();
|
||||||
|
Content.Controls.Add(newControl);
|
||||||
|
Content.ResumeLayout(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
Core/FormBrowser.Designer.cs
generated
1
Core/FormBrowser.Designer.cs
generated
@@ -43,6 +43,7 @@
|
|||||||
this.MinimumSize = new System.Drawing.Size(340, 424);
|
this.MinimumSize = new System.Drawing.Size(340, 424);
|
||||||
this.Name = "FormBrowser";
|
this.Name = "FormBrowser";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
||||||
|
this.Activated += new System.EventHandler(this.FormBrowser_Activated);
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormBrowser_FormClosing);
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormBrowser_FormClosing);
|
||||||
this.ResizeEnd += new System.EventHandler(this.FormBrowser_ResizeEnd);
|
this.ResizeEnd += new System.EventHandler(this.FormBrowser_ResizeEnd);
|
||||||
this.Resize += new System.EventHandler(this.FormBrowser_Resize);
|
this.Resize += new System.EventHandler(this.FormBrowser_Resize);
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
@@ -7,9 +6,11 @@ using TweetDck.Configuration;
|
|||||||
using TweetDck.Core.Handling;
|
using TweetDck.Core.Handling;
|
||||||
using TweetDck.Core.Other;
|
using TweetDck.Core.Other;
|
||||||
using TweetDck.Resources;
|
using TweetDck.Resources;
|
||||||
using TweetDck.Core.Utils;
|
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using TweetDck.Updates;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
|
||||||
namespace TweetDck.Core{
|
namespace TweetDck.Core{
|
||||||
sealed partial class FormBrowser : Form{
|
sealed partial class FormBrowser : Form{
|
||||||
@@ -22,44 +23,52 @@ namespace TweetDck.Core{
|
|||||||
public string UpdateInstallerPath { get; private set; }
|
public string UpdateInstallerPath { get; private set; }
|
||||||
|
|
||||||
private readonly ChromiumWebBrowser browser;
|
private readonly ChromiumWebBrowser browser;
|
||||||
private readonly TweetDeckBridge bridge;
|
private readonly PluginManager plugins;
|
||||||
private readonly FormNotification notification;
|
private readonly UpdateHandler updates;
|
||||||
|
|
||||||
private FormSettings currentFormSettings;
|
private FormSettings currentFormSettings;
|
||||||
private FormAbout currentFormAbout;
|
private FormAbout currentFormAbout;
|
||||||
|
private FormPlugins currentFormPlugins;
|
||||||
private bool isLoaded;
|
private bool isLoaded;
|
||||||
|
|
||||||
private FormWindowState prevState;
|
private FormWindowState prevState;
|
||||||
|
|
||||||
public FormBrowser(){
|
public FormBrowser(PluginManager pluginManager){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName;
|
Text = Program.BrandName;
|
||||||
|
|
||||||
bridge = new TweetDeckBridge(this);
|
this.plugins = pluginManager;
|
||||||
|
this.plugins.Reloaded += plugins_Reloaded;
|
||||||
|
this.plugins.Config.PluginChangedState += plugins_PluginChangedState;
|
||||||
|
|
||||||
browser = new ChromiumWebBrowser("https://tweetdeck.twitter.com/"){
|
FormNotification notification = CreateNotificationForm(true);
|
||||||
|
notification.CanMoveWindow = () => false;
|
||||||
|
notification.Show();
|
||||||
|
|
||||||
|
this.browser = new ChromiumWebBrowser("https://tweetdeck.twitter.com/"){
|
||||||
MenuHandler = new ContextMenuBrowser(this),
|
MenuHandler = new ContextMenuBrowser(this),
|
||||||
DialogHandler = new DialogHandlerBrowser(this)
|
DialogHandler = new DialogHandlerBrowser(this),
|
||||||
|
LifeSpanHandler = new LifeSpanHandler()
|
||||||
};
|
};
|
||||||
|
|
||||||
browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
this.browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
||||||
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
this.browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||||
browser.RegisterJsObject("$TD",bridge);
|
this.browser.RegisterJsObject("$TD",new TweetDeckBridge(this,notification));
|
||||||
|
this.browser.RegisterAsyncJsObject("$TDP",plugins.Bridge);
|
||||||
|
|
||||||
Controls.Add(browser);
|
Controls.Add(browser);
|
||||||
|
|
||||||
Disposed += (sender, args) => browser.Dispose();
|
Disposed += (sender, args) => browser.Dispose();
|
||||||
|
|
||||||
trayIcon.ClickRestore += trayIcon_ClickRestore;
|
this.trayIcon.ClickRestore += trayIcon_ClickRestore;
|
||||||
trayIcon.ClickClose += trayIcon_ClickClose;
|
this.trayIcon.ClickClose += trayIcon_ClickClose;
|
||||||
Config.TrayBehaviorChanged += Config_TrayBehaviorChanged;
|
Config.TrayBehaviorChanged += Config_TrayBehaviorChanged;
|
||||||
|
|
||||||
UpdateTrayIcon();
|
UpdateTrayIcon();
|
||||||
|
|
||||||
notification = CreateNotificationForm(true);
|
this.updates = new UpdateHandler(browser,this);
|
||||||
notification.CanMoveWindow = () => false;
|
this.updates.UpdateAccepted += updates_UpdateAccepted;
|
||||||
notification.Show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowChildForm(Form form){
|
private void ShowChildForm(Form form){
|
||||||
@@ -67,31 +76,25 @@ namespace TweetDck.Core{
|
|||||||
form.MoveToCenter(this);
|
form.MoveToCenter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ForceClose(){
|
||||||
|
trayIcon.Visible = false; // checked in FormClosing event
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
public FormNotification CreateNotificationForm(bool autoHide){
|
public FormNotification CreateNotificationForm(bool autoHide){
|
||||||
return new FormNotification(this,bridge,trayIcon,autoHide);
|
return new FormNotification(this,plugins,autoHide);
|
||||||
}
|
}
|
||||||
|
|
||||||
// window setup
|
// window setup
|
||||||
|
|
||||||
private void SetupWindow(){
|
private void SetupWindow(){
|
||||||
if (Config.IsCustomWindowLocationSet){
|
Config.BrowserWindow.Restore(this,true);
|
||||||
Location = Config.WindowLocation;
|
|
||||||
Size = Config.WindowSize;
|
|
||||||
WindowState = Config.IsMaximized ? FormWindowState.Maximized : FormWindowState.Normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Config.IsCustomWindowLocationSet || !Screen.AllScreens.Any(screen => screen.WorkingArea.IntersectsWith(Bounds))){
|
|
||||||
Location = Screen.PrimaryScreen.WorkingArea.Location;
|
|
||||||
Size = Screen.PrimaryScreen.WorkingArea.Size;
|
|
||||||
WindowState = FormWindowState.Maximized;
|
|
||||||
}
|
|
||||||
|
|
||||||
prevState = WindowState;
|
prevState = WindowState;
|
||||||
isLoaded = true;
|
isLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTrayIcon(){
|
private void UpdateTrayIcon(){
|
||||||
trayIcon.Visible = Config.TrayBehavior != TrayIcon.Behavior.Disabled;
|
trayIcon.Visible = Config.TrayBehavior.ShouldDisplayIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
// active event handlers
|
// active event handlers
|
||||||
@@ -105,12 +108,21 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
if (e.Frame.IsMain){
|
if (e.Frame.IsMain){
|
||||||
foreach(string js in ScriptLoader.LoadResources("code.js","update.js").Where(js => js != null)){
|
ScriptLoader.ExecuteFile(e.Frame,"code.js");
|
||||||
browser.ExecuteScriptAsync(js);
|
|
||||||
|
if (plugins.HasAnyPlugin(PluginEnvironment.Browser)){
|
||||||
|
ScriptLoader.ExecuteFile(e.Frame,PluginManager.PluginBrowserScriptFile);
|
||||||
|
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Browser,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FormBrowser_Activated(object sender, EventArgs e){
|
||||||
|
if (!isLoaded)return;
|
||||||
|
|
||||||
|
trayIcon.HasNotifications = false;
|
||||||
|
}
|
||||||
|
|
||||||
private void FormBrowser_Resize(object sender, EventArgs e){
|
private void FormBrowser_Resize(object sender, EventArgs e){
|
||||||
if (!isLoaded)return;
|
if (!isLoaded)return;
|
||||||
|
|
||||||
@@ -118,7 +130,7 @@ namespace TweetDck.Core{
|
|||||||
prevState = WindowState;
|
prevState = WindowState;
|
||||||
|
|
||||||
if (WindowState == FormWindowState.Minimized){
|
if (WindowState == FormWindowState.Minimized){
|
||||||
if (Config.TrayBehavior == TrayIcon.Behavior.MinimizeToTray){
|
if (Config.TrayBehavior.ShouldHideOnMinimize()){
|
||||||
Hide(); // hides taskbar too?! welp that works I guess
|
Hide(); // hides taskbar too?! welp that works I guess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -132,13 +144,7 @@ namespace TweetDck.Core{
|
|||||||
if (!isLoaded)return;
|
if (!isLoaded)return;
|
||||||
|
|
||||||
if (Location.X != -32000){
|
if (Location.X != -32000){
|
||||||
Config.IsMaximized = WindowState == FormWindowState.Maximized;
|
Config.BrowserWindow.Save(this);
|
||||||
|
|
||||||
if (WindowState == FormWindowState.Normal || (WindowState == FormWindowState.Maximized && !Screen.FromControl(this).Equals(Screen.FromPoint(Config.WindowLocation)))){
|
|
||||||
Config.WindowLocation = Location;
|
|
||||||
Config.WindowSize = Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.Save();
|
Config.Save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,7 +152,7 @@ namespace TweetDck.Core{
|
|||||||
private void FormBrowser_FormClosing(object sender, FormClosingEventArgs e){
|
private void FormBrowser_FormClosing(object sender, FormClosingEventArgs e){
|
||||||
if (!isLoaded)return;
|
if (!isLoaded)return;
|
||||||
|
|
||||||
if (Config.TrayBehavior == TrayIcon.Behavior.CloseToTray && trayIcon.Visible && e.CloseReason == CloseReason.UserClosing){
|
if (Config.TrayBehavior.ShouldHideOnClose() && trayIcon.Visible && e.CloseReason == CloseReason.UserClosing){
|
||||||
Hide(); // hides taskbar too?! welp that works I guess
|
Hide(); // hides taskbar too?! welp that works I guess
|
||||||
e.Cancel = true;
|
e.Cancel = true;
|
||||||
}
|
}
|
||||||
@@ -171,11 +177,42 @@ namespace TweetDck.Core{
|
|||||||
private void trayIcon_ClickClose(object sender, EventArgs e){
|
private void trayIcon_ClickClose(object sender, EventArgs e){
|
||||||
if (!isLoaded)return;
|
if (!isLoaded)return;
|
||||||
|
|
||||||
trayIcon.Visible = false; // checked in FormClosing event
|
ForceClose();
|
||||||
Close();
|
}
|
||||||
|
|
||||||
|
private void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
|
ReloadBrowser();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
||||||
|
browser.ExecuteScriptAsync("window.TDPF_setPluginState",e.Plugin,e.IsEnabled ? 1 : 0); // ExecuteScriptAsync cannot handle boolean values as of yet
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){
|
||||||
|
Hide();
|
||||||
|
|
||||||
|
FormUpdateDownload downloadForm = new FormUpdateDownload(e.UpdateInfo);
|
||||||
|
downloadForm.MoveToCenter(this);
|
||||||
|
downloadForm.ShowDialog();
|
||||||
|
|
||||||
|
if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Succeeded){
|
||||||
|
UpdateInstallerPath = downloadForm.InstallerPath;
|
||||||
|
ForceClose();
|
||||||
|
}
|
||||||
|
else if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Manual){
|
||||||
|
ForceClose();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
|
if (isLoaded && m.Msg == Program.WindowRestoreMessage){
|
||||||
|
trayIcon_ClickRestore(trayIcon,new EventArgs());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (isLoaded && m.Msg == 0x210 && (m.WParam.ToInt32() & 0xFFFF) == 0x020B){ // WM_PARENTNOTIFY, WM_XBUTTONDOWN
|
if (isLoaded && m.Msg == 0x210 && (m.WParam.ToInt32() & 0xFFFF) == 0x020B){ // WM_PARENTNOTIFY, WM_XBUTTONDOWN
|
||||||
browser.ExecuteScriptAsync("TDGF_onMouseClickExtra",(m.WParam.ToInt32() >> 16) & 0xFFFF);
|
browser.ExecuteScriptAsync("TDGF_onMouseClickExtra",(m.WParam.ToInt32() >> 16) & 0xFFFF);
|
||||||
return;
|
return;
|
||||||
@@ -193,7 +230,7 @@ namespace TweetDck.Core{
|
|||||||
else{
|
else{
|
||||||
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
||||||
|
|
||||||
currentFormSettings = new FormSettings(this);
|
currentFormSettings = new FormSettings(this,updates);
|
||||||
|
|
||||||
currentFormSettings.FormClosed += (sender, args) => {
|
currentFormSettings.FormClosed += (sender, args) => {
|
||||||
currentFormSettings = null;
|
currentFormSettings = null;
|
||||||
@@ -201,8 +238,11 @@ namespace TweetDck.Core{
|
|||||||
if (!prevEnableUpdateCheck && Config.EnableUpdateCheck){
|
if (!prevEnableUpdateCheck && Config.EnableUpdateCheck){
|
||||||
Config.DismissedUpdate = string.Empty;
|
Config.DismissedUpdate = string.Empty;
|
||||||
Config.Save();
|
Config.Save();
|
||||||
|
updates.Check(false);
|
||||||
|
}
|
||||||
|
|
||||||
browser.ExecuteScriptAsync("TDGF_runUpdateCheck",new object[0]);
|
if (!Config.EnableTrayHighlight){
|
||||||
|
trayIcon.HasNotifications = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -221,20 +261,24 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTweetPopup(TweetNotification tweet){
|
public void OpenPlugins(){
|
||||||
notification.ShowNotification(tweet);
|
if (currentFormPlugins != null){
|
||||||
|
currentFormPlugins.BringToFront();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
currentFormPlugins = new FormPlugins(plugins);
|
||||||
|
currentFormPlugins.FormClosed += (sender, args) => currentFormPlugins = null;
|
||||||
|
ShowChildForm(currentFormPlugins);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTweetSound(){
|
public void OnTweetNotification(){
|
||||||
|
if (Config.EnableTrayHighlight && !ContainsFocus){
|
||||||
}
|
trayIcon.HasNotifications = true;
|
||||||
|
}
|
||||||
public void DisplayTooltip(string text, bool showInNotification){
|
|
||||||
if (showInNotification){
|
|
||||||
notification.DisplayTooltip(text);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DisplayTooltip(string text){
|
||||||
if (string.IsNullOrEmpty(text)){
|
if (string.IsNullOrEmpty(text)){
|
||||||
toolTip.Hide(this);
|
toolTip.Hide(this);
|
||||||
}
|
}
|
||||||
@@ -253,23 +297,8 @@ namespace TweetDck.Core{
|
|||||||
browser.ExecuteScriptAsync("TDGF_tryPasteImageFinish",new object[0]);
|
browser.ExecuteScriptAsync("TDGF_tryPasteImageFinish",new object[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BeginUpdateProcess(string versionTag, string downloadUrl){
|
public void ReloadBrowser(){
|
||||||
Hide();
|
browser.ExecuteScriptAsync("window.location.reload()");
|
||||||
|
|
||||||
FormUpdateDownload downloadForm = new FormUpdateDownload(new UpdateInfo(versionTag,downloadUrl));
|
|
||||||
downloadForm.MoveToCenter(this);
|
|
||||||
downloadForm.ShowDialog();
|
|
||||||
|
|
||||||
if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Succeeded){
|
|
||||||
UpdateInstallerPath = downloadForm.InstallerPath;
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
else if (downloadForm.UpdateStatus == FormUpdateDownload.Status.Manual){
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
Show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
3
Core/FormNotification.Designer.cs
generated
3
Core/FormNotification.Designer.cs
generated
@@ -34,8 +34,7 @@ namespace TweetDck.Core {
|
|||||||
//
|
//
|
||||||
// panelBrowser
|
// panelBrowser
|
||||||
//
|
//
|
||||||
this.panelBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.panelBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.panelBrowser.BackColor = System.Drawing.Color.White;
|
this.panelBrowser.BackColor = System.Drawing.Color.White;
|
||||||
this.panelBrowser.Location = new System.Drawing.Point(0, 0);
|
this.panelBrowser.Location = new System.Drawing.Point(0, 0);
|
||||||
|
@@ -8,20 +8,50 @@ using TweetDck.Configuration;
|
|||||||
using TweetDck.Core.Handling;
|
using TweetDck.Core.Handling;
|
||||||
using TweetDck.Resources;
|
using TweetDck.Resources;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
|
||||||
namespace TweetDck.Core{
|
namespace TweetDck.Core{
|
||||||
sealed partial class FormNotification : Form{
|
sealed partial class FormNotification : Form{
|
||||||
|
private const string NotificationScriptFile = "notification.js";
|
||||||
|
|
||||||
|
private static readonly string NotificationScriptIdentifier = ScriptLoader.GetRootIdentifier(NotificationScriptFile);
|
||||||
|
private static readonly string PluginScriptIdentifier = ScriptLoader.GetRootIdentifier(PluginManager.PluginNotificationScriptFile);
|
||||||
|
|
||||||
public Func<bool> CanMoveWindow = () => true;
|
public Func<bool> CanMoveWindow = () => true;
|
||||||
|
|
||||||
private readonly Form owner;
|
private readonly Form owner;
|
||||||
private readonly TrayIcon trayIcon;
|
private readonly PluginManager plugins;
|
||||||
private readonly ChromiumWebBrowser browser;
|
private readonly ChromiumWebBrowser browser;
|
||||||
|
|
||||||
private readonly Queue<TweetNotification> tweetQueue = new Queue<TweetNotification>(4);
|
private readonly Queue<TweetNotification> tweetQueue = new Queue<TweetNotification>(4);
|
||||||
private readonly bool autoHide;
|
private readonly bool autoHide;
|
||||||
private int timeLeft, totalTime;
|
private int timeLeft, totalTime;
|
||||||
|
|
||||||
|
private readonly NativeMethods.HookProc mouseHookDelegate;
|
||||||
|
private IntPtr mouseHook;
|
||||||
|
|
||||||
|
private bool? prevDisplayTimer;
|
||||||
|
private int? prevFontSize;
|
||||||
|
|
||||||
|
private bool RequiresResize{
|
||||||
|
get{
|
||||||
|
return !prevDisplayTimer.HasValue || !prevFontSize.HasValue || prevDisplayTimer != Program.UserConfig.DisplayNotificationTimer || prevFontSize != TweetNotification.FontSizeLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
set{
|
||||||
|
if (value){
|
||||||
|
prevDisplayTimer = null;
|
||||||
|
prevFontSize = null;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
prevDisplayTimer = Program.UserConfig.DisplayNotificationTimer;
|
||||||
|
prevFontSize = TweetNotification.FontSizeLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private readonly string notificationJS;
|
private readonly string notificationJS;
|
||||||
|
private readonly string pluginJS;
|
||||||
|
|
||||||
protected override bool ShowWithoutActivation{
|
protected override bool ShowWithoutActivation{
|
||||||
get{
|
get{
|
||||||
@@ -33,6 +63,9 @@ namespace TweetDck.Core{
|
|||||||
public bool ContextMenuOpen { get; set; }
|
public bool ContextMenuOpen { get; set; }
|
||||||
public string CurrentUrl { get; private set; }
|
public string CurrentUrl { get; private set; }
|
||||||
|
|
||||||
|
public EventHandler Initialized;
|
||||||
|
private bool isInitialized;
|
||||||
|
|
||||||
private static int BaseClientWidth{
|
private static int BaseClientWidth{
|
||||||
get{
|
get{
|
||||||
int level = TweetNotification.FontSizeLevel;
|
int level = TweetNotification.FontSizeLevel;
|
||||||
@@ -47,22 +80,29 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormNotification(Form owner, TweetDeckBridge bridge, TrayIcon trayIcon, bool autoHide){
|
public FormNotification(FormBrowser owner, PluginManager pluginManager, bool autoHide){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName;
|
Text = Program.BrandName;
|
||||||
|
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
this.trayIcon = trayIcon;
|
this.plugins = pluginManager;
|
||||||
this.autoHide = autoHide;
|
this.autoHide = autoHide;
|
||||||
|
|
||||||
owner.FormClosed += (sender, args) => Close();
|
owner.FormClosed += (sender, args) => Close();
|
||||||
|
|
||||||
notificationJS = ScriptLoader.LoadResource("notification.js");
|
notificationJS = ScriptLoader.LoadResource(NotificationScriptFile);
|
||||||
|
pluginJS = ScriptLoader.LoadResource(PluginManager.PluginNotificationScriptFile);
|
||||||
|
|
||||||
browser = new ChromiumWebBrowser("about:blank"){ MenuHandler = new ContextMenuNotification(this,autoHide) };
|
browser = new ChromiumWebBrowser("about:blank"){
|
||||||
|
MenuHandler = new ContextMenuNotification(this,autoHide),
|
||||||
|
LifeSpanHandler = new LifeSpanHandler()
|
||||||
|
};
|
||||||
|
|
||||||
|
browser.IsBrowserInitializedChanged += Browser_IsBrowserInitializedChanged;
|
||||||
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||||
browser.RegisterJsObject("$TD",bridge);
|
browser.RegisterJsObject("$TD",new TweetDeckBridge(owner,this));
|
||||||
|
browser.RegisterAsyncJsObject("$TDP",plugins.Bridge);
|
||||||
|
|
||||||
panelBrowser.Controls.Add(browser);
|
panelBrowser.Controls.Add(browser);
|
||||||
|
|
||||||
@@ -71,7 +111,10 @@ namespace TweetDck.Core{
|
|||||||
Disposed += (sender, args) => Program.UserConfig.MuteToggled -= Config_MuteToggled;
|
Disposed += (sender, args) => Program.UserConfig.MuteToggled -= Config_MuteToggled;
|
||||||
}
|
}
|
||||||
|
|
||||||
Disposed += (sender, args) => browser.Dispose();
|
mouseHookDelegate = MouseHookProc;
|
||||||
|
mouseHook = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MOUSE_LL,mouseHookDelegate,IntPtr.Zero,0);
|
||||||
|
|
||||||
|
Disposed += FormNotification_Disposed;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
@@ -82,13 +125,27 @@ namespace TweetDck.Core{
|
|||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){
|
||||||
|
if (!ContainsFocus && wParam.ToInt32() == NativeMethods.WH_MOUSEWHEEL && browser.Bounds.Contains(PointToClient(Cursor.Position))){
|
||||||
|
// fuck it, Activate() doesn't work with this
|
||||||
|
Point prevPos = Cursor.Position;
|
||||||
|
Cursor.Position = PointToScreen(new Point(-1,-1));
|
||||||
|
NativeMethods.SimulateMouseClick(NativeMethods.MouseButton.Left);
|
||||||
|
Cursor.Position = prevPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NativeMethods.CallNextHookEx(mouseHook,nCode,wParam,lParam);
|
||||||
|
}
|
||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void timerHideProgress_Tick(object sender, EventArgs e){
|
private void timerHideProgress_Tick(object sender, EventArgs e){
|
||||||
if (Bounds.Contains(Cursor.Position) || FreezeTimer || ContextMenuOpen)return;
|
if (Bounds.Contains(Cursor.Position) || FreezeTimer || ContextMenuOpen)return;
|
||||||
|
|
||||||
timeLeft -= timerProgress.Interval;
|
timeLeft -= timerProgress.Interval;
|
||||||
progressBarTimer.SetValueInstant((int)Math.Min(1000,Math.Round(1050.0*(totalTime-timeLeft)/totalTime)));
|
|
||||||
|
int value = (int)Math.Round(1025.0*(totalTime-timeLeft)/totalTime);
|
||||||
|
progressBarTimer.SetValueInstant(Math.Min(1000,Math.Max(0,Program.UserConfig.NotificationTimerCountDown ? 1000-value : value)));
|
||||||
|
|
||||||
if (timeLeft <= 0){
|
if (timeLeft <= 0){
|
||||||
FinishCurrentTweet();
|
FinishCurrentTweet();
|
||||||
@@ -97,42 +154,63 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private void Config_MuteToggled(object sender, EventArgs e){
|
private void Config_MuteToggled(object sender, EventArgs e){
|
||||||
if (Program.UserConfig.MuteNotifications){
|
if (Program.UserConfig.MuteNotifications){
|
||||||
HideNotification();
|
HideNotification(true);
|
||||||
}
|
}
|
||||||
else{
|
else if (tweetQueue.Count > 0){
|
||||||
if (tweetQueue.Count > 0){
|
|
||||||
MoveToVisibleLocation();
|
|
||||||
LoadNextNotification();
|
LoadNextNotification();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trayIcon.HasNotifications = false;
|
private void Browser_IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs e){
|
||||||
|
if (e.IsBrowserInitialized && Initialized != null){
|
||||||
|
Initialized(this,new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
if (e.Frame.IsMain && notificationJS != null && browser.Address != "about:blank"){
|
if (!e.Frame.IsMain)return;
|
||||||
browser.ExecuteScriptAsync(notificationJS);
|
|
||||||
|
if (!isInitialized && !Program.UserConfig.NotificationLegacyLoad){
|
||||||
|
isInitialized = true;
|
||||||
|
|
||||||
|
if (Initialized != null){
|
||||||
|
Initialized(this,new EventArgs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (notificationJS != null && browser.Address != "about:blank"){
|
||||||
|
ScriptLoader.ExecuteScript(e.Frame,notificationJS,NotificationScriptIdentifier);
|
||||||
|
|
||||||
|
if (plugins.HasAnyPlugin(PluginEnvironment.Notification)){
|
||||||
|
ScriptLoader.ExecuteScript(e.Frame,pluginJS,PluginScriptIdentifier);
|
||||||
|
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Notification,false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormNotification_FormClosing(object sender, FormClosingEventArgs e){
|
private void FormNotification_FormClosing(object sender, FormClosingEventArgs e){
|
||||||
if (e.CloseReason == CloseReason.UserClosing){
|
if (e.CloseReason == CloseReason.UserClosing){
|
||||||
HideNotification();
|
HideNotification(false);
|
||||||
tweetQueue.Clear();
|
tweetQueue.Clear();
|
||||||
e.Cancel = true;
|
e.Cancel = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FormNotification_Disposed(object sender, EventArgs e){
|
||||||
|
browser.Dispose();
|
||||||
|
|
||||||
|
if (mouseHook != IntPtr.Zero){
|
||||||
|
NativeMethods.UnhookWindowsHookEx(mouseHook);
|
||||||
|
mouseHook = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// notification methods
|
// notification methods
|
||||||
|
|
||||||
public void ShowNotification(TweetNotification notification){
|
public void ShowNotification(TweetNotification notification){
|
||||||
if (Program.UserConfig.MuteNotifications){
|
if (Program.UserConfig.MuteNotifications){
|
||||||
tweetQueue.Enqueue(notification);
|
tweetQueue.Enqueue(notification);
|
||||||
trayIcon.HasNotifications = true;
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
MoveToVisibleLocation();
|
|
||||||
|
|
||||||
tweetQueue.Enqueue(notification);
|
tweetQueue.Enqueue(notification);
|
||||||
UpdateTitle();
|
UpdateTitle();
|
||||||
|
|
||||||
@@ -143,32 +221,36 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void ShowNotificationForSettings(bool reset){
|
public void ShowNotificationForSettings(bool reset){
|
||||||
if (browser.Address == "about:blank"){
|
|
||||||
browser.Load("about:blank"); // required, otherwise shit breaks
|
|
||||||
reset = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reset){
|
if (reset){
|
||||||
LoadTweet(TweetNotification.ExampleTweet);
|
LoadTweet(TweetNotification.ExampleTweet);
|
||||||
timerProgress.Start();
|
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
MoveToVisibleLocation();
|
MoveToVisibleLocation();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void HideNotification(){
|
public void HideNotification(bool loadBlank){
|
||||||
|
if (loadBlank || Program.UserConfig.NotificationLegacyLoad){
|
||||||
browser.LoadHtml("","about:blank");
|
browser.LoadHtml("","about:blank");
|
||||||
|
}
|
||||||
|
|
||||||
Location = new Point(-32000,-32000);
|
Location = new Point(-32000,-32000);
|
||||||
progressBarTimer.Value = 0;
|
progressBarTimer.Value = Program.UserConfig.NotificationTimerCountDown ? 1000 : 0;
|
||||||
timerProgress.Stop();
|
timerProgress.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnNotificationReady(){
|
||||||
|
UpdateTitle();
|
||||||
|
MoveToVisibleLocation();
|
||||||
|
timerProgress.Start();
|
||||||
|
}
|
||||||
|
|
||||||
public void FinishCurrentTweet(){
|
public void FinishCurrentTweet(){
|
||||||
if (tweetQueue.Count > 0){
|
if (tweetQueue.Count > 0){
|
||||||
LoadNextNotification();
|
LoadNextNotification();
|
||||||
}
|
}
|
||||||
else if (autoHide){
|
else if (autoHide){
|
||||||
HideNotification();
|
HideNotification(true);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
timerProgress.Stop();
|
timerProgress.Stop();
|
||||||
@@ -176,33 +258,28 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void LoadNextNotification(){
|
private void LoadNextNotification(){
|
||||||
TweetNotification tweet = tweetQueue.Dequeue();
|
LoadTweet(tweetQueue.Dequeue());
|
||||||
|
|
||||||
if (browser.Address == "about:blank"){
|
|
||||||
browser.Load("about:blank"); // required, otherwise shit breaks
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadTweet(tweet);
|
|
||||||
timerProgress.Stop();
|
|
||||||
timerProgress.Start();
|
|
||||||
|
|
||||||
UpdateTitle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadTweet(TweetNotification tweet){
|
private void LoadTweet(TweetNotification tweet){
|
||||||
browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/");
|
|
||||||
|
|
||||||
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDuration);
|
|
||||||
progressBarTimer.Value = 0;
|
|
||||||
|
|
||||||
CurrentUrl = tweet.Url;
|
CurrentUrl = tweet.Url;
|
||||||
|
|
||||||
|
timerProgress.Stop();
|
||||||
|
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDurationValue);
|
||||||
|
progressBarTimer.Value = Program.UserConfig.NotificationTimerCountDown ? 1000 : 0;
|
||||||
|
|
||||||
|
browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/?"+DateTime.Now.Ticks);
|
||||||
|
|
||||||
|
if (Program.UserConfig.NotificationLegacyLoad){
|
||||||
|
OnNotificationReady();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MoveToVisibleLocation(){
|
private void MoveToVisibleLocation(){
|
||||||
bool needsReactivating = Location.X == -32000;
|
|
||||||
|
|
||||||
UserConfig config = Program.UserConfig;
|
UserConfig config = Program.UserConfig;
|
||||||
Screen screen = Screen.FromControl(owner);
|
|
||||||
|
if (RequiresResize){
|
||||||
|
RequiresResize = false;
|
||||||
|
|
||||||
if (config.DisplayNotificationTimer){
|
if (config.DisplayNotificationTimer){
|
||||||
ClientSize = new Size(BaseClientWidth,BaseClientHeight+4);
|
ClientSize = new Size(BaseClientWidth,BaseClientHeight+4);
|
||||||
@@ -213,10 +290,16 @@ namespace TweetDck.Core{
|
|||||||
progressBarTimer.Visible = false;
|
progressBarTimer.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
panelBrowser.Height = BaseClientHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
Screen screen = Screen.FromControl(owner);
|
||||||
|
|
||||||
if (config.NotificationDisplay > 0 && config.NotificationDisplay <= Screen.AllScreens.Length){
|
if (config.NotificationDisplay > 0 && config.NotificationDisplay <= Screen.AllScreens.Length){
|
||||||
screen = Screen.AllScreens[config.NotificationDisplay-1];
|
screen = Screen.AllScreens[config.NotificationDisplay-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool needsReactivating = Location.X == -32000;
|
||||||
int edgeDist = config.NotificationEdgeDistance;
|
int edgeDist = config.NotificationEdgeDistance;
|
||||||
|
|
||||||
switch(config.NotificationPosition){
|
switch(config.NotificationPosition){
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
@@ -12,7 +13,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
private const int MenuCopyImageUrl = 26504;
|
private const int MenuCopyImageUrl = 26504;
|
||||||
|
|
||||||
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||||
if (parameters.TypeFlags.HasFlag(ContextMenuType.Link) && !parameters.UnfilteredLinkUrl.EndsWith("tweetdeck.twitter.com/#")){
|
if (parameters.TypeFlags.HasFlag(ContextMenuType.Link) && !parameters.UnfilteredLinkUrl.EndsWith("tweetdeck.twitter.com/#",StringComparison.Ordinal)){
|
||||||
model.AddItem((CefMenuCommand)MenuOpenUrlInBrowser,"Open in browser");
|
model.AddItem((CefMenuCommand)MenuOpenUrlInBrowser,"Open in browser");
|
||||||
model.AddItem((CefMenuCommand)MenuCopyUrl,"Copy link address");
|
model.AddItem((CefMenuCommand)MenuCopyUrl,"Copy link address");
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
@@ -77,7 +78,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void RemoveSeparatorIfLast(IMenuModel model){
|
protected static void RemoveSeparatorIfLast(IMenuModel model){
|
||||||
if (model.Count > 0 && model.GetTypeAt(model.Count-1) == MenuItemType.Separator){
|
if (model.Count > 0 && model.GetTypeAt(model.Count-1) == MenuItemType.Separator){
|
||||||
model.RemoveAt(model.Count-1);
|
model.RemoveAt(model.Count-1);
|
||||||
}
|
}
|
||||||
|
@@ -5,9 +5,11 @@ using TweetDck.Core.Controls;
|
|||||||
namespace TweetDck.Core.Handling{
|
namespace TweetDck.Core.Handling{
|
||||||
class ContextMenuBrowser : ContextMenuBase{
|
class ContextMenuBrowser : ContextMenuBase{
|
||||||
private const int MenuSettings = 26600;
|
private const int MenuSettings = 26600;
|
||||||
|
private const int MenuPlugins = 26005;
|
||||||
private const int MenuAbout = 26601;
|
private const int MenuAbout = 26601;
|
||||||
private const int MenuMute = 26602;
|
private const int MenuMute = 26602;
|
||||||
private const int MenuCopyTweetUrl = 26603;
|
private const int MenuCopyTweetUrl = 26603;
|
||||||
|
private const int MenuCopyTweetEmbeddedUrl = 26604;
|
||||||
|
|
||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
|
|
||||||
@@ -24,6 +26,11 @@ namespace TweetDck.Core.Handling{
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweet)){
|
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweet)){
|
||||||
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweetEmbedded)){
|
||||||
|
model.AddItem((CefMenuCommand)MenuCopyTweetEmbeddedUrl,"Copy quoted tweet address");
|
||||||
|
}
|
||||||
|
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,10 +46,8 @@ namespace TweetDck.Core.Handling{
|
|||||||
model.SetChecked((CefMenuCommand)MenuMute,Program.UserConfig.MuteNotifications);
|
model.SetChecked((CefMenuCommand)MenuMute,Program.UserConfig.MuteNotifications);
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
|
|
||||||
if (TweetNotification.IsReady){
|
|
||||||
model.AddItem((CefMenuCommand)MenuSettings,"Settings");
|
model.AddItem((CefMenuCommand)MenuSettings,"Settings");
|
||||||
}
|
model.AddItem((CefMenuCommand)MenuPlugins,"Plugins");
|
||||||
|
|
||||||
model.AddItem((CefMenuCommand)MenuAbout,"About "+Program.BrandName);
|
model.AddItem((CefMenuCommand)MenuAbout,"About "+Program.BrandName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,6 +57,10 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch((int)commandId){
|
switch((int)commandId){
|
||||||
|
case (int)CefMenuCommand.Reload:
|
||||||
|
frame.ExecuteJavaScriptAsync("window.location.href = 'https://tweetdeck.twitter.com'");
|
||||||
|
return true;
|
||||||
|
|
||||||
case MenuSettings:
|
case MenuSettings:
|
||||||
form.InvokeSafe(form.OpenSettings);
|
form.InvokeSafe(form.OpenSettings);
|
||||||
return true;
|
return true;
|
||||||
@@ -60,6 +69,10 @@ namespace TweetDck.Core.Handling{
|
|||||||
form.InvokeSafe(form.OpenAbout);
|
form.InvokeSafe(form.OpenAbout);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case MenuPlugins:
|
||||||
|
form.InvokeSafe(form.OpenPlugins);
|
||||||
|
return true;
|
||||||
|
|
||||||
case MenuMute:
|
case MenuMute:
|
||||||
form.InvokeSafe(() => {
|
form.InvokeSafe(() => {
|
||||||
Program.UserConfig.MuteNotifications = !Program.UserConfig.MuteNotifications;
|
Program.UserConfig.MuteNotifications = !Program.UserConfig.MuteNotifications;
|
||||||
@@ -71,6 +84,10 @@ namespace TweetDck.Core.Handling{
|
|||||||
case MenuCopyTweetUrl:
|
case MenuCopyTweetUrl:
|
||||||
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweet,TextDataFormat.UnicodeText);
|
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweet,TextDataFormat.UnicodeText);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case MenuCopyTweetEmbeddedUrl:
|
||||||
|
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweetEmbedded,TextDataFormat.UnicodeText);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@@ -7,6 +7,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
private const int MenuSkipTweet = 26600;
|
private const int MenuSkipTweet = 26600;
|
||||||
private const int MenuFreeze = 26601;
|
private const int MenuFreeze = 26601;
|
||||||
private const int MenuCopyTweetUrl = 26602;
|
private const int MenuCopyTweetUrl = 26602;
|
||||||
|
private const int MenuCopyTweetEmbeddedUrl = 26603;
|
||||||
|
|
||||||
private readonly FormNotification form;
|
private readonly FormNotification form;
|
||||||
private readonly bool enableCustomMenu;
|
private readonly bool enableCustomMenu;
|
||||||
@@ -27,6 +28,11 @@ namespace TweetDck.Core.Handling{
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(form.CurrentUrl)){
|
if (!string.IsNullOrEmpty(form.CurrentUrl)){
|
||||||
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(TweetDeckBridge.NotificationTweetEmbedded)){
|
||||||
|
model.AddItem((CefMenuCommand)MenuCopyTweetEmbeddedUrl,"Copy quoted tweet address");
|
||||||
|
}
|
||||||
|
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,6 +60,10 @@ namespace TweetDck.Core.Handling{
|
|||||||
case MenuCopyTweetUrl:
|
case MenuCopyTweetUrl:
|
||||||
Clipboard.SetText(form.CurrentUrl,TextDataFormat.UnicodeText);
|
Clipboard.SetText(form.CurrentUrl,TextDataFormat.UnicodeText);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case MenuCopyTweetEmbeddedUrl:
|
||||||
|
Clipboard.SetText(TweetDeckBridge.NotificationTweetEmbedded,TextDataFormat.UnicodeText);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
30
Core/Handling/LifeSpanHandler.cs
Normal file
30
Core/Handling/LifeSpanHandler.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using CefSharp;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Handling{
|
||||||
|
class LifeSpanHandler : ILifeSpanHandler{
|
||||||
|
public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser){
|
||||||
|
newBrowser = null;
|
||||||
|
|
||||||
|
switch(targetDisposition){
|
||||||
|
case WindowOpenDisposition.NewBackgroundTab:
|
||||||
|
case WindowOpenDisposition.NewForegroundTab:
|
||||||
|
case WindowOpenDisposition.NewPopup:
|
||||||
|
case WindowOpenDisposition.NewWindow:
|
||||||
|
BrowserUtils.OpenExternalBrowser(targetUrl);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser){}
|
||||||
|
|
||||||
|
public bool DoClose(IWebBrowser browserControl, IBrowser browser){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser){}
|
||||||
|
}
|
||||||
|
}
|
@@ -10,9 +10,12 @@ namespace TweetDck.Core.Handling{
|
|||||||
class TweetDeckBridge{
|
class TweetDeckBridge{
|
||||||
public static string LastRightClickedLink = string.Empty;
|
public static string LastRightClickedLink = string.Empty;
|
||||||
public static string LastHighlightedTweet = string.Empty;
|
public static string LastHighlightedTweet = string.Empty;
|
||||||
|
public static string LastHighlightedTweetEmbedded = string.Empty;
|
||||||
|
public static string NotificationTweetEmbedded = string.Empty;
|
||||||
public static string ClipboardImagePath = string.Empty;
|
public static string ClipboardImagePath = string.Empty;
|
||||||
|
|
||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
|
private readonly FormNotification notification;
|
||||||
|
|
||||||
public string BrandName{
|
public string BrandName{
|
||||||
get{
|
get{
|
||||||
@@ -32,26 +35,27 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateCheckEnabled{
|
|
||||||
get{
|
|
||||||
return Program.UserConfig.EnableUpdateCheck;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ExpandLinksOnHover{
|
public bool ExpandLinksOnHover{
|
||||||
get{
|
get{
|
||||||
return Program.UserConfig.ExpandLinksOnHover;
|
return Program.UserConfig.ExpandLinksOnHover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string DismissedVersionTag{
|
public bool HasCustomBrowserCSS{
|
||||||
get{
|
get{
|
||||||
return Program.UserConfig.DismissedUpdate ?? string.Empty;
|
return !string.IsNullOrEmpty(Program.UserConfig.CustomBrowserCSS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TweetDeckBridge(FormBrowser form){
|
public string CustomBrowserCSS{
|
||||||
|
get{
|
||||||
|
return Program.UserConfig.CustomBrowserCSS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TweetDeckBridge(FormBrowser form, FormNotification notification){
|
||||||
this.form = form;
|
this.form = form;
|
||||||
|
this.notification = notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadFontSizeClass(string fsClass){
|
public void LoadFontSizeClass(string fsClass){
|
||||||
@@ -70,41 +74,49 @@ namespace TweetDck.Core.Handling{
|
|||||||
form.InvokeSafe(() => LastRightClickedLink = link);
|
form.InvokeSafe(() => LastRightClickedLink = link);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetLastHighlightedTweet(string link){
|
public void SetLastHighlightedTweet(string link, string embeddedLink){
|
||||||
form.InvokeSafe(() => LastHighlightedTweet = link);
|
form.InvokeSafe(() => {
|
||||||
|
LastHighlightedTweet = link;
|
||||||
|
LastHighlightedTweetEmbedded = embeddedLink;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetNotificationTweetEmbedded(string link){
|
||||||
|
form.InvokeSafe(() => NotificationTweetEmbedded = link);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenSettingsMenu(){
|
public void OpenSettingsMenu(){
|
||||||
form.InvokeSafe(form.OpenSettings);
|
form.InvokeSafe(form.OpenSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OpenPluginsMenu(){
|
||||||
|
form.InvokeSafe(form.OpenPlugins);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnTweetPopup(string tweetHtml, string tweetUrl, int tweetCharacters){
|
public void OnTweetPopup(string tweetHtml, string tweetUrl, int tweetCharacters){
|
||||||
form.InvokeSafe(() => {
|
notification.InvokeSafe(() => {
|
||||||
form.OnTweetPopup(new TweetNotification(tweetHtml,tweetUrl,tweetCharacters));
|
form.OnTweetNotification();
|
||||||
|
notification.ShowNotification(new TweetNotification(tweetHtml,tweetUrl,tweetCharacters));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTweetSound(){
|
public void OnTweetSound(){
|
||||||
form.InvokeSafe(form.OnTweetSound);
|
form.InvokeSafe(form.OnTweetNotification);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
public void OnNotificationReady(){
|
||||||
form.InvokeSafe(() => {
|
if (!Program.UserConfig.NotificationLegacyLoad){
|
||||||
form.BeginUpdateProcess(versionTag,downloadUrl);
|
notification.InvokeSafe(notification.OnNotificationReady);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdateDismissed(string versionTag){
|
|
||||||
form.InvokeSafe(() => {
|
|
||||||
Program.UserConfig.DismissedUpdate = versionTag;
|
|
||||||
Program.UserConfig.Save();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text, bool showInNotification){
|
public void DisplayTooltip(string text, bool showInNotification){
|
||||||
form.InvokeSafe(() => {
|
if (showInNotification){
|
||||||
form.DisplayTooltip(text,showInNotification);
|
notification.InvokeSafe(() => notification.DisplayTooltip(text));
|
||||||
});
|
}
|
||||||
|
else{
|
||||||
|
form.InvokeSafe(() => form.DisplayTooltip(text));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TryPasteImage(){
|
public void TryPasteImage(){
|
||||||
|
@@ -6,9 +6,21 @@ namespace TweetDck.Core.Handling{
|
|||||||
private static string FontSizeClass { get; set; }
|
private static string FontSizeClass { get; set; }
|
||||||
private static string HeadTag { get; set; }
|
private static string HeadTag { get; set; }
|
||||||
|
|
||||||
public static bool IsReady{
|
private static string DefaultFontSizeClass{
|
||||||
get{
|
get{
|
||||||
return FontSizeClass != null && HeadTag != null;
|
return "medium";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string DefaultHeadTag{
|
||||||
|
get{
|
||||||
|
return @"<meta charset='utf-8'><meta http-equiv='X-UA-Compatible' content='chrome=1'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/font.5ef884f9f9.css'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/app-dark.5631e0dd42.css'>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string CustomCSS{
|
||||||
|
get{
|
||||||
|
return @".scroll-styled-v::-webkit-scrollbar{width:8px}.scroll-styled-v::-webkit-scrollbar-thumb{border-radius:0}a[data-full-url]{word-break:break-all}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,24 +86,21 @@ namespace TweetDck.Core.Handling{
|
|||||||
this.characters = characters;
|
this.characters = characters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetDisplayDuration(Duration modifier){
|
public int GetDisplayDuration(int value){
|
||||||
int multiplier;
|
return 2000+Math.Max(1000,value*characters);
|
||||||
|
|
||||||
switch(modifier){
|
|
||||||
case Duration.Short: multiplier = 15; break;
|
|
||||||
case Duration.Long: multiplier = 35; break;
|
|
||||||
case Duration.VeryLong: multiplier = 45; break;
|
|
||||||
default: multiplier = 25; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 2000+Math.Max(1000,multiplier*characters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GenerateHtml(){
|
public string GenerateHtml(){
|
||||||
StringBuilder build = new StringBuilder();
|
StringBuilder build = new StringBuilder();
|
||||||
build.Append("<!DOCTYPE html>");
|
build.Append("<!DOCTYPE html>");
|
||||||
build.Append("<html class='os-windows txt-base-").Append(FontSizeClass).Append("'>");
|
build.Append("<html class='os-windows txt-base-").Append(FontSizeClass ?? DefaultFontSizeClass).Append("'>");
|
||||||
build.Append("<head>").Append(HeadTag).Append("</head>");
|
build.Append("<head>").Append(HeadTag ?? DefaultHeadTag).Append("<style type='text/css'>").Append(CustomCSS).Append("</style>");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(Program.UserConfig.CustomNotificationCSS)){
|
||||||
|
build.Append("<style type='text/css'>").Append(Program.UserConfig.CustomNotificationCSS).Append("</style>");
|
||||||
|
}
|
||||||
|
|
||||||
|
build.Append("</head>");
|
||||||
build.Append("<body class='hearty'><div class='app-columns-container'><div class='column scroll-styled-v' style='width:100%;overflow-y:auto'>");
|
build.Append("<body class='hearty'><div class='app-columns-container'><div class='column scroll-styled-v' style='width:100%;overflow-y:auto'>");
|
||||||
build.Append(html);
|
build.Append(html);
|
||||||
build.Append("</div></div></body>");
|
build.Append("</div></div></body>");
|
||||||
|
108
Core/Other/FormPlugins.Designer.cs
generated
Normal file
108
Core/Other/FormPlugins.Designer.cs
generated
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
namespace TweetDck.Core.Other {
|
||||||
|
partial class FormPlugins {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPlugins));
|
||||||
|
this.btnClose = new System.Windows.Forms.Button();
|
||||||
|
this.btnReload = new System.Windows.Forms.Button();
|
||||||
|
this.btnOpenFolder = new System.Windows.Forms.Button();
|
||||||
|
this.tabPanelPlugins = new TweetDck.Core.Controls.TabPanel();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// btnClose
|
||||||
|
//
|
||||||
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnClose.AutoSize = true;
|
||||||
|
this.btnClose.Location = new System.Drawing.Point(643, 439);
|
||||||
|
this.btnClose.Name = "btnClose";
|
||||||
|
this.btnClose.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnClose.Size = new System.Drawing.Size(49, 23);
|
||||||
|
this.btnClose.TabIndex = 1;
|
||||||
|
this.btnClose.Text = "Close";
|
||||||
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
|
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||||
|
//
|
||||||
|
// btnReload
|
||||||
|
//
|
||||||
|
this.btnReload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnReload.AutoSize = true;
|
||||||
|
this.btnReload.Location = new System.Drawing.Point(131, 439);
|
||||||
|
this.btnReload.Name = "btnReload";
|
||||||
|
this.btnReload.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnReload.Size = new System.Drawing.Size(71, 23);
|
||||||
|
this.btnReload.TabIndex = 2;
|
||||||
|
this.btnReload.Text = "Reload All";
|
||||||
|
this.btnReload.UseVisualStyleBackColor = true;
|
||||||
|
this.btnReload.Click += new System.EventHandler(this.btnReload_Click);
|
||||||
|
//
|
||||||
|
// btnOpenFolder
|
||||||
|
//
|
||||||
|
this.btnOpenFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnOpenFolder.AutoSize = true;
|
||||||
|
this.btnOpenFolder.Location = new System.Drawing.Point(12, 439);
|
||||||
|
this.btnOpenFolder.Name = "btnOpenFolder";
|
||||||
|
this.btnOpenFolder.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnOpenFolder.Size = new System.Drawing.Size(113, 23);
|
||||||
|
this.btnOpenFolder.TabIndex = 3;
|
||||||
|
this.btnOpenFolder.Text = "Open Plugin Folder";
|
||||||
|
this.btnOpenFolder.UseVisualStyleBackColor = true;
|
||||||
|
this.btnOpenFolder.Click += new System.EventHandler(this.btnOpenFolder_Click);
|
||||||
|
//
|
||||||
|
// pluginList
|
||||||
|
//
|
||||||
|
this.tabPanelPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.tabPanelPlugins.Location = new System.Drawing.Point(12, 12);
|
||||||
|
this.tabPanelPlugins.Name = "tabPanelPlugins";
|
||||||
|
this.tabPanelPlugins.Size = new System.Drawing.Size(680, 421);
|
||||||
|
this.tabPanelPlugins.TabIndex = 4;
|
||||||
|
//
|
||||||
|
// FormPlugins
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(704, 474);
|
||||||
|
this.Controls.Add(this.tabPanelPlugins);
|
||||||
|
this.Controls.Add(this.btnOpenFolder);
|
||||||
|
this.Controls.Add(this.btnReload);
|
||||||
|
this.Controls.Add(this.btnClose);
|
||||||
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
|
this.MinimumSize = new System.Drawing.Size(480, 320);
|
||||||
|
this.Name = "FormPlugins";
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.Text = "Plugins";
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Button btnClose;
|
||||||
|
private System.Windows.Forms.Button btnReload;
|
||||||
|
private System.Windows.Forms.Button btnOpenFolder;
|
||||||
|
private TweetDck.Core.Controls.TabPanel tabPanelPlugins;
|
||||||
|
}
|
||||||
|
}
|
95
Core/Other/FormPlugins.cs
Normal file
95
Core/Other/FormPlugins.cs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
using TweetDck.Plugins.Controls;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other{
|
||||||
|
partial class FormPlugins : Form{
|
||||||
|
private readonly PluginManager pluginManager;
|
||||||
|
private readonly TabButton tabBtnOfficial, tabBtnCustom;
|
||||||
|
private readonly PluginListFlowLayout flowLayoutPlugins;
|
||||||
|
|
||||||
|
private PluginGroup? selectedGroup;
|
||||||
|
|
||||||
|
public FormPlugins(){
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormPlugins(PluginManager pluginManager) : this(){
|
||||||
|
this.pluginManager = pluginManager;
|
||||||
|
this.pluginManager.Reloaded += pluginManager_Reloaded;
|
||||||
|
|
||||||
|
this.flowLayoutPlugins = new PluginListFlowLayout();
|
||||||
|
this.flowLayoutPlugins.Resize += flowLayoutPlugins_Resize;
|
||||||
|
|
||||||
|
this.tabPanelPlugins.SetupTabPanel(90);
|
||||||
|
this.tabPanelPlugins.ReplaceContent(flowLayoutPlugins);
|
||||||
|
|
||||||
|
this.tabBtnOfficial = tabPanelPlugins.AddButton("",() => SelectGroup(PluginGroup.Official));
|
||||||
|
this.tabBtnCustom = tabPanelPlugins.AddButton("",() => SelectGroup(PluginGroup.Custom));
|
||||||
|
|
||||||
|
this.tabPanelPlugins.SelectTab(tabBtnOfficial);
|
||||||
|
this.pluginManager_Reloaded(pluginManager,null);
|
||||||
|
|
||||||
|
Shown += (sender, args) => {
|
||||||
|
Program.UserConfig.PluginsWindow.Restore(this,false);
|
||||||
|
};
|
||||||
|
|
||||||
|
FormClosed += (sender, args) => {
|
||||||
|
Program.UserConfig.PluginsWindow.Save(this);
|
||||||
|
Program.UserConfig.Save();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SelectGroup(PluginGroup group){
|
||||||
|
if (selectedGroup.HasValue && selectedGroup == group)return;
|
||||||
|
|
||||||
|
selectedGroup = group;
|
||||||
|
|
||||||
|
ReloadPluginTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReloadPluginTab(){
|
||||||
|
if (!selectedGroup.HasValue)return;
|
||||||
|
|
||||||
|
flowLayoutPlugins.SuspendLayout();
|
||||||
|
flowLayoutPlugins.Controls.Clear();
|
||||||
|
|
||||||
|
foreach(Plugin plugin in pluginManager.GetPluginsByGroup(selectedGroup.Value)){
|
||||||
|
flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager,plugin));
|
||||||
|
}
|
||||||
|
|
||||||
|
flowLayoutPlugins_Resize(flowLayoutPlugins,new EventArgs());
|
||||||
|
flowLayoutPlugins.ResumeLayout(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pluginManager_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
|
tabBtnOfficial.Text = "Official: "+pluginManager.CountPluginByGroup(PluginGroup.Official);
|
||||||
|
tabBtnCustom.Text = "Custom: "+pluginManager.CountPluginByGroup(PluginGroup.Custom);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void flowLayoutPlugins_Resize(object sender, EventArgs e){
|
||||||
|
int horizontalOffset = 8+(flowLayoutPlugins.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
|
||||||
|
|
||||||
|
foreach(Control control in flowLayoutPlugins.Controls){
|
||||||
|
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnOpenFolder_Click(object sender, EventArgs e){
|
||||||
|
using(Process.Start("explorer.exe","\""+pluginManager.PathCustomPlugins+"\"")){}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnReload_Click(object sender, EventArgs e){
|
||||||
|
pluginManager.Reload();
|
||||||
|
ReloadPluginTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnClose_Click(object sender, EventArgs e){
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
403
Core/Other/FormSettings.Designer.cs
generated
403
Core/Other/FormSettings.Designer.cs
generated
@@ -24,348 +24,51 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSettings));
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSettings));
|
||||||
this.groupNotificationLocation = new System.Windows.Forms.GroupBox();
|
this.btnClose = new System.Windows.Forms.Button();
|
||||||
this.labelDisplay = new System.Windows.Forms.Label();
|
this.labelTip = new System.Windows.Forms.Label();
|
||||||
this.comboBoxDisplay = new System.Windows.Forms.ComboBox();
|
this.tabPanel = new TweetDck.Core.Controls.TabPanel();
|
||||||
this.labelEdgeDistance = new System.Windows.Forms.Label();
|
|
||||||
this.trackBarEdgeDistance = new System.Windows.Forms.TrackBar();
|
|
||||||
this.radioLocCustom = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioLocBR = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioLocBL = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioLocTR = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioLocTL = new System.Windows.Forms.RadioButton();
|
|
||||||
this.tableLayout = new System.Windows.Forms.TableLayoutPanel();
|
|
||||||
this.tableColumn2Panel = new System.Windows.Forms.Panel();
|
|
||||||
this.groupUserInterface = new System.Windows.Forms.GroupBox();
|
|
||||||
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
|
||||||
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
|
||||||
this.labelTrayType = new System.Windows.Forms.Label();
|
|
||||||
this.checkUpdateNotifications = new System.Windows.Forms.CheckBox();
|
|
||||||
this.checkNotificationTimer = new System.Windows.Forms.CheckBox();
|
|
||||||
this.groupNotificationDuration = new System.Windows.Forms.GroupBox();
|
|
||||||
this.radioDurVeryLong = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioDurLong = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioDurMedium = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioDurShort = new System.Windows.Forms.RadioButton();
|
|
||||||
this.groupNotificationLocation.SuspendLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
|
||||||
this.tableLayout.SuspendLayout();
|
|
||||||
this.tableColumn2Panel.SuspendLayout();
|
|
||||||
this.groupUserInterface.SuspendLayout();
|
|
||||||
this.groupNotificationDuration.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// groupNotificationLocation
|
// btnClose
|
||||||
//
|
//
|
||||||
this.groupNotificationLocation.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnClose.AutoSize = true;
|
||||||
|
this.btnClose.Location = new System.Drawing.Point(443, 331);
|
||||||
|
this.btnClose.Name = "btnClose";
|
||||||
|
this.btnClose.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnClose.Size = new System.Drawing.Size(49, 23);
|
||||||
|
this.btnClose.TabIndex = 4;
|
||||||
|
this.btnClose.Text = "Close";
|
||||||
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
|
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||||
|
//
|
||||||
|
// labelTip
|
||||||
|
//
|
||||||
|
this.labelTip.AutoSize = true;
|
||||||
|
this.labelTip.Location = new System.Drawing.Point(12, 333);
|
||||||
|
this.labelTip.Name = "labelTip";
|
||||||
|
this.labelTip.Size = new System.Drawing.Size(310, 13);
|
||||||
|
this.labelTip.TabIndex = 5;
|
||||||
|
this.labelTip.Text = "Tip: Move your cursor over an option to see detailed explanation";
|
||||||
|
//
|
||||||
|
// tabPanel
|
||||||
|
//
|
||||||
|
this.tabPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.groupNotificationLocation.Controls.Add(this.labelDisplay);
|
this.tabPanel.Location = new System.Drawing.Point(12, 12);
|
||||||
this.groupNotificationLocation.Controls.Add(this.comboBoxDisplay);
|
this.tabPanel.Name = "tabPanel";
|
||||||
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistance);
|
this.tabPanel.Size = new System.Drawing.Size(480, 313);
|
||||||
this.groupNotificationLocation.Controls.Add(this.trackBarEdgeDistance);
|
this.tabPanel.TabIndex = 3;
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocCustom);
|
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocBR);
|
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocBL);
|
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocTR);
|
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocTL);
|
|
||||||
this.groupNotificationLocation.Location = new System.Drawing.Point(6, 6);
|
|
||||||
this.groupNotificationLocation.Name = "groupNotificationLocation";
|
|
||||||
this.groupNotificationLocation.Size = new System.Drawing.Size(183, 278);
|
|
||||||
this.groupNotificationLocation.TabIndex = 0;
|
|
||||||
this.groupNotificationLocation.TabStop = false;
|
|
||||||
this.groupNotificationLocation.Text = "Notification Location";
|
|
||||||
//
|
|
||||||
// labelDisplay
|
|
||||||
//
|
|
||||||
this.labelDisplay.AutoSize = true;
|
|
||||||
this.labelDisplay.Location = new System.Drawing.Point(6, 148);
|
|
||||||
this.labelDisplay.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
|
||||||
this.labelDisplay.Name = "labelDisplay";
|
|
||||||
this.labelDisplay.Size = new System.Drawing.Size(41, 13);
|
|
||||||
this.labelDisplay.TabIndex = 8;
|
|
||||||
this.labelDisplay.Text = "Display";
|
|
||||||
//
|
|
||||||
// comboBoxDisplay
|
|
||||||
//
|
|
||||||
this.comboBoxDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.comboBoxDisplay.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.comboBoxDisplay.FormattingEnabled = true;
|
|
||||||
this.comboBoxDisplay.Location = new System.Drawing.Point(9, 164);
|
|
||||||
this.comboBoxDisplay.Name = "comboBoxDisplay";
|
|
||||||
this.comboBoxDisplay.Size = new System.Drawing.Size(168, 21);
|
|
||||||
this.comboBoxDisplay.TabIndex = 7;
|
|
||||||
this.comboBoxDisplay.SelectedValueChanged += new System.EventHandler(this.comboBoxDisplay_SelectedValueChanged);
|
|
||||||
//
|
|
||||||
// labelEdgeDistance
|
|
||||||
//
|
|
||||||
this.labelEdgeDistance.AutoSize = true;
|
|
||||||
this.labelEdgeDistance.Location = new System.Drawing.Point(6, 197);
|
|
||||||
this.labelEdgeDistance.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
|
||||||
this.labelEdgeDistance.Name = "labelEdgeDistance";
|
|
||||||
this.labelEdgeDistance.Size = new System.Drawing.Size(103, 13);
|
|
||||||
this.labelEdgeDistance.TabIndex = 6;
|
|
||||||
this.labelEdgeDistance.Text = "Distance From Edge";
|
|
||||||
//
|
|
||||||
// trackBarEdgeDistance
|
|
||||||
//
|
|
||||||
this.trackBarEdgeDistance.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.trackBarEdgeDistance.LargeChange = 8;
|
|
||||||
this.trackBarEdgeDistance.Location = new System.Drawing.Point(6, 213);
|
|
||||||
this.trackBarEdgeDistance.Maximum = 40;
|
|
||||||
this.trackBarEdgeDistance.Minimum = 8;
|
|
||||||
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
|
||||||
this.trackBarEdgeDistance.Size = new System.Drawing.Size(171, 45);
|
|
||||||
this.trackBarEdgeDistance.SmallChange = 2;
|
|
||||||
this.trackBarEdgeDistance.TabIndex = 5;
|
|
||||||
this.trackBarEdgeDistance.TickFrequency = 2;
|
|
||||||
this.trackBarEdgeDistance.Value = 8;
|
|
||||||
this.trackBarEdgeDistance.ValueChanged += new System.EventHandler(this.trackBarEdgeDistance_ValueChanged);
|
|
||||||
//
|
|
||||||
// radioLocCustom
|
|
||||||
//
|
|
||||||
this.radioLocCustom.AutoSize = true;
|
|
||||||
this.radioLocCustom.Location = new System.Drawing.Point(7, 116);
|
|
||||||
this.radioLocCustom.Name = "radioLocCustom";
|
|
||||||
this.radioLocCustom.Size = new System.Drawing.Size(60, 17);
|
|
||||||
this.radioLocCustom.TabIndex = 4;
|
|
||||||
this.radioLocCustom.TabStop = true;
|
|
||||||
this.radioLocCustom.Text = "Custom";
|
|
||||||
this.radioLocCustom.UseVisualStyleBackColor = true;
|
|
||||||
this.radioLocCustom.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
|
||||||
this.radioLocCustom.Click += new System.EventHandler(this.radioLoc_Click);
|
|
||||||
//
|
|
||||||
// radioLocBR
|
|
||||||
//
|
|
||||||
this.radioLocBR.AutoSize = true;
|
|
||||||
this.radioLocBR.Location = new System.Drawing.Point(7, 92);
|
|
||||||
this.radioLocBR.Name = "radioLocBR";
|
|
||||||
this.radioLocBR.Size = new System.Drawing.Size(86, 17);
|
|
||||||
this.radioLocBR.TabIndex = 3;
|
|
||||||
this.radioLocBR.TabStop = true;
|
|
||||||
this.radioLocBR.Text = "Bottom Right";
|
|
||||||
this.radioLocBR.UseVisualStyleBackColor = true;
|
|
||||||
this.radioLocBR.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
|
||||||
this.radioLocBR.Click += new System.EventHandler(this.radioLoc_Click);
|
|
||||||
//
|
|
||||||
// radioLocBL
|
|
||||||
//
|
|
||||||
this.radioLocBL.AutoSize = true;
|
|
||||||
this.radioLocBL.Location = new System.Drawing.Point(7, 68);
|
|
||||||
this.radioLocBL.Name = "radioLocBL";
|
|
||||||
this.radioLocBL.Size = new System.Drawing.Size(79, 17);
|
|
||||||
this.radioLocBL.TabIndex = 2;
|
|
||||||
this.radioLocBL.TabStop = true;
|
|
||||||
this.radioLocBL.Text = "Bottom Left";
|
|
||||||
this.radioLocBL.UseVisualStyleBackColor = true;
|
|
||||||
this.radioLocBL.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
|
||||||
this.radioLocBL.Click += new System.EventHandler(this.radioLoc_Click);
|
|
||||||
//
|
|
||||||
// radioLocTR
|
|
||||||
//
|
|
||||||
this.radioLocTR.AutoSize = true;
|
|
||||||
this.radioLocTR.Location = new System.Drawing.Point(7, 44);
|
|
||||||
this.radioLocTR.Name = "radioLocTR";
|
|
||||||
this.radioLocTR.Size = new System.Drawing.Size(72, 17);
|
|
||||||
this.radioLocTR.TabIndex = 1;
|
|
||||||
this.radioLocTR.TabStop = true;
|
|
||||||
this.radioLocTR.Text = "Top Right";
|
|
||||||
this.radioLocTR.UseVisualStyleBackColor = true;
|
|
||||||
this.radioLocTR.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
|
||||||
this.radioLocTR.Click += new System.EventHandler(this.radioLoc_Click);
|
|
||||||
//
|
|
||||||
// radioLocTL
|
|
||||||
//
|
|
||||||
this.radioLocTL.AutoSize = true;
|
|
||||||
this.radioLocTL.Location = new System.Drawing.Point(7, 20);
|
|
||||||
this.radioLocTL.Name = "radioLocTL";
|
|
||||||
this.radioLocTL.Size = new System.Drawing.Size(65, 17);
|
|
||||||
this.radioLocTL.TabIndex = 0;
|
|
||||||
this.radioLocTL.TabStop = true;
|
|
||||||
this.radioLocTL.Text = "Top Left";
|
|
||||||
this.radioLocTL.UseVisualStyleBackColor = true;
|
|
||||||
this.radioLocTL.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
|
||||||
this.radioLocTL.Click += new System.EventHandler(this.radioLoc_Click);
|
|
||||||
//
|
|
||||||
// tableLayout
|
|
||||||
//
|
|
||||||
this.tableLayout.ColumnCount = 2;
|
|
||||||
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
|
||||||
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
|
||||||
this.tableLayout.Controls.Add(this.tableColumn2Panel, 1, 0);
|
|
||||||
this.tableLayout.Controls.Add(this.groupNotificationLocation, 0, 0);
|
|
||||||
this.tableLayout.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.tableLayout.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize;
|
|
||||||
this.tableLayout.Location = new System.Drawing.Point(0, 0);
|
|
||||||
this.tableLayout.Name = "tableLayout";
|
|
||||||
this.tableLayout.Padding = new System.Windows.Forms.Padding(3);
|
|
||||||
this.tableLayout.RowCount = 1;
|
|
||||||
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
|
||||||
this.tableLayout.Size = new System.Drawing.Size(384, 290);
|
|
||||||
this.tableLayout.TabIndex = 2;
|
|
||||||
//
|
|
||||||
// tableColumn2Panel
|
|
||||||
//
|
|
||||||
this.tableColumn2Panel.Controls.Add(this.groupUserInterface);
|
|
||||||
this.tableColumn2Panel.Controls.Add(this.groupNotificationDuration);
|
|
||||||
this.tableColumn2Panel.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.tableColumn2Panel.Location = new System.Drawing.Point(192, 3);
|
|
||||||
this.tableColumn2Panel.Margin = new System.Windows.Forms.Padding(0);
|
|
||||||
this.tableColumn2Panel.Name = "tableColumn2Panel";
|
|
||||||
this.tableColumn2Panel.Size = new System.Drawing.Size(189, 284);
|
|
||||||
this.tableColumn2Panel.TabIndex = 3;
|
|
||||||
//
|
|
||||||
// groupUserInterface
|
|
||||||
//
|
|
||||||
this.groupUserInterface.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.groupUserInterface.Controls.Add(this.checkExpandLinks);
|
|
||||||
this.groupUserInterface.Controls.Add(this.comboBoxTrayType);
|
|
||||||
this.groupUserInterface.Controls.Add(this.labelTrayType);
|
|
||||||
this.groupUserInterface.Controls.Add(this.checkUpdateNotifications);
|
|
||||||
this.groupUserInterface.Controls.Add(this.checkNotificationTimer);
|
|
||||||
this.groupUserInterface.Location = new System.Drawing.Point(3, 128);
|
|
||||||
this.groupUserInterface.Name = "groupUserInterface";
|
|
||||||
this.groupUserInterface.Size = new System.Drawing.Size(183, 153);
|
|
||||||
this.groupUserInterface.TabIndex = 3;
|
|
||||||
this.groupUserInterface.TabStop = false;
|
|
||||||
this.groupUserInterface.Text = "User Interface";
|
|
||||||
//
|
|
||||||
// checkExpandLinks
|
|
||||||
//
|
|
||||||
this.checkExpandLinks.AutoSize = true;
|
|
||||||
this.checkExpandLinks.Location = new System.Drawing.Point(6, 45);
|
|
||||||
this.checkExpandLinks.Margin = new System.Windows.Forms.Padding(3, 4, 3, 3);
|
|
||||||
this.checkExpandLinks.Name = "checkExpandLinks";
|
|
||||||
this.checkExpandLinks.Size = new System.Drawing.Size(166, 17);
|
|
||||||
this.checkExpandLinks.TabIndex = 11;
|
|
||||||
this.checkExpandLinks.Text = "Expand Links When Hovered";
|
|
||||||
this.checkExpandLinks.UseVisualStyleBackColor = true;
|
|
||||||
this.checkExpandLinks.CheckedChanged += new System.EventHandler(this.checkExpandLinks_CheckedChanged);
|
|
||||||
//
|
|
||||||
// comboBoxTrayType
|
|
||||||
//
|
|
||||||
this.comboBoxTrayType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.comboBoxTrayType.FormattingEnabled = true;
|
|
||||||
this.comboBoxTrayType.Location = new System.Drawing.Point(9, 116);
|
|
||||||
this.comboBoxTrayType.Margin = new System.Windows.Forms.Padding(3, 3, 3, 12);
|
|
||||||
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
|
||||||
this.comboBoxTrayType.Size = new System.Drawing.Size(168, 21);
|
|
||||||
this.comboBoxTrayType.TabIndex = 10;
|
|
||||||
this.comboBoxTrayType.SelectedIndexChanged += new System.EventHandler(this.comboBoxTrayType_SelectedIndexChanged);
|
|
||||||
//
|
|
||||||
// labelTrayType
|
|
||||||
//
|
|
||||||
this.labelTrayType.AutoSize = true;
|
|
||||||
this.labelTrayType.Location = new System.Drawing.Point(6, 100);
|
|
||||||
this.labelTrayType.Margin = new System.Windows.Forms.Padding(3, 11, 3, 0);
|
|
||||||
this.labelTrayType.Name = "labelTrayType";
|
|
||||||
this.labelTrayType.Size = new System.Drawing.Size(52, 13);
|
|
||||||
this.labelTrayType.TabIndex = 9;
|
|
||||||
this.labelTrayType.Text = "Tray Icon";
|
|
||||||
//
|
|
||||||
// checkUpdateNotifications
|
|
||||||
//
|
|
||||||
this.checkUpdateNotifications.AutoSize = true;
|
|
||||||
this.checkUpdateNotifications.Location = new System.Drawing.Point(6, 69);
|
|
||||||
this.checkUpdateNotifications.Margin = new System.Windows.Forms.Padding(3, 4, 3, 3);
|
|
||||||
this.checkUpdateNotifications.Name = "checkUpdateNotifications";
|
|
||||||
this.checkUpdateNotifications.Size = new System.Drawing.Size(115, 17);
|
|
||||||
this.checkUpdateNotifications.TabIndex = 5;
|
|
||||||
this.checkUpdateNotifications.Text = "Check for Updates";
|
|
||||||
this.checkUpdateNotifications.UseVisualStyleBackColor = true;
|
|
||||||
this.checkUpdateNotifications.CheckedChanged += new System.EventHandler(this.checkUpdateNotifications_CheckedChanged);
|
|
||||||
//
|
|
||||||
// checkNotificationTimer
|
|
||||||
//
|
|
||||||
this.checkNotificationTimer.AutoSize = true;
|
|
||||||
this.checkNotificationTimer.Location = new System.Drawing.Point(6, 21);
|
|
||||||
this.checkNotificationTimer.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
|
||||||
this.checkNotificationTimer.Name = "checkNotificationTimer";
|
|
||||||
this.checkNotificationTimer.Size = new System.Drawing.Size(145, 17);
|
|
||||||
this.checkNotificationTimer.TabIndex = 4;
|
|
||||||
this.checkNotificationTimer.Text = "Display Notification Timer";
|
|
||||||
this.checkNotificationTimer.UseVisualStyleBackColor = true;
|
|
||||||
this.checkNotificationTimer.CheckedChanged += new System.EventHandler(this.checkNotificationTimer_CheckedChanged);
|
|
||||||
//
|
|
||||||
// groupNotificationDuration
|
|
||||||
//
|
|
||||||
this.groupNotificationDuration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurVeryLong);
|
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurLong);
|
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurMedium);
|
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurShort);
|
|
||||||
this.groupNotificationDuration.Location = new System.Drawing.Point(3, 3);
|
|
||||||
this.groupNotificationDuration.Name = "groupNotificationDuration";
|
|
||||||
this.groupNotificationDuration.Size = new System.Drawing.Size(183, 119);
|
|
||||||
this.groupNotificationDuration.TabIndex = 2;
|
|
||||||
this.groupNotificationDuration.TabStop = false;
|
|
||||||
this.groupNotificationDuration.Text = "Notification Duration";
|
|
||||||
//
|
|
||||||
// radioDurVeryLong
|
|
||||||
//
|
|
||||||
this.radioDurVeryLong.AutoSize = true;
|
|
||||||
this.radioDurVeryLong.Location = new System.Drawing.Point(6, 92);
|
|
||||||
this.radioDurVeryLong.Name = "radioDurVeryLong";
|
|
||||||
this.radioDurVeryLong.Size = new System.Drawing.Size(73, 17);
|
|
||||||
this.radioDurVeryLong.TabIndex = 3;
|
|
||||||
this.radioDurVeryLong.TabStop = true;
|
|
||||||
this.radioDurVeryLong.Text = "Very Long";
|
|
||||||
this.radioDurVeryLong.UseVisualStyleBackColor = true;
|
|
||||||
this.radioDurVeryLong.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
|
||||||
this.radioDurVeryLong.Click += new System.EventHandler(this.radioDur_Click);
|
|
||||||
//
|
|
||||||
// radioDurLong
|
|
||||||
//
|
|
||||||
this.radioDurLong.AutoSize = true;
|
|
||||||
this.radioDurLong.Location = new System.Drawing.Point(6, 68);
|
|
||||||
this.radioDurLong.Name = "radioDurLong";
|
|
||||||
this.radioDurLong.Size = new System.Drawing.Size(49, 17);
|
|
||||||
this.radioDurLong.TabIndex = 2;
|
|
||||||
this.radioDurLong.TabStop = true;
|
|
||||||
this.radioDurLong.Text = "Long";
|
|
||||||
this.radioDurLong.UseVisualStyleBackColor = true;
|
|
||||||
this.radioDurLong.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
|
||||||
this.radioDurLong.Click += new System.EventHandler(this.radioDur_Click);
|
|
||||||
//
|
|
||||||
// radioDurMedium
|
|
||||||
//
|
|
||||||
this.radioDurMedium.AutoSize = true;
|
|
||||||
this.radioDurMedium.Location = new System.Drawing.Point(6, 44);
|
|
||||||
this.radioDurMedium.Name = "radioDurMedium";
|
|
||||||
this.radioDurMedium.Size = new System.Drawing.Size(62, 17);
|
|
||||||
this.radioDurMedium.TabIndex = 1;
|
|
||||||
this.radioDurMedium.TabStop = true;
|
|
||||||
this.radioDurMedium.Text = "Medium";
|
|
||||||
this.radioDurMedium.UseVisualStyleBackColor = true;
|
|
||||||
this.radioDurMedium.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
|
||||||
this.radioDurMedium.Click += new System.EventHandler(this.radioDur_Click);
|
|
||||||
//
|
|
||||||
// radioDurShort
|
|
||||||
//
|
|
||||||
this.radioDurShort.AutoSize = true;
|
|
||||||
this.radioDurShort.Location = new System.Drawing.Point(6, 20);
|
|
||||||
this.radioDurShort.Name = "radioDurShort";
|
|
||||||
this.radioDurShort.Size = new System.Drawing.Size(50, 17);
|
|
||||||
this.radioDurShort.TabIndex = 0;
|
|
||||||
this.radioDurShort.TabStop = true;
|
|
||||||
this.radioDurShort.Text = "Short";
|
|
||||||
this.radioDurShort.UseVisualStyleBackColor = true;
|
|
||||||
this.radioDurShort.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
|
||||||
this.radioDurShort.Click += new System.EventHandler(this.radioDur_Click);
|
|
||||||
//
|
//
|
||||||
// FormSettings
|
// FormSettings
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(384, 290);
|
this.ClientSize = new System.Drawing.Size(504, 366);
|
||||||
this.Controls.Add(this.tableLayout);
|
this.Controls.Add(this.labelTip);
|
||||||
|
this.Controls.Add(this.btnClose);
|
||||||
|
this.Controls.Add(this.tabPanel);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
@@ -373,43 +76,15 @@
|
|||||||
this.Name = "FormSettings";
|
this.Name = "FormSettings";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSettings_FormClosing);
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormSettings_FormClosing);
|
||||||
this.groupNotificationLocation.ResumeLayout(false);
|
|
||||||
this.groupNotificationLocation.PerformLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
|
||||||
this.tableLayout.ResumeLayout(false);
|
|
||||||
this.tableColumn2Panel.ResumeLayout(false);
|
|
||||||
this.groupUserInterface.ResumeLayout(false);
|
|
||||||
this.groupUserInterface.PerformLayout();
|
|
||||||
this.groupNotificationDuration.ResumeLayout(false);
|
|
||||||
this.groupNotificationDuration.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupNotificationLocation;
|
private Controls.TabPanel tabPanel;
|
||||||
private System.Windows.Forms.RadioButton radioLocCustom;
|
private System.Windows.Forms.Button btnClose;
|
||||||
private System.Windows.Forms.RadioButton radioLocBR;
|
private System.Windows.Forms.Label labelTip;
|
||||||
private System.Windows.Forms.RadioButton radioLocBL;
|
|
||||||
private System.Windows.Forms.RadioButton radioLocTR;
|
|
||||||
private System.Windows.Forms.RadioButton radioLocTL;
|
|
||||||
private System.Windows.Forms.Label labelEdgeDistance;
|
|
||||||
private System.Windows.Forms.TrackBar trackBarEdgeDistance;
|
|
||||||
private System.Windows.Forms.Label labelDisplay;
|
|
||||||
private System.Windows.Forms.ComboBox comboBoxDisplay;
|
|
||||||
private System.Windows.Forms.TableLayoutPanel tableLayout;
|
|
||||||
private System.Windows.Forms.Panel tableColumn2Panel;
|
|
||||||
private System.Windows.Forms.GroupBox groupUserInterface;
|
|
||||||
private System.Windows.Forms.GroupBox groupNotificationDuration;
|
|
||||||
private System.Windows.Forms.RadioButton radioDurVeryLong;
|
|
||||||
private System.Windows.Forms.RadioButton radioDurLong;
|
|
||||||
private System.Windows.Forms.RadioButton radioDurMedium;
|
|
||||||
private System.Windows.Forms.RadioButton radioDurShort;
|
|
||||||
private System.Windows.Forms.CheckBox checkNotificationTimer;
|
|
||||||
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
|
||||||
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
|
||||||
private System.Windows.Forms.Label labelTrayType;
|
|
||||||
private System.Windows.Forms.CheckBox checkExpandLinks;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,154 +1,61 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Configuration;
|
using TweetDck.Core.Other.Settings;
|
||||||
using TweetDck.Core.Handling;
|
using TweetDck.Core.Other.Settings.Export;
|
||||||
|
using TweetDck.Updates;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other{
|
namespace TweetDck.Core.Other{
|
||||||
sealed partial class FormSettings : Form{
|
sealed partial class FormSettings : Form{
|
||||||
private static UserConfig Config{
|
private readonly Dictionary<Type,BaseTabSettings> tabs = new Dictionary<Type,BaseTabSettings>(4);
|
||||||
get{
|
|
||||||
return Program.UserConfig;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly FormNotification notification;
|
public FormSettings(FormBrowser browserForm, UpdateHandler updates){
|
||||||
private bool isLoaded;
|
|
||||||
|
|
||||||
public FormSettings(FormBrowser browserForm){
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Shown += (sender, args) => isLoaded = true;
|
|
||||||
|
|
||||||
Text = Program.BrandName+" Settings";
|
Text = Program.BrandName+" Settings";
|
||||||
|
|
||||||
notification = browserForm.CreateNotificationForm(false);
|
this.tabPanel.SetupTabPanel(100);
|
||||||
notification.CanMoveWindow = () => radioLocCustom.Checked;
|
this.tabPanel.AddButton("General",SelectTab<TabSettingsGeneral>);
|
||||||
|
this.tabPanel.AddButton("Notifications",() => SelectTab(() => new TabSettingsNotifications(browserForm.CreateNotificationForm(false))));
|
||||||
notification.Move += (sender, args) => {
|
this.tabPanel.AddButton("Updates",() => SelectTab(() => new TabSettingsUpdates(updates)));
|
||||||
if (radioLocCustom.Checked){
|
this.tabPanel.AddButton("Advanced",() => SelectTab(() => new TabSettingsAdvanced(browserForm.ReloadBrowser)));
|
||||||
Config.CustomNotificationPosition = notification.Location;
|
this.tabPanel.SelectTab(tabPanel.Buttons.First());
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
notification.Show(this);
|
|
||||||
|
|
||||||
switch(Config.NotificationPosition){
|
|
||||||
case TweetNotification.Position.TopLeft: radioLocTL.Checked = true; break;
|
|
||||||
case TweetNotification.Position.TopRight: radioLocTR.Checked = true; break;
|
|
||||||
case TweetNotification.Position.BottomLeft: radioLocBL.Checked = true; break;
|
|
||||||
case TweetNotification.Position.BottomRight: radioLocBR.Checked = true; break;
|
|
||||||
case TweetNotification.Position.Custom: radioLocCustom.Checked = true; break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(Config.NotificationDuration){
|
private void SelectTab<T>() where T : BaseTabSettings, new(){
|
||||||
case TweetNotification.Duration.Short: radioDurShort.Checked = true; break;
|
SelectTab(() => new T());
|
||||||
case TweetNotification.Duration.Medium: radioDurMedium.Checked = true; break;
|
|
||||||
case TweetNotification.Duration.Long: radioDurLong.Checked = true; break;
|
|
||||||
case TweetNotification.Duration.VeryLong: radioDurVeryLong.Checked = true; break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
comboBoxDisplay.Items.Add("(Same As "+Program.BrandName+")");
|
private void SelectTab<T>(Func<T> constructor) where T : BaseTabSettings{
|
||||||
|
BaseTabSettings control;
|
||||||
|
|
||||||
foreach(Screen screen in Screen.AllScreens){
|
if (tabs.TryGetValue(typeof(T),out control)){
|
||||||
comboBoxDisplay.Items.Add(screen.DeviceName+" ("+screen.Bounds.Width+"x"+screen.Bounds.Height+")");
|
tabPanel.ReplaceContent(control);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
control = tabs[typeof(T)] = constructor();
|
||||||
|
control.Ready = true;
|
||||||
|
tabPanel.ReplaceContent(control);
|
||||||
}
|
}
|
||||||
|
|
||||||
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1,Config.NotificationDisplay);
|
|
||||||
|
|
||||||
comboBoxTrayType.Items.Add("Disabled");
|
|
||||||
comboBoxTrayType.Items.Add("Display Icon Only");
|
|
||||||
comboBoxTrayType.Items.Add("Minimize to Tray");
|
|
||||||
comboBoxTrayType.Items.Add("Close to Tray");
|
|
||||||
comboBoxTrayType.SelectedIndex = Math.Min(Math.Max((int)Config.TrayBehavior,0),comboBoxTrayType.Items.Count-1);
|
|
||||||
|
|
||||||
trackBarEdgeDistance.Value = Config.NotificationEdgeDistance;
|
|
||||||
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
|
||||||
checkExpandLinks.Checked = Config.ExpandLinksOnHover;
|
|
||||||
checkUpdateNotifications.Checked = Config.EnableUpdateCheck;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormSettings_FormClosing(object sender, FormClosingEventArgs e){
|
private void FormSettings_FormClosing(object sender, FormClosingEventArgs e){
|
||||||
Config.Save();
|
Program.UserConfig.Save();
|
||||||
|
|
||||||
|
foreach(BaseTabSettings control in tabs.Values){
|
||||||
|
control.Dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioLoc_CheckedChanged(object sender, EventArgs e){
|
private void btnClose_Click(object sender, EventArgs e){
|
||||||
if (!isLoaded)return;
|
Close();
|
||||||
|
|
||||||
if (radioLocTL.Checked)Config.NotificationPosition = TweetNotification.Position.TopLeft;
|
|
||||||
else if (radioLocTR.Checked)Config.NotificationPosition = TweetNotification.Position.TopRight;
|
|
||||||
else if (radioLocBL.Checked)Config.NotificationPosition = TweetNotification.Position.BottomLeft;
|
|
||||||
else if (radioLocBR.Checked)Config.NotificationPosition = TweetNotification.Position.BottomRight;
|
|
||||||
else if (radioLocCustom.Checked){
|
|
||||||
if (!Config.IsCustomNotificationPositionSet){
|
|
||||||
Config.CustomNotificationPosition = notification.Location;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Config.NotificationPosition = TweetNotification.Position.Custom;
|
public void ReloadUI(){
|
||||||
}
|
tabs.Clear();
|
||||||
|
tabPanel.Content.Controls.Clear();
|
||||||
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = !radioLocCustom.Checked;
|
tabPanel.ActiveButton.Callback();
|
||||||
notification.ShowNotificationForSettings(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void radioLoc_Click(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
notification.ShowNotificationForSettings(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void comboBoxDisplay_SelectedValueChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.NotificationDisplay = comboBoxDisplay.SelectedIndex;
|
|
||||||
notification.ShowNotificationForSettings(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void trackBarEdgeDistance_ValueChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
|
||||||
notification.ShowNotificationForSettings(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void radioDur_CheckedChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
if (radioDurShort.Checked)Config.NotificationDuration = TweetNotification.Duration.Short;
|
|
||||||
else if (radioDurMedium.Checked)Config.NotificationDuration = TweetNotification.Duration.Medium;
|
|
||||||
else if (radioDurLong.Checked)Config.NotificationDuration = TweetNotification.Duration.Long;
|
|
||||||
else if (radioDurVeryLong.Checked)Config.NotificationDuration = TweetNotification.Duration.VeryLong;
|
|
||||||
|
|
||||||
notification.ShowNotificationForSettings(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void radioDur_Click(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
notification.ShowNotificationForSettings(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void comboBoxTrayType_SelectedIndexChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.TrayBehavior = (TrayIcon.Behavior)comboBoxTrayType.SelectedIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkNotificationTimer_CheckedChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
|
||||||
notification.ShowNotificationForSettings(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkExpandLinks_CheckedChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkUpdateNotifications_CheckedChanged(object sender, EventArgs e){
|
|
||||||
if (!isLoaded)return;
|
|
||||||
|
|
||||||
Config.EnableUpdateCheck = checkUpdateNotifications.Checked;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
Core/Other/Settings/BaseTabSettings.Designer.cs
generated
Normal file
3
Core/Other/Settings/BaseTabSettings.Designer.cs
generated
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class BaseTabSettings{}
|
||||||
|
}
|
18
Core/Other/Settings/BaseTabSettings.cs
Normal file
18
Core/Other/Settings/BaseTabSettings.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Configuration;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class BaseTabSettings : UserControl{
|
||||||
|
protected static UserConfig Config{
|
||||||
|
get{
|
||||||
|
return Program.UserConfig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Ready { get; set; }
|
||||||
|
|
||||||
|
public BaseTabSettings(){
|
||||||
|
Padding = new Padding(6,6,6,6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
181
Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs
generated
Normal file
181
Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs
generated
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings.Dialogs {
|
||||||
|
partial class DialogSettingsCSS {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.textBoxBrowserCSS = new System.Windows.Forms.TextBox();
|
||||||
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
|
this.btnApply = new System.Windows.Forms.Button();
|
||||||
|
this.splitContainer = new System.Windows.Forms.SplitContainer();
|
||||||
|
this.labelBrowser = new System.Windows.Forms.Label();
|
||||||
|
this.labelNotification = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxNotificationCSS = new System.Windows.Forms.TextBox();
|
||||||
|
this.labelWarning = new System.Windows.Forms.Label();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
|
||||||
|
this.splitContainer.Panel1.SuspendLayout();
|
||||||
|
this.splitContainer.Panel2.SuspendLayout();
|
||||||
|
this.splitContainer.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// textBoxBrowserCSS
|
||||||
|
//
|
||||||
|
this.textBoxBrowserCSS.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.textBoxBrowserCSS.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.textBoxBrowserCSS.Location = new System.Drawing.Point(0, 16);
|
||||||
|
this.textBoxBrowserCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
||||||
|
this.textBoxBrowserCSS.Multiline = true;
|
||||||
|
this.textBoxBrowserCSS.Name = "textBoxBrowserCSS";
|
||||||
|
this.textBoxBrowserCSS.Size = new System.Drawing.Size(226, 193);
|
||||||
|
this.textBoxBrowserCSS.TabIndex = 0;
|
||||||
|
this.textBoxBrowserCSS.WordWrap = false;
|
||||||
|
//
|
||||||
|
// btnCancel
|
||||||
|
//
|
||||||
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(354, 227);
|
||||||
|
this.btnCancel.Name = "btnCancel";
|
||||||
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
||||||
|
this.btnCancel.TabIndex = 1;
|
||||||
|
this.btnCancel.Text = "Cancel";
|
||||||
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
|
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||||
|
//
|
||||||
|
// btnApply
|
||||||
|
//
|
||||||
|
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnApply.Location = new System.Drawing.Point(416, 227);
|
||||||
|
this.btnApply.Name = "btnApply";
|
||||||
|
this.btnApply.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnApply.Size = new System.Drawing.Size(56, 23);
|
||||||
|
this.btnApply.TabIndex = 2;
|
||||||
|
this.btnApply.Text = "Apply";
|
||||||
|
this.btnApply.UseVisualStyleBackColor = true;
|
||||||
|
this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
|
||||||
|
//
|
||||||
|
// splitContainer
|
||||||
|
//
|
||||||
|
this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.splitContainer.Location = new System.Drawing.Point(12, 12);
|
||||||
|
this.splitContainer.Name = "splitContainer";
|
||||||
|
//
|
||||||
|
// splitContainer.Panel1
|
||||||
|
//
|
||||||
|
this.splitContainer.Panel1.Controls.Add(this.labelBrowser);
|
||||||
|
this.splitContainer.Panel1.Controls.Add(this.textBoxBrowserCSS);
|
||||||
|
this.splitContainer.Panel1MinSize = 64;
|
||||||
|
//
|
||||||
|
// splitContainer.Panel2
|
||||||
|
//
|
||||||
|
this.splitContainer.Panel2.Controls.Add(this.labelNotification);
|
||||||
|
this.splitContainer.Panel2.Controls.Add(this.textBoxNotificationCSS);
|
||||||
|
this.splitContainer.Panel2MinSize = 64;
|
||||||
|
this.splitContainer.Size = new System.Drawing.Size(460, 209);
|
||||||
|
this.splitContainer.SplitterDistance = 226;
|
||||||
|
this.splitContainer.SplitterWidth = 5;
|
||||||
|
this.splitContainer.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// labelBrowser
|
||||||
|
//
|
||||||
|
this.labelBrowser.AutoSize = true;
|
||||||
|
this.labelBrowser.Location = new System.Drawing.Point(-3, 0);
|
||||||
|
this.labelBrowser.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
|
this.labelBrowser.Name = "labelBrowser";
|
||||||
|
this.labelBrowser.Size = new System.Drawing.Size(45, 13);
|
||||||
|
this.labelBrowser.TabIndex = 1;
|
||||||
|
this.labelBrowser.Text = "Browser";
|
||||||
|
//
|
||||||
|
// labelNotification
|
||||||
|
//
|
||||||
|
this.labelNotification.AutoSize = true;
|
||||||
|
this.labelNotification.Location = new System.Drawing.Point(-3, 0);
|
||||||
|
this.labelNotification.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
|
this.labelNotification.Name = "labelNotification";
|
||||||
|
this.labelNotification.Size = new System.Drawing.Size(60, 13);
|
||||||
|
this.labelNotification.TabIndex = 2;
|
||||||
|
this.labelNotification.Text = "Notification";
|
||||||
|
//
|
||||||
|
// textBoxNotificationCSS
|
||||||
|
//
|
||||||
|
this.textBoxNotificationCSS.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.textBoxNotificationCSS.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.textBoxNotificationCSS.Location = new System.Drawing.Point(0, 16);
|
||||||
|
this.textBoxNotificationCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
||||||
|
this.textBoxNotificationCSS.Multiline = true;
|
||||||
|
this.textBoxNotificationCSS.Name = "textBoxNotificationCSS";
|
||||||
|
this.textBoxNotificationCSS.Size = new System.Drawing.Size(227, 193);
|
||||||
|
this.textBoxNotificationCSS.TabIndex = 1;
|
||||||
|
this.textBoxNotificationCSS.WordWrap = false;
|
||||||
|
//
|
||||||
|
// labelWarning
|
||||||
|
//
|
||||||
|
this.labelWarning.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.labelWarning.AutoSize = true;
|
||||||
|
this.labelWarning.Location = new System.Drawing.Point(9, 232);
|
||||||
|
this.labelWarning.Name = "labelWarning";
|
||||||
|
this.labelWarning.Size = new System.Drawing.Size(341, 13);
|
||||||
|
this.labelWarning.TabIndex = 6;
|
||||||
|
this.labelWarning.Text = "The code is not validated, please make sure there are no syntax errors.";
|
||||||
|
//
|
||||||
|
// DialogSettingsCSS
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(484, 262);
|
||||||
|
this.Controls.Add(this.labelWarning);
|
||||||
|
this.Controls.Add(this.splitContainer);
|
||||||
|
this.Controls.Add(this.btnApply);
|
||||||
|
this.Controls.Add(this.btnCancel);
|
||||||
|
this.MinimumSize = new System.Drawing.Size(500, 160);
|
||||||
|
this.Name = "DialogSettingsCSS";
|
||||||
|
this.ShowIcon = false;
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.splitContainer.Panel1.ResumeLayout(false);
|
||||||
|
this.splitContainer.Panel1.PerformLayout();
|
||||||
|
this.splitContainer.Panel2.ResumeLayout(false);
|
||||||
|
this.splitContainer.Panel2.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
|
||||||
|
this.splitContainer.ResumeLayout(false);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.TextBox textBoxBrowserCSS;
|
||||||
|
private System.Windows.Forms.Button btnCancel;
|
||||||
|
private System.Windows.Forms.Button btnApply;
|
||||||
|
private System.Windows.Forms.SplitContainer splitContainer;
|
||||||
|
private System.Windows.Forms.TextBox textBoxNotificationCSS;
|
||||||
|
private System.Windows.Forms.Label labelBrowser;
|
||||||
|
private System.Windows.Forms.Label labelNotification;
|
||||||
|
private System.Windows.Forms.Label labelWarning;
|
||||||
|
}
|
||||||
|
}
|
37
Core/Other/Settings/Dialogs/DialogSettingsCSS.cs
Normal file
37
Core/Other/Settings/Dialogs/DialogSettingsCSS.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings.Dialogs{
|
||||||
|
sealed partial class DialogSettingsCSS : Form{
|
||||||
|
public string BrowserCSS{
|
||||||
|
get{
|
||||||
|
return textBoxBrowserCSS.Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string NotificationCSS{
|
||||||
|
get{
|
||||||
|
return textBoxNotificationCSS.Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DialogSettingsCSS(){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
Text = Program.BrandName+" Settings - CSS";
|
||||||
|
|
||||||
|
textBoxBrowserCSS.Text = Program.UserConfig.CustomBrowserCSS ?? "";
|
||||||
|
textBoxNotificationCSS.Text = Program.UserConfig.CustomNotificationCSS ?? "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnApply_Click(object sender, EventArgs e){
|
||||||
|
DialogResult = DialogResult.OK;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCancel_Click(object sender, EventArgs e){
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
120
Core/Other/Settings/Dialogs/DialogSettingsCefArgs.Designer.cs
generated
Normal file
120
Core/Other/Settings/Dialogs/DialogSettingsCefArgs.Designer.cs
generated
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings.Dialogs {
|
||||||
|
partial class DialogSettingsCefArgs {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.textBoxArgs = new System.Windows.Forms.TextBox();
|
||||||
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
|
this.btnApply = new System.Windows.Forms.Button();
|
||||||
|
this.btnHelp = new System.Windows.Forms.Button();
|
||||||
|
this.labelWarning = new System.Windows.Forms.Label();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// textBoxArgs
|
||||||
|
//
|
||||||
|
this.textBoxArgs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.textBoxArgs.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.textBoxArgs.Location = new System.Drawing.Point(12, 28);
|
||||||
|
this.textBoxArgs.Multiline = true;
|
||||||
|
this.textBoxArgs.Name = "textBoxArgs";
|
||||||
|
this.textBoxArgs.Size = new System.Drawing.Size(460, 193);
|
||||||
|
this.textBoxArgs.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// btnCancel
|
||||||
|
//
|
||||||
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(354, 227);
|
||||||
|
this.btnCancel.Name = "btnCancel";
|
||||||
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
||||||
|
this.btnCancel.TabIndex = 1;
|
||||||
|
this.btnCancel.Text = "Cancel";
|
||||||
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
|
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||||
|
//
|
||||||
|
// btnApply
|
||||||
|
//
|
||||||
|
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnApply.Location = new System.Drawing.Point(416, 227);
|
||||||
|
this.btnApply.Name = "btnApply";
|
||||||
|
this.btnApply.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnApply.Size = new System.Drawing.Size(56, 23);
|
||||||
|
this.btnApply.TabIndex = 2;
|
||||||
|
this.btnApply.Text = "Apply";
|
||||||
|
this.btnApply.UseVisualStyleBackColor = true;
|
||||||
|
this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
|
||||||
|
//
|
||||||
|
// btnHelp
|
||||||
|
//
|
||||||
|
this.btnHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnHelp.AutoSize = true;
|
||||||
|
this.btnHelp.Location = new System.Drawing.Point(12, 227);
|
||||||
|
this.btnHelp.Name = "btnHelp";
|
||||||
|
this.btnHelp.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnHelp.Size = new System.Drawing.Size(124, 23);
|
||||||
|
this.btnHelp.TabIndex = 3;
|
||||||
|
this.btnHelp.Text = "List of Chromium Args";
|
||||||
|
this.btnHelp.UseVisualStyleBackColor = true;
|
||||||
|
this.btnHelp.Click += new System.EventHandler(this.btnHelp_Click);
|
||||||
|
//
|
||||||
|
// labelWarning
|
||||||
|
//
|
||||||
|
this.labelWarning.AutoSize = true;
|
||||||
|
this.labelWarning.Location = new System.Drawing.Point(12, 9);
|
||||||
|
this.labelWarning.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
||||||
|
this.labelWarning.Name = "labelWarning";
|
||||||
|
this.labelWarning.Size = new System.Drawing.Size(423, 13);
|
||||||
|
this.labelWarning.TabIndex = 4;
|
||||||
|
this.labelWarning.Text = "Warning: Some arguments may cause the program to stop working, edit at your own r" +
|
||||||
|
"isk.";
|
||||||
|
//
|
||||||
|
// DialogSettingsCefArgs
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(484, 262);
|
||||||
|
this.Controls.Add(this.labelWarning);
|
||||||
|
this.Controls.Add(this.btnHelp);
|
||||||
|
this.Controls.Add(this.btnApply);
|
||||||
|
this.Controls.Add(this.btnCancel);
|
||||||
|
this.Controls.Add(this.textBoxArgs);
|
||||||
|
this.MinimumSize = new System.Drawing.Size(500, 160);
|
||||||
|
this.Name = "DialogSettingsCefArgs";
|
||||||
|
this.ShowIcon = false;
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.TextBox textBoxArgs;
|
||||||
|
private System.Windows.Forms.Button btnCancel;
|
||||||
|
private System.Windows.Forms.Button btnApply;
|
||||||
|
private System.Windows.Forms.Button btnHelp;
|
||||||
|
private System.Windows.Forms.Label labelWarning;
|
||||||
|
}
|
||||||
|
}
|
50
Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs
Normal file
50
Core/Other/Settings/Dialogs/DialogSettingsCefArgs.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings.Dialogs{
|
||||||
|
sealed partial class DialogSettingsCefArgs : Form{
|
||||||
|
public string CefArgs{
|
||||||
|
get{
|
||||||
|
return textBoxArgs.Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DialogSettingsCefArgs(){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
Text = Program.BrandName+" Settings - CEF Arguments";
|
||||||
|
|
||||||
|
textBoxArgs.Text = Program.UserConfig.CustomCefArgs ?? "";
|
||||||
|
textBoxArgs.Select(textBoxArgs.Text.Length,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnHelp_Click(object sender, EventArgs e){
|
||||||
|
BrowserUtils.OpenExternalBrowser("http://peter.sh/experiments/chromium-command-line-switches/");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnApply_Click(object sender, EventArgs e){
|
||||||
|
string prevArgs = Program.UserConfig.CustomCefArgs;
|
||||||
|
|
||||||
|
if (CefArgs == prevArgs){
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
|
Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = CommandLineArgsParser.AddToDictionary(CefArgs,new Dictionary<string,string>());
|
||||||
|
string prompt = count == 0 && !string.IsNullOrWhiteSpace(prevArgs) ? "All arguments will be removed from the settings. Continue?" : count+(count == 1 ? " argument" : " arguments")+" will be added to the settings. Continue?";
|
||||||
|
|
||||||
|
if (MessageBox.Show(prompt,"Confirm CEF Arguments",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.OK){
|
||||||
|
DialogResult = DialogResult.OK;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCancel_Click(object sender, EventArgs e){
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
80
Core/Other/Settings/Export/CombinedFileStream.cs
Normal file
80
Core/Other/Settings/Export/CombinedFileStream.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings.Export{
|
||||||
|
class CombinedFileStream : IDisposable{
|
||||||
|
private readonly Stream stream;
|
||||||
|
|
||||||
|
public CombinedFileStream(Stream stream){
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteFile(string identifier, string path){
|
||||||
|
byte[] contents;
|
||||||
|
|
||||||
|
using(FileStream fileStream = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)){
|
||||||
|
int index = 0;
|
||||||
|
int left = (int)fileStream.Length;
|
||||||
|
|
||||||
|
contents = new byte[left];
|
||||||
|
|
||||||
|
while(left > 0){
|
||||||
|
int read = fileStream.Read(contents,index,left);
|
||||||
|
index += read;
|
||||||
|
left -= read;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] name = Encoding.UTF8.GetBytes(identifier);
|
||||||
|
byte[] contentsLength = BitConverter.GetBytes(contents.Length);
|
||||||
|
|
||||||
|
stream.WriteByte((byte)name.Length);
|
||||||
|
stream.Write(name,0,name.Length);
|
||||||
|
stream.Write(contentsLength,0,4);
|
||||||
|
stream.Write(contents,0,contents.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entry ReadFile(){
|
||||||
|
int nameLength = stream.ReadByte();
|
||||||
|
|
||||||
|
if (nameLength == -1){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] name = new byte[nameLength];
|
||||||
|
stream.Read(name,0,nameLength);
|
||||||
|
|
||||||
|
byte[] contentLength = new byte[4];
|
||||||
|
stream.Read(contentLength,0,4);
|
||||||
|
|
||||||
|
byte[] contents = new byte[BitConverter.ToInt32(contentLength,0)];
|
||||||
|
stream.Read(contents,0,contents.Length);
|
||||||
|
|
||||||
|
return new Entry(Encoding.UTF8.GetString(name),contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Flush(){
|
||||||
|
stream.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IDisposable.Dispose(){
|
||||||
|
stream.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Entry{
|
||||||
|
public string Identifier { get; private set; }
|
||||||
|
|
||||||
|
private readonly byte[] contents;
|
||||||
|
|
||||||
|
public Entry(string identifier, byte[] contents){
|
||||||
|
this.Identifier = identifier;
|
||||||
|
this.contents = contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteToFile(string path){
|
||||||
|
File.WriteAllBytes(path,contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
71
Core/Other/Settings/Export/ExportManager.cs
Normal file
71
Core/Other/Settings/Export/ExportManager.cs
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings.Export{
|
||||||
|
sealed class ExportManager{
|
||||||
|
public static readonly string CookiesPath = Path.Combine(Program.StoragePath,"Cookies");
|
||||||
|
public static readonly string TempCookiesPath = Path.Combine(Program.StoragePath,"CookiesTmp");
|
||||||
|
|
||||||
|
public Exception LastException { get; private set; }
|
||||||
|
|
||||||
|
private readonly string file;
|
||||||
|
|
||||||
|
public ExportManager(string file){
|
||||||
|
this.file = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Export(bool includeSession){
|
||||||
|
try{
|
||||||
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file,FileMode.Create,FileAccess.Write,FileShare.None))){
|
||||||
|
stream.WriteFile("config",Program.ConfigFilePath);
|
||||||
|
|
||||||
|
if (includeSession){
|
||||||
|
stream.WriteFile("cookies",CookiesPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
LastException = e;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Import(){
|
||||||
|
try{
|
||||||
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file,FileMode.Open,FileAccess.Read,FileShare.None))){
|
||||||
|
CombinedFileStream.Entry entry;
|
||||||
|
|
||||||
|
while((entry = stream.ReadFile()) != null){
|
||||||
|
switch(entry.Identifier){
|
||||||
|
case "config":
|
||||||
|
entry.WriteToFile(Program.ConfigFilePath);
|
||||||
|
Program.ReloadConfig();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "cookies":
|
||||||
|
if (MessageBox.Show("Do you want to import the login session? This will restart "+Program.BrandName+".","Importing "+Program.BrandName+" Settings",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
|
entry.WriteToFile(Path.Combine(Program.StoragePath,TempCookiesPath));
|
||||||
|
|
||||||
|
// okay to and restart, 'cookies' is always the last entry
|
||||||
|
Process.Start(Application.ExecutablePath,"-restart -importcookies");
|
||||||
|
Application.Exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
LastException = e;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
182
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
Normal file
182
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings {
|
||||||
|
partial class TabSettingsAdvanced {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.btnClearCache = new System.Windows.Forms.Button();
|
||||||
|
this.checkHardwareAcceleration = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.btnEditCefArgs = new System.Windows.Forms.Button();
|
||||||
|
this.btnReset = new System.Windows.Forms.Button();
|
||||||
|
this.btnImport = new System.Windows.Forms.Button();
|
||||||
|
this.btnExport = new System.Windows.Forms.Button();
|
||||||
|
this.groupPerformance = new System.Windows.Forms.GroupBox();
|
||||||
|
this.groupConfiguration = new System.Windows.Forms.GroupBox();
|
||||||
|
this.btnEditCSS = new System.Windows.Forms.Button();
|
||||||
|
this.groupPerformance.SuspendLayout();
|
||||||
|
this.groupConfiguration.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// btnClearCache
|
||||||
|
//
|
||||||
|
this.btnClearCache.Location = new System.Drawing.Point(6, 44);
|
||||||
|
this.btnClearCache.Name = "btnClearCache";
|
||||||
|
this.btnClearCache.Size = new System.Drawing.Size(171, 23);
|
||||||
|
this.btnClearCache.TabIndex = 14;
|
||||||
|
this.btnClearCache.Text = "Clear Cache (calculating)";
|
||||||
|
this.toolTip.SetToolTip(this.btnClearCache, "Clearing cache will free up space taken by downloaded images and other resources." +
|
||||||
|
"");
|
||||||
|
this.btnClearCache.UseVisualStyleBackColor = true;
|
||||||
|
this.btnClearCache.Click += new System.EventHandler(this.btnClearCache_Click);
|
||||||
|
//
|
||||||
|
// checkHardwareAcceleration
|
||||||
|
//
|
||||||
|
this.checkHardwareAcceleration.AutoSize = true;
|
||||||
|
this.checkHardwareAcceleration.Location = new System.Drawing.Point(6, 21);
|
||||||
|
this.checkHardwareAcceleration.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.checkHardwareAcceleration.Name = "checkHardwareAcceleration";
|
||||||
|
this.checkHardwareAcceleration.Size = new System.Drawing.Size(134, 17);
|
||||||
|
this.checkHardwareAcceleration.TabIndex = 12;
|
||||||
|
this.checkHardwareAcceleration.Text = "Hardware Acceleration";
|
||||||
|
this.toolTip.SetToolTip(this.checkHardwareAcceleration, "Uses your graphics card to improve performance.\r\nDisable if you experience issues" +
|
||||||
|
" with rendering.");
|
||||||
|
this.checkHardwareAcceleration.UseVisualStyleBackColor = true;
|
||||||
|
this.checkHardwareAcceleration.CheckedChanged += new System.EventHandler(this.checkHardwareAcceleration_CheckedChanged);
|
||||||
|
//
|
||||||
|
// btnEditCefArgs
|
||||||
|
//
|
||||||
|
this.btnEditCefArgs.Location = new System.Drawing.Point(6, 19);
|
||||||
|
this.btnEditCefArgs.Name = "btnEditCefArgs";
|
||||||
|
this.btnEditCefArgs.Size = new System.Drawing.Size(171, 23);
|
||||||
|
this.btnEditCefArgs.TabIndex = 15;
|
||||||
|
this.btnEditCefArgs.Text = "Edit CEF Arguments";
|
||||||
|
this.toolTip.SetToolTip(this.btnEditCefArgs, "Set custom command line arguments for Chromium Embedded Framework.");
|
||||||
|
this.btnEditCefArgs.UseVisualStyleBackColor = true;
|
||||||
|
this.btnEditCefArgs.Click += new System.EventHandler(this.btnEditCefArgs_Click);
|
||||||
|
//
|
||||||
|
// btnReset
|
||||||
|
//
|
||||||
|
this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnReset.AutoSize = true;
|
||||||
|
this.btnReset.Location = new System.Drawing.Point(209, 250);
|
||||||
|
this.btnReset.Name = "btnReset";
|
||||||
|
this.btnReset.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnReset.Size = new System.Drawing.Size(102, 23);
|
||||||
|
this.btnReset.TabIndex = 17;
|
||||||
|
this.btnReset.Text = "Restore Defaults";
|
||||||
|
this.btnReset.UseVisualStyleBackColor = true;
|
||||||
|
this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
|
||||||
|
//
|
||||||
|
// btnImport
|
||||||
|
//
|
||||||
|
this.btnImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnImport.AutoSize = true;
|
||||||
|
this.btnImport.Location = new System.Drawing.Point(109, 250);
|
||||||
|
this.btnImport.Name = "btnImport";
|
||||||
|
this.btnImport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnImport.Size = new System.Drawing.Size(94, 23);
|
||||||
|
this.btnImport.TabIndex = 16;
|
||||||
|
this.btnImport.Text = "Import Settings";
|
||||||
|
this.btnImport.UseVisualStyleBackColor = true;
|
||||||
|
this.btnImport.Click += new System.EventHandler(this.btnImport_Click);
|
||||||
|
//
|
||||||
|
// btnExport
|
||||||
|
//
|
||||||
|
this.btnExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.btnExport.AutoSize = true;
|
||||||
|
this.btnExport.Location = new System.Drawing.Point(9, 250);
|
||||||
|
this.btnExport.Name = "btnExport";
|
||||||
|
this.btnExport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnExport.Size = new System.Drawing.Size(94, 23);
|
||||||
|
this.btnExport.TabIndex = 15;
|
||||||
|
this.btnExport.Text = "Export Settings";
|
||||||
|
this.btnExport.UseVisualStyleBackColor = true;
|
||||||
|
this.btnExport.Click += new System.EventHandler(this.btnExport_Click);
|
||||||
|
//
|
||||||
|
// groupPerformance
|
||||||
|
//
|
||||||
|
this.groupPerformance.Controls.Add(this.checkHardwareAcceleration);
|
||||||
|
this.groupPerformance.Controls.Add(this.btnClearCache);
|
||||||
|
this.groupPerformance.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.groupPerformance.Name = "groupPerformance";
|
||||||
|
this.groupPerformance.Size = new System.Drawing.Size(183, 74);
|
||||||
|
this.groupPerformance.TabIndex = 18;
|
||||||
|
this.groupPerformance.TabStop = false;
|
||||||
|
this.groupPerformance.Text = "Performance";
|
||||||
|
//
|
||||||
|
// groupConfiguration
|
||||||
|
//
|
||||||
|
this.groupConfiguration.Controls.Add(this.btnEditCSS);
|
||||||
|
this.groupConfiguration.Controls.Add(this.btnEditCefArgs);
|
||||||
|
this.groupConfiguration.Location = new System.Drawing.Point(9, 89);
|
||||||
|
this.groupConfiguration.Name = "groupConfiguration";
|
||||||
|
this.groupConfiguration.Size = new System.Drawing.Size(183, 77);
|
||||||
|
this.groupConfiguration.TabIndex = 19;
|
||||||
|
this.groupConfiguration.TabStop = false;
|
||||||
|
this.groupConfiguration.Text = "Configuration";
|
||||||
|
//
|
||||||
|
// btnEditCSS
|
||||||
|
//
|
||||||
|
this.btnEditCSS.Location = new System.Drawing.Point(6, 48);
|
||||||
|
this.btnEditCSS.Name = "btnEditCSS";
|
||||||
|
this.btnEditCSS.Size = new System.Drawing.Size(171, 23);
|
||||||
|
this.btnEditCSS.TabIndex = 16;
|
||||||
|
this.btnEditCSS.Text = "Edit CSS";
|
||||||
|
this.toolTip.SetToolTip(this.btnEditCSS, "Set custom CSS for browser and notification windows.");
|
||||||
|
this.btnEditCSS.UseVisualStyleBackColor = true;
|
||||||
|
this.btnEditCSS.Click += new System.EventHandler(this.btnEditCSS_Click);
|
||||||
|
//
|
||||||
|
// TabSettingsAdvanced
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.groupConfiguration);
|
||||||
|
this.Controls.Add(this.groupPerformance);
|
||||||
|
this.Controls.Add(this.btnReset);
|
||||||
|
this.Controls.Add(this.btnImport);
|
||||||
|
this.Controls.Add(this.btnExport);
|
||||||
|
this.Name = "TabSettingsAdvanced";
|
||||||
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.groupPerformance.ResumeLayout(false);
|
||||||
|
this.groupPerformance.PerformLayout();
|
||||||
|
this.groupConfiguration.ResumeLayout(false);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Button btnClearCache;
|
||||||
|
private System.Windows.Forms.CheckBox checkHardwareAcceleration;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.Button btnReset;
|
||||||
|
private System.Windows.Forms.Button btnImport;
|
||||||
|
private System.Windows.Forms.Button btnExport;
|
||||||
|
private System.Windows.Forms.GroupBox groupPerformance;
|
||||||
|
private System.Windows.Forms.GroupBox groupConfiguration;
|
||||||
|
private System.Windows.Forms.Button btnEditCefArgs;
|
||||||
|
private System.Windows.Forms.Button btnEditCSS;
|
||||||
|
}
|
||||||
|
}
|
158
Core/Other/Settings/TabSettingsAdvanced.cs
Normal file
158
Core/Other/Settings/TabSettingsAdvanced.cs
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Core.Other.Settings.Dialogs;
|
||||||
|
using TweetDck.Core.Other.Settings.Export;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class TabSettingsAdvanced : BaseTabSettings{
|
||||||
|
private readonly Action browserReloadAction;
|
||||||
|
|
||||||
|
public TabSettingsAdvanced(Action browserReloadAction){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.browserReloadAction = browserReloadAction;
|
||||||
|
|
||||||
|
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
||||||
|
|
||||||
|
BrowserCache.CalculateCacheSize(bytes => this.InvokeSafe(() => {
|
||||||
|
if (bytes == -1L){
|
||||||
|
btnClearCache.Text = "Clear Cache (unknown size)";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
btnClearCache.Text = "Clear Cache ("+(int)Math.Ceiling(bytes/(1024.0*1024.0))+" MB)";
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnClearCache_Click(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
btnClearCache.Enabled = false;
|
||||||
|
BrowserCache.SetClearOnExit();
|
||||||
|
|
||||||
|
MessageBox.Show("Cache will be automatically cleared when "+Program.BrandName+" exits.","Clear Cache",MessageBoxButtons.OK,MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkHardwareAcceleration_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
bool succeeded = false;
|
||||||
|
|
||||||
|
if (checkHardwareAcceleration.Checked){
|
||||||
|
if (HardwareAcceleration.CanEnable){
|
||||||
|
succeeded = HardwareAcceleration.Enable();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
MessageBox.Show("Cannot enable hardware acceleration, the libraries libEGL.dll and libGLESv2.dll could not be restored.",Program.BrandName+" Settings",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
succeeded = HardwareAcceleration.Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (succeeded){
|
||||||
|
PromptRestart();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
checkHardwareAcceleration.CheckedChanged -= checkHardwareAcceleration_CheckedChanged;
|
||||||
|
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
||||||
|
checkHardwareAcceleration.CheckedChanged += checkHardwareAcceleration_CheckedChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnEditCefArgs_Click(object sender, EventArgs e){
|
||||||
|
DialogSettingsCefArgs form = new DialogSettingsCefArgs();
|
||||||
|
|
||||||
|
if (form.ShowDialog(ParentForm) == DialogResult.OK){
|
||||||
|
Config.CustomCefArgs = form.CefArgs;
|
||||||
|
PromptRestart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnEditCSS_Click(object sender, EventArgs e){
|
||||||
|
DialogSettingsCSS form = new DialogSettingsCSS();
|
||||||
|
|
||||||
|
if (form.ShowDialog(ParentForm) == DialogResult.OK){
|
||||||
|
bool hasChangedBrowser = form.BrowserCSS != Config.CustomBrowserCSS;
|
||||||
|
|
||||||
|
Config.CustomBrowserCSS = form.BrowserCSS;
|
||||||
|
Config.CustomNotificationCSS = form.NotificationCSS;
|
||||||
|
|
||||||
|
if (hasChangedBrowser && MessageBox.Show("The browser CSS has changed, do you want to reload it?","Browser CSS Changed",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
|
browserReloadAction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnExport_Click(object sender, EventArgs e){
|
||||||
|
DialogResult resultSaveCredentials = MessageBox.Show("Do you want to include your login session? This will not save your password into the file, but it will allow anyone with the file to login into TweetDeck as you.","Export "+Program.BrandName+" Settings",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button3);
|
||||||
|
if (resultSaveCredentials == DialogResult.Cancel)return;
|
||||||
|
|
||||||
|
bool saveCredentials = resultSaveCredentials == DialogResult.Yes;
|
||||||
|
string file;
|
||||||
|
|
||||||
|
using(SaveFileDialog dialog = new SaveFileDialog{
|
||||||
|
AddExtension = true,
|
||||||
|
AutoUpgradeEnabled = true,
|
||||||
|
OverwritePrompt = true,
|
||||||
|
DefaultExt = "tdsettings",
|
||||||
|
FileName = Program.BrandName+".tdsettings",
|
||||||
|
Title = "Export "+Program.BrandName+" Settings",
|
||||||
|
Filter = Program.BrandName+" Settings (*.tdsettings)|*.tdsettings"
|
||||||
|
}){
|
||||||
|
file = dialog.ShowDialog() == DialogResult.OK ? dialog.FileName : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file != null){
|
||||||
|
Program.UserConfig.Save();
|
||||||
|
|
||||||
|
ExportManager manager = new ExportManager(file);
|
||||||
|
|
||||||
|
if (!manager.Export(saveCredentials)){
|
||||||
|
Program.HandleException("An exception happened while exporting "+Program.BrandName+" settings.",manager.LastException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnImport_Click(object sender, EventArgs e){
|
||||||
|
string file;
|
||||||
|
|
||||||
|
using(OpenFileDialog dialog = new OpenFileDialog{
|
||||||
|
AutoUpgradeEnabled = true,
|
||||||
|
DereferenceLinks = true,
|
||||||
|
Title = "Import "+Program.BrandName+" Settings",
|
||||||
|
Filter = Program.BrandName+" Settings (*.tdsettings)|*.tdsettings"
|
||||||
|
}){
|
||||||
|
file = dialog.ShowDialog() == DialogResult.OK ? dialog.FileName : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file != null){
|
||||||
|
ExportManager manager = new ExportManager(file);
|
||||||
|
|
||||||
|
if (manager.Import()){
|
||||||
|
((FormSettings)ParentForm).ReloadUI();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Program.HandleException("An exception happened while importing "+Program.BrandName+" settings.",manager.LastException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnReset_Click(object sender, EventArgs e){
|
||||||
|
if (MessageBox.Show("This will reset all of your settings, including disabled plugins. Do you want to proceed?","Reset "+Program.BrandName+" Settings",MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
|
Program.ResetConfig();
|
||||||
|
((FormSettings)ParentForm).ReloadUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PromptRestart(){
|
||||||
|
if (MessageBox.Show("The application must restart for the setting to take place. Do you want to restart now?",Program.BrandName+" Settings",MessageBoxButtons.YesNo,MessageBoxIcon.Information) == DialogResult.Yes){
|
||||||
|
Process.Start(Application.ExecutablePath,"-restart");
|
||||||
|
Application.Exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
135
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
Normal file
135
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings {
|
||||||
|
partial class TabSettingsGeneral {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
||||||
|
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.checkTrayHighlight = new System.Windows.Forms.CheckBox();
|
||||||
|
this.groupTray = new System.Windows.Forms.GroupBox();
|
||||||
|
this.labelTrayIcon = new System.Windows.Forms.Label();
|
||||||
|
this.groupInterface = new System.Windows.Forms.GroupBox();
|
||||||
|
this.groupTray.SuspendLayout();
|
||||||
|
this.groupInterface.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// checkExpandLinks
|
||||||
|
//
|
||||||
|
this.checkExpandLinks.AutoSize = true;
|
||||||
|
this.checkExpandLinks.Location = new System.Drawing.Point(9, 21);
|
||||||
|
this.checkExpandLinks.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.checkExpandLinks.Name = "checkExpandLinks";
|
||||||
|
this.checkExpandLinks.Size = new System.Drawing.Size(166, 17);
|
||||||
|
this.checkExpandLinks.TabIndex = 14;
|
||||||
|
this.checkExpandLinks.Text = "Expand Links When Hovered";
|
||||||
|
this.toolTip.SetToolTip(this.checkExpandLinks, "Expands links inside the tweets. If disabled,\r\nthe full links show up in a toolti" +
|
||||||
|
"p instead.");
|
||||||
|
this.checkExpandLinks.UseVisualStyleBackColor = true;
|
||||||
|
this.checkExpandLinks.CheckedChanged += new System.EventHandler(this.checkExpandLinks_CheckedChanged);
|
||||||
|
//
|
||||||
|
// comboBoxTrayType
|
||||||
|
//
|
||||||
|
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxTrayType.FormattingEnabled = true;
|
||||||
|
this.comboBoxTrayType.Location = new System.Drawing.Point(6, 19);
|
||||||
|
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
||||||
|
this.comboBoxTrayType.Size = new System.Drawing.Size(171, 21);
|
||||||
|
this.comboBoxTrayType.TabIndex = 13;
|
||||||
|
this.toolTip.SetToolTip(this.comboBoxTrayType, "Changes behavior of the Tray icon.\r\nRight-click the icon for an action menu.");
|
||||||
|
this.comboBoxTrayType.SelectedIndexChanged += new System.EventHandler(this.comboBoxTrayType_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// checkTrayHighlight
|
||||||
|
//
|
||||||
|
this.checkTrayHighlight.AutoSize = true;
|
||||||
|
this.checkTrayHighlight.Location = new System.Drawing.Point(9, 70);
|
||||||
|
this.checkTrayHighlight.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.checkTrayHighlight.Name = "checkTrayHighlight";
|
||||||
|
this.checkTrayHighlight.Size = new System.Drawing.Size(103, 17);
|
||||||
|
this.checkTrayHighlight.TabIndex = 15;
|
||||||
|
this.checkTrayHighlight.Text = "Enable Highlight";
|
||||||
|
this.toolTip.SetToolTip(this.checkTrayHighlight, "Highlights the tray icon if there are new tweets.\r\nOnly works for columns with po" +
|
||||||
|
"pup or audio notifications.\r\nThe icon resets when the main window is restored.");
|
||||||
|
this.checkTrayHighlight.UseVisualStyleBackColor = true;
|
||||||
|
this.checkTrayHighlight.CheckedChanged += new System.EventHandler(this.checkTrayHighlight_CheckedChanged);
|
||||||
|
//
|
||||||
|
// groupTray
|
||||||
|
//
|
||||||
|
this.groupTray.Controls.Add(this.checkTrayHighlight);
|
||||||
|
this.groupTray.Controls.Add(this.labelTrayIcon);
|
||||||
|
this.groupTray.Controls.Add(this.comboBoxTrayType);
|
||||||
|
this.groupTray.Location = new System.Drawing.Point(9, 63);
|
||||||
|
this.groupTray.Name = "groupTray";
|
||||||
|
this.groupTray.Size = new System.Drawing.Size(183, 93);
|
||||||
|
this.groupTray.TabIndex = 15;
|
||||||
|
this.groupTray.TabStop = false;
|
||||||
|
this.groupTray.Text = "System Tray";
|
||||||
|
//
|
||||||
|
// labelTrayIcon
|
||||||
|
//
|
||||||
|
this.labelTrayIcon.AutoSize = true;
|
||||||
|
this.labelTrayIcon.Location = new System.Drawing.Point(6, 52);
|
||||||
|
this.labelTrayIcon.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
||||||
|
this.labelTrayIcon.Name = "labelTrayIcon";
|
||||||
|
this.labelTrayIcon.Size = new System.Drawing.Size(52, 13);
|
||||||
|
this.labelTrayIcon.TabIndex = 14;
|
||||||
|
this.labelTrayIcon.Text = "Tray Icon";
|
||||||
|
//
|
||||||
|
// groupInterface
|
||||||
|
//
|
||||||
|
this.groupInterface.Controls.Add(this.checkExpandLinks);
|
||||||
|
this.groupInterface.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.groupInterface.Name = "groupInterface";
|
||||||
|
this.groupInterface.Size = new System.Drawing.Size(183, 48);
|
||||||
|
this.groupInterface.TabIndex = 16;
|
||||||
|
this.groupInterface.TabStop = false;
|
||||||
|
this.groupInterface.Text = "User Interface";
|
||||||
|
//
|
||||||
|
// TabSettingsGeneral
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.groupInterface);
|
||||||
|
this.Controls.Add(this.groupTray);
|
||||||
|
this.Name = "TabSettingsGeneral";
|
||||||
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.groupTray.ResumeLayout(false);
|
||||||
|
this.groupTray.PerformLayout();
|
||||||
|
this.groupInterface.ResumeLayout(false);
|
||||||
|
this.groupInterface.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.CheckBox checkExpandLinks;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.GroupBox groupTray;
|
||||||
|
private System.Windows.Forms.GroupBox groupInterface;
|
||||||
|
private System.Windows.Forms.Label labelTrayIcon;
|
||||||
|
private System.Windows.Forms.CheckBox checkTrayHighlight;
|
||||||
|
}
|
||||||
|
}
|
37
Core/Other/Settings/TabSettingsGeneral.cs
Normal file
37
Core/Other/Settings/TabSettingsGeneral.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class TabSettingsGeneral : BaseTabSettings{
|
||||||
|
public TabSettingsGeneral(){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
comboBoxTrayType.Items.Add("Disabled");
|
||||||
|
comboBoxTrayType.Items.Add("Display Icon Only");
|
||||||
|
comboBoxTrayType.Items.Add("Minimize to Tray");
|
||||||
|
comboBoxTrayType.Items.Add("Close to Tray");
|
||||||
|
comboBoxTrayType.Items.Add("Combined");
|
||||||
|
comboBoxTrayType.SelectedIndex = Math.Min(Math.Max((int)Config.TrayBehavior,0),comboBoxTrayType.Items.Count-1);
|
||||||
|
|
||||||
|
checkExpandLinks.Checked = Program.UserConfig.ExpandLinksOnHover;
|
||||||
|
checkTrayHighlight.Checked = Program.UserConfig.EnableTrayHighlight;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkExpandLinks_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxTrayType_SelectedIndexChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.TrayBehavior = (TrayIcon.Behavior)comboBoxTrayType.SelectedIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkTrayHighlight_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.EnableTrayHighlight = checkTrayHighlight.Checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
401
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
Normal file
401
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings {
|
||||||
|
partial class TabSettingsNotifications {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.groupNotificationLocation = new System.Windows.Forms.GroupBox();
|
||||||
|
this.labelEdgeDistanceValue = new System.Windows.Forms.Label();
|
||||||
|
this.labelDisplay = new System.Windows.Forms.Label();
|
||||||
|
this.comboBoxDisplay = new System.Windows.Forms.ComboBox();
|
||||||
|
this.labelEdgeDistance = new System.Windows.Forms.Label();
|
||||||
|
this.radioLocCustom = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioLocBR = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioLocBL = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioLocTR = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioLocTL = new System.Windows.Forms.RadioButton();
|
||||||
|
this.trackBarEdgeDistance = new System.Windows.Forms.TrackBar();
|
||||||
|
this.groupNotificationDuration = new System.Windows.Forms.GroupBox();
|
||||||
|
this.tableLayoutDurationButtons = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.btnDurationMedium = new TweetDck.Core.Controls.FlatButton();
|
||||||
|
this.btnDurationLong = new TweetDck.Core.Controls.FlatButton();
|
||||||
|
this.btnDurationShort = new TweetDck.Core.Controls.FlatButton();
|
||||||
|
this.labelDurationValue = new System.Windows.Forms.Label();
|
||||||
|
this.trackBarDuration = new System.Windows.Forms.TrackBar();
|
||||||
|
this.groupUserInterface = new System.Windows.Forms.GroupBox();
|
||||||
|
this.checkTimerCountDown = new System.Windows.Forms.CheckBox();
|
||||||
|
this.checkLegacyLoad = new System.Windows.Forms.CheckBox();
|
||||||
|
this.checkNotificationTimer = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.groupNotificationLocation.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
||||||
|
this.groupNotificationDuration.SuspendLayout();
|
||||||
|
this.tableLayoutDurationButtons.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).BeginInit();
|
||||||
|
this.groupUserInterface.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// groupNotificationLocation
|
||||||
|
//
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistanceValue);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.labelDisplay);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.comboBoxDisplay);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistance);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.radioLocCustom);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.radioLocBR);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.radioLocBL);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.radioLocTR);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.radioLocTL);
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.trackBarEdgeDistance);
|
||||||
|
this.groupNotificationLocation.Location = new System.Drawing.Point(198, 9);
|
||||||
|
this.groupNotificationLocation.Name = "groupNotificationLocation";
|
||||||
|
this.groupNotificationLocation.Size = new System.Drawing.Size(183, 264);
|
||||||
|
this.groupNotificationLocation.TabIndex = 1;
|
||||||
|
this.groupNotificationLocation.TabStop = false;
|
||||||
|
this.groupNotificationLocation.Text = "Location";
|
||||||
|
//
|
||||||
|
// labelEdgeDistanceValue
|
||||||
|
//
|
||||||
|
this.labelEdgeDistanceValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.labelEdgeDistanceValue.Location = new System.Drawing.Point(143, 214);
|
||||||
|
this.labelEdgeDistanceValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
|
this.labelEdgeDistanceValue.Name = "labelEdgeDistanceValue";
|
||||||
|
this.labelEdgeDistanceValue.Size = new System.Drawing.Size(34, 13);
|
||||||
|
this.labelEdgeDistanceValue.TabIndex = 11;
|
||||||
|
this.labelEdgeDistanceValue.Text = "0 px";
|
||||||
|
this.labelEdgeDistanceValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
|
//
|
||||||
|
// labelDisplay
|
||||||
|
//
|
||||||
|
this.labelDisplay.AutoSize = true;
|
||||||
|
this.labelDisplay.Location = new System.Drawing.Point(3, 148);
|
||||||
|
this.labelDisplay.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
|
this.labelDisplay.Name = "labelDisplay";
|
||||||
|
this.labelDisplay.Size = new System.Drawing.Size(41, 13);
|
||||||
|
this.labelDisplay.TabIndex = 8;
|
||||||
|
this.labelDisplay.Text = "Display";
|
||||||
|
//
|
||||||
|
// comboBoxDisplay
|
||||||
|
//
|
||||||
|
this.comboBoxDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.comboBoxDisplay.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxDisplay.FormattingEnabled = true;
|
||||||
|
this.comboBoxDisplay.Location = new System.Drawing.Point(6, 164);
|
||||||
|
this.comboBoxDisplay.Name = "comboBoxDisplay";
|
||||||
|
this.comboBoxDisplay.Size = new System.Drawing.Size(171, 21);
|
||||||
|
this.comboBoxDisplay.TabIndex = 7;
|
||||||
|
this.comboBoxDisplay.SelectedValueChanged += new System.EventHandler(this.comboBoxDisplay_SelectedValueChanged);
|
||||||
|
//
|
||||||
|
// labelEdgeDistance
|
||||||
|
//
|
||||||
|
this.labelEdgeDistance.AutoSize = true;
|
||||||
|
this.labelEdgeDistance.Location = new System.Drawing.Point(3, 197);
|
||||||
|
this.labelEdgeDistance.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
||||||
|
this.labelEdgeDistance.Name = "labelEdgeDistance";
|
||||||
|
this.labelEdgeDistance.Size = new System.Drawing.Size(103, 13);
|
||||||
|
this.labelEdgeDistance.TabIndex = 6;
|
||||||
|
this.labelEdgeDistance.Text = "Distance From Edge";
|
||||||
|
//
|
||||||
|
// radioLocCustom
|
||||||
|
//
|
||||||
|
this.radioLocCustom.AutoSize = true;
|
||||||
|
this.radioLocCustom.Location = new System.Drawing.Point(7, 116);
|
||||||
|
this.radioLocCustom.Name = "radioLocCustom";
|
||||||
|
this.radioLocCustom.Size = new System.Drawing.Size(60, 17);
|
||||||
|
this.radioLocCustom.TabIndex = 4;
|
||||||
|
this.radioLocCustom.TabStop = true;
|
||||||
|
this.radioLocCustom.Text = "Custom";
|
||||||
|
this.toolTip.SetToolTip(this.radioLocCustom, "Drag the notification window to the desired location.");
|
||||||
|
this.radioLocCustom.UseVisualStyleBackColor = true;
|
||||||
|
this.radioLocCustom.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radioLocBR
|
||||||
|
//
|
||||||
|
this.radioLocBR.AutoSize = true;
|
||||||
|
this.radioLocBR.Location = new System.Drawing.Point(7, 92);
|
||||||
|
this.radioLocBR.Name = "radioLocBR";
|
||||||
|
this.radioLocBR.Size = new System.Drawing.Size(86, 17);
|
||||||
|
this.radioLocBR.TabIndex = 3;
|
||||||
|
this.radioLocBR.TabStop = true;
|
||||||
|
this.radioLocBR.Text = "Bottom Right";
|
||||||
|
this.radioLocBR.UseVisualStyleBackColor = true;
|
||||||
|
this.radioLocBR.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radioLocBL
|
||||||
|
//
|
||||||
|
this.radioLocBL.AutoSize = true;
|
||||||
|
this.radioLocBL.Location = new System.Drawing.Point(7, 68);
|
||||||
|
this.radioLocBL.Name = "radioLocBL";
|
||||||
|
this.radioLocBL.Size = new System.Drawing.Size(79, 17);
|
||||||
|
this.radioLocBL.TabIndex = 2;
|
||||||
|
this.radioLocBL.TabStop = true;
|
||||||
|
this.radioLocBL.Text = "Bottom Left";
|
||||||
|
this.radioLocBL.UseVisualStyleBackColor = true;
|
||||||
|
this.radioLocBL.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radioLocTR
|
||||||
|
//
|
||||||
|
this.radioLocTR.AutoSize = true;
|
||||||
|
this.radioLocTR.Location = new System.Drawing.Point(7, 44);
|
||||||
|
this.radioLocTR.Name = "radioLocTR";
|
||||||
|
this.radioLocTR.Size = new System.Drawing.Size(72, 17);
|
||||||
|
this.radioLocTR.TabIndex = 1;
|
||||||
|
this.radioLocTR.TabStop = true;
|
||||||
|
this.radioLocTR.Text = "Top Right";
|
||||||
|
this.radioLocTR.UseVisualStyleBackColor = true;
|
||||||
|
this.radioLocTR.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radioLocTL
|
||||||
|
//
|
||||||
|
this.radioLocTL.AutoSize = true;
|
||||||
|
this.radioLocTL.Location = new System.Drawing.Point(7, 20);
|
||||||
|
this.radioLocTL.Name = "radioLocTL";
|
||||||
|
this.radioLocTL.Size = new System.Drawing.Size(65, 17);
|
||||||
|
this.radioLocTL.TabIndex = 0;
|
||||||
|
this.radioLocTL.TabStop = true;
|
||||||
|
this.radioLocTL.Text = "Top Left";
|
||||||
|
this.radioLocTL.UseVisualStyleBackColor = true;
|
||||||
|
this.radioLocTL.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
|
//
|
||||||
|
// trackBarEdgeDistance
|
||||||
|
//
|
||||||
|
this.trackBarEdgeDistance.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.trackBarEdgeDistance.LargeChange = 8;
|
||||||
|
this.trackBarEdgeDistance.Location = new System.Drawing.Point(6, 213);
|
||||||
|
this.trackBarEdgeDistance.Maximum = 40;
|
||||||
|
this.trackBarEdgeDistance.Minimum = 8;
|
||||||
|
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
||||||
|
this.trackBarEdgeDistance.Size = new System.Drawing.Size(141, 45);
|
||||||
|
this.trackBarEdgeDistance.SmallChange = 2;
|
||||||
|
this.trackBarEdgeDistance.TabIndex = 5;
|
||||||
|
this.trackBarEdgeDistance.TickFrequency = 4;
|
||||||
|
this.trackBarEdgeDistance.Value = 8;
|
||||||
|
this.trackBarEdgeDistance.ValueChanged += new System.EventHandler(this.trackBarEdgeDistance_ValueChanged);
|
||||||
|
//
|
||||||
|
// groupNotificationDuration
|
||||||
|
//
|
||||||
|
this.groupNotificationDuration.Controls.Add(this.tableLayoutDurationButtons);
|
||||||
|
this.groupNotificationDuration.Controls.Add(this.labelDurationValue);
|
||||||
|
this.groupNotificationDuration.Controls.Add(this.trackBarDuration);
|
||||||
|
this.groupNotificationDuration.Location = new System.Drawing.Point(9, 106);
|
||||||
|
this.groupNotificationDuration.Name = "groupNotificationDuration";
|
||||||
|
this.groupNotificationDuration.Size = new System.Drawing.Size(183, 89);
|
||||||
|
this.groupNotificationDuration.TabIndex = 9;
|
||||||
|
this.groupNotificationDuration.TabStop = false;
|
||||||
|
this.groupNotificationDuration.Text = "Duration";
|
||||||
|
//
|
||||||
|
// tableLayoutDurationButtons
|
||||||
|
//
|
||||||
|
this.tableLayoutDurationButtons.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.tableLayoutDurationButtons.ColumnCount = 3;
|
||||||
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32F));
|
||||||
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 36F));
|
||||||
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32F));
|
||||||
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationMedium, 0, 0);
|
||||||
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationLong, 1, 0);
|
||||||
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationShort, 0, 0);
|
||||||
|
this.tableLayoutDurationButtons.Location = new System.Drawing.Point(6, 56);
|
||||||
|
this.tableLayoutDurationButtons.Name = "tableLayoutDurationButtons";
|
||||||
|
this.tableLayoutDurationButtons.RowCount = 1;
|
||||||
|
this.tableLayoutDurationButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutDurationButtons.Size = new System.Drawing.Size(171, 27);
|
||||||
|
this.tableLayoutDurationButtons.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// btnDurationMedium
|
||||||
|
//
|
||||||
|
this.btnDurationMedium.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.btnDurationMedium.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
|
this.btnDurationMedium.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
|
this.btnDurationMedium.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
|
this.btnDurationMedium.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.btnDurationMedium.Location = new System.Drawing.Point(55, 1);
|
||||||
|
this.btnDurationMedium.Margin = new System.Windows.Forms.Padding(1);
|
||||||
|
this.btnDurationMedium.Name = "btnDurationMedium";
|
||||||
|
this.btnDurationMedium.Size = new System.Drawing.Size(59, 25);
|
||||||
|
this.btnDurationMedium.TabIndex = 2;
|
||||||
|
this.btnDurationMedium.Text = "Medium";
|
||||||
|
this.btnDurationMedium.UseVisualStyleBackColor = true;
|
||||||
|
this.btnDurationMedium.Click += new System.EventHandler(this.btnDurationMedium_Click);
|
||||||
|
//
|
||||||
|
// btnDurationLong
|
||||||
|
//
|
||||||
|
this.btnDurationLong.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.btnDurationLong.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
|
this.btnDurationLong.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
|
this.btnDurationLong.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
|
this.btnDurationLong.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.btnDurationLong.Location = new System.Drawing.Point(116, 1);
|
||||||
|
this.btnDurationLong.Margin = new System.Windows.Forms.Padding(1);
|
||||||
|
this.btnDurationLong.Name = "btnDurationLong";
|
||||||
|
this.btnDurationLong.Size = new System.Drawing.Size(54, 25);
|
||||||
|
this.btnDurationLong.TabIndex = 1;
|
||||||
|
this.btnDurationLong.Text = "Long";
|
||||||
|
this.btnDurationLong.UseVisualStyleBackColor = true;
|
||||||
|
this.btnDurationLong.Click += new System.EventHandler(this.btnDurationLong_Click);
|
||||||
|
//
|
||||||
|
// btnDurationShort
|
||||||
|
//
|
||||||
|
this.btnDurationShort.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.btnDurationShort.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
|
this.btnDurationShort.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
|
this.btnDurationShort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
|
this.btnDurationShort.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.btnDurationShort.Location = new System.Drawing.Point(1, 1);
|
||||||
|
this.btnDurationShort.Margin = new System.Windows.Forms.Padding(1);
|
||||||
|
this.btnDurationShort.Name = "btnDurationShort";
|
||||||
|
this.btnDurationShort.Size = new System.Drawing.Size(52, 25);
|
||||||
|
this.btnDurationShort.TabIndex = 0;
|
||||||
|
this.btnDurationShort.Text = "Short";
|
||||||
|
this.btnDurationShort.UseVisualStyleBackColor = true;
|
||||||
|
this.btnDurationShort.Click += new System.EventHandler(this.btnDurationShort_Click);
|
||||||
|
//
|
||||||
|
// labelDurationValue
|
||||||
|
//
|
||||||
|
this.labelDurationValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.labelDurationValue.BackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.labelDurationValue.Location = new System.Drawing.Point(129, 20);
|
||||||
|
this.labelDurationValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
|
this.labelDurationValue.Name = "labelDurationValue";
|
||||||
|
this.labelDurationValue.Size = new System.Drawing.Size(48, 13);
|
||||||
|
this.labelDurationValue.TabIndex = 13;
|
||||||
|
this.labelDurationValue.Text = "0 ms/c";
|
||||||
|
this.labelDurationValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
|
this.toolTip.SetToolTip(this.labelDurationValue, "Milliseconds per character.");
|
||||||
|
//
|
||||||
|
// trackBarDuration
|
||||||
|
//
|
||||||
|
this.trackBarDuration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.trackBarDuration.Location = new System.Drawing.Point(6, 19);
|
||||||
|
this.trackBarDuration.Maximum = 60;
|
||||||
|
this.trackBarDuration.Minimum = 10;
|
||||||
|
this.trackBarDuration.Name = "trackBarDuration";
|
||||||
|
this.trackBarDuration.Size = new System.Drawing.Size(128, 45);
|
||||||
|
this.trackBarDuration.TabIndex = 12;
|
||||||
|
this.trackBarDuration.TickFrequency = 5;
|
||||||
|
this.trackBarDuration.Value = 25;
|
||||||
|
this.trackBarDuration.ValueChanged += new System.EventHandler(this.trackBarDuration_ValueChanged);
|
||||||
|
//
|
||||||
|
// groupUserInterface
|
||||||
|
//
|
||||||
|
this.groupUserInterface.Controls.Add(this.checkTimerCountDown);
|
||||||
|
this.groupUserInterface.Controls.Add(this.checkLegacyLoad);
|
||||||
|
this.groupUserInterface.Controls.Add(this.checkNotificationTimer);
|
||||||
|
this.groupUserInterface.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.groupUserInterface.Name = "groupUserInterface";
|
||||||
|
this.groupUserInterface.Size = new System.Drawing.Size(183, 91);
|
||||||
|
this.groupUserInterface.TabIndex = 10;
|
||||||
|
this.groupUserInterface.TabStop = false;
|
||||||
|
this.groupUserInterface.Text = "General";
|
||||||
|
//
|
||||||
|
// checkTimerCountDown
|
||||||
|
//
|
||||||
|
this.checkTimerCountDown.AutoSize = true;
|
||||||
|
this.checkTimerCountDown.Location = new System.Drawing.Point(6, 44);
|
||||||
|
this.checkTimerCountDown.Name = "checkTimerCountDown";
|
||||||
|
this.checkTimerCountDown.Size = new System.Drawing.Size(119, 17);
|
||||||
|
this.checkTimerCountDown.TabIndex = 6;
|
||||||
|
this.checkTimerCountDown.Text = "Timer Counts Down";
|
||||||
|
this.toolTip.SetToolTip(this.checkTimerCountDown, "The notification timer counts down instead of up.");
|
||||||
|
this.checkTimerCountDown.UseVisualStyleBackColor = true;
|
||||||
|
this.checkTimerCountDown.CheckedChanged += new System.EventHandler(this.checkTimerCountDown_CheckedChanged);
|
||||||
|
//
|
||||||
|
// checkLegacyLoad
|
||||||
|
//
|
||||||
|
this.checkLegacyLoad.AutoSize = true;
|
||||||
|
this.checkLegacyLoad.Location = new System.Drawing.Point(6, 67);
|
||||||
|
this.checkLegacyLoad.Name = "checkLegacyLoad";
|
||||||
|
this.checkLegacyLoad.Size = new System.Drawing.Size(139, 17);
|
||||||
|
this.checkLegacyLoad.TabIndex = 5;
|
||||||
|
this.checkLegacyLoad.Text = "Legacy Loading System";
|
||||||
|
this.toolTip.SetToolTip(this.checkLegacyLoad, "Try enabling if notifications do not display.\r\nMight cause delays and visual arti" +
|
||||||
|
"facts.");
|
||||||
|
this.checkLegacyLoad.UseVisualStyleBackColor = true;
|
||||||
|
this.checkLegacyLoad.CheckedChanged += new System.EventHandler(this.checkLegacyLoad_CheckedChanged);
|
||||||
|
//
|
||||||
|
// checkNotificationTimer
|
||||||
|
//
|
||||||
|
this.checkNotificationTimer.AutoSize = true;
|
||||||
|
this.checkNotificationTimer.Location = new System.Drawing.Point(6, 21);
|
||||||
|
this.checkNotificationTimer.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.checkNotificationTimer.Name = "checkNotificationTimer";
|
||||||
|
this.checkNotificationTimer.Size = new System.Drawing.Size(145, 17);
|
||||||
|
this.checkNotificationTimer.TabIndex = 4;
|
||||||
|
this.checkNotificationTimer.Text = "Display Notification Timer";
|
||||||
|
this.toolTip.SetToolTip(this.checkNotificationTimer, "Shows how much time is left before the current notification disappears.");
|
||||||
|
this.checkNotificationTimer.UseVisualStyleBackColor = true;
|
||||||
|
this.checkNotificationTimer.CheckedChanged += new System.EventHandler(this.checkNotificationTimer_CheckedChanged);
|
||||||
|
//
|
||||||
|
// TabSettingsNotifications
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.groupUserInterface);
|
||||||
|
this.Controls.Add(this.groupNotificationDuration);
|
||||||
|
this.Controls.Add(this.groupNotificationLocation);
|
||||||
|
this.Name = "TabSettingsNotifications";
|
||||||
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged);
|
||||||
|
this.groupNotificationLocation.ResumeLayout(false);
|
||||||
|
this.groupNotificationLocation.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
||||||
|
this.groupNotificationDuration.ResumeLayout(false);
|
||||||
|
this.groupNotificationDuration.PerformLayout();
|
||||||
|
this.tableLayoutDurationButtons.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).EndInit();
|
||||||
|
this.groupUserInterface.ResumeLayout(false);
|
||||||
|
this.groupUserInterface.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.GroupBox groupNotificationLocation;
|
||||||
|
private System.Windows.Forms.Label labelDisplay;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxDisplay;
|
||||||
|
private System.Windows.Forms.Label labelEdgeDistance;
|
||||||
|
private System.Windows.Forms.TrackBar trackBarEdgeDistance;
|
||||||
|
private System.Windows.Forms.RadioButton radioLocCustom;
|
||||||
|
private System.Windows.Forms.RadioButton radioLocBR;
|
||||||
|
private System.Windows.Forms.RadioButton radioLocBL;
|
||||||
|
private System.Windows.Forms.RadioButton radioLocTR;
|
||||||
|
private System.Windows.Forms.RadioButton radioLocTL;
|
||||||
|
private System.Windows.Forms.GroupBox groupNotificationDuration;
|
||||||
|
private System.Windows.Forms.GroupBox groupUserInterface;
|
||||||
|
private System.Windows.Forms.CheckBox checkNotificationTimer;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.Label labelEdgeDistanceValue;
|
||||||
|
private System.Windows.Forms.CheckBox checkLegacyLoad;
|
||||||
|
private System.Windows.Forms.CheckBox checkTimerCountDown;
|
||||||
|
private System.Windows.Forms.Label labelDurationValue;
|
||||||
|
private System.Windows.Forms.TrackBar trackBarDuration;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutDurationButtons;
|
||||||
|
private TweetDck.Core.Controls.FlatButton btnDurationMedium;
|
||||||
|
private TweetDck.Core.Controls.FlatButton btnDurationLong;
|
||||||
|
private TweetDck.Core.Controls.FlatButton btnDurationShort;
|
||||||
|
}
|
||||||
|
}
|
150
Core/Other/Settings/TabSettingsNotifications.cs
Normal file
150
Core/Other/Settings/TabSettingsNotifications.cs
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Handling;
|
||||||
|
using TweetDck.Core.Controls;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class TabSettingsNotifications : BaseTabSettings{
|
||||||
|
private readonly FormNotification notification;
|
||||||
|
|
||||||
|
public TabSettingsNotifications(FormNotification notification){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.notification = notification;
|
||||||
|
this.notification.CanMoveWindow = () => radioLocCustom.Checked;
|
||||||
|
|
||||||
|
this.notification.Move += (sender, args) => {
|
||||||
|
if (radioLocCustom.Checked){
|
||||||
|
Config.CustomNotificationPosition = this.notification.Location;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.notification.Initialized += (sender, args) => {
|
||||||
|
this.InvokeSafe(() => this.notification.ShowNotificationForSettings(true));
|
||||||
|
};
|
||||||
|
|
||||||
|
this.notification.Show(this);
|
||||||
|
|
||||||
|
switch(Config.NotificationPosition){
|
||||||
|
case TweetNotification.Position.TopLeft: radioLocTL.Checked = true; break;
|
||||||
|
case TweetNotification.Position.TopRight: radioLocTR.Checked = true; break;
|
||||||
|
case TweetNotification.Position.BottomLeft: radioLocBL.Checked = true; break;
|
||||||
|
case TweetNotification.Position.BottomRight: radioLocBR.Checked = true; break;
|
||||||
|
case TweetNotification.Position.Custom: radioLocCustom.Checked = true; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
trackBarDuration.SetValueSafe(Config.NotificationDurationValue);
|
||||||
|
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
||||||
|
|
||||||
|
comboBoxDisplay.Items.Add("(Same As "+Program.BrandName+")");
|
||||||
|
|
||||||
|
foreach(Screen screen in Screen.AllScreens){
|
||||||
|
comboBoxDisplay.Items.Add(screen.DeviceName+" ("+screen.Bounds.Width+"x"+screen.Bounds.Height+")");
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1,Config.NotificationDisplay);
|
||||||
|
|
||||||
|
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
||||||
|
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
||||||
|
checkTimerCountDown.Checked = Config.NotificationTimerCountDown;
|
||||||
|
checkLegacyLoad.Checked = Config.NotificationLegacyLoad;
|
||||||
|
|
||||||
|
trackBarEdgeDistance.SetValueSafe(Config.NotificationEdgeDistance);
|
||||||
|
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value.ToString(CultureInfo.InvariantCulture)+" px";
|
||||||
|
|
||||||
|
Disposed += (sender, args) => this.notification.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TabSettingsNotifications_ParentChanged(object sender, EventArgs e){
|
||||||
|
if (Parent == null){
|
||||||
|
notification.HideNotification(false);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
notification.ShowNotificationForSettings(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void radioLoc_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
if (radioLocTL.Checked)Config.NotificationPosition = TweetNotification.Position.TopLeft;
|
||||||
|
else if (radioLocTR.Checked)Config.NotificationPosition = TweetNotification.Position.TopRight;
|
||||||
|
else if (radioLocBL.Checked)Config.NotificationPosition = TweetNotification.Position.BottomLeft;
|
||||||
|
else if (radioLocBR.Checked)Config.NotificationPosition = TweetNotification.Position.BottomRight;
|
||||||
|
else if (radioLocCustom.Checked){
|
||||||
|
if (!Config.IsCustomNotificationPositionSet){
|
||||||
|
Config.CustomNotificationPosition = notification.Location;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.NotificationPosition = TweetNotification.Position.Custom;
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = !radioLocCustom.Checked;
|
||||||
|
notification.ShowNotificationForSettings(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void trackBarDuration_ValueChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.NotificationDurationValue = trackBarDuration.Value;
|
||||||
|
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
||||||
|
|
||||||
|
notification.ShowNotificationForSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDurationShort_Click(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
trackBarDuration.Value = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDurationMedium_Click(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
trackBarDuration.Value = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDurationLong_Click(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
trackBarDuration.Value = 35;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkNotificationTimer_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
||||||
|
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
||||||
|
notification.ShowNotificationForSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkTimerCountDown_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.NotificationTimerCountDown = checkTimerCountDown.Checked;
|
||||||
|
notification.ShowNotificationForSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkLegacyLoad_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.NotificationLegacyLoad = checkLegacyLoad.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxDisplay_SelectedValueChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.NotificationDisplay = comboBoxDisplay.SelectedIndex;
|
||||||
|
notification.ShowNotificationForSettings(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void trackBarEdgeDistance_ValueChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value.ToString(CultureInfo.InvariantCulture)+" px";
|
||||||
|
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
||||||
|
notification.ShowNotificationForSettings(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
90
Core/Other/Settings/TabSettingsUpdates.Designer.cs
generated
Normal file
90
Core/Other/Settings/TabSettingsUpdates.Designer.cs
generated
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
namespace TweetDck.Core.Other.Settings {
|
||||||
|
partial class TabSettingsUpdates {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.btnCheckUpdates = new System.Windows.Forms.Button();
|
||||||
|
this.checkUpdateNotifications = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.groupGeneral = new System.Windows.Forms.GroupBox();
|
||||||
|
this.groupGeneral.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// btnCheckUpdates
|
||||||
|
//
|
||||||
|
this.btnCheckUpdates.Location = new System.Drawing.Point(6, 44);
|
||||||
|
this.btnCheckUpdates.Name = "btnCheckUpdates";
|
||||||
|
this.btnCheckUpdates.Size = new System.Drawing.Size(171, 23);
|
||||||
|
this.btnCheckUpdates.TabIndex = 15;
|
||||||
|
this.btnCheckUpdates.Text = "Check Updates Now";
|
||||||
|
this.toolTip.SetToolTip(this.btnCheckUpdates, "Forces an update check, even for updates that had been dismissed.");
|
||||||
|
this.btnCheckUpdates.UseVisualStyleBackColor = true;
|
||||||
|
this.btnCheckUpdates.Click += new System.EventHandler(this.btnCheckUpdates_Click);
|
||||||
|
//
|
||||||
|
// checkUpdateNotifications
|
||||||
|
//
|
||||||
|
this.checkUpdateNotifications.AutoSize = true;
|
||||||
|
this.checkUpdateNotifications.Location = new System.Drawing.Point(6, 21);
|
||||||
|
this.checkUpdateNotifications.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.checkUpdateNotifications.Name = "checkUpdateNotifications";
|
||||||
|
this.checkUpdateNotifications.Size = new System.Drawing.Size(165, 17);
|
||||||
|
this.checkUpdateNotifications.TabIndex = 14;
|
||||||
|
this.checkUpdateNotifications.Text = "Check Updates Automatically";
|
||||||
|
this.toolTip.SetToolTip(this.checkUpdateNotifications, "Checks for updates every hour.\r\nIf an update is dismissed, it will not appear aga" +
|
||||||
|
"in.");
|
||||||
|
this.checkUpdateNotifications.UseVisualStyleBackColor = true;
|
||||||
|
this.checkUpdateNotifications.CheckedChanged += new System.EventHandler(this.checkUpdateNotifications_CheckedChanged);
|
||||||
|
//
|
||||||
|
// groupGeneral
|
||||||
|
//
|
||||||
|
this.groupGeneral.Controls.Add(this.checkUpdateNotifications);
|
||||||
|
this.groupGeneral.Controls.Add(this.btnCheckUpdates);
|
||||||
|
this.groupGeneral.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.groupGeneral.Name = "groupGeneral";
|
||||||
|
this.groupGeneral.Size = new System.Drawing.Size(183, 75);
|
||||||
|
this.groupGeneral.TabIndex = 16;
|
||||||
|
this.groupGeneral.TabStop = false;
|
||||||
|
this.groupGeneral.Text = "General";
|
||||||
|
//
|
||||||
|
// TabSettingsUpdates
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.groupGeneral);
|
||||||
|
this.Name = "TabSettingsUpdates";
|
||||||
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.groupGeneral.ResumeLayout(false);
|
||||||
|
this.groupGeneral.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Button btnCheckUpdates;
|
||||||
|
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.GroupBox groupGeneral;
|
||||||
|
}
|
||||||
|
}
|
48
Core/Other/Settings/TabSettingsUpdates.cs
Normal file
48
Core/Other/Settings/TabSettingsUpdates.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Updates;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Other.Settings{
|
||||||
|
partial class TabSettingsUpdates : BaseTabSettings{
|
||||||
|
private readonly UpdateHandler updates;
|
||||||
|
private int updateCheckEventId = -1;
|
||||||
|
|
||||||
|
public TabSettingsUpdates(UpdateHandler updates){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.updates = updates;
|
||||||
|
|
||||||
|
this.updates.CheckFinished += updates_CheckFinished;
|
||||||
|
Disposed += (sender, args) => this.updates.CheckFinished -= updates_CheckFinished;
|
||||||
|
|
||||||
|
checkUpdateNotifications.Checked = Config.EnableUpdateCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkUpdateNotifications_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.EnableUpdateCheck = checkUpdateNotifications.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCheckUpdates_Click(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.DismissedUpdate = string.Empty;
|
||||||
|
Config.Save();
|
||||||
|
|
||||||
|
updateCheckEventId = updates.Check(true);
|
||||||
|
|
||||||
|
btnCheckUpdates.Enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){
|
||||||
|
if (e.EventId == updateCheckEventId){
|
||||||
|
btnCheckUpdates.Enabled = true;
|
||||||
|
|
||||||
|
if (!e.UpdateAvailable){
|
||||||
|
MessageBox.Show("Your version of "+Program.BrandName+" is up to date.","No Updates Available",MessageBoxButtons.OK,MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -5,7 +5,7 @@ using System.Windows.Forms;
|
|||||||
namespace TweetDck.Core{
|
namespace TweetDck.Core{
|
||||||
partial class TrayIcon : Component{
|
partial class TrayIcon : Component{
|
||||||
public enum Behavior{ // keep order
|
public enum Behavior{ // keep order
|
||||||
Disabled, DisplayOnly, MinimizeToTray, CloseToTray
|
Disabled, DisplayOnly, MinimizeToTray, CloseToTray, Combined
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler ClickRestore;
|
public event EventHandler ClickRestore;
|
||||||
@@ -75,4 +75,18 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class BehaviorExtensions{
|
||||||
|
public static bool ShouldDisplayIcon(this TrayIcon.Behavior behavior){
|
||||||
|
return behavior != TrayIcon.Behavior.Disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool ShouldHideOnMinimize(this TrayIcon.Behavior behavior){
|
||||||
|
return behavior == TrayIcon.Behavior.MinimizeToTray || behavior == TrayIcon.Behavior.Combined;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool ShouldHideOnClose(this TrayIcon.Behavior behavior){
|
||||||
|
return behavior == TrayIcon.Behavior.CloseToTray || behavior == TrayIcon.Behavior.Combined;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
53
Core/Utils/BrowserCache.cs
Normal file
53
Core/Utils/BrowserCache.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Utils{
|
||||||
|
static class BrowserCache{
|
||||||
|
private static bool ClearOnExit { get; set; }
|
||||||
|
|
||||||
|
private static readonly string IndexFile = Path.Combine(Program.StoragePath,"index");
|
||||||
|
|
||||||
|
private static IEnumerable<string> CacheFiles{
|
||||||
|
get{
|
||||||
|
return Directory.EnumerateFiles(Program.StoragePath).Where(path => {
|
||||||
|
string file = Path.GetFileName(path);
|
||||||
|
return file != null && (file.StartsWith("data_",StringComparison.Ordinal) || file.StartsWith("f_",StringComparison.Ordinal));
|
||||||
|
}).Concat(new[]{ IndexFile });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CalculateCacheSize(Action<long> callbackBytes){
|
||||||
|
Task<long> task = new Task<long>(() => {
|
||||||
|
return CacheFiles.Select(file => {
|
||||||
|
try{
|
||||||
|
return new FileInfo(file).Length;
|
||||||
|
}catch{
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
}).Sum();
|
||||||
|
});
|
||||||
|
|
||||||
|
task.ContinueWith(originalTask => callbackBytes(originalTask.Exception == null ? originalTask.Result : -1L),TaskContinuationOptions.ExecuteSynchronously);
|
||||||
|
task.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetClearOnExit(){
|
||||||
|
ClearOnExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Exit(){
|
||||||
|
if (ClearOnExit){
|
||||||
|
foreach(string file in CacheFiles){
|
||||||
|
try{
|
||||||
|
File.Delete(file);
|
||||||
|
}catch{
|
||||||
|
// welp, too bad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
Core/Utils/CommandLineArgsParser.cs
Normal file
45
Core/Utils/CommandLineArgsParser.cs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Utils{
|
||||||
|
static class CommandLineArgsParser{
|
||||||
|
private static Regex splitRegex;
|
||||||
|
|
||||||
|
private static Regex SplitRegex{
|
||||||
|
get{
|
||||||
|
return splitRegex ?? (splitRegex = new Regex(@"([^=\s]+(?:=(?:""[^""]*?""|[^ ]*))?)",RegexOptions.Compiled));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int AddToDictionary(string args, IDictionary<string,string> dictionary){
|
||||||
|
if (string.IsNullOrWhiteSpace(args)){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
foreach(Match match in SplitRegex.Matches(args)){
|
||||||
|
string matchValue = match.Value;
|
||||||
|
|
||||||
|
int indexEquals = matchValue.IndexOf('=');
|
||||||
|
string key, value;
|
||||||
|
|
||||||
|
if (indexEquals == -1){
|
||||||
|
key = matchValue.TrimStart('-');
|
||||||
|
value = "1";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
key = matchValue.Substring(0,indexEquals).TrimStart('-');
|
||||||
|
value = matchValue.Substring(indexEquals+1).Trim('"');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key != string.Empty){
|
||||||
|
dictionary[key] = value;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
60
Core/Utils/HardwareAcceleration.cs
Normal file
60
Core/Utils/HardwareAcceleration.cs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Utils{
|
||||||
|
static class HardwareAcceleration{
|
||||||
|
private static readonly string LibEGL = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"libEGL.dll");
|
||||||
|
private static readonly string LibGLES = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"libGLESv2.dll");
|
||||||
|
|
||||||
|
private static readonly string DisabledLibEGL = LibEGL+".bak";
|
||||||
|
private static readonly string DisabledLibGLES = LibGLES+".bak";
|
||||||
|
|
||||||
|
public static bool IsEnabled{
|
||||||
|
get{
|
||||||
|
return File.Exists(LibEGL) && File.Exists(LibGLES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CanEnable{
|
||||||
|
get{
|
||||||
|
return File.Exists(DisabledLibEGL) && File.Exists(DisabledLibGLES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool Enable(){
|
||||||
|
if (IsEnabled)return false;
|
||||||
|
|
||||||
|
try{
|
||||||
|
File.Move(DisabledLibEGL,LibEGL);
|
||||||
|
File.Move(DisabledLibGLES,LibGLES);
|
||||||
|
return true;
|
||||||
|
}catch{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool Disable(){
|
||||||
|
if (!IsEnabled)return false;
|
||||||
|
|
||||||
|
try{
|
||||||
|
if (File.Exists(DisabledLibEGL)){
|
||||||
|
File.Delete(DisabledLibEGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(DisabledLibGLES)){
|
||||||
|
File.Delete(DisabledLibGLES);
|
||||||
|
}
|
||||||
|
}catch{
|
||||||
|
// woops
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
File.Move(LibEGL,DisabledLibEGL);
|
||||||
|
File.Move(LibGLES,DisabledLibGLES);
|
||||||
|
return true;
|
||||||
|
}catch{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -4,6 +4,8 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Utils{
|
namespace TweetDck.Core.Utils{
|
||||||
static class NativeMethods{
|
static class NativeMethods{
|
||||||
|
public static readonly IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);
|
||||||
|
|
||||||
public const int HWND_TOPMOST = -1;
|
public const int HWND_TOPMOST = -1;
|
||||||
public const uint SWP_NOACTIVATE = 0x0010;
|
public const uint SWP_NOACTIVATE = 0x0010;
|
||||||
|
|
||||||
@@ -12,12 +14,16 @@ namespace TweetDck.Core.Utils{
|
|||||||
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
|
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
|
||||||
public const int MOUSEEVENTF_RIGHTUP = 0x10;
|
public const int MOUSEEVENTF_RIGHTUP = 0x10;
|
||||||
|
|
||||||
|
public const int SB_HORZ = 0;
|
||||||
|
|
||||||
|
public const int WH_MOUSE_LL = 14;
|
||||||
|
public const int WH_MOUSEWHEEL = 0x020A;
|
||||||
|
|
||||||
public enum MouseButton{
|
public enum MouseButton{
|
||||||
Left, Right
|
Left, Right
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
|
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||||
public static extern IntPtr LoadLibrary(string name);
|
|
||||||
|
|
||||||
[DllImport("Shell32.dll")]
|
[DllImport("Shell32.dll")]
|
||||||
public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
||||||
@@ -28,6 +34,25 @@ namespace TweetDck.Core.Utils{
|
|||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
|
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, IntPtr lParam);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern uint RegisterWindowMessage(string messageName);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern bool UnhookWindowsHookEx(IntPtr idHook);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
|
||||||
|
|
||||||
public static void SetFormPos(Form form, int hWndOrder, uint flags){
|
public static void SetFormPos(Form form, int hWndOrder, uint flags){
|
||||||
SetWindowPos(form.Handle.ToInt32(),hWndOrder,form.Left,form.Top,form.Width,form.Height,flags);
|
SetWindowPos(form.Handle.ToInt32(),hWndOrder,form.Left,form.Top,form.Width,form.Height,flags);
|
||||||
}
|
}
|
||||||
|
30
Core/Utils/WindowState.cs
Normal file
30
Core/Utils/WindowState.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDck.Core.Utils{
|
||||||
|
[Serializable]
|
||||||
|
class WindowState{
|
||||||
|
private Rectangle rect;
|
||||||
|
private bool isMaximized;
|
||||||
|
|
||||||
|
public void Save(Form form){
|
||||||
|
rect = form.WindowState == FormWindowState.Normal ? form.DesktopBounds : form.RestoreBounds;
|
||||||
|
isMaximized = form.WindowState == FormWindowState.Maximized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Restore(Form form, bool firstTimeFullscreen){
|
||||||
|
if (rect != Rectangle.Empty){
|
||||||
|
form.DesktopBounds = rect;
|
||||||
|
form.WindowState = isMaximized ? FormWindowState.Maximized : FormWindowState.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((rect == Rectangle.Empty && firstTimeFullscreen) || !Screen.AllScreens.Any(screen => screen.WorkingArea.IntersectsWith(form.Bounds))){
|
||||||
|
form.DesktopBounds = Screen.PrimaryScreen.WorkingArea;
|
||||||
|
form.WindowState = FormWindowState.Maximized;
|
||||||
|
Save(form);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,6 +1,6 @@
|
|||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other {
|
namespace TweetDck.Migration {
|
||||||
partial class FormBackgroundWork {
|
partial class FormBackgroundWork {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
||||||
@@ -26,17 +26,17 @@ namespace TweetDck.Core.Other {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
this.progressBarUseless = new System.Windows.Forms.ProgressBar();
|
this.progressBarUseless = new System.Windows.Forms.ProgressBar();
|
||||||
this.labelDescription = new TweetDck.Core.Controls.RichTextLabel();
|
this.labelDescription = new System.Windows.Forms.Label();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// progressBarUseless
|
// progressBarUseless
|
||||||
//
|
//
|
||||||
this.progressBarUseless.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
this.progressBarUseless.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.progressBarUseless.Location = new System.Drawing.Point(12, 49);
|
this.progressBarUseless.Location = new System.Drawing.Point(15, 52);
|
||||||
this.progressBarUseless.MarqueeAnimationSpeed = 10;
|
this.progressBarUseless.MarqueeAnimationSpeed = 10;
|
||||||
this.progressBarUseless.Name = "progressBarUseless";
|
this.progressBarUseless.Name = "progressBarUseless";
|
||||||
this.progressBarUseless.Size = new System.Drawing.Size(480, 23);
|
this.progressBarUseless.Size = new System.Drawing.Size(477, 23);
|
||||||
this.progressBarUseless.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
|
this.progressBarUseless.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
|
||||||
this.progressBarUseless.TabIndex = 0;
|
this.progressBarUseless.TabIndex = 0;
|
||||||
//
|
//
|
||||||
@@ -45,21 +45,19 @@ namespace TweetDck.Core.Other {
|
|||||||
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.labelDescription.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
this.labelDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelDescription.Location = new System.Drawing.Point(12, 12);
|
this.labelDescription.Location = new System.Drawing.Point(12, 12);
|
||||||
this.labelDescription.Name = "labelDescription";
|
this.labelDescription.Name = "labelDescription";
|
||||||
this.labelDescription.ReadOnly = true;
|
this.labelDescription.Size = new System.Drawing.Size(480, 37);
|
||||||
this.labelDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None;
|
|
||||||
this.labelDescription.Size = new System.Drawing.Size(480, 31);
|
|
||||||
this.labelDescription.TabIndex = 1;
|
this.labelDescription.TabIndex = 1;
|
||||||
this.labelDescription.TabStop = false;
|
this.labelDescription.Text = "Please, watch this informationless progress bar showcase while some magic happens" +
|
||||||
this.labelDescription.Text = "";
|
" in the background...";
|
||||||
//
|
//
|
||||||
// FormBackgroundWork
|
// FormBackgroundWork
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(504, 84);
|
this.ClientSize = new System.Drawing.Size(504, 87);
|
||||||
this.Controls.Add(this.labelDescription);
|
this.Controls.Add(this.labelDescription);
|
||||||
this.Controls.Add(this.progressBarUseless);
|
this.Controls.Add(this.progressBarUseless);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||||
@@ -74,6 +72,6 @@ namespace TweetDck.Core.Other {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.ProgressBar progressBarUseless;
|
private System.Windows.Forms.ProgressBar progressBarUseless;
|
||||||
private RichTextLabel labelDescription;
|
private System.Windows.Forms.Label labelDescription;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,13 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
|
||||||
|
|
||||||
namespace TweetDck.Core.Other{
|
namespace TweetDck.Migration{
|
||||||
partial class FormBackgroundWork : Form{
|
partial class FormBackgroundWork : Form{
|
||||||
public FormBackgroundWork(){
|
public FormBackgroundWork(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
labelDescription.Rtf = RichTextLabel.Wrap(@"Please, watch this informationless progress bar showcase while some magic happens in the background...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ShowWorkDialog(Action onBegin){
|
public void ShowWorkDialog(Action onBegin){
|
26
Migration/FormMigrationQuestion.Designer.cs
generated
26
Migration/FormMigrationQuestion.Designer.cs
generated
@@ -30,7 +30,7 @@ namespace TweetDck.Migration {
|
|||||||
this.btnAskLater = new System.Windows.Forms.Button();
|
this.btnAskLater = new System.Windows.Forms.Button();
|
||||||
this.btnMigrate = new System.Windows.Forms.Button();
|
this.btnMigrate = new System.Windows.Forms.Button();
|
||||||
this.btnMigrateUninstall = new System.Windows.Forms.Button();
|
this.btnMigrateUninstall = new System.Windows.Forms.Button();
|
||||||
this.labelQuestion = new TweetDck.Core.Controls.RichTextLabel();
|
this.labelQuestion = new System.Windows.Forms.Label();
|
||||||
this.panelButtons.SuspendLayout();
|
this.panelButtons.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
@@ -38,7 +38,7 @@ namespace TweetDck.Migration {
|
|||||||
//
|
//
|
||||||
this.btnIgnore.AutoSize = true;
|
this.btnIgnore.AutoSize = true;
|
||||||
this.btnIgnore.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
this.btnIgnore.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||||
this.btnIgnore.Location = new System.Drawing.Point(353, 0);
|
this.btnIgnore.Location = new System.Drawing.Point(391, 0);
|
||||||
this.btnIgnore.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnIgnore.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
this.btnIgnore.Name = "btnIgnore";
|
this.btnIgnore.Name = "btnIgnore";
|
||||||
this.btnIgnore.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnIgnore.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
@@ -57,16 +57,16 @@ namespace TweetDck.Migration {
|
|||||||
this.panelButtons.Controls.Add(this.btnMigrate);
|
this.panelButtons.Controls.Add(this.btnMigrate);
|
||||||
this.panelButtons.Controls.Add(this.btnMigrateUninstall);
|
this.panelButtons.Controls.Add(this.btnMigrateUninstall);
|
||||||
this.panelButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
|
this.panelButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
|
||||||
this.panelButtons.Location = new System.Drawing.Point(12, 75);
|
this.panelButtons.Location = new System.Drawing.Point(12, 67);
|
||||||
this.panelButtons.Name = "panelButtons";
|
this.panelButtons.Name = "panelButtons";
|
||||||
this.panelButtons.Size = new System.Drawing.Size(480, 23);
|
this.panelButtons.Size = new System.Drawing.Size(518, 23);
|
||||||
this.panelButtons.TabIndex = 0;
|
this.panelButtons.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// btnAskLater
|
// btnAskLater
|
||||||
//
|
//
|
||||||
this.btnAskLater.AutoSize = true;
|
this.btnAskLater.AutoSize = true;
|
||||||
this.btnAskLater.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
this.btnAskLater.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||||
this.btnAskLater.Location = new System.Drawing.Point(412, 0);
|
this.btnAskLater.Location = new System.Drawing.Point(450, 0);
|
||||||
this.btnAskLater.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
|
this.btnAskLater.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
|
||||||
this.btnAskLater.Name = "btnAskLater";
|
this.btnAskLater.Name = "btnAskLater";
|
||||||
this.btnAskLater.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnAskLater.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
@@ -80,7 +80,7 @@ namespace TweetDck.Migration {
|
|||||||
//
|
//
|
||||||
this.btnMigrate.AutoSize = true;
|
this.btnMigrate.AutoSize = true;
|
||||||
this.btnMigrate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
this.btnMigrate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||||
this.btnMigrate.Location = new System.Drawing.Point(289, 0);
|
this.btnMigrate.Location = new System.Drawing.Point(327, 0);
|
||||||
this.btnMigrate.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnMigrate.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
this.btnMigrate.Name = "btnMigrate";
|
this.btnMigrate.Name = "btnMigrate";
|
||||||
this.btnMigrate.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnMigrate.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
@@ -94,7 +94,7 @@ namespace TweetDck.Migration {
|
|||||||
//
|
//
|
||||||
this.btnMigrateUninstall.AutoSize = true;
|
this.btnMigrateUninstall.AutoSize = true;
|
||||||
this.btnMigrateUninstall.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
this.btnMigrateUninstall.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||||
this.btnMigrateUninstall.Location = new System.Drawing.Point(185, 0);
|
this.btnMigrateUninstall.Location = new System.Drawing.Point(223, 0);
|
||||||
this.btnMigrateUninstall.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.btnMigrateUninstall.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.btnMigrateUninstall.Name = "btnMigrateUninstall";
|
this.btnMigrateUninstall.Name = "btnMigrateUninstall";
|
||||||
this.btnMigrateUninstall.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnMigrateUninstall.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
@@ -109,22 +109,18 @@ namespace TweetDck.Migration {
|
|||||||
this.labelQuestion.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.labelQuestion.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.labelQuestion.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
this.labelQuestion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelQuestion.Location = new System.Drawing.Point(49, 9);
|
this.labelQuestion.Location = new System.Drawing.Point(49, 9);
|
||||||
this.labelQuestion.Margin = new System.Windows.Forms.Padding(40, 3, 3, 3);
|
this.labelQuestion.Margin = new System.Windows.Forms.Padding(40, 3, 3, 3);
|
||||||
this.labelQuestion.Name = "labelQuestion";
|
this.labelQuestion.Name = "labelQuestion";
|
||||||
this.labelQuestion.ReadOnly = true;
|
this.labelQuestion.Size = new System.Drawing.Size(481, 52);
|
||||||
this.labelQuestion.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None;
|
|
||||||
this.labelQuestion.Size = new System.Drawing.Size(443, 60);
|
|
||||||
this.labelQuestion.TabIndex = 2;
|
this.labelQuestion.TabIndex = 2;
|
||||||
this.labelQuestion.TabStop = false;
|
|
||||||
this.labelQuestion.Text = "";
|
|
||||||
//
|
//
|
||||||
// FormMigrationQuestion
|
// FormMigrationQuestion
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(504, 110);
|
this.ClientSize = new System.Drawing.Size(542, 102);
|
||||||
this.Controls.Add(this.labelQuestion);
|
this.Controls.Add(this.labelQuestion);
|
||||||
this.Controls.Add(this.panelButtons);
|
this.Controls.Add(this.panelButtons);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||||
@@ -145,7 +141,7 @@ namespace TweetDck.Migration {
|
|||||||
private System.Windows.Forms.Button btnIgnore;
|
private System.Windows.Forms.Button btnIgnore;
|
||||||
private System.Windows.Forms.FlowLayoutPanel panelButtons;
|
private System.Windows.Forms.FlowLayoutPanel panelButtons;
|
||||||
private System.Windows.Forms.Button btnMigrate;
|
private System.Windows.Forms.Button btnMigrate;
|
||||||
private RichTextLabel labelQuestion;
|
private System.Windows.Forms.Label labelQuestion;
|
||||||
private System.Windows.Forms.Button btnAskLater;
|
private System.Windows.Forms.Button btnAskLater;
|
||||||
private System.Windows.Forms.Button btnMigrateUninstall;
|
private System.Windows.Forms.Button btnMigrateUninstall;
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
|
||||||
|
|
||||||
namespace TweetDck.Migration{
|
namespace TweetDck.Migration{
|
||||||
partial class FormMigrationQuestion : Form{
|
partial class FormMigrationQuestion : Form{
|
||||||
@@ -10,7 +9,7 @@ namespace TweetDck.Migration{
|
|||||||
public FormMigrationQuestion(){
|
public FormMigrationQuestion(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
labelQuestion.Rtf = RichTextLabel.Wrap(@"Hey there, I found some TweetDeck data! Do you want to \b Migrate\b0 it and delete the old data folder, \b Ignore\b0 the request forever, or just try "+Program.BrandName+@" first?\par You may also \b Migrate & Purge\b0 which uninstalls TweetDeck too!");
|
labelQuestion.Text = "Hey there, I found some TweetDeck data! Do you want to »Migrate« it and delete the old data folder, »Ignore« the request forever, or try "+Program.BrandName+" out first?\r\nYou may also »Migrate && Purge« which uninstalls TweetDeck too!";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e){
|
protected override void OnPaint(PaintEventArgs e){
|
||||||
|
@@ -1,15 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace TweetDck.Migration.Helpers{
|
|
||||||
static class ProgramProcessSearch{
|
|
||||||
public static Process FindProcessWithWindowByName(string name){
|
|
||||||
try{
|
|
||||||
return Process.GetProcessesByName(name).FirstOrDefault(process => process.MainWindowHandle != IntPtr.Zero);
|
|
||||||
}catch(Exception){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -2,11 +2,11 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using TweetDck.Core.Other;
|
|
||||||
using TweetDck.Migration.Helpers;
|
using TweetDck.Migration.Helpers;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
@@ -83,7 +83,13 @@ namespace TweetDck.Migration{
|
|||||||
|
|
||||||
if (decision == MigrationDecision.Migrate || decision == MigrationDecision.MigratePurge){
|
if (decision == MigrationDecision.Migrate || decision == MigrationDecision.MigratePurge){
|
||||||
// kill process if running
|
// kill process if running
|
||||||
Process runningProcess = ProgramProcessSearch.FindProcessWithWindowByName("TweetDeck");
|
Process runningProcess = null;
|
||||||
|
|
||||||
|
try{
|
||||||
|
runningProcess = Process.GetProcessesByName("TweetDeck").FirstOrDefault(process => process.MainWindowHandle != IntPtr.Zero);
|
||||||
|
}catch(Exception){
|
||||||
|
// process not found
|
||||||
|
}
|
||||||
|
|
||||||
if (runningProcess != null){
|
if (runningProcess != null){
|
||||||
runningProcess.CloseMainWindow();
|
runningProcess.CloseMainWindow();
|
||||||
|
165
Plugins/Controls/PluginControl.Designer.cs
generated
Normal file
165
Plugins/Controls/PluginControl.Designer.cs
generated
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
namespace TweetDck.Plugins.Controls {
|
||||||
|
partial class PluginControl {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.btnToggleState = new System.Windows.Forms.Button();
|
||||||
|
this.labelName = new System.Windows.Forms.Label();
|
||||||
|
this.panelDescription = new System.Windows.Forms.Panel();
|
||||||
|
this.labelDescription = new System.Windows.Forms.Label();
|
||||||
|
this.labelAuthor = new System.Windows.Forms.Label();
|
||||||
|
this.flowLayoutInfo = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.labelWebsite = new System.Windows.Forms.Label();
|
||||||
|
this.labelVersion = new System.Windows.Forms.Label();
|
||||||
|
this.panelDescription.SuspendLayout();
|
||||||
|
this.flowLayoutInfo.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// btnToggleState
|
||||||
|
//
|
||||||
|
this.btnToggleState.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnToggleState.Location = new System.Drawing.Point(449, 80);
|
||||||
|
this.btnToggleState.Name = "btnToggleState";
|
||||||
|
this.btnToggleState.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.btnToggleState.TabIndex = 0;
|
||||||
|
this.btnToggleState.Text = "Disable";
|
||||||
|
this.btnToggleState.UseVisualStyleBackColor = true;
|
||||||
|
this.btnToggleState.Click += new System.EventHandler(this.btnToggleState_Click);
|
||||||
|
//
|
||||||
|
// labelName
|
||||||
|
//
|
||||||
|
this.labelName.AutoSize = true;
|
||||||
|
this.labelName.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelName.Location = new System.Drawing.Point(7, 7);
|
||||||
|
this.labelName.Name = "labelName";
|
||||||
|
this.labelName.Size = new System.Drawing.Size(61, 24);
|
||||||
|
this.labelName.TabIndex = 1;
|
||||||
|
this.labelName.Text = "Name";
|
||||||
|
//
|
||||||
|
// panelDescription
|
||||||
|
//
|
||||||
|
this.panelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.panelDescription.AutoScroll = true;
|
||||||
|
this.panelDescription.Controls.Add(this.labelDescription);
|
||||||
|
this.panelDescription.Location = new System.Drawing.Point(11, 35);
|
||||||
|
this.panelDescription.Name = "panelDescription";
|
||||||
|
this.panelDescription.Size = new System.Drawing.Size(513, 39);
|
||||||
|
this.panelDescription.TabIndex = 2;
|
||||||
|
this.panelDescription.Resize += new System.EventHandler(this.panelDescription_Resize);
|
||||||
|
//
|
||||||
|
// labelDescription
|
||||||
|
//
|
||||||
|
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.labelDescription.AutoSize = true;
|
||||||
|
this.labelDescription.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.labelDescription.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.labelDescription.Name = "labelDescription";
|
||||||
|
this.labelDescription.Size = new System.Drawing.Size(13, 39);
|
||||||
|
this.labelDescription.TabIndex = 3;
|
||||||
|
this.labelDescription.Text = "a\r\nb\r\nc";
|
||||||
|
//
|
||||||
|
// labelAuthor
|
||||||
|
//
|
||||||
|
this.labelAuthor.AutoSize = true;
|
||||||
|
this.labelAuthor.Location = new System.Drawing.Point(3, 0);
|
||||||
|
this.labelAuthor.Margin = new System.Windows.Forms.Padding(3, 0, 32, 0);
|
||||||
|
this.labelAuthor.Name = "labelAuthor";
|
||||||
|
this.labelAuthor.Size = new System.Drawing.Size(38, 13);
|
||||||
|
this.labelAuthor.TabIndex = 3;
|
||||||
|
this.labelAuthor.Text = "Author";
|
||||||
|
//
|
||||||
|
// flowLayoutInfo
|
||||||
|
//
|
||||||
|
this.flowLayoutInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.flowLayoutInfo.Controls.Add(this.labelAuthor);
|
||||||
|
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
|
||||||
|
this.flowLayoutInfo.Location = new System.Drawing.Point(11, 85);
|
||||||
|
this.flowLayoutInfo.Name = "flowLayoutInfo";
|
||||||
|
this.flowLayoutInfo.Size = new System.Drawing.Size(432, 18);
|
||||||
|
this.flowLayoutInfo.TabIndex = 4;
|
||||||
|
this.flowLayoutInfo.WrapContents = false;
|
||||||
|
//
|
||||||
|
// labelWebsite
|
||||||
|
//
|
||||||
|
this.labelWebsite.AutoSize = true;
|
||||||
|
this.labelWebsite.Cursor = System.Windows.Forms.Cursors.Hand;
|
||||||
|
this.labelWebsite.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelWebsite.ForeColor = System.Drawing.Color.Blue;
|
||||||
|
this.labelWebsite.Location = new System.Drawing.Point(76, 0);
|
||||||
|
this.labelWebsite.Name = "labelWebsite";
|
||||||
|
this.labelWebsite.Size = new System.Drawing.Size(46, 13);
|
||||||
|
this.labelWebsite.TabIndex = 5;
|
||||||
|
this.labelWebsite.Text = "Website";
|
||||||
|
this.labelWebsite.Click += new System.EventHandler(this.labelWebsite_Click);
|
||||||
|
//
|
||||||
|
// labelVersion
|
||||||
|
//
|
||||||
|
this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.labelVersion.Location = new System.Drawing.Point(14, 12);
|
||||||
|
this.labelVersion.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
||||||
|
this.labelVersion.Name = "labelVersion";
|
||||||
|
this.labelVersion.Size = new System.Drawing.Size(513, 13);
|
||||||
|
this.labelVersion.TabIndex = 5;
|
||||||
|
this.labelVersion.Text = "Version";
|
||||||
|
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
|
//
|
||||||
|
// PluginControl
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.flowLayoutInfo);
|
||||||
|
this.Controls.Add(this.panelDescription);
|
||||||
|
this.Controls.Add(this.labelName);
|
||||||
|
this.Controls.Add(this.btnToggleState);
|
||||||
|
this.Controls.Add(this.labelVersion);
|
||||||
|
this.MaximumSize = new System.Drawing.Size(65535, 109);
|
||||||
|
this.MinimumSize = new System.Drawing.Size(0, 61);
|
||||||
|
this.Name = "PluginControl";
|
||||||
|
this.Padding = new System.Windows.Forms.Padding(3);
|
||||||
|
this.Size = new System.Drawing.Size(530, 109);
|
||||||
|
this.panelDescription.ResumeLayout(false);
|
||||||
|
this.panelDescription.PerformLayout();
|
||||||
|
this.flowLayoutInfo.ResumeLayout(false);
|
||||||
|
this.flowLayoutInfo.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Button btnToggleState;
|
||||||
|
private System.Windows.Forms.Label labelName;
|
||||||
|
private System.Windows.Forms.Panel panelDescription;
|
||||||
|
private System.Windows.Forms.Label labelDescription;
|
||||||
|
private System.Windows.Forms.Label labelAuthor;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutInfo;
|
||||||
|
private System.Windows.Forms.Label labelWebsite;
|
||||||
|
private System.Windows.Forms.Label labelVersion;
|
||||||
|
}
|
||||||
|
}
|
60
Plugins/Controls/PluginControl.cs
Normal file
60
Plugins/Controls/PluginControl.cs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins.Controls{
|
||||||
|
partial class PluginControl : UserControl{
|
||||||
|
private readonly PluginManager pluginManager;
|
||||||
|
private readonly Plugin plugin;
|
||||||
|
|
||||||
|
public PluginControl(){
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PluginControl(PluginManager pluginManager, Plugin plugin) : this(){
|
||||||
|
this.pluginManager = pluginManager;
|
||||||
|
this.plugin = plugin;
|
||||||
|
|
||||||
|
this.labelName.Text = plugin.Name;
|
||||||
|
this.labelDescription.Text = plugin.CanRun ? plugin.Description : "This plugin requires "+Program.BrandName+" "+plugin.RequiredVersion+" or newer.";
|
||||||
|
this.labelVersion.Text = plugin.Version;
|
||||||
|
this.labelAuthor.Text = plugin.Author;
|
||||||
|
this.labelWebsite.Text = plugin.Website;
|
||||||
|
this.btnToggleState.Text = pluginManager.Config.IsEnabled(plugin) ? "Disable" : "Enable";
|
||||||
|
|
||||||
|
if (!plugin.CanRun){
|
||||||
|
this.labelName.ForeColor = Color.DarkRed;
|
||||||
|
this.btnToggleState.Enabled = false;
|
||||||
|
}
|
||||||
|
else if (labelDescription.Text == string.Empty){
|
||||||
|
labelDescription.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
panelDescription_Resize(panelDescription,new EventArgs());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void panelDescription_Resize(object sender, EventArgs e){
|
||||||
|
if (labelDescription.Text == string.Empty){
|
||||||
|
Height = MinimumSize.Height;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
labelDescription.MaximumSize = new Size(panelDescription.Width-SystemInformation.VerticalScrollBarWidth,0);
|
||||||
|
Height = Math.Min(MinimumSize.Height+9+labelDescription.Height,MaximumSize.Height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void labelWebsite_Click(object sender, EventArgs e){
|
||||||
|
if (labelWebsite.Text.Length > 0){
|
||||||
|
BrowserUtils.OpenExternalBrowser(labelWebsite.Text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnToggleState_Click(object sender, EventArgs e){
|
||||||
|
bool newState = !pluginManager.Config.IsEnabled(plugin);
|
||||||
|
pluginManager.Config.SetEnabled(plugin,newState);
|
||||||
|
|
||||||
|
btnToggleState.Text = newState ? "Disable" : "Enable";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Plugins/Controls/PluginListFlowLayout.Designer.cs
generated
Normal file
3
Plugins/Controls/PluginListFlowLayout.Designer.cs
generated
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
namespace TweetDck.Plugins.Controls{
|
||||||
|
partial class PluginListFlowLayout{}
|
||||||
|
}
|
11
Plugins/Controls/PluginListFlowLayout.cs
Normal file
11
Plugins/Controls/PluginListFlowLayout.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins.Controls{
|
||||||
|
sealed partial class PluginListFlowLayout : FlowLayoutPanel{
|
||||||
|
protected override void WndProc(ref Message m){
|
||||||
|
NativeMethods.ShowScrollBar(Handle,NativeMethods.SB_HORZ,false); // basically fuck the horizontal scrollbar very much
|
||||||
|
base.WndProc(ref m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
Plugins/Events/PluginChangedStateEventArgs.cs
Normal file
13
Plugins/Events/PluginChangedStateEventArgs.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins.Events{
|
||||||
|
class PluginChangedStateEventArgs : EventArgs{
|
||||||
|
public Plugin Plugin { get; private set; }
|
||||||
|
public bool IsEnabled { get; private set; }
|
||||||
|
|
||||||
|
public PluginChangedStateEventArgs(Plugin plugin, bool isEnabled){
|
||||||
|
this.Plugin = plugin;
|
||||||
|
this.IsEnabled = isEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
Plugins/Events/PluginLoadEventArgs.cs
Normal file
18
Plugins/Events/PluginLoadEventArgs.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins.Events{
|
||||||
|
class PluginLoadEventArgs : EventArgs{
|
||||||
|
public bool Success{
|
||||||
|
get{
|
||||||
|
return Errors.Count == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IList<string> Errors;
|
||||||
|
|
||||||
|
public PluginLoadEventArgs(IList<string> errors){
|
||||||
|
this.Errors = errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
171
Plugins/Plugin.cs
Normal file
171
Plugins/Plugin.cs
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
class Plugin{
|
||||||
|
public string Identifier { get { return identifier; } }
|
||||||
|
public string Name { get { return metadata["NAME"]; } }
|
||||||
|
public string Description { get { return metadata["DESCRIPTION"]; } }
|
||||||
|
public string Author { get { return metadata["AUTHOR"]; } }
|
||||||
|
public string Version { get { return metadata["VERSION"]; } }
|
||||||
|
public string Website { get { return metadata["WEBSITE"]; } }
|
||||||
|
public string RequiredVersion { get { return metadata["REQUIRES"]; } }
|
||||||
|
public PluginGroup Group { get; private set; }
|
||||||
|
public PluginEnvironment Environments { get; private set; }
|
||||||
|
|
||||||
|
public bool CanRun{
|
||||||
|
get{
|
||||||
|
return canRun ?? (canRun = CheckRequiredVersion(RequiredVersion)).Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string FolderPath{
|
||||||
|
get{
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string path;
|
||||||
|
private readonly string identifier;
|
||||||
|
private readonly Dictionary<string,string> metadata = new Dictionary<string,string>(4){
|
||||||
|
{ "NAME", "" },
|
||||||
|
{ "DESCRIPTION", "" },
|
||||||
|
{ "AUTHOR", "(anonymous)" },
|
||||||
|
{ "VERSION", "(unknown)" },
|
||||||
|
{ "WEBSITE", "" },
|
||||||
|
{ "REQUIRES", "*" }
|
||||||
|
};
|
||||||
|
|
||||||
|
private bool? canRun;
|
||||||
|
|
||||||
|
private Plugin(string path, PluginGroup group){
|
||||||
|
this.path = path;
|
||||||
|
this.identifier = group.GetIdentifierPrefix()+Path.GetFileName(path);
|
||||||
|
this.Group = group;
|
||||||
|
this.Environments = PluginEnvironment.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetScriptPath(PluginEnvironment environment){
|
||||||
|
if (Environments.HasFlag(environment)){
|
||||||
|
string file = environment.GetScriptFile();
|
||||||
|
return file != null ? Path.Combine(path,file) : string.Empty;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString(){
|
||||||
|
return Identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode(){
|
||||||
|
return identifier.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj){
|
||||||
|
Plugin plugin = obj as Plugin;
|
||||||
|
return plugin != null && plugin.path.Equals(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Plugin CreateFromFolder(string path, PluginGroup group, out string error){
|
||||||
|
Plugin plugin = new Plugin(path,group);
|
||||||
|
|
||||||
|
if (!LoadMetadata(path,plugin,out error)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LoadEnvironments(path,plugin,out error)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = string.Empty;
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool LoadEnvironments(string path, Plugin plugin, out string error){
|
||||||
|
foreach(string file in Directory.EnumerateFiles(path,"*.js",SearchOption.TopDirectoryOnly).Select(Path.GetFileName)){
|
||||||
|
PluginEnvironment environment = PluginEnvironmentExtensions.Values.FirstOrDefault(env => file.Equals(env.GetScriptFile(),StringComparison.Ordinal));
|
||||||
|
|
||||||
|
if (environment != PluginEnvironment.None){
|
||||||
|
plugin.Environments |= environment;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
error = "Unknown script file: "+file;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.Environments == PluginEnvironment.None){
|
||||||
|
error = "Plugin has no script files.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = string.Empty;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly string[] endTag = { "[END]" };
|
||||||
|
|
||||||
|
private static bool LoadMetadata(string path, Plugin plugin, out string error){
|
||||||
|
string metaFile = Path.Combine(path,".meta");
|
||||||
|
|
||||||
|
if (!File.Exists(metaFile)){
|
||||||
|
error = "Missing .meta file.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] lines = File.ReadAllLines(metaFile,Encoding.UTF8);
|
||||||
|
string currentTag = null, currentContents = "";
|
||||||
|
|
||||||
|
foreach(string line in lines.Concat(endTag).Select(line => line.TrimEnd()).Where(line => line.Length > 0)){
|
||||||
|
if (line[0] == '[' && line[line.Length-1] == ']'){
|
||||||
|
if (currentTag != null){
|
||||||
|
plugin.metadata[currentTag] = currentContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentTag = line.Substring(1,line.Length-2).ToUpperInvariant();
|
||||||
|
currentContents = "";
|
||||||
|
|
||||||
|
if (line.Equals(endTag[0])){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!plugin.metadata.ContainsKey(currentTag)){
|
||||||
|
error = "Invalid metadata tag: "+currentTag;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (currentTag != null){
|
||||||
|
currentContents = currentContents.Length == 0 ? line : currentContents+"\r\n"+line;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
error = "Missing metadata tag before value: "+line;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.Name.Length == 0){
|
||||||
|
error = "Plugin is missing a name in the .meta file.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Version ver;
|
||||||
|
|
||||||
|
if (plugin.RequiredVersion.Length == 0 || !(plugin.RequiredVersion.Equals("*") || System.Version.TryParse(plugin.RequiredVersion,out ver))){
|
||||||
|
error = "Plugin contains invalid version: "+plugin.RequiredVersion;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = string.Empty;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool CheckRequiredVersion(string requires){
|
||||||
|
return requires.Equals("*",StringComparison.Ordinal) || Program.Version >= new Version(requires);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
90
Plugins/PluginBridge.cs
Normal file
90
Plugins/PluginBridge.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
class PluginBridge{
|
||||||
|
private readonly PluginManager manager;
|
||||||
|
private readonly Dictionary<string,string> fileCache = new Dictionary<string,string>(2);
|
||||||
|
|
||||||
|
public PluginBridge(PluginManager manager){
|
||||||
|
this.manager = manager;
|
||||||
|
this.manager.Reloaded += manager_Reloaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void manager_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
|
fileCache.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetFullPathIfSafe(int token, string path){
|
||||||
|
Plugin plugin = manager.GetPluginFromToken(token);
|
||||||
|
|
||||||
|
if (plugin == null){
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
string fullPath = Path.Combine(plugin.FolderPath,path);
|
||||||
|
|
||||||
|
try{
|
||||||
|
string folderPathName = new DirectoryInfo(plugin.FolderPath).FullName;
|
||||||
|
DirectoryInfo currentInfo = new DirectoryInfo(fullPath);
|
||||||
|
|
||||||
|
while(currentInfo.Parent != null){
|
||||||
|
if (currentInfo.Parent.FullName == folderPathName){
|
||||||
|
return fullPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentInfo = currentInfo.Parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch{
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteFile(int token, string path, string contents){
|
||||||
|
string fullPath = GetFullPathIfSafe(token,path);
|
||||||
|
|
||||||
|
if (fullPath == string.Empty){
|
||||||
|
throw new Exception("File path has to be relative to the plugin folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReSharper disable once AssignNullToNotNullAttribute
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
|
||||||
|
|
||||||
|
File.WriteAllText(fullPath,contents,Encoding.UTF8);
|
||||||
|
fileCache[fullPath] = contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ReadFile(int token, string path, bool cache){
|
||||||
|
string fullPath = GetFullPathIfSafe(token,path);
|
||||||
|
|
||||||
|
if (fullPath == string.Empty){
|
||||||
|
throw new Exception("File path has to be relative to the plugin folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
string cachedContents;
|
||||||
|
|
||||||
|
if (cache && fileCache.TryGetValue(fullPath,out cachedContents)){
|
||||||
|
return cachedContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileCache[fullPath] = File.ReadAllText(fullPath,Encoding.UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DeleteFile(int token, string path){
|
||||||
|
string fullPath = GetFullPathIfSafe(token,path);
|
||||||
|
|
||||||
|
if (fullPath == string.Empty){
|
||||||
|
throw new Exception("File path has to be relative to the plugin folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fileCache.Remove(fullPath);
|
||||||
|
File.Delete(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
Plugins/PluginConfig.cs
Normal file
37
Plugins/PluginConfig.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
[Serializable]
|
||||||
|
class PluginConfig{
|
||||||
|
[field:NonSerialized]
|
||||||
|
public event EventHandler<PluginChangedStateEventArgs> PluginChangedState;
|
||||||
|
|
||||||
|
public IEnumerable<string> DisabledPlugins{
|
||||||
|
get{
|
||||||
|
return Disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool AnyDisabled{
|
||||||
|
get{
|
||||||
|
return Disabled.Count > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly HashSet<string> Disabled = new HashSet<string>();
|
||||||
|
|
||||||
|
public void SetEnabled(Plugin plugin, bool enabled){
|
||||||
|
if ((enabled && Disabled.Remove(plugin.Identifier)) || (!enabled && Disabled.Add(plugin.Identifier))){
|
||||||
|
if (PluginChangedState != null){
|
||||||
|
PluginChangedState(this,new PluginChangedStateEventArgs(plugin,enabled));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsEnabled(Plugin plugin){
|
||||||
|
return !Disabled.Contains(plugin.Identifier) && plugin.CanRun;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
Plugins/PluginEnvironment.cs
Normal file
36
Plugins/PluginEnvironment.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
[Flags]
|
||||||
|
enum PluginEnvironment{
|
||||||
|
None = 0,
|
||||||
|
Browser = 1,
|
||||||
|
Notification = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
static class PluginEnvironmentExtensions{
|
||||||
|
public static IEnumerable<PluginEnvironment> Values{
|
||||||
|
get{
|
||||||
|
yield return PluginEnvironment.Browser;
|
||||||
|
yield return PluginEnvironment.Notification;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetScriptFile(this PluginEnvironment environment){
|
||||||
|
switch(environment){
|
||||||
|
case PluginEnvironment.Browser: return "browser.js";
|
||||||
|
case PluginEnvironment.Notification: return "notification.js";
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetScriptVariables(this PluginEnvironment environment){
|
||||||
|
switch(environment){
|
||||||
|
case PluginEnvironment.Browser: return "$,$TD,$TDP,TD";
|
||||||
|
case PluginEnvironment.Notification: return "$TD,$TDP";
|
||||||
|
default: return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
Plugins/PluginGroup.cs
Normal file
15
Plugins/PluginGroup.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
namespace TweetDck.Plugins{
|
||||||
|
enum PluginGroup{
|
||||||
|
Official, Custom
|
||||||
|
}
|
||||||
|
|
||||||
|
static class PluginGroupExtensions{
|
||||||
|
public static string GetIdentifierPrefix(this PluginGroup group){
|
||||||
|
switch(group){
|
||||||
|
case PluginGroup.Official: return "official/";
|
||||||
|
case PluginGroup.Custom: return "custom/";
|
||||||
|
default: return "unknown/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
131
Plugins/PluginManager.cs
Normal file
131
Plugins/PluginManager.cs
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using CefSharp;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
using TweetDck.Resources;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
class PluginManager{
|
||||||
|
public const string PluginBrowserScriptFile = "plugins.browser.js";
|
||||||
|
public const string PluginNotificationScriptFile = "plugins.notification.js";
|
||||||
|
|
||||||
|
public string PathOfficialPlugins { get { return Path.Combine(rootPath,"official"); } }
|
||||||
|
public string PathCustomPlugins { get { return Path.Combine(rootPath,"user"); } }
|
||||||
|
|
||||||
|
public IEnumerable<Plugin> Plugins { get { return plugins; } }
|
||||||
|
public PluginConfig Config { get; private set; }
|
||||||
|
public PluginBridge Bridge { get; private set; }
|
||||||
|
|
||||||
|
public event EventHandler<PluginLoadEventArgs> Reloaded;
|
||||||
|
|
||||||
|
private readonly string rootPath;
|
||||||
|
private readonly HashSet<Plugin> plugins = new HashSet<Plugin>();
|
||||||
|
private readonly Dictionary<int,Plugin> tokens = new Dictionary<int,Plugin>();
|
||||||
|
private readonly Random rand = new Random();
|
||||||
|
|
||||||
|
private List<string> loadErrors;
|
||||||
|
|
||||||
|
public PluginManager(string path, PluginConfig config){
|
||||||
|
this.rootPath = path;
|
||||||
|
this.Config = config;
|
||||||
|
this.Bridge = new PluginBridge(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Plugin> GetPluginsByGroup(PluginGroup group){
|
||||||
|
return plugins.Where(plugin => plugin.Group == group);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CountPluginByGroup(PluginGroup group){
|
||||||
|
return plugins.Count(plugin => plugin.Group == group);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasAnyPlugin(PluginEnvironment environment){
|
||||||
|
return plugins.Any(plugin => plugin.Environments.HasFlag(environment));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Plugin GetPluginFromToken(int token){
|
||||||
|
Plugin plugin;
|
||||||
|
return tokens.TryGetValue(token,out plugin) ? plugin : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reload(){
|
||||||
|
HashSet<Plugin> prevPlugins = new HashSet<Plugin>(plugins);
|
||||||
|
plugins.Clear();
|
||||||
|
tokens.Clear();
|
||||||
|
|
||||||
|
loadErrors = new List<string>(2);
|
||||||
|
|
||||||
|
foreach(Plugin plugin in LoadPluginsFrom(PathOfficialPlugins,PluginGroup.Official)){
|
||||||
|
plugins.Add(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(Plugin plugin in LoadPluginsFrom(PathCustomPlugins,PluginGroup.Custom)){
|
||||||
|
plugins.Add(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Reloaded != null && (loadErrors.Count > 0 || !prevPlugins.SetEquals(plugins))){
|
||||||
|
Reloaded(this,new PluginLoadEventArgs(loadErrors));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecutePlugins(IFrame frame, PluginEnvironment environment, bool includeDisabled){
|
||||||
|
if (includeDisabled){
|
||||||
|
ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GenerateConfig(Config),"gen:pluginconfig");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(Plugin plugin in Plugins){
|
||||||
|
string path = plugin.GetScriptPath(environment);
|
||||||
|
if (string.IsNullOrEmpty(path) || !plugin.CanRun || (!includeDisabled && !Config.IsEnabled(plugin)))continue;
|
||||||
|
|
||||||
|
string script;
|
||||||
|
|
||||||
|
try{
|
||||||
|
script = File.ReadAllText(path);
|
||||||
|
}catch{
|
||||||
|
// TODO
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int token;
|
||||||
|
|
||||||
|
if (tokens.ContainsValue(plugin)){
|
||||||
|
token = tokens.First(kvp => kvp.Value.Equals(plugin)).Key;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
token = GenerateToken();
|
||||||
|
tokens[token] = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GeneratePlugin(plugin.Identifier,script,token,environment),"plugin:"+plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<Plugin> LoadPluginsFrom(string path, PluginGroup group){
|
||||||
|
foreach(string fullDir in Directory.EnumerateDirectories(path,"*",SearchOption.TopDirectoryOnly)){
|
||||||
|
string error;
|
||||||
|
Plugin plugin = Plugin.CreateFromFolder(fullDir,group,out error);
|
||||||
|
|
||||||
|
if (plugin == null){
|
||||||
|
loadErrors.Add(group.GetIdentifierPrefix()+Path.GetFileName(fullDir)+": "+error);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
yield return plugin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GenerateToken(){
|
||||||
|
for(int attempt = 0; attempt < 1000; attempt++){
|
||||||
|
int token = rand.Next();
|
||||||
|
|
||||||
|
if (!tokens.ContainsKey(token)){
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -tokens.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
Plugins/PluginScriptGenerator.cs
Normal file
27
Plugins/PluginScriptGenerator.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace TweetDck.Plugins{
|
||||||
|
static class PluginScriptGenerator{
|
||||||
|
public static string GenerateConfig(PluginConfig config){
|
||||||
|
return config.AnyDisabled ? "window.TD_PLUGINS.disabled = [\""+string.Join("\",\"",config.DisabledPlugins)+"\"];" : string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GeneratePlugin(string pluginIdentifier, string pluginContents, int pluginToken, PluginEnvironment environment){
|
||||||
|
StringBuilder build = new StringBuilder(pluginIdentifier.Length+pluginContents.Length+150);
|
||||||
|
|
||||||
|
build.Append("(function(").Append(environment.GetScriptVariables()).Append("){");
|
||||||
|
|
||||||
|
build.Append("let tmp={");
|
||||||
|
build.Append("id:\"").Append(pluginIdentifier).Append("\",");
|
||||||
|
build.Append("obj:new class extends PluginBase{").Append(pluginContents).Append("}");
|
||||||
|
build.Append("};");
|
||||||
|
|
||||||
|
build.Append("tmp.obj.$token=").Append(pluginToken).Append(";");
|
||||||
|
build.Append("window.TD_PLUGINS.install(tmp);");
|
||||||
|
|
||||||
|
build.Append("})(").Append(environment.GetScriptVariables()).Append(");");
|
||||||
|
|
||||||
|
return build.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
115
Program.cs
115
Program.cs
@@ -9,6 +9,11 @@ using TweetDck.Configuration;
|
|||||||
using TweetDck.Core;
|
using TweetDck.Core;
|
||||||
using TweetDck.Migration;
|
using TweetDck.Migration;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
using TweetDck.Plugins.Events;
|
||||||
|
using TweetDck.Core.Other.Settings.Export;
|
||||||
|
|
||||||
[assembly: CLSCompliant(true)]
|
[assembly: CLSCompliant(true)]
|
||||||
namespace TweetDck{
|
namespace TweetDck{
|
||||||
@@ -21,13 +26,22 @@ namespace TweetDck{
|
|||||||
public const string Website = "http://tweetdick.chylex.com";
|
public const string Website = "http://tweetdick.chylex.com";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public const string VersionTag = "1.2.1";
|
public const string BrowserSubprocess = BrandName+".Browser.exe";
|
||||||
public const string VersionFull = "1.2.1.0";
|
|
||||||
|
public const string VersionTag = "1.3.2";
|
||||||
|
public const string VersionFull = "1.3.2.0";
|
||||||
|
|
||||||
|
public static readonly Version Version = new Version(VersionTag);
|
||||||
|
|
||||||
public static readonly string StoragePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),BrandName);
|
public static readonly string StoragePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),BrandName);
|
||||||
|
public static readonly string PluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"plugins");
|
||||||
public static readonly string TemporaryPath = Path.Combine(Path.GetTempPath(),BrandName);
|
public static readonly string TemporaryPath = Path.Combine(Path.GetTempPath(),BrandName);
|
||||||
|
public static readonly string ConfigFilePath = Path.Combine(StoragePath,"TD_UserConfig.cfg");
|
||||||
|
|
||||||
|
public static uint WindowRestoreMessage;
|
||||||
|
|
||||||
private static readonly LockManager LockManager = new LockManager(Path.Combine(StoragePath,".lock"));
|
private static readonly LockManager LockManager = new LockManager(Path.Combine(StoragePath,".lock"));
|
||||||
|
private static bool HasCleanedUp;
|
||||||
|
|
||||||
public static UserConfig UserConfig { get; private set; }
|
public static UserConfig UserConfig { get; private set; }
|
||||||
|
|
||||||
@@ -42,8 +56,31 @@ namespace TweetDck{
|
|||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
|
WindowRestoreMessage = NativeMethods.RegisterWindowMessage("TweetDuckRestore");
|
||||||
|
|
||||||
|
string[] programArguments = Environment.GetCommandLineArgs();
|
||||||
|
|
||||||
|
if (programArguments.Contains("-restart")){
|
||||||
|
for(int attempt = 0; attempt < 21; attempt++){
|
||||||
|
if (LockManager.Lock()){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (attempt == 20){
|
||||||
|
MessageBox.Show(BrandName+" is taking too long to close, please wait and then start the application again manually.",BrandName+" Cannot Restart",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
if (!LockManager.Lock()){
|
if (!LockManager.Lock()){
|
||||||
if (MessageBox.Show("Another instance of "+BrandName+" is already running.\r\nDo you want to close it?",BrandName+" is Already Running",MessageBoxButtons.YesNo,MessageBoxIcon.Error,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
if (LockManager.LockingProcess.MainWindowHandle == IntPtr.Zero && LockManager.LockingProcess.Responding){ // restore if the original process is in tray
|
||||||
|
NativeMethods.SendMessage(NativeMethods.HWND_BROADCAST,WindowRestoreMessage,0,IntPtr.Zero);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (MessageBox.Show("Another instance of "+BrandName+" is already running.\r\nDo you want to close it?",BrandName+" is Already Running",MessageBoxButtons.YesNo,MessageBoxIcon.Error,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
if (!LockManager.CloseLockingProcess(10000)){
|
if (!LockManager.CloseLockingProcess(10000)){
|
||||||
MessageBox.Show("Could not close the other process.",BrandName+" Has Failed :(",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
MessageBox.Show("Could not close the other process.",BrandName+" Has Failed :(",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
||||||
return;
|
return;
|
||||||
@@ -53,8 +90,21 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
else return;
|
else return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UserConfig = UserConfig.Load(Path.Combine(StoragePath,"TD_UserConfig.cfg"));
|
if (programArguments.Contains("-importcookies") && File.Exists(ExportManager.TempCookiesPath)){
|
||||||
|
try{
|
||||||
|
if (File.Exists(ExportManager.CookiesPath)){
|
||||||
|
File.Delete(ExportManager.CookiesPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.Move(ExportManager.TempCookiesPath,ExportManager.CookiesPath);
|
||||||
|
}catch(Exception e){
|
||||||
|
HandleException("Could not import the cookie file to restore login session.",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReloadConfig();
|
||||||
|
|
||||||
MigrationManager.Run();
|
MigrationManager.Run();
|
||||||
|
|
||||||
@@ -65,15 +115,20 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Cef.Initialize(new CefSettings{
|
CefSettings settings = new CefSettings{
|
||||||
AcceptLanguageList = BrowserUtils.HeaderAcceptLanguage,
|
AcceptLanguageList = BrowserUtils.HeaderAcceptLanguage,
|
||||||
UserAgent = BrowserUtils.HeaderUserAgent,
|
UserAgent = BrowserUtils.HeaderUserAgent,
|
||||||
Locale = CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
|
Locale = CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
|
||||||
CachePath = StoragePath,
|
CachePath = StoragePath,
|
||||||
|
BrowserSubprocessPath = File.Exists(BrowserSubprocess) ? BrowserSubprocess : "CefSharp.BrowserSubprocess.exe",
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
LogSeverity = LogSeverity.Disable
|
LogSeverity = programArguments.Contains("-log") ? LogSeverity.Info : LogSeverity.Disable
|
||||||
#endif
|
#endif
|
||||||
});
|
};
|
||||||
|
|
||||||
|
CommandLineArgsParser.AddToDictionary(UserConfig.CustomCefArgs,settings.CefCommandLineArgs);
|
||||||
|
|
||||||
|
Cef.Initialize(settings);
|
||||||
|
|
||||||
AppDomain.CurrentDomain.UnhandledException += (sender, args) => {
|
AppDomain.CurrentDomain.UnhandledException += (sender, args) => {
|
||||||
Exception ex = args.ExceptionObject as Exception;
|
Exception ex = args.ExceptionObject as Exception;
|
||||||
@@ -83,13 +138,14 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Application.ApplicationExit += (sender, args) => {
|
Application.ApplicationExit += (sender, args) => ExitCleanup();
|
||||||
UserConfig.Save();
|
|
||||||
ExitCleanup();
|
|
||||||
Cef.Shutdown();
|
|
||||||
};
|
|
||||||
|
|
||||||
FormBrowser mainForm = new FormBrowser();
|
PluginManager plugins = new PluginManager(PluginPath,UserConfig.Plugins);
|
||||||
|
plugins.Reloaded += plugins_Reloaded;
|
||||||
|
plugins.Config.PluginChangedState += (sender, args) => UserConfig.Save();
|
||||||
|
plugins.Reload();
|
||||||
|
|
||||||
|
FormBrowser mainForm = new FormBrowser(plugins);
|
||||||
Application.Run(mainForm);
|
Application.Run(mainForm);
|
||||||
|
|
||||||
if (mainForm.UpdateInstallerPath != null){
|
if (mainForm.UpdateInstallerPath != null){
|
||||||
@@ -100,6 +156,12 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
|
if (!e.Success){
|
||||||
|
MessageBox.Show("The following plugins will not be available until the issues are resolved:\n"+string.Join("\n",e.Errors),"Error Loading Plugins",MessageBoxButtons.OK,MessageBoxIcon.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void HandleException(string message, Exception e){
|
public static void HandleException(string message, Exception e){
|
||||||
Log(e.ToString());
|
Log(e.ToString());
|
||||||
|
|
||||||
@@ -125,9 +187,28 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ExitCleanup(){
|
public static void ReloadConfig(){
|
||||||
|
UserConfig = UserConfig.Load(ConfigFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ResetConfig(){
|
||||||
|
try{
|
||||||
|
File.Delete(ConfigFilePath);
|
||||||
|
File.Delete(UserConfig.GetBackupFile(ConfigFilePath));
|
||||||
|
}catch(Exception e){
|
||||||
|
HandleException("Could not delete configuration files to reset the settings.",e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReloadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ExitCleanup(){
|
||||||
|
if (HasCleanedUp)return;
|
||||||
|
|
||||||
|
UserConfig.Save();
|
||||||
|
|
||||||
try{
|
try{
|
||||||
LockManager.Unlock();
|
|
||||||
Directory.Delete(TemporaryPath,true);
|
Directory.Delete(TemporaryPath,true);
|
||||||
}catch(DirectoryNotFoundException){
|
}catch(DirectoryNotFoundException){
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
@@ -136,6 +217,10 @@ namespace TweetDck{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Cef.Shutdown();
|
Cef.Shutdown();
|
||||||
|
BrowserCache.Exit();
|
||||||
|
|
||||||
|
LockManager.Unlock();
|
||||||
|
HasCleanedUp = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
Resources/Plugins/design-revert/.meta
Normal file
15
Resources/Plugins/design-revert/.meta
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
[name]
|
||||||
|
Revert TweetDeck design changes
|
||||||
|
|
||||||
|
[description]
|
||||||
|
- Moves action menu to the right and hides it by default
|
||||||
|
- Reverts interactive texts around tweets (such as 'Details' or 'Conversation')
|
||||||
|
|
||||||
|
[author]
|
||||||
|
chylex
|
||||||
|
|
||||||
|
[version]
|
||||||
|
1.0
|
||||||
|
|
||||||
|
[website]
|
||||||
|
http://tweetduck.chylex.com
|
37
Resources/Plugins/design-revert/browser.js
Normal file
37
Resources/Plugins/design-revert/browser.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
enabled(){
|
||||||
|
// add a stylesheet to change tweet actions
|
||||||
|
var style = document.createElement("style");
|
||||||
|
style.id = "design-revert";
|
||||||
|
document.head.appendChild(style);
|
||||||
|
|
||||||
|
var sheet = style.sheet;
|
||||||
|
sheet.insertRule(".tweet-actions { float: right !important; width: auto !important; }",0);
|
||||||
|
sheet.insertRule(".tweet-action { opacity: 0; }",0);
|
||||||
|
sheet.insertRule(".is-favorite .tweet-action, .is-retweet .tweet-action { opacity: 0.5; visibility: visible !important; }",0);
|
||||||
|
sheet.insertRule(".tweet:hover .tweet-action, .is-favorite .tweet-action[rel='favorite'], .is-retweet .tweet-action[rel='retweet'] { opacity: 1; visibility: visible !important; }",0);
|
||||||
|
sheet.insertRule(".tweet-actions > li:nth-child(4) { margin-right: 2px !important; }",0);
|
||||||
|
|
||||||
|
// revert small links around the tweet
|
||||||
|
this.prevFooterMustache = TD.mustaches["status/tweet_single_footer.mustache"];
|
||||||
|
|
||||||
|
var footerLayout = TD.mustaches["status/tweet_single_footer.mustache"];
|
||||||
|
footerLayout = footerLayout.replace('txt-mute txt-size--12','txt-mute txt-small');
|
||||||
|
footerLayout = footerLayout.replace('{{#inReplyToID}}','{{^inReplyToID}} <a class="pull-left margin-txs txt-mute txt-small is-vishidden-narrow" href="#" rel="viewDetails">{{_i}}Details{{/i}}</a> <a class="pull-left margin-txs txt-mute txt-small is-vishidden is-visshown-narrow" href="#" rel="viewDetails">{{_i}}Open{{/i}}</a> {{/inReplyToID}} {{#inReplyToID}}');
|
||||||
|
footerLayout = footerLayout.replace('<span class="link-complex-target"> {{_i}}View Conversation{{/i}}','<i class="icon icon-conversation icon-small-context"></i> <span class="link-complex-target"> <span class="is-vishidden-wide is-vishidden-narrow">{{_i}}View{{/i}}</span> <span class="is-vishidden is-visshown-wide">{{_i}}Conversation{{/i}}</span>');
|
||||||
|
TD.mustaches["status/tweet_single_footer.mustache"] = footerLayout;
|
||||||
|
|
||||||
|
// fix layout for right-aligned actions menu
|
||||||
|
this.uiShowActionsMenuEvent = function(){
|
||||||
|
$(".js-dropdown.pos-r").toggleClass("pos-r pos-l");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ready(){
|
||||||
|
$(document).on("uiShowActionsMenu",this.uiShowActionsMenuEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
disabled(){
|
||||||
|
$("#design-revert").remove();
|
||||||
|
$(document).off("uiShowActionsMenu",this.uiShowActionsMenuEvent);
|
||||||
|
TD.mustaches["status/tweet_single_footer.mustache"] = this.prevFooterMustache;
|
||||||
|
}
|
@@ -1,12 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Linq;
|
using CefSharp;
|
||||||
|
using CefSharp.WinForms;
|
||||||
|
|
||||||
namespace TweetDck.Resources{
|
namespace TweetDck.Resources{
|
||||||
static class ScriptLoader{
|
static class ScriptLoader{
|
||||||
|
private const string UrlPrefix = "td:";
|
||||||
|
|
||||||
public static string LoadResource(string name){
|
public static string LoadResource(string name){
|
||||||
try{
|
try{
|
||||||
return File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,name),Encoding.UTF8);
|
return File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,name),Encoding.UTF8);
|
||||||
@@ -16,8 +18,30 @@ namespace TweetDck.Resources{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IList<string> LoadResources(params string[] names){
|
public static void ExecuteFile(ChromiumWebBrowser browser, string file){
|
||||||
return names.Select(LoadResource).ToList();
|
ExecuteScript(browser,LoadResource(file),GetRootIdentifier(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ExecuteFile(IFrame frame, string file){
|
||||||
|
ExecuteScript(frame,LoadResource(file),GetRootIdentifier(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ExecuteScript(ChromiumWebBrowser browser, string script, string identifier){
|
||||||
|
if (script == null)return;
|
||||||
|
|
||||||
|
using(IFrame frame = browser.GetMainFrame()){
|
||||||
|
frame.ExecuteJavaScriptAsync(script,UrlPrefix+identifier,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ExecuteScript(IFrame frame, string script, string identifier){
|
||||||
|
if (script == null)return;
|
||||||
|
|
||||||
|
frame.ExecuteJavaScriptAsync(script,UrlPrefix+identifier,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetRootIdentifier(string file){
|
||||||
|
return "root:"+Path.GetFileNameWithoutExtension(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,4 @@
|
|||||||
(function($,$TD,TD){
|
(function($,$TD,TD){
|
||||||
//
|
|
||||||
// Variable: Says whether TweetD*ck events was initialized.
|
|
||||||
//
|
|
||||||
var isInitialized = false;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Variable: Current highlighted column jQuery object.
|
// Variable: Current highlighted column jQuery object.
|
||||||
//
|
//
|
||||||
@@ -24,15 +19,26 @@
|
|||||||
var menu = $(".js-dropdown-content").children("ul").first();
|
var menu = $(".js-dropdown-content").children("ul").first();
|
||||||
if (menu.length === 0)return;
|
if (menu.length === 0)return;
|
||||||
|
|
||||||
menu.children(".drp-h-divider").last().after('<li class="is-selectable" data-std><a href="#" data-action>'+$TD.brandName+' settings</a></li><li class="drp-h-divider"></li>');
|
menu.children(".drp-h-divider").last().after([
|
||||||
|
'<li class="is-selectable" data-std><a href="#" data-action="td-settings">'+$TD.brandName+' settings</a></li>',
|
||||||
|
'<li class="is-selectable" data-std><a href="#" data-action="td-plugins">'+$TD.brandName+' plugins</a></li>',
|
||||||
|
'<li class="drp-h-divider"></li>'
|
||||||
|
].join(""));
|
||||||
|
|
||||||
var tweetDckBtn = menu.children("[data-std]").first();
|
var buttons = menu.children("[data-std]");
|
||||||
|
|
||||||
tweetDckBtn.on("click","a",function(){
|
buttons.on("click","a",function(){
|
||||||
|
var action = $(this).attr("data-action");
|
||||||
|
|
||||||
|
if (action === "td-settings"){
|
||||||
$TD.openSettingsMenu();
|
$TD.openSettingsMenu();
|
||||||
|
}
|
||||||
|
else if (action === "td-plugins"){
|
||||||
|
$TD.openPluginsMenu();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
tweetDckBtn.hover(function(){
|
buttons.hover(function(){
|
||||||
$(this).addClass("is-selected");
|
$(this).addClass("is-selected");
|
||||||
},function(){
|
},function(){
|
||||||
$(this).removeClass("is-selected");
|
$(this).removeClass("is-selected");
|
||||||
@@ -40,11 +46,6 @@
|
|||||||
},0);
|
},0);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Fix layout for right-aligned actions menu
|
|
||||||
$(document).on("uiShowActionsMenu",function(){
|
|
||||||
$(".js-dropdown.pos-r").toggleClass("pos-r pos-l");
|
|
||||||
});
|
|
||||||
|
|
||||||
// Notification handling
|
// Notification handling
|
||||||
$.subscribe("/notifications/new",function(obj){
|
$.subscribe("/notifications/new",function(obj){
|
||||||
for(let index = obj.items.length-1; index >= 0; index--){
|
for(let index = obj.items.length-1; index >= 0; index--){
|
||||||
@@ -52,11 +53,27 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Finish init
|
// Setup video element replacement and fix missing target in user links
|
||||||
|
new MutationObserver(function(){
|
||||||
|
$("video").each(function(){
|
||||||
|
$(this).parent().replaceWith("<a href='"+$(this).attr("src")+"' rel='url' target='_blank' style='display:block; border:1px solid #555; padding:3px 6px'>► Open video in browser</a>");
|
||||||
|
});
|
||||||
|
|
||||||
|
$("a[rel='user']").attr("target","_blank");
|
||||||
|
}).observe($(".js-app-columns")[0],{
|
||||||
|
childList: true,
|
||||||
|
subtree: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Finish init and load plugins
|
||||||
$TD.loadFontSizeClass(TD.settings.getFontSize());
|
$TD.loadFontSizeClass(TD.settings.getFontSize());
|
||||||
$TD.loadNotificationHeadContents(getNotificationHeadContents());
|
$TD.loadNotificationHeadContents(getNotificationHeadContents());
|
||||||
|
|
||||||
isInitialized = true;
|
window.TD_APP_READY = true;
|
||||||
|
|
||||||
|
if (window.TD_PLUGINS){
|
||||||
|
window.TD_PLUGINS.onReady();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -121,10 +138,10 @@
|
|||||||
var app = $("body").children(".js-app");
|
var app = $("body").children(".js-app");
|
||||||
|
|
||||||
new MutationObserver(function(){
|
new MutationObserver(function(){
|
||||||
if (isInitialized && app.hasClass("is-hidden")){
|
if (window.TD_APP_READY && app.hasClass("is-hidden")){
|
||||||
isInitialized = false;
|
window.TD_APP_READY = false;
|
||||||
}
|
}
|
||||||
else if (!isInitialized && !app.hasClass("is-hidden")){
|
else if (!window.TD_APP_READY && !app.hasClass("is-hidden")){
|
||||||
initializeTweetDck();
|
initializeTweetDck();
|
||||||
}
|
}
|
||||||
}).observe(app[0],{
|
}).observe(app[0],{
|
||||||
@@ -156,51 +173,6 @@
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// Block: Hook into links to bypass default open function.
|
|
||||||
//
|
|
||||||
(function(){
|
|
||||||
var urlWait = false;
|
|
||||||
|
|
||||||
var onUrlOpened = function(){
|
|
||||||
urlWait = true;
|
|
||||||
setTimeout(function(){ urlWait = false; },0);
|
|
||||||
};
|
|
||||||
|
|
||||||
$(document.body).delegate("a[target='_blank']","click",function(e){
|
|
||||||
if (urlWait)return;
|
|
||||||
|
|
||||||
var me = $(this);
|
|
||||||
var rel = me.attr("rel");
|
|
||||||
|
|
||||||
if (!me.is(".link-complex") && !(rel === "mediaPreview" && me.closest("#open-modal").length === 0) && rel !== "list" && rel !== "user"){
|
|
||||||
$TD.openBrowser(me.attr("href"));
|
|
||||||
onUrlOpened();
|
|
||||||
}
|
|
||||||
|
|
||||||
e.preventDefault();
|
|
||||||
});
|
|
||||||
|
|
||||||
window.open = function(url){
|
|
||||||
if (urlWait)return;
|
|
||||||
|
|
||||||
$TD.openBrowser(url);
|
|
||||||
onUrlOpened();
|
|
||||||
};
|
|
||||||
|
|
||||||
TD.util.maybeOpenClickExternally = prependToFunction(TD.util.maybeOpenClickExternally,function(e){
|
|
||||||
if (e.ctrlKey){
|
|
||||||
if (urlWait)return;
|
|
||||||
|
|
||||||
$TD.openBrowser(e.currentTarget.getAttribute("href"));
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
e.stopImmediatePropagation();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block: Expand shortened links on hover or display tooltip.
|
// Block: Expand shortened links on hover or display tooltip.
|
||||||
//
|
//
|
||||||
@@ -223,6 +195,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($TD.expandLinksOnHover){
|
if ($TD.expandLinksOnHover){
|
||||||
|
tooltipTimer = window.setTimeout(function(){
|
||||||
var expanded = me.attr("data-full-url");
|
var expanded = me.attr("data-full-url");
|
||||||
expanded = cutStart(expanded,"https://");
|
expanded = cutStart(expanded,"https://");
|
||||||
expanded = cutStart(expanded,"http://");
|
expanded = cutStart(expanded,"http://");
|
||||||
@@ -230,6 +203,7 @@
|
|||||||
|
|
||||||
me.attr("td-prev-text",text);
|
me.attr("td-prev-text",text);
|
||||||
me.text(expanded);
|
me.text(expanded);
|
||||||
|
},200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tooltipTimer = window.setTimeout(function(){
|
tooltipTimer = window.setTimeout(function(){
|
||||||
@@ -247,14 +221,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tooltipDisplayed){
|
|
||||||
window.clearTimeout(tooltipTimer);
|
window.clearTimeout(tooltipTimer);
|
||||||
|
|
||||||
|
if (tooltipDisplayed){
|
||||||
tooltipDisplayed = false;
|
tooltipDisplayed = false;
|
||||||
$TD.displayTooltip(null,false);
|
$TD.displayTooltip(null,false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (e.type === "mousemove"){
|
else if (e.type === "mousemove"){
|
||||||
if (tooltipDisplayed && (prevMouseX != e.clientX || prevMouseY != e.clientY)){
|
if (tooltipDisplayed && (prevMouseX !== e.clientX || prevMouseY !== e.clientY)){
|
||||||
$TD.displayTooltip(me.attr("data-full-url"),false);
|
$TD.displayTooltip(me.attr("data-full-url"),false);
|
||||||
prevMouseX = e.clientX;
|
prevMouseX = e.clientX;
|
||||||
prevMouseY = e.clientY;
|
prevMouseY = e.clientY;
|
||||||
@@ -286,19 +261,7 @@
|
|||||||
};*/
|
};*/
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block: Hook into mp4 video element clicking.
|
// Block: Update highlighted column.
|
||||||
//
|
|
||||||
$(document.body).delegate("video.js-media-gif","click",function(e){
|
|
||||||
var src = $(this).attr("src");
|
|
||||||
|
|
||||||
if (src.endsWith(".mp4")){
|
|
||||||
$TD.openBrowser(src);
|
|
||||||
e.preventDefault();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//
|
|
||||||
// Block: Update highlighted column
|
|
||||||
//
|
//
|
||||||
app.delegate("section","mouseenter mouseleave",function(e){
|
app.delegate("section","mouseenter mouseleave",function(e){
|
||||||
if (e.type === "mouseenter"){
|
if (e.type === "mouseenter"){
|
||||||
@@ -315,9 +278,9 @@
|
|||||||
(function(){
|
(function(){
|
||||||
var lastTweet = "";
|
var lastTweet = "";
|
||||||
|
|
||||||
var updateHighlightedTweet = function(link){
|
var updateHighlightedTweet = function(link, embeddedLink){
|
||||||
if (lastTweet != link){
|
if (lastTweet !== link){
|
||||||
$TD.setLastHighlightedTweet(link);
|
$TD.setLastHighlightedTweet(link,embeddedLink);
|
||||||
lastTweet = link;
|
lastTweet = link;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -327,11 +290,13 @@
|
|||||||
highlightedTweetEle = $(this);
|
highlightedTweetEle = $(this);
|
||||||
|
|
||||||
var link = $(this).find("time").first().children("a").first();
|
var link = $(this).find("time").first().children("a").first();
|
||||||
updateHighlightedTweet(link.length > 0 ? link.attr("href") : "");
|
var embedded = $(this).find(".quoted-tweet[data-tweet-id]").first();
|
||||||
|
|
||||||
|
updateHighlightedTweet(link.length > 0 ? link.attr("href") : "",embedded.length > 0 ? embedded.find(".account-link").first().attr("href")+"/status/"+embedded.attr("data-tweet-id") : "");
|
||||||
}
|
}
|
||||||
else if (e.type === "mouseleave"){
|
else if (e.type === "mouseleave"){
|
||||||
highlightedTweetEle = null;
|
highlightedTweetEle = null;
|
||||||
updateHighlightedTweet("");
|
updateHighlightedTweet("","");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
@@ -360,7 +325,7 @@
|
|||||||
$TD.clickUploadImage(Math.floor(buttonPos.left),Math.floor(buttonPos.top));
|
$TD.clickUploadImage(Math.floor(buttonPos.left),Math.floor(buttonPos.top));
|
||||||
};
|
};
|
||||||
|
|
||||||
$(".js-app").delegate(".js-compose-text","paste",function(){
|
$(".js-app").delegate(".js-compose-text,.js-reply-tweetbox","paste",function(){
|
||||||
lastPasteElement = $(this);
|
lastPasteElement = $(this);
|
||||||
$TD.tryPasteImage();
|
$TD.tryPasteImage();
|
||||||
});
|
});
|
||||||
@@ -370,7 +335,7 @@
|
|||||||
var parent = lastPasteElement.parent();
|
var parent = lastPasteElement.parent();
|
||||||
|
|
||||||
if (parent.siblings(".js-add-image-button").length === 0){
|
if (parent.siblings(".js-add-image-button").length === 0){
|
||||||
var pop = parent.closest(".js-inline-reply").find(".js-inline-compose-pop");
|
var pop = parent.closest(".js-inline-reply,.rpl").find(".js-inline-compose-pop,.js-reply-popout");
|
||||||
|
|
||||||
if (pop.length === 0){
|
if (pop.length === 0){
|
||||||
lastPasteElement = null;
|
lastPasteElement = null;
|
||||||
@@ -409,13 +374,18 @@
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block: Support for extra mouse buttons
|
// Block: Support for extra mouse buttons.
|
||||||
//
|
//
|
||||||
window.TDGF_onMouseClickExtra = function(button){
|
window.TDGF_onMouseClickExtra = function(button){
|
||||||
if (button === 1){ // back button
|
if (button === 1){ // back button
|
||||||
|
var modal = $("#open-modal");
|
||||||
|
|
||||||
if (highlightedColumnEle && highlightedColumnEle.closest(".js-column").is(".is-shifted-1")){
|
if (highlightedColumnEle && highlightedColumnEle.closest(".js-column").is(".is-shifted-1")){
|
||||||
highlightedColumnEle.find(".js-column-back").first().click();
|
highlightedColumnEle.find(".js-column-back").first().click();
|
||||||
}
|
}
|
||||||
|
else if (modal.is(":visible")){
|
||||||
|
modal.find("a[rel=dismiss]").click();
|
||||||
|
}
|
||||||
else{
|
else{
|
||||||
$(".js-column-back").click();
|
$(".js-column-back").click();
|
||||||
}
|
}
|
||||||
@@ -431,23 +401,17 @@
|
|||||||
// Block: Inject custom CSS and layout into the page.
|
// Block: Inject custom CSS and layout into the page.
|
||||||
//
|
//
|
||||||
(function(){
|
(function(){
|
||||||
var style = document.createElement("style");
|
var styleOfficial = document.createElement("style");
|
||||||
document.head.appendChild(style);
|
document.head.appendChild(styleOfficial);
|
||||||
var sheet = style.sheet;
|
|
||||||
|
|
||||||
// change View Conversation
|
styleOfficial.sheet.insertRule("a[data-full-url] { word-break: break-all; }",0); // break long urls
|
||||||
var footerLayout = TD.mustaches["status/tweet_single_footer.mustache"];
|
styleOfficial.sheet.insertRule(".column-nav-link .attribution { position: absolute; }",0); // fix cut off account names
|
||||||
footerLayout = footerLayout.replace('txt-mute txt-size--12','txt-mute txt-small');
|
styleOfficial.sheet.insertRule(".txt-base-smallest .badge-verified:before { height: 13px !important; }",0); // fix cut off badge icon
|
||||||
footerLayout = footerLayout.replace('{{#inReplyToID}}','{{^inReplyToID}} <a class="pull-left margin-txs txt-mute txt-small is-vishidden-narrow" href="#" rel="viewDetails">{{_i}}Details{{/i}}</a> <a class="pull-left margin-txs txt-mute txt-small is-vishidden is-visshown-narrow" href="#" rel="viewDetails">{{_i}}Open{{/i}}</a> {{/inReplyToID}} {{#inReplyToID}}');
|
|
||||||
footerLayout = footerLayout.replace('<span class="link-complex-target"> {{_i}}View Conversation{{/i}}','<i class="icon icon-conversation icon-small-context"></i> <span class="link-complex-target"> <span class="is-vishidden-wide is-vishidden-narrow">{{_i}}View{{/i}}</span> <span class="is-vishidden is-visshown-wide">{{_i}}Conversation{{/i}}</span>');
|
|
||||||
TD.mustaches["status/tweet_single_footer.mustache"] = footerLayout;
|
|
||||||
|
|
||||||
// tweet actions
|
if ($TD.hasCustomBrowserCSS){
|
||||||
sheet.insertRule(".tweet-actions { float: right !important; width: auto !important; visibility: hidden; }",0);
|
var styleCustom = document.createElement("style");
|
||||||
sheet.insertRule(".tweet-actions:hover { visibility: visible; }",0);
|
styleCustom.innerHTML = $TD.customBrowserCSS;
|
||||||
sheet.insertRule(".tweet-actions > li:nth-child(4) { margin-right: 2px !important; }",0);
|
document.head.appendChild(styleCustom);
|
||||||
|
}
|
||||||
// break long urls
|
|
||||||
sheet.insertRule("a[data-full-url] { word-break: break-all; }",0);
|
|
||||||
})();
|
})();
|
||||||
})($,$TD,TD);
|
})($,$TD,TD);
|
@@ -40,23 +40,27 @@
|
|||||||
var tooltipTimer, tooltipDisplayed;
|
var tooltipTimer, tooltipDisplayed;
|
||||||
|
|
||||||
addEventListener(links,"mouseenter",function(e){
|
addEventListener(links,"mouseenter",function(e){
|
||||||
var url = e.currentTarget.getAttribute("data-full-url");
|
var me = e.currentTarget;
|
||||||
|
|
||||||
|
var url = me.getAttribute("data-full-url");
|
||||||
if (!url)return;
|
if (!url)return;
|
||||||
|
|
||||||
var text = e.currentTarget.textContent;
|
var text = me.textContent;
|
||||||
|
|
||||||
if (text.charCodeAt(text.length-1) !== 8230){ // horizontal ellipsis
|
if (text.charCodeAt(text.length-1) !== 8230){ // horizontal ellipsis
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($TD.expandLinksOnHover){
|
if ($TD.expandLinksOnHover){
|
||||||
|
tooltipTimer = window.setTimeout(function(){
|
||||||
var expanded = url;
|
var expanded = url;
|
||||||
expanded = cutStart(expanded,"https://");
|
expanded = cutStart(expanded,"https://");
|
||||||
expanded = cutStart(expanded,"http://");
|
expanded = cutStart(expanded,"http://");
|
||||||
expanded = cutStart(expanded,"www.");
|
expanded = cutStart(expanded,"www.");
|
||||||
|
|
||||||
e.currentTarget.setAttribute("td-prev-text",text);
|
me.setAttribute("td-prev-text",text);
|
||||||
e.currentTarget.innerHTML = expanded;
|
me.innerHTML = expanded;
|
||||||
|
},200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tooltipTimer = window.setTimeout(function(){
|
tooltipTimer = window.setTimeout(function(){
|
||||||
@@ -77,15 +81,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tooltipDisplayed){
|
|
||||||
window.clearTimeout(tooltipTimer);
|
window.clearTimeout(tooltipTimer);
|
||||||
|
|
||||||
|
if (tooltipDisplayed){
|
||||||
tooltipDisplayed = false;
|
tooltipDisplayed = false;
|
||||||
$TD.displayTooltip(null,true);
|
$TD.displayTooltip(null,true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addEventListener(links,"mousemove",function(e){
|
addEventListener(links,"mousemove",function(e){
|
||||||
if (tooltipDisplayed && (prevMouseX != e.clientX || prevMouseY != e.clientY)){
|
if (tooltipDisplayed && (prevMouseX !== e.clientX || prevMouseY !== e.clientY)){
|
||||||
var url = e.currentTarget.getAttribute("data-full-url");
|
var url = e.currentTarget.getAttribute("data-full-url");
|
||||||
if (!url)return;
|
if (!url)return;
|
||||||
|
|
||||||
@@ -95,4 +100,25 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Block: Setup embedded tweet address for context menu.
|
||||||
|
//
|
||||||
|
(function(){
|
||||||
|
var embedded = document.getElementsByClassName("quoted-tweet");
|
||||||
|
if (embedded.length === 0)return;
|
||||||
|
|
||||||
|
var tweetId = embedded[0].getAttribute("data-tweet-id");
|
||||||
|
if (!tweetId)return;
|
||||||
|
|
||||||
|
var account = embedded[0].getElementsByClassName("account-link");
|
||||||
|
if (account.length === 0)return;
|
||||||
|
|
||||||
|
$TD.setNotificationTweetEmbedded(account[0].getAttribute("href")+"/status/"+tweetId);
|
||||||
|
})();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Block: Page fully loaded.
|
||||||
|
//
|
||||||
|
$TD.onNotificationReady();
|
||||||
})($TD);
|
})($TD);
|
80
Resources/Scripts/plugins.browser.js
Normal file
80
Resources/Scripts/plugins.browser.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
(function(){
|
||||||
|
//
|
||||||
|
// Class: Abstract plugin base class.
|
||||||
|
//
|
||||||
|
window.PluginBase = class{
|
||||||
|
constructor(pluginSettings){
|
||||||
|
this.$pluginSettings = pluginSettings || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled(){}
|
||||||
|
ready(){}
|
||||||
|
disabled(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Variable: Main object for containing and managing plugins.
|
||||||
|
//
|
||||||
|
window.TD_PLUGINS = new class{
|
||||||
|
constructor(){
|
||||||
|
this.installed = [];
|
||||||
|
this.disabled = [];
|
||||||
|
this.waiting = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
isDisabled(plugin){
|
||||||
|
return this.disabled.includes(plugin.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
findObject(identifier){
|
||||||
|
return this.installed.find(plugin => plugin.id === identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
install(plugin){
|
||||||
|
this.installed.push(plugin);
|
||||||
|
|
||||||
|
if (!this.isDisabled(plugin)){
|
||||||
|
plugin.obj.enabled();
|
||||||
|
this.runWhenReady(plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runWhenReady(plugin){
|
||||||
|
if (window.TD_APP_READY){
|
||||||
|
plugin.obj.ready();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this.waiting.push(plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setState(plugin, enable){
|
||||||
|
if (enable && this.isDisabled(plugin)){
|
||||||
|
this.disabled.splice(this.disabled.indexOf(plugin.id),1);
|
||||||
|
plugin.obj.enabled();
|
||||||
|
this.runWhenReady(plugin);
|
||||||
|
}
|
||||||
|
else if (!enable && !this.isDisabled(plugin)){
|
||||||
|
this.disabled.push(plugin.id);
|
||||||
|
plugin.obj.disabled();
|
||||||
|
}
|
||||||
|
else return;
|
||||||
|
|
||||||
|
if (plugin.obj.$pluginSettings.requiresPageReload){
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onReady(){
|
||||||
|
this.waiting.forEach(plugin => plugin.obj.ready());
|
||||||
|
this.waiting = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Block: Setup global function to change plugin state.
|
||||||
|
//
|
||||||
|
window.TDPF_setPluginState = function(identifier, enable){
|
||||||
|
window.TD_PLUGINS.setState(window.TD_PLUGINS.findObject(identifier),enable);
|
||||||
|
};
|
||||||
|
})();
|
21
Resources/Scripts/plugins.notification.js
Normal file
21
Resources/Scripts/plugins.notification.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
(function(){
|
||||||
|
//
|
||||||
|
// Class: Abstract plugin base class.
|
||||||
|
//
|
||||||
|
window.PluginBase = class{
|
||||||
|
constructor(pluginSettings){
|
||||||
|
this.$pluginSettings = pluginSettings || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
run(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Variable: Main object for containing and managing plugins.
|
||||||
|
//
|
||||||
|
window.TD_PLUGINS = {
|
||||||
|
install: function(plugin){
|
||||||
|
plugin.obj.run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
@@ -1,4 +1,4 @@
|
|||||||
(function($,$TD){
|
(function($,$TDU){
|
||||||
//
|
//
|
||||||
// Variable: Current timeout ID for update checking.
|
// Variable: Current timeout ID for update checking.
|
||||||
//
|
//
|
||||||
@@ -7,7 +7,12 @@
|
|||||||
//
|
//
|
||||||
// Constant: Update exe file name.
|
// Constant: Update exe file name.
|
||||||
//
|
//
|
||||||
const updateFileName = $TD.brandName+".Update.exe";
|
const updateFileName = $TDU.brandName+".Update.exe";
|
||||||
|
|
||||||
|
//
|
||||||
|
// Constant: Url that returns JSON data about latest version.
|
||||||
|
//
|
||||||
|
const updateCheckUrl = "https://api.github.com/repos/chylex/"+$TDU.brandName+"/releases/latest";
|
||||||
|
|
||||||
//
|
//
|
||||||
// Function: Creates the update notification element. Removes the old one if already exists.
|
// Function: Creates the update notification element. Removes the old one if already exists.
|
||||||
@@ -22,7 +27,7 @@
|
|||||||
|
|
||||||
var html = [
|
var html = [
|
||||||
"<div id='tweetdck-update'>",
|
"<div id='tweetdck-update'>",
|
||||||
"<p class='tdu-title'>"+$TD.brandName+" Update</p>",
|
"<p class='tdu-title'>"+$TDU.brandName+" Update</p>",
|
||||||
"<p class='tdu-info'>Version "+version+" is now available.</p>",
|
"<p class='tdu-info'>Version "+version+" is now available.</p>",
|
||||||
"<div class='tdu-buttons'>",
|
"<div class='tdu-buttons'>",
|
||||||
"<button class='btn btn-positive tdu-btn-download'><span class='label'>Download</button>",
|
"<button class='btn btn-positive tdu-btn-download'><span class='label'>Download</button>",
|
||||||
@@ -85,11 +90,11 @@
|
|||||||
|
|
||||||
buttonDiv.children(".tdu-btn-download").click(function(){
|
buttonDiv.children(".tdu-btn-download").click(function(){
|
||||||
ele.remove();
|
ele.remove();
|
||||||
$TD.onUpdateAccepted(version,download);
|
$TDU.onUpdateAccepted(version,download);
|
||||||
});
|
});
|
||||||
|
|
||||||
buttonDiv.children(".tdu-btn-dismiss").click(function(){
|
buttonDiv.children(".tdu-btn-dismiss").click(function(){
|
||||||
$TD.onUpdateDismissed(version);
|
$TDU.onUpdateDismissed(version);
|
||||||
ele.slideUp(function(){ ele.remove(); });
|
ele.slideUp(function(){ ele.remove(); });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -103,25 +108,30 @@
|
|||||||
//
|
//
|
||||||
// Function: Runs an update check and updates all DOM elements appropriately.
|
// Function: Runs an update check and updates all DOM elements appropriately.
|
||||||
//
|
//
|
||||||
var runUpdateCheck = function(){
|
var runUpdateCheck = function(force, eventID){
|
||||||
clearTimeout(updateCheckTimeoutID);
|
clearTimeout(updateCheckTimeoutID);
|
||||||
updateCheckTimeoutID = setTimeout(runUpdateCheck,1000*60*60); // 1 hour
|
updateCheckTimeoutID = setTimeout(runUpdateCheck,1000*60*60); // 1 hour
|
||||||
|
|
||||||
if (!$TD.updateCheckEnabled)return;
|
if (!$TDU.updateCheckEnabled && !force)return;
|
||||||
|
|
||||||
$.getJSON("https://api.github.com/repos/chylex/"+$TD.brandName+"/releases/latest",function(response){
|
$.getJSON(updateCheckUrl,function(response){
|
||||||
var tagName = response.tag_name;
|
var tagName = response.tag_name;
|
||||||
|
var hasUpdate = tagName !== $TDU.versionTag && tagName !== $TDU.dismissedVersionTag && response.assets.length > 0;
|
||||||
|
|
||||||
if (tagName !== $TD.versionTag && tagName !== $TD.dismissedVersionTag && response.assets.length > 0){
|
if (hasUpdate){
|
||||||
var obj = response.assets.find(asset => asset.name === updateFileName) || response.assets[0];
|
var obj = response.assets.find(asset => asset.name === updateFileName) || response.assets[0];
|
||||||
createUpdateNotificationElement(tagName,obj.browser_download_url);
|
createUpdateNotificationElement(tagName,obj.browser_download_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (eventID !== 0){
|
||||||
|
$TDU.onUpdateCheckFinished(eventID,hasUpdate,tagName);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block: Setup global functions.
|
// Block: Setup global functions.
|
||||||
//
|
//
|
||||||
window.TDGF_runUpdateCheck = runUpdateCheck;
|
window.TDUF_runUpdateCheck = runUpdateCheck;
|
||||||
runUpdateCheck();
|
runUpdateCheck();
|
||||||
})($,$TD);
|
})($,$TDU);
|
167
TweetDck.csproj
167
TweetDck.csproj
@@ -78,12 +78,27 @@
|
|||||||
<Compile Include="Configuration\LockManager.cs" />
|
<Compile Include="Configuration\LockManager.cs" />
|
||||||
<Compile Include="Configuration\UserConfig.cs" />
|
<Compile Include="Configuration\UserConfig.cs" />
|
||||||
<Compile Include="Core\Controls\ControlExtensions.cs" />
|
<Compile Include="Core\Controls\ControlExtensions.cs" />
|
||||||
|
<Compile Include="Core\Controls\FlatButton.cs">
|
||||||
|
<SubType>Component</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Core\Controls\FlatProgressBar.cs">
|
<Compile Include="Core\Controls\FlatProgressBar.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Controls\FlatProgressBar.Designer.cs">
|
<Compile Include="Core\Controls\FlatProgressBar.Designer.cs">
|
||||||
<DependentUpon>FlatProgressBar.cs</DependentUpon>
|
<DependentUpon>FlatProgressBar.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Core\Controls\TabButton.cs">
|
||||||
|
<SubType>Component</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Controls\TabButton.Designer.cs">
|
||||||
|
<DependentUpon>TabButton.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Controls\TabPanel.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Controls\TabPanel.Designer.cs">
|
||||||
|
<DependentUpon>TabPanel.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Core\Handling\ContextMenuBase.cs" />
|
<Compile Include="Core\Handling\ContextMenuBase.cs" />
|
||||||
<Compile Include="Core\Handling\ContextMenuBrowser.cs" />
|
<Compile Include="Core\Handling\ContextMenuBrowser.cs" />
|
||||||
<Compile Include="Core\FormBrowser.cs">
|
<Compile Include="Core\FormBrowser.cs">
|
||||||
@@ -100,23 +115,70 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Handling\ContextMenuNotification.cs" />
|
<Compile Include="Core\Handling\ContextMenuNotification.cs" />
|
||||||
<Compile Include="Core\Handling\DialogHandlerBrowser.cs" />
|
<Compile Include="Core\Handling\DialogHandlerBrowser.cs" />
|
||||||
|
<Compile Include="Core\Handling\LifeSpanHandler.cs" />
|
||||||
<Compile Include="Core\Handling\TweetNotification.cs" />
|
<Compile Include="Core\Handling\TweetNotification.cs" />
|
||||||
<Compile Include="Core\Controls\RichTextLabel.cs">
|
|
||||||
<SubType>Component</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Core\Controls\RichTextLabel.Designer.cs">
|
|
||||||
<DependentUpon>RichTextLabel.cs</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Core\Other\FormAbout.cs">
|
<Compile Include="Core\Other\FormAbout.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Other\FormAbout.Designer.cs">
|
<Compile Include="Core\Other\FormAbout.Designer.cs">
|
||||||
<DependentUpon>FormAbout.cs</DependentUpon>
|
<DependentUpon>FormAbout.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Other\FormBackgroundWork.cs">
|
<Compile Include="Core\Other\FormPlugins.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Other\FormBackgroundWork.Designer.cs">
|
<Compile Include="Core\Other\FormPlugins.Designer.cs">
|
||||||
|
<DependentUpon>FormPlugins.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCSS.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCSS.Designer.cs">
|
||||||
|
<DependentUpon>DialogSettingsCSS.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCefArgs.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCefArgs.Designer.cs">
|
||||||
|
<DependentUpon>DialogSettingsCefArgs.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\Export\CombinedFileStream.cs" />
|
||||||
|
<Compile Include="Core\Other\Settings\Export\ExportManager.cs" />
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsAdvanced.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsAdvanced.Designer.cs">
|
||||||
|
<DependentUpon>TabSettingsAdvanced.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\BaseTabSettings.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\BaseTabSettings.Designer.cs">
|
||||||
|
<DependentUpon>BaseTabSettings.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsGeneral.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsGeneral.Designer.cs">
|
||||||
|
<DependentUpon>TabSettingsGeneral.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsNotifications.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsNotifications.Designer.cs">
|
||||||
|
<DependentUpon>TabSettingsNotifications.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsUpdates.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Other\Settings\TabSettingsUpdates.Designer.cs">
|
||||||
|
<DependentUpon>TabSettingsUpdates.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Core\Utils\CommandLineArgsParser.cs" />
|
||||||
|
<Compile Include="Core\Utils\WindowState.cs" />
|
||||||
|
<Compile Include="Migration\FormBackgroundWork.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Migration\FormBackgroundWork.Designer.cs">
|
||||||
<DependentUpon>FormBackgroundWork.cs</DependentUpon>
|
<DependentUpon>FormBackgroundWork.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Handling\TweetDeckBridge.cs" />
|
<Compile Include="Core\Handling\TweetDeckBridge.cs" />
|
||||||
@@ -126,10 +188,31 @@
|
|||||||
<Compile Include="Core\Other\FormSettings.Designer.cs">
|
<Compile Include="Core\Other\FormSettings.Designer.cs">
|
||||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Other\FormUpdateDownload.cs">
|
<Compile Include="Plugins\Controls\PluginControl.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Plugins\Controls\PluginControl.Designer.cs">
|
||||||
|
<DependentUpon>PluginControl.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Plugins\Controls\PluginListFlowLayout.cs">
|
||||||
|
<SubType>Component</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Plugins\Controls\PluginListFlowLayout.Designer.cs">
|
||||||
|
<DependentUpon>PluginListFlowLayout.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Plugins\Plugin.cs" />
|
||||||
|
<Compile Include="Plugins\Events\PluginChangedStateEventArgs.cs" />
|
||||||
|
<Compile Include="Plugins\PluginBridge.cs" />
|
||||||
|
<Compile Include="Plugins\PluginConfig.cs" />
|
||||||
|
<Compile Include="Plugins\PluginEnvironment.cs" />
|
||||||
|
<Compile Include="Plugins\PluginGroup.cs" />
|
||||||
|
<Compile Include="Plugins\Events\PluginLoadEventArgs.cs" />
|
||||||
|
<Compile Include="Plugins\PluginManager.cs" />
|
||||||
|
<Compile Include="Plugins\PluginScriptGenerator.cs" />
|
||||||
|
<Compile Include="Updates\FormUpdateDownload.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\Other\FormUpdateDownload.Designer.cs">
|
<Compile Include="Updates\FormUpdateDownload.Designer.cs">
|
||||||
<DependentUpon>FormUpdateDownload.cs</DependentUpon>
|
<DependentUpon>FormUpdateDownload.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Core\TrayIcon.cs">
|
<Compile Include="Core\TrayIcon.cs">
|
||||||
@@ -138,9 +221,14 @@
|
|||||||
<Compile Include="Core\TrayIcon.Designer.cs">
|
<Compile Include="Core\TrayIcon.Designer.cs">
|
||||||
<DependentUpon>TrayIcon.cs</DependentUpon>
|
<DependentUpon>TrayIcon.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Core\Utils\BrowserCache.cs" />
|
||||||
<Compile Include="Core\Utils\BrowserUtils.cs" />
|
<Compile Include="Core\Utils\BrowserUtils.cs" />
|
||||||
|
<Compile Include="Core\Utils\HardwareAcceleration.cs" />
|
||||||
<Compile Include="Core\Utils\NativeMethods.cs" />
|
<Compile Include="Core\Utils\NativeMethods.cs" />
|
||||||
<Compile Include="Core\Utils\UpdateInfo.cs" />
|
<Compile Include="Updates\UpdateAcceptedEventArgs.cs" />
|
||||||
|
<Compile Include="Updates\UpdateCheckEventArgs.cs" />
|
||||||
|
<Compile Include="Updates\UpdateHandler.cs" />
|
||||||
|
<Compile Include="Updates\UpdateInfo.cs" />
|
||||||
<Compile Include="Migration\FormMigrationQuestion.cs">
|
<Compile Include="Migration\FormMigrationQuestion.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -148,7 +236,6 @@
|
|||||||
<DependentUpon>FormMigrationQuestion.cs</DependentUpon>
|
<DependentUpon>FormMigrationQuestion.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Migration\Helpers\LnkEditor.cs" />
|
<Compile Include="Migration\Helpers\LnkEditor.cs" />
|
||||||
<Compile Include="Migration\Helpers\ProgramProcessSearch.cs" />
|
|
||||||
<Compile Include="Migration\MigrationDecision.cs" />
|
<Compile Include="Migration\MigrationDecision.cs" />
|
||||||
<Compile Include="Migration\MigrationManager.cs" />
|
<Compile Include="Migration\MigrationManager.cs" />
|
||||||
<Compile Include="Migration\Helpers\ProgramRegistrySearch.cs" />
|
<Compile Include="Migration\Helpers\ProgramRegistrySearch.cs" />
|
||||||
@@ -196,17 +283,6 @@
|
|||||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
</COMReference>
|
</COMReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ContentWithTargetPath Include="Resources\code.js">
|
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
|
||||||
<TargetPath>code.js</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ContentWithTargetPath Include="Resources\icon.ico">
|
|
||||||
<TargetPath>icon.ico</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Core\FormBrowser.resx">
|
<EmbeddedResource Include="Core\FormBrowser.resx">
|
||||||
<DependentUpon>FormBrowser.cs</DependentUpon>
|
<DependentUpon>FormBrowser.cs</DependentUpon>
|
||||||
@@ -214,10 +290,13 @@
|
|||||||
<EmbeddedResource Include="Core\Other\FormAbout.resx">
|
<EmbeddedResource Include="Core\Other\FormAbout.resx">
|
||||||
<DependentUpon>FormAbout.cs</DependentUpon>
|
<DependentUpon>FormAbout.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Core\Other\FormPlugins.resx">
|
||||||
|
<DependentUpon>FormPlugins.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Core\Other\FormSettings.resx">
|
<EmbeddedResource Include="Core\Other\FormSettings.resx">
|
||||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Core\Other\FormUpdateDownload.resx">
|
<EmbeddedResource Include="Updates\FormUpdateDownload.resx">
|
||||||
<DependentUpon>FormUpdateDownload.cs</DependentUpon>
|
<DependentUpon>FormUpdateDownload.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
@@ -227,22 +306,48 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ContentWithTargetPath Include="Resources\notification.js">
|
<ContentWithTargetPath Include="Resources\icon.ico">
|
||||||
|
<TargetPath>icon.ico</TargetPath>
|
||||||
|
</ContentWithTargetPath>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ContentWithTargetPath Include="Resources\Scripts\code.js">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
<TargetPath>code.js</TargetPath>
|
||||||
|
</ContentWithTargetPath>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ContentWithTargetPath Include="Resources\Scripts\notification.js">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
<TargetPath>notification.js</TargetPath>
|
<TargetPath>notification.js</TargetPath>
|
||||||
</ContentWithTargetPath>
|
</ContentWithTargetPath>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ContentWithTargetPath Include="Resources\update.js">
|
<ContentWithTargetPath Include="Resources\Scripts\plugins.browser.js">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
<TargetPath>plugins.browser.js</TargetPath>
|
||||||
|
</ContentWithTargetPath>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ContentWithTargetPath Include="Resources\Scripts\plugins.notification.js">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
<TargetPath>plugins.notification.js</TargetPath>
|
||||||
|
</ContentWithTargetPath>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ContentWithTargetPath Include="Resources\Scripts\update.js">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
<TargetPath>update.js</TargetPath>
|
<TargetPath>update.js</TargetPath>
|
||||||
</ContentWithTargetPath>
|
</ContentWithTargetPath>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="Resources\icon-small.ico" />
|
<None Include="Resources\icon-small.ico" />
|
||||||
<None Include="Resources\icon-tray-new.ico" />
|
<None Include="Resources\icon-tray-new.ico" />
|
||||||
<None Include="Resources\icon-tray.ico" />
|
<None Include="Resources\icon-tray.ico" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Resources\Plugins\" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@@ -264,7 +369,13 @@ del "$(TargetDir)LICENSE.txt"
|
|||||||
ren "$(TargetDir)LICENSE.md" "LICENSE.txt"
|
ren "$(TargetDir)LICENSE.md" "LICENSE.txt"
|
||||||
xcopy "$(ProjectDir)Libraries\CEFSHARP-LICENSE.txt" "$(TargetDir)" /Y
|
xcopy "$(ProjectDir)Libraries\CEFSHARP-LICENSE.txt" "$(TargetDir)" /Y
|
||||||
xcopy "$(ProjectDir)packages\Microsoft.VC120.CRT.JetBrains.12.0.21005.2\DotFiles\msvcp120.dll" "$(TargetDir)" /Y
|
xcopy "$(ProjectDir)packages\Microsoft.VC120.CRT.JetBrains.12.0.21005.2\DotFiles\msvcp120.dll" "$(TargetDir)" /Y
|
||||||
xcopy "$(ProjectDir)packages\Microsoft.VC120.CRT.JetBrains.12.0.21005.2\DotFiles\msvcr120.dll" "$(TargetDir)" /Y</PostBuildEvent>
|
xcopy "$(ProjectDir)packages\Microsoft.VC120.CRT.JetBrains.12.0.21005.2\DotFiles\msvcr120.dll" "$(TargetDir)" /Y
|
||||||
|
mkdir "$(TargetDir)plugins"
|
||||||
|
mkdir "$(TargetDir)plugins\official"
|
||||||
|
mkdir "$(TargetDir)plugins\user"
|
||||||
|
xcopy "$(ProjectDir)Resources\Plugins\*" "$(TargetDir)plugins\official\" /E /Y
|
||||||
|
rmdir "$(ProjectDir)\bin\Debug"
|
||||||
|
rmdir "$(ProjectDir)\bin\Release"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
namespace TweetDck.Core.Other {
|
namespace TweetDck.Updates {
|
||||||
partial class FormUpdateDownload {
|
partial class FormUpdateDownload {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
@@ -1,13 +1,16 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other{
|
namespace TweetDck.Updates{
|
||||||
sealed partial class FormUpdateDownload : Form{
|
sealed partial class FormUpdateDownload : Form{
|
||||||
|
private const double BytesToMB = 1024.0*1024.0;
|
||||||
|
|
||||||
public string InstallerPath{
|
public string InstallerPath{
|
||||||
get{
|
get{
|
||||||
return Path.Combine(Path.GetTempPath(),updateInfo.FileName);
|
return Path.Combine(Path.GetTempPath(),updateInfo.FileName);
|
||||||
@@ -66,7 +69,7 @@ namespace TweetDck.Core.Other{
|
|||||||
progressDownload.SetValueInstant(1000);
|
progressDownload.SetValueInstant(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
labelStatus.Text = (e.BytesReceived/(1024.0*1024.0)).ToString("0.0")+" MB";
|
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" MB";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (progressDownload.Style != ProgressBarStyle.Continuous){
|
if (progressDownload.Style != ProgressBarStyle.Continuous){
|
||||||
@@ -74,7 +77,7 @@ namespace TweetDck.Core.Other{
|
|||||||
}
|
}
|
||||||
|
|
||||||
progressDownload.SetValueInstant(e.ProgressPercentage*10);
|
progressDownload.SetValueInstant(e.ProgressPercentage*10);
|
||||||
labelStatus.Text = (e.BytesReceived/(1024.0*1024.0)).ToString("0.0")+" / "+(e.TotalBytesToReceive/(1024.0*1024.0)).ToString("0.0")+" MB";
|
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" / "+(e.TotalBytesToReceive/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" MB";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
377
Updates/FormUpdateDownload.resx
Normal file
377
Updates/FormUpdateDownload.resx
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
|
||||||
|
AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHg5IrF+OlS+hjyMw4g7tcmM
|
||||||
|
PM/MjTzezY485s2OPObMjjzfyIw80MOJPLe8hDyNs387WKx8OyQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHU4FrB8OGXGijzAzo889dKR
|
||||||
|
PP/SkTz/0pE8/9GRPP/RkDz/0JA8/9CQPP/RkDz/0ZE8/9KRPP/TkTz/0pE8/86PPPbGijzCt4E8bKp6
|
||||||
|
OxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKN1OB+9hTuLzI486NOR
|
||||||
|
PP/SkTz/0ZA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9GQ
|
||||||
|
PP/SkTz/0pE8/82OPOu9hTuOq3w8IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACidTkFuoM8csyN
|
||||||
|
POrTkjz/0ZE8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9GRPP/Tkjz/zY887bqEPHimeDsHAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKp6
|
||||||
|
OynDiDvA05I8/9GRPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0ZA8/9ORPP/GijzFr308LgAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAArXw7UM2OPOvTkTz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/SkTz/zo887rOAPFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAACxfjxm0ZA8/NGRPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0ZE8/9GQPP64gjxtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALaBPGXRkTz/0ZE8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9GQPP/SkTz/uIM8bAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqnk6TtCQPPzRkTz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/RkDz/0ZA8/rSA
|
||||||
|
PFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtfDwmzo887dKRPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0ZE8/86PPPGtfDwrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZ4PAXFijzC0pE8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CURf/TpGT/2baJ/9/GpP/l0bf/59W//+fVvf/kz7P/3sOg/9mz
|
||||||
|
hP/ToWH/0JND/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9KRPP/EiTvJo3Y7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALiC
|
||||||
|
PG/Tkjz/0JA8/9CQPP/QkDz/0JA8/9CSQf/Vq3P/5tO7//j07v//////////////////////////////
|
||||||
|
////////////////////////9vHq/+TQtf/UqG7/0JA+/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/Tkjz/uYM8dgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAArXw8Gc2OPOzRkTz/0JA8/9CQPP/QlEX/27qP//fz7P//////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////8ObZ/9auev/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/RkTz/zI488J1x
|
||||||
|
OB8AAAAAAAAAAAAAAAAAAAAAuoM7h9OSPP/QkDz/0JA8/9GXTf/TpGb/27uS/9u6kP/ewZz/59W9//Xv
|
||||||
|
5///////////////////////////////////////////////////////////////////////////////
|
||||||
|
///r3cr/0ZxV/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/1JI8/7mDO5AAAAAAAAAAAAAAAADFj0cR0pNB6s+PO//Ojjv/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CRQP/TpGf/5NC2//38+v//////////////////////////////////////////////
|
||||||
|
////////////////////////+vf0/9auev/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0ZE8/8uOPO6SajYVAAAAAAAAAADzr1df7qxV/+WkT//ZmUT/0JA9/86O
|
||||||
|
O//Pjzv/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9GaUv/l07r/////////////////////////
|
||||||
|
///////////////////////////////////////////////////buo//0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9OSPP+ldjdoAAAAAAAAAADurFW67qxV//Ct
|
||||||
|
Vv/vrVb/6adR/92dSP/Skz//zo47/8+PO//QkDz/0JA8/9CQPP/QkDz/0JJB/9Smaf/dv5j/+fXw////
|
||||||
|
////////////////////////////////////////////////////////////////////////2riM/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9KRPP/FiTzGoHQ6Ae6s
|
||||||
|
VRrurFXz7qxV/+6sVf/urFX/761W//CuVv/sqlT/4qFM/9aVQv/Pjzv/zo47/9CQPP/VqnH/8+vh////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////9aueP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9GQ
|
||||||
|
PP/Ojzz4oHM5Iu6sVU3urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/vrVX/8K5W/+6sVf/mpU//2plF/9q6
|
||||||
|
j///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////n18P/Rm1P/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/SkTz/rXs6Vu6sVYPurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/wrVb/6r2B////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////o18L/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/v4Y8j+6sVa3urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFb/9Onb///////+/v3/////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////1qx2/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/wYc7uO6sVcrurFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/trlr/67Zy/+m+h//y5NP/////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////7+TW/9CQPf/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/RkTz/yYw80e6s
|
||||||
|
VdvurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/6sme//v49P//////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////////9arc//QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/RkDz/zI083+6sVeLurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/u2b3/////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////+fVvv/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/zo885u6sVeLurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+vL
|
||||||
|
of//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////r28v/Rl0r/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/zo885u6sVdrurFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7LBj//r28f//////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///Vq3P/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/RkDz/zI083+6sVcrurFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/6cKO////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////ewp7/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/RkTz/yYw80O6s
|
||||||
|
VazurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7NOy//z59v/u2b7/+fPr////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////n1sD/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/SkTz/xIo8uO6sVYHurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/67Zx/+2uWf/qy6H/////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////v5dj/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/SkTz/vYU8je6sVUvurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+nC
|
||||||
|
kP///////////////////////////////////////////////////////fz6//fu5P/w4Mv/793F//7+
|
||||||
|
/v/////////////////////////////////////////////////////////////////17eT/0JA//86O
|
||||||
|
Ov/Pjzv/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/tYA8Vu6sVRnurFXy7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7a5b//fw5///////////////////////////////////////+/jz/+7av//pwIr/67Jn/+6t
|
||||||
|
Vv/urFX/6rd1////////////////////////////////////////////////////////////////////
|
||||||
|
///48ej/6KhU/92cR//Tkj7/zo47/8+PO//QkDz/0JA8/9GQPP/Pjzz3rXw8IAAAAADurFW37qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/6b2D//////////////////////////////////nz6//qyZ3/7K9h/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/6rl6////////////////////////////////////////////////////
|
||||||
|
///////////////////9/Pr/6r6C//CuV//sqlT/4aBL/9aWQv/Pjzv/zo47/9GRPP/GijzCp3g8AQAA
|
||||||
|
AADurFVb7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/68yk///////////////////////+/fz/68+q/+2v
|
||||||
|
XP/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/6rNr//7+/f//////////////////////////////
|
||||||
|
/////////////////////////////////////////////+nEk//vrVX/8K5W/+6sVf/lpE//2ZlF/9KR
|
||||||
|
Pf+zfzpoAAAAAAAAAADurFUP7qxV5u6sVf/urFX/7qxV/+6sVf/urFX/7NGu//////////////////fu
|
||||||
|
5P/quHb/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxW//Xr3///////////////
|
||||||
|
///////////////////////////////////////////////////7+PP/+vXu///////pxJL/7qxV/+6s
|
||||||
|
Vf/wrVb/8K1W/+mnUevUmUsUAAAAAAAAAAAAAAAA7qxVgO6sVf/urFX/7qxV/+6sVf/urFX/6sqg////
|
||||||
|
////////8eLO/+yvX//urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+nF
|
||||||
|
lf/////////////////////////////////////////////////////////////////8+vf/6cWV/+q5
|
||||||
|
ev/s07H/6rd1/+6sVf/urFX/7qxV/++tVogAAAAAAAAAAAAAAAAAAAAA7qxVFe6sVejurFX/7qxV/+6s
|
||||||
|
Vf/urFX/6bp8///////w4Mn/7a1Z/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/x4cz////////////////////////////////////////////////////+//7+
|
||||||
|
/v/////////+/+m8gP/urFX/7a1Y/+6sVf/urFX/7qxV7O6sVRoAAAAAAAAAAAAAAAAAAAAAAAAAAO6s
|
||||||
|
VWburFX/7qxV/+6sVf/urFX/7a5b/+zTs//sr1//7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/sr1//8uPQ////////////////////////////////////
|
||||||
|
////////6suj/+qzav/pxpj/9Onb//n07f/rr2D/7qxV/+6sVf/urFX/7qxVbwAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAO6sVQPurFW67qxV/+6sVf/urFX/7qxV/+6sVv/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7axY/+nGl//27uP/////////
|
||||||
|
/////////fz6//Lj0P/qunv/7qxV/+6sVf/urFX/7qxV/+m9gv/qt3X/7qxV/+6sVf/urFXB7qxVBQAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADurFUg7qxV6O6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/qtnP/6sqg/+3WuP/s07P/6cSS/+uyZf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVv/trVr/7qxV/+6s
|
||||||
|
VezurFUlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7qxVRu6sVfjurFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV++6sVUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO6s
|
||||||
|
VVzurFX97qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxVYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAADurFVd7qxV+O6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVfvurFVjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7qxVR+6sVeXurFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV6O6sVU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO6sVSPurFW37qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFW77qxVJgAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADurFUB7qxVae6sVeTurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV5+6sVW3urFUDAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO6sVRjurFWA7qxV4u6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVeTurFWE7qxVGwAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7qxVEu6sVV7urFW17qxV7+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVfDurFW47qxVX+6s
|
||||||
|
VRMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA7qxVG+6sVUzurFWA7qxVrO6sVcnurFXa7qxV4u6sVeLurFXa7qxVye6sVa3urFWC7qxVTe6s
|
||||||
|
VR0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAP//gAH//6gr//wAAD//qCv/8AAAD/+oK//AAAAD/6gr/4AAAAH/qCv/AAAAAP+oK/4A
|
||||||
|
AAAAf6gr/AAAAAA/qCv4AAAAAB+oK/AAAAAAD6gr4AAAAAAHqCvgAAAAAAeoK8AAAAAAA6grwAAAAAAD
|
||||||
|
qCuAAAAAAAGoK4AAAAAAAagrgAAAAAAAqCsAAAAAAACoKwAAAAAAAKgrAAAAAAAAqCsAAAAAAACoKwAA
|
||||||
|
AAAAAKgrAAAAAAAAqCsAAAAAAACoKwAAAAAAAKgrAAAAAAAAqCsAAAAAAACoKwAAAAAAAKgrAAAAAAAA
|
||||||
|
qCsAAAAAAACoKwAAAAAAAKgrgAAAAAAAqCuAAAAAAAGoK4AAAAAAAagrwAAAAAADqCvAAAAAAAOoK+AA
|
||||||
|
AAAAB6gr4AAAAAAHqCvwAAAAAA+oK/gAAAAAH6gr/AAAAAA/qCv+AAAAAH+oK/8AAAAA/6gr/4AAAAH/
|
||||||
|
qCv/wAAAA/+oK//wAAAP/6gr//wAAD//qCv//4AB//+oKygAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHY4FrR/
|
||||||
|
Ole+hjuVxos7w8uNPNvOjzznzo8858uNPNzGijzEvoU7l7WBO1mpejsYAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHg5Kr6F
|
||||||
|
O5XLjTvo0pE8/9ORPP/SkTz/0ZE8/9CQPP/QkDz/0ZE8/9KRPP/TkTz/0pE8/82OPOq/hjyZrXw7LAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo3U6CbuE
|
||||||
|
O4bPjzz005I8/9GRPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0ZE8/9OS
|
||||||
|
PP/PkDz1vYU8iah6PAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKR3
|
||||||
|
OibGizvG05E8/9GQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9GQPP/TkTz/yIs8yqx8PCkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AACsezsxy40849KRPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/zI485rKAPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAApXc6JMuNPOTSkTz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/zI485659PCcAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAKd4OwnHizzJ0pE8/9CQPP/QkDz/0JA9/9OgYP/YtIX/38Sh/+LMr//iy67/3sOf/9iy
|
||||||
|
gv/Tn13/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/SkTz/x4s8zaV4
|
||||||
|
OwsAAAAAAAAAAAAAAAAAAAAAu4Q8hNOSPP/QkDz/0JA8/9GXS//YtIX/6NfC//Xv5//8+vj/////////
|
||||||
|
///8+vf/9O3k/+fVvv/YsYH/0JRF/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/Tkjz/u4Q7iQAAAAAAAAAAAAAAAKx7OyTPjzz10ZA8/9GXS//Ztoj/8une////////////////////
|
||||||
|
///////////////////////////////////38uz/3L2V/9CRP//QkDz/0JA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9GRPP/Ojzz3onU5KQAAAAAAAAAAxo1BlNGQO//Ojjv/0JNC/9GWSP/QlET/0ZpR/9au
|
||||||
|
eP/n1b3//v79////////////////////////////////////////////7+TV/9GdWP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/0JA8/9SSPP+4gjqaAAAAAPGuVhHvrVXq5qRO/9qZRP/QkT3/zo46/8+P
|
||||||
|
O//QkDz/0JA8/9CQPP/To2P/8+vh////////////////////////////////////////////+fXw/9Oh
|
||||||
|
Yf/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/0pE8/8qMO+2WbTYV7qxVUe6sVf/wrVb/761W/+mo
|
||||||
|
Uv/enUj/05M//86PO//PkD7/3cCZ//Lp3v/7+PT/////////////////////////////////////////
|
||||||
|
////////+PTv/9GcVf/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/QkDz/05I8/699OljurFWR7qxV/+6s
|
||||||
|
Vf/urFX/761W//CuV//sqlT/4qJQ/+zdyf//////////////////////////////////////////////
|
||||||
|
////////////////////////7+TV/9CRP//QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/Tkjz/vIQ7mO6s
|
||||||
|
Vb/urFX/7qxV/+6sVf/urFX/7qxV/++tVf/ry5///v79//7+/f//////////////////////////////
|
||||||
|
////////////////////////////////////////2rqO/9CQPP/QkDz/0JA8/9CQPP/QkDz/0JA8/9KR
|
||||||
|
PP/GijvF7qxV2u6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+u1bv/t1bb//fv4////////////////////
|
||||||
|
///////////////////////////////////////////////////48+3/0ZRG/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0ZA8/8uNPNzurFXl7qxV/+6sVf/urFX/7qxV/+6sVf/rsWP/9OjZ////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////YtIX/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/QkDz/zo886O6sVeXurFX/7qxV/+6sVf/urFX/7qxW//Hiz///////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////+rb
|
||||||
|
yP/QkDz/0JA8/9CQPP/QkDz/0JA8/9CQPP/Ojzzo7qxV2e6sVf/urFX/7qxV/+6sVf/quHb/////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////+fXw/9CURf/QkDz/0JA8/9CQPP/QkDz/0ZA8/8yOPNzurFW/7qxV/+6sVf/urFX/7qxV/+nA
|
||||||
|
if/s1LT/9Onb////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////0Z5b/9CQPP/QkDz/0JA8/9CQPP/SkTz/x4s8xe6sVY/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+nEk//+/fz////////////////////////////+/v3/+PHo//To2f/+/v7/////////
|
||||||
|
///////////////////////////////////VqGz/zo46/8+PO//QkDz/0JA8/9KRPP+/hjyX7qxVUO6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/ssGH//Pr2///////////////////////y49D/6cOR/+qyaf/urVb/6rJp////
|
||||||
|
/////////////////////////////////////////////+e7f//goEr/1ZVB/8+PO//Ojzv/0pE8/7WB
|
||||||
|
PFfurFUQ7qxV6O6sVf/urFX/7qxV/+m+hv/////////////////z5tX/6rl6/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/qs2r////+////////////////////////////////////////////+PLp/+y4c//urFX/5aRO/9qZ
|
||||||
|
RP/Mjjztp3g6FQAAAADurFWQ7qxV/+6sVf/urFX/6cKP////////////682m/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+2sV//17N////////////////////////////////////////7+/v/06Nn/8uTT/+qz
|
||||||
|
a//wrVb/761W/+alUZYAAAAAAAAAAO6sVSHurFX07qxV/+6sVf/quXj//////+nDkf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+m+hP////////////////////////////////////////////jy
|
||||||
|
6v/qtnH/67Fj/+6sVf/urFX2761WJQAAAAAAAAAAAAAAAO6sVX7urFX/7qxV/+2vW//pvID/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+nEkv/7+PT//////////////////fz6/+rJ
|
||||||
|
n//rtW7/682n/+zTs//urFb/7qxV/+6sVYQAAAAAAAAAAAAAAAAAAAAA7qxVB+6sVcTurFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+u0bP/qy6H/7da4/+vN
|
||||||
|
pv/qtnP/7qxV/+6sVf/urFX/7K9f/+2sWP/urFXI7qxVCQAAAAAAAAAAAAAAAAAAAAAAAAAA7qxVIO6s
|
||||||
|
VeDurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV4+6sVSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAA7qxVLO6sVd/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVeLurFUwAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAA7qxVIu6sVcHurFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFXE7qxVJAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7qxVBu6sVX/urFXw7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFXy7qxVgu6sVQgAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO6sVSXurFWP7qxV5e6s
|
||||||
|
Vf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFXl7qxVke6sVScAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AADurFUS7qxVUO6sVY7urFW97qxV2O6sVeXurFXl7qxV2O6sVb7urFWP7qxVUu6sVRMAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AD//8AAP/8AAA/+AAAH/AAAA/gAAAHwAAAA8AA
|
||||||
|
AAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA
|
||||||
|
AAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//wAA///AA/8oAAAAEAAAACAAAAABACAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKx7Oja9hTqTyYw8zs6PPOfOjzznyYw8zr6G
|
||||||
|
PJSvfjw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo3Y7CbyEO5PRkDz805I8/9GRPP/QkDz/0JA8/9GR
|
||||||
|
PP/TkTz/0ZA8/b+GPJWrfDwKAAAAAAAAAAAAAAAAp3g8CcSJPLfTkjz/0ZA8/9CQPP/QkDz/0JA8/9CQ
|
||||||
|
PP/QkDz/0JA8/9CQPP/Tkjz/xoo8uqx8PQoAAAAAAAAAAL2FPJPUk0D/06Rm/92/mf/izK//4sut/9u6
|
||||||
|
j//Snlr/0JA8/9CQPP/QkDz/0JA8/9OSPP+9hTyWAAAAALiEQDLQkDz90JpS/93Amf/u4tP/////////
|
||||||
|
/////////fv5/+DIqP/QkkH/0JA8/9CQPP/RkDz/0JA8/qN1OTTtq1WS56VP/9qaRf/RkT3/0JdO/+rc
|
||||||
|
yP//////////////////////693L/9CSQf/QkDz/0JA8/9SSPP+3gTqW761Vz++tVv/wrVb/6K5h//fy
|
||||||
|
6v/////////////////////////////////gx6b/0JA8/9CQPP/RkTz/yYw80e6sVefurFX/7qxV/+q+
|
||||||
|
hP/69vD//////////////////////////////////fz7/9GbU//QkDz/0JA8/8+PPOnurFXn7qxV/+yw
|
||||||
|
Y//79/P////////////////////////////////////////////ZuIz/0JA8/9CQPP/Pjzzp7qxVz+6s
|
||||||
|
Vf/sr2H/8eLO/////////////v7+//n07f/+/v7/////////////////48yu/8+PO//Qjzv/yYs80e6s
|
||||||
|
VZLurFX/67Jm//7+/f/8+fb/68yl/+qza//rsmf//v37//////////////////Pn2P/ip1n/2phC/8CH
|
||||||
|
PJXurFUw7qxV/eq2c//169//6rNr/+6sVf/urFX/7q1W//Pm1f/////////////////8+fX/67+G/++t
|
||||||
|
Vf3lpVEyAAAAAO6sVZHtrVr/7a9c/+6sVf/urFX/7qxV/+6sVf/rsWP/7de5//Lj0P/pxJL/67Zy/+qz
|
||||||
|
av/urFWTAAAAAAAAAADurFUI7qxVtO6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
Vf/urFW37qxVCQAAAAAAAAAAAAAAAO6sVQjurFWQ7qxV++6sVf/urFX/7qxV/+6sVf/urFX/7qxV/+6s
|
||||||
|
VfvurFWS7qxVCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO6sVTPurFWQ7qxVzO6sVeburFXm7qxVzO6s
|
||||||
|
VZDurFU0AAAAAAAAAAAAAAAAAAAAAPAPrEHAA6xBgAGsQYABrEEAAKxBAACsQQAArEEAAKxBAACsQQAA
|
||||||
|
rEEAAKxBAACsQYABrEGAAaxBwAOsQfAPrEE=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
11
Updates/UpdateAcceptedEventArgs.cs
Normal file
11
Updates/UpdateAcceptedEventArgs.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TweetDck.Updates{
|
||||||
|
class UpdateAcceptedEventArgs : EventArgs{
|
||||||
|
public readonly UpdateInfo UpdateInfo;
|
||||||
|
|
||||||
|
public UpdateAcceptedEventArgs(UpdateInfo info){
|
||||||
|
this.UpdateInfo = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
Updates/UpdateCheckEventArgs.cs
Normal file
15
Updates/UpdateCheckEventArgs.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TweetDck.Updates{
|
||||||
|
class UpdateCheckEventArgs : EventArgs{
|
||||||
|
public int EventId { get; private set; }
|
||||||
|
public bool UpdateAvailable { get; private set; }
|
||||||
|
public string LatestVersion { get; private set; }
|
||||||
|
|
||||||
|
public UpdateCheckEventArgs(int eventId, bool updateAvailable, string latestVersion){
|
||||||
|
EventId = eventId;
|
||||||
|
UpdateAvailable = updateAvailable;
|
||||||
|
LatestVersion = latestVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
95
Updates/UpdateHandler.cs
Normal file
95
Updates/UpdateHandler.cs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
using System;
|
||||||
|
using CefSharp;
|
||||||
|
using CefSharp.WinForms;
|
||||||
|
using TweetDck.Core;
|
||||||
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Resources;
|
||||||
|
|
||||||
|
namespace TweetDck.Updates{
|
||||||
|
class UpdateHandler{
|
||||||
|
private readonly ChromiumWebBrowser browser;
|
||||||
|
private readonly FormBrowser form;
|
||||||
|
|
||||||
|
public event EventHandler<UpdateAcceptedEventArgs> UpdateAccepted;
|
||||||
|
public event EventHandler<UpdateCheckEventArgs> CheckFinished;
|
||||||
|
|
||||||
|
private int lastEventId;
|
||||||
|
|
||||||
|
public UpdateHandler(ChromiumWebBrowser browser, FormBrowser form){
|
||||||
|
this.browser = browser;
|
||||||
|
this.form = form;
|
||||||
|
browser.FrameLoadEnd += browser_FrameLoadEnd;
|
||||||
|
browser.RegisterJsObject("$TDU",new Bridge(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
|
if (e.Frame.IsMain){
|
||||||
|
ScriptLoader.ExecuteFile(e.Frame,"update.js");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Check(bool force){
|
||||||
|
browser.ExecuteScriptAsync("TDUF_runUpdateCheck",force,++lastEventId);
|
||||||
|
return lastEventId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TriggerUpdateAcceptedEvent(UpdateAcceptedEventArgs args){
|
||||||
|
if (UpdateAccepted != null){
|
||||||
|
form.InvokeSafe(() => UpdateAccepted(this,args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TriggerCheckFinishedEvent(UpdateCheckEventArgs args){
|
||||||
|
if (CheckFinished != null){
|
||||||
|
form.InvokeSafe(() => CheckFinished(this,args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Bridge{
|
||||||
|
public string BrandName{
|
||||||
|
get{
|
||||||
|
return Program.BrandName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string VersionTag{
|
||||||
|
get{
|
||||||
|
return Program.VersionTag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UpdateCheckEnabled{
|
||||||
|
get{
|
||||||
|
return Program.UserConfig.EnableUpdateCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DismissedVersionTag{
|
||||||
|
get{
|
||||||
|
return Program.UserConfig.DismissedUpdate ?? string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly UpdateHandler owner;
|
||||||
|
|
||||||
|
public Bridge(UpdateHandler owner){
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUpdateCheckFinished(int eventId, bool isUpdateAvailable, string latestVersion){
|
||||||
|
owner.TriggerCheckFinishedEvent(new UpdateCheckEventArgs(eventId,isUpdateAvailable,latestVersion));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
||||||
|
owner.TriggerUpdateAcceptedEvent(new UpdateAcceptedEventArgs(new UpdateInfo(versionTag,downloadUrl)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUpdateDismissed(string versionTag){
|
||||||
|
owner.form.InvokeSafe(() => {
|
||||||
|
Program.UserConfig.DismissedUpdate = versionTag;
|
||||||
|
Program.UserConfig.Save();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,4 +1,6 @@
|
|||||||
namespace TweetDck.Core.Utils{
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDck.Updates{
|
||||||
class UpdateInfo{
|
class UpdateInfo{
|
||||||
public readonly string VersionTag;
|
public readonly string VersionTag;
|
||||||
public readonly string DownloadUrl;
|
public readonly string DownloadUrl;
|
@@ -2,3 +2,8 @@ del "bin\x86\Release Dick\*.xml"
|
|||||||
del "bin\x86\Release Dick\devtools_resources.pak"
|
del "bin\x86\Release Dick\devtools_resources.pak"
|
||||||
del "bin\x86\Release Duck\*.xml"
|
del "bin\x86\Release Duck\*.xml"
|
||||||
del "bin\x86\Release Duck\devtools_resources.pak"
|
del "bin\x86\Release Duck\devtools_resources.pak"
|
||||||
|
|
||||||
|
del "bin\x86\Release Dick\TweetDick.Browser.exe"
|
||||||
|
ren "bin\x86\Release Dick\CefSharp.BrowserSubprocess.exe" "TweetDick.Browser.exe"
|
||||||
|
del "bin\x86\Release Duck\TweetDuck.Browser.exe"
|
||||||
|
ren "bin\x86\Release Duck\CefSharp.BrowserSubprocess.exe" "TweetDuck.Browser.exe"
|
Reference in New Issue
Block a user