aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-07-08 09:45:46 +0300
committerShlomo Hecht <shlomo@twine-s.com>2018-07-08 09:45:46 +0300
commita2cf6c8d62083a63ee193a1cd206ab345368b242 (patch)
tree4f653018e4fb5b4ad806e9d410800489afe411e5 /Software/Visual_Studio/PPC/Tango.PPC.Common
parentc8807df7010acb129997cb7ca130e6b7928ce809 (diff)
parentf4688d6113dc33deac114bd6999967fec246b8c0 (diff)
downloadTango-a2cf6c8d62083a63ee193a1cd206ab345368b242.tar.gz
Tango-a2cf6c8d62083a63ee193a1cd206ab345368b242.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs205
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml4
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs28
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/IListExtensions.cs26
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/ObservableCollectionExtensions.cs53
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Notifications/INotificationProvider.cs21
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj5
7 files changed, 335 insertions, 7 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs
new file mode 100644
index 000000000..b20e93ff9
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/AsyncAdornerControl.cs
@@ -0,0 +1,205 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Interop;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Tango.Core.Components;
+
+namespace Tango.PPC.Common.Controls
+{
+ public partial class AsyncAdornerControl : ContentControl
+ {
+ private bool _loaded;
+
+ public enum GWL
+ {
+ ExStyle = -20
+ }
+
+ public enum WS_EX
+ {
+ Transparent = 0x20,
+ Layered = 0x80000
+ }
+
+ public enum LWA
+ {
+ ColorKey = 0x1,
+ Alpha = 0x2
+ }
+
+ [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
+ public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);
+
+ [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
+ public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);
+
+ [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
+ public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);
+
+ private Window _window;
+
+ public AsyncAdornerControl()
+ {
+ Loaded += AsyncAdornerControl_Loaded;
+ LayoutUpdated += AsyncAdornerControl_LayoutUpdated;
+ IsVisibleChanged += AsyncAdornerControl_IsVisibleChanged;
+ }
+
+ private void AsyncAdornerControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ if (Visibility == Visibility.Visible)
+ {
+ ShowWindow();
+ }
+ else
+ {
+ HideWindow();
+ }
+ }
+
+ private void AsyncAdornerControl_LayoutUpdated(object sender, EventArgs e)
+ {
+ SyncBounds();
+ }
+
+ public Type ViewType
+ {
+ get { return (Type)GetValue(ViewTypeProperty); }
+ set { SetValue(ViewTypeProperty, value); }
+ }
+ public static readonly DependencyProperty ViewTypeProperty =
+ DependencyProperty.Register("ViewType", typeof(Type), typeof(AsyncAdornerControl), new PropertyMetadata(null));
+
+ protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
+ {
+ base.OnRenderSizeChanged(sizeInfo);
+ SyncBounds();
+ }
+
+ private void AsyncAdornerControl_Loaded(object sender, RoutedEventArgs e)
+ {
+ if (!this.IsInDesignMode())
+ {
+ if (_loaded) return;
+
+ _loaded = true;
+
+ var handle = new WindowInteropHelper(System.Windows.Application.Current.MainWindow).Handle;
+
+ System.Windows.Application.Current.MainWindow.LocationChanged += MainWindow_LocationChanged;
+
+ Visibility v = Visibility;
+ Type type = ViewType;
+
+ var xaml = FrameworkElementSerializer.Serialize(Content as FrameworkElement);
+ object dc = this.DataContext;
+ Content = null;
+
+ Thread thread = new Thread(() =>
+ {
+ _window = new Window();
+ _window.WindowStyle = WindowStyle.None;
+ _window.ResizeMode = ResizeMode.NoResize;
+ _window.ShowInTaskbar = false;
+ _window.AllowsTransparency = true;
+ _window.Background = Brushes.Transparent;
+ _window.WindowStartupLocation = WindowStartupLocation.Manual;
+ SyncBounds();
+
+ if (v != Visibility.Visible)
+ {
+ _window.Opacity = 0;
+ }
+
+ new WindowInteropHelper(_window).Owner = handle;
+
+ _window.ShowActivated = false;
+
+ //FrameworkElement element = Activator.CreateInstance(type) as FrameworkElement;
+
+ var cloned = FrameworkElementSerializer.Deserialize(xaml);
+ cloned.DataContext = dc;
+
+ _window.Content = cloned;
+
+ _window.Show();
+
+ int wl = GetWindowLong(handle, GWL.ExStyle);
+ wl = wl | 0x80000 | 0x20;
+ SetWindowLong(handle, GWL.ExStyle, wl);
+ SetLayeredWindowAttributes(handle, 0, 128, LWA.Alpha);
+
+ SyncBounds();
+
+ System.Windows.Threading.Dispatcher.Run();
+ });
+
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.IsBackground = true;
+ thread.Start();
+ }
+ }
+
+ private void MainWindow_LocationChanged(object sender, EventArgs e)
+ {
+ SyncBounds();
+ }
+
+ private void SyncBounds()
+ {
+ if (_window != null)
+ {
+ this.BeginInvoke(() =>
+ {
+ Point location = PointToScreen(new Point(0, 0));
+ Size size = new Size(ActualWidth, ActualHeight);
+
+ _window.BeginInvoke(() =>
+ {
+ _window.Top = location.Y;
+ _window.Left = location.X;
+ _window.Width = size.Width;
+ _window.Height = size.Height;
+ });
+ });
+ }
+ }
+
+ private void HideWindow()
+ {
+ if (_window != null)
+ {
+ _window.BeginInvoke(() =>
+ {
+ _window.Hide();
+ });
+ }
+ }
+
+ private void ShowWindow()
+ {
+ if (_window != null)
+ {
+ _window.BeginInvoke(() =>
+ {
+ _window.Opacity = 1;
+ _window.Show();
+ });
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml
index 66db7bc10..baf971430 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml
@@ -16,11 +16,11 @@
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
- <touch:TouchListBox ItemsSource="{Binding Groups}" x:Name="list" DisableRipple="True" ScrollBarVisibility="Collapsed" SelectionMode="None">
+ <touch:TouchListBox ItemsSource="{Binding Groups}" x:Name="list" x:FieldModifier="public" DisableRipple="True" ScrollBarVisibility="Collapsed" SelectionMode="None">
<touch:TouchListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0 0 10 0">
- <TextBlock HorizontalAlignment="Center" Text="{Binding Name}"></TextBlock>
+ <TextBlock HorizontalAlignment="Center" Text="{Binding Name}" FontSize="{StaticResource TangoTitleFontSize}"></TextBlock>
<touch:TouchStaticListBox ItemsSource="{Binding Items}" SelectedItem="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=SelectedItem,Mode=TwoWay}" Margin="0 20 0 40">
<touch:TouchStaticListBox.ItemsPanel>
<ItemsPanelTemplate>
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs
index 024f47f58..f2a90a454 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/TwineCatalogControl.xaml.cs
@@ -13,6 +13,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.BL.Catalogs;
+using Tango.Touch.Controls;
namespace Tango.PPC.Common.Controls
{
@@ -39,14 +40,25 @@ namespace Tango.PPC.Common.Controls
InitializeComponent();
Loaded += TwineCatalogControl_Loaded;
- DataContextChanged += (x, y) => { _catalog = DataContext as Catalog; };
+ DataContextChanged += (x, y) =>
+ {
+ _catalog = DataContext as Catalog;
+
+ if (list.ScrollViewer != null && _catalog != null)
+ {
+ list.ScrollViewer.ScrollToTop();
+ _preventChange = true;
+ slider.Value = _catalog.Groups.Count;
+ _preventChange = false;
+ }
+ };
}
private void ScrollViewer_Scrolling(object sender, Touch.Controls.DoubleValueChangedEventArgs e)
{
if (!_preventChange)
{
- if (e.Value > _lastScrollPosition + 10 || e.Value < _lastScrollPosition - 10)
+ if (e.Value > _lastScrollPosition + 60 || e.Value < _lastScrollPosition - 60)
{
var group = list.ScrollViewer.GetMostVisibleElementDataContext<CatalogGroup>();
@@ -56,9 +68,9 @@ namespace Tango.PPC.Common.Controls
slider.Value = slider.Maximum - _catalog.Groups.IndexOf(group);
_preventChange = false;
}
- }
- _lastScrollPosition = e.Value;
+ _lastScrollPosition = e.Value;
+ }
}
}
@@ -89,7 +101,7 @@ namespace Tango.PPC.Common.Controls
}
}
- if (_catalog != null)
+ if (_catalog != null && _catalog.Groups.Count > _catalog.Groups.Count - 1 - (int)e.NewValue && _catalog.Groups.Count - 1 - (int)e.NewValue > -1)
{
slider.Foreground = new SolidColorBrush(_catalog.Groups.ElementAt(_catalog.Groups.Count - 1 - (int)e.NewValue).Color);
}
@@ -106,5 +118,11 @@ namespace Tango.PPC.Common.Controls
_preventChange = false;
}
}
+
+ public TouchListBox TouchListBox
+ {
+ get { return list; }
+ }
+
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/IListExtensions.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/IListExtensions.cs
new file mode 100644
index 000000000..fdf07ccff
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/IListExtensions.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Threading;
+
+public static class IListExtensions
+{
+ public static IList<T> ToListAsyncIdle<T>(this IList<T> source)
+ {
+ var copy = source.ToList();
+ IList<T> result = new List<T>();
+
+ foreach (var item in copy)
+ {
+ Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ result.Add(item);
+ }), DispatcherPriority.ContextIdle);
+ }
+
+ return result;
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/ObservableCollectionExtensions.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/ObservableCollectionExtensions.cs
new file mode 100644
index 000000000..c539273d9
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/ExtensionMethods/ObservableCollectionExtensions.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Threading;
+
+public static class ObservableCollectionExtensions
+{
+ public static ObservableCollection<T> ToObservableCollectionAsyncIdle<T>(this ObservableCollection<T> source)
+ {
+ var copy = source.ToList();
+ ObservableCollection<T> result = new ObservableCollection<T>();
+
+ foreach (var item in copy)
+ {
+ Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ result.Add(item);
+ }), DispatcherPriority.ContextIdle);
+ }
+
+ return result;
+ }
+
+ public static void ReloadAsyncIdle<T>(this ObservableCollection<T> source, Action<int, int> onProgress, Action onComplete = null)
+ {
+ var copy = source.ToList();
+ source.Clear();
+
+ int count = copy.Count;
+ int completed = 0;
+
+ foreach (var item in copy)
+ {
+ Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ source.Add(item);
+ completed++;
+
+ onProgress?.Invoke(completed, count);
+
+ if (completed == count)
+ {
+ onComplete?.Invoke();
+ }
+ }), DispatcherPriority.ContextIdle);
+ }
+ }
+}
+
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Notifications/INotificationProvider.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Notifications/INotificationProvider.cs
index 96de08447..f7fb67a19 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Notifications/INotificationProvider.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Notifications/INotificationProvider.cs
@@ -128,5 +128,26 @@ namespace Tango.PPC.Common.Notifications
/// Gets the pop notification command.
/// </summary>
RelayCommand<NotificationItem> PopNotificationCommand { get; }
+
+ /// <summary>
+ /// Gets a value indicating whether this instance is in global busy state.
+ /// </summary>
+ bool IsInGlobalBusyState { get; }
+
+ /// <summary>
+ /// Sets the global busy message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ void SetGlobalBusyMessage(String message);
+
+ /// <summary>
+ /// Releases the global busy message.
+ /// </summary>
+ void ReleaseGlobalBusyMessage();
+
+ /// <summary>
+ /// Gets the current global busy message.
+ /// </summary>
+ String GlobalBusyMessage { get; }
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
index 98210a76f..192658560 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
@@ -75,6 +75,8 @@
<HintPath>..\..\packages\System.Data.SQLite.Linq.1.0.108.0\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
<Private>True</Private>
</Reference>
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@@ -92,9 +94,12 @@
<Compile Include="..\..\Versioning\PPC.cs">
<Link>PPC.cs</Link>
</Compile>
+ <Compile Include="Controls\AsyncAdornerControl.cs" />
<Compile Include="Controls\TwineCatalogControl.xaml.cs">
<DependentUpon>TwineCatalogControl.xaml</DependentUpon>
</Compile>
+ <Compile Include="ExtensionMethods\IListExtensions.cs" />
+ <Compile Include="ExtensionMethods\ObservableCollectionExtensions.cs" />
<Compile Include="IPPCView.cs" />
<Compile Include="Modules\IPPCModuleLoader.cs" />
<Compile Include="Navigation\INavigationBlocker.cs" />