Added the ChannelMaskPlug.
Added the ChannelMaskPlugValueWidget.
Added test benches for both the plug and widget.

This plug and widget provide a way of choosing a subset of channels from the channels available from an input's channels. The plug provides a method for intersecting it's current selection of channels against a vector of other channels.
Added the static channelIndex method to the ChannelMaskPlug along with test cases and bindings.
Removed an unwanted print statement in the ImageReaderTest case.
Merge branch 'ImageReaderTestCleanup' into ChannelMaskForNodes
Changed the ChannelMaskPlugValueWidget to allow no channels to be selected.
Picking up the downstream changes that allow a ChannelMaskPlugValueWidget to have no channels as a selection (for testing purposes)

Merge branch 'ChannelMaskPlug' into ChannelMaskForNodes
Included the use of the ChannelMaskPlug into the ChannelDataProcessor base class to add a widget that allows only particular channels to be modified. To implement this a new method called channelEnabled has been added to the ImageNode to provide derived classes a way of dictating which channels are enabled. All image nodes have been brought inline to use this convention. A few TODOs in the Grade node that relied on this feature have been completed and removed as a result.
Corrected todo tag.
Changed the channelMask bindings to allow an IECore.StringVectorData to be used as the input.
Changed the ChannelMaskPlug, it's UI and test case to use "." as the separator for layers and their channels.
Required update for testing
Merge branch 'ChannelMaskPlug' into ChannelMaskForNodes
Fixed a bug.
Fixed highlighting bugs.

Widgets inside a highlighted tab would incorrectly display an inherited highlight state. This could be seen when dragging a node into the node editor with either nested tabs or a nested VectorData Widget. Fixed this by making the Widget css more specific (not selecting distant children of highlighted widgets) and overriding VectorDataWidget.setHighlighted to store the highlighted state explicity on the QTableView where it could be picked up easily by the stylesheet.
Fixed creation of nodes within Boxes.

Previously they were added below the root of the script rather than inside the box.
Fixed PathPlugValueWidget bug where it would attempt to change the value of a read only plug.
Fixed PathWidget bug where it would still do autocompletion and popup menus even when non-editable.
Added "user" plug to all nodes.

This provides a CompoundPlug where users can safely put any custom plugs they want, without fear of name clashes with existing or future standard gaffer plugs.
Added Box plug promotion API.

Promotion takes a plug on a node inside a Box, creates a matching plug on the Box itself, and uses that to drive the input to the internal plug. Box methods are provided to query whether or not can be promoted, whether or not one has been promoted, and to promote one. Once we have UI support for it this will form the basis for users to build macros/gizmos/thingos.
Added basic UI for Node::userPlug().

This just displays the plugs and provides a menu for adding a few plug types. Later we'll need to add a dialogue for specifying new plug properties (min/max/flags etc) and for modifying the layout and widgets.
Adding menu items for plug promotion.

The right click popup menu for plugs contains a "Promote to Box" entry which allows users to promote the plug to the box level.