mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-09-14 10:32:10 +02:00
Compare commits
93 Commits
Author | SHA1 | Date | |
---|---|---|---|
7388eb07ca | |||
c38d507e50 | |||
5aee087a57 | |||
0cda3702ea | |||
ce55226d0c | |||
0bab0a9963 | |||
34955b7083 | |||
ba6ce072ac | |||
f39fd00697 | |||
58fc1be1d5 | |||
1fdf9bffb6 | |||
2ad179ef8e | |||
d42cc5b762 | |||
403658f622 | |||
6ca35685db | |||
bfc6822f69 | |||
b0386937d7 | |||
9436540b2f | |||
45b0ece342 | |||
5c147d3648 | |||
8fa68c428f | |||
e2be90191e | |||
339da2f1a9 | |||
b2cc5d50bd | |||
f38b188046 | |||
9e45628e87 | |||
bf76398627 | |||
81d5728964 | |||
d76027558b | |||
1450cc24a3 | |||
f41523c1b2 | |||
4019463e68 | |||
5e2e239f5e | |||
bc7856b6c0 | |||
e2bba8d9e1 | |||
520db2c32e | |||
da71f2de2b | |||
6dd2c6678b | |||
fb3d9e6d6b | |||
36473c2df9 | |||
81aa30b2ec | |||
85d5160782 | |||
44bf7b870e | |||
44da2e6082 | |||
d576bc3972 | |||
dbeb4c7205 | |||
e5223a852e | |||
f3884315c0 | |||
53cd9dc9a6 | |||
a3666a7ab2 | |||
ca4eb17308 | |||
b729dca2e5 | |||
21354e675a | |||
2085ddd347 | |||
31a475861b | |||
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 |
@@ -4,7 +4,7 @@ using System.IO;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace TweetDck.Configuration{
|
namespace TweetDck.Configuration{
|
||||||
class LockManager{
|
sealed class LockManager{
|
||||||
public Process LockingProcess { get; private set; }
|
public Process LockingProcess { get; private set; }
|
||||||
|
|
||||||
private readonly string file;
|
private readonly string file;
|
||||||
@@ -20,10 +20,10 @@ namespace TweetDck.Configuration{
|
|||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
lockStream = new FileStream(file,FileMode.Create,FileAccess.Write,FileShare.Read);
|
lockStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read);
|
||||||
|
|
||||||
byte[] id = BitConverter.GetBytes(Process.GetCurrentProcess().Id);
|
byte[] id = BitConverter.GetBytes(Process.GetCurrentProcess().Id);
|
||||||
lockStream.Write(id,0,id.Length);
|
lockStream.Write(id, 0, id.Length);
|
||||||
lockStream.Flush();
|
lockStream.Flush();
|
||||||
|
|
||||||
if (LockingProcess != null){
|
if (LockingProcess != null){
|
||||||
@@ -48,11 +48,11 @@ namespace TweetDck.Configuration{
|
|||||||
try{
|
try{
|
||||||
byte[] bytes = new byte[4];
|
byte[] bytes = new byte[4];
|
||||||
|
|
||||||
using(FileStream fileStream = new FileStream(file,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)){
|
using(FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){
|
||||||
fileStream.Read(bytes,0,4);
|
fileStream.Read(bytes, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pid = BitConverter.ToInt32(bytes,0);
|
int pid = BitConverter.ToInt32(bytes, 0);
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Process foundProcess = Process.GetProcessById(pid);
|
Process foundProcess = Process.GetProcessById(pid);
|
||||||
|
@@ -16,7 +16,7 @@ namespace TweetDck.Configuration{
|
|||||||
Binder = new SerializationCompatibilityHandler()
|
Binder = new SerializationCompatibilityHandler()
|
||||||
};
|
};
|
||||||
|
|
||||||
private const int CurrentFileVersion = 3;
|
private const int CurrentFileVersion = 5;
|
||||||
|
|
||||||
// START OF CONFIGURATION
|
// START OF CONFIGURATION
|
||||||
|
|
||||||
@@ -25,20 +25,29 @@ namespace TweetDck.Configuration{
|
|||||||
|
|
||||||
public WindowState BrowserWindow { get; set; }
|
public WindowState BrowserWindow { 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 PluginConfig Plugins { get; private set; }
|
public PluginConfig Plugins { get; private set; }
|
||||||
public WindowState PluginsWindow { get; set; }
|
public WindowState PluginsWindow { get; set; }
|
||||||
|
|
||||||
|
public string CustomCefArgs { get; set; }
|
||||||
|
public string CustomBrowserCSS { get; set; }
|
||||||
|
public string CustomNotificationCSS { get; set; }
|
||||||
|
|
||||||
public bool IsCustomNotificationPositionSet{
|
public bool IsCustomNotificationPositionSet{
|
||||||
get{
|
get{
|
||||||
return CustomNotificationPosition.X != -32000 && CustomNotificationPosition.X != 32000;
|
return CustomNotificationPosition.X != -32000 && CustomNotificationPosition.X != 32000;
|
||||||
@@ -56,7 +65,7 @@ namespace TweetDck.Configuration{
|
|||||||
muteNotifications = value;
|
muteNotifications = value;
|
||||||
|
|
||||||
if (MuteToggled != null){
|
if (MuteToggled != null){
|
||||||
MuteToggled(this,new EventArgs());
|
MuteToggled(this, new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,7 +81,7 @@ namespace TweetDck.Configuration{
|
|||||||
trayBehavior = value;
|
trayBehavior = value;
|
||||||
|
|
||||||
if (TrayBehaviorChanged != null){
|
if (TrayBehaviorChanged != null){
|
||||||
TrayBehaviorChanged(this,new EventArgs());
|
TrayBehaviorChanged(this, new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,12 +108,17 @@ namespace TweetDck.Configuration{
|
|||||||
DisplayNotificationTimer = true;
|
DisplayNotificationTimer = true;
|
||||||
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();
|
Plugins = new PluginConfig();
|
||||||
PluginsWindow = new WindowState();
|
PluginsWindow = new WindowState();
|
||||||
|
|
||||||
|
Plugins.DisableOfficialFromConfig("clear-columns");
|
||||||
|
Plugins.DisableOfficialFromConfig("reply-account");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpgradeFile(){
|
private void UpgradeFile(){
|
||||||
@@ -131,6 +145,25 @@ namespace TweetDck.Configuration{
|
|||||||
++fileVersion;
|
++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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileVersion == 4){
|
||||||
|
Plugins.DisableOfficialFromConfig("clear-columns");
|
||||||
|
Plugins.DisableOfficialFromConfig("reply-account");
|
||||||
|
++fileVersion;
|
||||||
|
}
|
||||||
|
|
||||||
// update the version
|
// update the version
|
||||||
fileVersion = CurrentFileVersion;
|
fileVersion = CurrentFileVersion;
|
||||||
Save();
|
Save();
|
||||||
@@ -146,16 +179,16 @@ namespace TweetDck.Configuration{
|
|||||||
if (File.Exists(file)){
|
if (File.Exists(file)){
|
||||||
string backupFile = GetBackupFile(file);
|
string backupFile = GetBackupFile(file);
|
||||||
File.Delete(backupFile);
|
File.Delete(backupFile);
|
||||||
File.Move(file,backupFile);
|
File.Move(file, backupFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
using(Stream stream = new FileStream(file,FileMode.Create,FileAccess.Write,FileShare.None)){
|
using(Stream stream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None)){
|
||||||
Formatter.Serialize(stream,this);
|
Formatter.Serialize(stream, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Program.HandleException("Could not save the configuration file.",e);
|
Program.HandleException("Could not save the configuration file.", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,7 +198,7 @@ namespace TweetDck.Configuration{
|
|||||||
|
|
||||||
for(int attempt = 0; attempt < 2; attempt++){
|
for(int attempt = 0; attempt < 2; attempt++){
|
||||||
try{
|
try{
|
||||||
using(Stream stream = new FileStream(attempt == 0 ? file : GetBackupFile(file),FileMode.Open,FileAccess.Read,FileShare.Read)){
|
using(Stream stream = new FileStream(attempt == 0 ? file : GetBackupFile(file), FileMode.Open, FileAccess.Read, FileShare.Read)){
|
||||||
if ((config = Formatter.Deserialize(stream) as UserConfig) != null){
|
if ((config = Formatter.Deserialize(stream) as UserConfig) != null){
|
||||||
config.file = file;
|
config.file = file;
|
||||||
}
|
}
|
||||||
@@ -178,7 +211,7 @@ namespace TweetDck.Configuration{
|
|||||||
break;
|
break;
|
||||||
}catch(FileNotFoundException){
|
}catch(FileNotFoundException){
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Program.HandleException("Could not open the configuration file.",e);
|
Program.HandleException("Could not open the configuration file.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,13 +225,13 @@ namespace TweetDck.Configuration{
|
|||||||
private class SerializationCompatibilityHandler : SerializationBinder{
|
private class SerializationCompatibilityHandler : SerializationBinder{
|
||||||
public override Type BindToType(string assemblyName, string typeName){
|
public override Type BindToType(string assemblyName, string typeName){
|
||||||
#if DUCK
|
#if DUCK
|
||||||
assemblyName = assemblyName.Replace("TweetDick","TweetDuck");
|
assemblyName = assemblyName.Replace("TweetDick", "TweetDuck");
|
||||||
#else
|
#else
|
||||||
assemblyName = assemblyName.Replace("TweetDuck","TweetDick");
|
assemblyName = assemblyName.Replace("TweetDuck", "TweetDick");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typeName = typeName.Replace("TweetDick","TweetDck");
|
typeName = typeName.Replace("TweetDick", "TweetDck");
|
||||||
return Type.GetType(string.Format(CultureInfo.CurrentCulture,"{0}, {1}",typeName,assemblyName));
|
return Type.GetType(string.Format(CultureInfo.CurrentCulture, "{0}, {1}", typeName, assemblyName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ namespace TweetDck.Core.Controls{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void MoveToCenter(this Form targetForm, Form parentForm){
|
public static void MoveToCenter(this Form targetForm, Form parentForm){
|
||||||
targetForm.Location = new Point(parentForm.Location.X+parentForm.Width/2-targetForm.Width/2,parentForm.Location.Y+parentForm.Height/2-targetForm.Height/2);
|
targetForm.Location = new Point(parentForm.Location.X+parentForm.Width/2-targetForm.Width/2, parentForm.Location.Y+parentForm.Height/2-targetForm.Height/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetValueInstant(this ProgressBar bar, int value){
|
public static void SetValueInstant(this ProgressBar bar, int value){
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2,21 +2,23 @@
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace TweetDck.Core.Controls{
|
namespace TweetDck.Core.Controls{
|
||||||
public partial class FlatProgressBar : ProgressBar{
|
sealed partial class FlatProgressBar : ProgressBar{
|
||||||
private SolidBrush brush;
|
private readonly SolidBrush brush;
|
||||||
|
|
||||||
public FlatProgressBar(){
|
public FlatProgressBar(){
|
||||||
SetStyle(ControlStyles.UserPaint,true);
|
brush = new SolidBrush(Color.White);
|
||||||
SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
|
|
||||||
|
SetStyle(ControlStyles.UserPaint, true);
|
||||||
|
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetValueInstant(int value){
|
public void SetValueInstant(int value){
|
||||||
ControlExtensions.SetValueInstant(this,value);
|
ControlExtensions.SetValueInstant(this, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -25,9 +27,11 @@ namespace TweetDck.Core.Controls{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool disposing){
|
protected override void Dispose(bool disposing){
|
||||||
if (brush != null)brush.Dispose();
|
|
||||||
|
|
||||||
base.Dispose(disposing);
|
base.Dispose(disposing);
|
||||||
|
|
||||||
|
if (disposing){
|
||||||
|
brush.Dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,19 +3,9 @@ using System.Drawing;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace TweetDck.Core.Controls{
|
namespace TweetDck.Core.Controls{
|
||||||
sealed partial class TabButton : Button{
|
sealed partial class TabButton : FlatButton{
|
||||||
protected override bool ShowFocusCues{
|
|
||||||
get{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action Callback { get; private set; }
|
public Action Callback { get; private set; }
|
||||||
|
|
||||||
public TabButton(){
|
|
||||||
GotFocus += TabButton_GotFocus;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetupButton(int locationX, int sizeWidth, string title, Action callback){
|
public void SetupButton(int locationX, int sizeWidth, string title, Action callback){
|
||||||
Callback = callback;
|
Callback = callback;
|
||||||
|
|
||||||
@@ -24,16 +14,12 @@ namespace TweetDck.Core.Controls{
|
|||||||
FlatAppearance.MouseDownBackColor = Color.White;
|
FlatAppearance.MouseDownBackColor = Color.White;
|
||||||
FlatAppearance.MouseOverBackColor = Color.White;
|
FlatAppearance.MouseOverBackColor = Color.White;
|
||||||
FlatStyle = FlatStyle.Flat;
|
FlatStyle = FlatStyle.Flat;
|
||||||
Location = new Point(locationX,0);
|
Location = new Point(locationX, 0);
|
||||||
Margin = new Padding(0);
|
Margin = new Padding(0);
|
||||||
Size = new Size(sizeWidth,30);
|
Size = new Size(sizeWidth, 30);
|
||||||
Text = title;
|
Text = title;
|
||||||
UseVisualStyleBackColor = true;
|
UseVisualStyleBackColor = true;
|
||||||
ResumeLayout(true);
|
ResumeLayout(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TabButton_GotFocus(object sender, EventArgs e){ // removes extra border when focused
|
|
||||||
NotifyDefault(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ namespace TweetDck.Core.Controls{
|
|||||||
|
|
||||||
public TabButton AddButton(string title, Action callback){
|
public TabButton AddButton(string title, Action callback){
|
||||||
TabButton button = new TabButton();
|
TabButton button = new TabButton();
|
||||||
button.SetupButton((btnWidth-1)*panelButtons.Controls.Count,btnWidth,title,callback);
|
button.SetupButton((btnWidth-1)*panelButtons.Controls.Count, btnWidth, title, callback);
|
||||||
button.Click += (sender, args) => SelectTab((TabButton)sender);
|
button.Click += (sender, args) => SelectTab((TabButton)sender);
|
||||||
|
|
||||||
panelButtons.Controls.Add(button);
|
panelButtons.Controls.Add(button);
|
||||||
|
4
Core/FormBrowser.Designer.cs
generated
4
Core/FormBrowser.Designer.cs
generated
@@ -24,7 +24,6 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBrowser));
|
|
||||||
this.trayIcon = new TweetDck.Core.TrayIcon();
|
this.trayIcon = new TweetDck.Core.TrayIcon();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@@ -38,11 +37,12 @@
|
|||||||
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(324, 386);
|
this.ClientSize = new System.Drawing.Size(324, 386);
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = Properties.Resources.icon;
|
||||||
this.Location = new System.Drawing.Point(-32000, -32000);
|
this.Location = new System.Drawing.Point(-32000, -32000);
|
||||||
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);
|
||||||
|
@@ -54,7 +54,8 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
this.browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
this.browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
||||||
this.browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
this.browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||||
this.browser.RegisterJsObject("$TD",new TweetDeckBridge(this,notification));
|
this.browser.RegisterJsObject("$TD", new TweetDeckBridge(this, notification));
|
||||||
|
this.browser.RegisterAsyncJsObject("$TDP", plugins.Bridge);
|
||||||
|
|
||||||
Controls.Add(browser);
|
Controls.Add(browser);
|
||||||
|
|
||||||
@@ -66,13 +67,13 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
UpdateTrayIcon();
|
UpdateTrayIcon();
|
||||||
|
|
||||||
this.updates = new UpdateHandler(browser,this);
|
this.updates = new UpdateHandler(browser, this);
|
||||||
this.updates.UpdateAccepted += updates_UpdateAccepted;
|
this.updates.UpdateAccepted += updates_UpdateAccepted;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowChildForm(Form form){
|
private void ShowChildForm(Form form){
|
||||||
form.Show(this);
|
form.Show(this);
|
||||||
form.MoveToCenter(this);
|
form.Shown += (sender, args) => form.MoveToCenter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ForceClose(){
|
private void ForceClose(){
|
||||||
@@ -81,19 +82,19 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FormNotification CreateNotificationForm(bool autoHide){
|
public FormNotification CreateNotificationForm(bool autoHide){
|
||||||
return new FormNotification(this,plugins,trayIcon,autoHide);
|
return new FormNotification(this, plugins, autoHide);
|
||||||
}
|
}
|
||||||
|
|
||||||
// window setup
|
// window setup
|
||||||
|
|
||||||
private void SetupWindow(){
|
private void SetupWindow(){
|
||||||
Config.BrowserWindow.Restore(this,true);
|
Config.BrowserWindow.Restore(this, true);
|
||||||
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
|
||||||
@@ -107,15 +108,22 @@ 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){
|
||||||
ScriptLoader.ExecuteFile(e.Frame,"code.js");
|
ScriptLoader.ExecuteFile(e.Frame, "code.js");
|
||||||
|
|
||||||
if (plugins.HasAnyPlugin(PluginEnvironment.Browser)){
|
if (plugins.HasAnyPlugin(PluginEnvironment.Browser)){
|
||||||
ScriptLoader.ExecuteFile(e.Frame,PluginManager.PluginBrowserScriptFile);
|
ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginBrowserScriptFile);
|
||||||
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Browser,true);
|
ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -123,12 +131,12 @@ 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
FormBrowser_ResizeEnd(sender,e);
|
FormBrowser_ResizeEnd(sender, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,7 +153,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;
|
||||||
}
|
}
|
||||||
@@ -174,11 +182,11 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
private void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
browser.ExecuteScriptAsync("window.location.reload()");
|
ReloadBrowser();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
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
|
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){
|
private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){
|
||||||
@@ -202,12 +210,12 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
if (isLoaded && m.Msg == Program.WindowRestoreMessage){
|
if (isLoaded && m.Msg == Program.WindowRestoreMessage){
|
||||||
trayIcon_ClickRestore(trayIcon,new EventArgs());
|
trayIcon_ClickRestore(trayIcon, new EventArgs());
|
||||||
return;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,7 +231,7 @@ namespace TweetDck.Core{
|
|||||||
else{
|
else{
|
||||||
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
||||||
|
|
||||||
currentFormSettings = new FormSettings(this,updates);
|
currentFormSettings = new FormSettings(this, plugins, updates);
|
||||||
|
|
||||||
currentFormSettings.FormClosed += (sender, args) => {
|
currentFormSettings.FormClosed += (sender, args) => {
|
||||||
currentFormSettings = null;
|
currentFormSettings = null;
|
||||||
@@ -233,6 +241,10 @@ namespace TweetDck.Core{
|
|||||||
Config.Save();
|
Config.Save();
|
||||||
updates.Check(false);
|
updates.Check(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Config.EnableTrayHighlight){
|
||||||
|
trayIcon.HasNotifications = false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ShowChildForm(currentFormSettings);
|
ShowChildForm(currentFormSettings);
|
||||||
@@ -261,8 +273,10 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTweetSound(){
|
public void OnTweetNotification(){
|
||||||
|
if (Config.EnableTrayHighlight && !ContainsFocus){
|
||||||
|
trayIcon.HasNotifications = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text){
|
public void DisplayTooltip(string text){
|
||||||
@@ -271,17 +285,21 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Point position = PointToClient(Cursor.Position);
|
Point position = PointToClient(Cursor.Position);
|
||||||
position.Offset(20,10);
|
position.Offset(20, 10);
|
||||||
toolTip.Show(text,this,position);
|
toolTip.Show(text, this, position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnImagePasted(){
|
public void OnImagePasted(){
|
||||||
browser.ExecuteScriptAsync("TDGF_tryPasteImage",new object[0]);
|
browser.ExecuteScriptAsync("TDGF_tryPasteImage", new object[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnImagePastedFinish(){
|
public void OnImagePastedFinish(){
|
||||||
browser.ExecuteScriptAsync("TDGF_tryPasteImageFinish",new object[0]);
|
browser.ExecuteScriptAsync("TDGF_tryPasteImageFinish", new object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReloadBrowser(){
|
||||||
|
browser.ExecuteScriptAsync("window.location.reload()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -117,267 +117,11 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<metadata name="trayIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>112, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<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">
|
<data name="trayIcon.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>
|
<value>17, 17</value>
|
||||||
AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
|
</data>
|
||||||
AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
<data name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHg5IrF+OlS+hjyMw4g7tcmM
|
<value>112, 17</value>
|
||||||
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>
|
</data>
|
||||||
</root>
|
</root>
|
@@ -21,12 +21,14 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private readonly Form owner;
|
private readonly Form owner;
|
||||||
private readonly PluginManager plugins;
|
private readonly PluginManager plugins;
|
||||||
private readonly TrayIcon trayIcon;
|
|
||||||
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 bool? prevDisplayTimer;
|
||||||
private int? prevFontSize;
|
private int? prevFontSize;
|
||||||
@@ -78,14 +80,13 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormNotification(FormBrowser owner, PluginManager plugins, 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.plugins = plugins;
|
this.plugins = pluginManager;
|
||||||
this.trayIcon = trayIcon;
|
|
||||||
this.autoHide = autoHide;
|
this.autoHide = autoHide;
|
||||||
|
|
||||||
owner.FormClosed += (sender, args) => Close();
|
owner.FormClosed += (sender, args) => Close();
|
||||||
@@ -94,13 +95,14 @@ namespace TweetDck.Core{
|
|||||||
pluginJS = ScriptLoader.LoadResource(PluginManager.PluginNotificationScriptFile);
|
pluginJS = ScriptLoader.LoadResource(PluginManager.PluginNotificationScriptFile);
|
||||||
|
|
||||||
browser = new ChromiumWebBrowser("about:blank"){
|
browser = new ChromiumWebBrowser("about:blank"){
|
||||||
MenuHandler = new ContextMenuNotification(this,autoHide),
|
MenuHandler = new ContextMenuNotification(this, autoHide),
|
||||||
LifeSpanHandler = new LifeSpanHandler()
|
LifeSpanHandler = new LifeSpanHandler()
|
||||||
};
|
};
|
||||||
|
|
||||||
browser.IsBrowserInitializedChanged += Browser_IsBrowserInitializedChanged;
|
browser.IsBrowserInitializedChanged += Browser_IsBrowserInitializedChanged;
|
||||||
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||||
browser.RegisterJsObject("$TD",new TweetDeckBridge(owner,this));
|
browser.RegisterJsObject("$TD", new TweetDeckBridge(owner, this));
|
||||||
|
browser.RegisterAsyncJsObject("$TDP", plugins.Bridge);
|
||||||
|
|
||||||
panelBrowser.Controls.Add(browser);
|
panelBrowser.Controls.Add(browser);
|
||||||
|
|
||||||
@@ -109,7 +111,9 @@ 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;
|
||||||
|
|
||||||
|
Disposed += FormNotification_Disposed;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
@@ -120,13 +124,42 @@ namespace TweetDck.Core{
|
|||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mouse wheel hook
|
||||||
|
|
||||||
|
private void StartMouseHook(){
|
||||||
|
if (mouseHook == IntPtr.Zero){
|
||||||
|
mouseHook = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MOUSE_LL, mouseHookDelegate, IntPtr.Zero, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StopMouseHook(){
|
||||||
|
if (mouseHook != IntPtr.Zero){
|
||||||
|
NativeMethods.UnhookWindowsHookEx(mouseHook);
|
||||||
|
mouseHook = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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(0, -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(1025.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();
|
||||||
@@ -137,37 +170,34 @@ namespace TweetDck.Core{
|
|||||||
if (Program.UserConfig.MuteNotifications){
|
if (Program.UserConfig.MuteNotifications){
|
||||||
HideNotification(true);
|
HideNotification(true);
|
||||||
}
|
}
|
||||||
else{
|
else if (tweetQueue.Count > 0){
|
||||||
if (tweetQueue.Count > 0){
|
LoadNextNotification();
|
||||||
LoadNextNotification();
|
|
||||||
}
|
|
||||||
|
|
||||||
trayIcon.HasNotifications = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Browser_IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs e){
|
private void Browser_IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs e){
|
||||||
if (e.IsBrowserInitialized && Initialized != null){
|
if (e.IsBrowserInitialized && Initialized != null){
|
||||||
Initialized(this,new EventArgs());
|
Initialized(this, new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
if (!e.Frame.IsMain)return;
|
if (!e.Frame.IsMain)return;
|
||||||
|
|
||||||
if (!isInitialized){
|
if (!isInitialized && !Program.UserConfig.NotificationLegacyLoad){
|
||||||
isInitialized = true;
|
isInitialized = true;
|
||||||
|
|
||||||
if (Initialized != null){
|
if (Initialized != null){
|
||||||
Initialized(this,new EventArgs());
|
Initialized(this, new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (notificationJS != null && browser.Address != "about:blank"){
|
else if (notificationJS != null && browser.Address != "about:blank"){
|
||||||
ScriptLoader.ExecuteScript(e.Frame,notificationJS,NotificationScriptIdentifier);
|
ScriptLoader.ExecuteScript(e.Frame, notificationJS, NotificationScriptIdentifier);
|
||||||
|
|
||||||
if (plugins.HasAnyPlugin(PluginEnvironment.Notification)){
|
if (plugins.HasAnyPlugin(PluginEnvironment.Notification)){
|
||||||
ScriptLoader.ExecuteScript(e.Frame,pluginJS,PluginScriptIdentifier);
|
ScriptLoader.ExecuteScript(e.Frame, pluginJS, PluginScriptIdentifier);
|
||||||
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Notification,false);
|
ScriptLoader.ExecuteFile(e.Frame, PluginManager.PluginGlobalScriptFile);
|
||||||
|
plugins.ExecutePlugins(e.Frame, PluginEnvironment.Notification, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -180,12 +210,16 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FormNotification_Disposed(object sender, EventArgs e){
|
||||||
|
browser.Dispose();
|
||||||
|
StopMouseHook();
|
||||||
|
}
|
||||||
|
|
||||||
// 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{
|
||||||
tweetQueue.Enqueue(notification);
|
tweetQueue.Enqueue(notification);
|
||||||
@@ -207,13 +241,15 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void HideNotification(bool loadBlank){
|
public void HideNotification(bool loadBlank){
|
||||||
if (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();
|
||||||
|
|
||||||
|
StopMouseHook();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnNotificationReady(){
|
public void OnNotificationReady(){
|
||||||
@@ -242,10 +278,14 @@ namespace TweetDck.Core{
|
|||||||
CurrentUrl = tweet.Url;
|
CurrentUrl = tweet.Url;
|
||||||
|
|
||||||
timerProgress.Stop();
|
timerProgress.Stop();
|
||||||
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDuration);
|
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDurationValue);
|
||||||
progressBarTimer.Value = 0;
|
progressBarTimer.Value = Program.UserConfig.NotificationTimerCountDown ? 1000 : 0;
|
||||||
|
|
||||||
browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/?"+DateTime.Now.Ticks);
|
browser.LoadHtml(tweet.GenerateHtml(), "http://tweetdeck.twitter.com/?"+DateTime.Now.Ticks);
|
||||||
|
|
||||||
|
if (Program.UserConfig.NotificationLegacyLoad){
|
||||||
|
OnNotificationReady();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MoveToVisibleLocation(){
|
private void MoveToVisibleLocation(){
|
||||||
@@ -255,11 +295,11 @@ namespace TweetDck.Core{
|
|||||||
RequiresResize = false;
|
RequiresResize = false;
|
||||||
|
|
||||||
if (config.DisplayNotificationTimer){
|
if (config.DisplayNotificationTimer){
|
||||||
ClientSize = new Size(BaseClientWidth,BaseClientHeight+4);
|
ClientSize = new Size(BaseClientWidth, BaseClientHeight+4);
|
||||||
progressBarTimer.Visible = true;
|
progressBarTimer.Visible = true;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
ClientSize = new Size(BaseClientWidth,BaseClientHeight);
|
ClientSize = new Size(BaseClientWidth, BaseClientHeight);
|
||||||
progressBarTimer.Visible = false;
|
progressBarTimer.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,24 +317,24 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
switch(config.NotificationPosition){
|
switch(config.NotificationPosition){
|
||||||
case TweetNotification.Position.TopLeft:
|
case TweetNotification.Position.TopLeft:
|
||||||
Location = new Point(screen.WorkingArea.X+edgeDist,screen.WorkingArea.Y+edgeDist);
|
Location = new Point(screen.WorkingArea.X+edgeDist, screen.WorkingArea.Y+edgeDist);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TweetNotification.Position.TopRight:
|
case TweetNotification.Position.TopRight:
|
||||||
Location = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width,screen.WorkingArea.Y+edgeDist);
|
Location = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+edgeDist);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TweetNotification.Position.BottomLeft:
|
case TweetNotification.Position.BottomLeft:
|
||||||
Location = new Point(screen.WorkingArea.X+edgeDist,screen.WorkingArea.Y+screen.WorkingArea.Height-edgeDist-Height);
|
Location = new Point(screen.WorkingArea.X+edgeDist, screen.WorkingArea.Y+screen.WorkingArea.Height-edgeDist-Height);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TweetNotification.Position.BottomRight:
|
case TweetNotification.Position.BottomRight:
|
||||||
Location = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width,screen.WorkingArea.Y+screen.WorkingArea.Height-edgeDist-Height);
|
Location = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+screen.WorkingArea.Height-edgeDist-Height);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TweetNotification.Position.Custom:
|
case TweetNotification.Position.Custom:
|
||||||
if (!config.IsCustomNotificationPositionSet){
|
if (!config.IsCustomNotificationPositionSet){
|
||||||
config.CustomNotificationPosition = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width,screen.WorkingArea.Y+edgeDist);
|
config.CustomNotificationPosition = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-edgeDist-Width, screen.WorkingArea.Y+edgeDist);
|
||||||
config.Save();
|
config.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,8 +343,10 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (needsReactivating){
|
if (needsReactivating){
|
||||||
NativeMethods.SetFormPos(this,NativeMethods.HWND_TOPMOST,NativeMethods.SWP_NOACTIVATE);
|
NativeMethods.SetFormPos(this, NativeMethods.HWND_TOPMOST, NativeMethods.SWP_NOACTIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StartMouseHook();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTitle(){
|
private void UpdateTitle(){
|
||||||
@@ -317,8 +359,8 @@ namespace TweetDck.Core{
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Point position = PointToClient(Cursor.Position);
|
Point position = PointToClient(Cursor.Position);
|
||||||
position.Offset(20,5);
|
position.Offset(20, 5);
|
||||||
toolTip.Show(text,this,position);
|
toolTip.Show(text, this, position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,38 +6,38 @@ using TweetDck.Core.Utils;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Handling{
|
namespace TweetDck.Core.Handling{
|
||||||
abstract class ContextMenuBase : IContextMenuHandler{
|
abstract class ContextMenuBase : IContextMenuHandler{
|
||||||
private const int MenuOpenUrlInBrowser = 26500;
|
private const int MenuOpenLinkUrl = 26500;
|
||||||
private const int MenuCopyUrl = 26501;
|
private const int MenuCopyLinkUrl = 26501;
|
||||||
private const int MenuOpenImageInBrowser = 26502;
|
private const int MenuOpenImage = 26502;
|
||||||
private const int MenuSaveImage = 26503;
|
private const int MenuSaveImage = 26503;
|
||||||
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/#",StringComparison.Ordinal)){
|
if (parameters.TypeFlags.HasFlag(ContextMenuType.Link) && !parameters.UnfilteredLinkUrl.EndsWith("tweetdeck.twitter.com/#", StringComparison.Ordinal)){
|
||||||
model.AddItem((CefMenuCommand)MenuOpenUrlInBrowser,"Open in browser");
|
model.AddItem((CefMenuCommand)MenuOpenLinkUrl, "Open link in browser");
|
||||||
model.AddItem((CefMenuCommand)MenuCopyUrl,"Copy link address");
|
model.AddItem((CefMenuCommand)MenuCopyLinkUrl, "Copy link address");
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents){
|
if (parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents){
|
||||||
model.AddItem((CefMenuCommand)MenuOpenImageInBrowser,"Open image in browser");
|
model.AddItem((CefMenuCommand)MenuOpenImage, "Open image in browser");
|
||||||
model.AddItem((CefMenuCommand)MenuSaveImage,"Save image as...");
|
model.AddItem((CefMenuCommand)MenuSaveImage, "Save image as...");
|
||||||
model.AddItem((CefMenuCommand)MenuCopyImageUrl,"Copy image URL");
|
model.AddItem((CefMenuCommand)MenuCopyImageUrl, "Copy image address");
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
||||||
switch((int)commandId){
|
switch((int)commandId){
|
||||||
case MenuOpenUrlInBrowser:
|
case MenuOpenLinkUrl:
|
||||||
BrowserUtils.OpenExternalBrowser(parameters.LinkUrl);
|
BrowserUtils.OpenExternalBrowser(parameters.LinkUrl);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuCopyUrl:
|
case MenuCopyLinkUrl:
|
||||||
Clipboard.SetText(string.IsNullOrEmpty(TweetDeckBridge.LastRightClickedLink) ? parameters.UnfilteredLinkUrl : TweetDeckBridge.LastRightClickedLink,TextDataFormat.UnicodeText);
|
Clipboard.SetText(string.IsNullOrEmpty(TweetDeckBridge.LastRightClickedLink) ? parameters.UnfilteredLinkUrl : TweetDeckBridge.LastRightClickedLink, TextDataFormat.UnicodeText);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuOpenImageInBrowser:
|
case MenuOpenImage:
|
||||||
BrowserUtils.OpenExternalBrowser(parameters.SourceUrl);
|
BrowserUtils.OpenExternalBrowser(parameters.SourceUrl);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -57,15 +57,15 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (saveTarget != null){
|
if (saveTarget != null){
|
||||||
BrowserUtils.DownloadFileAsync(parameters.SourceUrl,saveTarget,ex => {
|
BrowserUtils.DownloadFileAsync(parameters.SourceUrl, saveTarget, ex => {
|
||||||
MessageBox.Show("An error occurred while downloading the image: "+ex.Message,Program.BrandName+" Has Failed :(",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
MessageBox.Show("An error occurred while downloading the image: "+ex.Message, Program.BrandName+" Has Failed :(", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuCopyImageUrl:
|
case MenuCopyImageUrl:
|
||||||
Clipboard.SetText(parameters.SourceUrl,TextDataFormat.UnicodeText);
|
Clipboard.SetText(parameters.SourceUrl, TextDataFormat.UnicodeText);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,15 +84,21 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static void AddSeparator(IMenuModel model){
|
||||||
|
if (model.Count > 0 && model.GetTypeAt(model.Count-1) != MenuItemType.Separator){ // do not add separators if there is nothing to separate
|
||||||
|
model.AddSeparator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static string GetImageFileName(string url){
|
private static string GetImageFileName(string url){
|
||||||
// twimg adds a colon after file extension
|
// twimg adds a colon after file extension
|
||||||
int dot = url.LastIndexOf('.');
|
int dot = url.LastIndexOf('.');
|
||||||
|
|
||||||
if (dot != -1){
|
if (dot != -1){
|
||||||
int colon = url.IndexOf(':',dot);
|
int colon = url.IndexOf(':', dot);
|
||||||
|
|
||||||
if (colon != -1){
|
if (colon != -1){
|
||||||
url = url.Substring(0,colon);
|
url = url.Substring(0, colon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,15 +1,20 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDck.Core.Handling{
|
namespace TweetDck.Core.Handling{
|
||||||
class ContextMenuBrowser : ContextMenuBase{
|
class ContextMenuBrowser : ContextMenuBase{
|
||||||
private const int MenuSettings = 26600;
|
private const int MenuGlobal = 26600;
|
||||||
private const int MenuPlugins = 26005;
|
private const int MenuMute = 26601;
|
||||||
private const int MenuAbout = 26601;
|
private const int MenuSettings = 26602;
|
||||||
private const int MenuMute = 26602;
|
private const int MenuPlugins = 26003;
|
||||||
private const int MenuCopyTweetUrl = 26603;
|
private const int MenuAbout = 26604;
|
||||||
private const int MenuCopyTweetEmbeddedUrl = 26604;
|
|
||||||
|
private const int MenuOpenTweetUrl = 26610;
|
||||||
|
private const int MenuCopyTweetUrl = 26611;
|
||||||
|
private const int MenuOpenQuotedTweetUrl = 26612;
|
||||||
|
private const int MenuCopyQuotedTweetUrl = 26613;
|
||||||
|
|
||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
|
|
||||||
@@ -24,39 +29,47 @@ namespace TweetDck.Core.Handling{
|
|||||||
model.Remove(CefMenuCommand.ViewSource);
|
model.Remove(CefMenuCommand.ViewSource);
|
||||||
RemoveSeparatorIfLast(model);
|
RemoveSeparatorIfLast(model);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweet)){
|
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
||||||
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweetEmbedded)){
|
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweet) && (parameters.TypeFlags & (ContextMenuType.Editable | ContextMenuType.Selection)) == 0){
|
||||||
model.AddItem((CefMenuCommand)MenuCopyTweetEmbeddedUrl,"Copy quoted tweet address");
|
model.AddItem((CefMenuCommand)MenuOpenTweetUrl, "Open tweet in browser");
|
||||||
|
model.AddItem((CefMenuCommand)MenuCopyTweetUrl, "Copy tweet address");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedQuotedTweet)){
|
||||||
|
model.AddSeparator();
|
||||||
|
model.AddItem((CefMenuCommand)MenuOpenQuotedTweetUrl, "Open quoted tweet in browser");
|
||||||
|
model.AddItem((CefMenuCommand)MenuCopyQuotedTweetUrl, "Copy quoted tweet address");
|
||||||
}
|
}
|
||||||
|
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
base.OnBeforeContextMenu(browserControl,browser,frame,parameters,model);
|
if ((parameters.TypeFlags & (ContextMenuType.Editable | ContextMenuType.Selection)) == 0){
|
||||||
|
AddSeparator(model);
|
||||||
|
|
||||||
if (model.Count > 0){
|
IMenuModel globalMenu = model.Count == 0 ? model : model.AddSubMenu((CefMenuCommand)MenuGlobal, Program.BrandName);
|
||||||
RemoveSeparatorIfLast(model);
|
|
||||||
model.AddSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
model.AddItem(CefMenuCommand.Reload,"Reload");
|
globalMenu.AddItem(CefMenuCommand.Reload, "Reload browser");
|
||||||
model.AddCheckItem((CefMenuCommand)MenuMute,"Mute notifications");
|
globalMenu.AddCheckItem((CefMenuCommand)MenuMute, "Mute notifications");
|
||||||
model.SetChecked((CefMenuCommand)MenuMute,Program.UserConfig.MuteNotifications);
|
globalMenu.SetChecked((CefMenuCommand)MenuMute, Program.UserConfig.MuteNotifications);
|
||||||
model.AddSeparator();
|
globalMenu.AddSeparator();
|
||||||
|
|
||||||
model.AddItem((CefMenuCommand)MenuSettings,"Settings");
|
globalMenu.AddItem((CefMenuCommand)MenuSettings, "Settings");
|
||||||
model.AddItem((CefMenuCommand)MenuPlugins,"Plugins");
|
globalMenu.AddItem((CefMenuCommand)MenuPlugins, "Plugins");
|
||||||
model.AddItem((CefMenuCommand)MenuAbout,"About "+Program.BrandName);
|
globalMenu.AddItem((CefMenuCommand)MenuAbout, "About "+Program.BrandName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
||||||
if (base.OnContextMenuCommand(browserControl,browser,frame,parameters,commandId,eventFlags)){
|
if (base.OnContextMenuCommand(browserControl, browser, frame, parameters, commandId, eventFlags)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -77,12 +90,20 @@ namespace TweetDck.Core.Handling{
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyTweetUrl:
|
case MenuOpenTweetUrl:
|
||||||
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweet,TextDataFormat.UnicodeText);
|
BrowserUtils.OpenExternalBrowser(TweetDeckBridge.LastHighlightedTweet);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyTweetEmbeddedUrl:
|
case MenuCopyTweetUrl:
|
||||||
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweetEmbedded,TextDataFormat.UnicodeText);
|
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweet, TextDataFormat.UnicodeText);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case MenuOpenQuotedTweetUrl:
|
||||||
|
BrowserUtils.OpenExternalBrowser(TweetDeckBridge.LastHighlightedQuotedTweet);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case MenuCopyQuotedTweetUrl:
|
||||||
|
Clipboard.SetText(TweetDeckBridge.LastHighlightedQuotedTweet, TextDataFormat.UnicodeText);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,30 +21,30 @@ namespace TweetDck.Core.Handling{
|
|||||||
model.Clear();
|
model.Clear();
|
||||||
|
|
||||||
if (enableCustomMenu){
|
if (enableCustomMenu){
|
||||||
model.AddItem((CefMenuCommand)MenuSkipTweet,"Skip tweet");
|
model.AddItem((CefMenuCommand)MenuSkipTweet, "Skip tweet");
|
||||||
model.AddCheckItem((CefMenuCommand)MenuFreeze,"Freeze");
|
model.AddCheckItem((CefMenuCommand)MenuFreeze, "Freeze");
|
||||||
model.SetChecked((CefMenuCommand)MenuFreeze,form.FreezeTimer);
|
model.SetChecked((CefMenuCommand)MenuFreeze, form.FreezeTimer);
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
|
|
||||||
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)){
|
if (!string.IsNullOrEmpty(TweetDeckBridge.NotificationTweetEmbedded)){
|
||||||
model.AddItem((CefMenuCommand)MenuCopyTweetEmbeddedUrl,"Copy quoted tweet address");
|
model.AddItem((CefMenuCommand)MenuCopyTweetEmbeddedUrl, "Copy quoted tweet address");
|
||||||
}
|
}
|
||||||
|
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
base.OnBeforeContextMenu(browserControl,browser,frame,parameters,model);
|
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
||||||
RemoveSeparatorIfLast(model);
|
RemoveSeparatorIfLast(model);
|
||||||
|
|
||||||
form.InvokeSafe(() => form.ContextMenuOpen = true);
|
form.InvokeSafe(() => form.ContextMenuOpen = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
||||||
if (base.OnContextMenuCommand(browserControl,browser,frame,parameters,commandId,eventFlags)){
|
if (base.OnContextMenuCommand(browserControl, browser, frame, parameters, commandId, eventFlags)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,11 +58,11 @@ namespace TweetDck.Core.Handling{
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyTweetUrl:
|
case MenuCopyTweetUrl:
|
||||||
Clipboard.SetText(form.CurrentUrl,TextDataFormat.UnicodeText);
|
Clipboard.SetText(form.CurrentUrl, TextDataFormat.UnicodeText);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyTweetEmbeddedUrl:
|
case MenuCopyTweetEmbeddedUrl:
|
||||||
Clipboard.SetText(TweetDeckBridge.NotificationTweetEmbedded,TextDataFormat.UnicodeText);
|
Clipboard.SetText(TweetDeckBridge.NotificationTweetEmbedded, TextDataFormat.UnicodeText);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){
|
public override void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){
|
||||||
base.OnContextMenuDismissed(browserControl,browser,frame);
|
base.OnContextMenuDismissed(browserControl, browser, frame);
|
||||||
form.InvokeSafe(() => form.ContextMenuOpen = false);
|
form.InvokeSafe(() => form.ContextMenuOpen = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
|
|
||||||
public bool OnFileDialog(IWebBrowser browserControl, IBrowser browser, CefFileDialogMode mode, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback){
|
public bool OnFileDialog(IWebBrowser browserControl, IBrowser browser, CefFileDialogMode mode, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback){
|
||||||
if (!string.IsNullOrEmpty(TweetDeckBridge.ClipboardImagePath)){
|
if (!string.IsNullOrEmpty(TweetDeckBridge.ClipboardImagePath)){
|
||||||
callback.Continue(selectedAcceptFilter,new List<string>{ TweetDeckBridge.ClipboardImagePath });
|
callback.Continue(selectedAcceptFilter, new List<string>{ TweetDeckBridge.ClipboardImagePath });
|
||||||
|
|
||||||
form.InvokeSafe(() => {
|
form.InvokeSafe(() => {
|
||||||
TweetDeckBridge.ClipboardImagePath = string.Empty;
|
TweetDeckBridge.ClipboardImagePath = string.Empty;
|
||||||
|
@@ -10,7 +10,7 @@ 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 LastHighlightedQuotedTweet = string.Empty;
|
||||||
public static string NotificationTweetEmbedded = string.Empty;
|
public static string NotificationTweetEmbedded = string.Empty;
|
||||||
public static string ClipboardImagePath = string.Empty;
|
public static string ClipboardImagePath = string.Empty;
|
||||||
|
|
||||||
@@ -41,6 +41,18 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasCustomBrowserCSS{
|
||||||
|
get{
|
||||||
|
return !string.IsNullOrEmpty(Program.UserConfig.CustomBrowserCSS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CustomBrowserCSS{
|
||||||
|
get{
|
||||||
|
return Program.UserConfig.CustomBrowserCSS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public TweetDeckBridge(FormBrowser form, FormNotification notification){
|
public TweetDeckBridge(FormBrowser form, FormNotification notification){
|
||||||
this.form = form;
|
this.form = form;
|
||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
@@ -62,10 +74,10 @@ namespace TweetDck.Core.Handling{
|
|||||||
form.InvokeSafe(() => LastRightClickedLink = link);
|
form.InvokeSafe(() => LastRightClickedLink = link);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetLastHighlightedTweet(string link, string embeddedLink){
|
public void SetLastHighlightedTweet(string link, string quotedLink){
|
||||||
form.InvokeSafe(() => {
|
form.InvokeSafe(() => {
|
||||||
LastHighlightedTweet = link;
|
LastHighlightedTweet = link;
|
||||||
LastHighlightedTweetEmbedded = embeddedLink;
|
LastHighlightedQuotedTweet = quotedLink;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,16 +95,19 @@ namespace TweetDck.Core.Handling{
|
|||||||
|
|
||||||
public void OnTweetPopup(string tweetHtml, string tweetUrl, int tweetCharacters){
|
public void OnTweetPopup(string tweetHtml, string tweetUrl, int tweetCharacters){
|
||||||
notification.InvokeSafe(() => {
|
notification.InvokeSafe(() => {
|
||||||
notification.ShowNotification(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 OnNotificationReady(){
|
public void OnNotificationReady(){
|
||||||
notification.InvokeSafe(notification.OnNotificationReady);
|
if (!Program.UserConfig.NotificationLegacyLoad){
|
||||||
|
notification.InvokeSafe(notification.OnNotificationReady);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text, bool showInNotification){
|
public void DisplayTooltip(string text, bool showInNotification){
|
||||||
@@ -113,12 +128,12 @@ namespace TweetDck.Core.Handling{
|
|||||||
try{
|
try{
|
||||||
Directory.CreateDirectory(Program.TemporaryPath);
|
Directory.CreateDirectory(Program.TemporaryPath);
|
||||||
|
|
||||||
ClipboardImagePath = Path.Combine(Program.TemporaryPath,"TD-Img-"+DateTime.Now.Ticks+".png");
|
ClipboardImagePath = Path.Combine(Program.TemporaryPath, "TD-Img-"+DateTime.Now.Ticks+".png");
|
||||||
img.Save(ClipboardImagePath,ImageFormat.Png);
|
img.Save(ClipboardImagePath, ImageFormat.Png);
|
||||||
|
|
||||||
form.OnImagePasted();
|
form.OnImagePasted();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Program.HandleException("Could not paste image from clipboard.",e);
|
Program.HandleException("Could not paste image from clipboard.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -128,7 +143,7 @@ namespace TweetDck.Core.Handling{
|
|||||||
form.InvokeSafe(() => {
|
form.InvokeSafe(() => {
|
||||||
Point prevPos = Cursor.Position;
|
Point prevPos = Cursor.Position;
|
||||||
|
|
||||||
Cursor.Position = form.PointToScreen(new Point(offsetX,offsetY));
|
Cursor.Position = form.PointToScreen(new Point(offsetX, offsetY));
|
||||||
NativeMethods.SimulateMouseClick(NativeMethods.MouseButton.Left);
|
NativeMethods.SimulateMouseClick(NativeMethods.MouseButton.Left);
|
||||||
Cursor.Position = prevPos;
|
Cursor.Position = prevPos;
|
||||||
|
|
||||||
@@ -140,6 +155,19 @@ namespace TweetDck.Core.Handling{
|
|||||||
BrowserUtils.OpenExternalBrowser(url);
|
BrowserUtils.OpenExternalBrowser(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Alert(string type, string contents){
|
||||||
|
MessageBoxIcon icon;
|
||||||
|
|
||||||
|
switch(type){
|
||||||
|
case "error": icon = MessageBoxIcon.Error; break;
|
||||||
|
case "warning": icon = MessageBoxIcon.Warning; break;
|
||||||
|
case "info": icon = MessageBoxIcon.Information; break;
|
||||||
|
default: icon = MessageBoxIcon.None; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageBox.Show(contents, Program.BrandName+" Browser Message", MessageBoxButtons.OK, icon);
|
||||||
|
}
|
||||||
|
|
||||||
public void Log(string data){
|
public void Log(string data){
|
||||||
System.Diagnostics.Debug.WriteLine(data);
|
System.Diagnostics.Debug.WriteLine(data);
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,12 @@ namespace TweetDck.Core.Handling{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static int FontSizeLevel{
|
public static int FontSizeLevel{
|
||||||
get{
|
get{
|
||||||
switch(FontSizeClass){
|
switch(FontSizeClass){
|
||||||
@@ -37,14 +43,19 @@ namespace TweetDck.Core.Handling{
|
|||||||
build.Append(@"<header class='tweet-header'>");
|
build.Append(@"<header class='tweet-header'>");
|
||||||
build.Append(@"<time class='tweet-timestamp js-timestamp pull-right txt-mute'><a target='_blank' rel='url' href='https://twitter.com/chylexmc' class='txt-small'>0s</a></time>");
|
build.Append(@"<time class='tweet-timestamp js-timestamp pull-right txt-mute'><a target='_blank' rel='url' href='https://twitter.com/chylexmc' class='txt-small'>0s</a></time>");
|
||||||
build.Append(@"<a target='_blank' rel='user' href='https://twitter.com/chylexmc' class='account-link link-complex block'>");
|
build.Append(@"<a target='_blank' rel='user' href='https://twitter.com/chylexmc' class='account-link link-complex block'>");
|
||||||
build.Append(@"<div class='obj-left item-img tweet-img'><img width='48' height='48' alt='chylexmc's avatar' src='https://pbs.twimg.com/profile_images/645532929930608642/J56NBJVY_normal.png' class='tweet-avatar avatar pull-right'></div>");
|
build.Append(@"<div class='obj-left item-img tweet-img'><img width='48' height='48' alt='chylexmc's avatar' src='https://pbs.twimg.com/profile_images/765161905312980992/AhDP9iY-_normal.jpg' class='tweet-avatar avatar pull-right'></div>");
|
||||||
build.Append(@"<div class='nbfc'><span class='account-inline txt-ellipsis'><b class='fullname link-complex-target'>chylex</b> <span class='username txt-mute'>@chylexmc</span></span></div>");
|
build.Append(@"<div class='nbfc'><span class='account-inline txt-ellipsis'><b class='fullname link-complex-target'>chylex</b> <span class='username txt-mute'>@chylexmc</span></span></div>");
|
||||||
build.Append(@"</a>");
|
build.Append(@"</a>");
|
||||||
build.Append(@"</header>");
|
build.Append(@"</header>");
|
||||||
build.Append(@"<div class='tweet-body'><p class='js-tweet-text tweet-text with-linebreaks'>This is an example tweet, which lets you test the location and duration of popup notifications.</p></div>");
|
build.Append(@"<div class='tweet-body'><p class='js-tweet-text tweet-text with-linebreaks'>This is an example tweet, which lets you test the location and duration of popup notifications.</p></div>");
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
build.Append(@"<div style='margin-top:64px'>Scrollbar test padding...</div>");
|
||||||
|
#endif
|
||||||
|
|
||||||
build.Append(@"</div></div></article>");
|
build.Append(@"</div></div></article>");
|
||||||
|
|
||||||
return new TweetNotification(build.ToString(),"",95);
|
return new TweetNotification(build.ToString(), "", 95);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,24 +91,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 ?? DefaultFontSizeClass).Append("'>");
|
build.Append("<html class='os-windows txt-base-").Append(FontSizeClass ?? DefaultFontSizeClass).Append("'>");
|
||||||
build.Append("<head>").Append(HeadTag ?? DefaultHeadTag).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>");
|
||||||
|
@@ -13,9 +13,9 @@ namespace TweetDck.Core.Other{
|
|||||||
|
|
||||||
labelDescription.Text = Program.BrandName+" was created by chylex as a replacement to the discontinued official TweetDeck client for Windows.\n\nThe program is available for free under the open source MIT license.";
|
labelDescription.Text = Program.BrandName+" was created by chylex as a replacement to the discontinued official TweetDeck client for Windows.\n\nThe program is available for free under the open source MIT license.";
|
||||||
|
|
||||||
labelWebsite.Links.Add(new LinkLabel.Link(0,labelWebsite.Text.Length,Program.Website));
|
labelWebsite.Links.Add(new LinkLabel.Link(0, labelWebsite.Text.Length, Program.Website));
|
||||||
labelSourceCode.Links.Add(new LinkLabel.Link(0,labelSourceCode.Text.Length,GitHubLink));
|
labelSourceCode.Links.Add(new LinkLabel.Link(0, labelSourceCode.Text.Length, GitHubLink));
|
||||||
labelIssues.Links.Add(new LinkLabel.Link(0,labelIssues.Text.Length,IssuesLink));
|
labelIssues.Links.Add(new LinkLabel.Link(0, labelIssues.Text.Length, IssuesLink));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e){
|
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e){
|
||||||
|
6
Core/Other/FormPlugins.Designer.cs
generated
6
Core/Other/FormPlugins.Designer.cs
generated
@@ -23,7 +23,6 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPlugins));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
this.btnClose = new System.Windows.Forms.Button();
|
||||||
this.btnReload = new System.Windows.Forms.Button();
|
this.btnReload = new System.Windows.Forms.Button();
|
||||||
this.btnOpenFolder = new System.Windows.Forms.Button();
|
this.btnOpenFolder = new System.Windows.Forms.Button();
|
||||||
@@ -69,7 +68,7 @@
|
|||||||
this.btnOpenFolder.UseVisualStyleBackColor = true;
|
this.btnOpenFolder.UseVisualStyleBackColor = true;
|
||||||
this.btnOpenFolder.Click += new System.EventHandler(this.btnOpenFolder_Click);
|
this.btnOpenFolder.Click += new System.EventHandler(this.btnOpenFolder_Click);
|
||||||
//
|
//
|
||||||
// pluginList
|
// tabPanelPlugins
|
||||||
//
|
//
|
||||||
this.tabPanelPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
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.Left)
|
||||||
@@ -88,11 +87,10 @@
|
|||||||
this.Controls.Add(this.btnOpenFolder);
|
this.Controls.Add(this.btnOpenFolder);
|
||||||
this.Controls.Add(this.btnReload);
|
this.Controls.Add(this.btnReload);
|
||||||
this.Controls.Add(this.btnClose);
|
this.Controls.Add(this.btnClose);
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = global::TweetDck.Properties.Resources.icon;
|
||||||
this.MinimumSize = new System.Drawing.Size(480, 320);
|
this.MinimumSize = new System.Drawing.Size(480, 320);
|
||||||
this.Name = "FormPlugins";
|
this.Name = "FormPlugins";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.Text = "Plugins";
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
this.PerformLayout();
|
||||||
|
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
using TweetDck.Plugins;
|
using TweetDck.Plugins;
|
||||||
@@ -7,7 +9,7 @@ using TweetDck.Plugins.Controls;
|
|||||||
using TweetDck.Plugins.Events;
|
using TweetDck.Plugins.Events;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other{
|
namespace TweetDck.Core.Other{
|
||||||
partial class FormPlugins : Form{
|
sealed partial class FormPlugins : Form{
|
||||||
private readonly PluginManager pluginManager;
|
private readonly PluginManager pluginManager;
|
||||||
private readonly TabButton tabBtnOfficial, tabBtnCustom;
|
private readonly TabButton tabBtnOfficial, tabBtnCustom;
|
||||||
private readonly PluginListFlowLayout flowLayoutPlugins;
|
private readonly PluginListFlowLayout flowLayoutPlugins;
|
||||||
@@ -16,6 +18,8 @@ namespace TweetDck.Core.Other{
|
|||||||
|
|
||||||
public FormPlugins(){
|
public FormPlugins(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
Text = Program.BrandName+" Plugins";
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormPlugins(PluginManager pluginManager) : this(){
|
public FormPlugins(PluginManager pluginManager) : this(){
|
||||||
@@ -28,14 +32,14 @@ namespace TweetDck.Core.Other{
|
|||||||
this.tabPanelPlugins.SetupTabPanel(90);
|
this.tabPanelPlugins.SetupTabPanel(90);
|
||||||
this.tabPanelPlugins.ReplaceContent(flowLayoutPlugins);
|
this.tabPanelPlugins.ReplaceContent(flowLayoutPlugins);
|
||||||
|
|
||||||
this.tabBtnOfficial = tabPanelPlugins.AddButton("",() => SelectGroup(PluginGroup.Official));
|
this.tabBtnOfficial = tabPanelPlugins.AddButton("", () => SelectGroup(PluginGroup.Official));
|
||||||
this.tabBtnCustom = tabPanelPlugins.AddButton("",() => SelectGroup(PluginGroup.Custom));
|
this.tabBtnCustom = tabPanelPlugins.AddButton("", () => SelectGroup(PluginGroup.Custom));
|
||||||
|
|
||||||
this.tabPanelPlugins.SelectTab(tabBtnOfficial);
|
this.tabPanelPlugins.SelectTab(tabBtnOfficial);
|
||||||
this.pluginManager_Reloaded(pluginManager,null);
|
this.pluginManager_Reloaded(pluginManager, null);
|
||||||
|
|
||||||
Shown += (sender, args) => {
|
Shown += (sender, args) => {
|
||||||
Program.UserConfig.PluginsWindow.Restore(this,false);
|
Program.UserConfig.PluginsWindow.Restore(this, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
FormClosed += (sender, args) => {
|
FormClosed += (sender, args) => {
|
||||||
@@ -58,11 +62,20 @@ namespace TweetDck.Core.Other{
|
|||||||
flowLayoutPlugins.SuspendLayout();
|
flowLayoutPlugins.SuspendLayout();
|
||||||
flowLayoutPlugins.Controls.Clear();
|
flowLayoutPlugins.Controls.Clear();
|
||||||
|
|
||||||
foreach(Plugin plugin in pluginManager.GetPluginsByGroup(selectedGroup.Value)){
|
Plugin[] plugins = pluginManager.GetPluginsByGroup(selectedGroup.Value).OrderBy(plugin => !plugin.CanRun ? 0 : pluginManager.Config.IsEnabled(plugin) ? 1 : 2).ThenBy(plugin => plugin.Name).ToArray();
|
||||||
flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager,plugin));
|
|
||||||
|
for(int index = 0; index < plugins.Length; index++){
|
||||||
|
flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager, plugins[index]));
|
||||||
|
|
||||||
|
if (index < plugins.Length-1){
|
||||||
|
flowLayoutPlugins.Controls.Add(new Panel{
|
||||||
|
BackColor = Color.DimGray,
|
||||||
|
Size = new Size(1, 1)
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flowLayoutPlugins_Resize(flowLayoutPlugins,new EventArgs());
|
flowLayoutPlugins_Resize(flowLayoutPlugins, new EventArgs());
|
||||||
flowLayoutPlugins.ResumeLayout(true);
|
flowLayoutPlugins.ResumeLayout(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,20 +85,33 @@ namespace TweetDck.Core.Other{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void flowLayoutPlugins_Resize(object sender, EventArgs e){
|
private void flowLayoutPlugins_Resize(object sender, EventArgs e){
|
||||||
int horizontalOffset = 8+(flowLayoutPlugins.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
|
if (flowLayoutPlugins.Controls.Count == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Control lastControl = flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1];
|
||||||
|
bool showScrollBar = lastControl.Location.Y+lastControl.Height >= flowLayoutPlugins.Height;
|
||||||
|
int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
|
||||||
|
|
||||||
|
flowLayoutPlugins.AutoScroll = showScrollBar;
|
||||||
|
flowLayoutPlugins.VerticalScroll.Visible = showScrollBar;
|
||||||
|
|
||||||
foreach(Control control in flowLayoutPlugins.Controls){
|
foreach(Control control in flowLayoutPlugins.Controls){
|
||||||
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
|
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flowLayoutPlugins.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenFolder_Click(object sender, EventArgs e){
|
private void btnOpenFolder_Click(object sender, EventArgs e){
|
||||||
using(Process.Start("explorer.exe","\""+pluginManager.PathCustomPlugins+"\"")){}
|
using(Process.Start("explorer.exe", "\""+pluginManager.PathCustomPlugins+"\"")){}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnReload_Click(object sender, EventArgs e){
|
private void btnReload_Click(object sender, EventArgs e){
|
||||||
pluginManager.Reload();
|
if (MessageBox.Show("This will also reload the browser window. Do you want to proceed?", "Reloading Plugins", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
ReloadPluginTab();
|
pluginManager.Reload();
|
||||||
|
ReloadPluginTab();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e){
|
private void btnClose_Click(object sender, EventArgs e){
|
||||||
|
@@ -117,261 +117,4 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</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>
|
</root>
|
77
Core/Other/FormSettings.Designer.cs
generated
77
Core/Other/FormSettings.Designer.cs
generated
@@ -23,24 +23,11 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSettings));
|
|
||||||
this.tabPanel = new TweetDck.Core.Controls.TabPanel();
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
this.btnClose = new System.Windows.Forms.Button();
|
||||||
this.btnExport = new System.Windows.Forms.Button();
|
this.labelTip = new System.Windows.Forms.Label();
|
||||||
this.btnImport = new System.Windows.Forms.Button();
|
this.tabPanel = new TweetDck.Core.Controls.TabPanel();
|
||||||
this.btnReset = new System.Windows.Forms.Button();
|
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// 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.Right)));
|
|
||||||
this.tabPanel.Location = new System.Drawing.Point(12, 12);
|
|
||||||
this.tabPanel.Name = "tabPanel";
|
|
||||||
this.tabPanel.Size = new System.Drawing.Size(480, 313);
|
|
||||||
this.tabPanel.TabIndex = 3;
|
|
||||||
//
|
|
||||||
// btnClose
|
// btnClose
|
||||||
//
|
//
|
||||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
@@ -54,57 +41,35 @@
|
|||||||
this.btnClose.UseVisualStyleBackColor = true;
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||||
//
|
//
|
||||||
// btnExport
|
// labelTip
|
||||||
//
|
//
|
||||||
this.btnExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.labelTip.AutoSize = true;
|
||||||
this.btnExport.AutoSize = true;
|
this.labelTip.Location = new System.Drawing.Point(12, 333);
|
||||||
this.btnExport.Location = new System.Drawing.Point(12, 331);
|
this.labelTip.Name = "labelTip";
|
||||||
this.btnExport.Name = "btnExport";
|
this.labelTip.Size = new System.Drawing.Size(310, 13);
|
||||||
this.btnExport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.labelTip.TabIndex = 5;
|
||||||
this.btnExport.Size = new System.Drawing.Size(94, 23);
|
this.labelTip.Text = "Tip: Move your cursor over an option to see detailed explanation";
|
||||||
this.btnExport.TabIndex = 5;
|
|
||||||
this.btnExport.Text = "Export Settings";
|
|
||||||
this.btnExport.UseVisualStyleBackColor = true;
|
|
||||||
this.btnExport.Click += new System.EventHandler(this.btnExport_Click);
|
|
||||||
//
|
//
|
||||||
// btnImport
|
// tabPanel
|
||||||
//
|
//
|
||||||
this.btnImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.tabPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
this.btnImport.AutoSize = true;
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
this.btnImport.Location = new System.Drawing.Point(112, 331);
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnImport.Name = "btnImport";
|
this.tabPanel.Location = new System.Drawing.Point(12, 12);
|
||||||
this.btnImport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.tabPanel.Name = "tabPanel";
|
||||||
this.btnImport.Size = new System.Drawing.Size(94, 23);
|
this.tabPanel.Size = new System.Drawing.Size(480, 313);
|
||||||
this.btnImport.TabIndex = 6;
|
this.tabPanel.TabIndex = 3;
|
||||||
this.btnImport.Text = "Import Settings";
|
|
||||||
this.btnImport.UseVisualStyleBackColor = true;
|
|
||||||
this.btnImport.Click += new System.EventHandler(this.btnImport_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(212, 331);
|
|
||||||
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 = 7;
|
|
||||||
this.btnReset.Text = "Restore Defaults";
|
|
||||||
this.btnReset.UseVisualStyleBackColor = true;
|
|
||||||
this.btnReset.Click += new System.EventHandler(this.btnReset_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(504, 366);
|
this.ClientSize = new System.Drawing.Size(504, 366);
|
||||||
this.Controls.Add(this.btnReset);
|
this.Controls.Add(this.labelTip);
|
||||||
this.Controls.Add(this.btnImport);
|
|
||||||
this.Controls.Add(this.btnExport);
|
|
||||||
this.Controls.Add(this.btnClose);
|
this.Controls.Add(this.btnClose);
|
||||||
this.Controls.Add(this.tabPanel);
|
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 = Properties.Resources.icon;
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
this.MinimizeBox = false;
|
this.MinimizeBox = false;
|
||||||
this.Name = "FormSettings";
|
this.Name = "FormSettings";
|
||||||
@@ -119,8 +84,6 @@
|
|||||||
|
|
||||||
private Controls.TabPanel tabPanel;
|
private Controls.TabPanel tabPanel;
|
||||||
private System.Windows.Forms.Button btnClose;
|
private System.Windows.Forms.Button btnClose;
|
||||||
private System.Windows.Forms.Button btnExport;
|
private System.Windows.Forms.Label labelTip;
|
||||||
private System.Windows.Forms.Button btnImport;
|
|
||||||
private System.Windows.Forms.Button btnReset;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -3,23 +3,23 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Other.Settings;
|
using TweetDck.Core.Other.Settings;
|
||||||
using TweetDck.Core.Other.Settings.Export;
|
using TweetDck.Plugins;
|
||||||
using TweetDck.Updates;
|
using TweetDck.Updates;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other{
|
namespace TweetDck.Core.Other{
|
||||||
sealed partial class FormSettings : Form{
|
sealed partial class FormSettings : Form{
|
||||||
private readonly Dictionary<Type,BaseTabSettings> tabs = new Dictionary<Type,BaseTabSettings>(4);
|
private readonly Dictionary<Type, BaseTabSettings> tabs = new Dictionary<Type, BaseTabSettings>(4);
|
||||||
|
|
||||||
public FormSettings(FormBrowser browserForm, UpdateHandler updates){
|
public FormSettings(FormBrowser browserForm, PluginManager plugins, UpdateHandler updates){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName+" Settings";
|
Text = Program.BrandName+" Settings";
|
||||||
|
|
||||||
this.tabPanel.SetupTabPanel(100);
|
this.tabPanel.SetupTabPanel(100);
|
||||||
this.tabPanel.AddButton("General",SelectTab<TabSettingsGeneral>);
|
this.tabPanel.AddButton("General", SelectTab<TabSettingsGeneral>);
|
||||||
this.tabPanel.AddButton("Notifications",() => SelectTab(() => new TabSettingsNotifications(browserForm.CreateNotificationForm(false))));
|
this.tabPanel.AddButton("Notifications", () => SelectTab(() => new TabSettingsNotifications(browserForm.CreateNotificationForm(false))));
|
||||||
this.tabPanel.AddButton("Updates",() => SelectTab(() => new TabSettingsUpdates(updates)));
|
this.tabPanel.AddButton("Updates", () => SelectTab(() => new TabSettingsUpdates(updates)));
|
||||||
this.tabPanel.AddButton("Advanced",SelectTab<TabSettingsAdvanced>);
|
this.tabPanel.AddButton("Advanced", () => SelectTab(() => new TabSettingsAdvanced(browserForm.ReloadBrowser, plugins)));
|
||||||
this.tabPanel.SelectTab(tabPanel.Buttons.First());
|
this.tabPanel.SelectTab(tabPanel.Buttons.First());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ namespace TweetDck.Core.Other{
|
|||||||
private void SelectTab<T>(Func<T> constructor) where T : BaseTabSettings{
|
private void SelectTab<T>(Func<T> constructor) where T : BaseTabSettings{
|
||||||
BaseTabSettings control;
|
BaseTabSettings control;
|
||||||
|
|
||||||
if (tabs.TryGetValue(typeof(T),out control)){
|
if (tabs.TryGetValue(typeof(T), out control)){
|
||||||
tabPanel.ReplaceContent(control);
|
tabPanel.ReplaceContent(control);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -42,66 +42,9 @@ namespace TweetDck.Core.Other{
|
|||||||
|
|
||||||
private void FormSettings_FormClosing(object sender, FormClosingEventArgs e){
|
private void FormSettings_FormClosing(object sender, FormClosingEventArgs e){
|
||||||
Program.UserConfig.Save();
|
Program.UserConfig.Save();
|
||||||
}
|
|
||||||
|
|
||||||
private void btnExport_Click(object sender, EventArgs e){
|
foreach(BaseTabSettings control in tabs.Values){
|
||||||
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);
|
control.Dispose();
|
||||||
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()){
|
|
||||||
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();
|
|
||||||
ReloadUI();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +52,7 @@ namespace TweetDck.Core.Other{
|
|||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReloadUI(){
|
public void ReloadUI(){
|
||||||
tabs.Clear();
|
tabs.Clear();
|
||||||
tabPanel.Content.Controls.Clear();
|
tabPanel.Content.Controls.Clear();
|
||||||
tabPanel.ActiveButton.Callback();
|
tabPanel.ActiveButton.Callback();
|
||||||
|
@@ -117,261 +117,4 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</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>
|
</root>
|
@@ -12,7 +12,7 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
public bool Ready { get; set; }
|
public bool Ready { get; set; }
|
||||||
|
|
||||||
public BaseTabSettings(){
|
public BaseTabSettings(){
|
||||||
Padding = new Padding(6,6,6,6);
|
Padding = new Padding(6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
183
Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs
generated
Normal file
183
Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs
generated
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
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.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
|
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.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
|
this.textBoxNotificationCSS.Size = new System.Drawing.Size(226, 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -4,6 +4,8 @@ using System.Text;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Other.Settings.Export{
|
namespace TweetDck.Core.Other.Settings.Export{
|
||||||
class CombinedFileStream : IDisposable{
|
class CombinedFileStream : IDisposable{
|
||||||
|
public const char KeySeparator = '/';
|
||||||
|
|
||||||
private readonly Stream stream;
|
private readonly Stream stream;
|
||||||
|
|
||||||
public CombinedFileStream(Stream stream){
|
public CombinedFileStream(Stream stream){
|
||||||
@@ -11,28 +13,31 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void WriteFile(string identifier, string path){
|
public void WriteFile(string identifier, string path){
|
||||||
|
byte[] name = Encoding.UTF8.GetBytes(identifier);
|
||||||
|
|
||||||
|
if (name.Length > 255){
|
||||||
|
throw new ArgumentOutOfRangeException("Identifier cannot be 256 or more characters long: "+identifier);
|
||||||
|
}
|
||||||
|
|
||||||
byte[] contents;
|
byte[] contents;
|
||||||
|
|
||||||
using(FileStream fileStream = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)){
|
using(FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int left = (int)fileStream.Length;
|
int left = (int)fileStream.Length;
|
||||||
|
|
||||||
contents = new byte[left];
|
contents = new byte[left];
|
||||||
|
|
||||||
while(left > 0){
|
while(left > 0){
|
||||||
int read = fileStream.Read(contents,index,left);
|
int read = fileStream.Read(contents, index, left);
|
||||||
index += read;
|
index += read;
|
||||||
left -= read;
|
left -= read;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] name = Encoding.UTF8.GetBytes(identifier);
|
|
||||||
byte[] contentsLength = BitConverter.GetBytes(contents.Length);
|
|
||||||
|
|
||||||
stream.WriteByte((byte)name.Length);
|
stream.WriteByte((byte)name.Length);
|
||||||
stream.Write(name,0,name.Length);
|
stream.Write(name, 0, name.Length);
|
||||||
stream.Write(contentsLength,0,4);
|
stream.Write(BitConverter.GetBytes(contents.Length), 0, 4);
|
||||||
stream.Write(contents,0,contents.Length);
|
stream.Write(contents, 0, contents.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Entry ReadFile(){
|
public Entry ReadFile(){
|
||||||
@@ -43,15 +48,15 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
|
|
||||||
byte[] name = new byte[nameLength];
|
byte[] name = new byte[nameLength];
|
||||||
stream.Read(name,0,nameLength);
|
stream.Read(name, 0, nameLength);
|
||||||
|
|
||||||
byte[] contentLength = new byte[4];
|
byte[] contentLength = new byte[4];
|
||||||
stream.Read(contentLength,0,4);
|
stream.Read(contentLength, 0, 4);
|
||||||
|
|
||||||
byte[] contents = new byte[BitConverter.ToInt32(contentLength,0)];
|
byte[] contents = new byte[BitConverter.ToInt32(contentLength, 0)];
|
||||||
stream.Read(contents,0,contents.Length);
|
stream.Read(contents, 0, contents.Length);
|
||||||
|
|
||||||
return new Entry(Encoding.UTF8.GetString(name),contents);
|
return new Entry(Encoding.UTF8.GetString(name), contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Flush(){
|
public void Flush(){
|
||||||
@@ -65,6 +70,13 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
public class Entry{
|
public class Entry{
|
||||||
public string Identifier { get; private set; }
|
public string Identifier { get; private set; }
|
||||||
|
|
||||||
|
public string KeyName{
|
||||||
|
get{
|
||||||
|
int index = Identifier.IndexOf(KeySeparator);
|
||||||
|
return index == -1 ? Identifier : Identifier.Substring(0, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private readonly byte[] contents;
|
private readonly byte[] contents;
|
||||||
|
|
||||||
public Entry(string identifier, byte[] contents){
|
public Entry(string identifier, byte[] contents){
|
||||||
@@ -73,7 +85,16 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void WriteToFile(string path){
|
public void WriteToFile(string path){
|
||||||
File.WriteAllBytes(path,contents);
|
File.WriteAllBytes(path, contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteToFile(string path, bool createDirectory){
|
||||||
|
if (createDirectory){
|
||||||
|
// ReSharper disable once AssignNullToNotNullAttribute
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
File.WriteAllBytes(path, contents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,28 +1,63 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other.Settings.Export{
|
namespace TweetDck.Core.Other.Settings.Export{
|
||||||
sealed class ExportManager{
|
sealed class ExportManager{
|
||||||
public static readonly string CookiesPath = Path.Combine(Program.StoragePath,"Cookies");
|
public static readonly string CookiesPath = Path.Combine(Program.StoragePath, "Cookies");
|
||||||
public static readonly string TempCookiesPath = Path.Combine(Program.StoragePath,"CookiesTmp");
|
public static readonly string TempCookiesPath = Path.Combine(Program.StoragePath, "CookiesTmp");
|
||||||
|
|
||||||
|
public bool IsRestarting { get; private set; }
|
||||||
public Exception LastException { get; private set; }
|
public Exception LastException { get; private set; }
|
||||||
|
|
||||||
private readonly string file;
|
private readonly string file;
|
||||||
|
private readonly PluginManager plugins;
|
||||||
|
|
||||||
public ExportManager(string file){
|
public ExportManager(string file, PluginManager plugins){
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
this.plugins = plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Export(bool includeSession){
|
public bool Export(bool includeSession){
|
||||||
try{
|
try{
|
||||||
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file,FileMode.Create,FileAccess.Write,FileShare.None))){
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){
|
||||||
stream.WriteFile("config",Program.ConfigFilePath);
|
stream.WriteFile("config", Program.ConfigFilePath);
|
||||||
|
|
||||||
|
foreach(PathInfo path in EnumerateFilesRelative(plugins.PathOfficialPlugins)){
|
||||||
|
string[] split = path.Relative.Split(CombinedFileStream.KeySeparator);
|
||||||
|
|
||||||
|
if (split.Length < 3){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (split.Length == 3){
|
||||||
|
if (split[2].Equals(".meta", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
split[2].Equals("browser.js", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
split[2].Equals("notification.js", StringComparison.OrdinalIgnoreCase)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
stream.WriteFile("plugin.off"+path.Relative, path.Full);
|
||||||
|
}catch(ArgumentOutOfRangeException e){
|
||||||
|
MessageBox.Show("Could not include a file in the export. "+e.Message, "Export Profile", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(PathInfo path in EnumerateFilesRelative(plugins.PathCustomPlugins)){
|
||||||
|
try{
|
||||||
|
stream.WriteFile("plugin.usr"+path.Relative, path.Full);
|
||||||
|
}catch(ArgumentOutOfRangeException e){
|
||||||
|
MessageBox.Show("Could not include a file in the export. "+e.Message, "Export Profile", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (includeSession){
|
if (includeSession){
|
||||||
stream.WriteFile("cookies",CookiesPath);
|
stream.WriteFile("cookies", CookiesPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
stream.Flush();
|
stream.Flush();
|
||||||
@@ -37,22 +72,40 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
|
|
||||||
public bool Import(){
|
public bool Import(){
|
||||||
try{
|
try{
|
||||||
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file,FileMode.Open,FileAccess.Read,FileShare.None))){
|
bool updatedPlugins = false;
|
||||||
|
|
||||||
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None))){
|
||||||
CombinedFileStream.Entry entry;
|
CombinedFileStream.Entry entry;
|
||||||
|
|
||||||
while((entry = stream.ReadFile()) != null){
|
while((entry = stream.ReadFile()) != null){
|
||||||
switch(entry.Identifier){
|
switch(entry.KeyName){
|
||||||
case "config":
|
case "config":
|
||||||
entry.WriteToFile(Program.ConfigFilePath);
|
entry.WriteToFile(Program.ConfigFilePath);
|
||||||
Program.ReloadConfig();
|
Program.ReloadConfig();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "plugin.off":
|
||||||
|
string root = Path.Combine(plugins.PathOfficialPlugins, entry.Identifier.Split(CombinedFileStream.KeySeparator)[1]);
|
||||||
|
|
||||||
|
if (Directory.Exists(root)){
|
||||||
|
entry.WriteToFile(Path.Combine(plugins.PathOfficialPlugins, entry.Identifier.Substring(entry.KeyName.Length+1)), true);
|
||||||
|
updatedPlugins = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "plugin.usr":
|
||||||
|
entry.WriteToFile(Path.Combine(plugins.PathCustomPlugins, entry.Identifier.Substring(entry.KeyName.Length+1)), true);
|
||||||
|
updatedPlugins = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case "cookies":
|
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){
|
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));
|
entry.WriteToFile(Path.Combine(Program.StoragePath, TempCookiesPath));
|
||||||
|
|
||||||
// okay to and restart, 'cookies' is always the last entry
|
// okay to and restart, 'cookies' is always the last entry
|
||||||
Process.Start(Application.ExecutablePath,"-restart -importcookies");
|
IsRestarting = true;
|
||||||
|
Process.Start(Application.ExecutablePath, "-restart -importcookies");
|
||||||
Application.Exit();
|
Application.Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,11 +114,27 @@ namespace TweetDck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updatedPlugins){
|
||||||
|
plugins.Reload();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
LastException = e;
|
LastException = e;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<PathInfo> EnumerateFilesRelative(string root){
|
||||||
|
return Directory.EnumerateFiles(root, "*.*", SearchOption.AllDirectories).Select(fullPath => new PathInfo{
|
||||||
|
Full = fullPath,
|
||||||
|
Relative = fullPath.Substring(root.Length).Replace(Path.DirectorySeparatorChar, CombinedFileStream.KeySeparator) // includes leading separator character
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PathInfo{
|
||||||
|
public string Full { get; set; }
|
||||||
|
public string Relative { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
137
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
137
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
@@ -23,51 +23,145 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.btnClearCache = new System.Windows.Forms.Button();
|
this.btnClearCache = new System.Windows.Forms.Button();
|
||||||
this.labelMiscellaneous = new System.Windows.Forms.Label();
|
|
||||||
this.checkHardwareAcceleration = new System.Windows.Forms.CheckBox();
|
this.checkHardwareAcceleration = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.btnEditCefArgs = new System.Windows.Forms.Button();
|
||||||
|
this.btnEditCSS = 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.groupPerformance.SuspendLayout();
|
||||||
|
this.groupConfiguration.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnClearCache
|
// btnClearCache
|
||||||
//
|
//
|
||||||
this.btnClearCache.Location = new System.Drawing.Point(12, 56);
|
this.btnClearCache.Location = new System.Drawing.Point(6, 44);
|
||||||
this.btnClearCache.Name = "btnClearCache";
|
this.btnClearCache.Name = "btnClearCache";
|
||||||
this.btnClearCache.Size = new System.Drawing.Size(171, 23);
|
this.btnClearCache.Size = new System.Drawing.Size(171, 23);
|
||||||
this.btnClearCache.TabIndex = 14;
|
this.btnClearCache.TabIndex = 14;
|
||||||
this.btnClearCache.Text = "Clear Cache (calculating)";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.btnClearCache.Click += new System.EventHandler(this.btnClearCache_Click);
|
this.btnClearCache.Click += new System.EventHandler(this.btnClearCache_Click);
|
||||||
//
|
//
|
||||||
// labelMiscellaneous
|
|
||||||
//
|
|
||||||
this.labelMiscellaneous.AutoSize = true;
|
|
||||||
this.labelMiscellaneous.Location = new System.Drawing.Point(9, 40);
|
|
||||||
this.labelMiscellaneous.Margin = new System.Windows.Forms.Padding(3, 11, 3, 0);
|
|
||||||
this.labelMiscellaneous.Name = "labelMiscellaneous";
|
|
||||||
this.labelMiscellaneous.Size = new System.Drawing.Size(74, 13);
|
|
||||||
this.labelMiscellaneous.TabIndex = 13;
|
|
||||||
this.labelMiscellaneous.Text = "Miscellaneous";
|
|
||||||
//
|
|
||||||
// checkHardwareAcceleration
|
// checkHardwareAcceleration
|
||||||
//
|
//
|
||||||
this.checkHardwareAcceleration.AutoSize = true;
|
this.checkHardwareAcceleration.AutoSize = true;
|
||||||
this.checkHardwareAcceleration.Location = new System.Drawing.Point(9, 9);
|
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.Name = "checkHardwareAcceleration";
|
||||||
this.checkHardwareAcceleration.Size = new System.Drawing.Size(134, 17);
|
this.checkHardwareAcceleration.Size = new System.Drawing.Size(134, 17);
|
||||||
this.checkHardwareAcceleration.TabIndex = 12;
|
this.checkHardwareAcceleration.TabIndex = 12;
|
||||||
this.checkHardwareAcceleration.Text = "Hardware Acceleration";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.checkHardwareAcceleration.CheckedChanged += new System.EventHandler(this.checkHardwareAcceleration_CheckedChanged);
|
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);
|
||||||
|
//
|
||||||
|
// 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);
|
||||||
|
//
|
||||||
|
// 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(190, 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(100, 250);
|
||||||
|
this.btnImport.Name = "btnImport";
|
||||||
|
this.btnImport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||||
|
this.btnImport.Size = new System.Drawing.Size(84, 23);
|
||||||
|
this.btnImport.TabIndex = 16;
|
||||||
|
this.btnImport.Text = "Import Profile";
|
||||||
|
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.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||||
|
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(85, 23);
|
||||||
|
this.btnExport.TabIndex = 15;
|
||||||
|
this.btnExport.Text = "Export Profile";
|
||||||
|
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";
|
||||||
|
//
|
||||||
// TabSettingsAdvanced
|
// TabSettingsAdvanced
|
||||||
//
|
//
|
||||||
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.Controls.Add(this.btnClearCache);
|
this.Controls.Add(this.groupConfiguration);
|
||||||
this.Controls.Add(this.labelMiscellaneous);
|
this.Controls.Add(this.groupPerformance);
|
||||||
this.Controls.Add(this.checkHardwareAcceleration);
|
this.Controls.Add(this.btnReset);
|
||||||
|
this.Controls.Add(this.btnImport);
|
||||||
|
this.Controls.Add(this.btnExport);
|
||||||
this.Name = "TabSettingsAdvanced";
|
this.Name = "TabSettingsAdvanced";
|
||||||
this.Size = new System.Drawing.Size(239, 120);
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.groupPerformance.ResumeLayout(false);
|
||||||
|
this.groupPerformance.PerformLayout();
|
||||||
|
this.groupConfiguration.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
this.PerformLayout();
|
||||||
|
|
||||||
@@ -76,7 +170,14 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.Button btnClearCache;
|
private System.Windows.Forms.Button btnClearCache;
|
||||||
private System.Windows.Forms.Label labelMiscellaneous;
|
|
||||||
private System.Windows.Forms.CheckBox checkHardwareAcceleration;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,13 +2,22 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Core.Other.Settings.Dialogs;
|
||||||
|
using TweetDck.Core.Other.Settings.Export;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
using TweetDck.Plugins;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other.Settings{
|
namespace TweetDck.Core.Other.Settings{
|
||||||
partial class TabSettingsAdvanced : BaseTabSettings{
|
partial class TabSettingsAdvanced : BaseTabSettings{
|
||||||
public TabSettingsAdvanced(){
|
private readonly Action browserReloadAction;
|
||||||
|
private readonly PluginManager plugins;
|
||||||
|
|
||||||
|
public TabSettingsAdvanced(Action browserReloadAction, PluginManager plugins){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
this.browserReloadAction = browserReloadAction;
|
||||||
|
this.plugins = plugins;
|
||||||
|
|
||||||
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
||||||
|
|
||||||
BrowserCache.CalculateCacheSize(bytes => this.InvokeSafe(() => {
|
BrowserCache.CalculateCacheSize(bytes => this.InvokeSafe(() => {
|
||||||
@@ -27,7 +36,7 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
btnClearCache.Enabled = false;
|
btnClearCache.Enabled = false;
|
||||||
BrowserCache.SetClearOnExit();
|
BrowserCache.SetClearOnExit();
|
||||||
|
|
||||||
MessageBox.Show("Cache will be automatically cleared when "+Program.BrandName+" exits.","Clear Cache",MessageBoxButtons.OK,MessageBoxIcon.Information);
|
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){
|
private void checkHardwareAcceleration_CheckedChanged(object sender, EventArgs e){
|
||||||
@@ -40,22 +49,115 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
succeeded = HardwareAcceleration.Enable();
|
succeeded = HardwareAcceleration.Enable();
|
||||||
}
|
}
|
||||||
else{
|
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);
|
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{
|
else{
|
||||||
succeeded = HardwareAcceleration.Disable();
|
succeeded = HardwareAcceleration.Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (succeeded && 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){ // TODO
|
if (succeeded){
|
||||||
Process.Start(Application.ExecutablePath,"-restart");
|
PromptRestart();
|
||||||
Application.Exit();
|
|
||||||
}
|
}
|
||||||
else if (!succeeded){
|
else{
|
||||||
checkHardwareAcceleration.CheckedChanged -= checkHardwareAcceleration_CheckedChanged;
|
checkHardwareAcceleration.CheckedChanged -= checkHardwareAcceleration_CheckedChanged;
|
||||||
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled;
|
||||||
checkHardwareAcceleration.CheckedChanged += checkHardwareAcceleration_CheckedChanged;
|
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, plugins);
|
||||||
|
|
||||||
|
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, plugins);
|
||||||
|
|
||||||
|
if (manager.Import()){
|
||||||
|
if (!manager.IsRestarting){
|
||||||
|
((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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
87
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
87
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
@@ -23,19 +23,29 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
||||||
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
||||||
this.labelTrayType = new System.Windows.Forms.Label();
|
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();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// checkExpandLinks
|
// checkExpandLinks
|
||||||
//
|
//
|
||||||
this.checkExpandLinks.AutoSize = true;
|
this.checkExpandLinks.AutoSize = true;
|
||||||
this.checkExpandLinks.Location = new System.Drawing.Point(9, 9);
|
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.Name = "checkExpandLinks";
|
||||||
this.checkExpandLinks.Size = new System.Drawing.Size(166, 17);
|
this.checkExpandLinks.Size = new System.Drawing.Size(166, 17);
|
||||||
this.checkExpandLinks.TabIndex = 14;
|
this.checkExpandLinks.TabIndex = 14;
|
||||||
this.checkExpandLinks.Text = "Expand Links When Hovered";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.checkExpandLinks.CheckedChanged += new System.EventHandler(this.checkExpandLinks_CheckedChanged);
|
this.checkExpandLinks.CheckedChanged += new System.EventHandler(this.checkExpandLinks_CheckedChanged);
|
||||||
//
|
//
|
||||||
@@ -43,33 +53,72 @@
|
|||||||
//
|
//
|
||||||
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
this.comboBoxTrayType.FormattingEnabled = true;
|
this.comboBoxTrayType.FormattingEnabled = true;
|
||||||
this.comboBoxTrayType.Location = new System.Drawing.Point(9, 56);
|
this.comboBoxTrayType.Location = new System.Drawing.Point(6, 19);
|
||||||
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
||||||
this.comboBoxTrayType.Size = new System.Drawing.Size(171, 21);
|
this.comboBoxTrayType.Size = new System.Drawing.Size(171, 21);
|
||||||
this.comboBoxTrayType.TabIndex = 13;
|
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);
|
this.comboBoxTrayType.SelectedIndexChanged += new System.EventHandler(this.comboBoxTrayType_SelectedIndexChanged);
|
||||||
//
|
//
|
||||||
// labelTrayType
|
// checkTrayHighlight
|
||||||
//
|
//
|
||||||
this.labelTrayType.AutoSize = true;
|
this.checkTrayHighlight.AutoSize = true;
|
||||||
this.labelTrayType.Location = new System.Drawing.Point(6, 40);
|
this.checkTrayHighlight.Location = new System.Drawing.Point(9, 70);
|
||||||
this.labelTrayType.Margin = new System.Windows.Forms.Padding(3, 11, 3, 0);
|
this.checkTrayHighlight.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
this.labelTrayType.Name = "labelTrayType";
|
this.checkTrayHighlight.Name = "checkTrayHighlight";
|
||||||
this.labelTrayType.Size = new System.Drawing.Size(52, 13);
|
this.checkTrayHighlight.Size = new System.Drawing.Size(103, 17);
|
||||||
this.labelTrayType.TabIndex = 12;
|
this.checkTrayHighlight.TabIndex = 15;
|
||||||
this.labelTrayType.Text = "Tray Icon";
|
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
|
// TabSettingsGeneral
|
||||||
//
|
//
|
||||||
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.Controls.Add(this.checkExpandLinks);
|
this.Controls.Add(this.groupInterface);
|
||||||
this.Controls.Add(this.comboBoxTrayType);
|
this.Controls.Add(this.groupTray);
|
||||||
this.Controls.Add(this.labelTrayType);
|
|
||||||
this.Name = "TabSettingsGeneral";
|
this.Name = "TabSettingsGeneral";
|
||||||
this.Size = new System.Drawing.Size(219, 99);
|
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);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,6 +126,10 @@
|
|||||||
|
|
||||||
private System.Windows.Forms.CheckBox checkExpandLinks;
|
private System.Windows.Forms.CheckBox checkExpandLinks;
|
||||||
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
||||||
private System.Windows.Forms.Label labelTrayType;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,9 +9,11 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
comboBoxTrayType.Items.Add("Display Icon Only");
|
comboBoxTrayType.Items.Add("Display Icon Only");
|
||||||
comboBoxTrayType.Items.Add("Minimize to Tray");
|
comboBoxTrayType.Items.Add("Minimize to Tray");
|
||||||
comboBoxTrayType.Items.Add("Close to Tray");
|
comboBoxTrayType.Items.Add("Close to Tray");
|
||||||
comboBoxTrayType.SelectedIndex = Math.Min(Math.Max((int)Config.TrayBehavior,0),comboBoxTrayType.Items.Count-1);
|
comboBoxTrayType.Items.Add("Combined");
|
||||||
|
comboBoxTrayType.SelectedIndex = Math.Min(Math.Max((int)Config.TrayBehavior, 0), comboBoxTrayType.Items.Count-1);
|
||||||
|
|
||||||
checkExpandLinks.Checked = Program.UserConfig.ExpandLinksOnHover;
|
checkExpandLinks.Checked = Program.UserConfig.ExpandLinksOnHover;
|
||||||
|
checkTrayHighlight.Checked = Program.UserConfig.EnableTrayHighlight;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkExpandLinks_CheckedChanged(object sender, EventArgs e){
|
private void checkExpandLinks_CheckedChanged(object sender, EventArgs e){
|
||||||
@@ -25,5 +27,11 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
|
|
||||||
Config.TrayBehavior = (TrayIcon.Behavior)comboBoxTrayType.SelectedIndex;
|
Config.TrayBehavior = (TrayIcon.Behavior)comboBoxTrayType.SelectedIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkTrayHighlight_CheckedChanged(object sender, EventArgs e){
|
||||||
|
if (!Ready)return;
|
||||||
|
|
||||||
|
Config.EnableTrayHighlight = checkTrayHighlight.Checked;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
232
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
232
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
@@ -23,7 +23,9 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.groupNotificationLocation = new System.Windows.Forms.GroupBox();
|
this.groupNotificationLocation = new System.Windows.Forms.GroupBox();
|
||||||
|
this.labelEdgeDistanceValue = new System.Windows.Forms.Label();
|
||||||
this.labelDisplay = new System.Windows.Forms.Label();
|
this.labelDisplay = new System.Windows.Forms.Label();
|
||||||
this.comboBoxDisplay = new System.Windows.Forms.ComboBox();
|
this.comboBoxDisplay = new System.Windows.Forms.ComboBox();
|
||||||
this.labelEdgeDistance = new System.Windows.Forms.Label();
|
this.labelEdgeDistance = new System.Windows.Forms.Label();
|
||||||
@@ -34,20 +36,28 @@
|
|||||||
this.radioLocTL = new System.Windows.Forms.RadioButton();
|
this.radioLocTL = new System.Windows.Forms.RadioButton();
|
||||||
this.trackBarEdgeDistance = new System.Windows.Forms.TrackBar();
|
this.trackBarEdgeDistance = new System.Windows.Forms.TrackBar();
|
||||||
this.groupNotificationDuration = new System.Windows.Forms.GroupBox();
|
this.groupNotificationDuration = new System.Windows.Forms.GroupBox();
|
||||||
this.radioDurVeryLong = new System.Windows.Forms.RadioButton();
|
this.tableLayoutDurationButtons = new System.Windows.Forms.TableLayoutPanel();
|
||||||
this.radioDurLong = new System.Windows.Forms.RadioButton();
|
this.btnDurationMedium = new TweetDck.Core.Controls.FlatButton();
|
||||||
this.radioDurMedium = new System.Windows.Forms.RadioButton();
|
this.btnDurationLong = new TweetDck.Core.Controls.FlatButton();
|
||||||
this.radioDurShort = new System.Windows.Forms.RadioButton();
|
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.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.checkNotificationTimer = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.groupNotificationLocation.SuspendLayout();
|
this.groupNotificationLocation.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
||||||
this.groupNotificationDuration.SuspendLayout();
|
this.groupNotificationDuration.SuspendLayout();
|
||||||
|
this.tableLayoutDurationButtons.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).BeginInit();
|
||||||
this.groupUserInterface.SuspendLayout();
|
this.groupUserInterface.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// groupNotificationLocation
|
// groupNotificationLocation
|
||||||
//
|
//
|
||||||
|
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistanceValue);
|
||||||
this.groupNotificationLocation.Controls.Add(this.labelDisplay);
|
this.groupNotificationLocation.Controls.Add(this.labelDisplay);
|
||||||
this.groupNotificationLocation.Controls.Add(this.comboBoxDisplay);
|
this.groupNotificationLocation.Controls.Add(this.comboBoxDisplay);
|
||||||
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistance);
|
this.groupNotificationLocation.Controls.Add(this.labelEdgeDistance);
|
||||||
@@ -57,12 +67,23 @@
|
|||||||
this.groupNotificationLocation.Controls.Add(this.radioLocTR);
|
this.groupNotificationLocation.Controls.Add(this.radioLocTR);
|
||||||
this.groupNotificationLocation.Controls.Add(this.radioLocTL);
|
this.groupNotificationLocation.Controls.Add(this.radioLocTL);
|
||||||
this.groupNotificationLocation.Controls.Add(this.trackBarEdgeDistance);
|
this.groupNotificationLocation.Controls.Add(this.trackBarEdgeDistance);
|
||||||
this.groupNotificationLocation.Location = new System.Drawing.Point(9, 9);
|
this.groupNotificationLocation.Location = new System.Drawing.Point(198, 9);
|
||||||
this.groupNotificationLocation.Name = "groupNotificationLocation";
|
this.groupNotificationLocation.Name = "groupNotificationLocation";
|
||||||
this.groupNotificationLocation.Size = new System.Drawing.Size(183, 264);
|
this.groupNotificationLocation.Size = new System.Drawing.Size(183, 264);
|
||||||
this.groupNotificationLocation.TabIndex = 1;
|
this.groupNotificationLocation.TabIndex = 1;
|
||||||
this.groupNotificationLocation.TabStop = false;
|
this.groupNotificationLocation.TabStop = false;
|
||||||
this.groupNotificationLocation.Text = "Notification Location";
|
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
|
// labelDisplay
|
||||||
//
|
//
|
||||||
@@ -105,6 +126,7 @@
|
|||||||
this.radioLocCustom.TabIndex = 4;
|
this.radioLocCustom.TabIndex = 4;
|
||||||
this.radioLocCustom.TabStop = true;
|
this.radioLocCustom.TabStop = true;
|
||||||
this.radioLocCustom.Text = "Custom";
|
this.radioLocCustom.Text = "Custom";
|
||||||
|
this.toolTip.SetToolTip(this.radioLocCustom, "Drag the notification window to the desired location.");
|
||||||
this.radioLocCustom.UseVisualStyleBackColor = true;
|
this.radioLocCustom.UseVisualStyleBackColor = true;
|
||||||
this.radioLocCustom.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
this.radioLocCustom.CheckedChanged += new System.EventHandler(this.radioLoc_CheckedChanged);
|
||||||
//
|
//
|
||||||
@@ -165,87 +187,154 @@
|
|||||||
this.trackBarEdgeDistance.Maximum = 40;
|
this.trackBarEdgeDistance.Maximum = 40;
|
||||||
this.trackBarEdgeDistance.Minimum = 8;
|
this.trackBarEdgeDistance.Minimum = 8;
|
||||||
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
||||||
this.trackBarEdgeDistance.Size = new System.Drawing.Size(171, 45);
|
this.trackBarEdgeDistance.Size = new System.Drawing.Size(141, 45);
|
||||||
this.trackBarEdgeDistance.SmallChange = 2;
|
this.trackBarEdgeDistance.SmallChange = 2;
|
||||||
this.trackBarEdgeDistance.TabIndex = 5;
|
this.trackBarEdgeDistance.TabIndex = 5;
|
||||||
this.trackBarEdgeDistance.TickFrequency = 2;
|
this.trackBarEdgeDistance.TickFrequency = 4;
|
||||||
this.trackBarEdgeDistance.Value = 8;
|
this.trackBarEdgeDistance.Value = 8;
|
||||||
this.trackBarEdgeDistance.ValueChanged += new System.EventHandler(this.trackBarEdgeDistance_ValueChanged);
|
this.trackBarEdgeDistance.ValueChanged += new System.EventHandler(this.trackBarEdgeDistance_ValueChanged);
|
||||||
//
|
//
|
||||||
// groupNotificationDuration
|
// groupNotificationDuration
|
||||||
//
|
//
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurVeryLong);
|
this.groupNotificationDuration.Controls.Add(this.tableLayoutDurationButtons);
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurLong);
|
this.groupNotificationDuration.Controls.Add(this.labelDurationValue);
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurMedium);
|
this.groupNotificationDuration.Controls.Add(this.trackBarDuration);
|
||||||
this.groupNotificationDuration.Controls.Add(this.radioDurShort);
|
this.groupNotificationDuration.Location = new System.Drawing.Point(9, 106);
|
||||||
this.groupNotificationDuration.Location = new System.Drawing.Point(198, 9);
|
|
||||||
this.groupNotificationDuration.Name = "groupNotificationDuration";
|
this.groupNotificationDuration.Name = "groupNotificationDuration";
|
||||||
this.groupNotificationDuration.Size = new System.Drawing.Size(183, 119);
|
this.groupNotificationDuration.Size = new System.Drawing.Size(183, 89);
|
||||||
this.groupNotificationDuration.TabIndex = 9;
|
this.groupNotificationDuration.TabIndex = 9;
|
||||||
this.groupNotificationDuration.TabStop = false;
|
this.groupNotificationDuration.TabStop = false;
|
||||||
this.groupNotificationDuration.Text = "Notification Duration";
|
this.groupNotificationDuration.Text = "Duration";
|
||||||
//
|
//
|
||||||
// radioDurVeryLong
|
// tableLayoutDurationButtons
|
||||||
//
|
//
|
||||||
this.radioDurVeryLong.AutoSize = true;
|
this.tableLayoutDurationButtons.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||||
this.radioDurVeryLong.Location = new System.Drawing.Point(6, 92);
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.radioDurVeryLong.Name = "radioDurVeryLong";
|
this.tableLayoutDurationButtons.ColumnCount = 3;
|
||||||
this.radioDurVeryLong.Size = new System.Drawing.Size(73, 17);
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32F));
|
||||||
this.radioDurVeryLong.TabIndex = 3;
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 36F));
|
||||||
this.radioDurVeryLong.TabStop = true;
|
this.tableLayoutDurationButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32F));
|
||||||
this.radioDurVeryLong.Text = "Very Long";
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationMedium, 0, 0);
|
||||||
this.radioDurVeryLong.UseVisualStyleBackColor = true;
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationLong, 1, 0);
|
||||||
this.radioDurVeryLong.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationShort, 0, 0);
|
||||||
this.radioDurVeryLong.Click += new System.EventHandler(this.radioDur_Click);
|
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;
|
||||||
//
|
//
|
||||||
// radioDurLong
|
// btnDurationMedium
|
||||||
//
|
//
|
||||||
this.radioDurLong.AutoSize = true;
|
this.btnDurationMedium.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.radioDurLong.Location = new System.Drawing.Point(6, 68);
|
this.btnDurationMedium.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
this.radioDurLong.Name = "radioDurLong";
|
this.btnDurationMedium.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.radioDurLong.Size = new System.Drawing.Size(49, 17);
|
this.btnDurationMedium.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.radioDurLong.TabIndex = 2;
|
this.btnDurationMedium.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.radioDurLong.TabStop = true;
|
this.btnDurationMedium.Location = new System.Drawing.Point(55, 1);
|
||||||
this.radioDurLong.Text = "Long";
|
this.btnDurationMedium.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.radioDurLong.UseVisualStyleBackColor = true;
|
this.btnDurationMedium.Name = "btnDurationMedium";
|
||||||
this.radioDurLong.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
this.btnDurationMedium.Size = new System.Drawing.Size(59, 25);
|
||||||
this.radioDurLong.Click += new System.EventHandler(this.radioDur_Click);
|
this.btnDurationMedium.TabIndex = 2;
|
||||||
|
this.btnDurationMedium.Text = "Medium";
|
||||||
|
this.btnDurationMedium.UseVisualStyleBackColor = true;
|
||||||
|
this.btnDurationMedium.Click += new System.EventHandler(this.btnDurationMedium_Click);
|
||||||
//
|
//
|
||||||
// radioDurMedium
|
// btnDurationLong
|
||||||
//
|
//
|
||||||
this.radioDurMedium.AutoSize = true;
|
this.btnDurationLong.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.radioDurMedium.Location = new System.Drawing.Point(6, 44);
|
this.btnDurationLong.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
this.radioDurMedium.Name = "radioDurMedium";
|
this.btnDurationLong.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.radioDurMedium.Size = new System.Drawing.Size(62, 17);
|
this.btnDurationLong.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.radioDurMedium.TabIndex = 1;
|
this.btnDurationLong.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.radioDurMedium.TabStop = true;
|
this.btnDurationLong.Location = new System.Drawing.Point(116, 1);
|
||||||
this.radioDurMedium.Text = "Medium";
|
this.btnDurationLong.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.radioDurMedium.UseVisualStyleBackColor = true;
|
this.btnDurationLong.Name = "btnDurationLong";
|
||||||
this.radioDurMedium.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
this.btnDurationLong.Size = new System.Drawing.Size(54, 25);
|
||||||
this.radioDurMedium.Click += new System.EventHandler(this.radioDur_Click);
|
this.btnDurationLong.TabIndex = 1;
|
||||||
|
this.btnDurationLong.Text = "Long";
|
||||||
|
this.btnDurationLong.UseVisualStyleBackColor = true;
|
||||||
|
this.btnDurationLong.Click += new System.EventHandler(this.btnDurationLong_Click);
|
||||||
//
|
//
|
||||||
// radioDurShort
|
// btnDurationShort
|
||||||
//
|
//
|
||||||
this.radioDurShort.AutoSize = true;
|
this.btnDurationShort.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.radioDurShort.Location = new System.Drawing.Point(6, 20);
|
this.btnDurationShort.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
|
||||||
this.radioDurShort.Name = "radioDurShort";
|
this.btnDurationShort.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.radioDurShort.Size = new System.Drawing.Size(50, 17);
|
this.btnDurationShort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.radioDurShort.TabIndex = 0;
|
this.btnDurationShort.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.radioDurShort.TabStop = true;
|
this.btnDurationShort.Location = new System.Drawing.Point(1, 1);
|
||||||
this.radioDurShort.Text = "Short";
|
this.btnDurationShort.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.radioDurShort.UseVisualStyleBackColor = true;
|
this.btnDurationShort.Name = "btnDurationShort";
|
||||||
this.radioDurShort.CheckedChanged += new System.EventHandler(this.radioDur_CheckedChanged);
|
this.btnDurationShort.Size = new System.Drawing.Size(52, 25);
|
||||||
this.radioDurShort.Click += new System.EventHandler(this.radioDur_Click);
|
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
|
// groupUserInterface
|
||||||
//
|
//
|
||||||
|
this.groupUserInterface.Controls.Add(this.checkTimerCountDown);
|
||||||
|
this.groupUserInterface.Controls.Add(this.checkLegacyLoad);
|
||||||
this.groupUserInterface.Controls.Add(this.checkNotificationTimer);
|
this.groupUserInterface.Controls.Add(this.checkNotificationTimer);
|
||||||
this.groupUserInterface.Location = new System.Drawing.Point(198, 134);
|
this.groupUserInterface.Location = new System.Drawing.Point(9, 9);
|
||||||
this.groupUserInterface.Name = "groupUserInterface";
|
this.groupUserInterface.Name = "groupUserInterface";
|
||||||
this.groupUserInterface.Size = new System.Drawing.Size(183, 48);
|
this.groupUserInterface.Size = new System.Drawing.Size(183, 91);
|
||||||
this.groupUserInterface.TabIndex = 10;
|
this.groupUserInterface.TabIndex = 10;
|
||||||
this.groupUserInterface.TabStop = false;
|
this.groupUserInterface.TabStop = false;
|
||||||
this.groupUserInterface.Text = "User Interface";
|
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
|
// checkNotificationTimer
|
||||||
//
|
//
|
||||||
@@ -256,6 +345,7 @@
|
|||||||
this.checkNotificationTimer.Size = new System.Drawing.Size(145, 17);
|
this.checkNotificationTimer.Size = new System.Drawing.Size(145, 17);
|
||||||
this.checkNotificationTimer.TabIndex = 4;
|
this.checkNotificationTimer.TabIndex = 4;
|
||||||
this.checkNotificationTimer.Text = "Display Notification Timer";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.checkNotificationTimer.CheckedChanged += new System.EventHandler(this.checkNotificationTimer_CheckedChanged);
|
this.checkNotificationTimer.CheckedChanged += new System.EventHandler(this.checkNotificationTimer_CheckedChanged);
|
||||||
//
|
//
|
||||||
@@ -267,13 +357,15 @@
|
|||||||
this.Controls.Add(this.groupNotificationDuration);
|
this.Controls.Add(this.groupNotificationDuration);
|
||||||
this.Controls.Add(this.groupNotificationLocation);
|
this.Controls.Add(this.groupNotificationLocation);
|
||||||
this.Name = "TabSettingsNotifications";
|
this.Name = "TabSettingsNotifications";
|
||||||
this.Size = new System.Drawing.Size(397, 282);
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged);
|
this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged);
|
||||||
this.groupNotificationLocation.ResumeLayout(false);
|
this.groupNotificationLocation.ResumeLayout(false);
|
||||||
this.groupNotificationLocation.PerformLayout();
|
this.groupNotificationLocation.PerformLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
||||||
this.groupNotificationDuration.ResumeLayout(false);
|
this.groupNotificationDuration.ResumeLayout(false);
|
||||||
this.groupNotificationDuration.PerformLayout();
|
this.groupNotificationDuration.PerformLayout();
|
||||||
|
this.tableLayoutDurationButtons.ResumeLayout(false);
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).EndInit();
|
||||||
this.groupUserInterface.ResumeLayout(false);
|
this.groupUserInterface.ResumeLayout(false);
|
||||||
this.groupUserInterface.PerformLayout();
|
this.groupUserInterface.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@@ -293,11 +385,17 @@
|
|||||||
private System.Windows.Forms.RadioButton radioLocTR;
|
private System.Windows.Forms.RadioButton radioLocTR;
|
||||||
private System.Windows.Forms.RadioButton radioLocTL;
|
private System.Windows.Forms.RadioButton radioLocTL;
|
||||||
private System.Windows.Forms.GroupBox groupNotificationDuration;
|
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.GroupBox groupUserInterface;
|
private System.Windows.Forms.GroupBox groupUserInterface;
|
||||||
private System.Windows.Forms.CheckBox checkNotificationTimer;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Handling;
|
using TweetDck.Core.Handling;
|
||||||
|
using TweetDck.Core.Controls;
|
||||||
|
|
||||||
namespace TweetDck.Core.Other.Settings{
|
namespace TweetDck.Core.Other.Settings{
|
||||||
partial class TabSettingsNotifications : BaseTabSettings{
|
partial class TabSettingsNotifications : BaseTabSettings{
|
||||||
@@ -19,7 +21,7 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.notification.Initialized += (sender, args) => {
|
this.notification.Initialized += (sender, args) => {
|
||||||
this.notification.ShowNotificationForSettings(true);
|
this.InvokeSafe(() => this.notification.ShowNotificationForSettings(true));
|
||||||
};
|
};
|
||||||
|
|
||||||
this.notification.Show(this);
|
this.notification.Show(this);
|
||||||
@@ -32,12 +34,8 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
case TweetNotification.Position.Custom: radioLocCustom.Checked = true; break;
|
case TweetNotification.Position.Custom: radioLocCustom.Checked = true; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(Config.NotificationDuration){
|
trackBarDuration.SetValueSafe(Config.NotificationDurationValue);
|
||||||
case TweetNotification.Duration.Short: radioDurShort.Checked = true; break;
|
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
||||||
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+")");
|
comboBoxDisplay.Items.Add("(Same As "+Program.BrandName+")");
|
||||||
|
|
||||||
@@ -45,10 +43,17 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
comboBoxDisplay.Items.Add(screen.DeviceName+" ("+screen.Bounds.Width+"x"+screen.Bounds.Height+")");
|
comboBoxDisplay.Items.Add(screen.DeviceName+" ("+screen.Bounds.Width+"x"+screen.Bounds.Height+")");
|
||||||
}
|
}
|
||||||
|
|
||||||
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1,Config.NotificationDisplay);
|
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1, Config.NotificationDisplay);
|
||||||
|
|
||||||
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
||||||
trackBarEdgeDistance.Value = Config.NotificationEdgeDistance;
|
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){
|
private void TabSettingsNotifications_ParentChanged(object sender, EventArgs e){
|
||||||
@@ -56,7 +61,7 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
notification.HideNotification(false);
|
notification.HideNotification(false);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
notification.ShowNotificationForSettings(false);
|
notification.ShowNotificationForSettings(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,30 +84,54 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
notification.ShowNotificationForSettings(false);
|
notification.ShowNotificationForSettings(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioDur_CheckedChanged(object sender, EventArgs e){
|
private void trackBarDuration_ValueChanged(object sender, EventArgs e){
|
||||||
if (!Ready)return;
|
if (!Ready)return;
|
||||||
|
|
||||||
if (radioDurShort.Checked)Config.NotificationDuration = TweetNotification.Duration.Short;
|
Config.NotificationDurationValue = trackBarDuration.Value;
|
||||||
else if (radioDurMedium.Checked)Config.NotificationDuration = TweetNotification.Duration.Medium;
|
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
||||||
else if (radioDurLong.Checked)Config.NotificationDuration = TweetNotification.Duration.Long;
|
|
||||||
else if (radioDurVeryLong.Checked)Config.NotificationDuration = TweetNotification.Duration.VeryLong;
|
|
||||||
|
|
||||||
notification.ShowNotificationForSettings(true);
|
notification.ShowNotificationForSettings(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioDur_Click(object sender, EventArgs e){
|
private void btnDurationShort_Click(object sender, EventArgs e){
|
||||||
if (!Ready)return;
|
if (!Ready)return;
|
||||||
|
|
||||||
notification.ShowNotificationForSettings(true);
|
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){
|
private void checkNotificationTimer_CheckedChanged(object sender, EventArgs e){
|
||||||
if (!Ready)return;
|
if (!Ready)return;
|
||||||
|
|
||||||
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
||||||
|
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
||||||
notification.ShowNotificationForSettings(true);
|
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){
|
private void comboBoxDisplay_SelectedValueChanged(object sender, EventArgs e){
|
||||||
if (!Ready)return;
|
if (!Ready)return;
|
||||||
|
|
||||||
@@ -112,7 +141,8 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
|
|
||||||
private void trackBarEdgeDistance_ValueChanged(object sender, EventArgs e){
|
private void trackBarEdgeDistance_ValueChanged(object sender, EventArgs e){
|
||||||
if (!Ready)return;
|
if (!Ready)return;
|
||||||
|
|
||||||
|
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value.ToString(CultureInfo.InvariantCulture)+" px";
|
||||||
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
||||||
notification.ShowNotificationForSettings(false);
|
notification.ShowNotificationForSettings(false);
|
||||||
}
|
}
|
||||||
|
33
Core/Other/Settings/TabSettingsUpdates.Designer.cs
generated
33
Core/Other/Settings/TabSettingsUpdates.Designer.cs
generated
@@ -23,41 +23,60 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.btnCheckUpdates = new System.Windows.Forms.Button();
|
this.btnCheckUpdates = new System.Windows.Forms.Button();
|
||||||
this.checkUpdateNotifications = new System.Windows.Forms.CheckBox();
|
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();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnCheckUpdates
|
// btnCheckUpdates
|
||||||
//
|
//
|
||||||
this.btnCheckUpdates.Location = new System.Drawing.Point(9, 32);
|
this.btnCheckUpdates.Location = new System.Drawing.Point(6, 44);
|
||||||
this.btnCheckUpdates.Name = "btnCheckUpdates";
|
this.btnCheckUpdates.Name = "btnCheckUpdates";
|
||||||
this.btnCheckUpdates.Size = new System.Drawing.Size(171, 23);
|
this.btnCheckUpdates.Size = new System.Drawing.Size(171, 23);
|
||||||
this.btnCheckUpdates.TabIndex = 15;
|
this.btnCheckUpdates.TabIndex = 15;
|
||||||
this.btnCheckUpdates.Text = "Check Updates Now";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.btnCheckUpdates.Click += new System.EventHandler(this.btnCheckUpdates_Click);
|
this.btnCheckUpdates.Click += new System.EventHandler(this.btnCheckUpdates_Click);
|
||||||
//
|
//
|
||||||
// checkUpdateNotifications
|
// checkUpdateNotifications
|
||||||
//
|
//
|
||||||
this.checkUpdateNotifications.AutoSize = true;
|
this.checkUpdateNotifications.AutoSize = true;
|
||||||
this.checkUpdateNotifications.Location = new System.Drawing.Point(9, 9);
|
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.Name = "checkUpdateNotifications";
|
||||||
this.checkUpdateNotifications.Size = new System.Drawing.Size(165, 17);
|
this.checkUpdateNotifications.Size = new System.Drawing.Size(165, 17);
|
||||||
this.checkUpdateNotifications.TabIndex = 14;
|
this.checkUpdateNotifications.TabIndex = 14;
|
||||||
this.checkUpdateNotifications.Text = "Check Updates Automatically";
|
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.UseVisualStyleBackColor = true;
|
||||||
this.checkUpdateNotifications.CheckedChanged += new System.EventHandler(this.checkUpdateNotifications_CheckedChanged);
|
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
|
// TabSettingsUpdates
|
||||||
//
|
//
|
||||||
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.Controls.Add(this.btnCheckUpdates);
|
this.Controls.Add(this.groupGeneral);
|
||||||
this.Controls.Add(this.checkUpdateNotifications);
|
|
||||||
this.Name = "TabSettingsUpdates";
|
this.Name = "TabSettingsUpdates";
|
||||||
this.Size = new System.Drawing.Size(211, 78);
|
this.Size = new System.Drawing.Size(478, 282);
|
||||||
|
this.groupGeneral.ResumeLayout(false);
|
||||||
|
this.groupGeneral.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,5 +84,7 @@
|
|||||||
|
|
||||||
private System.Windows.Forms.Button btnCheckUpdates;
|
private System.Windows.Forms.Button btnCheckUpdates;
|
||||||
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.GroupBox groupGeneral;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,7 @@ namespace TweetDck.Core.Other.Settings{
|
|||||||
btnCheckUpdates.Enabled = true;
|
btnCheckUpdates.Enabled = true;
|
||||||
|
|
||||||
if (!e.UpdateAvailable){
|
if (!e.UpdateAvailable){
|
||||||
MessageBox.Show("Your version of "+Program.BrandName+" is up to date.","No Updates Available",MessageBoxButtons.OK,MessageBoxIcon.Information);
|
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;
|
||||||
@@ -45,7 +45,7 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private void trayIcon_MouseClick(object sender, MouseEventArgs e){
|
private void trayIcon_MouseClick(object sender, MouseEventArgs e){
|
||||||
if (e.Button == MouseButtons.Left){
|
if (e.Button == MouseButtons.Left){
|
||||||
restoreToolStripMenuItem_Click(sender,e);
|
restoreToolStripMenuItem_Click(sender, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private void restoreToolStripMenuItem_Click(object sender, EventArgs e){
|
private void restoreToolStripMenuItem_Click(object sender, EventArgs e){
|
||||||
if (ClickRestore != null){
|
if (ClickRestore != null){
|
||||||
ClickRestore(this,e);
|
ClickRestore(this, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,8 +71,22 @@ namespace TweetDck.Core{
|
|||||||
|
|
||||||
private void closeToolStripMenuItem_Click(object sender, EventArgs e){
|
private void closeToolStripMenuItem_Click(object sender, EventArgs e){
|
||||||
if (ClickClose != null){
|
if (ClickClose != null){
|
||||||
ClickClose(this,e);
|
ClickClose(this, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,13 +8,13 @@ namespace TweetDck.Core.Utils{
|
|||||||
static class BrowserCache{
|
static class BrowserCache{
|
||||||
private static bool ClearOnExit { get; set; }
|
private static bool ClearOnExit { get; set; }
|
||||||
|
|
||||||
private static readonly string IndexFile = Path.Combine(Program.StoragePath,"index");
|
private static readonly string IndexFile = Path.Combine(Program.StoragePath, "index");
|
||||||
|
|
||||||
private static IEnumerable<string> CacheFiles{
|
private static IEnumerable<string> CacheFiles{
|
||||||
get{
|
get{
|
||||||
return Directory.EnumerateFiles(Program.StoragePath).Where(path => {
|
return Directory.EnumerateFiles(Program.StoragePath).Where(path => {
|
||||||
string file = Path.GetFileName(path);
|
string file = Path.GetFileName(path);
|
||||||
return file != null && (file.StartsWith("data_",StringComparison.Ordinal) || file.StartsWith("f_",StringComparison.Ordinal));
|
return file != null && (file.StartsWith("data_", StringComparison.Ordinal) || file.StartsWith("f_", StringComparison.Ordinal));
|
||||||
}).Concat(new[]{ IndexFile });
|
}).Concat(new[]{ IndexFile });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,7 @@ namespace TweetDck.Core.Utils{
|
|||||||
}).Sum();
|
}).Sum();
|
||||||
});
|
});
|
||||||
|
|
||||||
task.ContinueWith(originalTask => callbackBytes(originalTask.Exception == null ? originalTask.Result : -1L),TaskContinuationOptions.ExecuteSynchronously);
|
task.ContinueWith(originalTask => callbackBytes(originalTask.Exception == null ? originalTask.Result : -1L), TaskContinuationOptions.ExecuteSynchronously);
|
||||||
task.Start();
|
task.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ namespace TweetDck.Core.Utils{
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
client.DownloadFileAsync(new Uri(url),target);
|
client.DownloadFileAsync(new Uri(url), target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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.Length != 0){
|
||||||
|
dictionary[key] = value;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -3,8 +3,8 @@ using System.IO;
|
|||||||
|
|
||||||
namespace TweetDck.Core.Utils{
|
namespace TweetDck.Core.Utils{
|
||||||
static class HardwareAcceleration{
|
static class HardwareAcceleration{
|
||||||
private static readonly string LibEGL = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"libEGL.dll");
|
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 LibGLES = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "libGLESv2.dll");
|
||||||
|
|
||||||
private static readonly string DisabledLibEGL = LibEGL+".bak";
|
private static readonly string DisabledLibEGL = LibEGL+".bak";
|
||||||
private static readonly string DisabledLibGLES = LibGLES+".bak";
|
private static readonly string DisabledLibGLES = LibGLES+".bak";
|
||||||
@@ -25,8 +25,8 @@ namespace TweetDck.Core.Utils{
|
|||||||
if (IsEnabled)return false;
|
if (IsEnabled)return false;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
File.Move(DisabledLibEGL,LibEGL);
|
File.Move(DisabledLibEGL, LibEGL);
|
||||||
File.Move(DisabledLibGLES,LibGLES);
|
File.Move(DisabledLibGLES, LibGLES);
|
||||||
return true;
|
return true;
|
||||||
}catch{
|
}catch{
|
||||||
return false;
|
return false;
|
||||||
@@ -49,8 +49,8 @@ namespace TweetDck.Core.Utils{
|
|||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
File.Move(LibEGL,DisabledLibEGL);
|
File.Move(LibEGL, DisabledLibEGL);
|
||||||
File.Move(LibGLES,DisabledLibGLES);
|
File.Move(LibGLES, DisabledLibGLES);
|
||||||
return true;
|
return true;
|
||||||
}catch{
|
}catch{
|
||||||
return false;
|
return false;
|
||||||
|
@@ -16,12 +16,14 @@ namespace TweetDck.Core.Utils{
|
|||||||
|
|
||||||
public const int SB_HORZ = 0;
|
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("Shell32.dll")]
|
public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||||
public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
|
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
|
||||||
public static extern bool SetWindowPos(int hWnd, int hWndOrder, int x, int y, int width, int height, uint flags);
|
public static extern bool SetWindowPos(int hWnd, int hWndOrder, int x, int y, int width, int height, uint flags);
|
||||||
@@ -39,8 +41,17 @@ namespace TweetDck.Core.Utils{
|
|||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SimulateMouseClick(MouseButton button){
|
public static void SimulateMouseClick(MouseButton button){
|
||||||
@@ -60,8 +71,8 @@ namespace TweetDck.Core.Utils{
|
|||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mouse_event(flagHold,Cursor.Position.X,Cursor.Position.Y,0,0);
|
mouse_event(flagHold, Cursor.Position.X, Cursor.Position.Y, 0, 0);
|
||||||
mouse_event(flagRelease,Cursor.Position.X,Cursor.Position.Y,0,0);
|
mouse_event(flagRelease, Cursor.Position.X, Cursor.Position.Y, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,7 +13,7 @@ namespace TweetDck.Migration{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e){
|
protected override void OnPaint(PaintEventArgs e){
|
||||||
e.Graphics.DrawIcon(SystemIcons.Question,10,10);
|
e.Graphics.DrawIcon(SystemIcons.Question, 10, 10);
|
||||||
base.OnPaint(e);
|
base.OnPaint(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,42 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using Shell32;
|
|
||||||
|
|
||||||
namespace TweetDck.Migration.Helpers{
|
|
||||||
sealed class LnkEditor{
|
|
||||||
private readonly ShellLinkObject obj;
|
|
||||||
|
|
||||||
public LnkEditor(string file){
|
|
||||||
try{
|
|
||||||
Shell shell = new Shell();
|
|
||||||
Folder folder = shell.NameSpace(Path.GetDirectoryName(file));
|
|
||||||
FolderItem item = folder.Items().Item(Path.GetFileName(file));
|
|
||||||
|
|
||||||
obj = item.GetLink as ShellLinkObject;
|
|
||||||
}catch(Exception){
|
|
||||||
obj = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetComment(string newComment){
|
|
||||||
if (obj == null)return;
|
|
||||||
obj.Description = newComment;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetPath(string newPath){
|
|
||||||
if (obj == null)return;
|
|
||||||
obj.Path = newPath;
|
|
||||||
obj.SetIconLocation(newPath,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetWorkingDirectory(string newWorkingDirectory){
|
|
||||||
if (obj == null)return;
|
|
||||||
obj.WorkingDirectory = newWorkingDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Save(){
|
|
||||||
if (obj == null)return;
|
|
||||||
obj.Save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -5,12 +5,12 @@ using Microsoft.Win32;
|
|||||||
namespace TweetDck.Migration.Helpers{
|
namespace TweetDck.Migration.Helpers{
|
||||||
static class ProgramRegistrySearch{
|
static class ProgramRegistrySearch{
|
||||||
public static string FindByDisplayName(string displayName){
|
public static string FindByDisplayName(string displayName){
|
||||||
Predicate<RegistryKey> predicate = key => displayName.Equals(key.GetValue("DisplayName") as string,StringComparison.OrdinalIgnoreCase);
|
Predicate<RegistryKey> predicate = key => displayName.Equals(key.GetValue("DisplayName") as string, StringComparison.OrdinalIgnoreCase);
|
||||||
string guid;
|
string guid;
|
||||||
|
|
||||||
return FindMatchingSubKey(Registry.LocalMachine,@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",predicate,out guid) ||
|
return FindMatchingSubKey(Registry.LocalMachine, @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", predicate, out guid) ||
|
||||||
FindMatchingSubKey(Registry.LocalMachine,@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",predicate,out guid) ||
|
FindMatchingSubKey(Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", predicate, out guid) ||
|
||||||
FindMatchingSubKey(Registry.CurrentUser,@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",predicate,out guid)
|
FindMatchingSubKey(Registry.CurrentUser, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", predicate, out guid)
|
||||||
? guid : null;
|
? guid : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,10 +18,10 @@ namespace TweetDck.Migration.Helpers{
|
|||||||
string outputId = null;
|
string outputId = null;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
RegistryKey parentKey = keyHandle.OpenSubKey(path,false);
|
RegistryKey parentKey = keyHandle.OpenSubKey(path, false);
|
||||||
if (parentKey == null)throw new InvalidOperationException();
|
if (parentKey == null)throw new InvalidOperationException();
|
||||||
|
|
||||||
foreach(RegistryKey subKey in parentKey.GetSubKeyNames().Select(subName => parentKey.OpenSubKey(subName,false)).Where(subKey => subKey != null)){
|
foreach(RegistryKey subKey in parentKey.GetSubKeyNames().Select(subName => parentKey.OpenSubKey(subName, false)).Where(subKey => subKey != null)){
|
||||||
if (predicate(subKey)){
|
if (predicate(subKey)){
|
||||||
outputId = subKey.Name.Substring(subKey.Name.LastIndexOf('\\')+1);
|
outputId = subKey.Name.Substring(subKey.Name.LastIndexOf('\\')+1);
|
||||||
subKey.Close();
|
subKey.Close();
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -8,14 +7,30 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using TweetDck.Migration.Helpers;
|
using TweetDck.Migration.Helpers;
|
||||||
using TweetDck.Core.Utils;
|
|
||||||
|
|
||||||
namespace TweetDck.Migration{
|
namespace TweetDck.Migration{
|
||||||
static class MigrationManager{
|
static class MigrationManager{
|
||||||
private static readonly string TweetDeckPathParent = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"twitter");
|
private static readonly string TweetDeckPathParent = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "twitter");
|
||||||
private static readonly string TweetDeckPath = Path.Combine(TweetDeckPathParent,"TweetDeck");
|
private static readonly string TweetDeckPath = Path.Combine(TweetDeckPathParent, "TweetDeck");
|
||||||
|
|
||||||
|
private static readonly string TweetDickStorage = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TweetDick");
|
||||||
|
|
||||||
public static void Run(){
|
public static void Run(){
|
||||||
|
#if DUCK
|
||||||
|
if (!Program.IsPortable && Directory.Exists(TweetDickStorage) && !Directory.Exists(Program.StoragePath)){
|
||||||
|
if (MessageBox.Show("Welcome to TweetDuck! Would you like to move your old TweetDick configuration and login data?", "TweetDick Migration", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes){
|
||||||
|
try{
|
||||||
|
Directory.Move(TweetDickStorage, Program.StoragePath);
|
||||||
|
MessageBox.Show("All done! You can now uninstall TweetDick.", "TweetDick Migration", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
|
}catch(Exception ex){
|
||||||
|
Program.HandleException("An unexpected exception has occurred during the migration process.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!Program.UserConfig.IgnoreMigration && Directory.Exists(TweetDeckPath)){
|
if (!Program.UserConfig.IgnoreMigration && Directory.Exists(TweetDeckPath)){
|
||||||
MigrationDecision decision;
|
MigrationDecision decision;
|
||||||
|
|
||||||
@@ -29,11 +44,11 @@ namespace TweetDck.Migration{
|
|||||||
FormBackgroundWork formWait = new FormBackgroundWork();
|
FormBackgroundWork formWait = new FormBackgroundWork();
|
||||||
|
|
||||||
formWait.ShowWorkDialog(() => {
|
formWait.ShowWorkDialog(() => {
|
||||||
if (!BeginMigration(decision,ex => formWait.Invoke(new Action(() => {
|
if (!BeginMigration(decision, ex => formWait.Invoke(new Action(() => {
|
||||||
formWait.Close();
|
formWait.Close();
|
||||||
|
|
||||||
if (ex != null){
|
if (ex != null){
|
||||||
Program.HandleException("An unexpected exception has occurred during the migration process.",ex);
|
Program.HandleException("An unexpected exception has occurred during the migration process.", ex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,8 +70,8 @@ namespace TweetDck.Migration{
|
|||||||
else if (!Program.UserConfig.IgnoreUninstallCheck){
|
else if (!Program.UserConfig.IgnoreUninstallCheck){
|
||||||
string guid = ProgramRegistrySearch.FindByDisplayName("TweetDeck");
|
string guid = ProgramRegistrySearch.FindByDisplayName("TweetDeck");
|
||||||
|
|
||||||
if (guid != null && MessageBox.Show("TweetDeck is still installed on your computer, do you want to uninstall it?","Uninstall TweetDeck",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
if (guid != null && MessageBox.Show("TweetDeck is still installed on your computer, do you want to uninstall it?", "Uninstall TweetDeck", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
RunUninstaller(guid,0);
|
RunUninstaller(guid, 0);
|
||||||
CleanupTweetDeck();
|
CleanupTweetDeck();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,8 +87,8 @@ namespace TweetDck.Migration{
|
|||||||
|
|
||||||
Task task = new Task(() => {
|
Task task = new Task(() => {
|
||||||
Directory.CreateDirectory(Program.StoragePath);
|
Directory.CreateDirectory(Program.StoragePath);
|
||||||
Directory.CreateDirectory(Path.Combine(Program.StoragePath,"localStorage"));
|
Directory.CreateDirectory(Path.Combine(Program.StoragePath, "localStorage"));
|
||||||
Directory.CreateDirectory(Path.Combine(Program.StoragePath,"Local Storage"));
|
Directory.CreateDirectory(Path.Combine(Program.StoragePath, "Local Storage"));
|
||||||
|
|
||||||
CopyFile("Cookies");
|
CopyFile("Cookies");
|
||||||
CopyFile("Cookies-journal");
|
CopyFile("Cookies-journal");
|
||||||
@@ -105,7 +120,7 @@ namespace TweetDck.Migration{
|
|||||||
// delete folders
|
// delete folders
|
||||||
for(int wait = 0; wait < 50; wait++){
|
for(int wait = 0; wait < 50; wait++){
|
||||||
try{
|
try{
|
||||||
Directory.Delete(TweetDeckPath,true);
|
Directory.Delete(TweetDeckPath, true);
|
||||||
break;
|
break;
|
||||||
}catch(Exception){
|
}catch(Exception){
|
||||||
// browser subprocess not ended yet, wait
|
// browser subprocess not ended yet, wait
|
||||||
@@ -114,48 +129,18 @@ namespace TweetDck.Migration{
|
|||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Directory.Delete(TweetDeckPathParent,false);
|
Directory.Delete(TweetDeckPathParent, false);
|
||||||
}catch(IOException){
|
}catch(IOException){
|
||||||
// most likely not empty, ignore
|
// most likely not empty, ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decision == MigrationDecision.MigratePurge){
|
if (decision == MigrationDecision.MigratePurge){
|
||||||
// update the lnk files wherever possible (desktop icons, pinned taskbar, start menu)
|
|
||||||
foreach(string location in GetLnkDirectories()){
|
|
||||||
if (string.IsNullOrEmpty(location))continue;
|
|
||||||
|
|
||||||
string linkFile = Path.Combine(location,"TweetDeck.lnk");
|
|
||||||
|
|
||||||
if (File.Exists(linkFile)){
|
|
||||||
LnkEditor lnk = new LnkEditor(linkFile);
|
|
||||||
lnk.SetPath(Application.ExecutablePath);
|
|
||||||
lnk.SetWorkingDirectory(Environment.CurrentDirectory);
|
|
||||||
lnk.SetComment(Program.BrandName+" client for Windows");
|
|
||||||
lnk.Save();
|
|
||||||
|
|
||||||
string renamed = Path.Combine(location,Program.BrandName+".lnk");
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (!File.Exists(renamed)){
|
|
||||||
File.Move(linkFile,renamed);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
File.Delete(linkFile);
|
|
||||||
}
|
|
||||||
}catch{
|
|
||||||
// eh, too bad
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeMethods.SHChangeNotify(0x8000000,0x1000,IntPtr.Zero,IntPtr.Zero); // refreshes desktop
|
|
||||||
|
|
||||||
// uninstall in the background
|
// uninstall in the background
|
||||||
string guid = ProgramRegistrySearch.FindByDisplayName("TweetDeck");
|
string guid = ProgramRegistrySearch.FindByDisplayName("TweetDeck");
|
||||||
|
|
||||||
if (guid != null){
|
if (guid != null){
|
||||||
RunUninstaller(guid,5000);
|
RunUninstaller(guid, 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// registry cleanup
|
// registry cleanup
|
||||||
@@ -165,7 +150,7 @@ namespace TweetDck.Migration{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
task.ContinueWith(originalTask => onFinished(originalTask.Exception),TaskContinuationOptions.ExecuteSynchronously);
|
task.ContinueWith(originalTask => onFinished(originalTask.Exception), TaskContinuationOptions.ExecuteSynchronously);
|
||||||
task.Start();
|
task.Start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -173,20 +158,14 @@ namespace TweetDck.Migration{
|
|||||||
|
|
||||||
private static void CopyFile(string relativePath){
|
private static void CopyFile(string relativePath){
|
||||||
try{
|
try{
|
||||||
File.Copy(Path.Combine(TweetDeckPath,relativePath),Path.Combine(Program.StoragePath,relativePath),true);
|
File.Copy(Path.Combine(TweetDeckPath, relativePath), Path.Combine(Program.StoragePath, relativePath), true);
|
||||||
}catch(FileNotFoundException){
|
}catch(FileNotFoundException){
|
||||||
}catch(DirectoryNotFoundException){
|
}catch(DirectoryNotFoundException){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<string> GetLnkDirectories(){
|
|
||||||
yield return Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
|
|
||||||
yield return Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory);
|
|
||||||
yield return Environment.ExpandEnvironmentVariables(@"%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void RunUninstaller(string guid, int timeout){
|
private static void RunUninstaller(string guid, int timeout){
|
||||||
Process uninstaller = Process.Start("msiexec.exe","/x "+guid+" /quiet /qn");
|
Process uninstaller = Process.Start("msiexec.exe", "/x "+guid+" /quiet /qn");
|
||||||
|
|
||||||
if (uninstaller != null){
|
if (uninstaller != null){
|
||||||
if (timeout > 0){
|
if (timeout > 0){
|
||||||
@@ -199,7 +178,7 @@ namespace TweetDck.Migration{
|
|||||||
|
|
||||||
private static void CleanupTweetDeck(){
|
private static void CleanupTweetDeck(){
|
||||||
try{
|
try{
|
||||||
Registry.CurrentUser.DeleteSubKeyTree(@"Software\Twitter\TweetDeck",true);
|
Registry.CurrentUser.DeleteSubKeyTree(@"Software\Twitter\TweetDeck", true);
|
||||||
Registry.CurrentUser.DeleteSubKey(@"Software\Twitter"); // only if empty
|
Registry.CurrentUser.DeleteSubKey(@"Software\Twitter"); // only if empty
|
||||||
}catch(Exception){
|
}catch(Exception){
|
||||||
// not found or too bad
|
// not found or too bad
|
||||||
|
22
Plugins/Controls/PluginControl.Designer.cs
generated
22
Plugins/Controls/PluginControl.Designer.cs
generated
@@ -31,6 +31,7 @@
|
|||||||
this.flowLayoutInfo = new System.Windows.Forms.FlowLayoutPanel();
|
this.flowLayoutInfo = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
this.labelWebsite = new System.Windows.Forms.Label();
|
this.labelWebsite = new System.Windows.Forms.Label();
|
||||||
this.labelVersion = new System.Windows.Forms.Label();
|
this.labelVersion = new System.Windows.Forms.Label();
|
||||||
|
this.btnOpenConfig = new System.Windows.Forms.Button();
|
||||||
this.panelDescription.SuspendLayout();
|
this.panelDescription.SuspendLayout();
|
||||||
this.flowLayoutInfo.SuspendLayout();
|
this.flowLayoutInfo.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@@ -38,9 +39,9 @@
|
|||||||
// btnToggleState
|
// btnToggleState
|
||||||
//
|
//
|
||||||
this.btnToggleState.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
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.Location = new System.Drawing.Point(459, 80);
|
||||||
this.btnToggleState.Name = "btnToggleState";
|
this.btnToggleState.Name = "btnToggleState";
|
||||||
this.btnToggleState.Size = new System.Drawing.Size(75, 23);
|
this.btnToggleState.Size = new System.Drawing.Size(65, 23);
|
||||||
this.btnToggleState.TabIndex = 0;
|
this.btnToggleState.TabIndex = 0;
|
||||||
this.btnToggleState.Text = "Disable";
|
this.btnToggleState.Text = "Disable";
|
||||||
this.btnToggleState.UseVisualStyleBackColor = true;
|
this.btnToggleState.UseVisualStyleBackColor = true;
|
||||||
@@ -99,7 +100,7 @@
|
|||||||
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
|
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
|
||||||
this.flowLayoutInfo.Location = new System.Drawing.Point(11, 85);
|
this.flowLayoutInfo.Location = new System.Drawing.Point(11, 85);
|
||||||
this.flowLayoutInfo.Name = "flowLayoutInfo";
|
this.flowLayoutInfo.Name = "flowLayoutInfo";
|
||||||
this.flowLayoutInfo.Size = new System.Drawing.Size(432, 18);
|
this.flowLayoutInfo.Size = new System.Drawing.Size(368, 18);
|
||||||
this.flowLayoutInfo.TabIndex = 4;
|
this.flowLayoutInfo.TabIndex = 4;
|
||||||
this.flowLayoutInfo.WrapContents = false;
|
this.flowLayoutInfo.WrapContents = false;
|
||||||
//
|
//
|
||||||
@@ -128,17 +129,29 @@
|
|||||||
this.labelVersion.Text = "Version";
|
this.labelVersion.Text = "Version";
|
||||||
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
//
|
//
|
||||||
|
// btnOpenConfig
|
||||||
|
//
|
||||||
|
this.btnOpenConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnOpenConfig.Location = new System.Drawing.Point(385, 80);
|
||||||
|
this.btnOpenConfig.Name = "btnOpenConfig";
|
||||||
|
this.btnOpenConfig.Size = new System.Drawing.Size(68, 23);
|
||||||
|
this.btnOpenConfig.TabIndex = 6;
|
||||||
|
this.btnOpenConfig.Text = "Configure";
|
||||||
|
this.btnOpenConfig.UseVisualStyleBackColor = true;
|
||||||
|
this.btnOpenConfig.Click += new System.EventHandler(this.btnOpenConfig_Click);
|
||||||
|
//
|
||||||
// PluginControl
|
// PluginControl
|
||||||
//
|
//
|
||||||
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.Controls.Add(this.btnOpenConfig);
|
||||||
this.Controls.Add(this.flowLayoutInfo);
|
this.Controls.Add(this.flowLayoutInfo);
|
||||||
this.Controls.Add(this.panelDescription);
|
this.Controls.Add(this.panelDescription);
|
||||||
this.Controls.Add(this.labelName);
|
this.Controls.Add(this.labelName);
|
||||||
this.Controls.Add(this.btnToggleState);
|
this.Controls.Add(this.btnToggleState);
|
||||||
this.Controls.Add(this.labelVersion);
|
this.Controls.Add(this.labelVersion);
|
||||||
this.MaximumSize = new System.Drawing.Size(65535, 109);
|
this.MaximumSize = new System.Drawing.Size(65535, 109);
|
||||||
this.MinimumSize = new System.Drawing.Size(0, 83);
|
this.MinimumSize = new System.Drawing.Size(0, 61);
|
||||||
this.Name = "PluginControl";
|
this.Name = "PluginControl";
|
||||||
this.Padding = new System.Windows.Forms.Padding(3);
|
this.Padding = new System.Windows.Forms.Padding(3);
|
||||||
this.Size = new System.Drawing.Size(530, 109);
|
this.Size = new System.Drawing.Size(530, 109);
|
||||||
@@ -161,5 +174,6 @@
|
|||||||
private System.Windows.Forms.FlowLayoutPanel flowLayoutInfo;
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutInfo;
|
||||||
private System.Windows.Forms.Label labelWebsite;
|
private System.Windows.Forms.Label labelWebsite;
|
||||||
private System.Windows.Forms.Label labelVersion;
|
private System.Windows.Forms.Label labelVersion;
|
||||||
|
private System.Windows.Forms.Button btnOpenConfig;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDck.Core.Utils;
|
using TweetDck.Core.Utils;
|
||||||
|
|
||||||
@@ -21,19 +23,24 @@ namespace TweetDck.Plugins.Controls{
|
|||||||
this.labelVersion.Text = plugin.Version;
|
this.labelVersion.Text = plugin.Version;
|
||||||
this.labelAuthor.Text = plugin.Author;
|
this.labelAuthor.Text = plugin.Author;
|
||||||
this.labelWebsite.Text = plugin.Website;
|
this.labelWebsite.Text = plugin.Website;
|
||||||
this.btnToggleState.Text = pluginManager.Config.IsEnabled(plugin) ? "Disable" : "Enable";
|
|
||||||
|
|
||||||
if (!plugin.CanRun){
|
UpdatePluginState();
|
||||||
this.labelName.ForeColor = Color.DarkRed;
|
|
||||||
this.btnToggleState.Enabled = false;
|
if (labelDescription.Text.Length == 0){
|
||||||
|
labelDescription.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
panelDescription_Resize(panelDescription,new EventArgs());
|
panelDescription_Resize(panelDescription, new EventArgs());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void panelDescription_Resize(object sender, EventArgs e){
|
private void panelDescription_Resize(object sender, EventArgs e){
|
||||||
labelDescription.MaximumSize = new Size(panelDescription.Width-SystemInformation.VerticalScrollBarWidth,0);
|
if (labelDescription.Text.Length == 0){
|
||||||
Height = Math.Min(MinimumSize.Height+(labelDescription.Height-13),MaximumSize.Height);
|
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){
|
private void labelWebsite_Click(object sender, EventArgs e){
|
||||||
@@ -42,11 +49,38 @@ namespace TweetDck.Plugins.Controls{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void btnOpenConfig_Click(object sender, EventArgs e){
|
||||||
|
using(Process.Start("explorer.exe", "/select,\""+plugin.ConfigPath+"\"")){}
|
||||||
|
}
|
||||||
|
|
||||||
private void btnToggleState_Click(object sender, EventArgs e){
|
private void btnToggleState_Click(object sender, EventArgs e){
|
||||||
bool newState = !pluginManager.Config.IsEnabled(plugin);
|
bool newState = !pluginManager.Config.IsEnabled(plugin);
|
||||||
pluginManager.Config.SetEnabled(plugin,newState);
|
pluginManager.Config.SetEnabled(plugin, newState);
|
||||||
|
|
||||||
btnToggleState.Text = newState ? "Disable" : "Enable";
|
UpdatePluginState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdatePluginState(){
|
||||||
|
bool isEnabled = plugin.CanRun && pluginManager.Config.IsEnabled(plugin);
|
||||||
|
Color textColor = isEnabled ? Color.Black : Color.FromArgb(90, 90, 90);
|
||||||
|
|
||||||
|
labelVersion.ForeColor = textColor;
|
||||||
|
labelAuthor.ForeColor = textColor;
|
||||||
|
labelWebsite.ForeColor = isEnabled ? Color.Blue : Color.FromArgb(90, 90, 249);
|
||||||
|
|
||||||
|
if (plugin.CanRun){
|
||||||
|
labelName.ForeColor = textColor;
|
||||||
|
labelDescription.ForeColor = textColor;
|
||||||
|
btnToggleState.Text = isEnabled ? "Disable" : "Enable";
|
||||||
|
btnOpenConfig.Visible = plugin.HasConfig;
|
||||||
|
btnOpenConfig.Enabled = btnOpenConfig.Visible && File.Exists(plugin.ConfigPath);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
labelName.ForeColor = Color.DarkRed;
|
||||||
|
labelDescription.ForeColor = Color.DarkRed;
|
||||||
|
btnToggleState.Visible = false;
|
||||||
|
btnOpenConfig.Visible = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,13 @@ using TweetDck.Core.Utils;
|
|||||||
|
|
||||||
namespace TweetDck.Plugins.Controls{
|
namespace TweetDck.Plugins.Controls{
|
||||||
sealed partial class PluginListFlowLayout : FlowLayoutPanel{
|
sealed partial class PluginListFlowLayout : FlowLayoutPanel{
|
||||||
|
public PluginListFlowLayout(){
|
||||||
|
FlowDirection = FlowDirection.TopDown;
|
||||||
|
WrapContents = false;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
NativeMethods.ShowScrollBar(Handle,NativeMethods.SB_HORZ,false); // basically fuck the horizontal scrollbar very much
|
NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much
|
||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,8 @@ namespace TweetDck.Plugins{
|
|||||||
public string Author { get { return metadata["AUTHOR"]; } }
|
public string Author { get { return metadata["AUTHOR"]; } }
|
||||||
public string Version { get { return metadata["VERSION"]; } }
|
public string Version { get { return metadata["VERSION"]; } }
|
||||||
public string Website { get { return metadata["WEBSITE"]; } }
|
public string Website { get { return metadata["WEBSITE"]; } }
|
||||||
|
public string ConfigFile { get { return metadata["CONFIGFILE"]; } }
|
||||||
|
public string ConfigDefault { get { return metadata["CONFIGDEFAULT"]; } }
|
||||||
public string RequiredVersion { get { return metadata["REQUIRES"]; } }
|
public string RequiredVersion { get { return metadata["REQUIRES"]; } }
|
||||||
public PluginGroup Group { get; private set; }
|
public PluginGroup Group { get; private set; }
|
||||||
public PluginEnvironment Environments { get; private set; }
|
public PluginEnvironment Environments { get; private set; }
|
||||||
@@ -22,14 +24,46 @@ namespace TweetDck.Plugins{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string FolderPath{
|
||||||
|
get{
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasConfig{
|
||||||
|
get{
|
||||||
|
return ConfigFile.Length > 0 && GetFullPathIfSafe(ConfigFile).Length > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ConfigPath{
|
||||||
|
get{
|
||||||
|
return HasConfig ? Path.Combine(path, ConfigFile) : string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasDefaultConfig{
|
||||||
|
get{
|
||||||
|
return ConfigDefault.Length > 0 && GetFullPathIfSafe(ConfigDefault).Length > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DefaultConfigPath{
|
||||||
|
get{
|
||||||
|
return HasDefaultConfig ? Path.Combine(path, ConfigDefault) : string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private readonly string path;
|
private readonly string path;
|
||||||
private readonly string identifier;
|
private readonly string identifier;
|
||||||
private readonly Dictionary<string,string> metadata = new Dictionary<string,string>(4){
|
private readonly Dictionary<string, string> metadata = new Dictionary<string, string>(4){
|
||||||
{ "NAME", "" },
|
{ "NAME", "" },
|
||||||
{ "DESCRIPTION", "" },
|
{ "DESCRIPTION", "" },
|
||||||
{ "AUTHOR", "(anonymous)" },
|
{ "AUTHOR", "(anonymous)" },
|
||||||
{ "VERSION", "(unknown)" },
|
{ "VERSION", "(unknown)" },
|
||||||
{ "WEBSITE", "" },
|
{ "WEBSITE", "" },
|
||||||
|
{ "CONFIGFILE", "" },
|
||||||
|
{ "CONFIGDEFAULT", "" },
|
||||||
{ "REQUIRES", "*" }
|
{ "REQUIRES", "*" }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,16 +76,50 @@ namespace TweetDck.Plugins{
|
|||||||
this.Environments = PluginEnvironment.None;
|
this.Environments = PluginEnvironment.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnMetadataLoaded(){
|
||||||
|
string configPath = ConfigPath, defaultConfigPath = DefaultConfigPath;
|
||||||
|
|
||||||
|
if (configPath.Length > 0 && defaultConfigPath.Length > 0 && !File.Exists(configPath) && File.Exists(defaultConfigPath)){
|
||||||
|
try{
|
||||||
|
File.Copy(defaultConfigPath, configPath, false);
|
||||||
|
}catch(Exception e){
|
||||||
|
Program.HandleException("Could not generate a configuration file for '"+identifier+"' plugin.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string GetScriptPath(PluginEnvironment environment){
|
public string GetScriptPath(PluginEnvironment environment){
|
||||||
if (Environments.HasFlag(environment)){
|
if (Environments.HasFlag(environment)){
|
||||||
string file = environment.GetScriptFile();
|
string file = environment.GetScriptFile();
|
||||||
return file != null ? Path.Combine(path,file) : string.Empty;
|
return file != null ? Path.Combine(path, file) : string.Empty;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetFullPathIfSafe(string relativePath){
|
||||||
|
string fullPath = Path.Combine(path, relativePath);
|
||||||
|
|
||||||
|
try{
|
||||||
|
string folderPathName = new DirectoryInfo(path).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 override string ToString(){
|
public override string ToString(){
|
||||||
return Identifier;
|
return Identifier;
|
||||||
}
|
}
|
||||||
@@ -66,13 +134,13 @@ namespace TweetDck.Plugins{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Plugin CreateFromFolder(string path, PluginGroup group, out string error){
|
public static Plugin CreateFromFolder(string path, PluginGroup group, out string error){
|
||||||
Plugin plugin = new Plugin(path,group);
|
Plugin plugin = new Plugin(path, group);
|
||||||
|
|
||||||
if (!LoadMetadata(path,plugin,out error)){
|
if (!LoadMetadata(path, plugin, out error)){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LoadEnvironments(path,plugin,out error)){
|
if (!LoadEnvironments(path, plugin, out error)){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,16 +149,8 @@ namespace TweetDck.Plugins{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static bool LoadEnvironments(string path, Plugin plugin, out string error){
|
private static bool LoadEnvironments(string path, Plugin plugin, out string error){
|
||||||
foreach(string file in Directory.EnumerateFiles(path,"*.js",SearchOption.TopDirectoryOnly).Select(Path.GetFileName)){
|
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));
|
plugin.Environments |= 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){
|
if (plugin.Environments == PluginEnvironment.None){
|
||||||
@@ -105,14 +165,14 @@ namespace TweetDck.Plugins{
|
|||||||
private static readonly string[] endTag = { "[END]" };
|
private static readonly string[] endTag = { "[END]" };
|
||||||
|
|
||||||
private static bool LoadMetadata(string path, Plugin plugin, out string error){
|
private static bool LoadMetadata(string path, Plugin plugin, out string error){
|
||||||
string metaFile = Path.Combine(path,".meta");
|
string metaFile = Path.Combine(path, ".meta");
|
||||||
|
|
||||||
if (!File.Exists(metaFile)){
|
if (!File.Exists(metaFile)){
|
||||||
error = "Missing .meta file.";
|
error = "Missing .meta file.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
string[] lines = File.ReadAllLines(metaFile,Encoding.UTF8);
|
string[] lines = File.ReadAllLines(metaFile, Encoding.UTF8);
|
||||||
string currentTag = null, currentContents = "";
|
string currentTag = null, currentContents = "";
|
||||||
|
|
||||||
foreach(string line in lines.Concat(endTag).Select(line => line.TrimEnd()).Where(line => line.Length > 0)){
|
foreach(string line in lines.Concat(endTag).Select(line => line.TrimEnd()).Where(line => line.Length > 0)){
|
||||||
@@ -121,7 +181,7 @@ namespace TweetDck.Plugins{
|
|||||||
plugin.metadata[currentTag] = currentContents;
|
plugin.metadata[currentTag] = currentContents;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentTag = line.Substring(1,line.Length-2).ToUpperInvariant();
|
currentTag = line.Substring(1, line.Length-2).ToUpperInvariant();
|
||||||
currentContents = "";
|
currentContents = "";
|
||||||
|
|
||||||
if (line.Equals(endTag[0])){
|
if (line.Equals(endTag[0])){
|
||||||
@@ -149,17 +209,19 @@ namespace TweetDck.Plugins{
|
|||||||
|
|
||||||
Version ver;
|
Version ver;
|
||||||
|
|
||||||
if (plugin.RequiredVersion.Length == 0 || !(plugin.RequiredVersion.Equals("*") || System.Version.TryParse(plugin.RequiredVersion,out ver))){
|
if (plugin.RequiredVersion.Length == 0 || !(plugin.RequiredVersion.Equals("*") || System.Version.TryParse(plugin.RequiredVersion, out ver))){
|
||||||
error = "Plugin contains invalid version: "+plugin.RequiredVersion;
|
error = "Plugin contains invalid version: "+plugin.RequiredVersion;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plugin.OnMetadataLoaded();
|
||||||
|
|
||||||
error = string.Empty;
|
error = string.Empty;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool CheckRequiredVersion(string requires){
|
private static bool CheckRequiredVersion(string requires){
|
||||||
return requires.Equals("*",StringComparison.Ordinal) || Program.Version >= new Version(requires);
|
return requires.Equals("*", StringComparison.Ordinal) || Program.Version >= new Version(requires);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
83
Plugins/PluginBridge.cs
Normal file
83
Plugins/PluginBridge.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
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);
|
||||||
|
return plugin == null ? string.Empty : plugin.GetFullPathIfSafe(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
return fileCache[fullPath] = File.ReadAllText(fullPath, Encoding.UTF8);
|
||||||
|
}catch(FileNotFoundException){
|
||||||
|
throw new Exception("File not found.");
|
||||||
|
}catch(DirectoryNotFoundException){
|
||||||
|
throw new Exception("Directory not found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DeleteFile(int token, string path){
|
||||||
|
string fullPath = GetFullPathIfSafe(token, path);
|
||||||
|
|
||||||
|
if (fullPath.Length == 0){
|
||||||
|
throw new Exception("File path has to be relative to the plugin folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fileCache.Remove(fullPath);
|
||||||
|
File.Delete(fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CheckFileExists(int token, string path){
|
||||||
|
string fullPath = GetFullPathIfSafe(token, path);
|
||||||
|
|
||||||
|
if (fullPath.Length == 0){
|
||||||
|
throw new Exception("File path has to be relative to the plugin folder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return File.Exists(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -4,7 +4,7 @@ using TweetDck.Plugins.Events;
|
|||||||
|
|
||||||
namespace TweetDck.Plugins{
|
namespace TweetDck.Plugins{
|
||||||
[Serializable]
|
[Serializable]
|
||||||
class PluginConfig{
|
sealed class PluginConfig{
|
||||||
[field:NonSerialized]
|
[field:NonSerialized]
|
||||||
public event EventHandler<PluginChangedStateEventArgs> PluginChangedState;
|
public event EventHandler<PluginChangedStateEventArgs> PluginChangedState;
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ namespace TweetDck.Plugins{
|
|||||||
public void SetEnabled(Plugin plugin, bool enabled){
|
public void SetEnabled(Plugin plugin, bool enabled){
|
||||||
if ((enabled && Disabled.Remove(plugin.Identifier)) || (!enabled && Disabled.Add(plugin.Identifier))){
|
if ((enabled && Disabled.Remove(plugin.Identifier)) || (!enabled && Disabled.Add(plugin.Identifier))){
|
||||||
if (PluginChangedState != null){
|
if (PluginChangedState != null){
|
||||||
PluginChangedState(this,new PluginChangedStateEventArgs(plugin,enabled));
|
PluginChangedState(this, new PluginChangedStateEventArgs(plugin, enabled));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -33,5 +33,9 @@ namespace TweetDck.Plugins{
|
|||||||
public bool IsEnabled(Plugin plugin){
|
public bool IsEnabled(Plugin plugin){
|
||||||
return !Disabled.Contains(plugin.Identifier) && plugin.CanRun;
|
return !Disabled.Contains(plugin.Identifier) && plugin.CanRun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DisableOfficialFromConfig(string pluginName){
|
||||||
|
Disabled.Add("official/"+pluginName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,8 +27,8 @@ namespace TweetDck.Plugins{
|
|||||||
|
|
||||||
public static string GetScriptVariables(this PluginEnvironment environment){
|
public static string GetScriptVariables(this PluginEnvironment environment){
|
||||||
switch(environment){
|
switch(environment){
|
||||||
case PluginEnvironment.Browser: return "$,$TD,TD";
|
case PluginEnvironment.Browser: return "$,$TD,$TDP,TD";
|
||||||
case PluginEnvironment.Notification: return "$TD";
|
case PluginEnvironment.Notification: return "$TD,$TDP";
|
||||||
default: return string.Empty;
|
default: return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,23 +10,28 @@ namespace TweetDck.Plugins{
|
|||||||
class PluginManager{
|
class PluginManager{
|
||||||
public const string PluginBrowserScriptFile = "plugins.browser.js";
|
public const string PluginBrowserScriptFile = "plugins.browser.js";
|
||||||
public const string PluginNotificationScriptFile = "plugins.notification.js";
|
public const string PluginNotificationScriptFile = "plugins.notification.js";
|
||||||
|
public const string PluginGlobalScriptFile = "plugins.js";
|
||||||
|
|
||||||
public string PathOfficialPlugins { get { return Path.Combine(rootPath,"official"); } }
|
public string PathOfficialPlugins { get { return Path.Combine(rootPath, "official"); } }
|
||||||
public string PathCustomPlugins { get { return Path.Combine(rootPath,"user"); } }
|
public string PathCustomPlugins { get { return Path.Combine(rootPath, "user"); } }
|
||||||
|
|
||||||
public IEnumerable<Plugin> Plugins { get { return plugins; } }
|
public IEnumerable<Plugin> Plugins { get { return plugins; } }
|
||||||
public PluginConfig Config { get; private set; }
|
public PluginConfig Config { get; private set; }
|
||||||
|
public PluginBridge Bridge { get; private set; }
|
||||||
|
|
||||||
public event EventHandler<PluginLoadEventArgs> Reloaded;
|
public event EventHandler<PluginLoadEventArgs> Reloaded;
|
||||||
|
|
||||||
private readonly string rootPath;
|
private readonly string rootPath;
|
||||||
private readonly HashSet<Plugin> plugins = new HashSet<Plugin>();
|
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;
|
private List<string> loadErrors;
|
||||||
|
|
||||||
public PluginManager(string path, PluginConfig config){
|
public PluginManager(string path, PluginConfig config){
|
||||||
this.rootPath = path;
|
this.rootPath = path;
|
||||||
this.Config = config;
|
this.Config = config;
|
||||||
|
this.Bridge = new PluginBridge(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<Plugin> GetPluginsByGroup(PluginGroup group){
|
public IEnumerable<Plugin> GetPluginsByGroup(PluginGroup group){
|
||||||
@@ -41,28 +46,33 @@ namespace TweetDck.Plugins{
|
|||||||
return plugins.Any(plugin => plugin.Environments.HasFlag(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(){
|
public void Reload(){
|
||||||
HashSet<Plugin> prevPlugins = new HashSet<Plugin>(plugins);
|
|
||||||
plugins.Clear();
|
plugins.Clear();
|
||||||
|
tokens.Clear();
|
||||||
|
|
||||||
loadErrors = new List<string>(2);
|
loadErrors = new List<string>(2);
|
||||||
|
|
||||||
foreach(Plugin plugin in LoadPluginsFrom(PathOfficialPlugins,PluginGroup.Official)){
|
foreach(Plugin plugin in LoadPluginsFrom(PathOfficialPlugins, PluginGroup.Official)){
|
||||||
plugins.Add(plugin);
|
plugins.Add(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(Plugin plugin in LoadPluginsFrom(PathCustomPlugins,PluginGroup.Custom)){
|
foreach(Plugin plugin in LoadPluginsFrom(PathCustomPlugins, PluginGroup.Custom)){
|
||||||
plugins.Add(plugin);
|
plugins.Add(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Reloaded != null && (loadErrors.Count > 0 || !prevPlugins.SetEquals(plugins))){
|
if (Reloaded != null){
|
||||||
Reloaded(this,new PluginLoadEventArgs(loadErrors));
|
Reloaded(this, new PluginLoadEventArgs(loadErrors));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ExecutePlugins(IFrame frame, PluginEnvironment environment, bool includeDisabled){
|
public void ExecutePlugins(IFrame frame, PluginEnvironment environment, bool includeDisabled){
|
||||||
if (includeDisabled){
|
if (includeDisabled){
|
||||||
ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GenerateConfig(Config),"gen:pluginconfig");
|
ScriptLoader.ExecuteScript(frame, PluginScriptGenerator.GenerateConfig(Config), "gen:pluginconfig");
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(Plugin plugin in Plugins){
|
foreach(Plugin plugin in Plugins){
|
||||||
@@ -78,14 +88,24 @@ namespace TweetDck.Plugins{
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GeneratePlugin(plugin.Identifier,script,environment),"plugin:"+plugin);
|
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){
|
private IEnumerable<Plugin> LoadPluginsFrom(string path, PluginGroup group){
|
||||||
foreach(string fullDir in Directory.EnumerateDirectories(path,"*",SearchOption.TopDirectoryOnly)){
|
foreach(string fullDir in Directory.EnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly)){
|
||||||
string error;
|
string error;
|
||||||
Plugin plugin = Plugin.CreateFromFolder(fullDir,group,out error);
|
Plugin plugin = Plugin.CreateFromFolder(fullDir, group, out error);
|
||||||
|
|
||||||
if (plugin == null){
|
if (plugin == null){
|
||||||
loadErrors.Add(group.GetIdentifierPrefix()+Path.GetFileName(fullDir)+": "+error);
|
loadErrors.Add(group.GetIdentifierPrefix()+Path.GetFileName(fullDir)+": "+error);
|
||||||
@@ -95,5 +115,17 @@ namespace TweetDck.Plugins{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int GenerateToken(){
|
||||||
|
for(int attempt = 0; attempt < 1000; attempt++){
|
||||||
|
int token = rand.Next();
|
||||||
|
|
||||||
|
if (!tokens.ContainsKey(token)){
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -tokens.Count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,18 +3,22 @@
|
|||||||
namespace TweetDck.Plugins{
|
namespace TweetDck.Plugins{
|
||||||
static class PluginScriptGenerator{
|
static class PluginScriptGenerator{
|
||||||
public static string GenerateConfig(PluginConfig config){
|
public static string GenerateConfig(PluginConfig config){
|
||||||
return config.AnyDisabled ? "window.TD_PLUGINS.disabled = [\""+string.Join("\",\"",config.DisabledPlugins)+"\"];" : string.Empty;
|
return config.AnyDisabled ? "window.TD_PLUGINS.disabled = [\""+string.Join("\",\"", config.DisabledPlugins)+"\"];" : string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GeneratePlugin(string pluginIdentifier, string pluginContents, PluginEnvironment environment){
|
public static string GeneratePlugin(string pluginIdentifier, string pluginContents, int pluginToken, PluginEnvironment environment){
|
||||||
StringBuilder build = new StringBuilder(pluginIdentifier.Length+pluginContents.Length+110);
|
StringBuilder build = new StringBuilder(2*pluginIdentifier.Length+pluginContents.Length+165);
|
||||||
|
|
||||||
build.Append("(function(").Append(environment.GetScriptVariables()).Append("){");
|
build.Append("(function(").Append(environment.GetScriptVariables()).Append("){");
|
||||||
|
|
||||||
build.Append("window.TD_PLUGINS.install({");
|
build.Append("let tmp={");
|
||||||
build.Append("id:\"").Append(pluginIdentifier).Append("\",");
|
build.Append("id:\"").Append(pluginIdentifier).Append("\",");
|
||||||
build.Append("obj:new class extends PluginBase{").Append(pluginContents).Append("}");
|
build.Append("obj:new class extends PluginBase{").Append(pluginContents).Append("}");
|
||||||
build.Append("});");
|
build.Append("};");
|
||||||
|
|
||||||
|
build.Append("tmp.obj.$id=\"").Append(pluginIdentifier).Append("\";");
|
||||||
|
build.Append("tmp.obj.$token=").Append(pluginToken).Append(";");
|
||||||
|
build.Append("window.TD_PLUGINS.install(tmp);");
|
||||||
|
|
||||||
build.Append("})(").Append(environment.GetScriptVariables()).Append(");");
|
build.Append("})(").Append(environment.GetScriptVariables()).Append(");");
|
||||||
|
|
||||||
|
108
Program.cs
108
Program.cs
@@ -28,26 +28,31 @@ namespace TweetDck{
|
|||||||
|
|
||||||
public const string BrowserSubprocess = BrandName+".Browser.exe";
|
public const string BrowserSubprocess = BrandName+".Browser.exe";
|
||||||
|
|
||||||
public const string VersionTag = "1.3";
|
public const string VersionTag = "1.3.2";
|
||||||
public const string VersionFull = "1.3.0.0";
|
public const string VersionFull = "1.3.2.0";
|
||||||
|
|
||||||
public static readonly Version Version = new Version(VersionTag);
|
public static readonly Version Version = new Version(VersionTag);
|
||||||
|
|
||||||
public static readonly string StoragePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),BrandName);
|
public static readonly bool IsPortable = File.Exists("makeportable");
|
||||||
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 ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
public static readonly string ConfigFilePath = Path.Combine(StoragePath,"TD_UserConfig.cfg");
|
public static readonly string StoragePath = IsPortable ? Path.Combine(ProgramPath, "portable", "storage") : GetDataStoragePath();
|
||||||
|
public static readonly string TemporaryPath = IsPortable ? Path.Combine(ProgramPath, "portable", "tmp") : Path.Combine(Path.GetTempPath(), BrandName+'_'+Path.GetRandomFileName().Substring(0, 6));
|
||||||
|
public static readonly string ConfigFilePath = Path.Combine(StoragePath, "TD_UserConfig.cfg");
|
||||||
|
|
||||||
|
public static readonly string ScriptPath = Path.Combine(ProgramPath, "scripts");
|
||||||
|
public static readonly string PluginPath = Path.Combine(ProgramPath, "plugins");
|
||||||
|
|
||||||
public static uint WindowRestoreMessage;
|
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;
|
private static bool HasCleanedUp;
|
||||||
|
|
||||||
public static UserConfig UserConfig { get; private set; }
|
public static UserConfig UserConfig { get; private set; }
|
||||||
|
|
||||||
public static string LogFile{
|
public static string LogFile{
|
||||||
get{
|
get{
|
||||||
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"td-log.txt");
|
return Path.Combine(ProgramPath, "td-log.txt");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,15 +63,20 @@ namespace TweetDck{
|
|||||||
|
|
||||||
WindowRestoreMessage = NativeMethods.RegisterWindowMessage("TweetDuckRestore");
|
WindowRestoreMessage = NativeMethods.RegisterWindowMessage("TweetDuckRestore");
|
||||||
|
|
||||||
|
if (!File.Exists(LogFile) && !Log(string.Empty)){
|
||||||
|
MessageBox.Show("Could not write to the log file. If you installed "+BrandName+" to Program Files, please run it as Administrator.", "Administrator Required", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
string[] programArguments = Environment.GetCommandLineArgs();
|
string[] programArguments = Environment.GetCommandLineArgs();
|
||||||
|
|
||||||
if (programArguments.Contains("-restart")){
|
if (programArguments.Contains("-restart")){
|
||||||
for(int attempt = 0; attempt < 21; attempt++){
|
for(int attempt = 0; attempt < 41; attempt++){
|
||||||
if (LockManager.Lock()){
|
if (LockManager.Lock()){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (attempt == 20){
|
else if (attempt == 40){
|
||||||
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);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -77,12 +87,12 @@ namespace TweetDck{
|
|||||||
else{
|
else{
|
||||||
if (!LockManager.Lock()){
|
if (!LockManager.Lock()){
|
||||||
if (LockManager.LockingProcess.MainWindowHandle == IntPtr.Zero && LockManager.LockingProcess.Responding){ // restore if the original process is in tray
|
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);
|
NativeMethods.SendMessage(NativeMethods.HWND_BROADCAST, WindowRestoreMessage, 0, IntPtr.Zero);
|
||||||
return;
|
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){
|
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(20000)){
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,9 +108,9 @@ namespace TweetDck{
|
|||||||
File.Delete(ExportManager.CookiesPath);
|
File.Delete(ExportManager.CookiesPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
File.Move(ExportManager.TempCookiesPath,ExportManager.CookiesPath);
|
File.Move(ExportManager.TempCookiesPath, ExportManager.CookiesPath);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
HandleException("Could not import the cookie file to restore login session.",e);
|
HandleException("Could not import the cookie file to restore login session.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,11 +121,11 @@ namespace TweetDck{
|
|||||||
Cef.OnContextInitialized = () => {
|
Cef.OnContextInitialized = () => {
|
||||||
using(IRequestContext ctx = Cef.GetGlobalRequestContext()){
|
using(IRequestContext ctx = Cef.GetGlobalRequestContext()){
|
||||||
string err;
|
string err;
|
||||||
ctx.SetPreference("browser.enable_spellchecking",false,out err);
|
ctx.SetPreference("browser.enable_spellchecking", false, out err);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
||||||
@@ -124,19 +134,23 @@ namespace TweetDck{
|
|||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
LogSeverity = programArguments.Contains("-log") ? LogSeverity.Info : 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;
|
||||||
|
|
||||||
if (ex != null){
|
if (ex != null){
|
||||||
HandleException("An unhandled exception has occurred.",ex);
|
HandleException("An unhandled exception has occurred.", ex);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Application.ApplicationExit += (sender, args) => ExitCleanup();
|
Application.ApplicationExit += (sender, args) => ExitCleanup();
|
||||||
|
|
||||||
PluginManager plugins = new PluginManager(PluginPath,UserConfig.Plugins);
|
PluginManager plugins = new PluginManager(PluginPath, UserConfig.Plugins);
|
||||||
plugins.Reloaded += plugins_Reloaded;
|
plugins.Reloaded += plugins_Reloaded;
|
||||||
plugins.Config.PluginChangedState += (sender, args) => UserConfig.Save();
|
plugins.Config.PluginChangedState += (sender, args) => UserConfig.Save();
|
||||||
plugins.Reload();
|
plugins.Reload();
|
||||||
@@ -147,39 +161,63 @@ namespace TweetDck{
|
|||||||
if (mainForm.UpdateInstallerPath != null){
|
if (mainForm.UpdateInstallerPath != null){
|
||||||
ExitCleanup();
|
ExitCleanup();
|
||||||
|
|
||||||
Process.Start(mainForm.UpdateInstallerPath,"/SP- /SILENT /NOICONS /CLOSEAPPLICATIONS");
|
Process.Start(mainForm.UpdateInstallerPath, "/SP- /SILENT /NOICONS /CLOSEAPPLICATIONS");
|
||||||
Application.Exit();
|
Application.Exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
private static void plugins_Reloaded(object sender, PluginLoadEventArgs e){
|
||||||
if (!e.Success){
|
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);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetCmdArgumentValue(string search){
|
||||||
|
string[] args = Environment.GetCommandLineArgs();
|
||||||
|
int index = Array.FindIndex(args, arg => arg.Equals(search, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
return index >= 0 && index < args.Length-1 ? args[index+1] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetDataStoragePath(){
|
||||||
|
string custom = GetCmdArgumentValue("-datafolder");
|
||||||
|
|
||||||
|
if (custom != null && (custom.Contains(Path.DirectorySeparatorChar) || custom.Contains(Path.AltDirectorySeparatorChar))){
|
||||||
|
return custom;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), custom ?? BrandName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void HandleException(string message, Exception e){
|
public static void HandleException(string message, Exception e){
|
||||||
Log(e.ToString());
|
if (Log(e.ToString())){
|
||||||
|
if (MessageBox.Show(message+"\r\nDo you want to open the log file to report the issue?", BrandName+" Has Failed :(", MessageBoxButtons.YesNo, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
||||||
if (MessageBox.Show(message+"\r\nDo you want to open the log file to report the issue?",BrandName+" Has Failed :(",MessageBoxButtons.YesNo,MessageBoxIcon.Error,MessageBoxDefaultButton.Button2) == DialogResult.Yes){
|
Process.Start(LogFile);
|
||||||
Process.Start(LogFile);
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
MessageBox.Show(message+"\r\nFailed writing the error into the log file.\r\nOriginal exception: "+e, BrandName+" Has Failed :(", MessageBoxButtons.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Log(string data){
|
public static bool Log(string data){
|
||||||
StringBuilder build = new StringBuilder();
|
StringBuilder build = new StringBuilder();
|
||||||
|
|
||||||
if (!File.Exists(LogFile)){
|
if (!File.Exists(LogFile)){
|
||||||
build.Append("Please, report all issues to: https://github.com/chylex/TweetDuck/issues\r\n\r\n");
|
build.Append("Please, report all issues to: https://github.com/chylex/TweetDuck/issues\r\n\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
build.Append("[").Append(DateTime.Now.ToString("G")).Append("]\r\n");
|
if (data.Length > 0){
|
||||||
build.Append(data).Append("\r\n\r\n");
|
build.Append("[").Append(DateTime.Now.ToString("G", CultureInfo.CurrentCulture)).Append("]\r\n");
|
||||||
|
build.Append(data).Append("\r\n\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
File.AppendAllText(LogFile,build.ToString(),Encoding.UTF8);
|
File.AppendAllText(LogFile, build.ToString(), Encoding.UTF8);
|
||||||
|
return true;
|
||||||
}catch{
|
}catch{
|
||||||
// oops
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +230,7 @@ namespace TweetDck{
|
|||||||
File.Delete(ConfigFilePath);
|
File.Delete(ConfigFilePath);
|
||||||
File.Delete(UserConfig.GetBackupFile(ConfigFilePath));
|
File.Delete(UserConfig.GetBackupFile(ConfigFilePath));
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
HandleException("Could not delete configuration files to reset the settings.",e);
|
HandleException("Could not delete configuration files to reset the settings.", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +243,7 @@ namespace TweetDck{
|
|||||||
UserConfig.Save();
|
UserConfig.Save();
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Directory.Delete(TemporaryPath,true);
|
Directory.Delete(TemporaryPath, true);
|
||||||
}catch(DirectoryNotFoundException){
|
}catch(DirectoryNotFoundException){
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
// welp, too bad
|
// welp, too bad
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
The program was build using Visual Studio 2013. After opening the solution, make sure you have **CefSharp.WinForms** and **Microsoft.VC120.CRT.JetBrains** included - if not, download them using NuGet. For **CefSharp**, you will need version 49 or newer currently available as a pre-release.
|
The program was build using Visual Studio 2013. After opening the solution, make sure you have **CefSharp.WinForms** and **Microsoft.VC120.CRT.JetBrains** included - if not, download them using NuGet. For **CefSharp**, you will need version 49 or newer currently available as a pre-release.
|
||||||
```
|
```
|
||||||
PM> Install-Package CefSharp.WinForms -Pre
|
PM> Install-Package CefSharp.WinForms -Pre -Version 49.0.0-pre02
|
||||||
PM> Install-Package Microsoft.VC120.CRT.JetBrains
|
PM> Install-Package Microsoft.VC120.CRT.JetBrains
|
||||||
```
|
```
|
||||||
|
|
||||||
|
14
Resources/Plugins/clear-columns/.meta
Normal file
14
Resources/Plugins/clear-columns/.meta
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[name]
|
||||||
|
Clear columns
|
||||||
|
|
||||||
|
[description]
|
||||||
|
- Adds buttons and keyboard shortcuts to quickly clear columns
|
||||||
|
|
||||||
|
[author]
|
||||||
|
chylex
|
||||||
|
|
||||||
|
[version]
|
||||||
|
1.0
|
||||||
|
|
||||||
|
[website]
|
||||||
|
https://tweetduck.chylex.com
|
92
Resources/Plugins/clear-columns/browser.js
Normal file
92
Resources/Plugins/clear-columns/browser.js
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
constructor(){
|
||||||
|
super({
|
||||||
|
requiresPageReload: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled(){
|
||||||
|
// prepare variables and functions
|
||||||
|
var clearColumn = (columnName) => {
|
||||||
|
TD.controller.columnManager.get(columnName).clear();
|
||||||
|
TD.controller.stats.columnActionClick("clear");
|
||||||
|
};
|
||||||
|
|
||||||
|
var clearAllColumns = () => {
|
||||||
|
Object.keys(TD.controller.columnManager.getAll()).forEach(key => clearColumn(key));
|
||||||
|
};
|
||||||
|
|
||||||
|
var replaceMustache = (key, search, replace) => {
|
||||||
|
TD.mustaches[key] = TD.mustaches[key].replace(search, replace);
|
||||||
|
};
|
||||||
|
|
||||||
|
// prepare event handlers
|
||||||
|
this.eventClearSingle = function(){
|
||||||
|
clearColumn($(this).closest(".js-column").attr("data-column"));
|
||||||
|
};
|
||||||
|
|
||||||
|
this.eventClearAll = function(){
|
||||||
|
clearAllColumns();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.eventKeys = function(e){
|
||||||
|
if (e.keyCode === 46 && (document.activeElement === null || document.activeElement === document.body)){ // 46 = delete
|
||||||
|
if (e.altKey){
|
||||||
|
clearAllColumns();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var focusedColumn = $(".js-column.is-focused");
|
||||||
|
|
||||||
|
if (focusedColumn.length){
|
||||||
|
clearColumn(focusedColumn.attr("data-column"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// add column buttons and keyboard shortcut info to UI
|
||||||
|
replaceMustache("column/column_header.mustache", "</header>", [
|
||||||
|
'{{^isTemporary}}',
|
||||||
|
'<a class="column-header-link" href="#" data-action="td-clearcolumns-dosingle" style="right:34px">',
|
||||||
|
'<i class="icon icon-clear-timeline"></i>',
|
||||||
|
'</a>',
|
||||||
|
'{{/isTemporary}}',
|
||||||
|
'</header>'
|
||||||
|
].join(""));
|
||||||
|
|
||||||
|
replaceMustache("keyboard_shortcut_list.mustache", "</dl> <dl", [
|
||||||
|
'<dd class="keyboard-shortcut-definition" style="white-space:nowrap">',
|
||||||
|
'<span class="text-like-keyboard-key">1</span> … <span class="text-like-keyboard-key">9</span> + <span class="text-like-keyboard-key">Del</span> Clear column 1-9',
|
||||||
|
'</dd><dd class="keyboard-shortcut-definition">',
|
||||||
|
'<span class="text-like-keyboard-key">Alt</span> + <span class="text-like-keyboard-key">Del</span> Clear all',
|
||||||
|
'</dd></dl><dl'
|
||||||
|
].join(""));
|
||||||
|
|
||||||
|
// load custom style
|
||||||
|
var style = document.createElement("style");
|
||||||
|
document.head.appendChild(style);
|
||||||
|
|
||||||
|
var sheet = style.sheet;
|
||||||
|
sheet.insertRule(".column-title { margin-right: 60px !important; }", 0);
|
||||||
|
sheet.insertRule(".column-type-message .column-title { margin-right: 115px !important; }", 0);
|
||||||
|
sheet.insertRule(".mark-all-read-link { right: 59px !important; }", 0);
|
||||||
|
sheet.insertRule(".open-compose-dm-link { right: 90px !important; }", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ready(){
|
||||||
|
// setup events
|
||||||
|
$(document).on("click", "[data-action='td-clearcolumns-dosingle']", this.eventClearSingle);
|
||||||
|
$(document).on("click", "[data-action='td-clearcolumns-doall']", this.eventClearAll);
|
||||||
|
$(document).on("keydown", this.eventKeys);
|
||||||
|
|
||||||
|
// add clear all button
|
||||||
|
$("nav.app-navigator").first().append([
|
||||||
|
'<a class="link-clean cf app-nav-link padding-hl" data-title="Clear all" data-action="td-clearcolumns-doall">',
|
||||||
|
'<div class="obj-left"><i class="icon icon-large icon-clear-timeline"></i></div>',
|
||||||
|
'<div class="nbfc padding-ts hide-condensed">Clear all</div>',
|
||||||
|
'</a></nav>'
|
||||||
|
].join(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
disabled(){
|
||||||
|
// not needed, plugin reloads the page when enabled or disabled
|
||||||
|
}
|
@@ -12,4 +12,4 @@ chylex
|
|||||||
1.0
|
1.0
|
||||||
|
|
||||||
[website]
|
[website]
|
||||||
http://tweetduck.chylex.com
|
https://tweetduck.chylex.com
|
@@ -5,17 +5,19 @@ enabled(){
|
|||||||
document.head.appendChild(style);
|
document.head.appendChild(style);
|
||||||
|
|
||||||
var sheet = style.sheet;
|
var sheet = style.sheet;
|
||||||
sheet.insertRule(".tweet-actions { float: right !important; width: auto !important; visibility: hidden; }",0);
|
sheet.insertRule(".tweet-actions { float: right !important; width: auto !important; }", 0);
|
||||||
sheet.insertRule(".tweet-actions:hover { visibility: visible; }",0);
|
sheet.insertRule(".tweet-action { opacity: 0; }", 0);
|
||||||
sheet.insertRule(".tweet-actions > li:nth-child(4) { margin-right: 2px !important; }",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
|
// revert small links around the tweet
|
||||||
this.prevFooterMustache = TD.mustaches["status/tweet_single_footer.mustache"];
|
this.prevFooterMustache = TD.mustaches["status/tweet_single_footer.mustache"];
|
||||||
|
|
||||||
var footerLayout = 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('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('{{#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>');
|
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;
|
TD.mustaches["status/tweet_single_footer.mustache"] = footerLayout;
|
||||||
|
|
||||||
// fix layout for right-aligned actions menu
|
// fix layout for right-aligned actions menu
|
||||||
@@ -25,11 +27,11 @@ enabled(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
ready(){
|
ready(){
|
||||||
$(document).on("uiShowActionsMenu",this.uiShowActionsMenuEvent);
|
$(document).on("uiShowActionsMenu", this.uiShowActionsMenuEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
disabled(){
|
disabled(){
|
||||||
$("#design-revert").remove();
|
$("#design-revert").remove();
|
||||||
$(document).off("uiShowActionsMenu",this.uiShowActionsMenuEvent);
|
$(document).off("uiShowActionsMenu", this.uiShowActionsMenuEvent);
|
||||||
TD.mustaches["status/tweet_single_footer.mustache"] = this.prevFooterMustache;
|
TD.mustaches["status/tweet_single_footer.mustache"] = this.prevFooterMustache;
|
||||||
}
|
}
|
23
Resources/Plugins/reply-account/.meta
Normal file
23
Resources/Plugins/reply-account/.meta
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
[name]
|
||||||
|
Custom reply account
|
||||||
|
|
||||||
|
[description]
|
||||||
|
- Allows customizing the automatically selected reply account per column
|
||||||
|
|
||||||
|
[author]
|
||||||
|
chylex
|
||||||
|
|
||||||
|
[version]
|
||||||
|
1.0
|
||||||
|
|
||||||
|
[website]
|
||||||
|
https://tweetduck.chylex.com
|
||||||
|
|
||||||
|
[configfile]
|
||||||
|
configuration.js
|
||||||
|
|
||||||
|
[configdefault]
|
||||||
|
configuration.default.js
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
1.3.3
|
67
Resources/Plugins/reply-account/browser.js
Normal file
67
Resources/Plugins/reply-account/browser.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
enabled(){
|
||||||
|
var configuration = { defaultAccount: "" };
|
||||||
|
|
||||||
|
window.TDPF_loadConfigurationFile(this, "configuration.js", "configuration.default.js", obj => configuration = obj);
|
||||||
|
|
||||||
|
this.uiInlineComposeTweetEvent = function(e, data){
|
||||||
|
var account = null;
|
||||||
|
|
||||||
|
if (configuration.useAdvancedSelector && configuration.customSelector){
|
||||||
|
var column = TD.controller.columnManager.get(data.element.closest("section.column").attr("data-column"));
|
||||||
|
var result = configuration.customSelector(column);
|
||||||
|
|
||||||
|
if (typeof result === "string" && result[0] === '@'){
|
||||||
|
account = result.substring(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (account === null){
|
||||||
|
if (configuration.defaultAccount === false){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (configuration.defaultAccount !== "" && configuration.defaultAccount[0] === '@'){
|
||||||
|
account = configuration.defaultAccount.substring(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var identifier;
|
||||||
|
|
||||||
|
if (account === null){
|
||||||
|
identifier = TD.storage.clientController.client.getDefaultAccount();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var obj = TD.storage.accountController.getAccountFromUsername(account);
|
||||||
|
|
||||||
|
if (obj.length === 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
identifier = obj[0].privateState.key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.singleFrom = data.from = [ identifier ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ready(){
|
||||||
|
var events = $._data(document, "events");
|
||||||
|
|
||||||
|
if ("uiInlineComposeTweet" in events){
|
||||||
|
$(document).on("uiInlineComposeTweet", this.uiInlineComposeTweetEvent);
|
||||||
|
|
||||||
|
var handlers = events["uiInlineComposeTweet"];
|
||||||
|
var oldHandler = handlers[0];
|
||||||
|
var newHandler = handlers[1];
|
||||||
|
|
||||||
|
handlers[0] = newHandler;
|
||||||
|
handlers[1] = oldHandler;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$(document).on("uiInlineComposeTweet", this.uiInlineComposeTweetEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
disabled(){
|
||||||
|
$(document).off("uiInlineComposeTweet", this.uiInlineComposeTweetEvent);
|
||||||
|
}
|
79
Resources/Plugins/reply-account/configuration.default.js
Normal file
79
Resources/Plugins/reply-account/configuration.default.js
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
/*
|
||||||
|
* WARNING
|
||||||
|
* -------
|
||||||
|
*
|
||||||
|
* Make sure you are editing 'configuration.js' and not the default configuration file, as the default one will be replaced with each update.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple way of configuring the plugin
|
||||||
|
* ------------------------------------
|
||||||
|
*
|
||||||
|
* Set value of 'defaultAccount' to one of the following values:
|
||||||
|
*
|
||||||
|
* "" to use your preferred TweetDeck account for all replies (default)
|
||||||
|
* "@myAccount" to specify an account name to use; has to be one of your registered account names
|
||||||
|
* false to fall back to default TweetDeck behavior; useful for advanced configuration below, otherwise disable the plugin instead
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
defaultAccount: "",
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Advanced way of configuring the plugin
|
||||||
|
* --------------------------------------
|
||||||
|
*
|
||||||
|
* This assumes a basic knowledge of JavaScript and jQuery.
|
||||||
|
*
|
||||||
|
* 1. Set value of 'useAdvancedSelector' to true
|
||||||
|
* 2. Uncomment the 'customSelector' function, and replace the example code with your desired behavior
|
||||||
|
*
|
||||||
|
* If 'customSelector' returns a string containing a full name of one of the registered accounts (including @), that account is used.
|
||||||
|
* If it returns anything else (for example false, undefined, or an account name that is not registered), it falls back to 'defaultAccount' behavior.
|
||||||
|
*
|
||||||
|
* The 'column' parameter is a TweetDeck column object. If you want to see all properties of the object, open your browser, nagivate to TweetDeck,
|
||||||
|
* log in, and run the following code in your browser console, which will return an object containing all of the column objects mapped to their IDs:
|
||||||
|
* TD.controller.columnManager.getAll()
|
||||||
|
*
|
||||||
|
* The example below shows how to extract the column type, title, and account from the object.
|
||||||
|
* Column type is prefixed with col_, and may be one of the following:
|
||||||
|
*
|
||||||
|
* col_timeline, col_interactions, col_mentions, col_followers, col_search, col_list,
|
||||||
|
* col_customtimeline, col_messages, col_usertweets, col_favorites, col_activity,
|
||||||
|
* col_dataminr, col_home, col_me, col_inbox, col_scheduled, col_unknown
|
||||||
|
*
|
||||||
|
* Some of these appear to be unused (for example, Home columns are 'col_timeline' instead of 'col_home').
|
||||||
|
*
|
||||||
|
* If you want to see your column types, run this in your browser console:
|
||||||
|
* Object.values(TD.controller.columnManager.getAll()).forEach(obj => console.log(obj.getColumnType()));
|
||||||
|
*
|
||||||
|
* You can also get the jQuery column object using: $("section.column[data-column='"+column.ui.state.columnKey+"']")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
useAdvancedSelector: false,
|
||||||
|
|
||||||
|
/*customSelector: function(column){
|
||||||
|
var titleObj = $(column.getTitleHTML());
|
||||||
|
|
||||||
|
var columnType = column.getColumnType(); // col_timeline
|
||||||
|
var columnTitle = titleObj.siblings(".column-head-title").text(); // Home
|
||||||
|
var columnAccount = titleObj.siblings(".attribution").text(); // @chylexmc
|
||||||
|
|
||||||
|
if (columnType === "col_search" && columnTitle === "TweetDuck"){
|
||||||
|
// This is a search column that looks for 'TweetDuck' in the tweets,
|
||||||
|
// search columns are normally linked to the preferred account
|
||||||
|
// so this forces the @TryTweetDuck account to be used instead.
|
||||||
|
return "@TryTweetDuck";
|
||||||
|
}
|
||||||
|
else if (columnType === "col_timeline" && columnAccount === "@chylexcz"){
|
||||||
|
// This is a Home column of my test account @chylexcz,
|
||||||
|
// but I want to reply to tweets from my official account.
|
||||||
|
return "@chylexmc";
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise returns 'undefined' which falls back to 'defaultAccount' behavior
|
||||||
|
}*/
|
||||||
|
}
|
@@ -11,33 +11,33 @@ namespace TweetDck.Resources{
|
|||||||
|
|
||||||
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(Program.ScriptPath, name), Encoding.UTF8);
|
||||||
}catch(Exception ex){
|
}catch(Exception ex){
|
||||||
MessageBox.Show("Unfortunately, "+Program.BrandName+" could not load the "+name+" file. The program will continue running with limited functionality.\r\n\r\n"+ex.Message,Program.BrandName+" Has Failed :(",MessageBoxButtons.OK,MessageBoxIcon.Error);
|
MessageBox.Show("Unfortunately, "+Program.BrandName+" could not load the "+name+" file. The program will continue running with limited functionality.\r\n\r\n"+ex.Message, Program.BrandName+" Has Failed :(", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExecuteFile(ChromiumWebBrowser browser, string file){
|
public static void ExecuteFile(ChromiumWebBrowser browser, string file){
|
||||||
ExecuteScript(browser,LoadResource(file),GetRootIdentifier(file));
|
ExecuteScript(browser, LoadResource(file), GetRootIdentifier(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExecuteFile(IFrame frame, string file){
|
public static void ExecuteFile(IFrame frame, string file){
|
||||||
ExecuteScript(frame,LoadResource(file),GetRootIdentifier(file));
|
ExecuteScript(frame, LoadResource(file), GetRootIdentifier(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExecuteScript(ChromiumWebBrowser browser, string script, string identifier){
|
public static void ExecuteScript(ChromiumWebBrowser browser, string script, string identifier){
|
||||||
if (script == null)return;
|
if (script == null)return;
|
||||||
|
|
||||||
using(IFrame frame = browser.GetMainFrame()){
|
using(IFrame frame = browser.GetMainFrame()){
|
||||||
frame.ExecuteJavaScriptAsync(script,UrlPrefix+identifier,1);
|
frame.ExecuteJavaScriptAsync(script, UrlPrefix+identifier, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExecuteScript(IFrame frame, string script, string identifier){
|
public static void ExecuteScript(IFrame frame, string script, string identifier){
|
||||||
if (script == null)return;
|
if (script == null)return;
|
||||||
|
|
||||||
frame.ExecuteJavaScriptAsync(script,UrlPrefix+identifier,1);
|
frame.ExecuteJavaScriptAsync(script, UrlPrefix+identifier, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetRootIdentifier(string file){
|
public static string GetRootIdentifier(string file){
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
(function($,$TD,TD){
|
(function($, $TD, TD){
|
||||||
//
|
//
|
||||||
// Variable: Current highlighted column jQuery object.
|
// Variable: Current highlighted column jQuery object.
|
||||||
//
|
//
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
var buttons = menu.children("[data-std]");
|
var buttons = menu.children("[data-std]");
|
||||||
|
|
||||||
buttons.on("click","a",function(){
|
buttons.on("click", "a", function(){
|
||||||
var action = $(this).attr("data-action");
|
var action = $(this).attr("data-action");
|
||||||
|
|
||||||
if (action === "td-settings"){
|
if (action === "td-settings"){
|
||||||
@@ -40,25 +40,27 @@
|
|||||||
|
|
||||||
buttons.hover(function(){
|
buttons.hover(function(){
|
||||||
$(this).addClass("is-selected");
|
$(this).addClass("is-selected");
|
||||||
},function(){
|
}, function(){
|
||||||
$(this).removeClass("is-selected");
|
$(this).removeClass("is-selected");
|
||||||
});
|
});
|
||||||
},0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 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--){
|
||||||
onNewTweet(obj.column,obj.items[index]);
|
onNewTweet(obj.column, obj.items[index]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Setup video element replacement
|
// Setup video element replacement and fix missing target in user links
|
||||||
new MutationObserver(function(){
|
new MutationObserver(function(){
|
||||||
$("video").each(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>");
|
$(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>");
|
||||||
});
|
});
|
||||||
}).observe($(".js-app-columns")[0],{
|
|
||||||
|
$("a[rel='user']").attr("target", "_blank");
|
||||||
|
}).observe($(".js-app-columns")[0], {
|
||||||
childList: true,
|
childList: true,
|
||||||
subtree: true
|
subtree: true
|
||||||
});
|
});
|
||||||
@@ -79,7 +81,7 @@
|
|||||||
//
|
//
|
||||||
var prependToFunction = function(func, extension){
|
var prependToFunction = function(func, extension){
|
||||||
return function(){
|
return function(){
|
||||||
return extension.apply(this,arguments) === true ? undefined : func.apply(this,arguments);
|
return extension.apply(this, arguments) === true ? undefined : func.apply(this, arguments);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -88,8 +90,8 @@
|
|||||||
//
|
//
|
||||||
var appendToFunction = function(func, extension){
|
var appendToFunction = function(func, extension){
|
||||||
return function(){
|
return function(){
|
||||||
var res = func.apply(this,arguments);
|
var res = func.apply(this, arguments);
|
||||||
extension.apply(this,arguments);
|
extension.apply(this, arguments);
|
||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -105,12 +107,12 @@
|
|||||||
withMediaPreview: false
|
withMediaPreview: false
|
||||||
}));
|
}));
|
||||||
|
|
||||||
html.css("border","0");
|
html.css("border", "0");
|
||||||
html.find(".tweet-body").first().children("footer").remove();
|
html.find(".tweet-body").first().children("footer").remove();
|
||||||
|
|
||||||
var url = html.find("time").first().children("a").first().attr("href") || "";
|
var url = html.find("time").first().children("a").first().attr("href") || "";
|
||||||
|
|
||||||
$TD.onTweetPopup(html.html(),url,tweet.text.length); // TODO column
|
$TD.onTweetPopup(html.html(), url, tweet.text.length); // TODO column
|
||||||
}
|
}
|
||||||
else if (column.model.getHasSound()){
|
else if (column.model.getHasSound()){
|
||||||
$TD.onTweetSound(); // TODO disable original
|
$TD.onTweetSound(); // TODO disable original
|
||||||
@@ -142,7 +144,7 @@
|
|||||||
else if (!window.TD_APP_READY && !app.hasClass("is-hidden")){
|
else if (!window.TD_APP_READY && !app.hasClass("is-hidden")){
|
||||||
initializeTweetDck();
|
initializeTweetDck();
|
||||||
}
|
}
|
||||||
}).observe(app[0],{
|
}).observe(app[0], {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
attributeFilter: [ "class" ]
|
attributeFilter: [ "class" ]
|
||||||
});
|
});
|
||||||
@@ -150,14 +152,14 @@
|
|||||||
//
|
//
|
||||||
// Block: Hook into settings object to detect when the settings change.
|
// Block: Hook into settings object to detect when the settings change.
|
||||||
//
|
//
|
||||||
TD.settings.setFontSize = appendToFunction(TD.settings.setFontSize,function(name){
|
TD.settings.setFontSize = appendToFunction(TD.settings.setFontSize, function(name){
|
||||||
$TD.loadFontSizeClass(name);
|
$TD.loadFontSizeClass(name);
|
||||||
});
|
});
|
||||||
|
|
||||||
TD.settings.setTheme = appendToFunction(TD.settings.setTheme,function(){
|
TD.settings.setTheme = appendToFunction(TD.settings.setTheme, function(){
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
$TD.loadNotificationHeadContents(getNotificationHeadContents());
|
$TD.loadNotificationHeadContents(getNotificationHeadContents());
|
||||||
},0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -182,7 +184,7 @@
|
|||||||
var prevMouseX = -1, prevMouseY = -1;
|
var prevMouseX = -1, prevMouseY = -1;
|
||||||
var tooltipTimer, tooltipDisplayed;
|
var tooltipTimer, tooltipDisplayed;
|
||||||
|
|
||||||
$(document.body).delegate("a[data-full-url]","mouseenter mouseleave mousemove",function(e){
|
$(document.body).delegate("a[data-full-url]", "mouseenter mouseleave mousemove", function(e){
|
||||||
var me = $(this);
|
var me = $(this);
|
||||||
|
|
||||||
if (e.type === "mouseenter"){
|
if (e.type === "mouseenter"){
|
||||||
@@ -195,19 +197,19 @@
|
|||||||
if ($TD.expandLinksOnHover){
|
if ($TD.expandLinksOnHover){
|
||||||
tooltipTimer = window.setTimeout(function(){
|
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://");
|
||||||
expanded = cutStart(expanded,"www.");
|
expanded = cutStart(expanded, "www.");
|
||||||
|
|
||||||
me.attr("td-prev-text",text);
|
me.attr("td-prev-text", text);
|
||||||
me.text(expanded);
|
me.text(expanded);
|
||||||
},200);
|
}, 200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tooltipTimer = window.setTimeout(function(){
|
tooltipTimer = window.setTimeout(function(){
|
||||||
$TD.displayTooltip(me.attr("data-full-url"),false);
|
$TD.displayTooltip(me.attr("data-full-url"), false);
|
||||||
tooltipDisplayed = true;
|
tooltipDisplayed = true;
|
||||||
},400);
|
}, 400);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (e.type === "mouseleave"){
|
else if (e.type === "mouseleave"){
|
||||||
@@ -223,12 +225,12 @@
|
|||||||
|
|
||||||
if (tooltipDisplayed){
|
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;
|
||||||
}
|
}
|
||||||
@@ -239,7 +241,7 @@
|
|||||||
//
|
//
|
||||||
// Block: Allow bypassing of t.co in context menus.
|
// Block: Allow bypassing of t.co in context menus.
|
||||||
//
|
//
|
||||||
$(document.body).delegate("a","contextmenu",function(){
|
$(document.body).delegate("a", "contextmenu", function(){
|
||||||
$TD.setLastRightClickedLink($(this).attr("data-full-url") || "");
|
$TD.setLastRightClickedLink($(this).attr("data-full-url") || "");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -249,7 +251,7 @@
|
|||||||
(function(){
|
(function(){
|
||||||
var soundEle = document.getElementById("update-sound");
|
var soundEle = document.getElementById("update-sound");
|
||||||
|
|
||||||
soundEle.play = prependToFunction(soundEle.play,function(){
|
soundEle.play = prependToFunction(soundEle.play, function(){
|
||||||
return $TD.muteNotifications;
|
return $TD.muteNotifications;
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
@@ -261,7 +263,7 @@
|
|||||||
//
|
//
|
||||||
// Block: Update highlighted column.
|
// 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"){
|
||||||
highlightedColumnEle = $(this);
|
highlightedColumnEle = $(this);
|
||||||
}
|
}
|
||||||
@@ -278,23 +280,23 @@
|
|||||||
|
|
||||||
var updateHighlightedTweet = function(link, embeddedLink){
|
var updateHighlightedTweet = function(link, embeddedLink){
|
||||||
if (lastTweet !== link){
|
if (lastTweet !== link){
|
||||||
$TD.setLastHighlightedTweet(link,embeddedLink);
|
$TD.setLastHighlightedTweet(link, embeddedLink);
|
||||||
lastTweet = link;
|
lastTweet = link;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
app.delegate("article.js-stream-item","mouseenter mouseleave",function(e){
|
app.delegate("article.js-stream-item", "mouseenter mouseleave", function(e){
|
||||||
if (e.type === "mouseenter"){
|
if (e.type === "mouseenter"){
|
||||||
highlightedTweetEle = $(this);
|
highlightedTweetEle = $(this);
|
||||||
|
|
||||||
var link = $(this).find("time").first().children("a").first();
|
var link = $(this).find("time").first().children("a").first();
|
||||||
var embedded = $(this).find(".quoted-tweet[data-tweet-id]").first();
|
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") : "");
|
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("", "");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
@@ -320,10 +322,10 @@
|
|||||||
scroller.scrollTop(button.offset().top); // scrolls the button into view
|
scroller.scrollTop(button.offset().top); // scrolls the button into view
|
||||||
|
|
||||||
var buttonPos = button.children().first().offset(); // finds the camera icon offset
|
var buttonPos = button.children().first().offset(); // finds the camera icon offset
|
||||||
$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,.js-reply-tweetbox","paste",function(){
|
$(".js-app").delegate(".js-compose-text,.js-reply-tweetbox", "paste", function(){
|
||||||
lastPasteElement = $(this);
|
lastPasteElement = $(this);
|
||||||
$TD.tryPasteImage();
|
$TD.tryPasteImage();
|
||||||
});
|
});
|
||||||
@@ -353,7 +355,7 @@
|
|||||||
else if (++counter >= 10){
|
else if (++counter >= 10){
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
}
|
}
|
||||||
},51);
|
}, 51);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
clickUpload();
|
clickUpload();
|
||||||
@@ -367,7 +369,7 @@
|
|||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
getScroller().scrollTop(prevScrollTop);
|
getScroller().scrollTop(prevScrollTop);
|
||||||
$(".js-drawer").find(".js-compose-text").first()[0].focus();
|
$(".js-drawer").find(".js-compose-text").first()[0].focus();
|
||||||
},10);
|
}, 10);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
@@ -395,16 +397,37 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Block: Fix scheduled tweets not showing up sometimes.
|
||||||
|
//
|
||||||
|
$(document).on("dataTweetSent", function(e, data){
|
||||||
|
if (data.response.state && data.response.state === "scheduled"){
|
||||||
|
var column = Object.values(TD.controller.columnManager.getAll()).find(column => column.model.state.type === "scheduled");
|
||||||
|
|
||||||
|
if (column){
|
||||||
|
setTimeout(function(){
|
||||||
|
column.reloadTweets();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//
|
//
|
||||||
// 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;
|
styleOfficial.sheet.insertRule("a[data-full-url] { word-break: break-all; }", 0); // break long urls
|
||||||
|
styleOfficial.sheet.insertRule(".column-nav-link .attribution { position: absolute; }", 0); // fix cut off account names
|
||||||
|
styleOfficial.sheet.insertRule(".txt-base-smallest .badge-verified:before { height: 13px !important; }", 0); // fix cut off badge icon
|
||||||
|
styleOfficial.sheet.insertRule(".keyboard-shortcut-list { vertical-align: top; }", 0); // fix keyboard navigation alignment
|
||||||
|
|
||||||
// break long urls
|
if ($TD.hasCustomBrowserCSS){
|
||||||
sheet.insertRule("a[data-full-url] { word-break: break-all; }",0);
|
var styleCustom = document.createElement("style");
|
||||||
|
styleCustom.innerHTML = $TD.customBrowserCSS;
|
||||||
|
document.head.appendChild(styleCustom);
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
})($,$TD,TD);
|
})($, $TD, TD);
|
||||||
|
@@ -9,14 +9,14 @@
|
|||||||
//
|
//
|
||||||
var addEventListener = function(collection, type, listener){
|
var addEventListener = function(collection, type, listener){
|
||||||
for(let index = 0; index < collection.length; index++){
|
for(let index = 0; index < collection.length; index++){
|
||||||
collection[index].addEventListener(type,listener);
|
collection[index].addEventListener(type, listener);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block: Hook into links to bypass default open function.
|
// Block: Hook into links to bypass default open function.
|
||||||
//
|
//
|
||||||
addEventListener(links,"click",function(e){
|
addEventListener(links, "click", function(e){
|
||||||
$TD.openBrowser(e.currentTarget.getAttribute("href"));
|
$TD.openBrowser(e.currentTarget.getAttribute("href"));
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
//
|
//
|
||||||
// Block: Allow bypassing of t.co in context menus.
|
// Block: Allow bypassing of t.co in context menus.
|
||||||
//
|
//
|
||||||
addEventListener(links,"contextmenu",function(e){
|
addEventListener(links, "contextmenu", function(e){
|
||||||
$TD.setLastRightClickedLink(e.currentTarget.getAttribute("data-full-url") || "");
|
$TD.setLastRightClickedLink(e.currentTarget.getAttribute("data-full-url") || "");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
var prevMouseX = -1, prevMouseY = -1;
|
var prevMouseX = -1, prevMouseY = -1;
|
||||||
var tooltipTimer, tooltipDisplayed;
|
var tooltipTimer, tooltipDisplayed;
|
||||||
|
|
||||||
addEventListener(links,"mouseenter",function(e){
|
addEventListener(links, "mouseenter", function(e){
|
||||||
var me = e.currentTarget;
|
var me = e.currentTarget;
|
||||||
|
|
||||||
var url = me.getAttribute("data-full-url");
|
var url = me.getAttribute("data-full-url");
|
||||||
@@ -54,23 +54,23 @@
|
|||||||
if ($TD.expandLinksOnHover){
|
if ($TD.expandLinksOnHover){
|
||||||
tooltipTimer = window.setTimeout(function(){
|
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.");
|
||||||
|
|
||||||
me.setAttribute("td-prev-text",text);
|
me.setAttribute("td-prev-text", text);
|
||||||
me.innerHTML = expanded;
|
me.innerHTML = expanded;
|
||||||
},200);
|
}, 200);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tooltipTimer = window.setTimeout(function(){
|
tooltipTimer = window.setTimeout(function(){
|
||||||
$TD.displayTooltip(url,true);
|
$TD.displayTooltip(url, true);
|
||||||
tooltipDisplayed = true;
|
tooltipDisplayed = true;
|
||||||
},400);
|
}, 400);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addEventListener(links,"mouseleave",function(e){
|
addEventListener(links, "mouseleave", function(e){
|
||||||
if (!e.currentTarget.hasAttribute("data-full-url"))return;
|
if (!e.currentTarget.hasAttribute("data-full-url"))return;
|
||||||
|
|
||||||
if ($TD.expandLinksOnHover){
|
if ($TD.expandLinksOnHover){
|
||||||
@@ -85,16 +85,16 @@
|
|||||||
|
|
||||||
if (tooltipDisplayed){
|
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;
|
||||||
|
|
||||||
$TD.displayTooltip(url,true);
|
$TD.displayTooltip(url, true);
|
||||||
prevMouseX = e.clientX;
|
prevMouseX = e.clientX;
|
||||||
prevMouseY = e.clientY;
|
prevMouseY = e.clientY;
|
||||||
}
|
}
|
||||||
|
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
setState(plugin, enable){
|
setState(plugin, enable){
|
||||||
if (enable && this.isDisabled(plugin)){
|
if (enable && this.isDisabled(plugin)){
|
||||||
this.disabled.splice(this.disabled.indexOf(plugin.id),1);
|
this.disabled.splice(this.disabled.indexOf(plugin.id), 1);
|
||||||
plugin.obj.enabled();
|
plugin.obj.enabled();
|
||||||
this.runWhenReady(plugin);
|
this.runWhenReady(plugin);
|
||||||
}
|
}
|
||||||
@@ -75,6 +75,6 @@
|
|||||||
// Block: Setup global function to change plugin state.
|
// Block: Setup global function to change plugin state.
|
||||||
//
|
//
|
||||||
window.TDPF_setPluginState = function(identifier, enable){
|
window.TDPF_setPluginState = function(identifier, enable){
|
||||||
window.TD_PLUGINS.setState(window.TD_PLUGINS.findObject(identifier),enable);
|
window.TD_PLUGINS.setState(window.TD_PLUGINS.findObject(identifier), enable);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
37
Resources/Scripts/plugins.js
Normal file
37
Resources/Scripts/plugins.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
(function($TDP){
|
||||||
|
//
|
||||||
|
// Block: Setup a simple JavaScript object configuration loader.
|
||||||
|
//
|
||||||
|
window.TDPF_loadConfigurationFile = function(pluginObject, fileNameUser, fileNameDefault, onSuccess, onFailure){
|
||||||
|
var identifier = pluginObject.$id;
|
||||||
|
var token = pluginObject.$token;
|
||||||
|
|
||||||
|
$TDP.checkFileExists(token, fileNameUser).then(exists => {
|
||||||
|
var fileName = exists ? fileNameUser : fileNameDefault;
|
||||||
|
|
||||||
|
$TDP.readFile(token, fileName, true).then(contents => {
|
||||||
|
var obj;
|
||||||
|
|
||||||
|
try{
|
||||||
|
obj = eval("("+contents+")");
|
||||||
|
}catch(err){
|
||||||
|
if (!(onFailure && onFailure(err.message))){
|
||||||
|
$TD.alert("warning", "Problem loading '"+fileName+"' file for '"+identifier+"' plugin, the JavaScript syntax is invalid: "+err.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
onSuccess && onSuccess(obj);
|
||||||
|
}).catch(err => {
|
||||||
|
if (!(onFailure && onFailure(err))){
|
||||||
|
$TD.alert("warning", "Problem loading '"+fileName+"' file for '"+identifier+"' plugin: "+err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).catch(err => {
|
||||||
|
if (!(onFailure && onFailure(err))){
|
||||||
|
$TD.alert("warning", "Problem checking '"+fileNameUser+"' file for '"+identifier+"' plugin: "+err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
})($TDP);
|
@@ -1,4 +1,4 @@
|
|||||||
(function($,$TDU){
|
(function($, $TDU){
|
||||||
//
|
//
|
||||||
// Variable: Current timeout ID for update checking.
|
// Variable: Current timeout ID for update checking.
|
||||||
//
|
//
|
||||||
@@ -18,6 +18,9 @@
|
|||||||
// 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.
|
||||||
//
|
//
|
||||||
var createUpdateNotificationElement = function(version, download){
|
var createUpdateNotificationElement = function(version, download){
|
||||||
|
var outdated = version === "unsupported";
|
||||||
|
var tweetdick = version === "tweetdick";
|
||||||
|
|
||||||
var ele = $("#tweetdck-update");
|
var ele = $("#tweetdck-update");
|
||||||
var existed = ele.length > 0;
|
var existed = ele.length > 0;
|
||||||
|
|
||||||
@@ -25,13 +28,31 @@
|
|||||||
ele.remove();
|
ele.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
var html = [
|
var html = outdated ? [
|
||||||
|
"<div id='tweetdck-update'>",
|
||||||
|
"<p class='tdu-title'>Unsupported System</p>",
|
||||||
|
"<p class='tdu-info'>You will not receive updates.</p>",
|
||||||
|
"<div class='tdu-buttons'>",
|
||||||
|
"<button class='btn btn-positive tdu-btn-unsupported'><span class='label'>Read More</span></button>",
|
||||||
|
"<button class='btn btn-negative tdu-btn-dismiss'><span class='label'>Dismiss</span></button>",
|
||||||
|
"</div>",
|
||||||
|
"</div>"
|
||||||
|
] : tweetdick ? [
|
||||||
|
"<div id='tweetdck-update'>",
|
||||||
|
"<p class='tdu-title'>TweetDick Ending</p>",
|
||||||
|
"<p class='tdu-info'>Please, move to TweetDuck.</p>",
|
||||||
|
"<div class='tdu-buttons'>",
|
||||||
|
"<button class='btn btn-positive tdu-btn-unsupported'><span class='label'>Read More</span></button>",
|
||||||
|
"<button class='btn btn-negative tdu-btn-dismiss'><span class='label'>Dismiss</span></button>",
|
||||||
|
"</div>",
|
||||||
|
"</div>"
|
||||||
|
] : [
|
||||||
"<div id='tweetdck-update'>",
|
"<div id='tweetdck-update'>",
|
||||||
"<p class='tdu-title'>"+$TDU.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</span></button>",
|
||||||
"<button class='btn btn-negative tdu-btn-dismiss'><span class='label'>Dismiss</button>",
|
"<button class='btn btn-negative tdu-btn-dismiss'><span class='label'>Dismiss</span></button>",
|
||||||
"</div>",
|
"</div>",
|
||||||
"</div>"
|
"</div>"
|
||||||
];
|
];
|
||||||
@@ -60,7 +81,7 @@
|
|||||||
fontWeight: "bold",
|
fontWeight: "bold",
|
||||||
textAlign: "center",
|
textAlign: "center",
|
||||||
letterSpacing: "0.2px",
|
letterSpacing: "0.2px",
|
||||||
margin: "4px auto 2px"
|
margin: "5px auto 2px"
|
||||||
});
|
});
|
||||||
|
|
||||||
ele.children("p.tdu-info").first().css({
|
ele.children("p.tdu-info").first().css({
|
||||||
@@ -90,10 +111,18 @@
|
|||||||
|
|
||||||
buttonDiv.children(".tdu-btn-download").click(function(){
|
buttonDiv.children(".tdu-btn-download").click(function(){
|
||||||
ele.remove();
|
ele.remove();
|
||||||
$TDU.onUpdateAccepted(version,download);
|
$TDU.onUpdateAccepted(version, download);
|
||||||
});
|
});
|
||||||
|
|
||||||
buttonDiv.children(".tdu-btn-dismiss").click(function(){
|
buttonDiv.children(".tdu-btn-unsupported").click(function(){
|
||||||
|
$TDU.openBrowser("https://github.com/chylex/TweetDuck/wiki/Supported-Systems");
|
||||||
|
});
|
||||||
|
|
||||||
|
buttonDiv.children(".tdu-btn-tweetdick").click(function(){
|
||||||
|
$TDU.openBrowser("https://github.com/chylex/TweetDick/wiki/Future-of-TweetDick");
|
||||||
|
});
|
||||||
|
|
||||||
|
buttonDiv.children(".tdu-btn-dismiss,.tdu-btn-unsupported").click(function(){
|
||||||
$TDU.onUpdateDismissed(version);
|
$TDU.onUpdateDismissed(version);
|
||||||
ele.slideUp(function(){ ele.remove(); });
|
ele.slideUp(function(){ ele.remove(); });
|
||||||
});
|
});
|
||||||
@@ -109,22 +138,37 @@
|
|||||||
// 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(force, eventID){
|
var runUpdateCheck = function(force, eventID){
|
||||||
|
if (!$TDU.isSystemSupported){
|
||||||
|
if ($TDU.dismissedVersionTag !== "unsupported"){
|
||||||
|
createUpdateNotificationElement("unsupported");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ($TDU.brandName === "TweetDick"){
|
||||||
|
if ($TDU.dismissedVersionTag !== "tweetdick"){
|
||||||
|
createUpdateNotificationElement("tweetdick");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
clearTimeout(updateCheckTimeoutID);
|
clearTimeout(updateCheckTimeoutID);
|
||||||
updateCheckTimeoutID = setTimeout(runUpdateCheck,1000*60*60); // 1 hour
|
updateCheckTimeoutID = setTimeout(runUpdateCheck, 1000*60*60); // 1 hour
|
||||||
|
|
||||||
if (!$TDU.updateCheckEnabled && !force)return;
|
if (!$TDU.updateCheckEnabled && !force)return;
|
||||||
|
|
||||||
$.getJSON(updateCheckUrl,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;
|
var hasUpdate = tagName !== $TDU.versionTag && tagName !== $TDU.dismissedVersionTag && response.assets.length > 0;
|
||||||
|
|
||||||
if (hasUpdate){
|
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){
|
if (eventID !== 0){
|
||||||
$TDU.onUpdateCheckFinished(eventID,hasUpdate,tagName);
|
$TDU.onUpdateCheckFinished(eventID, hasUpdate, tagName);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -134,4 +178,4 @@
|
|||||||
//
|
//
|
||||||
window.TDUF_runUpdateCheck = runUpdateCheck;
|
window.TDUF_runUpdateCheck = runUpdateCheck;
|
||||||
runUpdateCheck();
|
runUpdateCheck();
|
||||||
})($,$TDU);
|
})($, $TDU);
|
||||||
|
@@ -78,6 +78,9 @@
|
|||||||
<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>
|
||||||
@@ -126,6 +129,18 @@
|
|||||||
<Compile Include="Core\Other\FormPlugins.Designer.cs">
|
<Compile Include="Core\Other\FormPlugins.Designer.cs">
|
||||||
<DependentUpon>FormPlugins.cs</DependentUpon>
|
<DependentUpon>FormPlugins.cs</DependentUpon>
|
||||||
</Compile>
|
</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\CombinedFileStream.cs" />
|
||||||
<Compile Include="Core\Other\Settings\Export\ExportManager.cs" />
|
<Compile Include="Core\Other\Settings\Export\ExportManager.cs" />
|
||||||
<Compile Include="Core\Other\Settings\TabSettingsAdvanced.cs">
|
<Compile Include="Core\Other\Settings\TabSettingsAdvanced.cs">
|
||||||
@@ -158,6 +173,7 @@
|
|||||||
<Compile Include="Core\Other\Settings\TabSettingsUpdates.Designer.cs">
|
<Compile Include="Core\Other\Settings\TabSettingsUpdates.Designer.cs">
|
||||||
<DependentUpon>TabSettingsUpdates.cs</DependentUpon>
|
<DependentUpon>TabSettingsUpdates.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Core\Utils\CommandLineArgsParser.cs" />
|
||||||
<Compile Include="Core\Utils\WindowState.cs" />
|
<Compile Include="Core\Utils\WindowState.cs" />
|
||||||
<Compile Include="Migration\FormBackgroundWork.cs">
|
<Compile Include="Migration\FormBackgroundWork.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
@@ -186,6 +202,7 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Plugins\Plugin.cs" />
|
<Compile Include="Plugins\Plugin.cs" />
|
||||||
<Compile Include="Plugins\Events\PluginChangedStateEventArgs.cs" />
|
<Compile Include="Plugins\Events\PluginChangedStateEventArgs.cs" />
|
||||||
|
<Compile Include="Plugins\PluginBridge.cs" />
|
||||||
<Compile Include="Plugins\PluginConfig.cs" />
|
<Compile Include="Plugins\PluginConfig.cs" />
|
||||||
<Compile Include="Plugins\PluginEnvironment.cs" />
|
<Compile Include="Plugins\PluginEnvironment.cs" />
|
||||||
<Compile Include="Plugins\PluginGroup.cs" />
|
<Compile Include="Plugins\PluginGroup.cs" />
|
||||||
@@ -218,7 +235,6 @@
|
|||||||
<Compile Include="Migration\FormMigrationQuestion.Designer.cs">
|
<Compile Include="Migration\FormMigrationQuestion.Designer.cs">
|
||||||
<DependentUpon>FormMigrationQuestion.cs</DependentUpon>
|
<DependentUpon>FormMigrationQuestion.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Migration\Helpers\LnkEditor.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" />
|
||||||
@@ -255,17 +271,6 @@
|
|||||||
<Install>true</Install>
|
<Install>true</Install>
|
||||||
</BootstrapperPackage>
|
</BootstrapperPackage>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<COMReference Include="Shell32">
|
|
||||||
<Guid>{50A7E9B0-70EF-11D1-B75A-00A0C90564FE}</Guid>
|
|
||||||
<VersionMajor>1</VersionMajor>
|
|
||||||
<VersionMinor>0</VersionMinor>
|
|
||||||
<Lcid>0</Lcid>
|
|
||||||
<WrapperTool>tlbimp</WrapperTool>
|
|
||||||
<Isolated>False</Isolated>
|
|
||||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
|
||||||
</COMReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Core\FormBrowser.resx">
|
<EmbeddedResource Include="Core\FormBrowser.resx">
|
||||||
<DependentUpon>FormBrowser.cs</DependentUpon>
|
<DependentUpon>FormBrowser.cs</DependentUpon>
|
||||||
@@ -293,36 +298,6 @@
|
|||||||
<TargetPath>icon.ico</TargetPath>
|
<TargetPath>icon.ico</TargetPath>
|
||||||
</ContentWithTargetPath>
|
</ContentWithTargetPath>
|
||||||
</ItemGroup>
|
</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>
|
|
||||||
<TargetPath>notification.js</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<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>
|
|
||||||
<TargetPath>update.js</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None 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" />
|
||||||
@@ -330,6 +305,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Resources\Plugins\" />
|
<Folder Include="Resources\Plugins\" />
|
||||||
|
<Folder Include="Resources\Scripts\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
@@ -353,6 +329,10 @@ 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
|
xcopy "$(ProjectDir)packages\Microsoft.VC120.CRT.JetBrains.12.0.21005.2\DotFiles\msvcr120.dll" "$(TargetDir)" /Y
|
||||||
|
rmdir "$(TargetDir)scripts"
|
||||||
|
mkdir "$(TargetDir)scripts"
|
||||||
|
xcopy "$(ProjectDir)Resources\Scripts\*" "$(TargetDir)scripts\" /E /Y
|
||||||
|
rmdir "$(TargetDir)plugins"
|
||||||
mkdir "$(TargetDir)plugins"
|
mkdir "$(TargetDir)plugins"
|
||||||
mkdir "$(TargetDir)plugins\official"
|
mkdir "$(TargetDir)plugins\official"
|
||||||
mkdir "$(TargetDir)plugins\user"
|
mkdir "$(TargetDir)plugins\user"
|
||||||
|
@@ -13,7 +13,7 @@ namespace TweetDck.Updates{
|
|||||||
|
|
||||||
public string InstallerPath{
|
public string InstallerPath{
|
||||||
get{
|
get{
|
||||||
return Path.Combine(Path.GetTempPath(),updateInfo.FileName);
|
return Path.Combine(Path.GetTempPath(), updateInfo.FileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ namespace TweetDck.Updates{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void FormUpdateDownload_Shown(object sender, EventArgs e){
|
private void FormUpdateDownload_Shown(object sender, EventArgs e){
|
||||||
webClient.DownloadFileAsync(new Uri(updateInfo.DownloadUrl),InstallerPath);
|
webClient.DownloadFileAsync(new Uri(updateInfo.DownloadUrl), InstallerPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e){
|
private void btnCancel_Click(object sender, EventArgs e){
|
||||||
@@ -69,7 +69,7 @@ namespace TweetDck.Updates{
|
|||||||
progressDownload.SetValueInstant(1000);
|
progressDownload.SetValueInstant(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" MB";
|
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0", CultureInfo.CurrentCulture)+" MB";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (progressDownload.Style != ProgressBarStyle.Continuous){
|
if (progressDownload.Style != ProgressBarStyle.Continuous){
|
||||||
@@ -77,7 +77,7 @@ namespace TweetDck.Updates{
|
|||||||
}
|
}
|
||||||
|
|
||||||
progressDownload.SetValueInstant(e.ProgressPercentage*10);
|
progressDownload.SetValueInstant(e.ProgressPercentage*10);
|
||||||
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" / "+(e.TotalBytesToReceive/BytesToMB).ToString("0.0",CultureInfo.CurrentCulture)+" MB";
|
labelStatus.Text = (e.BytesReceived/BytesToMB).ToString("0.0", CultureInfo.CurrentCulture)+" / "+(e.TotalBytesToReceive/BytesToMB).ToString("0.0", CultureInfo.CurrentCulture)+" MB";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ namespace TweetDck.Updates{
|
|||||||
else if (e.Error != null){
|
else if (e.Error != null){
|
||||||
Program.Log(e.Error.ToString());
|
Program.Log(e.Error.ToString());
|
||||||
|
|
||||||
if (MessageBox.Show("Could not download the update: "+e.Error.Message+"\r\n\r\nDo you want to open the website and try downloading the update manually?","Update Has Failed",MessageBoxButtons.YesNo,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1) == DialogResult.Yes){
|
if (MessageBox.Show("Could not download the update: "+e.Error.Message+"\r\n\r\nDo you want to open the website and try downloading the update manually?", "Update Has Failed", MessageBoxButtons.YesNo, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.Yes){
|
||||||
BrowserUtils.OpenExternalBrowser(Program.Website);
|
BrowserUtils.OpenExternalBrowser(Program.Website);
|
||||||
UpdateStatus = Status.Manual;
|
UpdateStatus = Status.Manual;
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ using CefSharp;
|
|||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
using TweetDck.Core;
|
using TweetDck.Core;
|
||||||
using TweetDck.Core.Controls;
|
using TweetDck.Core.Controls;
|
||||||
|
using TweetDck.Core.Utils;
|
||||||
using TweetDck.Resources;
|
using TweetDck.Resources;
|
||||||
|
|
||||||
namespace TweetDck.Updates{
|
namespace TweetDck.Updates{
|
||||||
@@ -19,29 +20,29 @@ namespace TweetDck.Updates{
|
|||||||
this.browser = browser;
|
this.browser = browser;
|
||||||
this.form = form;
|
this.form = form;
|
||||||
browser.FrameLoadEnd += browser_FrameLoadEnd;
|
browser.FrameLoadEnd += browser_FrameLoadEnd;
|
||||||
browser.RegisterJsObject("$TDU",new Bridge(this));
|
browser.RegisterJsObject("$TDU", new Bridge(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
if (e.Frame.IsMain){
|
if (e.Frame.IsMain){
|
||||||
ScriptLoader.ExecuteFile(e.Frame,"update.js");
|
ScriptLoader.ExecuteFile(e.Frame, "update.js");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Check(bool force){
|
public int Check(bool force){
|
||||||
browser.ExecuteScriptAsync("TDUF_runUpdateCheck",force,++lastEventId);
|
browser.ExecuteScriptAsync("TDUF_runUpdateCheck", force, ++lastEventId);
|
||||||
return lastEventId;
|
return lastEventId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TriggerUpdateAcceptedEvent(UpdateAcceptedEventArgs args){
|
private void TriggerUpdateAcceptedEvent(UpdateAcceptedEventArgs args){
|
||||||
if (UpdateAccepted != null){
|
if (UpdateAccepted != null){
|
||||||
form.InvokeSafe(() => UpdateAccepted(this,args));
|
form.InvokeSafe(() => UpdateAccepted(this, args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TriggerCheckFinishedEvent(UpdateCheckEventArgs args){
|
private void TriggerCheckFinishedEvent(UpdateCheckEventArgs args){
|
||||||
if (CheckFinished != null){
|
if (CheckFinished != null){
|
||||||
form.InvokeSafe(() => CheckFinished(this,args));
|
form.InvokeSafe(() => CheckFinished(this, args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,6 +71,12 @@ namespace TweetDck.Updates{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsSystemSupported{
|
||||||
|
get{
|
||||||
|
return Environment.OSVersion.Version >= new Version("6.1"); // 6.1 NT version = Windows 7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private readonly UpdateHandler owner;
|
private readonly UpdateHandler owner;
|
||||||
|
|
||||||
public Bridge(UpdateHandler owner){
|
public Bridge(UpdateHandler owner){
|
||||||
@@ -77,11 +84,11 @@ namespace TweetDck.Updates{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdateCheckFinished(int eventId, bool isUpdateAvailable, string latestVersion){
|
public void OnUpdateCheckFinished(int eventId, bool isUpdateAvailable, string latestVersion){
|
||||||
owner.TriggerCheckFinishedEvent(new UpdateCheckEventArgs(eventId,isUpdateAvailable,latestVersion));
|
owner.TriggerCheckFinishedEvent(new UpdateCheckEventArgs(eventId, isUpdateAvailable, latestVersion));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
||||||
owner.TriggerUpdateAcceptedEvent(new UpdateAcceptedEventArgs(new UpdateInfo(versionTag,downloadUrl)));
|
owner.TriggerUpdateAcceptedEvent(new UpdateAcceptedEventArgs(new UpdateInfo(versionTag, downloadUrl)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdateDismissed(string versionTag){
|
public void OnUpdateDismissed(string versionTag){
|
||||||
@@ -90,6 +97,10 @@ namespace TweetDck.Updates{
|
|||||||
Program.UserConfig.Save();
|
Program.UserConfig.Save();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OpenBrowser(string url){
|
||||||
|
BrowserUtils.OpenExternalBrowser(url);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user