SidePanel code rewritten (now opens in external container window).

Several changes to UI event handling (better performance on resize) and removed other SidePanel left-overs.
Added a "Settings" sidepanel.
This commit is contained in:
Lorenz Cuno Klopfenstein 2011-03-24 01:31:23 +01:00
parent 6cf04359d2
commit 6a71f22cc7
19 changed files with 1266 additions and 634 deletions

7
Docs/Settings List.txt Normal file
View file

@ -0,0 +1,7 @@
OPTIONS
+ Language
Drop down list with icons
Restart notice
+ Shortcuts

View file

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace OnTopReplica {
@ -17,6 +18,38 @@ namespace OnTopReplica {
return new Point(a.X - b.X, a.Y - b.Y);
}
/// <summary>
/// Expands a size value by a padding distance.
/// </summary>
public static Size Expand(this Size size, Padding padding) {
return new Size(size.Width + padding.Horizontal, size.Height + padding.Vertical);
}
/// <summary>
/// Expands a size value by a size distance.
/// </summary>
public static Size Expand(this Size size, Size expandSize) {
return new Size(size.Width + expandSize.Width, size.Height + expandSize.Height);
}
/// <summary>
/// Computes the difference between two size values.
/// </summary>
public static Size Difference(this Size a, Size b) {
return new Size(a.Width - b.Width, a.Height - b.Height);
}
/// <summary>
/// Ensures that the minimum size of a control respects a minimum
/// client size area.
/// </summary>
/// <param name="ctrl">Control whose MinimumSize should be altered.</param>
/// <param name="minimumClientSize">Minimum client size value to ensure.</param>
public static void EnsureMinimumClientSize(this Control ctrl, Size minimumClientSize) {
Size offset = ctrl.Size.Difference(ctrl.ClientSize);
ctrl.MinimumSize = minimumClientSize.Expand(offset);
}
}
}

View file

@ -65,13 +65,7 @@
this.chromeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.reduceToIconToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.languageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuLanguages = new System.Windows.Forms.ContextMenuStrip(this.components);
this.englishToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.cestinaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.danskToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.espanolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.italianoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuContextClose = new System.Windows.Forms.ToolStripMenuItem();
this.fullSelectWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -83,7 +77,6 @@
this.menuWindows.SuspendLayout();
this.menuOpacity.SuspendLayout();
this.menuResize.SuspendLayout();
this.menuLanguages.SuspendLayout();
this.menuFullscreenContext.SuspendLayout();
this.SuspendLayout();
//
@ -100,11 +93,11 @@
this.chromeToolStripMenuItem,
this.reduceToIconToolStripMenuItem,
this.toolStripSeparator1,
this.languageToolStripMenuItem,
this.settingsToolStripMenuItem,
this.aboutToolStripMenuItem,
this.menuContextClose});
this.menuContext.Name = "menuContext";
this.menuContext.Size = new System.Drawing.Size(169, 296);
this.menuContext.Size = new System.Drawing.Size(187, 296);
this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening);
//
// menuContextWindows
@ -112,7 +105,7 @@
this.menuContextWindows.DropDown = this.menuWindows;
this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.list;
this.menuContextWindows.Name = "menuContextWindows";
this.menuContextWindows.Size = new System.Drawing.Size(168, 22);
this.menuContextWindows.Size = new System.Drawing.Size(186, 22);
this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows;
this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT;
//
@ -135,7 +128,7 @@
//
this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_arrow;
this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem";
this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch;
this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT;
this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click);
@ -145,7 +138,7 @@
this.selectRegionToolStripMenuItem.Enabled = false;
this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions;
this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem";
this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion;
this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT;
this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click);
@ -159,7 +152,7 @@
this.restoreLastClonedWindowToolStripMenuItem});
this.advancedToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_wrench;
this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem";
this.advancedToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.advancedToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.advancedToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAdvanced;
this.advancedToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Advanced_opening);
//
@ -194,7 +187,8 @@
//
this.restoreLastClonedWindowToolStripMenuItem.Name = "restoreLastClonedWindowToolStripMenuItem";
this.restoreLastClonedWindowToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.restoreLastClonedWindowToolStripMenuItem.Text = "Restore last cloned window";
this.restoreLastClonedWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRestoreLast;
this.restoreLastClonedWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRestoreLastTT;
this.restoreLastClonedWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_RestoreLastWindow_click);
//
// menuContextOpacity
@ -202,7 +196,7 @@
this.menuContextOpacity.DropDown = this.menuOpacity;
this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity;
this.menuContextOpacity.Name = "menuContextOpacity";
this.menuContextOpacity.Size = new System.Drawing.Size(168, 22);
this.menuContextOpacity.Size = new System.Drawing.Size(186, 22);
this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity;
//
// menuOpacity
@ -270,7 +264,7 @@
this.resizeToolStripMenuItem.DropDown = this.menuResize;
this.resizeToolStripMenuItem.Enabled = false;
this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem";
this.resizeToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.resizeToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize;
//
// menuResize
@ -354,7 +348,7 @@
this.bottomRightToolStripMenuItem});
this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null;
this.dockToolStripMenuItem.Name = "dockToolStripMenuItem";
this.dockToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.dockToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition;
this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT;
this.dockToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Position_Opening);
@ -411,7 +405,7 @@
// chromeToolStripMenuItem
//
this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem";
this.chromeToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.chromeToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome;
this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT;
this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click);
@ -420,7 +414,7 @@
//
this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.reduce;
this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem";
this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce;
this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT;
this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click);
@ -428,78 +422,21 @@
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(165, 6);
this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6);
//
// languageToolStripMenuItem
// settingsToolStripMenuItem
//
this.languageToolStripMenuItem.DropDown = this.menuLanguages;
this.languageToolStripMenuItem.Name = "languageToolStripMenuItem";
this.languageToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.languageToolStripMenuItem.Text = global::OnTopReplica.Strings.Language;
//
// menuLanguages
//
this.menuLanguages.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.englishToolStripMenuItem,
this.cestinaToolStripMenuItem,
this.danskToolStripMenuItem1,
this.espanolToolStripMenuItem,
this.italianoToolStripMenuItem});
this.menuLanguages.Name = "menuLanguages";
this.menuLanguages.OwnerItem = this.languageToolStripMenuItem;
this.menuLanguages.Size = new System.Drawing.Size(153, 136);
this.menuLanguages.Text = "Dansk";
//
// englishToolStripMenuItem
//
this.englishToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.flag_usa;
this.englishToolStripMenuItem.Name = "englishToolStripMenuItem";
this.englishToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.englishToolStripMenuItem.Tag = "en-US";
this.englishToolStripMenuItem.Text = "English";
this.englishToolStripMenuItem.Click += new System.EventHandler(this.Menu_Language_click);
//
// cestinaToolStripMenuItem
//
this.cestinaToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.flag_czech;
this.cestinaToolStripMenuItem.Name = "cestinaToolStripMenuItem";
this.cestinaToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.cestinaToolStripMenuItem.Tag = "cs-CZ";
this.cestinaToolStripMenuItem.Text = "Čeština";
this.cestinaToolStripMenuItem.Click += new System.EventHandler(this.Menu_Language_click);
//
// danskToolStripMenuItem1
//
this.danskToolStripMenuItem1.Image = global::OnTopReplica.Properties.Resources.flag_danish;
this.danskToolStripMenuItem1.Name = "danskToolStripMenuItem1";
this.danskToolStripMenuItem1.Size = new System.Drawing.Size(152, 22);
this.danskToolStripMenuItem1.Tag = "da-DK";
this.danskToolStripMenuItem1.Text = "Dansk";
this.danskToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Language_click);
//
// espanolToolStripMenuItem
//
this.espanolToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.flag_spanish;
this.espanolToolStripMenuItem.Name = "espanolToolStripMenuItem";
this.espanolToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.espanolToolStripMenuItem.Tag = "es-ES";
this.espanolToolStripMenuItem.Text = "Español";
this.espanolToolStripMenuItem.Click += new System.EventHandler(this.Menu_Language_click);
//
// italianoToolStripMenuItem
//
this.italianoToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.flag_ita;
this.italianoToolStripMenuItem.Name = "italianoToolStripMenuItem";
this.italianoToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.italianoToolStripMenuItem.Tag = "it-IT";
this.italianoToolStripMenuItem.Text = "Italiano";
this.italianoToolStripMenuItem.Click += new System.EventHandler(this.Menu_Language_click);
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
this.settingsToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.settingsToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSettings;
this.settingsToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSettingsTT;
this.settingsToolStripMenuItem.Click += new System.EventHandler(this.Menu_Settings_click);
//
// aboutToolStripMenuItem
//
this.aboutToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_help;
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout;
this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT;
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click);
@ -508,7 +445,7 @@
//
this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new;
this.menuContextClose.Name = "menuContextClose";
this.menuContextClose.Size = new System.Drawing.Size(168, 22);
this.menuContextClose.Size = new System.Drawing.Size(186, 22);
this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose;
this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click);
//
@ -564,10 +501,11 @@
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(264, 204);
this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.MinimumSize = new System.Drawing.Size(20, 38);
this.MinimumSize = new System.Drawing.Size(40, 40);
this.Name = "MainForm";
this.Text = "OnTopReplica";
this.TopMost = true;
@ -575,7 +513,6 @@
this.menuWindows.ResumeLayout(false);
this.menuOpacity.ResumeLayout(false);
this.menuResize.ResumeLayout(false);
this.menuLanguages.ResumeLayout(false);
this.menuFullscreenContext.ResumeLayout(false);
this.ResumeLayout(false);
@ -612,14 +549,8 @@
private System.Windows.Forms.ToolStripMenuItem quarterToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem fullscreenToolStripMenuItem1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
private System.Windows.Forms.ToolStripMenuItem languageToolStripMenuItem;
private System.Windows.Forms.ContextMenuStrip menuLanguages;
private System.Windows.Forms.ToolStripMenuItem englishToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem italianoToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem cestinaToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem danskToolStripMenuItem1;
private System.Windows.Forms.ContextMenuStrip menuFullscreenContext;
private System.Windows.Forms.ToolStripMenuItem fullSelectWindowToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem fullOpacityToolStripMenuItem;
@ -633,8 +564,8 @@
private System.Windows.Forms.ToolStripMenuItem disabledToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem restorePositionAndSizeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem espanolToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem restoreLastClonedWindowToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
}
}

