diff --git a/src/TestCentric/testcentric.gui/Elements/ButtonElement.cs b/src/TestCentric/testcentric.gui/Elements/ControlElements/ButtonElement.cs
similarity index 94%
rename from src/TestCentric/testcentric.gui/Elements/ButtonElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ControlElements/ButtonElement.cs
index 736bca28a..2d2dcd243 100644
--- a/src/TestCentric/testcentric.gui/Elements/ButtonElement.cs
+++ b/src/TestCentric/testcentric.gui/Elements/ControlElements/ButtonElement.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT License. See LICENSE file in root directory.
// ***********************************************************************
+using System;
using System.Windows.Forms;
namespace TestCentric.Gui.Elements
@@ -10,6 +11,7 @@ namespace TestCentric.Gui.Elements
///
/// ButtonElement wraps a Button as an ICommand.
///
+ [Obsolete("No longer used", true)]
public class ButtonElement : ControlElement, ICommand
{
private Button _button;
diff --git a/src/TestCentric/testcentric.gui/Elements/CheckBoxElement.cs b/src/TestCentric/testcentric.gui/Elements/ControlElements/CheckBoxElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/CheckBoxElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ControlElements/CheckBoxElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/ControlElement.cs b/src/TestCentric/testcentric.gui/Elements/ControlElements/ControlElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/ControlElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ControlElements/ControlElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/ListBoxElement.cs b/src/TestCentric/testcentric.gui/Elements/ControlElements/ListBoxElement.cs
similarity index 90%
rename from src/TestCentric/testcentric.gui/Elements/ListBoxElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ControlElements/ListBoxElement.cs
index a969eda19..53d06c3c0 100644
--- a/src/TestCentric/testcentric.gui/Elements/ListBoxElement.cs
+++ b/src/TestCentric/testcentric.gui/Elements/ControlElements/ListBoxElement.cs
@@ -1,8 +1,9 @@
-// ***********************************************************************
+// ***********************************************************************
// Copyright (c) Charlie Poole and TestCentric contributors.
// Licensed under the MIT License. See LICENSE file in root directory.
// ***********************************************************************
+using System;
using System.Windows.Forms;
namespace TestCentric.Gui.Elements
@@ -11,6 +12,7 @@ namespace TestCentric.Gui.Elements
/// ListBoxElement wraps a ListBox that contains string items
/// or items that implement ToString() in a useful way.
///
+ [Obsolete("No longer used", true)]
public class ListBoxElement : ControlElement, IListBox
{
private ListBox _listBox;
diff --git a/src/TestCentric/testcentric.gui/Elements/TabSelector.cs b/src/TestCentric/testcentric.gui/Elements/ControlElements/TabSelector.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/TabSelector.cs
rename to src/TestCentric/testcentric.gui/Elements/ControlElements/TabSelector.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/IListBox.cs b/src/TestCentric/testcentric.gui/Elements/IListBox.cs
index 7c5dfc309..5e76ebe51 100644
--- a/src/TestCentric/testcentric.gui/Elements/IListBox.cs
+++ b/src/TestCentric/testcentric.gui/Elements/IListBox.cs
@@ -1,8 +1,9 @@
-// ***********************************************************************
+// ***********************************************************************
// Copyright (c) Charlie Poole and TestCentric contributors.
// Licensed under the MIT License. See LICENSE file in root directory.
// ***********************************************************************
+using System;
using System.Windows.Forms;
namespace TestCentric.Gui.Elements
@@ -12,6 +13,7 @@ namespace TestCentric.Gui.Elements
/// representing a ListBox containing string items or
/// items that implement ToString() in a useful way.
///
+ [Obsolete("No longer used", true)]
public interface IListBox : IControlElement
{
ListBox.ObjectCollection Items { get; }
diff --git a/src/TestCentric/testcentric.gui/Elements/README.md b/src/TestCentric/testcentric.gui/Elements/README.md
new file mode 100644
index 000000000..bfced7669
--- /dev/null
+++ b/src/TestCentric/testcentric.gui/Elements/README.md
@@ -0,0 +1,119 @@
+# What are Elements?
+
+In developing the GUI under `System.Windows.Forms` with an MVP architecture, I wanted to make it easier to convert from Windows Forms to another platform in the future. UI Elements are designed to do that by providing an extra level of isolation between SWF and the presenters.
+
+Each UI Element wraps one or more Windows items. Elements are created by the View, which contains properties that expose an interface for use by the Presenter. In general, the Presenter only uses these interfaces.
+
+For example, various means of running tests are provided in the GUI. Each of these is represented in a View and seen by a Presenter as a property of Type `ICommand`. Some of these commands are provided by SWF `Button` controls, some by `ToolStripItems`, some by context menus, etc. As a result, we are able to change the visual representation in various ways without affecting Presenter logic.
+
+In the current implementation, there are two separate hierarchies of UI Elements: one for those that wrap SWF `Controls`, and one for `ToolStripItems`. Originally, we had a third hierarchy to represent SWF MenuItems, but that was eliminated after we converted to the use of `ToolStripMenuItems`.
+
+**NOTE: Some items below are indicated as being Obsolete. They will be removed from this page once the code itself is removed.
+
+## Interfaces
+
+### IViewElement
+
+`IViewElement` interface is implemented by all UI elements, either directly or indirecly. It provides the properties `Enabled`, `Visible` and `Text` and the method `InvokeIfRequired()`, which allows the Presenter to more easily access and modify properties created on the UI thread.
+
+### IChecked
+
+`IChecked` extends `IViewElement` to add a `Checked` property and a `CheckedChanged` event.
+
+### ICommand
+
+`ICommand` extends `IViewElement` to add an `Execute` event.
+
+### IControlElement
+
+`IControlElement` is a bit of an anomaly. Unlike other interfaces, it may only be used by elements that are based on Windows Controls. It extends `IViewElement` to add properties `Location`, `Size`, `ClientSize`, `ContextMenu` and `ContextMenuStrip`.
+
+**NOTE:** The `ContextMenu` property returns a Windows `Menu` instance and `ContextMenuStrip` returns a `ToolStripDropDownMenu`, both of these exposing the underlying Windows implementation. This interface and its use will be reviewed in the future.
+
+### IListBox
+
+`IListBox` extends `IControlElement` to provide the properties `Items` and `SelectedItems`, event `DoubleClick` and methods `Add` and `Remove`. It exposed a great deal of the underlying Windows implementation and is no longer used. It is now marked as Obsolete.
+
+### IMultiSelection
+
+`IMultiSelection` extends IViewElement to provide a `SelectedItems` property and `SelectionChanged` event.
+
+### IPopup
+
+`IPopup` extends `IToolStripMenu` to add the `Popup` event.
+
+### ISelection
+
+`ISelection` extends `IViewElement` to add the properties `SelectedIndex` and `SelectedItem`, the `SelectionChanged` event and the `Refresh() method.
+
+### IToolStripMenu
+
+`IToolStripMenu` extends `IViewElement` to add a `MenuItems` property returning a colllection of Windows `ToolStripItems`.
+
+**NOTE:** The exposure of the underlying implementation by the `MenuItems` property has proven necessary in order to allow the Presenter create some menus dynamically. We may review this in the future.
+
+### IToolTip
+
+`IToolTip` is an optional interface, which may be implemented by any element able to get and set its own tooltip text. It provides a single property, `ToolTipText`. It is implemented by our `ToolTipElement` class, making it available to all our tooltip elements.
+
+## Control Elements
+
+### ControlElement
+
+`ControlElement` may be used directly to wrap any Windows `Control`. It is also used as a base class for control elements with added capabilities. It implements `IControlElement`.
+
+### ButtonElement
+
+A `ButtonElement` wraps a Windows `Button` control and implements `ICommand`. The class is no longer in use and is marked as Obsolete.
+
+### CheckBoxElement
+
+A `CheckBoxElement` wraps a Windows `CheckBox` control and implements `IChecked`. Although Windows still uses the term "checked," the visual display may or may not use a check mark.
+
+### ListBoxElement
+
+A `ListBoxElement` wraps a Windows `ListBox` control and implements `IListBox`. The class is no longer in use and is marked as Obsolete.
+
+### TabSelector
+
+A `TabSelector` element wraps a Windows `TabControl` and implements `ISelection`.
+
+## ToolStripItem Elements
+
+### ToolStripElement
+
+A `ToolStripElement` wraps any Windows `ToolStripItem` and implements `IViewElement` and `IToolTip`. It may be used directly in a View and also serves as the base class for ToolStrip elements with additional capabilities.
+
+### CheckedMenuElement
+
+`CheckedMenuELement` extends `ToolStripMenuElement` to implement `IChecked`.
+
+### CheckedToolStripMenuGroup
+
+`CheckedToolStripMenuGroup` wraps a set of Windows `ToolStripMenuItems` and implements `ISelection`. All wrapped items must be on the same `ToolStrip`.
+
+### CommandMenuElement
+
+`CommandMenuElement` extends `ToolStripMenuElement` to implement `ICommand`. This element should only be used for a menu item with no descendants, which causes an action.
+
+### MultiCheckedToolStripButtonGroup
+
+`MultiCheckedToolStripButtonGroup` wraps a set of Windows `ToolStripButtons` and implements `IMultiSelection`.
+
+### PopupMenuElement
+
+`PopupMenuElement` extends `ToolStripMenuElement` to implement `IPopup`.
+
+### SplitButtonElement
+
+`SplitButtonElement` wraps a Windows `ToolStripSplitButton` and implements `ICommand`. It is no longer used and is marked as Obsolete.
+
+### ToolStripButtonElement
+
+`ToolStripButtonElement` wraps a Windows `ToolStripButton` and implements both `IChecked` and `IChanged`.
+
+### ToolStripMenuElement
+
+`ToolStripMenuElement` wraps a Windows `ToolStripMenuItem`, extending the base class to provide a collection of subordinate Windows menu items.
+
+**NOTE:** This direct exposure of the underlying Windows implementation is contrary to the general intent of UI elements, but is done as a matter of expediency. We will review this in the future.
diff --git a/src/TestCentric/testcentric.gui/Elements/CheckedMenuElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/CheckedMenuElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/CheckedMenuElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/CheckedMenuElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/CheckedToolStripMenuGroup.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/CheckedToolStripMenuGroup.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/CheckedToolStripMenuGroup.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/CheckedToolStripMenuGroup.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/CommandMenuElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/CommandMenuElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/CommandMenuElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/CommandMenuElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/MultiCheckedToolStripButtonGroup.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/MultiCheckedToolStripButtonGroup.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/MultiCheckedToolStripButtonGroup.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/MultiCheckedToolStripButtonGroup.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/PopupMenuElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/PopupMenuElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/PopupMenuElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/PopupMenuElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/SplitButtonElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/SplitButtonElement.cs
similarity index 84%
rename from src/TestCentric/testcentric.gui/Elements/SplitButtonElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/SplitButtonElement.cs
index 9e73cf336..fec46160a 100644
--- a/src/TestCentric/testcentric.gui/Elements/SplitButtonElement.cs
+++ b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/SplitButtonElement.cs
@@ -1,8 +1,9 @@
-// ***********************************************************************
+// ***********************************************************************
// Copyright (c) Charlie Poole and TestCentric contributors.
// Licensed under the MIT License. See LICENSE file in root directory.
// ***********************************************************************
+using System;
using System.Windows.Forms;
namespace TestCentric.Gui.Elements
@@ -10,6 +11,7 @@ namespace TestCentric.Gui.Elements
///
/// SplitButtonElement extends ToolStripElement for use with a SplitButton.
///
+ [Obsolete("No longer used", true)]
public class SplitButtonElement : ToolStripElement, ICommand
{
public SplitButtonElement(ToolStripSplitButton button) : base(button)
diff --git a/src/TestCentric/testcentric.gui/Elements/ToolStripButtonElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripButtonElement.cs
similarity index 94%
rename from src/TestCentric/testcentric.gui/Elements/ToolStripButtonElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripButtonElement.cs
index 024577e8b..413fa7592 100644
--- a/src/TestCentric/testcentric.gui/Elements/ToolStripButtonElement.cs
+++ b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripButtonElement.cs
@@ -8,7 +8,7 @@
namespace TestCentric.Gui.Elements
{
///
- /// ButtonElement wraps a Button as an ICommand.
+ /// ToolStripButtonElement wraps a Windows ToolStripButton.
///
public class ToolStripButtonElement : ToolStripElement, ICommand, IChecked
{
diff --git a/src/TestCentric/testcentric.gui/Elements/ToolStripElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/ToolStripElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripElement.cs
diff --git a/src/TestCentric/testcentric.gui/Elements/ToolStripMenuElement.cs b/src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripMenuElement.cs
similarity index 100%
rename from src/TestCentric/testcentric.gui/Elements/ToolStripMenuElement.cs
rename to src/TestCentric/testcentric.gui/Elements/ToolStripElements/ToolStripMenuElement.cs