mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-09-14 19:32:10 +02:00
Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
c540cf45ca | |||
8bf4789646 | |||
fd97c20d37 | |||
7238e17b86 | |||
4c44da7f4a | |||
af7657e3f8 | |||
bea158b0d9 | |||
40acb49011 | |||
cc7fc7e994 | |||
ddec715dda | |||
a1365a98c0 | |||
9a29d4ff18 | |||
39816eae76 | |||
45a38d9570 | |||
a230258bec | |||
8543205b85 | |||
1d169005da | |||
f5212d88f3 | |||
03a93ad3f3 | |||
3a66fa28ab | |||
5f79b286f1 | |||
f6a4e39cfc | |||
24d8444043 | |||
0b8205dc41 | |||
98197d1e86 |
@@ -60,8 +60,6 @@ namespace TweetDck.Configuration{
|
||||
if (foundProcess.ProcessName == currentProcess.ProcessName){
|
||||
lockingProcess = foundProcess;
|
||||
}
|
||||
|
||||
currentProcess.Close();
|
||||
}
|
||||
}catch(ArgumentException){}
|
||||
|
||||
|
@@ -9,7 +9,7 @@ using TweetDck.Core.Handling;
|
||||
namespace TweetDck.Configuration{
|
||||
[Serializable]
|
||||
sealed class UserConfig{
|
||||
private static readonly IFormatter Formatter = new BinaryFormatter(){
|
||||
private static readonly IFormatter Formatter = new BinaryFormatter{
|
||||
Binder = new SerializationCompatibilityHandler()
|
||||
};
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Utils;
|
||||
|
||||
namespace TweetDck.Core.Controls{
|
||||
public partial class RichTextLabel : RichTextBox{
|
||||
@@ -27,7 +28,7 @@ namespace TweetDck.Core.Controls{
|
||||
get{
|
||||
CreateParams createParams = base.CreateParams;
|
||||
|
||||
if (Program.LoadLibrary("msftedit.dll") != IntPtr.Zero){
|
||||
if (NativeMethods.LoadLibrary("msftedit.dll") != IntPtr.Zero){
|
||||
createParams.ClassName = "RICHEDIT50W";
|
||||
}
|
||||
|
||||
|
3
Core/FormBrowser.Designer.cs
generated
3
Core/FormBrowser.Designer.cs
generated
@@ -23,8 +23,10 @@
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBrowser));
|
||||
this.trayIcon = new TweetDck.Core.TrayIcon();
|
||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// trayIcon
|
||||
@@ -51,6 +53,7 @@
|
||||
#endregion
|
||||
|
||||
private TrayIcon trayIcon;
|
||||
private System.Windows.Forms.ToolTip toolTip;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,6 +9,7 @@ using TweetDck.Core.Other;
|
||||
using TweetDck.Resources;
|
||||
using TweetDck.Core.Utils;
|
||||
using TweetDck.Core.Controls;
|
||||
using System.Drawing;
|
||||
|
||||
namespace TweetDck.Core{
|
||||
sealed partial class FormBrowser : Form{
|
||||
@@ -56,7 +57,8 @@ namespace TweetDck.Core{
|
||||
|
||||
UpdateTrayIcon();
|
||||
|
||||
notification = new FormNotification(this,bridge,true){ CanMoveWindow = () => false };
|
||||
notification = CreateNotificationForm(true);
|
||||
notification.CanMoveWindow = () => false;
|
||||
notification.Show();
|
||||
}
|
||||
|
||||
@@ -65,6 +67,10 @@ namespace TweetDck.Core{
|
||||
form.MoveToCenter(this);
|
||||
}
|
||||
|
||||
public FormNotification CreateNotificationForm(bool autoHide){
|
||||
return new FormNotification(this,bridge,trayIcon,autoHide);
|
||||
}
|
||||
|
||||
// window setup
|
||||
|
||||
private void SetupWindow(){
|
||||
@@ -169,12 +175,17 @@ namespace TweetDck.Core{
|
||||
Close();
|
||||
}
|
||||
|
||||
// callback handlers
|
||||
protected override void WndProc(ref Message m){
|
||||
if (isLoaded && m.Msg == 0x210 && (m.WParam.ToInt32() & 0xFFFF) == 0x020B){ // WM_PARENTNOTIFY, WM_XBUTTONDOWN
|
||||
browser.ExecuteScriptAsync("TDGF_onMouseClickExtra",(m.WParam.ToInt32() >> 16) & 0xFFFF);
|
||||
return;
|
||||
}
|
||||
|
||||
public void InvokeSafe(Action func){
|
||||
ControlExtensions.InvokeSafe(this,func);
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
|
||||
// callback handlers
|
||||
|
||||
public void OpenSettings(){
|
||||
if (currentFormSettings != null){
|
||||
currentFormSettings.BringToFront();
|
||||
@@ -218,6 +229,22 @@ namespace TweetDck.Core{
|
||||
|
||||
}
|
||||
|
||||
public void DisplayTooltip(string text, bool showInNotification){
|
||||
if (showInNotification){
|
||||
notification.DisplayTooltip(text);
|
||||
return;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(text)){
|
||||
toolTip.Hide(this);
|
||||
}
|
||||
else{
|
||||
Point position = PointToClient(Cursor.Position);
|
||||
position.Offset(20,10);
|
||||
toolTip.Show(text,this,position);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnImagePasted(){
|
||||
browser.ExecuteScriptAsync("TDGF_tryPasteImage",new object[0]);
|
||||
}
|
||||
|
@@ -120,6 +120,9 @@
|
||||
<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" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
8
Core/FormNotification.Designer.cs
generated
8
Core/FormNotification.Designer.cs
generated
@@ -29,11 +29,13 @@ namespace TweetDck.Core {
|
||||
this.panelBrowser = new System.Windows.Forms.Panel();
|
||||
this.timerProgress = new System.Windows.Forms.Timer(this.components);
|
||||
this.progressBarTimer = new TweetDck.Core.Controls.FlatProgressBar();
|
||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// panelBrowser
|
||||
//
|
||||
this.panelBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
this.panelBrowser.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.panelBrowser.BackColor = System.Drawing.Color.White;
|
||||
this.panelBrowser.Location = new System.Drawing.Point(0, 0);
|
||||
@@ -49,6 +51,8 @@ namespace TweetDck.Core {
|
||||
//
|
||||
// progressBarTimer
|
||||
//
|
||||
this.progressBarTimer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.progressBarTimer.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.progressBarTimer.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(99)))), ((int)(((byte)(153)))));
|
||||
this.progressBarTimer.Location = new System.Drawing.Point(0, 118);
|
||||
@@ -71,6 +75,7 @@ namespace TweetDck.Core {
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "FormNotification";
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormNotification_FormClosing);
|
||||
@@ -83,5 +88,6 @@ namespace TweetDck.Core {
|
||||
private System.Windows.Forms.Panel panelBrowser;
|
||||
private Controls.FlatProgressBar progressBarTimer;
|
||||
private System.Windows.Forms.Timer timerProgress;
|
||||
private System.Windows.Forms.ToolTip toolTip;
|
||||
}
|
||||
}
|
@@ -7,12 +7,14 @@ using CefSharp.WinForms;
|
||||
using TweetDck.Configuration;
|
||||
using TweetDck.Core.Handling;
|
||||
using TweetDck.Resources;
|
||||
using TweetDck.Core.Utils;
|
||||
|
||||
namespace TweetDck.Core{
|
||||
sealed partial class FormNotification : Form{
|
||||
public Func<bool> CanMoveWindow = () => true;
|
||||
|
||||
private readonly Form owner;
|
||||
private readonly TrayIcon trayIcon;
|
||||
private readonly ChromiumWebBrowser browser;
|
||||
|
||||
private readonly Queue<TweetNotification> tweetQueue = new Queue<TweetNotification>(4);
|
||||
@@ -27,24 +29,40 @@ namespace TweetDck.Core{
|
||||
}
|
||||
}
|
||||
|
||||
public FormNotification(Form owner, TweetDeckBridge bridge, bool autoHide){
|
||||
public bool FreezeTimer { get; set; }
|
||||
public bool ContextMenuOpen { get; set; }
|
||||
public string CurrentUrl { get; private set; }
|
||||
|
||||
private static int BaseClientWidth{
|
||||
get{
|
||||
int level = TweetNotification.FontSizeLevel;
|
||||
return level == 0 ? 284 : (int)Math.Round(284.0*(1.0+0.05*level));
|
||||
}
|
||||
}
|
||||
|
||||
private static int BaseClientHeight{
|
||||
get{
|
||||
int level = TweetNotification.FontSizeLevel;
|
||||
return level == 0 ? 118 : (int)Math.Round(118.0*(1.0+0.075*level));
|
||||
}
|
||||
}
|
||||
|
||||
public FormNotification(Form owner, TweetDeckBridge bridge, TrayIcon trayIcon, bool autoHide){
|
||||
InitializeComponent();
|
||||
|
||||
Text = Program.BrandName;
|
||||
|
||||
this.owner = owner;
|
||||
this.trayIcon = trayIcon;
|
||||
this.autoHide = autoHide;
|
||||
|
||||
owner.FormClosed += (sender, args) => Close();
|
||||
|
||||
notificationJS = ScriptLoader.LoadResource("notification.js");
|
||||
|
||||
browser = new ChromiumWebBrowser("about:blank"){ MenuHandler = new ContextMenuNotification() };
|
||||
browser = new ChromiumWebBrowser("about:blank"){ MenuHandler = new ContextMenuNotification(this,autoHide) };
|
||||
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||
|
||||
if (bridge != null){
|
||||
browser.RegisterJsObject("$TD",bridge);
|
||||
}
|
||||
browser.RegisterJsObject("$TD",bridge);
|
||||
|
||||
panelBrowser.Controls.Add(browser);
|
||||
|
||||
@@ -56,8 +74,6 @@ namespace TweetDck.Core{
|
||||
Disposed += (sender, args) => browser.Dispose();
|
||||
}
|
||||
|
||||
public FormNotification(Form owner, bool autoHide) : this(owner,null,autoHide){}
|
||||
|
||||
protected override void WndProc(ref Message m){
|
||||
if (m.Msg == 0x0112 && (m.WParam.ToInt32() & 0xFFF0) == 0xF010 && !CanMoveWindow()){ // WM_SYSCOMMAND, SC_MOVE
|
||||
return;
|
||||
@@ -69,18 +85,13 @@ namespace TweetDck.Core{
|
||||
// event handlers
|
||||
|
||||
private void timerHideProgress_Tick(object sender, EventArgs e){
|
||||
if (Bounds.Contains(Cursor.Position))return;
|
||||
if (Bounds.Contains(Cursor.Position) || FreezeTimer || ContextMenuOpen)return;
|
||||
|
||||
timeLeft -= timerProgress.Interval;
|
||||
progressBarTimer.SetValueInstant((int)Math.Min(1000,Math.Round(1050.0*(totalTime-timeLeft)/totalTime)));
|
||||
|
||||
if (timeLeft <= 0){
|
||||
if (tweetQueue.Count > 0){
|
||||
LoadNextNotification();
|
||||
}
|
||||
else if (autoHide){
|
||||
HideNotification();
|
||||
}
|
||||
FinishCurrentTweet();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +104,8 @@ namespace TweetDck.Core{
|
||||
MoveToVisibleLocation();
|
||||
LoadNextNotification();
|
||||
}
|
||||
|
||||
trayIcon.HasNotifications = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,6 +128,7 @@ namespace TweetDck.Core{
|
||||
public void ShowNotification(TweetNotification notification){
|
||||
if (Program.UserConfig.MuteNotifications){
|
||||
tweetQueue.Enqueue(notification);
|
||||
trayIcon.HasNotifications = true;
|
||||
}
|
||||
else{
|
||||
MoveToVisibleLocation();
|
||||
@@ -135,9 +149,7 @@ namespace TweetDck.Core{
|
||||
}
|
||||
|
||||
if (reset){
|
||||
browser.LoadHtml(TweetNotification.ExampleTweet.GenerateHtml(),"http://tweetdeck.twitter.com/");
|
||||
|
||||
totalTime = timeLeft = TweetNotification.ExampleTweet.GetDisplayDuration(Program.UserConfig.NotificationDuration);
|
||||
LoadTweet(TweetNotification.ExampleTweet);
|
||||
timerProgress.Start();
|
||||
}
|
||||
|
||||
@@ -147,9 +159,22 @@ namespace TweetDck.Core{
|
||||
public void HideNotification(){
|
||||
browser.LoadHtml("","about:blank");
|
||||
Location = new Point(-32000,-32000);
|
||||
progressBarTimer.Value = 0;
|
||||
timerProgress.Stop();
|
||||
}
|
||||
|
||||
public void FinishCurrentTweet(){
|
||||
if (tweetQueue.Count > 0){
|
||||
LoadNextNotification();
|
||||
}
|
||||
else if (autoHide){
|
||||
HideNotification();
|
||||
}
|
||||
else{
|
||||
timerProgress.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadNextNotification(){
|
||||
TweetNotification tweet = tweetQueue.Dequeue();
|
||||
|
||||
@@ -157,15 +182,22 @@ namespace TweetDck.Core{
|
||||
browser.Load("about:blank"); // required, otherwise shit breaks
|
||||
}
|
||||
|
||||
browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/");
|
||||
|
||||
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDuration);
|
||||
LoadTweet(tweet);
|
||||
timerProgress.Stop();
|
||||
timerProgress.Start();
|
||||
|
||||
UpdateTitle();
|
||||
}
|
||||
|
||||
private void LoadTweet(TweetNotification tweet){
|
||||
browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/");
|
||||
|
||||
totalTime = timeLeft = tweet.GetDisplayDuration(Program.UserConfig.NotificationDuration);
|
||||
progressBarTimer.Value = 0;
|
||||
|
||||
CurrentUrl = tweet.Url;
|
||||
}
|
||||
|
||||
private void MoveToVisibleLocation(){
|
||||
bool needsReactivating = Location.X == -32000;
|
||||
|
||||
@@ -173,11 +205,11 @@ namespace TweetDck.Core{
|
||||
Screen screen = Screen.FromControl(owner);
|
||||
|
||||
if (config.DisplayNotificationTimer){
|
||||
ClientSize = new Size(ClientSize.Width,122);
|
||||
ClientSize = new Size(BaseClientWidth,BaseClientHeight+4);
|
||||
progressBarTimer.Visible = true;
|
||||
}
|
||||
else{
|
||||
ClientSize = new Size(ClientSize.Width,118);
|
||||
ClientSize = new Size(BaseClientWidth,BaseClientHeight);
|
||||
progressBarTimer.Visible = false;
|
||||
}
|
||||
|
||||
@@ -215,12 +247,23 @@ namespace TweetDck.Core{
|
||||
}
|
||||
|
||||
if (needsReactivating){
|
||||
Program.SetWindowPos(Handle.ToInt32(),-1,Left,Top,Width,Height,0x0010); // HWND_TOPMOST, SWP_NOACTIVATE
|
||||
NativeMethods.SetFormPos(this,NativeMethods.HWND_TOPMOST,NativeMethods.SWP_NOACTIVATE);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTitle(){
|
||||
Text = tweetQueue.Count > 0 ? Program.BrandName+" ("+tweetQueue.Count+" more left)" : Program.BrandName;
|
||||
}
|
||||
|
||||
public void DisplayTooltip(string text){
|
||||
if (string.IsNullOrEmpty(text)){
|
||||
toolTip.Hide(this);
|
||||
}
|
||||
else{
|
||||
Point position = PointToClient(Cursor.Position);
|
||||
position.Offset(20,5);
|
||||
toolTip.Show(text,this,position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -12,8 +12,6 @@ namespace TweetDck.Core.Handling{
|
||||
private const int MenuCopyImageUrl = 26504;
|
||||
|
||||
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||
RemoveSeparatorIfLast(model);
|
||||
|
||||
if (parameters.TypeFlags.HasFlag(ContextMenuType.Link) && !parameters.UnfilteredLinkUrl.EndsWith("tweetdeck.twitter.com/#")){
|
||||
model.AddItem((CefMenuCommand)MenuOpenUrlInBrowser,"Open in browser");
|
||||
model.AddItem((CefMenuCommand)MenuCopyUrl,"Copy link address");
|
||||
@@ -79,12 +77,6 @@ namespace TweetDck.Core.Handling{
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void RemoveSeparatorIfFirst(IMenuModel model){
|
||||
if (model.Count > 0 && model.GetTypeAt(model.Count-1) == MenuItemType.Separator){
|
||||
model.RemoveAt(model.Count-1);
|
||||
}
|
||||
}
|
||||
|
||||
protected void RemoveSeparatorIfLast(IMenuModel model){
|
||||
if (model.Count > 0 && model.GetTypeAt(model.Count-1) == MenuItemType.Separator){
|
||||
model.RemoveAt(model.Count-1);
|
||||
|
@@ -1,10 +1,13 @@
|
||||
using CefSharp;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Controls;
|
||||
|
||||
namespace TweetDck.Core.Handling{
|
||||
class ContextMenuBrowser : ContextMenuBase{
|
||||
private const int MenuSettings = 26600;
|
||||
private const int MenuAbout = 26601;
|
||||
private const int MenuMute = 26602;
|
||||
private const int MenuCopyTweetUrl = 26603;
|
||||
|
||||
private readonly FormBrowser form;
|
||||
|
||||
@@ -17,13 +20,22 @@ namespace TweetDck.Core.Handling{
|
||||
model.Remove(CefMenuCommand.Forward);
|
||||
model.Remove(CefMenuCommand.Print);
|
||||
model.Remove(CefMenuCommand.ViewSource);
|
||||
RemoveSeparatorIfLast(model);
|
||||
|
||||
RemoveSeparatorIfFirst(model);
|
||||
if (!string.IsNullOrEmpty(TweetDeckBridge.LastHighlightedTweet)){
|
||||
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
||||
model.AddSeparator();
|
||||
}
|
||||
|
||||
base.OnBeforeContextMenu(browserControl,browser,frame,parameters,model);
|
||||
|
||||
if (model.Count > 0){
|
||||
RemoveSeparatorIfLast(model);
|
||||
model.AddSeparator();
|
||||
}
|
||||
|
||||
model.AddItem(CefMenuCommand.Reload,"Reload");
|
||||
model.AddCheckItem((CefMenuCommand)MenuMute,"Mute Notifications");
|
||||
model.AddCheckItem((CefMenuCommand)MenuMute,"Mute notifications");
|
||||
model.SetChecked((CefMenuCommand)MenuMute,Program.UserConfig.MuteNotifications);
|
||||
model.AddSeparator();
|
||||
|
||||
@@ -41,17 +53,11 @@ namespace TweetDck.Core.Handling{
|
||||
|
||||
switch((int)commandId){
|
||||
case MenuSettings:
|
||||
form.InvokeSafe(() => {
|
||||
form.OpenSettings();
|
||||
});
|
||||
|
||||
form.InvokeSafe(form.OpenSettings);
|
||||
return true;
|
||||
|
||||
case MenuAbout:
|
||||
form.InvokeSafe(() => {
|
||||
form.OpenAbout();
|
||||
});
|
||||
|
||||
form.InvokeSafe(form.OpenAbout);
|
||||
return true;
|
||||
|
||||
case MenuMute:
|
||||
@@ -61,6 +67,10 @@ namespace TweetDck.Core.Handling{
|
||||
});
|
||||
|
||||
return true;
|
||||
|
||||
case MenuCopyTweetUrl:
|
||||
Clipboard.SetText(TweetDeckBridge.LastHighlightedTweet,TextDataFormat.UnicodeText);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@@ -1,12 +1,67 @@
|
||||
using CefSharp;
|
||||
using System.Windows.Forms;
|
||||
using CefSharp;
|
||||
using TweetDck.Core.Controls;
|
||||
|
||||
namespace TweetDck.Core.Handling{
|
||||
class ContextMenuNotification : ContextMenuBase{
|
||||
private const int MenuSkipTweet = 26600;
|
||||
private const int MenuFreeze = 26601;
|
||||
private const int MenuCopyTweetUrl = 26602;
|
||||
|
||||
private readonly FormNotification form;
|
||||
private readonly bool enableCustomMenu;
|
||||
|
||||
public ContextMenuNotification(FormNotification form, bool enableCustomMenu){
|
||||
this.form = form;
|
||||
this.enableCustomMenu = enableCustomMenu;
|
||||
}
|
||||
|
||||
public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||
model.Clear();
|
||||
|
||||
if (enableCustomMenu){
|
||||
model.AddItem((CefMenuCommand)MenuSkipTweet,"Skip tweet");
|
||||
model.AddCheckItem((CefMenuCommand)MenuFreeze,"Freeze");
|
||||
model.SetChecked((CefMenuCommand)MenuFreeze,form.FreezeTimer);
|
||||
model.AddSeparator();
|
||||
|
||||
if (!string.IsNullOrEmpty(form.CurrentUrl)){
|
||||
model.AddItem((CefMenuCommand)MenuCopyTweetUrl,"Copy tweet address");
|
||||
model.AddSeparator();
|
||||
}
|
||||
}
|
||||
|
||||
base.OnBeforeContextMenu(browserControl,browser,frame,parameters,model);
|
||||
RemoveSeparatorIfLast(model);
|
||||
|
||||
form.InvokeSafe(() => form.ContextMenuOpen = true);
|
||||
}
|
||||
|
||||
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)){
|
||||
return true;
|
||||
}
|
||||
|
||||
switch((int)commandId){
|
||||
case MenuSkipTweet:
|
||||
form.InvokeSafe(form.FinishCurrentTweet);
|
||||
return true;
|
||||
|
||||
case MenuFreeze:
|
||||
form.InvokeSafe(() => form.FreezeTimer = !form.FreezeTimer);
|
||||
return true;
|
||||
|
||||
case MenuCopyTweetUrl:
|
||||
Clipboard.SetText(form.CurrentUrl,TextDataFormat.UnicodeText);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){
|
||||
base.OnContextMenuDismissed(browserControl,browser,frame);
|
||||
form.InvokeSafe(() => form.ContextMenuOpen = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using CefSharp;
|
||||
using System.Collections.Generic;
|
||||
using TweetDck.Core.Controls;
|
||||
|
||||
namespace TweetDck.Core.Handling{
|
||||
class DialogHandlerBrowser : IDialogHandler{
|
||||
|
@@ -4,10 +4,12 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Utils;
|
||||
using TweetDck.Core.Controls;
|
||||
|
||||
namespace TweetDck.Core.Handling{
|
||||
class TweetDeckBridge{
|
||||
public static string LastRightClickedLink = string.Empty;
|
||||
public static string LastHighlightedTweet = string.Empty;
|
||||
public static string ClipboardImagePath = string.Empty;
|
||||
|
||||
private readonly FormBrowser form;
|
||||
@@ -65,27 +67,25 @@ namespace TweetDck.Core.Handling{
|
||||
}
|
||||
|
||||
public void SetLastRightClickedLink(string link){
|
||||
form.InvokeSafe(() => {
|
||||
LastRightClickedLink = link;
|
||||
});
|
||||
form.InvokeSafe(() => LastRightClickedLink = link);
|
||||
}
|
||||
|
||||
public void SetLastHighlightedTweet(string link){
|
||||
form.InvokeSafe(() => LastHighlightedTweet = link);
|
||||
}
|
||||
|
||||
public void OpenSettingsMenu(){
|
||||
form.InvokeSafe(() => {
|
||||
form.OpenSettings();
|
||||
});
|
||||
form.InvokeSafe(form.OpenSettings);
|
||||
}
|
||||
|
||||
public void OnTweetPopup(string tweetHtml, int tweetCharacters){
|
||||
public void OnTweetPopup(string tweetHtml, string tweetUrl, int tweetCharacters){
|
||||
form.InvokeSafe(() => {
|
||||
form.OnTweetPopup(new TweetNotification(tweetHtml,tweetCharacters));
|
||||
form.OnTweetPopup(new TweetNotification(tweetHtml,tweetUrl,tweetCharacters));
|
||||
});
|
||||
}
|
||||
|
||||
public void OnTweetSound(){
|
||||
form.InvokeSafe(() => {
|
||||
form.OnTweetSound();
|
||||
});
|
||||
form.InvokeSafe(form.OnTweetSound);
|
||||
}
|
||||
|
||||
public void OnUpdateAccepted(string versionTag, string downloadUrl){
|
||||
@@ -101,6 +101,12 @@ namespace TweetDck.Core.Handling{
|
||||
});
|
||||
}
|
||||
|
||||
public void DisplayTooltip(string text, bool showInNotification){
|
||||
form.InvokeSafe(() => {
|
||||
form.DisplayTooltip(text,showInNotification);
|
||||
});
|
||||
}
|
||||
|
||||
public void TryPasteImage(){
|
||||
form.InvokeSafe(() => {
|
||||
if (Clipboard.ContainsImage()){
|
||||
@@ -126,10 +132,9 @@ namespace TweetDck.Core.Handling{
|
||||
Point prevPos = Cursor.Position;
|
||||
|
||||
Cursor.Position = form.PointToScreen(new Point(offsetX,offsetY));
|
||||
Program.mouse_event(SystemInformation.MouseButtonsSwapped ? 0x08 : 0x02,Cursor.Position.X,Cursor.Position.Y,0,0); // MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_LEFTDOWN
|
||||
Program.mouse_event(SystemInformation.MouseButtonsSwapped ? 0x10 : 0x04,Cursor.Position.X,Cursor.Position.Y,0,0); // MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_LEFTUP
|
||||
|
||||
NativeMethods.SimulateMouseClick(NativeMethods.MouseButton.Left);
|
||||
Cursor.Position = prevPos;
|
||||
|
||||
form.OnImagePastedFinish();
|
||||
});
|
||||
}
|
||||
|
@@ -12,6 +12,18 @@ namespace TweetDck.Core.Handling{
|
||||
}
|
||||
}
|
||||
|
||||
public static int FontSizeLevel{
|
||||
get{
|
||||
switch(FontSizeClass){
|
||||
case "largest": return 4;
|
||||
case "large": return 3;
|
||||
case "medium": return 2;
|
||||
case "small": return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static TweetNotification ExampleTweet{
|
||||
get{
|
||||
StringBuilder build = new StringBuilder();
|
||||
@@ -26,7 +38,7 @@ namespace TweetDck.Core.Handling{
|
||||
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></div></article>");
|
||||
|
||||
return new TweetNotification(build.ToString(),95);
|
||||
return new TweetNotification(build.ToString(),"",95);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,11 +58,19 @@ namespace TweetDck.Core.Handling{
|
||||
Short, Medium, Long, VeryLong
|
||||
}
|
||||
|
||||
public string Url{
|
||||
get{
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly string html;
|
||||
private readonly string url;
|
||||
private readonly int characters;
|
||||
|
||||
public TweetNotification(string html, int characters){
|
||||
public TweetNotification(string html, string url, int characters){
|
||||
this.html = html;
|
||||
this.url = url;
|
||||
this.characters = characters;
|
||||
}
|
||||
|
||||
@@ -72,7 +92,7 @@ namespace TweetDck.Core.Handling{
|
||||
build.Append("<!DOCTYPE html>");
|
||||
build.Append("<html class='os-windows txt-base-").Append(FontSizeClass).Append("'>");
|
||||
build.Append("<head>").Append(HeadTag).Append("</head>");
|
||||
build.Append("<body class='hearty'><div class='app-columns-container'><div class='column' style='width:100%'>");
|
||||
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("</div></div></body>");
|
||||
build.Append("</html>");
|
||||
|
121
Core/Other/FormAbout.Designer.cs
generated
121
Core/Other/FormAbout.Designer.cs
generated
@@ -25,44 +25,131 @@ namespace TweetDck.Core.Other {
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.labelAbout = new TweetDck.Core.Controls.RichTextLabel();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAbout));
|
||||
this.pictureLogo = new System.Windows.Forms.PictureBox();
|
||||
this.labelDescription = new System.Windows.Forms.Label();
|
||||
this.labelSourceCode = new System.Windows.Forms.LinkLabel();
|
||||
this.labelWebsite = new System.Windows.Forms.LinkLabel();
|
||||
this.tablePanelLinks = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.labelIssues = new System.Windows.Forms.LinkLabel();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureLogo)).BeginInit();
|
||||
this.tablePanelLinks.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// labelAbout
|
||||
// pictureLogo
|
||||
//
|
||||
this.labelAbout.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
this.pictureLogo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
|
||||
this.pictureLogo.ErrorImage = null;
|
||||
this.pictureLogo.Image = ((System.Drawing.Image)(resources.GetObject("pictureLogo.Image")));
|
||||
this.pictureLogo.InitialImage = null;
|
||||
this.pictureLogo.Location = new System.Drawing.Point(12, 12);
|
||||
this.pictureLogo.Name = "pictureLogo";
|
||||
this.pictureLogo.Size = new System.Drawing.Size(96, 96);
|
||||
this.pictureLogo.TabIndex = 0;
|
||||
this.pictureLogo.TabStop = false;
|
||||
//
|
||||
// labelDescription
|
||||
//
|
||||
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.labelAbout.BackColor = System.Drawing.Color.White;
|
||||
this.labelAbout.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.labelAbout.Location = new System.Drawing.Point(12, 12);
|
||||
this.labelAbout.Name = "labelAbout";
|
||||
this.labelAbout.ReadOnly = true;
|
||||
this.labelAbout.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None;
|
||||
this.labelAbout.Size = new System.Drawing.Size(360, 126);
|
||||
this.labelAbout.TabIndex = 0;
|
||||
this.labelAbout.TabStop = false;
|
||||
this.labelAbout.Text = "";
|
||||
this.labelAbout.Click += new System.EventHandler(this.labelAbout_Click);
|
||||
this.labelDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.labelDescription.Location = new System.Drawing.Point(114, 12);
|
||||
this.labelDescription.Name = "labelDescription";
|
||||
this.labelDescription.Size = new System.Drawing.Size(232, 109);
|
||||
this.labelDescription.TabIndex = 1;
|
||||
//
|
||||
// labelSourceCode
|
||||
//
|
||||
this.labelSourceCode.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelSourceCode.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.labelSourceCode.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||
this.labelSourceCode.Location = new System.Drawing.Point(117, 0);
|
||||
this.labelSourceCode.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.labelSourceCode.Name = "labelSourceCode";
|
||||
this.labelSourceCode.Size = new System.Drawing.Size(99, 16);
|
||||
this.labelSourceCode.TabIndex = 3;
|
||||
this.labelSourceCode.Text = "Source Code";
|
||||
this.labelSourceCode.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.labelSourceCode.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||
//
|
||||
// labelWebsite
|
||||
//
|
||||
this.labelWebsite.AutoSize = true;
|
||||
this.labelWebsite.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelWebsite.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.labelWebsite.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||
this.labelWebsite.Location = new System.Drawing.Point(0, 0);
|
||||
this.labelWebsite.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.labelWebsite.Name = "labelWebsite";
|
||||
this.labelWebsite.Size = new System.Drawing.Size(117, 16);
|
||||
this.labelWebsite.TabIndex = 2;
|
||||
this.labelWebsite.Text = "Official Website";
|
||||
this.labelWebsite.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
this.labelWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||
//
|
||||
// tablePanelLinks
|
||||
//
|
||||
this.tablePanelLinks.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tablePanelLinks.ColumnCount = 3;
|
||||
this.tablePanelLinks.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.16F));
|
||||
this.tablePanelLinks.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 29.7F));
|
||||
this.tablePanelLinks.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.14F));
|
||||
this.tablePanelLinks.Controls.Add(this.labelIssues, 2, 0);
|
||||
this.tablePanelLinks.Controls.Add(this.labelWebsite, 0, 0);
|
||||
this.tablePanelLinks.Controls.Add(this.labelSourceCode, 1, 0);
|
||||
this.tablePanelLinks.Location = new System.Drawing.Point(12, 124);
|
||||
this.tablePanelLinks.Name = "tablePanelLinks";
|
||||
this.tablePanelLinks.RowCount = 1;
|
||||
this.tablePanelLinks.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||
this.tablePanelLinks.Size = new System.Drawing.Size(334, 16);
|
||||
this.tablePanelLinks.TabIndex = 4;
|
||||
//
|
||||
// labelIssues
|
||||
//
|
||||
this.labelIssues.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelIssues.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||
this.labelIssues.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||
this.labelIssues.Location = new System.Drawing.Point(216, 0);
|
||||
this.labelIssues.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.labelIssues.Name = "labelIssues";
|
||||
this.labelIssues.Size = new System.Drawing.Size(118, 16);
|
||||
this.labelIssues.TabIndex = 4;
|
||||
this.labelIssues.Text = "Report an Issue";
|
||||
this.labelIssues.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
this.labelIssues.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||
//
|
||||
// FormAbout
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.White;
|
||||
this.ClientSize = new System.Drawing.Size(384, 150);
|
||||
this.Controls.Add(this.labelAbout);
|
||||
this.ClientSize = new System.Drawing.Size(358, 152);
|
||||
this.Controls.Add(this.tablePanelLinks);
|
||||
this.Controls.Add(this.labelDescription);
|
||||
this.Controls.Add(this.pictureLogo);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "FormAbout";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureLogo)).EndInit();
|
||||
this.tablePanelLinks.ResumeLayout(false);
|
||||
this.tablePanelLinks.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Controls.RichTextLabel labelAbout;
|
||||
private System.Windows.Forms.PictureBox pictureLogo;
|
||||
private System.Windows.Forms.Label labelDescription;
|
||||
private System.Windows.Forms.LinkLabel labelSourceCode;
|
||||
private System.Windows.Forms.LinkLabel labelWebsite;
|
||||
private System.Windows.Forms.TableLayoutPanel tablePanelLinks;
|
||||
private System.Windows.Forms.LinkLabel labelIssues;
|
||||
|
||||
}
|
||||
}
|
@@ -1,43 +1,25 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Controls;
|
||||
using System.Windows.Forms;
|
||||
using TweetDck.Core.Utils;
|
||||
|
||||
namespace TweetDck.Core.Other{
|
||||
sealed partial class FormAbout : Form{
|
||||
private const string GitHubLink = "https://github.com/chylex/TweetDuck";
|
||||
private const string IssuesLink = "https://github.com/chylex/TweetDuck/issues";
|
||||
|
||||
public FormAbout(){
|
||||
InitializeComponent();
|
||||
|
||||
Text = "About "+Program.BrandName+" "+Program.VersionTag;
|
||||
|
||||
StringBuilder build = new StringBuilder();
|
||||
build.Append(@"\fs22").Append(Program.BrandName).Append(@" was created by chylex as a replacement to the discontinued TweetDeck client for Windows, and is released under the MIT license.\par ");
|
||||
build.Append(@"Official Website: ").Append(RichTextLabel.AddLink(Program.Website)).Append(@"\line ");
|
||||
build.Append(@"Source Code: ").Append(RichTextLabel.AddLink(GitHubLink));
|
||||
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.";
|
||||
|
||||
labelAbout.Rtf = RichTextLabel.Wrap(build.ToString());
|
||||
labelWebsite.Links.Add(new LinkLabel.Link(0,labelWebsite.Text.Length,Program.Website));
|
||||
labelSourceCode.Links.Add(new LinkLabel.Link(0,labelSourceCode.Text.Length,GitHubLink));
|
||||
labelIssues.Links.Add(new LinkLabel.Link(0,labelIssues.Text.Length,IssuesLink));
|
||||
}
|
||||
|
||||
private void labelAbout_Click(object sender, EventArgs e){ // LinkClicked isn't working so fuck that
|
||||
if (Cursor.Current != Cursors.Hand)return;
|
||||
|
||||
// I don't even give a fuck, someone else PR a proper fix please
|
||||
int index = labelAbout.GetCharIndexFromPosition(((MouseEventArgs)e).Location);
|
||||
|
||||
if (IsClickingOn(index,Program.Website)){
|
||||
BrowserUtils.OpenExternalBrowser(Program.Website);
|
||||
}
|
||||
else if (IsClickingOn(index,GitHubLink)){
|
||||
BrowserUtils.OpenExternalBrowser(GitHubLink);
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsClickingOn(int index, string substringSearch){
|
||||
int substringIndex = labelAbout.Text.IndexOf(substringSearch,StringComparison.Ordinal);
|
||||
return index >= substringIndex && index <= substringIndex+substringSearch.Length;
|
||||
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e){
|
||||
BrowserUtils.OpenExternalBrowser(e.Link.LinkData as string);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
246
Core/Other/FormAbout.resx
Normal file
246
Core/Other/FormAbout.resx
Normal file
@@ -0,0 +1,246 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="pictureLogo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
AElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
3
Core/Other/FormBackgroundWork.Designer.cs
generated
3
Core/Other/FormBackgroundWork.Designer.cs
generated
@@ -26,7 +26,7 @@ namespace TweetDck.Core.Other {
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.progressBarUseless = new System.Windows.Forms.ProgressBar();
|
||||
this.labelDescription = new RichTextLabel();
|
||||
this.labelDescription = new TweetDck.Core.Controls.RichTextLabel();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// progressBarUseless
|
||||
@@ -64,6 +64,7 @@ namespace TweetDck.Core.Other {
|
||||
this.Controls.Add(this.progressBarUseless);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.Name = "FormBackgroundWork";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "TweetDeck Migration";
|
||||
this.ResumeLayout(false);
|
||||
|
@@ -20,7 +20,8 @@ namespace TweetDck.Core.Other{
|
||||
|
||||
Text = Program.BrandName+" Settings";
|
||||
|
||||
notification = new FormNotification(browserForm,false){ CanMoveWindow = () => radioLocCustom.Checked };
|
||||
notification = browserForm.CreateNotificationForm(false);
|
||||
notification.CanMoveWindow = () => radioLocCustom.Checked;
|
||||
|
||||
notification.Move += (sender, args) => {
|
||||
if (radioLocCustom.Checked){
|
||||
|
6
Core/TrayIcon.Designer.cs
generated
6
Core/TrayIcon.Designer.cs
generated
@@ -31,13 +31,13 @@
|
||||
this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.contextMenu.SuspendLayout();
|
||||
//
|
||||
// trayIcon
|
||||
// notifyIcon
|
||||
//
|
||||
this.notifyIcon.ContextMenuStrip = this.contextMenu;
|
||||
this.notifyIcon.Icon = global::TweetDck.Properties.Resources.icon;
|
||||
this.notifyIcon.Icon = global::TweetDck.Properties.Resources.icon_tray;
|
||||
this.notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trayIcon_MouseClick);
|
||||
//
|
||||
// contextMenuTray
|
||||
// contextMenu
|
||||
//
|
||||
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.restoreToolStripMenuItem,
|
||||
|
@@ -21,6 +21,21 @@ namespace TweetDck.Core{
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasNotifications{
|
||||
get{
|
||||
return hasNotifications;
|
||||
}
|
||||
|
||||
set{
|
||||
if (hasNotifications != value){
|
||||
notifyIcon.Icon = value ? Properties.Resources.icon_tray_new : Properties.Resources.icon_tray;
|
||||
hasNotifications = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool hasNotifications;
|
||||
|
||||
public TrayIcon(){
|
||||
InitializeComponent();
|
||||
notifyIcon.Text = Program.BrandName;
|
||||
|
56
Core/Utils/NativeMethods.cs
Normal file
56
Core/Utils/NativeMethods.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace TweetDck.Core.Utils{
|
||||
static class NativeMethods{
|
||||
public const int HWND_TOPMOST = -1;
|
||||
public const uint SWP_NOACTIVATE = 0x0010;
|
||||
|
||||
public const int MOUSEEVENTF_LEFTDOWN = 0x02;
|
||||
public const int MOUSEEVENTF_LEFTUP = 0x04;
|
||||
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
|
||||
public const int MOUSEEVENTF_RIGHTUP = 0x10;
|
||||
|
||||
public enum MouseButton{
|
||||
Left, Right
|
||||
}
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr LoadLibrary(string name);
|
||||
|
||||
[DllImport("Shell32.dll")]
|
||||
public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
|
||||
public static extern bool SetWindowPos(int hWnd, int hWndOrder, int x, int y, int width, int height, uint flags);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
|
||||
|
||||
public static void SetFormPos(Form form, int hWndOrder, uint flags){
|
||||
SetWindowPos(form.Handle.ToInt32(),hWndOrder,form.Left,form.Top,form.Width,form.Height,flags);
|
||||
}
|
||||
|
||||
public static void SimulateMouseClick(MouseButton button){
|
||||
int flagHold, flagRelease;
|
||||
|
||||
switch(button){
|
||||
case MouseButton.Left:
|
||||
flagHold = SystemInformation.MouseButtonsSwapped ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_LEFTDOWN;
|
||||
flagRelease = SystemInformation.MouseButtonsSwapped ? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_LEFTUP;
|
||||
break;
|
||||
|
||||
case MouseButton.Right:
|
||||
flagHold = SystemInformation.MouseButtonsSwapped ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN;
|
||||
flagRelease = SystemInformation.MouseButtonsSwapped ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP;
|
||||
break;
|
||||
|
||||
default: return;
|
||||
}
|
||||
|
||||
mouse_event(flagHold,Cursor.Position.X,Cursor.Position.Y,0,0);
|
||||
mouse_event(flagRelease,Cursor.Position.X,Cursor.Position.Y,0,0);
|
||||
}
|
||||
}
|
||||
}
|
34
Migration/FormMigrationQuestion.Designer.cs
generated
34
Migration/FormMigrationQuestion.Designer.cs
generated
@@ -28,10 +28,9 @@ namespace TweetDck.Migration {
|
||||
this.btnIgnore = new System.Windows.Forms.Button();
|
||||
this.panelButtons = new System.Windows.Forms.FlowLayoutPanel();
|
||||
this.btnAskLater = new System.Windows.Forms.Button();
|
||||
this.btnCopy = new System.Windows.Forms.Button();
|
||||
this.btnMigrate = new System.Windows.Forms.Button();
|
||||
this.btnMigrateUninstall = new System.Windows.Forms.Button();
|
||||
this.labelQuestion = new RichTextLabel();
|
||||
this.labelQuestion = new TweetDck.Core.Controls.RichTextLabel();
|
||||
this.panelButtons.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
@@ -39,8 +38,8 @@ namespace TweetDck.Migration {
|
||||
//
|
||||
this.btnIgnore.AutoSize = true;
|
||||
this.btnIgnore.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.btnIgnore.Location = new System.Drawing.Point(356, 0);
|
||||
this.btnIgnore.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
|
||||
this.btnIgnore.Location = new System.Drawing.Point(353, 0);
|
||||
this.btnIgnore.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnIgnore.Name = "btnIgnore";
|
||||
this.btnIgnore.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnIgnore.Size = new System.Drawing.Size(53, 23);
|
||||
@@ -55,11 +54,10 @@ namespace TweetDck.Migration {
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.panelButtons.Controls.Add(this.btnAskLater);
|
||||
this.panelButtons.Controls.Add(this.btnIgnore);
|
||||
this.panelButtons.Controls.Add(this.btnCopy);
|
||||
this.panelButtons.Controls.Add(this.btnMigrate);
|
||||
this.panelButtons.Controls.Add(this.btnMigrateUninstall);
|
||||
this.panelButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
|
||||
this.panelButtons.Location = new System.Drawing.Point(12, 87);
|
||||
this.panelButtons.Location = new System.Drawing.Point(12, 75);
|
||||
this.panelButtons.Name = "panelButtons";
|
||||
this.panelButtons.Size = new System.Drawing.Size(480, 23);
|
||||
this.panelButtons.TabIndex = 0;
|
||||
@@ -78,25 +76,11 @@ namespace TweetDck.Migration {
|
||||
this.btnAskLater.UseVisualStyleBackColor = true;
|
||||
this.btnAskLater.Click += new System.EventHandler(this.btnAskLater_Click);
|
||||
//
|
||||
// btnCopy
|
||||
//
|
||||
this.btnCopy.AutoSize = true;
|
||||
this.btnCopy.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.btnCopy.Location = new System.Drawing.Point(303, 0);
|
||||
this.btnCopy.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnCopy.Name = "btnCopy";
|
||||
this.btnCopy.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnCopy.Size = new System.Drawing.Size(47, 23);
|
||||
this.btnCopy.TabIndex = 2;
|
||||
this.btnCopy.Text = "Copy";
|
||||
this.btnCopy.UseVisualStyleBackColor = true;
|
||||
this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click);
|
||||
//
|
||||
// btnMigrate
|
||||
//
|
||||
this.btnMigrate.AutoSize = true;
|
||||
this.btnMigrate.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.btnMigrate.Location = new System.Drawing.Point(239, 0);
|
||||
this.btnMigrate.Location = new System.Drawing.Point(289, 0);
|
||||
this.btnMigrate.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
this.btnMigrate.Name = "btnMigrate";
|
||||
this.btnMigrate.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
@@ -110,7 +94,7 @@ namespace TweetDck.Migration {
|
||||
//
|
||||
this.btnMigrateUninstall.AutoSize = true;
|
||||
this.btnMigrateUninstall.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.btnMigrateUninstall.Location = new System.Drawing.Point(135, 0);
|
||||
this.btnMigrateUninstall.Location = new System.Drawing.Point(185, 0);
|
||||
this.btnMigrateUninstall.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||
this.btnMigrateUninstall.Name = "btnMigrateUninstall";
|
||||
this.btnMigrateUninstall.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
||||
@@ -131,7 +115,7 @@ namespace TweetDck.Migration {
|
||||
this.labelQuestion.Name = "labelQuestion";
|
||||
this.labelQuestion.ReadOnly = true;
|
||||
this.labelQuestion.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None;
|
||||
this.labelQuestion.Size = new System.Drawing.Size(443, 72);
|
||||
this.labelQuestion.Size = new System.Drawing.Size(443, 60);
|
||||
this.labelQuestion.TabIndex = 2;
|
||||
this.labelQuestion.TabStop = false;
|
||||
this.labelQuestion.Text = "";
|
||||
@@ -140,13 +124,14 @@ namespace TweetDck.Migration {
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(504, 122);
|
||||
this.ClientSize = new System.Drawing.Size(504, 110);
|
||||
this.Controls.Add(this.labelQuestion);
|
||||
this.Controls.Add(this.panelButtons);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "FormMigrationQuestion";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "TweetDeck Migration";
|
||||
this.panelButtons.ResumeLayout(false);
|
||||
@@ -159,7 +144,6 @@ namespace TweetDck.Migration {
|
||||
|
||||
private System.Windows.Forms.Button btnIgnore;
|
||||
private System.Windows.Forms.FlowLayoutPanel panelButtons;
|
||||
private System.Windows.Forms.Button btnCopy;
|
||||
private System.Windows.Forms.Button btnMigrate;
|
||||
private RichTextLabel labelQuestion;
|
||||
private System.Windows.Forms.Button btnAskLater;
|
||||
|
@@ -10,7 +10,7 @@ namespace TweetDck.Migration{
|
||||
public FormMigrationQuestion(){
|
||||
InitializeComponent();
|
||||
|
||||
labelQuestion.Rtf = RichTextLabel.Wrap(@"Hey there, I found some TweetDeck data! Do you want to \b Migrate\b0 it and delete the old data folder, \b Copy\b0 it and keep the folder, \b Ignore\b0 the request forever, or do you need some more time for the decision?\par You may also \b Migrate & Purge\b0 which uninstalls TweetDeck too!");
|
||||
labelQuestion.Rtf = RichTextLabel.Wrap(@"Hey there, I found some TweetDeck data! Do you want to \b Migrate\b0 it and delete the old data folder, \b Ignore\b0 the request forever, or just try "+Program.BrandName+@" first?\par You may also \b Migrate & Purge\b0 which uninstalls TweetDeck too!");
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e){
|
||||
@@ -26,10 +26,6 @@ namespace TweetDck.Migration{
|
||||
Close(MigrationDecision.Migrate);
|
||||
}
|
||||
|
||||
private void btnCopy_Click(object sender, EventArgs e){
|
||||
Close(MigrationDecision.Copy);
|
||||
}
|
||||
|
||||
private void btnIgnore_Click(object sender, EventArgs e){
|
||||
Close(MigrationDecision.Ignore);
|
||||
}
|
||||
|
@@ -10,11 +10,6 @@
|
||||
/// </summary>
|
||||
MigratePurge,
|
||||
|
||||
/// <summary>
|
||||
/// Copies the important files without deleting the TweetDeck folder.
|
||||
/// </summary>
|
||||
Copy,
|
||||
|
||||
/// <summary>
|
||||
/// Does not copy any files and does not ask the user about data migration again.
|
||||
/// </summary>
|
||||
|
@@ -8,6 +8,7 @@ using System.Windows.Forms;
|
||||
using Microsoft.Win32;
|
||||
using TweetDck.Core.Other;
|
||||
using TweetDck.Migration.Helpers;
|
||||
using TweetDck.Core.Utils;
|
||||
|
||||
namespace TweetDck.Migration{
|
||||
static class MigrationManager{
|
||||
@@ -25,7 +26,6 @@ namespace TweetDck.Migration{
|
||||
switch(decision){
|
||||
case MigrationDecision.MigratePurge:
|
||||
case MigrationDecision.Migrate:
|
||||
case MigrationDecision.Copy:
|
||||
FormBackgroundWork formWait = new FormBackgroundWork();
|
||||
|
||||
formWait.ShowWorkDialog(() => {
|
||||
@@ -66,7 +66,7 @@ namespace TweetDck.Migration{
|
||||
}
|
||||
|
||||
private static bool BeginMigration(MigrationDecision decision, Action<Exception> onFinished){
|
||||
if (decision != MigrationDecision.MigratePurge && decision != MigrationDecision.Migrate && decision != MigrationDecision.Copy){
|
||||
if (decision != MigrationDecision.MigratePurge && decision != MigrationDecision.Migrate){
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ namespace TweetDck.Migration{
|
||||
if (decision == MigrationDecision.MigratePurge){
|
||||
// update the lnk files wherever possible (desktop icons, pinned taskbar, start menu)
|
||||
foreach(string location in GetLnkDirectories()){
|
||||
if (location == string.Empty)continue;
|
||||
if (string.IsNullOrEmpty(location))continue;
|
||||
|
||||
string linkFile = Path.Combine(location,"TweetDeck.lnk");
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace TweetDck.Migration{
|
||||
LnkEditor lnk = new LnkEditor(linkFile);
|
||||
lnk.SetPath(Application.ExecutablePath);
|
||||
lnk.SetWorkingDirectory(Environment.CurrentDirectory);
|
||||
lnk.SetComment(Program.BrandName); // TODO add a tagline
|
||||
lnk.SetComment(Program.BrandName+" client for Windows");
|
||||
lnk.Save();
|
||||
|
||||
string renamed = Path.Combine(location,Program.BrandName+".lnk");
|
||||
@@ -143,7 +143,7 @@ namespace TweetDck.Migration{
|
||||
}
|
||||
}
|
||||
|
||||
Program.SHChangeNotify(0x8000000,0x1000,IntPtr.Zero,IntPtr.Zero); // refreshes desktop
|
||||
NativeMethods.SHChangeNotify(0x8000000,0x1000,IntPtr.Zero,IntPtr.Zero); // refreshes desktop
|
||||
|
||||
// uninstall in the background
|
||||
string guid = ProgramRegistrySearch.FindByDisplayName("TweetDeck");
|
||||
@@ -177,15 +177,6 @@ namespace TweetDck.Migration{
|
||||
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");
|
||||
|
||||
/* already handled by the installer
|
||||
string startMenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
|
||||
string[] sub = Directory.GetDirectories(startMenu);
|
||||
|
||||
if (sub.Length > 0){
|
||||
yield return Path.Combine(startMenu,sub[0],"TweetDeck");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
private static void RunUninstaller(string guid, int timeout){
|
||||
|
13
Program.cs
13
Program.cs
@@ -2,7 +2,6 @@
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using CefSharp;
|
||||
@@ -38,18 +37,6 @@ namespace TweetDck{
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr LoadLibrary(string name);
|
||||
|
||||
[DllImport("Shell32.dll")]
|
||||
public static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
|
||||
public static extern bool SetWindowPos(int hWnd, int hWndOrder, int x, int y, int width, int height, uint flags);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
|
||||
|
||||
[STAThread]
|
||||
private static void Main(){
|
||||
Application.EnableVisualStyles();
|
||||
|
20
Properties/Resources.Designer.cs
generated
20
Properties/Resources.Designer.cs
generated
@@ -69,5 +69,25 @@ namespace TweetDck.Properties {
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon icon_tray {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icon_tray", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon icon_tray_new {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icon_tray_new", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -121,4 +121,10 @@
|
||||
<data name="icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icon_tray" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icon-tray.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icon_tray_new" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icon-tray-new.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
BIN
Resources/about.png
Normal file
BIN
Resources/about.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
@@ -4,6 +4,16 @@
|
||||
//
|
||||
var isInitialized = false;
|
||||
|
||||
//
|
||||
// Variable: Current highlighted column jQuery object.
|
||||
//
|
||||
var highlightedColumnEle;
|
||||
|
||||
//
|
||||
// Variable: Currently highlighted tweet jQuery object.
|
||||
//
|
||||
var highlightedTweetEle;
|
||||
|
||||
//
|
||||
// Function: Initializes TweetD*ck events. Called after the website app is loaded.
|
||||
//
|
||||
@@ -30,10 +40,15 @@
|
||||
},0);
|
||||
});
|
||||
|
||||
// Fix layout for right-aligned actions menu
|
||||
$(document).on("uiShowActionsMenu",function(){
|
||||
$(".js-dropdown.pos-r").toggleClass("pos-r pos-l");
|
||||
});
|
||||
|
||||
// Notification handling
|
||||
$.subscribe("/notifications/new",function(obj){
|
||||
for(var item of obj.items){
|
||||
onNewTweet(obj.column,item);
|
||||
for(let index = obj.items.length-1; index >= 0; index--){
|
||||
onNewTweet(obj.column,obj.items[index]);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -76,18 +91,11 @@
|
||||
}));
|
||||
|
||||
html.css("border","0");
|
||||
html.find(".tweet-body").first().children("footer").remove();
|
||||
|
||||
var body = html.find(".tweet-body").first();
|
||||
var url = html.find("time").first().children("a").first().attr("href") || "";
|
||||
|
||||
body.children("div.js-quote-detail").each(function(){
|
||||
$(this).html("(quoted tweet)");
|
||||
$(this).removeClass("padding-al");
|
||||
$(this).css("padding","6px");
|
||||
});
|
||||
|
||||
body.children("footer").remove();
|
||||
|
||||
$TD.onTweetPopup(html.html(),tweet.text.length); // TODO column
|
||||
$TD.onTweetPopup(html.html(),url,tweet.text.length); // TODO column
|
||||
}
|
||||
else if (column.model.getHasSound()){
|
||||
$TD.onTweetSound(); // TODO disable original
|
||||
@@ -112,7 +120,7 @@
|
||||
//
|
||||
var app = $("body").children(".js-app");
|
||||
|
||||
new MutationObserver(function(mutations){
|
||||
new MutationObserver(function(){
|
||||
if (isInitialized && app.hasClass("is-hidden")){
|
||||
isInitialized = false;
|
||||
}
|
||||
@@ -138,7 +146,7 @@
|
||||
});
|
||||
|
||||
//
|
||||
// Block: Force popup notification settings
|
||||
// Block: Force popup notification settings.
|
||||
//
|
||||
TD.controller.notifications.hasNotifications = function(){
|
||||
return true;
|
||||
@@ -149,7 +157,7 @@
|
||||
};
|
||||
|
||||
//
|
||||
// Block: Hook into links to bypass default open function
|
||||
// Block: Hook into links to bypass default open function.
|
||||
//
|
||||
(function(){
|
||||
var urlWait = false;
|
||||
@@ -194,18 +202,17 @@
|
||||
})();
|
||||
|
||||
//
|
||||
// Block: Expand shortened links on hover.
|
||||
// Block: Expand shortened links on hover or display tooltip.
|
||||
//
|
||||
(function(){
|
||||
var cutStart = function(str, search){
|
||||
return _.startsWith(str,search) ? str.substr(search.length) : str;
|
||||
return str.startsWith(search) ? str.substr(search.length) : str;
|
||||
};
|
||||
|
||||
$(document.body).delegate("a[data-full-url]","mouseenter mouseleave",function(e){
|
||||
if (!$TD.expandLinksOnHover){
|
||||
return;
|
||||
}
|
||||
var prevMouseX = -1, prevMouseY = -1;
|
||||
var tooltipTimer, tooltipDisplayed;
|
||||
|
||||
$(document.body).delegate("a[data-full-url]","mouseenter mouseleave mousemove",function(e){
|
||||
var me = $(this);
|
||||
|
||||
if (e.type === "mouseenter"){
|
||||
@@ -215,19 +222,42 @@
|
||||
return;
|
||||
}
|
||||
|
||||
var expanded = me.attr("data-full-url");
|
||||
expanded = cutStart(expanded,"https://");
|
||||
expanded = cutStart(expanded,"http://");
|
||||
expanded = cutStart(expanded,"www.");
|
||||
if ($TD.expandLinksOnHover){
|
||||
var expanded = me.attr("data-full-url");
|
||||
expanded = cutStart(expanded,"https://");
|
||||
expanded = cutStart(expanded,"http://");
|
||||
expanded = cutStart(expanded,"www.");
|
||||
|
||||
me.attr("td-prev-text",text);
|
||||
me.text(expanded);
|
||||
me.attr("td-prev-text",text);
|
||||
me.text(expanded);
|
||||
}
|
||||
else{
|
||||
tooltipTimer = window.setTimeout(function(){
|
||||
$TD.displayTooltip(me.attr("data-full-url"),false);
|
||||
tooltipDisplayed = true;
|
||||
},400);
|
||||
}
|
||||
}
|
||||
else if (e.type === "mouseleave"){
|
||||
var prevText = me.attr("td-prev-text");
|
||||
if ($TD.expandLinksOnHover){
|
||||
var prevText = me.attr("td-prev-text");
|
||||
|
||||
if (prevText){
|
||||
me.text(prevText);
|
||||
if (prevText){
|
||||
me.text(prevText);
|
||||
}
|
||||
}
|
||||
|
||||
if (tooltipDisplayed){
|
||||
window.clearTimeout(tooltipTimer);
|
||||
tooltipDisplayed = false;
|
||||
$TD.displayTooltip(null,false);
|
||||
}
|
||||
}
|
||||
else if (e.type === "mousemove"){
|
||||
if (tooltipDisplayed && (prevMouseX != e.clientX || prevMouseY != e.clientY)){
|
||||
$TD.displayTooltip(me.attr("data-full-url"),false);
|
||||
prevMouseX = e.clientX;
|
||||
prevMouseY = e.clientY;
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -256,7 +286,7 @@
|
||||
};*/
|
||||
|
||||
//
|
||||
// Block: Hook into mp4 video element clicking
|
||||
// Block: Hook into mp4 video element clicking.
|
||||
//
|
||||
$(document.body).delegate("video.js-media-gif","click",function(e){
|
||||
var src = $(this).attr("src");
|
||||
@@ -267,6 +297,45 @@
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
// Block: Update highlighted column
|
||||
//
|
||||
app.delegate("section","mouseenter mouseleave",function(e){
|
||||
if (e.type === "mouseenter"){
|
||||
highlightedColumnEle = $(this);
|
||||
}
|
||||
else if (e.type === "mouseleave"){
|
||||
highlightedColumnEle = null;
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
// Block: Copy tweet address and update highlighted tweet.
|
||||
//
|
||||
(function(){
|
||||
var lastTweet = "";
|
||||
|
||||
var updateHighlightedTweet = function(link){
|
||||
if (lastTweet != link){
|
||||
$TD.setLastHighlightedTweet(link);
|
||||
lastTweet = link;
|
||||
}
|
||||
};
|
||||
|
||||
app.delegate("article.js-stream-item","mouseenter mouseleave",function(e){
|
||||
if (e.type === "mouseenter"){
|
||||
highlightedTweetEle = $(this);
|
||||
|
||||
var link = $(this).find("time").first().children("a").first();
|
||||
updateHighlightedTweet(link.length > 0 ? link.attr("href") : "");
|
||||
}
|
||||
else if (e.type === "mouseleave"){
|
||||
highlightedTweetEle = null;
|
||||
updateHighlightedTweet("");
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
//
|
||||
// Block: Paste images when tweeting.
|
||||
//
|
||||
@@ -291,7 +360,7 @@
|
||||
$TD.clickUploadImage(Math.floor(buttonPos.left),Math.floor(buttonPos.top));
|
||||
};
|
||||
|
||||
$(".js-app").delegate(".js-compose-text","paste",function(e){
|
||||
$(".js-app").delegate(".js-compose-text","paste",function(){
|
||||
lastPasteElement = $(this);
|
||||
$TD.tryPasteImage();
|
||||
});
|
||||
@@ -340,7 +409,26 @@
|
||||
})();
|
||||
|
||||
//
|
||||
// Block: Inject custom CSS and layout into the page
|
||||
// Block: Support for extra mouse buttons
|
||||
//
|
||||
window.TDGF_onMouseClickExtra = function(button){
|
||||
if (button === 1){ // back button
|
||||
if (highlightedColumnEle && highlightedColumnEle.closest(".js-column").is(".is-shifted-1")){
|
||||
highlightedColumnEle.find(".js-column-back").first().click();
|
||||
}
|
||||
else{
|
||||
$(".js-column-back").click();
|
||||
}
|
||||
}
|
||||
else if (button === 2){ // forward button
|
||||
if (highlightedTweetEle){
|
||||
highlightedTweetEle.children().first().click();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Block: Inject custom CSS and layout into the page.
|
||||
//
|
||||
(function(){
|
||||
var style = document.createElement("style");
|
||||
|
BIN
Resources/icon-tray-new.ico
Normal file
BIN
Resources/icon-tray-new.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
BIN
Resources/icon-tray.ico
Normal file
BIN
Resources/icon-tray.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
@@ -1,35 +1,98 @@
|
||||
(function($TD){
|
||||
//
|
||||
// Function: Bubbles up the parents until it hits an element with the specified tag (includes the first element), and returns true if the search was successful.
|
||||
// Variable: Collection of all <a> tags.
|
||||
//
|
||||
var bubbleParents = function(element, tag, callback){
|
||||
do{
|
||||
if (element.tagName == "A"){
|
||||
callback(element);
|
||||
return true;
|
||||
}
|
||||
}while((element = element.parentElement) != null);
|
||||
var links = document.getElementsByTagName("A");
|
||||
|
||||
return false;
|
||||
//
|
||||
// Function: Adds an event listener to all elements in the array or collection.
|
||||
//
|
||||
var addEventListener = function(collection, type, listener){
|
||||
for(let index = 0; index < collection.length; index++){
|
||||
collection[index].addEventListener(type,listener);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// Block: Hook into links to bypass default open function.
|
||||
//
|
||||
document.body.addEventListener("click",function(e){
|
||||
if (bubbleParents(e.target,"A",function(ele){
|
||||
$TD.openBrowser(ele.getAttribute("href"));
|
||||
})){
|
||||
e.preventDefault();
|
||||
}
|
||||
addEventListener(links,"click",function(e){
|
||||
$TD.openBrowser(e.currentTarget.getAttribute("href"));
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
//
|
||||
// Block: Allow bypassing of t.co in context menus.
|
||||
//
|
||||
document.body.addEventListener("contextmenu",function(e){
|
||||
bubbleParents(e.target,"A",function(ele){
|
||||
$TD.setLastRightClickedLink(element.getAttribute("data-full-url") || "");
|
||||
});
|
||||
addEventListener(links,"contextmenu",function(e){
|
||||
$TD.setLastRightClickedLink(e.currentTarget.getAttribute("data-full-url") || "");
|
||||
});
|
||||
|
||||
//
|
||||
// Block: Expand shortened links on hover or display tooltip.
|
||||
//
|
||||
(function(){
|
||||
var cutStart = function(str, search){
|
||||
return str.startsWith(search) ? str.substr(search.length) : str;
|
||||
};
|
||||
|
||||
var prevMouseX = -1, prevMouseY = -1;
|
||||
var tooltipTimer, tooltipDisplayed;
|
||||
|
||||
addEventListener(links,"mouseenter",function(e){
|
||||
var url = e.currentTarget.getAttribute("data-full-url");
|
||||
if (!url)return;
|
||||
|
||||
var text = e.currentTarget.textContent;
|
||||
|
||||
if (text.charCodeAt(text.length-1) !== 8230){ // horizontal ellipsis
|
||||
return;
|
||||
}
|
||||
|
||||
if ($TD.expandLinksOnHover){
|
||||
var expanded = url;
|
||||
expanded = cutStart(expanded,"https://");
|
||||
expanded = cutStart(expanded,"http://");
|
||||
expanded = cutStart(expanded,"www.");
|
||||
|
||||
e.currentTarget.setAttribute("td-prev-text",text);
|
||||
e.currentTarget.innerHTML = expanded;
|
||||
}
|
||||
else{
|
||||
tooltipTimer = window.setTimeout(function(){
|
||||
$TD.displayTooltip(url,true);
|
||||
tooltipDisplayed = true;
|
||||
},400);
|
||||
}
|
||||
});
|
||||
|
||||
addEventListener(links,"mouseleave",function(e){
|
||||
if (!e.currentTarget.hasAttribute("data-full-url"))return;
|
||||
|
||||
if ($TD.expandLinksOnHover){
|
||||
var prevText = e.currentTarget.getAttribute("td-prev-text");
|
||||
|
||||
if (prevText){
|
||||
e.currentTarget.innerHTML = prevText;
|
||||
}
|
||||
}
|
||||
|
||||
if (tooltipDisplayed){
|
||||
window.clearTimeout(tooltipTimer);
|
||||
tooltipDisplayed = false;
|
||||
$TD.displayTooltip(null,true);
|
||||
}
|
||||
});
|
||||
|
||||
addEventListener(links,"mousemove",function(e){
|
||||
if (tooltipDisplayed && (prevMouseX != e.clientX || prevMouseY != e.clientY)){
|
||||
var url = e.currentTarget.getAttribute("data-full-url");
|
||||
if (!url)return;
|
||||
|
||||
$TD.displayTooltip(url,true);
|
||||
prevMouseX = e.clientX;
|
||||
prevMouseY = e.clientY;
|
||||
}
|
||||
});
|
||||
})();
|
||||
})($TD);
|
@@ -4,6 +4,11 @@
|
||||
//
|
||||
var updateCheckTimeoutID;
|
||||
|
||||
//
|
||||
// Constant: Update exe file name.
|
||||
//
|
||||
const updateFileName = $TD.brandName+".Update.exe";
|
||||
|
||||
//
|
||||
// Function: Creates the update notification element. Removes the old one if already exists.
|
||||
//
|
||||
@@ -96,7 +101,7 @@
|
||||
};
|
||||
|
||||
//
|
||||
// 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(){
|
||||
clearTimeout(updateCheckTimeoutID);
|
||||
@@ -107,8 +112,9 @@
|
||||
$.getJSON("https://api.github.com/repos/chylex/"+$TD.brandName+"/releases/latest",function(response){
|
||||
var tagName = response.tag_name;
|
||||
|
||||
if (tagName != $TD.versionTag && tagName != $TD.dismissedVersionTag && response.assets.length > 0){
|
||||
createUpdateNotificationElement(tagName,response.assets[0].browser_download_url);
|
||||
if (tagName !== $TD.versionTag && tagName !== $TD.dismissedVersionTag && response.assets.length > 0){
|
||||
var obj = response.assets.find(asset => asset.name === updateFileName) || response.assets[0];
|
||||
createUpdateNotificationElement(tagName,obj.browser_download_url);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@@ -139,6 +139,7 @@
|
||||
<DependentUpon>TrayIcon.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Core\Utils\BrowserUtils.cs" />
|
||||
<Compile Include="Core\Utils\NativeMethods.cs" />
|
||||
<Compile Include="Core\Utils\UpdateInfo.cs" />
|
||||
<Compile Include="Migration\FormMigrationQuestion.cs">
|
||||
<SubType>Form</SubType>
|
||||
@@ -210,6 +211,9 @@
|
||||
<EmbeddedResource Include="Core\FormBrowser.resx">
|
||||
<DependentUpon>FormBrowser.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Core\Other\FormAbout.resx">
|
||||
<DependentUpon>FormAbout.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Core\Other\FormSettings.resx">
|
||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -236,6 +240,8 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\icon-small.ico" />
|
||||
<None Include="Resources\icon-tray-new.ico" />
|
||||
<None Include="Resources\icon-tray.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
|
Reference in New Issue
Block a user