diff options
-rw-r--r-- | win/CS/HandBrakeWPF/HandBrakeWPF.csproj | 10 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Model/ShellWindow.cs | 20 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs | 3 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/ViewModels/Interfaces/IShellViewModel.cs | 27 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs | 15 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs | 14 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs | 128 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/MainView.xaml | 15 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/MainView.xaml.cs | 4 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/OptionsView.xaml | 34 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs | 3 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/ShellView.xaml | 25 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/ShellView.xaml.cs | 27 |
13 files changed, 291 insertions, 34 deletions
diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj index 57a135d79..bb6511e7f 100644 --- a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj +++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj @@ -121,7 +121,13 @@ <Compile Include="Converters\Audio\AudioEncoderConverter.cs" />
<Compile Include="Converters\BooleanToHiddenVisibilityConverter.cs" />
<Compile Include="Converters\Video\VideoEncoderConverter.cs" />
+ <Compile Include="Model\ShellWindow.cs" />
+ <Compile Include="Views\ShellView.xaml.cs">
+ <DependentUpon>ShellView.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="ViewModels\Interfaces\IShellViewModel.cs" />
<Compile Include="ViewModels\Interfaces\ITitleSpecificViewModel.cs" />
+ <Compile Include="ViewModels\ShellViewModel.cs" />
<Compile Include="ViewModels\TitleSpecificViewModel.cs" />
<Compile Include="Views\TitleSpecificView.xaml.cs">
<DependentUpon>TitleSpecificView.xaml</DependentUpon>
@@ -270,6 +276,10 @@ <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="Views\ShellView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Views\TitleSpecificView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
diff --git a/win/CS/HandBrakeWPF/Model/ShellWindow.cs b/win/CS/HandBrakeWPF/Model/ShellWindow.cs new file mode 100644 index 000000000..05ca1995e --- /dev/null +++ b/win/CS/HandBrakeWPF/Model/ShellWindow.cs @@ -0,0 +1,20 @@ +// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="ShellWindow.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// <summary>
+// The Window that the shell view can display
+// </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.Model
+{
+ /// <summary>
+ /// The Window that the shell view can display
+ /// </summary>
+ public enum ShellWindow
+ {
+ MainWindow,
+ OptionsWindow
+ }
+}
diff --git a/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs b/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs index a348c2c95..2b694252b 100644 --- a/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs +++ b/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs @@ -31,7 +31,7 @@ namespace HandBrakeWPF.Startup /// <summary>
/// The Castle Bootstrapper
/// </summary>
- public class CastleBootstrapper : Bootstrapper<IMainViewModel>
+ public class CastleBootstrapper : Bootstrapper<IShellViewModel>
{
/// <summary>
/// The Windsor Container
@@ -55,6 +55,7 @@ namespace HandBrakeWPF.Startup this.windsorContainer.Register(Component.For<IErrorService>().ImplementedBy<ErrorService>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IErrorViewModel>().ImplementedBy<ErrorViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IMainViewModel>().ImplementedBy<MainViewModel>().LifeStyle.Is(LifestyleType.Singleton));
+ this.windsorContainer.Register(Component.For<IShellViewModel>().ImplementedBy<ShellViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IQueueViewModel>().ImplementedBy<QueueViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IAddPresetViewModel>().ImplementedBy<AddPresetViewModel>().LifeStyle.Is(LifestyleType.Transient));
this.windsorContainer.Register(Component.For<IPreviewViewModel>().ImplementedBy<PreviewViewModel>().LifeStyle.Is(LifestyleType.Singleton));
diff --git a/win/CS/HandBrakeWPF/ViewModels/Interfaces/IShellViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/Interfaces/IShellViewModel.cs new file mode 100644 index 000000000..4964e8b40 --- /dev/null +++ b/win/CS/HandBrakeWPF/ViewModels/Interfaces/IShellViewModel.cs @@ -0,0 +1,27 @@ +// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="IShellViewModel.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// <summary>
+// The Interface for the Shell View Model
+// </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.ViewModels.Interfaces
+{
+ using HandBrakeWPF.Model;
+
+ /// <summary>
+ /// The Interface for the Shell View Model
+ /// </summary>
+ public interface IShellViewModel
+ {
+ /// <summary>
+ /// Change the page displayed on this window.
+ /// </summary>
+ /// <param name="window">
+ /// The window.
+ /// </param>
+ void DisplayWindow(ShellWindow window);
+ }
+}
diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs index 061a1e148..d0a6450c8 100644 --- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs @@ -32,7 +32,9 @@ namespace HandBrakeWPF.ViewModels using HandBrake.ApplicationServices.Utilities;
using HandBrakeWPF.Helpers;
+ using HandBrakeWPF.Model;
using HandBrakeWPF.ViewModels.Interfaces;
+ using HandBrakeWPF.Views;
using Ookii.Dialogs.Wpf;
@@ -74,6 +76,11 @@ namespace HandBrakeWPF.ViewModels private readonly IErrorService errorService;
/// <summary>
+ /// The Shell View Model
+ /// </summary>
+ private readonly IShellViewModel shellViewModel;
+
+ /// <summary>
/// Backing field for the user setting service.
/// </summary>
private readonly IUserSettingService userSettingService;
@@ -157,14 +164,18 @@ namespace HandBrakeWPF.ViewModels /// <param name="errorService">
/// The Error Service
/// </param>
+ /// <param name="shellViewModel">
+ /// The shell View Model.
+ /// </param>
[ImportingConstructor]
public MainViewModel(IWindowManager windowManager, IUserSettingService userSettingService, IScan scanService, IEncode encodeService, IPresetService presetService,
- IErrorService errorService)
+ IErrorService errorService, IShellViewModel shellViewModel)
{
this.scanService = scanService;
this.encodeService = encodeService;
this.presetService = presetService;
this.errorService = errorService;
+ this.shellViewModel = shellViewModel;
this.userSettingService = userSettingService;
this.queueProcessor = IoC.Get<IQueueProcessor>(); // TODO Instance ID!
@@ -836,7 +847,7 @@ namespace HandBrakeWPF.ViewModels /// </summary>
public void OpenOptionsWindow()
{
- this.WindowManager.ShowWindow(IoC.Get<IOptionsViewModel>());
+ this.shellViewModel.DisplayWindow(ShellWindow.OptionsWindow);
}
/// <summary>
diff --git a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs index 52ef447e0..706009107 100644 --- a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs @@ -26,6 +26,7 @@ namespace HandBrakeWPF.ViewModels using HandBrake.ApplicationServices.Services.Interfaces;
using HandBrake.ApplicationServices.Utilities;
+ using HandBrakeWPF.Model;
using HandBrakeWPF.ViewModels.Interfaces;
using Ookii.Dialogs.Wpf;
@@ -44,6 +45,11 @@ namespace HandBrakeWPF.ViewModels private readonly IUserSettingService userSettingService;
/// <summary>
+ /// The Shell View Model
+ /// </summary>
+ private readonly IShellViewModel shellViewModel;
+
+ /// <summary>
/// The add audio mode options.
/// </summary>
private BindingList<string> addAudioModeOptions = new BindingList<string>();
@@ -317,10 +323,14 @@ namespace HandBrakeWPF.ViewModels /// <param name="userSettingService">
/// The user Setting Service.
/// </param>
- public OptionsViewModel(IWindowManager windowManager, IUserSettingService userSettingService)
+ /// <param name="shellViewModel">
+ /// The shell View Model.
+ /// </param>
+ public OptionsViewModel(IWindowManager windowManager, IUserSettingService userSettingService, IShellViewModel shellViewModel)
{
this.Title = "Options";
this.userSettingService = userSettingService;
+ this.shellViewModel = shellViewModel;
this.OnLoad();
}
@@ -1466,7 +1476,7 @@ namespace HandBrakeWPF.ViewModels public void Close()
{
this.Save();
- this.TryClose();
+ this.shellViewModel.DisplayWindow(ShellWindow.MainWindow);
}
/// <summary>
diff --git a/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs new file mode 100644 index 000000000..349dc1200 --- /dev/null +++ b/win/CS/HandBrakeWPF/ViewModels/ShellViewModel.cs @@ -0,0 +1,128 @@ +// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="ShellViewModel.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// <summary>
+// The Shell View Model
+// </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.ViewModels
+{
+ using System.ComponentModel.Composition;
+
+ using HandBrakeWPF.Model;
+ using HandBrakeWPF.ViewModels.Interfaces;
+
+ /// <summary>
+ /// The Shell View Model
+ /// </summary>
+ [Export(typeof(IShellViewModel))]
+ public class ShellViewModel : ViewModelBase, IShellViewModel
+ {
+ #region Constants and Fields
+
+ /// <summary>
+ /// The show main window.
+ /// </summary>
+ private bool showMainWindow;
+
+ /// <summary>
+ /// The show options.
+ /// </summary>
+ private bool showOptions;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ShellViewModel"/> class.
+ /// </summary>
+ public ShellViewModel()
+ {
+ this.showMainWindow = true;
+ this.showOptions = false;
+ }
+
+ /// <summary>
+ /// Change the page displayed on this window.
+ /// </summary>
+ /// <param name="window">
+ /// The window.
+ /// </param>
+ public void DisplayWindow(ShellWindow window)
+ {
+ if (window == ShellWindow.MainWindow)
+ {
+ this.ShowMainWindow = true;
+ this.ShowOptions = false;
+ }
+ else if (window == ShellWindow.OptionsWindow)
+ {
+ this.ShowOptions = true;
+ this.ShowMainWindow = false;
+ }
+ else
+ {
+ this.ShowMainWindow = true;
+ this.ShowOptions = false;
+ }
+ }
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or sets MainViewModel.
+ /// </summary>
+ public IMainViewModel MainViewModel { get; set; }
+
+ /// <summary>
+ /// Gets or sets OptionsViewModel.
+ /// </summary>
+ public IOptionsViewModel OptionsViewModel { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether ShowMainWindow.
+ /// </summary>
+ public bool ShowMainWindow
+ {
+ get
+ {
+ return this.showMainWindow;
+ }
+ set
+ {
+ this.showMainWindow = value;
+ this.NotifyOfPropertyChange(() => this.ShowMainWindow);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether ShowOptions.
+ /// </summary>
+ public bool ShowOptions
+ {
+ get
+ {
+ return this.showOptions;
+ }
+ set
+ {
+ this.showOptions = value;
+ this.NotifyOfPropertyChange(() => this.ShowOptions);
+ }
+ }
+
+ /// <summary>
+ /// Gets WindowTitle.
+ /// </summary>
+ public string WindowTitle
+ {
+ get
+ {
+ return "HandBrake";
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Views/MainView.xaml b/win/CS/HandBrakeWPF/Views/MainView.xaml index 938e31719..29565cf1c 100644 --- a/win/CS/HandBrakeWPF/Views/MainView.xaml +++ b/win/CS/HandBrakeWPF/Views/MainView.xaml @@ -1,23 +1,16 @@ -<Window x:Class="HandBrakeWPF.Views.MainView"
+<UserControl x:Class="HandBrakeWPF.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:HandBrakeWPF.Controls"
xmlns:Converters="clr-namespace:HandBrakeWPF.Converters"
- xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:Micro="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
- Title="{Data:Binding Path=WindowTitle}"
- Width="1015"
- Height="652"
- MinWidth="1015"
- MinHeight="652"
AllowDrop="True"
Background="#FFF0F0F0"
FontSize="11"
Micro:Message.Attach="[Event Loaded] = [Action Load]"
SnapsToDevicePixels="True"
UseLayoutRounding="True"
- WindowStartupLocation="CenterScreen"
>
<i:Interaction.Triggers>
@@ -34,7 +27,7 @@ </i:EventTrigger>
</i:Interaction.Triggers>
- <Window.Resources>
+ <UserControl.Resources>
<Style TargetType="Button">
<Setter Property="Foreground" Value="DarkOrange" />
@@ -81,7 +74,7 @@ </Style>
<Converters:BooleanToVisibilityConverter x:Key="boolToVisConverter" />
- </Window.Resources>
+ </UserControl.Resources>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
@@ -628,4 +621,4 @@ </StatusBar>
</Grid>
-</Window>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/MainView.xaml.cs b/win/CS/HandBrakeWPF/Views/MainView.xaml.cs index 165e74923..2845ff0f2 100644 --- a/win/CS/HandBrakeWPF/Views/MainView.xaml.cs +++ b/win/CS/HandBrakeWPF/Views/MainView.xaml.cs @@ -9,12 +9,12 @@ namespace HandBrakeWPF.Views
{
- using System.Windows;
+ using System.Windows.Controls;
/// <summary>
/// Interaction logic for MainView.xaml
/// </summary>
- public partial class MainView : Window
+ public partial class MainView : UserControl
{
/// <summary>
/// Initializes a new instance of the <see cref="MainView"/> class.
diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml b/win/CS/HandBrakeWPF/Views/OptionsView.xaml index e79fd91a7..80a97754f 100644 --- a/win/CS/HandBrakeWPF/Views/OptionsView.xaml +++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml @@ -1,9 +1,9 @@ -<Window x:Class="HandBrakeWPF.Views.OptionsView"
+<UserControl x:Class="HandBrakeWPF.Views.OptionsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cal="http://www.caliburnproject.org"
- xmlns:Helpers="clr-namespace:HandBrakeWPF.Helpers" Title="{Binding Title}" MinWidth="620" SizeToContent="Height" Width="620">
+ xmlns:Helpers="clr-namespace:HandBrakeWPF.Helpers" >
- <Window.Resources>
+ <UserControl.Resources>
<Style TargetType="Button">
<Setter Property="Foreground" Value="DarkOrange" />
<Setter Property="FontWeight" Value="Bold" />
@@ -21,12 +21,17 @@ <Style TargetType="CheckBox">
<Setter Property="Margin" Value="0,0,0,5" />
</Style>
- </Window.Resources>
-
-
- <StackPanel Orientation="Vertical" Background="#FFF1F0EF">
+ </UserControl.Resources>
+
+ <Grid Background="#FFF1F0EF">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="*" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+
<!-- Header -->
- <StackPanel Orientation="Horizontal" Background="White" Height="50" >
+ <StackPanel Orientation="Horizontal" Background="White" Height="50" Grid.Row="0" >
<Image Source="Images/Preferences.png" Margin="10,0,5,0" Width="32" Height="32" VerticalAlignment="Center" />
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<TextBlock Text="Options" FontWeight="Bold" />
@@ -35,7 +40,7 @@ </StackPanel>
<!-- Options Panel-->
- <TabControl Margin="10,10,10,10" Height="405">
+ <TabControl Margin="10,10,10,10" MinHeight="410" Grid.Row="1">
<TabItem Header="General">
<StackPanel Orientation="Vertical">
<Grid Margin="10,10,0,10">
@@ -367,12 +372,11 @@ </TabItem>
</TabControl>
- <StackPanel HorizontalAlignment="Stretch" Background="LightGray" >
- <Button Content="Close" IsDefault="True" cal:Message.Attach="[Event Click] = [Action Close]"
- HorizontalAlignment="Right" Padding="10,2" Margin="0,5,10,5" />
+ <StackPanel HorizontalAlignment="Stretch" Background="LightGray" Grid.Row="2" >
+ <Button Content="Save Changes" IsDefault="True" cal:Message.Attach="[Event Click] = [Action Close]"
+ HorizontalAlignment="Center" Padding="12,2" Margin="0,5,10,5" />
</StackPanel>
-
- </StackPanel>
-</Window>
+ </Grid>
+</UserControl>
diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs b/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs index e17c98514..b8fd4b33d 100644 --- a/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs +++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml.cs @@ -10,11 +10,12 @@ namespace HandBrakeWPF.Views
{
using System.Windows;
+ using System.Windows.Controls;
/// <summary>
/// Interaction logic for OptionsView.xaml
/// </summary>
- public partial class OptionsView : Window
+ public partial class OptionsView : UserControl
{
/// <summary>
/// Initializes a new instance of the <see cref="OptionsView"/> class.
diff --git a/win/CS/HandBrakeWPF/Views/ShellView.xaml b/win/CS/HandBrakeWPF/Views/ShellView.xaml new file mode 100644 index 000000000..9aba2a3fe --- /dev/null +++ b/win/CS/HandBrakeWPF/Views/ShellView.xaml @@ -0,0 +1,25 @@ +<Window x:Class="HandBrakeWPF.Views.ShellView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
+ xmlns:Converters="clr-namespace:HandBrakeWPF.Converters" Title="{Data:Binding Path=WindowTitle}"
+ Width="1015"
+ Height="652"
+ MinWidth="1015"
+ MinHeight="652"
+ AllowDrop="True"
+ Background="#FFF0F0F0"
+ FontSize="11"
+ SnapsToDevicePixels="True"
+ UseLayoutRounding="True"
+ WindowStartupLocation="CenterScreen"
+ >
+ <Window.Resources>
+ <Converters:BooleanToVisibilityConverter x:Key="boolToVisConverter" />
+ </Window.Resources>
+
+ <Grid>
+ <ContentControl x:Name="MainViewModel" Visibility="{Binding ShowMainWindow, Converter={StaticResource boolToVisConverter}, ConverterParameter=false}" />
+ <ContentControl x:Name="OptionsViewModel" Visibility="{Binding ShowOptions, Converter={StaticResource boolToVisConverter}, ConverterParameter=false}" />
+ </Grid>
+</Window>
diff --git a/win/CS/HandBrakeWPF/Views/ShellView.xaml.cs b/win/CS/HandBrakeWPF/Views/ShellView.xaml.cs new file mode 100644 index 000000000..cc6b381de --- /dev/null +++ b/win/CS/HandBrakeWPF/Views/ShellView.xaml.cs @@ -0,0 +1,27 @@ +// --------------------------------------------------------------------------------------------------------------------
+// <copyright file="ShellView.xaml.cs" company="HandBrake Project (http://handbrake.fr)">
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
+// </copyright>
+// <summary>
+// Interaction logic for ShellView.xaml
+// </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace HandBrakeWPF.Views
+{
+ using System.Windows;
+
+ /// <summary>
+ /// Interaction logic for ShellView.xaml
+ /// </summary>
+ public partial class ShellView : Window
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ShellView"/> class.
+ /// </summary>
+ public ShellView()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
|