/// <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); } } }
/// <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); } } }