View file

@ -17,8 +17,6 @@ namespace OnTopReplica {
//GUI elements
ThumbnailPanel _thumbnailPanel;
SidePanel _currentSidePanel = null;
Panel _sidePanelContainer;
//Managers
BaseWindowSeeker _windowSeeker = new TaskWindowSeeker {
@ -37,6 +35,7 @@ namespace OnTopReplica {
InitializeComponent();
KeepAspectRatio = false;
GlassEnabled = true;
GlassMargins = new Margins(-1);
//Store default values
_nonClickThroughKey = TransparencyKey;
@ -44,26 +43,14 @@ namespace OnTopReplica {
//Thumbnail panel
_thumbnailPanel = new ThumbnailPanel {
Location = Point.Empty,
Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
Size = ClientSize
Dock = DockStyle.Fill
};
_thumbnailPanel.CloneClick += new EventHandler<CloneClickEventArgs>(Thumbnail_CloneClick);
Controls.Add(_thumbnailPanel);
//Side panel
_sidePanelContainer = new Panel {
Location = new Point(ClientSize.Width + 5, 0),
Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom,
Enabled = false,
Visible = false,
Size = new Size(100, ClientSize.Height),
Padding = new Padding(4)
};
Controls.Add(_sidePanelContainer);
//Set native renderer on context menus
Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer(
menuContext, menuWindows, menuOpacity, menuResize, menuLanguages, menuFullscreenContext
menuContext, menuWindows, menuOpacity, menuResize, menuFullscreenContext
);
//Init message pump extensions
@ -80,10 +67,8 @@ namespace OnTopReplica {
this.KeyPreview = true;
}
delegate void GuiAction();
void UpdateManager_CheckCompleted(object sender, UpdateCheckCompletedEventArgs e) {
this.Invoke(new GuiAction(() => {
this.Invoke(new Action(() => {
if (e.Success) {
_updateManager.HandleUpdateCheck(this, e.Information, false);
}
@ -139,14 +124,10 @@ namespace OnTopReplica {
base.OnClosing(e);
}
Margins fullMargins = new Margins(-1);
protected override void OnMove(EventArgs e) {
base.OnMove(e);
protected override void OnResize(EventArgs e) {
base.OnResize(e);
this.GlassMargins = (_currentSidePanel != null) ?
new Margins(ClientSize.Width - _sidePanelContainer.Width, 0, 0, 0) :
fullMargins;
AdjustSidePanelLocation();
}
protected override void OnResizeEnd(EventArgs e) {
@ -247,8 +228,6 @@ namespace OnTopReplica {
#endregion
const string Title = "OnTopReplica";
#region Keyboard event handling
protected override void OnKeyUp(KeyEventArgs e) {
@ -328,7 +307,6 @@ namespace OnTopReplica {
bool _isFullscreen = false;
Point _preFullscreenLocation;
Size _preFullscreenSize;
FormBorderStyle _preFullscreenBorderStyle;
public bool IsFullscreen {
get {
@ -346,7 +324,6 @@ namespace OnTopReplica {
if (value) {
_preFullscreenLocation = Location;
_preFullscreenSize = ClientSize;
_preFullscreenBorderStyle = FormBorderStyle;
FormBorderStyle = FormBorderStyle.None;
var currentScreen = Screen.FromControl(this);
@ -354,7 +331,7 @@ namespace OnTopReplica {
Location = currentScreen.WorkingArea.Location;
}
else {
FormBorderStyle = _preFullscreenBorderStyle;
FormBorderStyle = DefaultBorderStyle;
Location = _preFullscreenLocation;
ClientSize = _preFullscreenSize;
RefreshAspectRatio();

View file

@ -129,9 +129,6 @@
<metadata name="menuResize.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>578, 17</value>
</metadata>
<metadata name="menuLanguages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>695, 17</value>
</metadata>
<metadata name="menuFullscreenContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>399, 17</value>
</metadata>

View file

@ -8,98 +8,68 @@ namespace OnTopReplica {
partial class MainForm {
EventHandler RequestClosingHandler;
const int SidePanelMargin = 1;
//SidePanel _currentSidePanel = null;
SidePanelContainer _sidePanelContainer = null;
/// <summary>
/// Opens a new side panel.
/// </summary>
/// <param name="panel">The side panel to embed.</param>
public void SetSidePanel(SidePanel panel) {
if (_currentSidePanel != null) {
if (IsSidePanelOpen) {
CloseSidePanel();
}
_currentSidePanel = panel;
_currentSidePanel.OnFirstShown(this);
//Add and show
_sidePanelContainer.Controls.Add(panel);
_sidePanelContainer.Enabled = true;
_sidePanelContainer.Show();
panel.Show();
int intHorzMargin = panel.Margin.Horizontal + _sidePanelContainer.Padding.Horizontal; //internal margins for sidepanel
int intVertMargin = panel.Margin.Vertical + _sidePanelContainer.Padding.Vertical;
//Resize container
_sidePanelContainer.ClientSize = new Size(
panel.MinimumSize.Width + intHorzMargin,
ClientSize.Height
);
int rightHorzMargin = _sidePanelContainer.Width + SidePanelMargin; //horz margin between the two controls
//Resize rest
MinimumSize = new Size(
20 + panel.MinimumSize.Width + SidePanelMargin + intHorzMargin,
panel.MinimumSize.Height + intVertMargin
);
ClientSize = new Size(
ClientSize.Width + rightHorzMargin,
ClientSize.Height
);
ExtraPadding = new Padding(0, 0, rightHorzMargin, 0);
_thumbnailPanel.Size = new Size(
ClientSize.Width - rightHorzMargin,
ClientSize.Height
);
_sidePanelContainer.Location = new Point(
ClientSize.Width - rightHorzMargin,
0
);
//Move window if needed
FixPositionAndSize();
//Hook event listener
if (RequestClosingHandler == null)
RequestClosingHandler = new EventHandler(SidePanel_RequestClosing);
panel.RequestClosing += RequestClosingHandler;
_sidePanelContainer = new SidePanelContainer(this);
_sidePanelContainer.SetSidePanel(panel);
_sidePanelContainer.Show(this);
AdjustSidePanelLocation();
}
/// <summary>
/// Closes the current side panel.
/// </summary>
public void CloseSidePanel() {
if (_currentSidePanel == null)
if (_sidePanelContainer == null || _sidePanelContainer.IsDisposed) {
_sidePanelContainer = null;
return;
}
_sidePanelContainer.Hide();
_sidePanelContainer.FreeSidePanel();
}
/// <summary>
/// Gets whether a side panel is currently shown.
/// </summary>
public bool IsSidePanelOpen {
get {
if (_sidePanelContainer == null)
return false;
if (_sidePanelContainer.IsDisposed) {
_sidePanelContainer = null;
return false;
}
return _sidePanelContainer.Visible;
}
}
/// <summary>
/// Moves the side panel based on the main form's current location.
/// </summary>
protected void AdjustSidePanelLocation() {
if (!IsSidePanelOpen)
return;
//Unhook listener to make panel freeable
_currentSidePanel.RequestClosing -= RequestClosingHandler;
//Remove side panel and container
_currentSidePanel.OnClosing(this);
_currentSidePanel.Hide();
_sidePanelContainer.Controls.Clear();
_sidePanelContainer.Visible = _sidePanelContainer.Enabled = false;
//Free panel
_currentSidePanel.Dispose();
_currentSidePanel = null;
//Resize
MinimumSize = new Size(20, 20);
ClientSize = new Size(
ClientSize.Width - _sidePanelContainer.Width - SidePanelMargin,
ClientSize.Height
);
ExtraPadding = new Padding(0);
_thumbnailPanel.Size = ClientSize;
//Put focus back to main form
this.Focus();
//Check if moving the panel on the form's right would put it off-screen
var screen = Screen.FromControl(this);
if (Location.X + Width + _sidePanelContainer.Width > screen.WorkingArea.Right) {
_sidePanelContainer.Location = new Point(Location.X - _sidePanelContainer.Width, Location.Y);
}
else {
_sidePanelContainer.Location = new Point(Location.X + Width, Location.Y);
}
}
void SidePanel_RequestClosing(object sender, EventArgs e) {

View file

@ -10,7 +10,7 @@ namespace OnTopReplica {
private void Menu_opening(object sender, CancelEventArgs e) {
//Cancel if currently in "fullscreen" mode or a side panel is open
if (IsFullscreen || _currentSidePanel != null) {
if (IsFullscreen || IsSidePanelOpen) {
e.Cancel = true;
return;
}
@ -189,6 +189,7 @@ namespace OnTopReplica {
}
private void Menu_Language_click(object sender, EventArgs e) {
//TODO: strip this stuff
ToolStripItem tsi = (ToolStripItem)sender;
string langCode = tsi.Tag as string;
@ -202,6 +203,10 @@ namespace OnTopReplica {
MessageBox.Show("Error");*/
}
private void Menu_Settings_click(object sender, EventArgs e) {
this.SetSidePanel(new OnTopReplica.SidePanels.OptionsPanel());
}
private void Menu_About_click(object sender, EventArgs e) {
this.Hide();

View file

@ -139,6 +139,12 @@
<Compile Include="Native\HT.cs" />
<Compile Include="Pair.cs" />
<Compile Include="Platforms\DebugPlatform.cs" />
<Compile Include="SidePanelContainer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SidePanelContainer.Designer.cs">
<DependentUpon>SidePanelContainer.cs</DependentUpon>
</Compile>
<Compile Include="SidePanels\OptionsPanel.cs">
<SubType>UserControl</SubType>
</Compile>
@ -161,6 +167,9 @@
<Compile Include="WindowSeekers\ByTitleWindowSeeker.cs" />
<Compile Include="WindowSeekers\RestoreWindowSeeker.cs" />
<Compile Include="WindowSeekers\TaskWindowSeeker.cs" />
<EmbeddedResource Include="SidePanelContainer.resx">
<DependentUpon>SidePanelContainer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Strings.ru.resx" />
<None Include="Native\ITaskBarList.cs" />
<Compile Include="Native\InputMethods.cs" />

View file

@ -49,5 +49,14 @@ namespace OnTopReplica {
public virtual void OnClosing(MainForm form) {
}
/// <summary>
/// Gets the side panel's title.
/// </summary>
public virtual string Title {
get {
return "Side panel";
}
}
}
}

View file

@ -0,0 +1,46 @@
namespace OnTopReplica {
partial class SidePanelContainer {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.SuspendLayout();
//
// SidePanelContainer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(246, 300);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.MinimizeBox = false;
this.Name = "SidePanelContainer";
this.Padding = new System.Windows.Forms.Padding(6);
this.ShowInTaskbar = false;
this.Text = "Side Panel container";
this.TopMost = true;
this.ResumeLayout(false);
}
#endregion
}
}

View file

@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace OnTopReplica {
/// <summary>
/// Acts as a form that can contain a SidePanel instance.
/// </summary>
partial class SidePanelContainer : Form {
EventHandler RequestClosingHandler;
MainForm _parent;
public SidePanelContainer(MainForm mainForm) {
InitializeComponent();
_parent = mainForm;
RequestClosingHandler = new EventHandler(Panel_RequestClosing);
}
void Panel_RequestClosing(object sender, EventArgs e) {
FreeSidePanel();
this.Close();
}
protected override void OnClosing(CancelEventArgs e) {
base.OnClosing(e);
//Ensure side panel closing code is run
FreeSidePanel();
}
/// <summary>
/// Sets a new side panel and refreshes the window. The panel is
/// managed by the SidePanelContainer from now on.
/// </summary>
/// <param name="panel">SidePanel to embed and to manage.</param>
public void SetSidePanel(SidePanel panel) {
panel.OnFirstShown(_parent);
//Set panel
this.SuspendLayout();
this.Text = panel.Title;
CurrentSidePanel = panel;
panel.RequestClosing += RequestClosingHandler;
this.Controls.Add(panel);
var minSize = panel.MinimumSize.Expand(this.Padding);
this.ClientSize = minSize;
this.EnsureMinimumClientSize(minSize);
this.ResumeLayout();
}
/// <summary>
/// Removes the current side panel and disposes it.
/// </summary>
public void FreeSidePanel() {
if (CurrentSidePanel == null)
return;
this.SuspendLayout();
FreeSidePanelCore();
this.ResumeLayout();
}
/// <summary>
/// Removes the current side panel and disposes it (doesn't suspend layout).
/// </summary>
private void FreeSidePanelCore() {
CurrentSidePanel.OnClosing(_parent);
//Free hook
CurrentSidePanel.RequestClosing -= RequestClosingHandler;
//Remove
this.Controls.Remove(CurrentSidePanel);
//Free
CurrentSidePanel.Dispose();
CurrentSidePanel = null;
}
public SidePanel CurrentSidePanel {
get;
private set;
}
}
}

View file

@ -0,0 +1,120 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -10,6 +10,12 @@ namespace OnTopReplica.SidePanels {
InitializeComponent();
}
public override string Title {
get {
return Strings.MenuGroupSwitch;
}
}
public override void OnFirstShown(MainForm form) {
base.OnFirstShown(form);

View file

@ -0,0 +1,120 @@
namespace OnTopReplica.SidePanels {
partial class OptionsPanel {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.btnClose = new System.Windows.Forms.Button();
this.panelMain = new System.Windows.Forms.Panel();
this.groupLanguage = new System.Windows.Forms.GroupBox();
this.lblLanguage = new System.Windows.Forms.Label();
this.comboLanguage = new System.Windows.Forms.ComboBox();
this.panelMain.SuspendLayout();
this.groupLanguage.SuspendLayout();
this.SuspendLayout();
//
// btnClose
//
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnClose.Location = new System.Drawing.Point(185, 217);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(75, 23);
this.btnClose.TabIndex = 0;
this.btnClose.Text = "Close";
this.btnClose.UseVisualStyleBackColor = true;
this.btnClose.Click += new System.EventHandler(this.Close_click);
//
// panelMain
//
this.panelMain.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.panelMain.AutoScroll = true;
this.panelMain.Controls.Add(this.groupLanguage);
this.panelMain.Location = new System.Drawing.Point(0, 0);
this.panelMain.Name = "panelMain";
this.panelMain.Size = new System.Drawing.Size(260, 211);
this.panelMain.TabIndex = 1;
//
// groupLanguage
//
this.groupLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupLanguage.Controls.Add(this.lblLanguage);
this.groupLanguage.Controls.Add(this.comboLanguage);
this.groupLanguage.Location = new System.Drawing.Point(3, 3);
this.groupLanguage.Name = "groupLanguage";
this.groupLanguage.Size = new System.Drawing.Size(254, 68);
this.groupLanguage.TabIndex = 0;
this.groupLanguage.TabStop = false;
this.groupLanguage.Text = "Language:";
//
// lblLanguage
//
this.lblLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblLanguage.Location = new System.Drawing.Point(6, 43);
this.lblLanguage.Name = "lblLanguage";
this.lblLanguage.Size = new System.Drawing.Size(242, 23);
this.lblLanguage.TabIndex = 1;
this.lblLanguage.Text = "Requires a restart.";
//
// comboLanguage
//
this.comboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.comboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboLanguage.FormattingEnabled = true;
this.comboLanguage.Items.AddRange(new object[] {
"English",
"Dansk",
"Italiano"});
this.comboLanguage.Location = new System.Drawing.Point(6, 19);
this.comboLanguage.Name = "comboLanguage";
this.comboLanguage.Size = new System.Drawing.Size(242, 21);
this.comboLanguage.TabIndex = 0;
//
// OptionsPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.Controls.Add(this.panelMain);
this.Controls.Add(this.btnClose);
this.MinimumSize = new System.Drawing.Size(260, 240);
this.Name = "OptionsPanel";
this.Size = new System.Drawing.Size(260, 240);
this.panelMain.ResumeLayout(false);
this.groupLanguage.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.Panel panelMain;
private System.Windows.Forms.GroupBox groupLanguage;
private System.Windows.Forms.ComboBox comboLanguage;
private System.Windows.Forms.Label lblLanguage;
}
}

View file

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace OnTopReplica.SidePanels {
partial class OptionsPanel : SidePanel {
public OptionsPanel() {
InitializeComponent();
}
private void Close_click(object sender, EventArgs e) {
OnRequestClosing();
}
public override string Title {
get {
return Strings.MenuSettings;
}
}
}
}

View file

@ -0,0 +1,120 @@
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -19,6 +19,12 @@ namespace OnTopReplica.SidePanels {
_regionDrawnHandler = new ThumbnailPanel.RegionDrawnHandler(ThumbnailPanel_RegionDrawn);
}
public override string Title {
get {
return Strings.MenuRegion;
}
}
ThumbnailPanel.RegionDrawnHandler _regionDrawnHandler;
public override void OnFirstShown(MainForm form) {

View file

@ -1168,6 +1168,42 @@ namespace OnTopReplica {
}
}
/// <summary>
/// Looks up a localized string similar to Restore last cloned window.
/// </summary>
internal static string MenuRestoreLast {
get {
return ResourceManager.GetString("MenuRestoreLast", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to When enabled, OnTopReplica will attempt to restore the last cloned window on start up..
/// </summary>
internal static string MenuRestoreLastTT {
get {
return ResourceManager.GetString("MenuRestoreLastTT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings....
/// </summary>
internal static string MenuSettings {
get {
return ResourceManager.GetString("MenuSettings", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Displays the settings panel..
/// </summary>
internal static string MenuSettingsTT {
get {
return ResourceManager.GetString("MenuSettingsTT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Switch to window.
/// </summary>

View file

@ -1,30 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButtonCancelTT" xml:space="preserve">
<value>Abort update process.</value>
</data>
<data name="AboutButtonExpanderTT" xml:space="preserve">
<value>Show details about OnTopReplica.</value>
</data>
<data name="AboutButtonResetTT" xml:space="preserve">
<value>Reset all OnTopReplica settings.</value>
</data>
<data name="AboutButtonUpdateTT" xml:space="preserve">
<value>Update OnTopReplica now.</value>
</data>
<data name="AboutDetails" xml:space="preserve">
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButtonCancelTT" xml:space="preserve">
<value>Abort update process.</value>
</data>
<data name="AboutButtonExpanderTT" xml:space="preserve">
<value>Show details about OnTopReplica.</value>
</data>
<data name="AboutButtonResetTT" xml:space="preserve">
<value>Reset all OnTopReplica settings.</value>
</data>
<data name="AboutButtonUpdateTT" xml:space="preserve">
<value>Update OnTopReplica now.</value>
</data>
<data name="AboutDetails" xml:space="preserve">
<value>&lt;html&gt;
&lt;head&gt;
&lt;style type="text/css"&gt;
@ -75,419 +180,431 @@ a:hover {
&lt;p&gt;Some icons from &lt;a href="http://www.vistaico.com"&gt;VistaICO.com&lt;/a&gt; and the Xiao icon set.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</value>
</data>
<data name="ApplicationName" xml:space="preserve">
<value>OnTopReplica</value>
</data>
<data name="AskReset" xml:space="preserve">
<value>Reset window completely?</value>
</data>
<data name="AskResetButtonOk" xml:space="preserve">
&lt;/html&gt;</value>
</data>
<data name="ApplicationName" xml:space="preserve">
<value>OnTopReplica</value>
</data>
<data name="AskReset" xml:space="preserve">
<value>Reset window completely?</value>
</data>
<data name="AskResetButtonOk" xml:space="preserve">
<value>&amp;Reset
All settings will be lost.</value>
</data>
<data name="AskResetContent" xml:space="preserve">
<value>Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary.</value>
</data>
<data name="AskResetTitle" xml:space="preserve">
<value>Reset</value>
</data>
<data name="AskSettingReset" xml:space="preserve">
<value>Reset settings?</value>
</data>
<data name="AskSettingResetContent" xml:space="preserve">
<value>This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost).</value>
</data>
<data name="AskSettingResetTitle" xml:space="preserve">
<value>Reset settings</value>
</data>
<data name="AskUpdate" xml:space="preserve">
<value>Download OnTopReplica {0}?</value>
<comment>{0} update version</comment>
</data>
<data name="AskUpdateButtonCancel" xml:space="preserve">
All settings will be lost.</value>
</data>
<data name="AskResetContent" xml:space="preserve">
<value>Can be used to reset all settings if you lost control over the window or moved it beyond the screen boundary.</value>
</data>
<data name="AskResetTitle" xml:space="preserve">
<value>Reset</value>
</data>
<data name="AskSettingReset" xml:space="preserve">
<value>Reset settings?</value>
</data>
<data name="AskSettingResetContent" xml:space="preserve">
<value>This will erase all settings of OnTopReplica, returning it to the original state right after installation (all saved information, like stored regions, will be lost).</value>
</data>
<data name="AskSettingResetTitle" xml:space="preserve">
<value>Reset settings</value>
</data>
<data name="AskUpdate" xml:space="preserve">
<value>Download OnTopReplica {0}?</value>
<comment>{0} update version</comment>
</data>
<data name="AskUpdateButtonCancel" xml:space="preserve">
<value>Cancel update
OnTopReplica will prompt you the next time it is started.</value>
</data>
<data name="AskUpdateButtonOk" xml:space="preserve">
OnTopReplica will prompt you the next time it is started.</value>
</data>
<data name="AskUpdateButtonOk" xml:space="preserve">
<value>Download
Install OnTopReplica {0}.</value>
<comment>{0} update version</comment>
</data>
<data name="AskUpdateContent" xml:space="preserve">
<value>The new version can be downloaded and installed from the official website.</value>
</data>
<data name="AskUpdateExpanded" xml:space="preserve">
Install OnTopReplica {0}.</value>
<comment>{0} update version</comment>
</data>
<data name="AskUpdateContent" xml:space="preserve">
<value>The new version can be downloaded and installed from the official website.</value>
</data>
<data name="AskUpdateExpanded" xml:space="preserve">
<value>Installed version: {0}
Available version: {1}</value>
Available version: {1}</value>
<comment>{0} installed version number
{1} online available version number</comment>
</data>
<data name="AskUpdateTitle" xml:space="preserve">
<value>Update available</value>
</data>
<data name="ButtonCancel" xml:space="preserve">
<value>&amp;Cancel</value>
</data>
<data name="CreatedBy" xml:space="preserve">
<value>Created by: Lorenz Cuno Klopfenstein.</value>
</data>
<data name="DrawRegions" xml:space="preserve">
<value>Draw regions using mouse.</value>
</data>
<data name="ErrorDetailButton" xml:space="preserve">
<value>Details</value>
</data>
<data name="ErrorDetailsAero" xml:space="preserve">
<value>Details on Windows Aero</value>
</data>
<data name="ErrorDetailsAeroInfo" xml:space="preserve">
<value>Windows Aero is only available on Windows Vista Home Premium or higher.</value>
</data>
<data name="ErrorDwmOff" xml:space="preserve">
<value>Desktop Composition' is not enabled.</value>
</data>
<data name="ErrorDwmOffContent" xml:space="preserve">
{1} online available version number</comment>
</data>
<data name="AskUpdateTitle" xml:space="preserve">
<value>Update available</value>
</data>
<data name="ButtonCancel" xml:space="preserve">
<value>&amp;Cancel</value>
</data>
<data name="CreatedBy" xml:space="preserve">
<value>Created by: Lorenz Cuno Klopfenstein.</value>
</data>
<data name="DrawRegions" xml:space="preserve">
<value>Draw regions using mouse.</value>
</data>
<data name="ErrorDetailButton" xml:space="preserve">
<value>Details</value>
</data>
<data name="ErrorDetailsAero" xml:space="preserve">
<value>Details on Windows Aero</value>
</data>
<data name="ErrorDetailsAeroInfo" xml:space="preserve">
<value>Windows Aero is only available on Windows Vista Home Premium or higher.</value>
</data>
<data name="ErrorDwmOff" xml:space="preserve">
<value>Desktop Composition' is not enabled.</value>
</data>
<data name="ErrorDwmOffContent" xml:space="preserve">
<value>You must enable desktop composition, by selecting 'Windows Aero' as the theme used by Windows.
To do so, right-click on the desktop and click on Personalize.</value>
</data>
<data name="ErrorGenericInfoButton" xml:space="preserve">
<value>Error details</value>
</data>
<data name="ErrorGenericInfoText" xml:space="preserve">
<value>Error: </value>
</data>
<data name="ErrorGenericThumbnailHandleError" xml:space="preserve">
<value>It appears that the selected window has been closed or is not valid anymore.</value>
</data>
<data name="ErrorGenericTitle" xml:space="preserve">
<value>Error</value>
</data>
<data name="ErrorNoDwm" xml:space="preserve">
To do so, right-click on the desktop and click on Personalize.</value>
</data>
<data name="ErrorGenericInfoButton" xml:space="preserve">
<value>Error details</value>
</data>
<data name="ErrorGenericInfoText" xml:space="preserve">
<value>Error: </value>
</data>
<data name="ErrorGenericThumbnailHandleError" xml:space="preserve">
<value>It appears that the selected window has been closed or is not valid anymore.</value>
</data>
<data name="ErrorGenericTitle" xml:space="preserve">
<value>Error</value>
</data>
<data name="ErrorNoDwm" xml:space="preserve">
<value>Desktop Composition' is not supported on your Operating System.
You must run this application on Windows Vista Home Premium or better.</value>
</data>
<data name="ErrorNoDwmTitle" xml:space="preserve">
<value>Desktop Composition unsupported</value>
</data>
<data name="ErrorNoThumbnail" xml:space="preserve">
<value>No thumbnail loaded.</value>
</data>
<data name="ErrorUnableToCreateThumbnail" xml:space="preserve">
<value>Unable to create thumbnail</value>
</data>
<data name="ErrorUnableToFit" xml:space="preserve">
<value>Unable to fit window.</value>
</data>
<data name="ErrorUpdate" xml:space="preserve">
<value>Unable to check for updates.</value>
</data>
<data name="ErrorUpdateContent" xml:space="preserve">
<value>It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit &lt;a href="http://ontopreplica.codeplex.com"&gt;OnTopReplica's homepage&lt;/a&gt;).</value>
</data>
<data name="ErrorUpdateContentGeneric" xml:space="preserve">
<value>OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down.</value>
</data>
<data name="FullscreenMode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="FullscreenModeAlwaysOnTop" xml:space="preserve">
<value>Always on top</value>
</data>
<data name="FullscreenModeAlwaysOnTopTT" xml:space="preserve">
<value>Forces OnTopReplica to stay always on top.</value>
</data>
<data name="FullscreenModeClickThrough" xml:space="preserve">
<value>Click through</value>
</data>
<data name="FullscreenModeClickThroughTT" xml:space="preserve">
<value>OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below.</value>
</data>
<data name="FullscreenModeNormal" xml:space="preserve">
<value>Standard</value>
</data>
<data name="FullscreenModeNormalTT" xml:space="preserve">
<value>Behaves like an ordinary window. You can bring other windows above OnTopReplica.</value>
</data>
<data name="FullscreenTitle" xml:space="preserve">
<value>OnTopReplica fullscreen</value>
</data>
<data name="GroupSwitchModeDisableButton" xml:space="preserve">
<value>Disable</value>
</data>
<data name="GroupSwitchModeEnableButton" xml:space="preserve">
<value>Enable Group mode</value>
</data>
<data name="GroupSwitchModeStatusDisabled" xml:space="preserve">
<value>Select multiple windows to enable.</value>
</data>
<data name="GroupSwitchModeStatusEnabled" xml:space="preserve">
<value>Group switch mode is enabled.</value>
</data>
<data name="GroupSwitchModeTitle" xml:space="preserve">
<value>Group switch mode:</value>
</data>
<data name="GroupSwitchModeWindows" xml:space="preserve">
<value>Windows</value>
<comment>Column Header of list, simply refers to available windows to be cloned</comment>
</data>
<data name="Homepage" xml:space="preserve">
<value>Homepage: www.codeplex.com/ontopreplica.</value>
</data>
<data name="InfoClickForwarding" xml:space="preserve">
<value>Do you want to enable "click forwarding"?</value>
</data>
<data name="InfoClickForwardingContent" xml:space="preserve">
You must run this application on Windows Vista Home Premium or better.</value>
</data>
<data name="ErrorNoDwmTitle" xml:space="preserve">
<value>Desktop Composition unsupported</value>
</data>
<data name="ErrorNoThumbnail" xml:space="preserve">
<value>No thumbnail loaded.</value>
</data>
<data name="ErrorUnableToCreateThumbnail" xml:space="preserve">
<value>Unable to create thumbnail</value>
</data>
<data name="ErrorUnableToFit" xml:space="preserve">
<value>Unable to fit window.</value>
</data>
<data name="ErrorUpdate" xml:space="preserve">
<value>Unable to check for updates.</value>
</data>
<data name="ErrorUpdateContent" xml:space="preserve">
<value>It appears that OnTopReplica wasn't installed using 'ClickOnce'. You'll have to update manually (visit &lt;a href="http://ontopreplica.codeplex.com"&gt;OnTopReplica's homepage&lt;/a&gt;).</value>
</data>
<data name="ErrorUpdateContentGeneric" xml:space="preserve">
<value>OnTopReplica was unable to check whether an updated version is available. Make sure you are connected to the Internet. If you are, the website may be temporarily down.</value>
</data>
<data name="FullscreenMode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="FullscreenModeAlwaysOnTop" xml:space="preserve">
<value>Always on top</value>
</data>
<data name="FullscreenModeAlwaysOnTopTT" xml:space="preserve">
<value>Forces OnTopReplica to stay always on top.</value>
</data>
<data name="FullscreenModeClickThrough" xml:space="preserve">
<value>Click through</value>
</data>
<data name="FullscreenModeClickThroughTT" xml:space="preserve">
<value>OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below.</value>
</data>
<data name="FullscreenModeNormal" xml:space="preserve">
<value>Standard</value>
</data>
<data name="FullscreenModeNormalTT" xml:space="preserve">
<value>Behaves like an ordinary window. You can bring other windows above OnTopReplica.</value>
</data>
<data name="FullscreenTitle" xml:space="preserve">
<value>OnTopReplica fullscreen</value>
</data>
<data name="GroupSwitchModeDisableButton" xml:space="preserve">
<value>Disable</value>
</data>
<data name="GroupSwitchModeEnableButton" xml:space="preserve">
<value>Enable Group mode</value>
</data>
<data name="GroupSwitchModeStatusDisabled" xml:space="preserve">
<value>Select multiple windows to enable.</value>
</data>
<data name="GroupSwitchModeStatusEnabled" xml:space="preserve">
<value>Group switch mode is enabled.</value>
</data>
<data name="GroupSwitchModeTitle" xml:space="preserve">
<value>Group switch mode:</value>
</data>
<data name="GroupSwitchModeWindows" xml:space="preserve">
<value>Windows</value>
<comment>Column Header of list, simply refers to available windows to be cloned</comment>
</data>
<data name="Homepage" xml:space="preserve">
<value>Homepage: www.codeplex.com/ontopreplica.</value>
</data>
<data name="InfoClickForwarding" xml:space="preserve">
<value>Do you want to enable "click forwarding"?</value>
</data>
<data name="InfoClickForwardingContent" xml:space="preserve">
<value>If this mode is enabled, OnTopReplica will forward all left mouse clicks to the window that is being cloned (this will allow you to do basic mouse operations on the cloned window without having to activate it).
To exit this mode, push ESC.</value>
</data>
<data name="InfoClickForwardingTitle" xml:space="preserve">
<value>Click forwarding</value>
</data>
<data name="InfoClickThrough" xml:space="preserve">
<value>Enable Click-Through mode?</value>
</data>
<data name="InfoClickThroughDetails" xml:space="preserve">
<value>Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent.</value>
</data>
<data name="InfoClickThroughInformation" xml:space="preserve">
To exit this mode, push ESC.</value>
</data>
<data name="InfoClickForwardingTitle" xml:space="preserve">
<value>Click forwarding</value>
</data>
<data name="InfoClickThrough" xml:space="preserve">
<value>Enable Click-Through mode?</value>
</data>
<data name="InfoClickThroughDetails" xml:space="preserve">
<value>Click-through only works if it has been enabled in the Resize submenu and if the window is semi-transparent.</value>
</data>
<data name="InfoClickThroughInformation" xml:space="preserve">
<value>In this mode the fullscreen window will behave as a partially transparent overlay, allowing you to click on the other windows behind it.
To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon).</value>
</data>
<data name="InfoClickThroughNo" xml:space="preserve">
To return to normal mode anytime, activate OnTopReplica by clicking on the task bar (or the tray icon).</value>
</data>
<data name="InfoClickThroughNo" xml:space="preserve">
<value>No, thank you.
You can enable click-through later</value>
</data>
<data name="InfoClickThroughOk" xml:space="preserve">
<value>Use Click-Through</value>
</data>
<data name="InfoClickThroughTitle" xml:space="preserve">
<value>Click-Through mode</value>
</data>
<data name="InfoUpdated" xml:space="preserve">
<value>OnTopReplica has been updated.</value>
</data>
<data name="InfoUpdatedContent" xml:space="preserve">
<value>In order to use the updated version of OnTopReplica you'll have to restart the application.</value>
</data>
<data name="InfoUpdatedTitle" xml:space="preserve">
<value>Update successful</value>
</data>
<data name="InfoUpToDate" xml:space="preserve">
<value>OnTopReplica is up to date.</value>
</data>
<data name="InfoUpToDateTitle" xml:space="preserve">
<value>No update available</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="MenuAbout" xml:space="preserve">
<value>About...</value>
</data>
<data name="MenuAboutTT" xml:space="preserve">
<value>Hides the main window and displays the "about" box.</value>
</data>
<data name="MenuAdvanced" xml:space="preserve">
<value>Advanced</value>
</data>
<data name="MenuChrome" xml:space="preserve">
<value>Show window border</value>
</data>
<data name="MenuChromeTT" xml:space="preserve">
<value>Toggles the display of the window border.</value>
</data>
<data name="MenuClickForwarding" xml:space="preserve">
<value>Enable Click forwarding</value>
</data>
<data name="MenuClickForwardingTT" xml:space="preserve">
<value>Enable "click forwarding" to the cloned window.</value>
</data>
<data name="MenuClickThrough" xml:space="preserve">
<value>Enable Click-Through</value>
</data>
<data name="MenuClickThroughTT" xml:space="preserve">
<value>OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below.</value>
</data>
<data name="MenuClose" xml:space="preserve">
<value>Close</value>
</data>
<data name="MenuCloseTT" xml:space="preserve">
<value>Closes OnTopReplica.</value>
</data>
<data name="MenuFitDouble" xml:space="preserve">
<value>2:1 Double</value>
</data>
<data name="MenuFitFullscreen" xml:space="preserve">
<value>Fullscreen</value>
</data>
<data name="MenuFitHalf" xml:space="preserve">
<value>1:2 Half</value>
</data>
<data name="MenuFitOriginal" xml:space="preserve">
<value>1:1 Fit to window</value>
</data>
<data name="MenuFitQuarter" xml:space="preserve">
<value>1:4 Quarter</value>
</data>
<data name="MenuGlass" xml:space="preserve">
<value>Glass</value>
</data>
<data name="MenuGlassTT" xml:space="preserve">
<value>Toggles "glass mode" on and off.</value>
</data>
<data name="MenuGroupSwitch" xml:space="preserve">
<value>Group Switch mode</value>
</data>
<data name="MenuGroupSwitchTT" xml:space="preserve">
<value>OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground.</value>
</data>
<data name="MenuOp100" xml:space="preserve">
<value>100% (opaque)</value>
</data>
<data name="MenuOp100TT" xml:space="preserve">
<value>Sets OnTopReplica to be completely opaque.</value>
</data>
<data name="MenuOp25" xml:space="preserve">
<value>25%</value>
</data>
<data name="MenuOp25TT" xml:space="preserve">
<value>Sets OnTopReplica to 25% opacity.</value>
</data>
<data name="MenuOp50" xml:space="preserve">
<value>50%</value>
</data>
<data name="MenuOp50TT" xml:space="preserve">
<value>Sets OnTopReplica to 50% opacity.</value>
</data>
<data name="MenuOp75" xml:space="preserve">
<value>75%</value>
</data>
<data name="MenuOp75TT" xml:space="preserve">
<value>Sets OnTopReplica to 75% opacity.</value>
</data>
<data name="MenuOpacity" xml:space="preserve">
<value>Opacity</value>
</data>
<data name="MenuOpen" xml:space="preserve">
<value>Open</value>
</data>
<data name="MenuOpenTT" xml:space="preserve">
<value>Displays OnTopReplica.</value>
</data>
<data name="MenuPosBottomLeft" xml:space="preserve">
<value>Bottom Left</value>
</data>
<data name="MenuPosBottomRight" xml:space="preserve">
<value>Bottom Right</value>
</data>
<data name="MenuPosCenter" xml:space="preserve">
<value>Center</value>
</data>
<data name="MenuPosDisabled" xml:space="preserve">
<value>Disabled</value>
</data>
<data name="MenuPosition" xml:space="preserve">
<value>Position lock</value>
</data>
<data name="MenuPositionTT" xml:space="preserve">
<value>Automatically position OnTopReplica on the current screen.</value>
</data>
<data name="MenuPosTopLeft" xml:space="preserve">
<value>Top Left</value>
</data>
<data name="MenuPosTopRight" xml:space="preserve">
<value>Top Right</value>
</data>
<data name="MenuQuitFullscreen" xml:space="preserve">
<value>Quit fullscreen mode</value>
</data>
<data name="MenuRecall" xml:space="preserve">
<value>Recall last position and size</value>
</data>
<data name="MenuRecallTT" xml:space="preserve">
<value>Toggles whether OnTopReplica should store its last position and size and use them when it is restarted.</value>
</data>
<data name="MenuReduce" xml:space="preserve">
<value>Minimize</value>
</data>
<data name="MenuReduceTT" xml:space="preserve">
<value>Minimizes OnTopReplica to the task bar (or the tray).</value>
</data>
<data name="MenuRegion" xml:space="preserve">
<value>Select region...</value>
</data>
<data name="MenuRegionTT" xml:space="preserve">
<value>Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail.</value>
</data>
<data name="MenuReset" xml:space="preserve">
<value>Reset window</value>
</data>
<data name="MenuResetTT" xml:space="preserve">
<value>Resets OnTopReplica settings and its main window.</value>
</data>
<data name="MenuResize" xml:space="preserve">
<value>Resize</value>
</data>
<data name="MenuSwitch" xml:space="preserve">
<value>Switch to window</value>
</data>
<data name="MenuSwitchTT" xml:space="preserve">
<value>Switches to the source window and hides OnTopReplica.</value>
</data>
<data name="MenuWindows" xml:space="preserve">
<value>Select window</value>
</data>
<data name="MenuWindowsNone" xml:space="preserve">
<value>- none -</value>
</data>
<data name="MenuWindowsTT" xml:space="preserve">
<value>Displays a list of window you can select as thumbnail source.</value>
</data>
<data name="MenuWindowsWholeRegion" xml:space="preserve">
<value>- whole -</value>
</data>
<data name="RegionsCurrentRegion" xml:space="preserve">
<value>Current region:</value>
</data>
<data name="RegionsDeleteButton" xml:space="preserve">
<value>Delete</value>
</data>
<data name="RegionsDoneButton" xml:space="preserve">
<value>Done</value>
</data>
<data name="RegionsHeight" xml:space="preserve">
<value>Height</value>
</data>
<data name="RegionsResetButton" xml:space="preserve">
<value>Reset</value>
</data>
<data name="RegionsSaveButton" xml:space="preserve">
<value>Save</value>
</data>
<data name="RegionsStoredRegions" xml:space="preserve">
<value>Stored regions</value>
</data>
<data name="RegionsTitle" xml:space="preserve">
<value>Regions:</value>
</data>
<data name="RegionsWidth" xml:space="preserve">
<value>Width</value>
</data>
<data name="RightClick" xml:space="preserve">
<value>Right-click here to start...</value>
</data>
<data name="Slogan" xml:space="preserve">
<value>A lightweight, real-time, always on top thumbnail of a window of your choice.</value>
</data>
<data name="UpdateDisclaimer" xml:space="preserve">
<value>OnTopReplica automatically checks for updates. No information is logged at any point.</value>
</data>
<data name="UpdateNow" xml:space="preserve">
<value>Update now!</value>
</data>
You can enable click-through later</value>
</data>
<data name="InfoClickThroughOk" xml:space="preserve">
<value>Use Click-Through</value>
</data>
<data name="InfoClickThroughTitle" xml:space="preserve">
<value>Click-Through mode</value>
</data>
<data name="InfoUpdated" xml:space="preserve">
<value>OnTopReplica has been updated.</value>
</data>
<data name="InfoUpdatedContent" xml:space="preserve">
<value>In order to use the updated version of OnTopReplica you'll have to restart the application.</value>
</data>
<data name="InfoUpdatedTitle" xml:space="preserve">
<value>Update successful</value>
</data>
<data name="InfoUpToDate" xml:space="preserve">
<value>OnTopReplica is up to date.</value>
</data>
<data name="InfoUpToDateTitle" xml:space="preserve">
<value>No update available</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="MenuAbout" xml:space="preserve">
<value>About...</value>
</data>
<data name="MenuAboutTT" xml:space="preserve">
<value>Hides the main window and displays the "about" box.</value>
</data>
<data name="MenuAdvanced" xml:space="preserve">
<value>Advanced</value>
</data>
<data name="MenuChrome" xml:space="preserve">
<value>Show window border</value>
</data>
<data name="MenuChromeTT" xml:space="preserve">
<value>Toggles the display of the window border.</value>
</data>
<data name="MenuClickForwarding" xml:space="preserve">
<value>Enable Click forwarding</value>
</data>
<data name="MenuClickForwardingTT" xml:space="preserve">
<value>Enable "click forwarding" to the cloned window.</value>
</data>
<data name="MenuClickThrough" xml:space="preserve">
<value>Enable Click-Through</value>
</data>
<data name="MenuClickThroughTT" xml:space="preserve">
<value>OnTopReplica will behave like a transparent overlay that lets your clicks through to the windows below.</value>
</data>
<data name="MenuClose" xml:space="preserve">
<value>Close</value>
</data>
<data name="MenuCloseTT" xml:space="preserve">
<value>Closes OnTopReplica.</value>
</data>
<data name="MenuFitDouble" xml:space="preserve">
<value>2:1 Double</value>
</data>
<data name="MenuFitFullscreen" xml:space="preserve">
<value>Fullscreen</value>
</data>
<data name="MenuFitHalf" xml:space="preserve">
<value>1:2 Half</value>
</data>
<data name="MenuFitOriginal" xml:space="preserve">
<value>1:1 Fit to window</value>
</data>
<data name="MenuFitQuarter" xml:space="preserve">
<value>1:4 Quarter</value>
</data>
<data name="MenuGlass" xml:space="preserve">
<value>Glass</value>
</data>
<data name="MenuGlassTT" xml:space="preserve">
<value>Toggles "glass mode" on and off.</value>
</data>
<data name="MenuGroupSwitch" xml:space="preserve">
<value>Group Switch mode</value>
</data>
<data name="MenuGroupSwitchTT" xml:space="preserve">
<value>OnTopReplica will automatically clone a window from an user defined group, switching to the one least recently activated to the foreground.</value>
</data>
<data name="MenuOp100" xml:space="preserve">
<value>100% (opaque)</value>
</data>
<data name="MenuOp100TT" xml:space="preserve">
<value>Sets OnTopReplica to be completely opaque.</value>
</data>
<data name="MenuOp25" xml:space="preserve">
<value>25%</value>
</data>
<data name="MenuOp25TT" xml:space="preserve">
<value>Sets OnTopReplica to 25% opacity.</value>
</data>
<data name="MenuOp50" xml:space="preserve">
<value>50%</value>
</data>
<data name="MenuOp50TT" xml:space="preserve">
<value>Sets OnTopReplica to 50% opacity.</value>
</data>
<data name="MenuOp75" xml:space="preserve">
<value>75%</value>
</data>
<data name="MenuOp75TT" xml:space="preserve">
<value>Sets OnTopReplica to 75% opacity.</value>
</data>
<data name="MenuOpacity" xml:space="preserve">
<value>Opacity</value>
</data>
<data name="MenuOpen" xml:space="preserve">
<value>Open</value>
</data>
<data name="MenuOpenTT" xml:space="preserve">
<value>Displays OnTopReplica.</value>
</data>
<data name="MenuPosBottomLeft" xml:space="preserve">
<value>Bottom Left</value>
</data>
<data name="MenuPosBottomRight" xml:space="preserve">
<value>Bottom Right</value>
</data>
<data name="MenuPosCenter" xml:space="preserve">
<value>Center</value>
</data>
<data name="MenuPosDisabled" xml:space="preserve">
<value>Disabled</value>
</data>
<data name="MenuPosition" xml:space="preserve">
<value>Position lock</value>
</data>
<data name="MenuPositionTT" xml:space="preserve">
<value>Automatically position OnTopReplica on the current screen.</value>
</data>
<data name="MenuPosTopLeft" xml:space="preserve">
<value>Top Left</value>
</data>
<data name="MenuPosTopRight" xml:space="preserve">
<value>Top Right</value>
</data>
<data name="MenuQuitFullscreen" xml:space="preserve">
<value>Quit fullscreen mode</value>
</data>
<data name="MenuRecall" xml:space="preserve">
<value>Recall last position and size</value>
</data>
<data name="MenuRecallTT" xml:space="preserve">
<value>Toggles whether OnTopReplica should store its last position and size and use them when it is restarted.</value>
</data>
<data name="MenuReduce" xml:space="preserve">
<value>Minimize</value>
</data>
<data name="MenuReduceTT" xml:space="preserve">
<value>Minimizes OnTopReplica to the task bar (or the tray).</value>
</data>
<data name="MenuRegion" xml:space="preserve">
<value>Select region...</value>
</data>
<data name="MenuRegionTT" xml:space="preserve">
<value>Switches to "region mode", that allows you to select a limited region of the source's window as thumbnail.</value>
</data>
<data name="MenuReset" xml:space="preserve">
<value>Reset window</value>
</data>
<data name="MenuResetTT" xml:space="preserve">
<value>Resets OnTopReplica settings and its main window.</value>
</data>
<data name="MenuResize" xml:space="preserve">
<value>Resize</value>
</data>
<data name="MenuSwitch" xml:space="preserve">
<value>Switch to window</value>
</data>
<data name="MenuSwitchTT" xml:space="preserve">
<value>Switches to the source window and hides OnTopReplica.</value>
</data>
<data name="MenuWindows" xml:space="preserve">
<value>Select window</value>
</data>
<data name="MenuWindowsNone" xml:space="preserve">
<value>- none -</value>
</data>
<data name="MenuWindowsTT" xml:space="preserve">
<value>Displays a list of window you can select as thumbnail source.</value>
</data>
<data name="MenuWindowsWholeRegion" xml:space="preserve">
<value>- whole -</value>
</data>
<data name="RegionsCurrentRegion" xml:space="preserve">
<value>Current region:</value>
</data>
<data name="RegionsDeleteButton" xml:space="preserve">
<value>Delete</value>
</data>
<data name="RegionsDoneButton" xml:space="preserve">
<value>Done</value>
</data>
<data name="RegionsHeight" xml:space="preserve">
<value>Height</value>
</data>
<data name="RegionsResetButton" xml:space="preserve">
<value>Reset</value>
</data>
<data name="RegionsSaveButton" xml:space="preserve">
<value>Save</value>
</data>
<data name="RegionsStoredRegions" xml:space="preserve">
<value>Stored regions</value>
</data>
<data name="RegionsTitle" xml:space="preserve">
<value>Regions:</value>
</data>
<data name="RegionsWidth" xml:space="preserve">
<value>Width</value>
</data>
<data name="RightClick" xml:space="preserve">
<value>Right-click here to start...</value>
</data>
<data name="Slogan" xml:space="preserve">
<value>A lightweight, real-time, always on top thumbnail of a window of your choice.</value>
</data>
<data name="UpdateDisclaimer" xml:space="preserve">
<value>OnTopReplica automatically checks for updates. No information is logged at any point.</value>
</data>
<data name="UpdateNow" xml:space="preserve">
<value>Update now!</value>
</data>
<data name="MenuSettings" xml:space="preserve">
<value>Settings...</value>
</data>
<data name="MenuSettingsTT" xml:space="preserve">
<value>Displays the settings panel.</value>
</data>
<data name="MenuRestoreLast" xml:space="preserve">
<value>Restore last cloned window</value>
</data>
<data name="MenuRestoreLastTT" xml:space="preserve">
<value>When enabled, OnTopReplica will attempt to restore the last cloned window on start up.</value>
</data>
</root>