in sources/Google.Solutions.IapDesktop/Windows/MainForm.cs [91:362]
public MainForm(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
this.windowTheme = this.serviceProvider.GetService<IMainWindowTheme>();
this.dialogTheme = this.serviceProvider.GetService<IDialogTheme>();
this.applicationSettings = this.serviceProvider.GetService<IRepository<IApplicationSettings>>();
this.bindingContext = serviceProvider.GetService<IBindingContext>();
//
// Restore window settings.
//
var windowSettings = this.applicationSettings.GetSettings();
if (windowSettings.IsMainWindowMaximized.Value)
{
this.WindowState = FormWindowState.Maximized;
InitializeComponent();
}
else if (windowSettings.MainWindowHeight.Value != 0 &&
windowSettings.MainWindowWidth.Value != 0)
{
InitializeComponent();
this.Size = new Size(
windowSettings.MainWindowWidth.Value,
windowSettings.MainWindowHeight.Value);
}
else
{
InitializeComponent();
}
SuspendLayout();
this.windowTheme.ApplyTo(this);
this.MinimumSize = MinimumWindowSize;
// Set fixed size for the left/right panels (in pixels).
this.dockPanel.DockLeftPortion =
this.dockPanel.DockRightPortion = LogicalToDeviceUnits(300);
//
// View menu.
//
this.viewMenuContextSource = new ContextSource<IMainWindow>()
{
Context = this // Pseudo-context, never changes
};
this.viewMenuCommands = new CommandContainer<IMainWindow>(
ToolStripItemDisplayStyle.ImageAndText,
this.viewMenuContextSource,
this.bindingContext);
this.viewMenuCommands.BindTo(
this.viewToolStripMenuItem,
this.bindingContext);
//
// Window menu.
//
this.windowMenuContextSource = new ContextSource<ToolWindowViewBase>();
this.windowToolStripMenuItem.DropDownOpening += (sender, args) =>
{
this.windowMenuContextSource.Context = this.dockPanel.ActiveContent as ToolWindowViewBase;
};
this.dockPanel.ActiveContentChanged += (sender, args) =>
{
//
// NB. It's possible that ActiveContent is null although there
// is an active document. Most commonly, this happens when
// focus is released from an RDP window by using a keyboard
// shortcut.
//
this.windowMenuContextSource.Context =
(this.dockPanel.ActiveContent ?? this.dockPanel.ActiveDocumentPane?.ActiveContent)
as ToolWindowViewBase;
};
this.windowMenuCommands = new CommandContainer<ToolWindowViewBase>(
ToolStripItemDisplayStyle.ImageAndText,
this.windowMenuContextSource,
this.bindingContext);
this.windowMenuCommands.BindTo(
this.windowToolStripMenuItem,
this.bindingContext);
//
// Bind controls.
//
this.viewModel = new MainFormViewModel(
this,
this.serviceProvider.GetService<IInstall>(),
this.serviceProvider.GetService<UserProfile>(),
this.serviceProvider.GetService<IAuthorization>());
this.BindProperty(
c => c.Text,
this.viewModel,
m => m.WindowTitle,
this.bindingContext);
//
// Status bar.
//
this.statusStrip.BindReadonlyProperty(
c => c.Active,
this.viewModel,
m => m.IsLoggingEnabled,
this.bindingContext);
this.toolStripStatus.BindProperty(
c => c.Text,
this.viewModel,
m => m.StatusText,
this.bindingContext);
this.backgroundJobLabel.BindProperty(
c => c.Visible,
this.viewModel,
m => m.IsBackgroundJobStatusVisible,
this.bindingContext);
this.cancelBackgroundJobsButton.BindProperty(
c => c.Visible,
this.viewModel,
m => m.IsBackgroundJobStatusVisible,
this.bindingContext);
this.backgroundJobLabel.BindProperty(
c => c.Text,
this.viewModel,
m => m.BackgroundJobStatus,
this.bindingContext);
this.profileStateButton.BindReadonlyProperty(
c => c.Text,
this.viewModel,
m => m.ProfileStateCaption,
this.bindingContext);
//
// Profile chooser.
//
var dynamicProfileMenuItemTag = new object();
this.profileStateButton.DropDownOpening += (sender, args) =>
{
//
// Re-populate list of profile menu items.
//
// Mark dynamic menu items with a tag so that we don't
// accidentally remove any static menu items.
//
this.profileStateButton
.DropDownItems
.RemoveAll(item => item.Tag == dynamicProfileMenuItemTag)
.AddRange(this.viewModel
.AlternativeProfileNames
.Select(name => new ToolStripMenuItem(name)
{
Name = name,
Tag = dynamicProfileMenuItemTag
})
.ToArray());
};
this.profileStateButton.DropDownItemClicked += (sender, args) =>
{
if (args.ClickedItem.Tag == dynamicProfileMenuItemTag)
{
this.viewModel.LaunchInstanceWithProfile(args.ClickedItem.Name);
}
};
//
// Logging.
//
this.enableloggingToolStripMenuItem.BindProperty(
c => c.Checked,
this.viewModel,
m => m.IsLoggingEnabled,
this.bindingContext);
//
// Bind menu commands.
//
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"&Close",
window => window != null && window.IsDockable
? CommandState.Enabled
: CommandState.Disabled,
window => window.CloseSafely()));
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"&Float",
window => window != null &&
!window.IsFloat &&
window.IsDockStateValid(DockState.Float)
? CommandState.Enabled
: CommandState.Disabled,
window => window.IsFloat = true));
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"&Auto hide",
window => window != null && window.IsDocked && !window.IsAutoHide
? CommandState.Enabled
: CommandState.Disabled,
window =>
{
window.IsAutoHide = true;
OnDockLayoutChanged();
})
{
ShortcutKeys = Keys.Control | Keys.Alt | Keys.H
});
var dockCommand = this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"Dock",
_ => CommandState.Enabled,
context => { }));
dockCommand.AddCommand(CreateDockCommand(
"&Left",
DockState.DockLeft,
Keys.Control | Keys.Alt | Keys.Left));
dockCommand.AddCommand(CreateDockCommand(
"&Right",
DockState.DockRight,
Keys.Control | Keys.Alt | Keys.Right));
dockCommand.AddCommand(CreateDockCommand(
"&Top",
DockState.DockTop,
Keys.Control | Keys.Alt | Keys.Up));
dockCommand.AddCommand(CreateDockCommand(
"&Bottom",
DockState.DockBottom,
Keys.Control | Keys.Alt | Keys.Down));
this.WindowMenu.AddSeparator();
CommandState showTabCommand(ToolWindowViewBase window)
=> window != null && window.DockState == DockState.Document && window.Pane.Contents.Count > 1
? CommandState.Enabled
: CommandState.Disabled;
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"&Next tab",
showTabCommand,
window => SwitchTab(window, 1))
{
ShortcutKeys = Keys.Control | Keys.Alt | Keys.PageDown
});
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"&Previous tab",
showTabCommand,
window => SwitchTab(window, -1))
{
ShortcutKeys = Keys.Control | Keys.Alt | Keys.PageUp
});
this.WindowMenu.AddCommand(
new ContextCommand<ToolWindowViewBase>(
"Capture/release &focus",
_ => this.dockPanel.ActiveDocumentPane != null &&
this.dockPanel.ActiveDocumentPane.Contents.EnsureNotNull().Any()
? CommandState.Enabled
: CommandState.Disabled,
window => (this.dockPanel.ActiveDocumentPane?.ActiveContent as DocumentWindow)?.SwitchToDocument())
{
ShortcutKeys = Keys.Control | Keys.Alt | Keys.Home
});
ResumeLayout();
}