/src/name/carter/mark/flex/project/mdoc/MSuperNodeProperties.as

http://transcriptstudio4isha.googlecode.com/ · ActionScript · 220 lines · 175 code · 25 blank · 20 comment · 50 complexity · 67b2a81fd9b083b1af534ce732230438 MD5 · raw file

  1. /*
  2. Transcript Studio for Isha Foundation: An XML based application that allows users to define
  3. and store contextual metadata for contiguous sections within a text document.
  4. Copyright 2008 Mark Carter, Swami Kevala
  5. This file is part of Transcript Studio for Isha Foundation.
  6. Transcript Studio for Isha Foundation is free software: you can redistribute it and/or modify it
  7. under the terms of the GNU General Public License as published by the Free Software
  8. Foundation, either version 3 of the License, or (at your option) any later version.
  9. Transcript Studio for Isha Foundation is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License along with
  13. Transcript Studio for Isha Foundation. If not, see http://www.gnu.org/licenses/.
  14. */
  15. package name.carter.mark.flex.project.mdoc
  16. {
  17. import name.carter.mark.flex.util.XMLUtils;
  18. public class MSuperNodeProperties {
  19. public static const MARKUP_TYPE_TAG_NAME:String = "markupType";
  20. public static const MARKUP_CATEGORY_TAG_NAME:String = "markupCategory";
  21. public static const MARKUP_CATEGORY_SUGGESTION_TAG_NAME:String = "markupCategorySuggestion";
  22. public static const ADDITIONAL_CONCEPT_TAG_NAME:String = "concept";
  23. public static const SUMMARY_PROP_NAME:String = "summary";
  24. public static const NOTES_PROP_NAME:String = "notes";
  25. public static const RATING_PROP_NAME:String = "rating";
  26. public static const RATING_PROP_DEFAULT:int = -1;
  27. private var superNode:MSuperNode;
  28. public function MSuperNodeProperties(superNode:MSuperNode) {
  29. this.superNode = superNode;
  30. }
  31. public function overwrite(props:MSuperNodeProperties):void {
  32. markupTypeId = props.markupTypeId;
  33. markupCategoryId = props.markupCategoryId;
  34. markupCategorySuggestion = props.markupCategorySuggestion;
  35. additionalConcepts = props.additionalConcepts;
  36. summary = props.summary;
  37. notes = props.notes;
  38. rating = props.rating;
  39. }
  40. [Bindable]
  41. public function set markupTypeId(newValue:String):void {
  42. setSingletonTag(superNode, MARKUP_TYPE_TAG_NAME, newValue);
  43. }
  44. public function get markupTypeId():String {
  45. return getFirstTagValue(superNode, MARKUP_TYPE_TAG_NAME);
  46. }
  47. [Bindable]
  48. public function set markupCategoryId(newValue:String):void {
  49. setSingletonTag(superNode, MARKUP_CATEGORY_TAG_NAME, newValue);
  50. }
  51. public function get markupCategoryId():String {
  52. return getFirstTagValue(superNode, MARKUP_CATEGORY_TAG_NAME);
  53. }
  54. [Bindable]
  55. public function set markupCategorySuggestion(newValue:String):void {
  56. setSingletonTag(superNode, MARKUP_CATEGORY_SUGGESTION_TAG_NAME, newValue);
  57. }
  58. public function get markupCategorySuggestion():String {
  59. return getFirstTagValueOrBlank(superNode, MARKUP_CATEGORY_SUGGESTION_TAG_NAME);
  60. }
  61. [Bindable]
  62. public function set additionalConcepts(newValues:Array):void {
  63. setTags(superNode, ADDITIONAL_CONCEPT_TAG_NAME, newValues);
  64. }
  65. public function get additionalConcepts():Array {
  66. return superNode.getTagValues(ADDITIONAL_CONCEPT_TAG_NAME);
  67. }
  68. [Bindable]
  69. public function set summary(newValue:String):void {
  70. superNode.setElementProperty(SUMMARY_PROP_NAME, newValue);
  71. }
  72. public function get summary():String {
  73. return superNode.getElementPropertyValue(SUMMARY_PROP_NAME, "");
  74. }
  75. [Bindable]
  76. public function set notes(newValue:String):void {
  77. superNode.setElementProperty(NOTES_PROP_NAME, newValue);
  78. }
  79. public function get notes():String {
  80. return superNode.getElementPropertyValue(NOTES_PROP_NAME, "");
  81. }
  82. [Bindable]
  83. public function set rating(newValue:int):void {
  84. var strValue:String = newValue > RATING_PROP_DEFAULT ? newValue.toString() : null;
  85. superNode.setProperty(RATING_PROP_NAME, strValue);
  86. }
  87. public function get rating():int {
  88. var ratingStr:String = superNode.getPropertyValue(RATING_PROP_NAME);
  89. if (ratingStr == null) {
  90. return RATING_PROP_DEFAULT;
  91. }
  92. else {
  93. return new int(ratingStr);
  94. }
  95. }
  96. public function equals(obj:Object):Boolean {
  97. if (obj == this) {
  98. return true;
  99. }
  100. if (!(obj is MSuperNodeProperties)) {
  101. return false;
  102. }
  103. var guest:MSuperNodeProperties = obj as MSuperNodeProperties;
  104. if (this.markupTypeId != guest.markupTypeId) {
  105. return false;
  106. }
  107. if (this.markupCategoryId != guest.markupCategoryId) {
  108. return false;
  109. }
  110. if (this.markupCategorySuggestion != guest.markupCategorySuggestion) {
  111. return false;
  112. }
  113. if (!arrayEquals(this.additionalConcepts, guest.additionalConcepts)) {
  114. return false;
  115. }
  116. if (this.summary != guest.summary) {
  117. return false;
  118. }
  119. if (this.notes != guest.notes) {
  120. return false;
  121. }
  122. if (this.rating != guest.rating) {
  123. return false;
  124. }
  125. return true;
  126. }
  127. private static function arrayEquals(arr1:Array, arr2:Array):Boolean {
  128. if (arr1 == arr2) {
  129. return true;
  130. }
  131. if (arr1 == null || arr2 == null) {
  132. return false;
  133. }
  134. // both non-null
  135. if (arr1.length != arr2.length) {
  136. return false;
  137. }
  138. for (var i:int = 0; i < arr1.length; i++) {
  139. if (arr1[i] != arr2[i]) {
  140. return false;
  141. }
  142. }
  143. return true;
  144. }
  145. private static function getFirstTagValue(node:TaggableMNode, tagType:String, throwException:Boolean = false):String {
  146. var values:Array = node.getTagValues(tagType);
  147. if (values.length == 0) {
  148. if (throwException) {
  149. throw new ArgumentError("Could not find tag type '" + tagType + "' for node: " + node);
  150. }
  151. else {
  152. return null;
  153. }
  154. }
  155. return values[0];
  156. }
  157. private static function getFirstTagValueOrBlank(node:TaggableMNode, tagType:String):String {
  158. var result:String = getFirstTagValue(node, tagType);
  159. if (result == null) {
  160. return "";
  161. }
  162. else {
  163. return result;
  164. }
  165. }
  166. private static function setTags(taggable:TaggableMNode, type:String, values:Array):void {
  167. taggable.removeAllTags(type);
  168. if (values != null) {
  169. for each (var value:* in values) {
  170. if (value == null) {
  171. continue;
  172. }
  173. var valueStr:String = value.toString();
  174. if (valueStr != null && valueStr.length > 0) {
  175. taggable.addTag(type, valueStr);
  176. }
  177. }
  178. }
  179. }
  180. private static function setSingletonTag(taggable:TaggableMNode, type:String, value:Object):void {
  181. taggable.removeAllTags(type);
  182. if (value != null) {
  183. var valueStr:String = value.toString();
  184. if (valueStr != null && valueStr.length > 0) {
  185. taggable.addTag(type, valueStr);
  186. }
  187. }
  188. }
  189. }
  190. }