/// <summary> /// Inserta el nuevo árbol en el árbol base (como un nuevo grupo) eliminando toda la cabecera del documento insertado. /// </summary> /// <param name="parentNode">Grupo base en el que se insertará el nuevo arbol.</param> /// <param name="treeToCopyParent">Nuevo árbol a insertar.</param> /// <param name="intCurrIndex">Índice en el que se insertará el nuevo árbol dentro del grupo base.</param> private void execMergeDoc(RtfTreeNode parentNode, RtfTree treeToCopyParent, int intCurrIndex) { //Se busca el primer "\pard" del documento (comienzo del texto) RtfTreeNode nodePard = treeToCopyParent.RootNode.FirstChild.SelectSingleChildNode("pard"); //Se obtiene el índice del nodo dentro del principal int indPard = treeToCopyParent.RootNode.FirstChild.ChildNodes.IndexOf(nodePard); //Se crea el nuevo grupo RtfTreeNode newGroup = new RtfTreeNode(RtfNodeType.Group); //Se resetean las opciones de párrafo y fuente newGroup.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "pard", false, 0)); newGroup.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "plain", false, 0)); //Se inserta cada nodo hijo del documento nuevo en el documento base for (int i = indPard + 1; i < treeToCopyParent.RootNode.FirstChild.ChildNodes.Count; i++) { RtfTreeNode newNode = treeToCopyParent.RootNode.FirstChild.ChildNodes[i].CloneNode(); newGroup.AppendChild(newNode); } //Se inserta el nuevo grupo con el nuevo documento parentNode.InsertChild(intCurrIndex, newGroup); }
/// <summary> /// Inserta el código RTF de la tabla de fuentes en el documento. /// </summary> private void InsertFontTable() { RtfTreeNode ftGroup = new RtfTreeNode(RtfNodeType.Group); ftGroup.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "fonttbl", false, 0)); for (int i = 0; i < fontTable.Count; i++) { RtfTreeNode ftFont = new RtfTreeNode(RtfNodeType.Group); ftFont.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "f", true, i)); ftFont.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "fnil", false, 0)); ftFont.AppendChild(new RtfTreeNode(RtfNodeType.Text, fontTable[i] + ";", false, 0)); ftGroup.AppendChild(ftFont); } mainGroup.InsertChild(5, ftGroup); }
/// <summary> /// Inserta un nuevo árbol en el lugar de una etiqueta de texto del árbol base. /// </summary> /// <param name="parentNode">Nodo de tipo grupo que se está procesando.</param> /// <param name="iNdIndex">Índice (dentro del grupo padre) del nodo texto que se está procesando.</param> /// <param name="docToInsert">Nuevo árbol RTF a insertar.</param> /// <param name="strCompletePlaceholder">Texto del la etiqueta que se va a reemplazar.</param> /// <param name="intPlaceHolderNodePos">Posición de la etiqueta que se va a reemplazar dentro del nodo texto que se está procesando.</param> private void mergeCore(RtfTreeNode parentNode, int iNdIndex, RtfTree docToInsert, string strCompletePlaceholder, int intPlaceHolderNodePos) { //Si el documento a insertar no está vacío if (docToInsert.RootNode.HasChildNodes()) { int currentIndex = iNdIndex + 1; //Se combinan las tablas de colores y se ajustan los colores del documento a insertar mainAdjustColor(docToInsert); //Se combinan las tablas de fuentes y se ajustan las fuentes del documento a insertar mainAdjustFont(docToInsert); //Se elimina la información de cabecera del documento a insertar (colores, fuentes, info, ...) cleanToInsertDoc(docToInsert); //Si el documento a insertar tiene contenido if (docToInsert.RootNode.FirstChild.HasChildNodes()) { //Se inserta el documento nuevo en el árbol base execMergeDoc(parentNode, docToInsert, currentIndex); } //Si la etiqueta no está al final del nodo texto: //Se inserta un nodo de texto con el resto del texto original (eliminando la etiqueta) if (parentNode.ChildNodes[iNdIndex].NodeKey.Length != (intPlaceHolderNodePos + strCompletePlaceholder.Length)) { //Se inserta un nodo de texto con el resto del texto original (eliminando la etiqueta) string remText = parentNode.ChildNodes[iNdIndex].NodeKey.Substring( parentNode.ChildNodes[iNdIndex].NodeKey.IndexOf(strCompletePlaceholder) + strCompletePlaceholder.Length); parentNode.InsertChild(currentIndex + 1, new RtfTreeNode(RtfNodeType.Text, remText, false, 0)); } //Si la etiqueta reemplazada estaba al principio del nodo de texto eliminamos el nodo //original porque ya no es necesario if (intPlaceHolderNodePos == 0) { parentNode.RemoveChild(iNdIndex); } //En otro caso lo sustituimos por el texto previo a la etiqueta else { parentNode.ChildNodes[iNdIndex].NodeKey = parentNode.ChildNodes[iNdIndex].NodeKey.Substring(0, intPlaceHolderNodePos); } } }
public void AddChildToEmptyNode() { RtfTreeNode node = new RtfTreeNode(); Assert.That(node.ChildNodes, Is.Null); RtfTreeNode childNode = new RtfTreeNode(); node.InsertChild(0, childNode); Assert.That(node.ChildNodes, Is.Not.Null); Assert.That(node.ChildNodes[0], Is.SameAs(childNode)); Assert.That(childNode.ChildNodes, Is.Null); RtfTreeNode anotherChildNode = new RtfTreeNode(); childNode.AppendChild(anotherChildNode); Assert.That(childNode.ChildNodes, Is.Not.Null); Assert.That(childNode.ChildNodes[0], Is.SameAs(anotherChildNode)); }
/// <summary> /// Inserta el nuevo árbol en el árbol base (como un nuevo grupo) eliminando toda la cabecera del documento insertado. /// </summary> /// <param name="parentNode">Grupo base en el que se insertará el nuevo arbol.</param> /// <param name="treeToCopyParent">Nuevo árbol a insertar.</param> /// <param name="intCurrIndex">Índice en el que se insertará el nuevo árbol dentro del grupo base.</param> private void execMergeDoc(RtfTreeNode parentNode, RtfTree treeToCopyParent, int intCurrIndex) { //Se busca el primer "\pard" del documento (comienzo del texto) RtfTreeNode nodePard = treeToCopyParent.RootNode.FirstChild.SelectSingleChildNode("pard"); //Se obtiene el índice del nodo dentro del principal int indPard = treeToCopyParent.RootNode.FirstChild.ChildNodes.IndexOf(nodePard); //Se crea el nuevo grupo RtfTreeNode newGroup = new RtfTreeNode(RtfNodeType.Group); //Se resetean las opciones de párrafo y fuente newGroup.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "pard", false, 0)); newGroup.AppendChild(new RtfTreeNode(RtfNodeType.Keyword, "plain", false, 0)); //Se inserta cada nodo hijo del documento nuevo en el documento base for (int i = indPard + 1; i < treeToCopyParent.RootNode.FirstChild.ChildNodes.Count; i++) { RtfTreeNode newNode = treeToCopyParent.RootNode.FirstChild.ChildNodes[i].CloneNode(true); newGroup.AppendChild(newNode); } //Se inserta el nuevo grupo con el nuevo documento parentNode.InsertChild(intCurrIndex, newGroup); }
/// <summary> /// Inserta un nuevo árbol en el lugar de una etiqueta de texto del árbol base. /// </summary> /// <param name="parentNode">Nodo de tipo grupo que se está procesando.</param> /// <param name="iNdIndex">Índice (dentro del grupo padre) del nodo texto que se está procesando.</param> /// <param name="docToInsert">Nuevo árbol RTF a insertar.</param> /// <param name="strCompletePlaceholder">Texto del la etiqueta que se va a reemplazar.</param> /// <param name="intPlaceHolderNodePos">Posición de la etiqueta que se va a reemplazar dentro del nodo texto que se está procesando.</param> private void mergeCore(RtfTreeNode parentNode, int iNdIndex, RtfTree docToInsert, string strCompletePlaceholder, int intPlaceHolderNodePos) { //Si el documento a insertar no está vacío if (docToInsert.RootNode.HasChildNodes() == true) { int currentIndex = iNdIndex + 1; //Se combinan las tablas de colores y se ajustan los colores del documento a insertar mainAdjustColor(docToInsert); //Se combinan las tablas de fuentes y se ajustan las fuentes del documento a insertar mainAdjustFont(docToInsert); //Se elimina la información de cabecera del documento a insertar (colores, fuentes, info, ...) cleanToInsertDoc(docToInsert); //Si el documento a insertar tiene contenido if (docToInsert.RootNode.FirstChild.HasChildNodes()) { //Se inserta el documento nuevo en el árbol base execMergeDoc(parentNode, docToInsert, currentIndex); } //Si la etiqueta no está al final del nodo texto: //Se inserta un nodo de texto con el resto del texto original (eliminando la etiqueta) if (parentNode.ChildNodes[iNdIndex].NodeKey.Length != (intPlaceHolderNodePos + strCompletePlaceholder.Length)) { //Se inserta un nodo de texto con el resto del texto original (eliminando la etiqueta) string remText = parentNode.ChildNodes[iNdIndex].NodeKey.Substring( parentNode.ChildNodes[iNdIndex].NodeKey.IndexOf(strCompletePlaceholder) + strCompletePlaceholder.Length); parentNode.InsertChild(currentIndex + 1, new RtfTreeNode(RtfNodeType.Text, remText, false, 0)); } //Si la etiqueta reemplazada estaba al principio del nodo de texto eliminamos el nodo //original porque ya no es necesario if (intPlaceHolderNodePos == 0) { parentNode.RemoveChild(iNdIndex); } //En otro caso lo sustituimos por el texto previo a la etiqueta else { parentNode.ChildNodes[iNdIndex].NodeKey = parentNode.ChildNodes[iNdIndex].NodeKey.Substring(0, intPlaceHolderNodePos); } } }