/// <summary>
		/// Con este metodo cramos un arbol de imagenes, de forma recursiva.
		/// Primero intentamos reconocer la imagen como un caracter, si no es 
		/// posible, la intentamos segmentar. Si ninguno de estos procesos es 
		/// posible, la imagen nopudo ser reconocida.
		/// </summary>
		/// <param name="node">
		/// El nodo donde esta la imagen sobre la que trabajaremos.
		/// </param>
		private void RecognizerTreeBuild(SegmentedNode node)
		{			
			// Seleccionamos el nodo.
			
			NodeBeingProcessedInvoker(node);
			SuspendByNode();
		
			node.Select();
			
			while(node.ChildCount>0)
				node.RemoveChild((SegmentedNode)node[0]);
			
			MathTextBitmap bitmap = node.MathTextBitmap;
			MessageLogSentInvoker("=======================================");
			MessageLogSentInvoker("Tratando la subimagen «{0}»",
			                      node.Name);
			
			// Lanzamos el reconocedor de caracteres para cada una de
			// las bases de datos.
			List<MathSymbol> associatedSymbols = new List<MathSymbol>();
			if(searchDatabase)
			{
				foreach(MathTextDatabase database in databases)
				{
					MessageLogSentInvoker("---------- «{0}» ------------",
					                      database.ShortDescription);
					                      
					
					bitmap.ProcessImage(database.Processes);
					BitmapProcessedByDatabaseInvoker(bitmap);
					
					// Añadimos los caracteres reconocidos por la base de datos
					foreach (MathSymbol symbol in database.Recognize(bitmap))
					{
						if(!associatedSymbols.Contains(symbol))
						{
							// Solo añadimos si no esta ya el simbolo.
							associatedSymbols.Add(symbol);
						}
					}
				}
			}
		
						
			// We associate all symbols to the node, so we can postargate
			// the decission step.
			node.Symbols = associatedSymbols;
			
			//Si no hemos reconocido nada, pues intentaremos segmentar el caracter.
			if(associatedSymbols.Count == 0)
			{	
				if(searchDatabase)
				{
					MessageLogSentInvoker("La imagen no pudo ser reconocida como un "
				                      + "simbolo por la base de datos, se tratará de "
				                      + "segmentar");
				}
				else
				{
					MessageLogSentInvoker("Se procede directamente a segmentar la imagen");
					this.SearchDatabase = true;
				}
					
				List<MathTextBitmap> children = CreateChildren(bitmap);
				
				if(children.Count > 1)
				{
					MessageLogSentInvoker("La imagen se ha segmentado correctamente");
					
					//Si solo conseguimos un hijo, es la propia imagen, asi que nada
					
					List<SegmentedNode> nodes = new List<SegmentedNode>();
					
					foreach(MathTextBitmap child in children)
					{
						SegmentedNode childNode = new SegmentedNode(child, node.View);	
						node.AddSegmentedChild(childNode);
						nodes.Add(childNode);
					}
					
					foreach(SegmentedNode childNode in nodes)
					{
						RecognizerTreeBuild(childNode);	
					}
				}
				else
				{
					MessageLogSentInvoker("La imagen no pudo ser segmentada, el "
					                      + "símbolo queda sin reconocer");
				}
			}
			else
			{
				// We prepare the string.
				string text ="";
				foreach(MathSymbol s in associatedSymbols)
				{
					text += String.Format("«{0}», ", s.Text);
				}
				
				text = text.TrimEnd(',',' ');
				MessageLogSentInvoker("Símbolo reconocido por la base de datos como {0}.",
				                      text);
			}
		}