/Controle.Silverlight/Conversores/ConversorValor.cs

# · C# · 326 lines · 218 code · 57 blank · 51 comment · 19 complexity · 5fbde44c4b4c210dadcb777dcd55f6fe MD5 · raw file

  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Windows;
  6. using System.Windows.Data;
  7. using System.Windows.Media;
  8. namespace BrasilFramework.Controle.Silverlight.Conversores
  9. {
  10. internal class Objeto
  11. {
  12. /// <summary>
  13. /// Ler o valor de uma propriedade de um objeto
  14. /// </summary>
  15. /// <param name="objeto">Objeto</param>
  16. /// <param name="propriedade">Nome da propriedade</param>
  17. /// <returns>Valor da propriedade</returns>
  18. public static PropertyInfo LerPropriedade(object objeto, string propriedade)
  19. {
  20. if (objeto == null)
  21. return null;
  22. int idx = propriedade.IndexOf('.');
  23. return idx > 0 ?
  24. LerPropriedade(objeto.GetType().GetProperty(propriedade.Remove(idx)).GetValue(objeto, null), propriedade.Substring(idx + 1))
  25. : objeto.GetType().GetProperty(propriedade);
  26. }
  27. /// <summary>
  28. /// Ler o valor de uma propriedade de um objeto
  29. /// </summary>
  30. /// <param name="objeto">Objeto</param>
  31. /// <param name="propriedade">Nome da propriedade</param>
  32. /// <returns>Valor da propriedade</returns>
  33. public static object LerValor(object objeto, string propriedade)
  34. {
  35. if (objeto == null)
  36. return null;
  37. int idx = propriedade.IndexOf('.');
  38. return idx > 0 ?
  39. LerValor(objeto.GetType().GetProperty(propriedade.Remove(idx)).GetValue(objeto, null), propriedade.Substring(idx + 1))
  40. : objeto.GetType().GetProperty(propriedade).GetValue(objeto, null);
  41. }
  42. }
  43. /// <summary>
  44. /// Retorna o primeiro valor diferente de Nulo dentro da lista informada como parâmetro.
  45. /// </summary>
  46. public class CoalesceConverter : IValueConverter
  47. {
  48. #region IValueConverter Members
  49. /// <summary>
  50. /// Retorna o primeiro valor diferente de Nulo dentro da lista informada como parâmetro.
  51. /// </summary>
  52. /// <param name="value">Objeto raiz.</param>
  53. /// <param name="targetType"></param>
  54. /// <param name="parameter">Expressão. Ex.: Cliente.Empresa.Nome:Cliente.Pessoa.Nome. O primeiro valor não nulo deverá ser retornado.</param>
  55. /// <param name="culture"></param>
  56. /// <returns>Primeiro valor diferente de nulo.</returns>
  57. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  58. {
  59. if (parameter == null)
  60. throw new ArgumentNullException("parameter");
  61. var lista = parameter.ToString().Split(':');
  62. return lista.Select(enderecoObjeto => Objeto.LerValor(value, enderecoObjeto)).FirstOrDefault(valor => valor != null);
  63. }
  64. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  65. {
  66. throw new NotImplementedException();
  67. }
  68. #endregion
  69. }
  70. /// <summary>
  71. /// Converte o Objeto em Texto no seguinte formato: "Separador :{NomePropriedadeA, NomePropriedadeB}"
  72. /// </summary>
  73. public class ConversorObjetoTexto : IValueConverter
  74. {
  75. #region IValueConverter Members
  76. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  77. {
  78. if (value == null) return value;
  79. try
  80. {
  81. string parametro = parameter.ToString();
  82. //[0] - Separador entre as propriedades. Ex.: PropriedadeA + Separador + Propriedade2.
  83. string[] listaParametro = parametro.Split(':');
  84. string separador = listaParametro[0];
  85. string[] propriedades = listaParametro[1].Trim().Split(',');
  86. return propriedades.Select(t =>
  87. {
  88. object valor = Objeto.LerValor(value, t.Trim());
  89. if (valor != null && valor.GetType() == typeof(DateTime))
  90. return ((DateTime)valor).ToString("dd/MM/yyyy");
  91. return valor;
  92. })
  93. .Where(valor => valor != null)
  94. .Aggregate(string.Empty, (current, valor) => current + (valor + separador))
  95. .TrimEnd(separador.ToCharArray());
  96. }
  97. catch (Exception)
  98. {
  99. throw new FormatException("Parâmetros inválidos. Ex.: Separador :{NomePropriedadeA, NomePropriedadeB} ");
  100. }
  101. }
  102. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  103. {
  104. throw new NotImplementedException();
  105. }
  106. #endregion
  107. }
  108. /// <summary>
  109. /// Converts the given color to a SolidColorBrush
  110. /// </summary>
  111. public class ColorToSolidColorBrushConverter : IValueConverter
  112. {
  113. #region IValueConverter Members
  114. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  115. {
  116. var c = (Color)value;
  117. return new SolidColorBrush(c);
  118. }
  119. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  120. {
  121. throw new NotImplementedException();
  122. }
  123. #endregion
  124. }
  125. /// <summary>
  126. /// A type converter for converting image offset into render transform
  127. /// </summary>
  128. public class ImageOffsetConverter : IValueConverter
  129. {
  130. #region IValueConverter Members
  131. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  132. {
  133. var dblVal = (double)value;
  134. var tt = new TranslateTransform { Y = dblVal };
  135. return tt;
  136. }
  137. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  138. {
  139. throw new NotImplementedException();
  140. }
  141. #endregion
  142. }
  143. /// <summary>
  144. /// Converts radius to diameter
  145. /// </summary>
  146. public class RadiusToDiameterConverter : IValueConverter
  147. {
  148. #region IValueConverter Members
  149. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  150. {
  151. var dblVal = (double)value;
  152. return (dblVal * 2);
  153. }
  154. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  155. {
  156. throw new NotImplementedException();
  157. }
  158. #endregion
  159. }
  160. /// <summary>
  161. /// Calculates the pointer position
  162. /// </summary>
  163. public class PointerCenterConverter : IValueConverter
  164. {
  165. #region IValueConverter Members
  166. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  167. {
  168. var dblVal = (double)value;
  169. var tg = new TransformGroup();
  170. var rt = new RotateTransform();
  171. var tt = new TranslateTransform { X = dblVal / 2 };
  172. tg.Children.Add(rt);
  173. tg.Children.Add(tt);
  174. return tg;
  175. }
  176. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  177. {
  178. throw new NotImplementedException();
  179. }
  180. #endregion
  181. }
  182. /// <summary>
  183. /// Calculates the range indicator light position
  184. /// </summary>
  185. public class RangeIndicatorLightPositionConverter : IValueConverter
  186. {
  187. #region IValueConverter Members
  188. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  189. {
  190. var dblVal = (double)value;
  191. var tg = new TransformGroup();
  192. var rt = new RotateTransform();
  193. var tt = new TranslateTransform { Y = dblVal };
  194. tg.Children.Add(rt);
  195. tg.Children.Add(tt);
  196. return tg;
  197. }
  198. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  199. {
  200. throw new NotImplementedException();
  201. }
  202. #endregion
  203. }
  204. /// <summary>
  205. /// Converts the given Size to height and width
  206. /// </summary>
  207. public class SizeConverter : IValueConverter
  208. {
  209. #region IValueConverter Members
  210. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  211. {
  212. double i = 0;
  213. var s = (Size)value;
  214. if (parameter.ToString() == "Height")
  215. {
  216. i = s.Height;
  217. }
  218. else if (parameter.ToString() == "Width")
  219. {
  220. i = s.Width;
  221. }
  222. return i;
  223. }
  224. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  225. {
  226. throw new NotImplementedException();
  227. }
  228. #endregion
  229. }
  230. /// <summary>
  231. /// Scaling factor for drawing the glass effect.
  232. /// </summary>
  233. public class GlassEffectWidthConverter : IValueConverter
  234. {
  235. #region IValueConverter Members
  236. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  237. {
  238. var dbl = (double)value;
  239. return (dbl * 2) * 0.94;
  240. }
  241. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  242. {
  243. throw new NotImplementedException();
  244. }
  245. #endregion
  246. }
  247. /// <summary>
  248. /// Converts background color to Gradient effect
  249. /// </summary>
  250. public class BackgroundColorConverter : IValueConverter
  251. {
  252. #region IValueConverter Members
  253. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  254. {
  255. var c = (Color)value;
  256. var radBrush = new RadialGradientBrush();
  257. var g1 = new GradientStop { Offset = 0.982, Color = c };
  258. var g2 = new GradientStop { Color = Color.FromArgb(0xFF, 0xAF, 0xB2, 0xB0) };
  259. radBrush.GradientStops.Add(g1);
  260. radBrush.GradientStops.Add(g2);
  261. return radBrush;
  262. }
  263. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  264. {
  265. throw new NotImplementedException();
  266. }
  267. #endregion
  268. }
  269. }