blob: f6c39a6cd00315556b9b8a31bb164476be08f25a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
<UserControl x:Class="Tango.MachineStudio.MachineDesigner.Views.MachineVersionDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:providers="clr-namespace:Tango.MachineStudio.MachineDesigner.AutoComplete"
xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
xmlns:local="clr-namespace:Tango.MachineStudio.MachineDesigner.Views"
mc:Ignorable="d" Width="530" Height="239" Background="White">
<UserControl.Resources>
<providers:MachineVersionsProvider x:Key="VersionsProvider"></providers:MachineVersionsProvider>
</UserControl.Resources>
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Grid>
<StackPanel Orientation="Horizontal" Margin="10">
<materialDesign:PackIcon Width="24" Height="24" Kind="Verified" VerticalAlignment="Center"></materialDesign:PackIcon>
<TextBlock Text="Default Version Configuration" VerticalAlignment="Center" Margin="10 0 0 0" FontSize="16"></TextBlock>
</StackPanel>
</Grid>
<Grid Grid.Row="1" Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<StackPanel Margin="10">
<TextBlock>Version</TextBlock>
<ComboBox ItemsSource="{Binding Adapter.MachineVersions}" Text="{Binding Version}" DisplayMemberPath="Version" SelectedItem="{Binding SelectedVersion}" IsEditable="True" materialDesign:HintAssist.Hint="Select or enter a new version name"></ComboBox>
<TextBlock Margin="0 10 0 0">Name</TextBlock>
<TextBox materialDesign:HintAssist.Hint="Version name" Text="{Binding VersionName}">
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="IsEnabled" Value="False"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedVersion}" Value="{x:Null}">
<Setter Property="IsEnabled" Value="True"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</StackPanel>
</Grid>
<Grid Grid.Row="1">
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
<Button Command="{Binding AcceptCommand}" Style="{StaticResource MaterialDesignFlatButton}" IsDefault="True" Margin="0 8 8 0">
ACCEPT
</Button>
<Button Command="{Binding CancelCommand}" Style="{StaticResource MaterialDesignFlatButton}" IsCancel="False" Margin="0 8 8 0">
CANCEL
</Button>
</StackPanel>
</Grid>
</Grid>
</Grid>
</Grid>
</UserControl>
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Core.DI;
using Tango.Logging;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Synchronization.Navigation;
using Tango.MachineStudio.Synchronization.Properties;
using Tango.Settings;
using Tango.SharedUI;
using Tango.Synchronization;
using Tango.Synchronization.Local;
namespace Tango.MachineStudio.Synchronization.ViewModels
{
/// <summary>
/// Represents the 'Local Synchronization' view model.
/// </summary>
/// <seealso cref="Tango.SharedUI.ViewModel" />
public class LocalSynchronizationViewVM : ViewModel
{
private SyncNavigationManager _navigation;
private String _masterDBFile;
private String _slaveDBFile;
private LocalDBComparer _comparer;
private INotificationProvider _notification;
private bool _isWorking;
private MainViewVM _mainView;
private SynchronizationModuleSettings _settings;
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="LocalSynchronizationViewVM"/> class.
/// </summary>
/// <param name="navigation">The navigation.</param>
/// <param name="notification">The notification.</param>
public LocalSynchronizationViewVM(SyncNavigationManager navigation, INotificationProvider notification)
{
_settings = SettingsManager.Default.GetOrCreate<SynchronizationModuleSettings>();
_navigation = navigation;
_notification = notification;
BackCommand = new RelayCommand(() => _navigation.NavigateTo(NavigationView.MenuView));
Differences = new ObservableCollection<Diff>();
BrowseMasterDBCommand = new RelayCommand(BrowseMasterDB, (x) => !_isWorking);
BrowseSlaveDBCommand = new RelayCommand(BrowseSlaveDB, (x) => !_isWorking);
CompareCommand = new RelayCommand(Compare, (x) => MasterDBFile != null && SlaveDBFile != null && !_isWorking);
CommitCommand = new RelayCommand(Commit, (x) => SelectedDifference != null && !_isWorking);
CommitAllCommand = new RelayCommand(CommitAll, (x) => Differences.Count > 0 && !_isWorking);
CleanCommand = new RelayCommand(CleanSlave, (x) => !_isWorking && SlaveDBFile != null);
if (File.Exists(_settings.LocalMasterDBFile))
{
MasterDBFile = _settings.LocalMasterDBFile;
MasterDBName = Path.GetFileName(MasterDBFile);
}
if (File.Exists(_settings.LocalSlaveDBFile))
{
SlaveDBFile = _settings.LocalSlaveDBFile;
SlaveDBName = Path.GetFileName(SlaveDBFile);
}
}
#endregion
#region Commands
/// <summary>
/// Gets or sets the back command.
/// </summary>
public RelayCommand BackCommand { get; set; }
/// <summary>
/// Gets or sets the browse master database command.
/// </summary>
public RelayCommand BrowseMasterDBCommand { get; set; }
/// <summary>
/// Gets or sets the browse slave database command.
/// </summary>
public RelayCommand BrowseSlaveDBCommand { get; set; }
/// <summary>
/// Gets or sets the compare command.
/// </summary>
public RelayCommand CompareCommand { get; set; }
/// <summary>
/// Gets or sets the commit command.
/// </summary>
public RelayCommand CommitCommand { get; set; }
/// <summary>
/// Gets or sets the commit all command.
/// </summary>
public RelayCommand CommitAllCommand { get; set; }
/// <summary>
/// Gets or sets the clean command.
/// </summary>
public RelayCommand CleanCommand { get; set; }
#endregion
#region Properties
private ObservableCollection<Diff> _differences;
/// <summary>
/// Gets or sets the differences.
/// </summary>
public ObservableCollection<Diff> Differences
{
get { return _differences; }
set { _differences = value; RaisePropertyChanged(nameof(Differences)); }
}
private Diff _selectedDifference;
/// <summary>
/// Gets or sets the selected difference.
/// </summary>
public Diff SelectedDifference
{
get { return _selectedDifference; }
set { _selectedDifference = value; RaisePropertyChanged(nameof(SelectedDifference)); InvalidateRelayCommands(); }
}
private String _masterDBName;
/// <summary>
/// Gets or sets the name of the master database.
/// </summary>
public String MasterDBName
{
get { return _masterDBName; }
set { _masterDBName = value; RaisePropertyChanged(nameof(MasterDBName)); }
}
private String _slaveDBName;
/// <summary>
/// Gets or sets the name of the slave database.
/// </summary>
public String SlaveDBName
{
get { return _slaveDBName; }
set { _slaveDBName = value; RaisePropertyChanged(nameof(SlaveDBName)); }
}
/// <summary>
/// Gets or sets the slave database file.
/// </summary>
public String SlaveDBFile
{
get { return _slaveDBFile; }
set { _slaveDBFile = value; RaisePropertyChangedAuto(); }
}
/// <summary>
/// Gets or sets the master database file.
/// </summary>
public String MasterDBFile
{
get { return _masterDBFile; }
set { _masterDBFile = value; RaisePropertyChangedAuto(); }
}
#endregion
#region Event Handlers
private void Comparer_Progress(object sender, string e)
{
if (_mainView == null)
{
_mainView = TangoIOC.Default.GetInstance<MainViewVM>();
_mainView.Log = String.Empty;
}
_mainView.Log += ("[" + DateTime.Now.ToTimeString() + "] " + e + Environment.NewLine);
}
#endregion
#region Private Methods
/// <summary>
/// Cleans the slave database.
/// </summary>
private async void CleanSlave()
{
if (_notification.ShowQuestion("Are you sure you want to erase all data on slave database?"))
{
using (_notification.PushTaskItem("Clearing database..."))
{
try
{
_isWorking = true;
await Task.Factory.StartNew(() =>
{
SQLiteDataBase localDB = new SQLiteDataBase(SlaveDBFile);
localDB.LoadTables();
localDB.ClearDataBase();
try
{
localDB.Dispose();
}
catch { }
});
Differences.Clear();
}
catch (Exception ex)
{
ShowError(LogManager.Log(ex).Message);
}
finally
{
_isWorking = false;
InvalidateRelayCommands();
SelectedDifference = null;
}
}
}
}
/// <summary>
/// Compares the master and slave database files.
/// </summary>
private void Compare()
{
_comparer = new LocalDBComparer(new SQLiteDataBase(MasterDBFile), new SQLiteDataBase(SlaveDBFile));
_comparer.Progress += Comparer_Progress;
Task.Factory.StartNew(() =>
{
using (_notification.PushTaskItem("Comparing Databases..."))
{
try
{
_isWorking = true;
InvalidateRelayCommands();
Thread.Sleep(1500);
var diffs = _comparer.Compare();
Differences = new ObservableCollection<Diff>(diffs);
if (diffs.Where(x => x.Action != DiffAction.ReplaceTableDataInSlave).Count() > 0)
{
ShowInfo("Found " + Differences.Where(x => x.Action != DiffAction.ReplaceTableDataInSlave).Count() + " differences.");
}
else
{
ShowInfo("The master and slave databases are synchronized.");
}
}
catch (Exception ex)
{
ShowError(ex.Message);
}
finally
{
_isWorking = false;
SelectedDifference = null;
InvalidateRelayCommands();
_settings.LocalMasterDBFile = MasterDBFile;
_settings.LocalSlaveDBFile = SlaveDBFile;
_settings.Save();
}
}
});
}
/// <summary>
/// Commits the selected difference.
/// </summary>
private void Commit()
{
Task.Factory.StartNew(() =>
{
using (_notification.PushTaskItem("Committing difference..."))
{
try
{
_isWorking = true;
InvalidateRelayCommands();
Thread.Sleep(1500);
SelectedDifference.Commit();
InvokeUINow(() => Differences.Remove(SelectedDifference));
}
catch (Exception ex)
{
ShowError(ex.Message);
}
finally
{
_isWorking = false;
SelectedDifference = null;
InvalidateRelayCommands();
}
}
});
}
/// <summary>
/// Commits all the differences.
/// </summary>
private void CommitAll()
{
Task.Factory.StartNew(() =>
{
using (_notification.PushTaskItem("Committing all differences..."))
{
try
{
_isWorking = true;
InvalidateRelayCommands();
Thread.Sleep(1500);
for (int i = 0; i < Differences.Count; i++)
{
var diff = Differences[i];
using (_notification.PushTaskItem("Committing difference " + (Differences.IndexOf(diff) + 1) + "..."))
{
diff.Commit();
InvokeUINow(() => Differences.Remove(diff));
i--;
}
}
}
catch (Exception ex)
{
ShowError(ex.Message);
}
finally
{
_isWorking = false;
SelectedDifference = null;
InvalidateRelayCommands();
}
}
});
}
/// <summary>
/// Browse for slave database file.
/// </summary>
private void BrowseSlaveDB()
{
String file = BrowseForFilePath();
if (file != null)
{
SlaveDBFile = file;
SlaveDBName = Path.GetFileName(file);
InvalidateRelayCommands();
}
}
/// <summary>
/// Browse for master database file.
/// </summary>
private void BrowseMasterDB()
{
String file = BrowseForFilePath();
if (file != null)
{
MasterDBFile = file;
MasterDBName = Path.GetFileName(file);
InvalidateRelayCommands();
}
}
/// <summary>
/// Browse for database file.
/// </summary>
private String BrowseForFilePath()
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Select SQLite Database File";
dlg.Filter = "SQLite Database|*.db";
if (dlg.ShowDialog().Value)
{
return dlg.FileName;
}
return null;
}
/// <summary>
/// Displays an error message.
/// </summary>
/// <param name="message">The message.</param>
private void ShowError(String message)
{
InvokeUINow(() => _notification.ShowError(message));
}
/// <summary>
/// Displays an information message.
/// </summary>
/// <param name="message">The message.</param>
private void ShowInfo(String message)
{
InvokeUINow(() => _notification.ShowInfo(message));
}
#endregion
}
}
|