PageRenderTime 60ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/eem/1.001/NRTFTree/RtfTreeNode.cs

#
C# | 1376 lines | 860 code | 180 blank | 336 comment | 207 complexity | 81f7e3862812c0b1c36d2185fb098ab9 MD5 | raw file
Possible License(s): AGPL-1.0, LGPL-3.0, GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /********************************************************************************
  2. * This file is part of NRtfTree Library.
  3. *
  4. * NRtfTree Library is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published by
  6. * the Free Software Foundation; either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * NRtfTree Library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. ********************************************************************************/
  17. /********************************************************************************
  18. * Library: NRtfTree
  19. * Version: v0.3.0
  20. * Date: 01/05/2009
  21. * Copyright: 2006-2009 Salvador Gomez
  22. * E-mail: sgoliver.net@gmail.com
  23. * Home Page: http://www.sgoliver.net
  24. * SF Project: http://nrtftree.sourceforge.net
  25. * http://sourceforge.net/projects/nrtftree
  26. * Class: RtfTreeNode
  27. * Description: Nodo RTF de la representación en árbol de un documento.
  28. * ******************************************************************************/
  29. using System;
  30. using System.Collections;
  31. using System.IO;
  32. using System.Text;
  33. namespace Net.Sgoliver.NRtfTree
  34. {
  35. namespace Core
  36. {
  37. /// <summary>
  38. /// Nodo RTF de la representación en árbol de un documento.
  39. /// </summary>
  40. public class RtfTreeNode
  41. {
  42. #region Atributos Privados
  43. /// <summary>
  44. /// Tipo de nodo.
  45. /// </summary>
  46. private RtfNodeType type;
  47. /// <summary>
  48. /// Palabra clave / Símbolo de Control / Texto.
  49. /// </summary>
  50. private string key;
  51. /// <summary>
  52. /// Indica si la palabra clave o símbolo de Control tiene parámetro.
  53. /// </summary>
  54. private bool hasParam;
  55. /// <summary>
  56. /// Parámetro de la palabra clave o símbolo de Control.
  57. /// </summary>
  58. private int param;
  59. /// <summary>
  60. /// Nodos hijos del nodo actual.
  61. /// </summary>
  62. private RtfNodeCollection children;
  63. /// <summary>
  64. /// Nodo padre del nodo actual.
  65. /// </summary>
  66. private RtfTreeNode parent;
  67. /// <summary>
  68. /// Nodo raíz del documento.
  69. /// </summary>
  70. private RtfTreeNode root;
  71. /// <summary>
  72. /// Árbol Rtf al que pertenece el nodo
  73. /// </summary>
  74. private RtfTree tree;
  75. #endregion
  76. #region Constructores Públicos
  77. /// <summary>
  78. /// Constructor de la clase RtfTreeNode. Crea un nodo sin inicializar.
  79. /// </summary>
  80. public RtfTreeNode()
  81. {
  82. this.type = RtfNodeType.None;
  83. this.key = "";
  84. /* Inicializados por defecto */
  85. //this.param = 0;
  86. //this.hasParam = false;
  87. //this.parent = null;
  88. //this.root = null;
  89. //this.tree = null;
  90. //children = null;
  91. }
  92. /// <summary>
  93. /// Constructor de la clase RtfTreeNode. Crea un nodo de un tipo concreto.
  94. /// </summary>
  95. /// <param name="nodeType">Tipo del nodo que se va a crear.</param>
  96. public RtfTreeNode(RtfNodeType nodeType)
  97. {
  98. this.type = nodeType;
  99. this.key = "";
  100. if (nodeType == RtfNodeType.Group || nodeType == RtfNodeType.Root)
  101. children = new RtfNodeCollection();
  102. if (nodeType == RtfNodeType.Root)
  103. this.root = this;
  104. /* Inicializados por defecto */
  105. //this.param = 0;
  106. //this.hasParam = false;
  107. //this.parent = null;
  108. //this.root = null;
  109. //this.tree = null;
  110. //children = null;
  111. }
  112. /// <summary>
  113. /// Constructor de la clase RtfTreeNode. Crea un nodo especificando su tipo, palabra clave y parámetro.
  114. /// </summary>
  115. /// <param name="type">Tipo del nodo.</param>
  116. /// <param name="key">Palabra clave o símbolo de Control.</param>
  117. /// <param name="hasParameter">Indica si la palabra clave o el símbolo de Control va acompańado de un parámetro.</param>
  118. /// <param name="parameter">Parámetro del la palabra clave o símbolo de Control.</param>
  119. public RtfTreeNode(RtfNodeType type, string key, bool hasParameter, int parameter)
  120. {
  121. this.type = type;
  122. this.key = key;
  123. this.hasParam = hasParameter;
  124. this.param = parameter;
  125. if (type == RtfNodeType.Group || type == RtfNodeType.Root)
  126. children = new RtfNodeCollection();
  127. if (type == RtfNodeType.Root)
  128. this.root = this;
  129. /* Inicializados por defecto */
  130. //this.parent = null;
  131. //this.root = null;
  132. //this.tree = null;
  133. //children = null;
  134. }
  135. #endregion
  136. #region Constructor Privado
  137. /// <summary>
  138. /// Constructor privado de la clase RtfTreeNode. Crea un nodo a partir de un token del analizador léxico.
  139. /// </summary>
  140. /// <param name="token">Token RTF devuelto por el analizador léxico.</param>
  141. internal RtfTreeNode(RtfToken token)
  142. {
  143. this.type = (RtfNodeType)token.Type;
  144. this.key = token.Key;
  145. this.hasParam = token.HasParameter;
  146. this.param = token.Parameter;
  147. /* Inicializados por defecto */
  148. //this.parent = null;
  149. //this.root = null;
  150. //this.tree = null;
  151. //this.children = null;
  152. }
  153. #endregion
  154. #region Métodos Públicos
  155. /// <summary>
  156. /// Ańade un nodo al final de la lista de hijos.
  157. /// </summary>
  158. /// <param name="newNode">Nuevo nodo a ańadir.</param>
  159. public void AppendChild(RtfTreeNode newNode)
  160. {
  161. if(newNode != null)
  162. {
  163. //Si aún no tenía hijos se inicializa la colección
  164. if (children == null)
  165. children = new RtfNodeCollection();
  166. //Se asigna como nodo padre el nodo actual
  167. newNode.parent = this;
  168. //Se actualizan las propiedades Root y Tree del nuevo nodo y sus posibles hijos
  169. updateNodeRoot(newNode);
  170. //Se ańade el nuevo nodo al final de la lista de nodos hijo
  171. children.Add(newNode);
  172. }
  173. }
  174. /// <summary>
  175. /// Inserta un nuevo nodo en una posición determinada de la lista de hijos.
  176. /// </summary>
  177. /// <param name="index">Posición en la que se insertará el nodo.</param>
  178. /// <param name="newNode">Nuevo nodo a insertar.</param>
  179. public void InsertChild(int index, RtfTreeNode newNode)
  180. {
  181. if (newNode != null)
  182. {
  183. //Si aún no tenía hijos se inicializa la colección
  184. if (children == null)
  185. children = new RtfNodeCollection();
  186. if (index >= 0 && index <= children.Count)
  187. {
  188. //Se asigna como nodo padre el nodo actual
  189. newNode.parent = this;
  190. //Se actualizan las propiedades Root y Tree del nuevo nodo y sus posibles hijos
  191. updateNodeRoot(newNode);
  192. //Se ańade el nuevo nodo al final de la lista de nodos hijo
  193. children.Insert(index, newNode);
  194. }
  195. }
  196. }
  197. /// <summary>
  198. /// Elimina un nodo de la lista de hijos.
  199. /// </summary>
  200. /// <param name="index">Indice del nodo a eliminar.</param>
  201. public void RemoveChild(int index)
  202. {
  203. //Si el nodo actual tiene hijos
  204. if (children != null)
  205. {
  206. if (index >= 0 && index < children.Count)
  207. {
  208. //Se elimina el i-ésimo hijo
  209. children.RemoveAt(index);
  210. }
  211. }
  212. }
  213. /// <summary>
  214. /// Elimina un nodo de la lista de hijos.
  215. /// </summary>
  216. /// <param name="node">Nodo a eliminar.</param>
  217. public void RemoveChild(RtfTreeNode node)
  218. {
  219. //Si el nodo actual tiene hijos
  220. if (children != null)
  221. {
  222. //Se busca el nodo a eliminar
  223. int index = children.IndexOf(node);
  224. //Si lo encontramos
  225. if (index != -1)
  226. {
  227. //Se elimina el i-ésimo hijo
  228. children.RemoveAt(index);
  229. }
  230. }
  231. }
  232. /// <summary>
  233. /// Realiza una copia exacta del nodo actual.
  234. /// </summary>
  235. /// <param name="cloneChildren">Si este parámetro recibe el valor true se clonarán también todos los nodos hijo del nodo actual.</param>
  236. /// <returns>Devuelve una copia exacta del nodo actual.</returns>
  237. public RtfTreeNode CloneNode(bool cloneChildren)
  238. {
  239. RtfTreeNode clon = new RtfTreeNode();
  240. clon.key = this.key;
  241. clon.hasParam = this.hasParam;
  242. clon.param = this.param;
  243. clon.parent = this.parent;
  244. clon.root = this.root;
  245. clon.tree = this.tree;
  246. clon.type = this.type;
  247. //Si cloneChildren=false se copia directamente la lista de hijos
  248. if (!cloneChildren)
  249. {
  250. clon.children = this.children;
  251. }
  252. else //En caso contrario se clonan también cada uno de los hijos, propagando el parámetro cloneChildren=true
  253. {
  254. clon.children = null;
  255. if (this.children != null)
  256. {
  257. clon.children = new RtfNodeCollection();
  258. foreach (RtfTreeNode child in this.children)
  259. {
  260. clon.children.Add(child.CloneNode(true));
  261. }
  262. }
  263. }
  264. return clon;
  265. }
  266. /// <summary>
  267. /// Indica si el nodo actual tiene nodos hijos.
  268. /// </summary>
  269. /// <returns>Devuelve true si el nodo actual tiene algún nodo hijo.</returns>
  270. public bool HasChildNodes()
  271. {
  272. bool res = false;
  273. if (children != null && children.Count > 0)
  274. res = true;
  275. return res;
  276. }
  277. /// <summary>
  278. /// Devuelve el primer nodo de la lista de nodos hijos del nodo actual cuya palabra clave es la indicada como parámetro.
  279. /// </summary>
  280. /// <param name="keyword">Palabra clave buscada.</param>
  281. /// <returns>Primer nodo de la lista de nodos hijos del nodo actual cuya palabra clave es la indicada como parámetro.</returns>
  282. public RtfTreeNode SelectSingleChildNode(string keyword)
  283. {
  284. int i = 0;
  285. bool found = false;
  286. RtfTreeNode node = null;
  287. if (children != null)
  288. {
  289. while (i < children.Count && !found)
  290. {
  291. if (children[i].key == keyword)
  292. {
  293. node = children[i];
  294. found = true;
  295. }
  296. i++;
  297. }
  298. }
  299. return node;
  300. }
  301. /// <summary>
  302. /// Devuelve el primer nodo de la lista de nodos hijos del nodo actual cuyo tipo es el indicado como parámetro.
  303. /// </summary>
  304. /// <param name="nodeType">Tipo de nodo buscado.</param>
  305. /// <returns>Primer nodo de la lista de nodos hijos del nodo actual cuyo tipo es el indicado como parámetro.</returns>
  306. public RtfTreeNode SelectSingleChildNode(RtfNodeType nodeType)
  307. {
  308. int i = 0;
  309. bool found = false;
  310. RtfTreeNode node = null;
  311. if (children != null)
  312. {
  313. while (i < children.Count && !found)
  314. {
  315. if (children[i].type == nodeType)
  316. {
  317. node = children[i];
  318. found = true;
  319. }
  320. i++;
  321. }
  322. }
  323. return node;
  324. }
  325. /// <summary>
  326. /// Devuelve el primer nodo de la lista de nodos hijos del nodo actual cuya palabra clave y parámetro son los indicados como parámetros.
  327. /// </summary>
  328. /// <param name="keyword">Palabra clave buscada.</param>
  329. /// <param name="param">Parámetro buscado.</param>
  330. /// <returns>Primer nodo de la lista de nodos hijos del nodo actual cuya palabra clave y parámetro son los indicados como parámetros.</returns>
  331. public RtfTreeNode SelectSingleChildNode(string keyword, int param)
  332. {
  333. int i = 0;
  334. bool found = false;
  335. RtfTreeNode node = null;
  336. if (children != null)
  337. {
  338. while (i < children.Count && !found)
  339. {
  340. if (children[i].key == keyword && children[i].param == param)
  341. {
  342. node = children[i];
  343. found = true;
  344. }
  345. i++;
  346. }
  347. }
  348. return node;
  349. }
  350. /// <summary>
  351. /// Devuelve el primer nodo grupo de la lista de nodos hijos del nodo actual cuya primera palabra clave es la indicada como parámetro.
  352. /// </summary>
  353. /// <param name="keyword">Palabra clave buscada.</param>
  354. /// <returns>Primer nodo grupo de la lista de nodos hijos del nodo actual cuya primera palabra clave es la indicada como parámetro.</returns>
  355. public RtfTreeNode SelectSingleChildGroup(string keyword)
  356. {
  357. int i = 0;
  358. bool found = false;
  359. RtfTreeNode node = null;
  360. if (children != null)
  361. {
  362. while (i < children.Count && !found)
  363. {
  364. if (children[i].NodeType == RtfNodeType.Group &&
  365. children[i].HasChildNodes() &&
  366. children[i].FirstChild.NodeKey == keyword)
  367. {
  368. node = children[i];
  369. found = true;
  370. }
  371. i++;
  372. }
  373. }
  374. return node;
  375. }
  376. /// <summary>
  377. /// Devuelve el primer nodo del árbol, a partir del nodo actual, cuyo tipo es el indicado como parámetro.
  378. /// </summary>
  379. /// <param name="nodeType">Tipo del nodo buscado.</param>
  380. /// <returns>Primer nodo del árbol, a partir del nodo actual, cuyo tipo es el indicado como parámetro.</returns>
  381. public RtfTreeNode SelectSingleNode(RtfNodeType nodeType)
  382. {
  383. int i = 0;
  384. bool found = false;
  385. RtfTreeNode node = null;
  386. if (children != null)
  387. {
  388. while (i < children.Count && !found)
  389. {
  390. if (children[i].type == nodeType)
  391. {
  392. node = children[i];
  393. found = true;
  394. }
  395. else
  396. {
  397. node = children[i].SelectSingleNode(nodeType);
  398. if (node != null)
  399. {
  400. found = true;
  401. }
  402. }
  403. i++;
  404. }
  405. }
  406. return node;
  407. }
  408. /// <summary>
  409. /// Devuelve el primer nodo del árbol, a partir del nodo actual, cuya palabra clave es la indicada como parámetro.
  410. /// </summary>
  411. /// <param name="keyword">Palabra clave buscada.</param>
  412. /// <returns>Primer nodo del árbol, a partir del nodo actual, cuya palabra clave es la indicada como parámetro.</returns>
  413. public RtfTreeNode SelectSingleNode(string keyword)
  414. {
  415. int i = 0;
  416. bool found = false;
  417. RtfTreeNode node = null;
  418. if (children != null)
  419. {
  420. while (i < children.Count && !found)
  421. {
  422. if (children[i].key == keyword)
  423. {
  424. node = children[i];
  425. found = true;
  426. }
  427. else
  428. {
  429. node = children[i].SelectSingleNode(keyword);
  430. if (node != null)
  431. {
  432. found = true;
  433. }
  434. }
  435. i++;
  436. }
  437. }
  438. return node;
  439. }
  440. /// <summary>
  441. /// Devuelve el primer nodo grupo del árbol, a partir del nodo actual, cuya primera palabra clave es la indicada como parámetro.
  442. /// </summary>
  443. /// <param name="keyword">Palabra clave buscada.</param>
  444. /// <returns>Primer nodo grupo del árbol, a partir del nodo actual, cuya primera palabra clave es la indicada como parámetro.</returns>
  445. public RtfTreeNode SelectSingleGroup(string keyword)
  446. {
  447. int i = 0;
  448. bool found = false;
  449. RtfTreeNode node = null;
  450. if (children != null)
  451. {
  452. while (i < children.Count && !found)
  453. {
  454. if (children[i].NodeType == RtfNodeType.Group &&
  455. children[i].HasChildNodes() &&
  456. children[i].FirstChild.NodeKey == keyword)
  457. {
  458. node = children[i];
  459. found = true;
  460. }
  461. else
  462. {
  463. node = children[i].SelectSingleGroup(keyword);
  464. if (node != null)
  465. {
  466. found = true;
  467. }
  468. }
  469. i++;
  470. }
  471. }
  472. return node;
  473. }
  474. /// <summary>
  475. /// Devuelve el primer nodo del árbol, a partir del nodo actual, cuya palabra clave y parámetro son los indicados como parámetro.
  476. /// </summary>
  477. /// <param name="keyword">Palabra clave buscada.</param>
  478. /// <param name="param">Parámetro buscado.</param>
  479. /// <returns>Primer nodo del árbol, a partir del nodo actual, cuya palabra clave y parámetro son ls indicados como parámetro.</returns>
  480. public RtfTreeNode SelectSingleNode(string keyword, int param)
  481. {
  482. int i = 0;
  483. bool found = false;
  484. RtfTreeNode node = null;
  485. if (children != null)
  486. {
  487. while (i < children.Count && !found)
  488. {
  489. if (children[i].key == keyword && children[i].param == param)
  490. {
  491. node = children[i];
  492. found = true;
  493. }
  494. else
  495. {
  496. node = children[i].SelectSingleNode(keyword, param);
  497. if (node != null)
  498. {
  499. found = true;
  500. }
  501. }
  502. i++;
  503. }
  504. }
  505. return node;
  506. }
  507. /// <summary>
  508. /// Devuelve todos los nodos, a partir del nodo actual, cuya palabra clave es la indicada como parámetro.
  509. /// </summary>
  510. /// <param name="keyword">Palabra clave buscada.</param>
  511. /// <returns>Colección de nodos, a partir del nodo actual, cuya palabra clave es la indicada como parámetro.</returns>
  512. public RtfNodeCollection SelectNodes(string keyword)
  513. {
  514. RtfNodeCollection nodes = new RtfNodeCollection();
  515. if (children != null)
  516. {
  517. foreach (RtfTreeNode node in children)
  518. {
  519. if (node.key == keyword)
  520. {
  521. nodes.Add(node);
  522. }
  523. nodes.AddRange(node.SelectNodes(keyword));
  524. }
  525. }
  526. return nodes;
  527. }
  528. /// <summary>
  529. /// Devuelve todos los nodos grupo, a partir del nodo actual, cuya primera palabra clave es la indicada como parámetro.
  530. /// </summary>
  531. /// <param name="keyword">Palabra clave buscada.</param>
  532. /// <returns>Colección de nodos grupo, a partir del nodo actual, cuya primera palabra clave es la indicada como parámetro.</returns>
  533. public RtfNodeCollection SelectGroups(string keyword)
  534. {
  535. RtfNodeCollection nodes = new RtfNodeCollection();
  536. if (children != null)
  537. {
  538. foreach (RtfTreeNode node in children)
  539. {
  540. if (node.NodeType == RtfNodeType.Group &&
  541. node.HasChildNodes() &&
  542. node.FirstChild.NodeKey == keyword)
  543. {
  544. nodes.Add(node);
  545. }
  546. nodes.AddRange(node.SelectGroups(keyword));
  547. }
  548. }
  549. return nodes;
  550. }
  551. /// <summary>
  552. /// Devuelve todos los nodos, a partir del nodo actual, cuyo tipo es el indicado como parámetro.
  553. /// </summary>
  554. /// <param name="nodeType">Tipo del nodo buscado.</param>
  555. /// <returns>Colección de nodos, a partir del nodo actual, cuyo tipo es la indicado como parámetro.</returns>
  556. public RtfNodeCollection SelectNodes(RtfNodeType nodeType)
  557. {
  558. RtfNodeCollection nodes = new RtfNodeCollection();
  559. if (children != null)
  560. {
  561. foreach (RtfTreeNode node in children)
  562. {
  563. if (node.type == nodeType)
  564. {
  565. nodes.Add(node);
  566. }
  567. nodes.AddRange(node.SelectNodes(nodeType));
  568. }
  569. }
  570. return nodes;
  571. }
  572. /// <summary>
  573. /// Devuelve todos los nodos, a partir del nodo actual, cuya palabra clave y parámetro son los indicados como parámetro.
  574. /// </summary>
  575. /// <param name="keyword">Palabra clave buscada.</param>
  576. /// <param name="param">Parámetro buscado.</param>
  577. /// <returns>Colección de nodos, a partir del nodo actual, cuya palabra clave y parámetro son los indicados como parámetro.</returns>
  578. public RtfNodeCollection SelectNodes(string keyword, int param)
  579. {
  580. RtfNodeCollection nodes = new RtfNodeCollection();
  581. if (children != null)
  582. {
  583. foreach (RtfTreeNode node in children)
  584. {
  585. if (node.key == keyword && node.param == param)
  586. {
  587. nodes.Add(node);
  588. }
  589. nodes.AddRange(node.SelectNodes(keyword, param));
  590. }
  591. }
  592. return nodes;
  593. }
  594. /// <summary>
  595. /// Devuelve todos los nodos de la lista de nodos hijos del nodo actual cuya palabra clave es la indicada como parámetro.
  596. /// </summary>
  597. /// <param name="keyword">Palabra clave buscada.</param>
  598. /// <returns>Colección de nodos de la lista de nodos hijos del nodo actual cuya palabra clave es la indicada como parámetro.</returns>
  599. public RtfNodeCollection SelectChildNodes(string keyword)
  600. {
  601. RtfNodeCollection nodes = new RtfNodeCollection();
  602. if (children != null)
  603. {
  604. foreach (RtfTreeNode node in children)
  605. {
  606. if (node.key == keyword)
  607. {
  608. nodes.Add(node);
  609. }
  610. }
  611. }
  612. return nodes;
  613. }
  614. /// <summary>
  615. /// Devuelve todos los nodos grupos de la lista de nodos hijos del nodo actual cuya primera palabra clave es la indicada como parámetro.
  616. /// </summary>
  617. /// <param name="keyword">Palabra clave buscada.</param>
  618. /// <returns>Colección de nodos grupo de la lista de nodos hijos del nodo actual cuya primera palabra clave es la indicada como parámetro.</returns>
  619. public RtfNodeCollection SelectChildGroups(string keyword)
  620. {
  621. RtfNodeCollection nodes = new RtfNodeCollection();
  622. if (children != null)
  623. {
  624. foreach (RtfTreeNode node in children)
  625. {
  626. if (node.NodeType == RtfNodeType.Group &&
  627. node.HasChildNodes() &&
  628. node.FirstChild.NodeKey == keyword)
  629. {
  630. nodes.Add(node);
  631. }
  632. }
  633. }
  634. return nodes;
  635. }
  636. /// <summary>
  637. /// Devuelve todos los nodos de la lista de nodos hijos del nodo actual cuyo tipo es el indicado como parámetro.
  638. /// </summary>
  639. /// <param name="nodeType">Tipo del nodo buscado.</param>
  640. /// <returns>Colección de nodos de la lista de nodos hijos del nodo actual cuyo tipo es el indicado como parámetro.</returns>
  641. public RtfNodeCollection SelectChildNodes(RtfNodeType nodeType)
  642. {
  643. RtfNodeCollection nodes = new RtfNodeCollection();
  644. if (children != null)
  645. {
  646. foreach (RtfTreeNode node in children)
  647. {
  648. if (node.type == nodeType)
  649. {
  650. nodes.Add(node);
  651. }
  652. }
  653. }
  654. return nodes;
  655. }
  656. /// <summary>
  657. /// Devuelve todos los nodos de la lista de nodos hijos del nodo actual cuya palabra clave y parámetro son los indicados como parámetro.
  658. /// </summary>
  659. /// <param name="keyword">Palabra clave buscada.</param>
  660. /// <param name="param">Parámetro buscado.</param>
  661. /// <returns>Colección de nodos de la lista de nodos hijos del nodo actual cuya palabra clave y parámetro son los indicados como parámetro.</returns>
  662. public RtfNodeCollection SelectChildNodes(string keyword, int param)
  663. {
  664. RtfNodeCollection nodes = new RtfNodeCollection();
  665. if (children != null)
  666. {
  667. foreach (RtfTreeNode node in children)
  668. {
  669. if (node.key == keyword && node.param == param)
  670. {
  671. nodes.Add(node);
  672. }
  673. }
  674. }
  675. return nodes;
  676. }
  677. /// <summary>
  678. /// Devuelve el siguiente nodo hermano del actual cuya palabra clave es la indicada como parámetro.
  679. /// </summary>
  680. /// <param name="keyword">Palabra clave buscada.</param>
  681. /// <returns>Primer nodo hermano del actual cuya palabra clave es la indicada como parámetro.</returns>
  682. public RtfTreeNode SelectSibling(string keyword)
  683. {
  684. RtfTreeNode node = null;
  685. RtfTreeNode par = this.parent;
  686. if (par != null)
  687. {
  688. int curInd = par.ChildNodes.IndexOf(this);
  689. int i = curInd + 1;
  690. bool found = false;
  691. while (i < par.children.Count && !found)
  692. {
  693. if (par.children[i].key == keyword)
  694. {
  695. node = par.children[i];
  696. found = true;
  697. }
  698. i++;
  699. }
  700. }
  701. return node;
  702. }
  703. /// <summary>
  704. /// Devuelve el siguiente nodo hermano del actual cuyo tipo es el indicado como parámetro.
  705. /// </summary>
  706. /// <param name="nodeType">Tpo de nodo buscado.</param>
  707. /// <returns>Primer nodo hermano del actual cuyo tipo es el indicado como parámetro.</returns>
  708. public RtfTreeNode SelectSibling(RtfNodeType nodeType)
  709. {
  710. RtfTreeNode node = null;
  711. RtfTreeNode par = this.parent;
  712. if (par != null)
  713. {
  714. int curInd = par.ChildNodes.IndexOf(this);
  715. int i = curInd + 1;
  716. bool found = false;
  717. while (i < par.children.Count && !found)
  718. {
  719. if (par.children[i].type == nodeType)
  720. {
  721. node = par.children[i];
  722. found = true;
  723. }
  724. i++;
  725. }
  726. }
  727. return node;
  728. }
  729. /// <summary>
  730. /// Devuelve el siguiente nodo hermano del actual cuya palabra clave y parámetro son los indicados como parámetro.
  731. /// </summary>
  732. /// <param name="keyword">Palabra clave buscada.</param>
  733. /// <param name="param">Parámetro buscado.</param>
  734. /// <returns>Primer nodo hermano del actual cuya palabra clave y parámetro son los indicados como parámetro.</returns>
  735. public RtfTreeNode SelectSibling(string keyword, int param)
  736. {
  737. RtfTreeNode node = null;
  738. RtfTreeNode par = this.parent;
  739. if (par != null)
  740. {
  741. int curInd = par.ChildNodes.IndexOf(this);
  742. int i = curInd + 1;
  743. bool found = false;
  744. while (i < par.children.Count && !found)
  745. {
  746. if (par.children[i].key == keyword && par.children[i].param == param)
  747. {
  748. node = par.children[i];
  749. found = true;
  750. }
  751. i++;
  752. }
  753. }
  754. return node;
  755. }
  756. /// <summary>
  757. /// Busca todos los nodos de tipo Texto que contengan el texto buscado.
  758. /// </summary>
  759. /// <param name="text">Texto buscado en el documento.</param>
  760. /// <returns>Lista de nodos, a partir del actual, que contienen el texto buscado.</returns>
  761. public RtfNodeCollection FindText(string text)
  762. {
  763. RtfNodeCollection list = new RtfNodeCollection();
  764. //Si el nodo actual tiene hijos
  765. if (children != null)
  766. {
  767. foreach (RtfTreeNode node in children)
  768. {
  769. if (node.NodeType == RtfNodeType.Text && node.NodeKey.IndexOf(text) != -1)
  770. list.Add(node);
  771. else if(node.NodeType == RtfNodeType.Group)
  772. list.AddRange(node.FindText(text));
  773. }
  774. }
  775. return list;
  776. }
  777. /// <summary>
  778. /// Busca y reemplaza un texto determinado en todos los nodos de tipo Texto a partir del actual.
  779. /// </summary>
  780. /// <param name="oldValue">Texto buscado.</param>
  781. /// <param name="newValue">Texto de reemplazo.</param>
  782. public void ReplaceText(string oldValue, string newValue)
  783. {
  784. //Si el nodo actual tiene hijos
  785. if (children != null)
  786. {
  787. foreach (RtfTreeNode node in children)
  788. {
  789. if (node.NodeType == RtfNodeType.Text)
  790. node.NodeKey = node.NodeKey.Replace(oldValue, newValue);
  791. else if (node.NodeType == RtfNodeType.Group)
  792. node.ReplaceText(oldValue, newValue);
  793. }
  794. }
  795. }
  796. /// <summary>
  797. /// Devuelve una representación del nodo donde se indica su tipo, clave, indicador de parámetro y valor de parámetro
  798. /// </summary>
  799. /// <returns>Cadena de caracteres del tipo [TIPO, CLAVE, IND_PARAMETRO, VAL_PARAMETRO]</returns>
  800. public override string ToString()
  801. {
  802. return "[" + this.type + ", " + this.key + ", " + this.hasParam + ", " + this.param + "]";
  803. }
  804. #endregion
  805. #region Metodos Privados
  806. /// <summary>
  807. /// Obtiene el Texto RTF a partir de la representación en árbol del nodo actual.
  808. /// </summary>
  809. /// <returns>Texto RTF del nodo.</returns>
  810. private string getRtf()
  811. {
  812. string res = "";
  813. Encoding enc = this.tree.GetEncoding();
  814. res = getRtfInm(this, null, enc);
  815. return res;
  816. }
  817. /// <summary>
  818. /// Método auxiliar para obtener el Texto RTF del nodo actual a partir de su representación en árbol.
  819. /// </summary>
  820. /// <param name="curNode">Nodo actual del árbol.</param>
  821. /// <param name="prevNode">Nodo anterior tratado.</param>
  822. /// <param name="enc">Codificación del documento.</param>
  823. /// <returns>Texto en formato RTF del nodo.</returns>
  824. private string getRtfInm(RtfTreeNode curNode, RtfTreeNode prevNode, Encoding enc)
  825. {
  826. StringBuilder res = new StringBuilder("");
  827. if (curNode.NodeType == RtfNodeType.Root)
  828. res.Append("");
  829. else if (curNode.NodeType == RtfNodeType.Group)
  830. res.Append("{");
  831. else
  832. {
  833. if (curNode.NodeType == RtfNodeType.Control ||
  834. curNode.NodeType == RtfNodeType.Keyword)
  835. {
  836. res.Append("\\");
  837. }
  838. else //curNode.NodeType == RtfNodeType.Text
  839. {
  840. if (prevNode != null &&
  841. prevNode.NodeType == RtfNodeType.Keyword)
  842. {
  843. int code = Char.ConvertToUtf32(curNode.NodeKey, 0);
  844. if (code >= 32 && code < 128)
  845. res.Append(" ");
  846. }
  847. }
  848. AppendEncoded(res, curNode.NodeKey, enc);
  849. if (curNode.HasParameter)
  850. {
  851. if (curNode.NodeType == RtfNodeType.Keyword)
  852. {
  853. res.Append(Convert.ToString(curNode.Parameter));
  854. }
  855. else if (curNode.NodeType == RtfNodeType.Control)
  856. {
  857. //Si es un caracter especial como las vocales acentuadas
  858. if (curNode.NodeKey == "\'")
  859. {
  860. res.Append(GetHexa(curNode.Parameter));
  861. }
  862. }
  863. }
  864. }
  865. //Se obtienen los nodos hijos
  866. RtfNodeCollection children = curNode.ChildNodes;
  867. //Si el nodo tiene hijos se obtiene el código RTF de los hijos
  868. if (children != null)
  869. {
  870. for (int i = 0; i < children.Count; i++)
  871. {
  872. RtfTreeNode node = children[i];
  873. if (i > 0)
  874. res.Append(getRtfInm(node, children[i - 1], enc));
  875. else
  876. res.Append(getRtfInm(node, null, enc));
  877. }
  878. }
  879. if (curNode.NodeType == RtfNodeType.Group)
  880. {
  881. res.Append("}");
  882. }
  883. return res.ToString();
  884. }
  885. /// <summary>
  886. /// Concatena dos cadenas utilizando la codificación del documento.
  887. /// </summary>
  888. /// <param name="res">Cadena original.</param>
  889. /// <param name="s">Cadena a ańadir.</param>
  890. /// <param name="enc">Codificación del documento.</param>
  891. private void AppendEncoded(StringBuilder res, string s, Encoding enc)
  892. {
  893. //Contributed by Jan Stuchlík
  894. for (int i = 0; i < s.Length; i++)
  895. {
  896. int code = Char.ConvertToUtf32(s, i);
  897. if (code >= 128 || code < 32)
  898. {
  899. res.Append(@"\'");
  900. byte[] bytes = enc.GetBytes(new char[] { s[i] });
  901. res.Append(GetHexa(bytes[0]));
  902. }
  903. else
  904. {
  905. if ((s[i] == '{') || (s[i] == '}') || (s[i] == '\\'))
  906. {
  907. res.Append(@"\");
  908. }
  909. res.Append(s[i]);
  910. }
  911. }
  912. }
  913. /// <summary>
  914. /// Obtiene el código hexadecimal de un entero.
  915. /// </summary>
  916. /// <param name="code">Número entero.</param>
  917. /// <returns>Código hexadecimal del entero pasado como parámetro.</returns>
  918. private string GetHexa(int code)
  919. {
  920. //Contributed by Jan Stuchlík
  921. string hexa = Convert.ToString(code, 16);
  922. if (hexa.Length == 1)
  923. {
  924. hexa = "0" + hexa;
  925. }
  926. return hexa;
  927. }
  928. /// <summary>
  929. /// Actualiza las propiedades Root y Tree de un nodo (y sus hijos) con las del nodo actual.
  930. /// </summary>
  931. /// <param name="node">Nodo a actualizar.</param>
  932. private void updateNodeRoot(RtfTreeNode node)
  933. {
  934. //Se asigna el nodo raíz del documento
  935. node.root = this.root;
  936. //Se asigna el árbol propietario del nodo
  937. node.tree = this.tree;
  938. //Si el nodo actualizado tiene hijos se actualizan también
  939. if (node.children != null)
  940. {
  941. //Se actualizan recursivamente los hijos del nodo actual
  942. foreach (RtfTreeNode nod in node.children)
  943. {
  944. updateNodeRoot(nod);
  945. }
  946. }
  947. }
  948. #endregion
  949. #region Propiedades
  950. /// <summary>
  951. /// Devuelve el nodo raíz del árbol del documento.
  952. /// </summary>
  953. /// <remarks>
  954. /// Éste no es el nodo raíz del árbol, sino que se trata simplemente de un nodo ficticio de tipo ROOT del que parte el resto del árbol RTF.
  955. /// Tendrá por tanto un solo nodo hijo de tipo GROUP, raiz real del árbol.
  956. /// </remarks>
  957. public RtfTreeNode RootNode
  958. {
  959. get
  960. {
  961. return root;
  962. }
  963. set
  964. {
  965. root = value;
  966. }
  967. }
  968. /// <summary>
  969. /// Devuelve el nodo padre del nodo actual.
  970. /// </summary>
  971. public RtfTreeNode ParentNode
  972. {
  973. get
  974. {
  975. return parent;
  976. }
  977. set
  978. {
  979. parent = value;
  980. }
  981. }
  982. /// <summary>
  983. /// Devuelve el árbol Rtf al que pertenece el nodo.
  984. /// </summary>
  985. public RtfTree Tree
  986. {
  987. get
  988. {
  989. return tree;
  990. }
  991. set
  992. {
  993. tree = value;
  994. }
  995. }
  996. /// <summary>
  997. /// Devuelve el tipo del nodo actual.
  998. /// </summary>
  999. public RtfNodeType NodeType
  1000. {
  1001. get
  1002. {
  1003. return type;
  1004. }
  1005. set
  1006. {
  1007. type = value;
  1008. }
  1009. }
  1010. /// <summary>
  1011. /// Devuelve la palabra clave, símbolo de Control o Texto del nodo actual.
  1012. /// </summary>
  1013. public string NodeKey
  1014. {
  1015. get
  1016. {
  1017. return key;
  1018. }
  1019. set
  1020. {
  1021. key = value;
  1022. }
  1023. }
  1024. /// <summary>
  1025. /// Indica si el nodo actual tiene parámetro asignado.
  1026. /// </summary>
  1027. public bool HasParameter
  1028. {
  1029. get
  1030. {
  1031. return hasParam;
  1032. }
  1033. set
  1034. {
  1035. hasParam = value;
  1036. }
  1037. }
  1038. /// <summary>
  1039. /// Devuelve el parámetro asignado al nodo actual.
  1040. /// </summary>
  1041. public int Parameter
  1042. {
  1043. get
  1044. {
  1045. return param;
  1046. }
  1047. set
  1048. {
  1049. param = value;
  1050. }
  1051. }
  1052. /// <summary>
  1053. /// Devuelve la colección de nodos hijo del nodo actual.
  1054. /// </summary>
  1055. public RtfNodeCollection ChildNodes
  1056. {
  1057. get
  1058. {
  1059. return children;
  1060. }
  1061. set
  1062. {
  1063. children = value;
  1064. foreach (RtfTreeNode node in children)
  1065. {
  1066. node.parent = this;
  1067. //Se actualizan las propiedades Root y Tree del nuevo nodo y sus posibles hijos
  1068. updateNodeRoot(node);
  1069. }
  1070. }
  1071. }
  1072. /// <summary>
  1073. /// Devuelve el primer nodo hijo cuya palabra clave sea la indicada como parámetro.
  1074. /// </summary>
  1075. /// <param name="keyword">Palabra clave buscada.</param>
  1076. /// <returns>Primer nodo hijo cuya palabra clave sea la indicada como parámetro. En caso de no existir se devuelve null.</returns>
  1077. public RtfTreeNode this[string keyword]
  1078. {
  1079. get
  1080. {
  1081. return this.SelectSingleChildNode(keyword);
  1082. }
  1083. }
  1084. /// <summary>
  1085. /// Devuelve el hijo n-ésimo del nodo actual.
  1086. /// </summary>
  1087. /// <param name="childIndex">Índice del nodo hijo a recuperar.</param>
  1088. /// <returns>Nodo hijo n-ésimo del nodo actual. Devuelve null en caso de no existir.</returns>
  1089. public RtfTreeNode this[int childIndex]
  1090. {
  1091. get
  1092. {
  1093. RtfTreeNode res = null;
  1094. if (children != null && childIndex >= 0 && childIndex < children.Count)
  1095. res = children[childIndex];
  1096. return res;
  1097. }
  1098. }
  1099. /// <summary>
  1100. /// Devuelve el primer nodo hijo del nodo actual.
  1101. /// </summary>
  1102. public RtfTreeNode FirstChild
  1103. {
  1104. get
  1105. {
  1106. RtfTreeNode res = null;
  1107. if (children != null && children.Count > 0)
  1108. res = children[0];
  1109. return res;
  1110. }
  1111. }
  1112. /// <summary>
  1113. /// Devuelve el último nodo hijo del nodo actual.
  1114. /// </summary>
  1115. public RtfTreeNode LastChild
  1116. {
  1117. get
  1118. {
  1119. RtfTreeNode res = null;
  1120. if (children != null && children.Count > 0)
  1121. return children[children.Count - 1];
  1122. return res;
  1123. }
  1124. }
  1125. /// <summary>
  1126. /// Devuelve el nodo hermano siguiente del nodo actual (Dos nodos son hermanos si tienen el mismo nodo padre [ParentNode]).
  1127. /// </summary>
  1128. public RtfTreeNode NextSibling
  1129. {
  1130. get
  1131. {
  1132. RtfTreeNode res = null;
  1133. if (parent != null && parent.children != null)
  1134. {
  1135. int currentIndex = parent.children.IndexOf(this);
  1136. if (parent.children.Count > currentIndex + 1)
  1137. res = parent.children[currentIndex + 1];
  1138. }
  1139. return res;
  1140. }
  1141. }
  1142. /// <summary>
  1143. /// Devuelve el nodo hermano anterior del nodo actual (Dos nodos son hermanos si tienen el mismo nodo padre [ParentNode]).
  1144. /// </summary>
  1145. public RtfTreeNode PreviousSibling
  1146. {
  1147. get
  1148. {
  1149. RtfTreeNode res = null;
  1150. if (parent != null && parent.children != null)
  1151. {
  1152. int currentIndex = parent.children.IndexOf(this);

Large files files are truncated, but you can click here to view the full file