#region CPL License
/*
Nuclex Framework
Copyright (C) 2002-2010 Nuclex Development Labs
This library is free software; you can redistribute it and/or
modify it under the terms of the IBM Common Public License as
published by the IBM Corporation; either version 1.0 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
IBM Common Public License for more details.
You should have received a copy of the IBM Common Public
License along with this library
*/
#endregion
using System;
using System.Collections.Generic;
namespace Nuclex.UserInterface.Visuals.Flat.Renderers {
/// Renders choice controls in a traditional flat style
public class FlatChoiceControlRenderer :
IFlatControlRenderer {
///
/// Renders the specified control using the provided graphics interface
///
/// Control that will be rendered
///
/// Graphics interface that will be used to draw the control
///
public void Render(
Controls.Desktop.ChoiceControl control, IFlatGuiGraphics graphics
) {
// Determine the index of the state we're going to display
int stateIndex = (control.Selected ? 4 : 0);
if(control.Enabled) {
if(control.Depressed) {
stateIndex += 3;
} else if(control.MouseHovering) {
stateIndex += 2;
} else {
stateIndex += 1;
}
}
// Get the pixel coordinates of the region covered by the control on
// the screen
RectangleF controlBounds = control.GetAbsoluteBounds();
float width = controlBounds.Width;
// Now adjust the bounds to a square of height x height pixels so we can
// render the graphical portion of the choice control
controlBounds.Width = controlBounds.Height;
graphics.DrawElement(states[stateIndex], controlBounds);
// If the choice has text assigned to it, render it too
if(!string.IsNullOrEmpty(control.Text)) {
// Restore the original width, then subtract the region that was covered by
// the graphical portion of the control.
controlBounds.Width = width - controlBounds.Height;
controlBounds.X += controlBounds.Height;
// Draw the text that was assigned to the choice control
graphics.DrawString(states[stateIndex], controlBounds, control.Text);
}
}
/// Names of the states the choice control can be in
///
/// Storing this as full strings instead of building them dynamically prevents
/// any garbage from forming during rendering.
///
private static readonly string[] states = new string[] {
"radio.off.disabled",
"radio.off.normal",
"radio.off.highlighted",
"radio.off.depressed",
"radio.on.disabled",
"radio.on.normal",
"radio.on.highlighted",
"radio.on.depressed"
};
}
} // namespace Nuclex.UserInterface.Visuals.Flat.Renderers