@flexem/fc-gui 3.0.0-alpha.17 → 3.0.0-alpha.171

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CHANGELOG.md +424 -1
  2. package/assets/img/black_first_page.png +0 -0
  3. package/assets/img/black_last_page.png +0 -0
  4. package/assets/img/black_next_page.png +0 -0
  5. package/assets/img/black_previous_page.png +0 -0
  6. package/assets/img/exclamation-outline-circle.png +0 -0
  7. package/bundles/@flexem/fc-gui.umd.js +39304 -34437
  8. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  9. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  10. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  11. package/communication/variable/variable-communicator.d.ts +5 -0
  12. package/communication/variable/variable-state-enum.d.ts +1 -0
  13. package/communication/variable/variable-state-enum.js +1 -0
  14. package/communication/variable/variable-state-enum.metadata.json +1 -1
  15. package/communication/variable/variable-value.d.ts +4 -1
  16. package/communication/variable/variable-value.js +4 -1
  17. package/communication/variable/variable-value.metadata.json +1 -1
  18. package/config/alarm/alarm.store.d.ts +6 -0
  19. package/config/alarm/alarm.store.js +0 -0
  20. package/config/alarm/alarm.store.metadata.json +1 -0
  21. package/config/alarm/get-alarms-args.d.ts +12 -0
  22. package/config/alarm/get-alarms-args.js +13 -0
  23. package/config/alarm/get-alarms-args.metadata.json +1 -0
  24. package/config/alarm/index.d.ts +2 -0
  25. package/config/alarm/index.js +1 -0
  26. package/config/alarm/index.metadata.json +1 -0
  27. package/config/config-store.d.ts +2 -0
  28. package/config/gui-feature-config.d.ts +3 -0
  29. package/config/gui-feature-config.js +3 -0
  30. package/config/gui-feature-config.metadata.json +1 -0
  31. package/config/index.d.ts +2 -0
  32. package/config/index.js +2 -0
  33. package/config/index.metadata.json +1 -1
  34. package/config/variable/variable-store.d.ts +1 -0
  35. package/elements/air-quality/air-quality-element.d.ts +31 -0
  36. package/elements/air-quality/air-quality-element.js +194 -0
  37. package/elements/air-quality/air-quality-element.metadata.json +1 -0
  38. package/elements/alarm/alarm-element.d.ts +69 -0
  39. package/elements/alarm/alarm-element.js +497 -0
  40. package/elements/alarm/alarm-element.metadata.json +1 -0
  41. package/elements/bar-graph-element.d.ts +10 -2
  42. package/elements/bar-graph-element.js +135 -5
  43. package/elements/bar-graph-element.metadata.json +1 -1
  44. package/elements/base/readable-element.d.ts +6 -1
  45. package/elements/base/readable-element.js +66 -2
  46. package/elements/base/readable-element.metadata.json +1 -1
  47. package/elements/base/state-control-element.d.ts +3 -1
  48. package/elements/base/state-control-element.js +21 -5
  49. package/elements/character-display/character-display-element.js +3 -2
  50. package/elements/character-display/character-display-element.metadata.json +1 -1
  51. package/elements/datetime-display/datetime-display-element.d.ts +1 -0
  52. package/elements/datetime-display/datetime-display-element.js +10 -2
  53. package/elements/datetime-display/datetime-display-element.metadata.json +1 -1
  54. package/elements/datetime-display/time-zone-select-json.d.ts +8 -0
  55. package/elements/datetime-display/time-zone-select-json.js +558 -0
  56. package/elements/historical-curve/historical-curve.element.d.ts +41 -3
  57. package/elements/historical-curve/historical-curve.element.js +662 -32
  58. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  59. package/elements/main-element.d.ts +1 -0
  60. package/elements/main-element.js +75 -9
  61. package/elements/main-element.metadata.json +1 -1
  62. package/elements/meter-element.d.ts +7 -1
  63. package/elements/meter-element.js +76 -7
  64. package/elements/meter-element.metadata.json +1 -1
  65. package/elements/numerical-display/numerical-display-element.d.ts +22 -3
  66. package/elements/numerical-display/numerical-display-element.js +145 -12
  67. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  68. package/elements/per-view-variable-communicator.d.ts +4 -0
  69. package/elements/per-view-variable-communicator.js +21 -1
  70. package/elements/per-view-variable-communicator.metadata.json +1 -1
  71. package/elements/ring-graph/ring-graph-element.d.ts +13 -1
  72. package/elements/ring-graph/ring-graph-element.js +164 -3
  73. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  74. package/elements/scroll-alarm/scroll-alarm-element.d.ts +78 -0
  75. package/elements/scroll-alarm/scroll-alarm-element.js +843 -0
  76. package/elements/scroll-alarm/scroll-alarm-element.metadata.json +1 -0
  77. package/elements/shared/graph/graph-state-element.d.ts +1 -0
  78. package/elements/shared/graph/graph-state-element.js +30 -1
  79. package/elements/shared/graph/graph-state-element.metadata.json +1 -1
  80. package/elements/shared/text/text-element.d.ts +14 -0
  81. package/elements/shared/text/text-element.js +42 -4
  82. package/elements/shared/text/text-element.metadata.json +1 -1
  83. package/elements/shared/text/text-state-element.d.ts +39 -2
  84. package/elements/shared/text/text-state-element.js +242 -67
  85. package/elements/shared/text/text-state-element.metadata.json +1 -1
  86. package/elements/static-elements/hyperlink-element.d.ts +28 -2
  87. package/elements/static-elements/hyperlink-element.js +153 -4
  88. package/elements/static-elements/hyperlink-element.metadata.json +1 -1
  89. package/elements/static-elements/text-element.d.ts +28 -2
  90. package/elements/static-elements/text-element.js +162 -12
  91. package/elements/static-elements/text-element.metadata.json +1 -1
  92. package/elements/switch-indicator-light/bit-indicator-light-operator.d.ts +1 -0
  93. package/elements/switch-indicator-light/bit-indicator-light-operator.js +10 -3
  94. package/elements/switch-indicator-light/bit-indicator-light-operator.metadata.json +1 -1
  95. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +11 -2
  96. package/elements/switch-indicator-light/switch-indicator-light-element.js +70 -12
  97. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  98. package/elements/switch-indicator-light/word-indicator-light-operator.d.ts +1 -0
  99. package/elements/switch-indicator-light/word-indicator-light-operator.js +10 -3
  100. package/elements/switch-indicator-light/word-indicator-light-operator.metadata.json +1 -1
  101. package/elements/video/video-element.d.ts +10 -0
  102. package/elements/video/video-element.js +119 -21
  103. package/elements/video/video-element.metadata.json +1 -1
  104. package/elements/view-operation/view-operation.element.d.ts +28 -2
  105. package/elements/view-operation/view-operation.element.js +163 -4
  106. package/elements/view-operation/view-operation.element.metadata.json +1 -1
  107. package/elements/weather/weater-element.js +0 -1
  108. package/gui/gui-context.d.ts +25 -2
  109. package/gui/gui-host.d.ts +1 -1
  110. package/gui/gui-view.d.ts +4 -1
  111. package/gui/gui-view.js +69 -8
  112. package/gui/gui-view.metadata.json +1 -1
  113. package/gui/gui.component.d.ts +3 -0
  114. package/gui/gui.component.js +15 -2
  115. package/gui/gui.component.metadata.json +1 -1
  116. package/localization/localization.service.d.ts +12 -0
  117. package/localization/localization.service.js +16 -4
  118. package/localization/localization.service.metadata.json +1 -1
  119. package/localization/localization.service.zh_CN.js +14 -2
  120. package/localization/localization.service.zh_CN.metadata.json +1 -1
  121. package/modal/write-character/write-character-modal.component.html +4 -4
  122. package/modal/write-character/write-character-modal.component.js +2 -2
  123. package/modal/write-character/write-character-modal.component.less +15 -0
  124. package/modal/write-character/write-character-modal.component.metadata.json +1 -1
  125. package/modal/write-value/write-value-modal-args.d.ts +5 -1
  126. package/modal/write-value/write-value-modal-args.js +3 -1
  127. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  128. package/modal/write-value/write-value-modal.component.d.ts +13 -7
  129. package/modal/write-value/write-value-modal.component.html +10 -5
  130. package/modal/write-value/write-value-modal.component.js +95 -20
  131. package/modal/write-value/write-value-modal.component.less +16 -1
  132. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  133. package/model/air-quality/air-quality-info.d.ts +23 -0
  134. package/model/air-quality/air-quality-info.js +4 -0
  135. package/model/air-quality/air-quality-info.metadata.json +1 -0
  136. package/model/air-quality/air-quality.model.d.ts +7 -0
  137. package/model/air-quality/air-quality.model.js +0 -0
  138. package/model/air-quality/air-quality.model.metadata.json +1 -0
  139. package/model/alarm/alarm.model.d.ts +13 -0
  140. package/model/alarm/alarm.model.js +0 -0
  141. package/model/alarm/alarm.model.metadata.json +1 -0
  142. package/model/bar-graph/bar-graph.d.ts +4 -0
  143. package/model/base/font-setting-model.d.ts +22 -1
  144. package/model/base/font-setting-model.metadata.json +1 -1
  145. package/model/base/readable-model.d.ts +4 -0
  146. package/model/datetime-display/datetime-display.d.ts +1 -0
  147. package/model/historical-curve/historical-curve-axis-settings.d.ts +11 -0
  148. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  149. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  150. package/model/historical-curve/historical-curve-chanel.model.d.ts +8 -0
  151. package/model/meter/meter.d.ts +4 -0
  152. package/model/numerical-display/numerical-operation.d.ts +10 -2
  153. package/model/ring-graph/ring-graph.model.d.ts +8 -0
  154. package/model/scroll-alarm/scroll-alarm.model.d.ts +21 -0
  155. package/model/scroll-alarm/scroll-alarm.model.js +0 -0
  156. package/model/scroll-alarm/scroll-alarm.model.metadata.json +1 -0
  157. package/model/shared/state/state.d.ts +1 -0
  158. package/model/shared/state/state.js +1 -0
  159. package/model/shared/state/state.metadata.json +1 -1
  160. package/model/shared/text/font.d.ts +1 -1
  161. package/model/shared/text/text.d.ts +3 -0
  162. package/model/switch-indicator-light/switch-indicator-light.d.ts +2 -0
  163. package/model/view-operation/view-operation-element.model.d.ts +7 -1
  164. package/package.json +1 -1
  165. package/public_api.js +1 -0
  166. package/remote/communication/variable/remote-variable-communicator.d.ts +30 -0
  167. package/remote/communication/variable/remote-variable-communicator.js +193 -3
  168. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  169. package/remote/communication/variable/remote-variable-protocol.d.ts +8 -0
  170. package/service/index.d.ts +4 -0
  171. package/service/index.js +1 -0
  172. package/service/index.metadata.json +1 -1
  173. package/service/language.service.d.ts +37 -0
  174. package/service/language.service.js +0 -0
  175. package/service/language.service.metadata.json +1 -0
  176. package/service/released-variable/index.d.ts +1 -0
  177. package/service/released-variable/index.js +0 -0
  178. package/service/released-variable/index.metadata.json +1 -0
  179. package/service/released-variable/released-variable.service.d.ts +4 -0
  180. package/service/released-variable/released-variable.service.js +0 -0
  181. package/service/released-variable/released-variable.service.metadata.json +1 -0
  182. package/service/system-text-library.service.d.ts +77 -0
  183. package/service/system-text-library.service.js +29 -0
  184. package/service/system-text-library.service.metadata.json +1 -0
  185. package/service/text-library.service.d.ts +49 -0
  186. package/service/text-library.service.js +0 -0
  187. package/service/text-library.service.metadata.json +1 -0
  188. package/service/weather.service.d.ts +1 -0
  189. package/shared/gui-consts.d.ts +3 -0
  190. package/shared/gui-consts.js +3 -0
  191. package/shared/gui-consts.metadata.json +1 -1
  192. package/utils/data-type/fbox-data-type.service.js +40 -0
  193. package/utils/numerical-operation.service.js +28 -4
@@ -0,0 +1 @@
1
+ [{"__symbolic":"module","version":4,"metadata":{"ScrollAlarmElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-dynamic-display-element","name":"ConditionalDynamicDisplayElement","line":16,"character":40},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":54,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":55,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":56,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":57,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":58,"character":23},{"__symbolic":"reference","module":"../../config","name":"AlarmsStore","line":59,"character":38},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"getAlarmData":[{"__symbolic":"method"}],"initDisplayContainer":[{"__symbolic":"method"}],"_buildFontAttrs":[{"__symbolic":"method"}],"_createSvgTextNode":[{"__symbolic":"method"}],"_measureTextWithCanvas":[{"__symbolic":"method"}],"_getSvgTextWidth":[{"__symbolic":"method"}],"_updateUnderlineWidth":[{"__symbolic":"method"}],"renderNewPage":[{"__symbolic":"method"}],"_rebaseTextNodes":[{"__symbolic":"method"}],"removeOldestPage":[{"__symbolic":"method"}],"scrollContent":[{"__symbolic":"method"}],"initScrolling":[{"__symbolic":"method"}],"resetToFirstPage":[{"__symbolic":"method"}],"updateQueryTimeRange":[{"__symbolic":"method"}],"setStatusAsNormal":[{"__symbolic":"method"}],"setStatusAsLoading":[{"__symbolic":"method"}],"renderStatus":[{"__symbolic":"method"}],"clearStatus":[{"__symbolic":"method"}],"renderStaticDisplay":[{"__symbolic":"method"}],"initStaticScrolling":[{"__symbolic":"method"}],"scrollStaticContent":[{"__symbolic":"method"}],"replaceCurrentScrollingContent":[{"__symbolic":"method"}]}}}}]
@@ -24,4 +24,5 @@ export declare class GraphStateElement {
24
24
  private removeImageElement;
25
25
  private doFaultFlicker;
26
26
  private clearFlickerInterval;
27
+ dispose(): void;
27
28
  }
@@ -42,12 +42,19 @@ export class GraphStateElement {
42
42
  }
43
43
  }
44
44
  changeGraph(stateId, graphResult) {
45
+ // 检查元素是否已被销毁
46
+ if (!this._element) {
47
+ return;
48
+ }
45
49
  if (!graphResult.failed) {
46
50
  const graph = graphResult.graph;
47
51
  switch (graph.graphType) {
48
52
  case GraphType.Image:
49
53
  case GraphType.SVG:
50
54
  const imageElement = this.getImageElement();
55
+ if (!imageElement) {
56
+ return;
57
+ }
51
58
  imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', graph.source);
52
59
  this.doFaultFlicker(imageElement, stateId);
53
60
  break;
@@ -63,6 +70,10 @@ export class GraphStateElement {
63
70
  }
64
71
  getImageElement() {
65
72
  if (!this.imageElement) {
73
+ // 检查 _element 是否已被销毁
74
+ if (!this._element) {
75
+ return null;
76
+ }
66
77
  this.imageElement = document.createElementNS('http://www.w3.org/2000/svg', 'image');
67
78
  this.imageElement.setAttribute('width', this.width + '');
68
79
  this.imageElement.setAttribute('height', this.height + '');
@@ -74,7 +85,7 @@ export class GraphStateElement {
74
85
  return this.imageElement;
75
86
  }
76
87
  removeImageElement() {
77
- if (this.imageElement) {
88
+ if (this.imageElement && this._element) {
78
89
  this._element.removeChild(this.imageElement);
79
90
  delete this.imageElement;
80
91
  }
@@ -107,4 +118,22 @@ export class GraphStateElement {
107
118
  }
108
119
  }
109
120
  }
121
+ dispose() {
122
+ // 清理定时器
123
+ if (this.faultFlickerInterval) {
124
+ clearInterval(this.faultFlickerInterval);
125
+ this.faultFlickerInterval = undefined;
126
+ }
127
+ // 移除图片元素
128
+ this.removeImageElement();
129
+ // 清理图形缓存
130
+ if (this.graphs) {
131
+ this.graphs.clear();
132
+ }
133
+ // 清理 SVG 元素
134
+ if (this._element && this._element.parentNode) {
135
+ this._element.parentNode.removeChild(this._element);
136
+ }
137
+ this._element = null;
138
+ }
110
139
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"GraphStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"../../../model","name":"GraphSetting","line":21,"character":47},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../config","name":"GraphStore","line":24,"character":37},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":25,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":27,"character":41}]}]}],"switchToState":[{"__symbolic":"method"}],"changeGraph":[{"__symbolic":"method"}],"getImageElement":[{"__symbolic":"method"}],"removeImageElement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"GraphStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"../../../model","name":"GraphSetting","line":21,"character":47},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../config","name":"GraphStore","line":24,"character":37},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":25,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":27,"character":41}]}]}],"switchToState":[{"__symbolic":"method"}],"changeGraph":[{"__symbolic":"method"}],"getImageElement":[{"__symbolic":"method"}],"removeImageElement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}]}}}}]
@@ -1,8 +1,22 @@
1
1
  import { Font } from '../../../model';
2
2
  export declare class TextElementModal {
3
3
  private _element;
4
+ private font;
5
+ private width;
6
+ private height;
7
+ private isVariableText?;
4
8
  get Element(): SVGElement;
5
9
  constructor(content: string, font: Font, width: number, height: number, isVariableText?: boolean);
10
+ /**
11
+ * 更新字体样式
12
+ * @param font 新的字体样式
13
+ */
14
+ updateFont(font: Font): void;
15
+ /**
16
+ * 更新文本内容
17
+ * @param content 新的文本内容
18
+ */
19
+ updateText(content: string): void;
6
20
  private getforeignObjectElement;
7
21
  private createNewForeignObjectText;
8
22
  }
@@ -1,6 +1,11 @@
1
1
  import { isNil } from 'lodash';
2
2
  export class TextElementModal {
3
3
  constructor(content, font, width, height, isVariableText) {
4
+ // 保存参数以便后续更新文本
5
+ this.font = font;
6
+ this.width = width;
7
+ this.height = height;
8
+ this.isVariableText = isVariableText;
4
9
  if (/iPhone|iPod/i.test(navigator.userAgent)) {
5
10
  width += 10;
6
11
  }
@@ -12,6 +17,28 @@ export class TextElementModal {
12
17
  get Element() {
13
18
  return this._element;
14
19
  }
20
+ /**
21
+ * 更新字体样式
22
+ * @param font 新的字体样式
23
+ */
24
+ updateFont(font) {
25
+ this.font = font;
26
+ }
27
+ /**
28
+ * 更新文本内容
29
+ * @param content 新的文本内容
30
+ */
31
+ updateText(content) {
32
+ // 清空现有内容
33
+ this._element.innerHTML = '';
34
+ // 创建新的文本元素
35
+ let width = this.width;
36
+ if (/iPhone|iPod/i.test(navigator.userAgent)) {
37
+ width += 10;
38
+ }
39
+ const text = this.createNewForeignObjectText(content, this.font, width, this.height, this.isVariableText);
40
+ this._element.appendChild(text);
41
+ }
15
42
  getforeignObjectElement(width, height) {
16
43
  const textElement = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
17
44
  textElement.setAttribute('width', width.toString());
@@ -19,7 +46,7 @@ export class TextElementModal {
19
46
  return textElement;
20
47
  }
21
48
  createNewForeignObjectText(content, font, width, height, isVariableText) {
22
- if (font) {
49
+ if (font && !font.fontFamily.includes(',msyh')) {
23
50
  font.fontFamily += ',msyh';
24
51
  }
25
52
  const bodyDiv = document.createElement('div');
@@ -36,7 +63,7 @@ export class TextElementModal {
36
63
  for (let index = 0; index < textArray.length; index++) {
37
64
  const textDiv = document.createElement('div');
38
65
  textDiv.className = 'text-list';
39
- textDiv.innerHTML = textArray[index] ? textArray[index] : '&nbsp;';
66
+ const innerHTML = textArray[index] ? textArray[index] : '&nbsp;';
40
67
  let fontString = '';
41
68
  if (font.isItalic) {
42
69
  fontString += 'italic ';
@@ -45,12 +72,23 @@ export class TextElementModal {
45
72
  fontString += 'bold ';
46
73
  }
47
74
  let lineHeight = 0;
75
+ // chrome支持可显示最小字体大小为12px, 更小字体通过缩放实现
76
+ const minFontSize = 12;
48
77
  lineHeight = parseInt(font.fontSize, 10) + 5;
49
78
  fontString += font.fontSize + '/' + lineHeight.toString() + 'px ' + font.fontFamily;
50
- textDiv.style.cssText = `color: ${font.color};word-break: break-all;font: ${fontString};`;
51
- if (font.isUnderline) {
79
+ textDiv.style.cssText = `color: ${font.color};word-break: break-all;font: ${fontString};text-align: ${textAlign};`;
80
+ if (font.isUnderline && content.length > 0) {
52
81
  textDiv.style.textDecoration = 'underline';
53
82
  }
83
+ const spanText = document.createElement('span');
84
+ spanText.style.cssText = `
85
+ display: contents;
86
+ transform: scale(${parseInt(font.fontSize, 10) > minFontSize ? 1 : parseInt(font.fontSize, 10) / minFontSize});
87
+ width: 100%;
88
+ height: 100%;
89
+ `;
90
+ spanText.innerHTML = innerHTML;
91
+ textDiv.appendChild(spanText);
54
92
  fragment.appendChild(textDiv);
55
93
  }
56
94
  bodyDiv.appendChild(fragment);
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"TextElementModal":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../../model","name":"Font","line":11,"character":39},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"boolean"}]}],"getforeignObjectElement":[{"__symbolic":"method"}],"createNewForeignObjectText":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"TextElementModal":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../../model","name":"Font","line":15,"character":39},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"boolean"}]}],"updateFont":[{"__symbolic":"method"}],"updateText":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"createNewForeignObjectText":[{"__symbolic":"method"}]}}}}]
@@ -1,6 +1,9 @@
1
1
  import { LoggerService } from '../../../logger';
2
+ import { TextLibrarySetting } from '../../../model/base/font-setting-model';
2
3
  import { IndicatorLightFaultFlicker } from '../../../model/switch-indicator-light/indicator-light-fault-flicker';
4
+ import { TextLibraryService, LanguageService } from '../../../service';
3
5
  import { TextState } from './text-state.model';
6
+ import { GuiContext } from '../../../gui/gui-context';
4
7
  export declare class TextStateElement {
5
8
  private readonly textStates;
6
9
  private width;
@@ -8,16 +11,50 @@ export declare class TextStateElement {
8
11
  private readonly logger;
9
12
  private readonly version?;
10
13
  private readonly faultFlickers?;
14
+ private readonly textLibrarySetting?;
15
+ private readonly textLibraryService?;
16
+ private readonly languageService?;
17
+ private readonly guiContext?;
18
+ private readonly allowEmpty;
19
+ private readonly fontStyleCultures?;
11
20
  private textElement;
12
21
  private _element;
13
22
  get Element(): SVGElement;
14
23
  private faultFlickerStatus;
15
24
  private faultFlickerInterval;
16
- constructor(textStates: TextState[], width: number, height: number, logger: LoggerService, version?: number, faultFlickers?: IndicatorLightFaultFlicker[]);
25
+ private currentStateId;
26
+ private languageChangeSubscription?;
27
+ constructor(textStates: TextState[], width: number, height: number, logger: LoggerService, version?: number, faultFlickers?: IndicatorLightFaultFlicker[], textLibrarySetting?: TextLibrarySetting, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext, allowEmpty?: boolean, fontStyleCultures?: {
28
+ [stateId: string]: {
29
+ [languageCode: string]: any;
30
+ };
31
+ });
17
32
  switchToState(stateId: number): void;
33
+ /**
34
+ * 订阅语种变化事件
35
+ * 当设备的语种ID改变时,重新渲染当前状态的文本
36
+ */
37
+ private subscribeLanguageChange;
38
+ /**
39
+ * 释放资源
40
+ */
41
+ dispose(): void;
18
42
  private getforeignObjectElement;
19
- private createNewForeignObjectText;
20
43
  private removeForeignObjectlement;
21
44
  private doFaultFlicker;
22
45
  private clearFlickerInterval;
46
+ /**
47
+ * 获取指定状态在当前语种下的字体样式
48
+ * fontStyleCultures 中保存的对象含 fontStyle 字符串但无 isBold/isItalic/fontFamily,
49
+ * 此处从 fontStyle 解析这三个字段后返回
50
+ */
51
+ private getFontForState;
52
+ /**
53
+ * 获取显示文本
54
+ * 支持三种格式:
55
+ * 1. 新格式:textData.cultures 在顶层(与 content 并列)
56
+ * 2. 中间格式:textData.content 为 { cultures: {...} }(已废弃,向下兼容)
57
+ * 3. 旧格式:textData.content 为字符串
58
+ */
59
+ private getDisplayText;
23
60
  }
@@ -1,112 +1,151 @@
1
1
  import { Flicker } from '../../../model';
2
- import { isNil } from 'lodash';
3
2
  export class TextStateElement {
4
- constructor(textStates, width, height, logger, version, faultFlickers) {
3
+ constructor(textStates, width, height, logger, version, faultFlickers, textLibrarySetting, textLibraryService, languageService, guiContext, allowEmpty = false, fontStyleCultures) {
5
4
  this.textStates = textStates;
6
5
  this.width = width;
7
6
  this.height = height;
8
7
  this.logger = logger;
9
8
  this.version = version;
10
9
  this.faultFlickers = faultFlickers;
10
+ this.textLibrarySetting = textLibrarySetting;
11
+ this.textLibraryService = textLibraryService;
12
+ this.languageService = languageService;
13
+ this.guiContext = guiContext;
14
+ this.allowEmpty = allowEmpty;
15
+ this.fontStyleCultures = fontStyleCultures;
11
16
  this.faultFlickerStatus = false;
12
17
  this.faultFlickerInterval = undefined;
13
18
  this._element = document.createElementNS('http://www.w3.org/2000/svg', 'g');
19
+ // 订阅语种变化事件
20
+ this.subscribeLanguageChange();
14
21
  }
15
22
  get Element() {
16
23
  return this._element;
17
24
  }
18
25
  switchToState(stateId) {
26
+ // 保存当前状态ID,用于语种切换时重新渲染
27
+ this.currentStateId = stateId;
19
28
  const textState = this.textStates.find(t => t.id === stateId);
20
29
  if (textState === undefined) {
21
30
  this.removeForeignObjectlement();
22
31
  this.logger.debug(`Can not find text state:${stateId}.`);
23
32
  return;
24
33
  }
25
- const content = textState.text.content;
26
- if (content === '') {
34
+ // 获取显示文本(支持文本库)
35
+ const content = this.getDisplayText(stateId, textState.text);
36
+ if (content === '' || content == null) {
27
37
  this.removeForeignObjectlement();
28
38
  return;
29
39
  }
30
- const font = textState.text.font;
40
+ const font = this.getFontForState(stateId, textState.text.font);
31
41
  if (!font) {
32
42
  this.removeForeignObjectlement();
33
43
  this.logger.debug('The font is undefined.');
34
44
  return;
35
45
  }
36
- const foreignObjectElement = this.getforeignObjectElement();
37
- foreignObjectElement.innerHTML = '';
38
- const text = this.createNewForeignObjectText(content, font);
39
- foreignObjectElement.appendChild(text);
40
- this.doFaultFlicker(foreignObjectElement, stateId);
46
+ const textElement = this.getforeignObjectElement();
47
+ textElement.setAttribute('pointer-events', 'auto');
48
+ // 根据 textAlign 计算 SVG text-anchor x 坐标
49
+ const textAlign = font.textAlign || 'center';
50
+ let textAnchor;
51
+ let anchorX;
52
+ if (textAlign === 'left') {
53
+ textAnchor = 'start';
54
+ anchorX = 0;
55
+ }
56
+ else if (textAlign === 'right') {
57
+ textAnchor = 'end';
58
+ anchorX = this.width;
59
+ }
60
+ else {
61
+ textAnchor = 'middle';
62
+ anchorX = this.width / 2;
63
+ }
64
+ // 拆分换行
65
+ const lines = content.split('\n');
66
+ const fontSize = parseInt(font.fontSize, 10);
67
+ const lineHeight = fontSize + 4;
68
+ // 总高度 = 行数 * 行高
69
+ const totalHeight = lines.length * lineHeight;
70
+ // 调整文本整体垂直居中(通过 dy)
71
+ const startY = (this.height / 2) - (totalHeight / 2) + (lineHeight / 2);
72
+ // 复用已有 tspan,不足则新建,多余则隐藏——避免删除 touch 目标节点导致 touchend 丢失
73
+ const existingTspans = Array.from(textElement.children);
74
+ for (let i = 0; i < lines.length; i++) {
75
+ let tspan = existingTspans[i];
76
+ if (!tspan) {
77
+ tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
78
+ textElement.appendChild(tspan);
79
+ }
80
+ tspan.setAttribute('display', 'inline');
81
+ tspan.setAttribute('x', anchorX.toString());
82
+ tspan.setAttribute('y', startY + i * lineHeight + 'px');
83
+ tspan.textContent = lines[i].replace(/ /g, ' ');
84
+ tspan.setAttribute('font-size', font.fontSize);
85
+ tspan.setAttribute('fill', font.color);
86
+ tspan.setAttribute('font-family', font.fontFamily);
87
+ tspan.setAttribute('font-weight', font.isBold ? 'bold' : 'normal');
88
+ tspan.setAttribute('font-style', font.isItalic ? 'italic' : 'normal');
89
+ tspan.setAttribute('text-decoration', font.isUnderline ? 'underline' : 'none');
90
+ tspan.setAttribute('text-anchor', textAnchor);
91
+ tspan.setAttribute('dominant-baseline', 'middle');
92
+ }
93
+ // 隐藏多余的 tspan(不删除)
94
+ for (let i = lines.length; i < existingTspans.length; i++) {
95
+ existingTspans[i].setAttribute('display', 'none');
96
+ }
97
+ this.doFaultFlicker(textElement, stateId);
98
+ }
99
+ /**
100
+ * 订阅语种变化事件
101
+ * 当设备的语种ID改变时,重新渲染当前状态的文本
102
+ */
103
+ subscribeLanguageChange() {
104
+ if (this.guiContext && this.guiContext.languageChanged$) {
105
+ this.languageChangeSubscription = this.guiContext.languageChanged$.subscribe(() => {
106
+ // 如果当前有状态,重新渲染
107
+ if (this.currentStateId !== undefined) {
108
+ this.switchToState(this.currentStateId);
109
+ }
110
+ });
111
+ }
112
+ }
113
+ /**
114
+ * 释放资源
115
+ */
116
+ dispose() {
117
+ // 取消语种变化订阅
118
+ if (this.languageChangeSubscription) {
119
+ this.languageChangeSubscription.unsubscribe();
120
+ this.languageChangeSubscription = undefined;
121
+ }
122
+ // 清除闪烁定时器
123
+ if (this.faultFlickerInterval) {
124
+ clearInterval(this.faultFlickerInterval);
125
+ this.faultFlickerInterval = undefined;
126
+ }
41
127
  }
42
128
  getforeignObjectElement() {
43
129
  if (!this.textElement) {
44
- this.textElement = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
45
- this.textElement.setAttribute('width', this.width.toString());
46
- this.textElement.setAttribute('height', this.height.toString());
130
+ this.textElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');
131
+ this.textElement.setAttribute('x', (this.width / 2).toString());
132
+ this.textElement.setAttribute('y', (this.height / 2).toString());
133
+ this.textElement.setAttribute('text-anchor', 'middle');
134
+ this.textElement.setAttribute('dominant-baseline', 'middle');
135
+ this.textElement.setAttribute('pointer-events', 'auto'); // 确保能接收事件
47
136
  this._element.appendChild(this.textElement);
48
137
  }
138
+ this.textElement.setAttribute('display', 'block');
49
139
  return this.textElement;
50
140
  }
51
- createNewForeignObjectText(content, font) {
52
- if (font) {
53
- font.fontFamily += ',msyh';
54
- }
55
- const bodyDiv = document.createElement('div');
56
- bodyDiv.style.textAlign = font.textAlign ? font.textAlign : 'center';
57
- bodyDiv.style.userSelect = 'none';
58
- bodyDiv.style.display = 'table-cell';
59
- bodyDiv.style.verticalAlign = 'middle';
60
- if (isNil(content)) {
61
- content = '';
62
- }
63
- let textArray = content.toString().split('\n');
64
- textArray = textArray.map(item => {
65
- return item.toString().replace(/\s/g, '&nbsp;');
66
- });
67
- const fragment = document.createDocumentFragment();
68
- for (let index = 0; index < textArray.length; index++) {
69
- const textDiv = document.createElement('div');
70
- textDiv.innerHTML = textArray[index] ? textArray[index] : '&nbsp;';
71
- let fontString = '';
72
- if (font.isItalic) {
73
- fontString += 'italic ';
74
- }
75
- if (font.isBold) {
76
- fontString += 'bold ';
77
- }
78
- textDiv.style.wordBreak = 'break-word';
79
- textDiv.style.color = font.color;
80
- let lineHeight = 0;
81
- lineHeight = parseInt(font.fontSize, 10) + 5;
82
- fontString += font.fontSize + 'px/' + lineHeight + 'px ' + font.fontFamily;
83
- textDiv.style.font = fontString;
84
- if (font.isUnderline) {
85
- textDiv.style.textDecoration = 'underline';
86
- }
87
- fragment.appendChild(textDiv);
88
- }
89
- bodyDiv.appendChild(fragment);
90
- const contentDiv = document.createElement('div');
91
- contentDiv.style.display = 'table';
92
- contentDiv.style.width = '100%';
93
- contentDiv.style.height = '100%';
94
- contentDiv.appendChild(bodyDiv);
95
- const containerDiv = document.createElement('div');
96
- containerDiv.style.overflow = 'hidden';
97
- containerDiv.style.width = this.width.toString() + 'px';
98
- containerDiv.style.height = this.height.toString() + 'px';
99
- containerDiv.appendChild(contentDiv);
100
- return containerDiv;
101
- }
102
141
  removeForeignObjectlement() {
103
142
  if (this.textElement) {
104
- this._element.removeChild(this.textElement);
105
- delete this.textElement;
143
+ this.textElement.setAttribute('display', 'none');
144
+ this.textElement.textContent = '';
106
145
  }
107
146
  }
108
147
  doFaultFlicker(textElement, stateId) {
109
- if (this.version > 3 && this.faultFlickers) {
148
+ if (this.version != null && this.version > 3 && this.faultFlickers) {
110
149
  this.clearFlickerInterval(textElement);
111
150
  const faultFlicker = this.faultFlickers.find(t => t.id === stateId);
112
151
  if (faultFlicker && faultFlicker.faultFlicker) {
@@ -133,4 +172,140 @@ export class TextStateElement {
133
172
  }
134
173
  }
135
174
  }
175
+ /**
176
+ * 获取指定状态在当前语种下的字体样式
177
+ * fontStyleCultures 中保存的对象含 fontStyle 字符串但无 isBold/isItalic/fontFamily,
178
+ * 此处从 fontStyle 解析这三个字段后返回
179
+ */
180
+ getFontForState(stateId, defaultFont) {
181
+ if (!this.fontStyleCultures) {
182
+ return defaultFont;
183
+ }
184
+ const stateKey = stateId.toString();
185
+ if (!this.fontStyleCultures[stateKey]) {
186
+ return defaultFont;
187
+ }
188
+ const getTargetLanguage = () => {
189
+ var _a, _b, _c, _d, _e, _f;
190
+ const currentLanguageId = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getCurrentLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
191
+ const defaultLanguage = ((_d = this.languageService) === null || _d === void 0 ? void 0 : _d.getDefaultLanguage()) || 'zh-CN';
192
+ if (currentLanguageId === null || currentLanguageId === undefined) {
193
+ return defaultLanguage;
194
+ }
195
+ return ((_f = (_e = this.guiContext) === null || _e === void 0 ? void 0 : _e.getLanguageCultureById) === null || _f === void 0 ? void 0 : _f.call(_e, currentLanguageId)) || defaultLanguage;
196
+ };
197
+ const targetLanguage = getTargetLanguage();
198
+ if (this.fontStyleCultures[stateKey][targetLanguage]) {
199
+ const culturedFont = this.fontStyleCultures[stateKey][targetLanguage];
200
+ if (culturedFont.fontStyle) {
201
+ const fs = culturedFont.fontStyle;
202
+ const isBold = fs.indexOf('bold') !== -1;
203
+ const isItalic = fs.indexOf('Italic') !== -1;
204
+ const parts = fs.split(' ');
205
+ const familyIndex = (isBold ? 1 : 0) + (isItalic ? 1 : 0) + 1;
206
+ const fontFamily = parts.length > familyIndex ? parts[familyIndex] : null;
207
+ return Object.assign(Object.assign({}, culturedFont), { isBold, isItalic, fontFamily });
208
+ }
209
+ return culturedFont;
210
+ }
211
+ return defaultFont;
212
+ }
213
+ /**
214
+ * 获取显示文本
215
+ * 支持三种格式:
216
+ * 1. 新格式:textData.cultures 在顶层(与 content 并列)
217
+ * 2. 中间格式:textData.content 为 { cultures: {...} }(已废弃,向下兼容)
218
+ * 3. 旧格式:textData.content 为字符串
219
+ */
220
+ getDisplayText(stateId, textData) {
221
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
222
+ const getTargetLanguage = () => {
223
+ var _a, _b, _c, _d, _e, _f;
224
+ const currentLanguageId = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getCurrentLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
225
+ const defaultLanguage = ((_d = this.languageService) === null || _d === void 0 ? void 0 : _d.getDefaultLanguage()) || 'zh-CN';
226
+ if (currentLanguageId === null || currentLanguageId === undefined) {
227
+ return defaultLanguage;
228
+ }
229
+ return ((_f = (_e = this.guiContext) === null || _e === void 0 ? void 0 : _e.getLanguageCultureById) === null || _f === void 0 ? void 0 : _f.call(_e, currentLanguageId)) || defaultLanguage;
230
+ };
231
+ const defaultContent = textData === null || textData === void 0 ? void 0 : textData.content;
232
+ // 新格式:cultures 在 text 顶层
233
+ if (textData && textData.cultures && typeof textData.cultures === 'object') {
234
+ const targetLanguage = getTargetLanguage();
235
+ if (textData.cultures[targetLanguage]) {
236
+ return textData.cultures[targetLanguage];
237
+ }
238
+ else if (this.allowEmpty) {
239
+ return '';
240
+ }
241
+ else {
242
+ const language = ((_c = (_b = (_a = window.abp) === null || _a === void 0 ? void 0 : _a.localization) === null || _b === void 0 ? void 0 : _b.currentLanguage) === null || _c === void 0 ? void 0 : _c.name) || 'zh-Hans';
243
+ const isChinese = language === 'zh-Hans' || language === 'zh';
244
+ return isChinese ? '文本' : 'Text';
245
+ }
246
+ }
247
+ // 中间格式(兼容):content 为 { cultures: {...} }
248
+ if (defaultContent && typeof defaultContent === 'object' && defaultContent.cultures) {
249
+ const targetLanguage = getTargetLanguage();
250
+ if (defaultContent.cultures[targetLanguage]) {
251
+ return defaultContent.cultures[targetLanguage];
252
+ }
253
+ else if (this.allowEmpty) {
254
+ return '';
255
+ }
256
+ else {
257
+ const language = ((_f = (_e = (_d = window.abp) === null || _d === void 0 ? void 0 : _d.localization) === null || _e === void 0 ? void 0 : _e.currentLanguage) === null || _f === void 0 ? void 0 : _f.name) || 'zh-Hans';
258
+ const isChinese = language === 'zh-Hans' || language === 'zh';
259
+ return isChinese ? '文本' : 'Text';
260
+ }
261
+ }
262
+ // 检查是否使用文本库
263
+ if (this.textLibrarySetting && this.textLibrarySetting.labelType === 'textLibrary') {
264
+ const textLibraryId = this.textLibrarySetting.selectedTextLibraryItem;
265
+ if (textLibraryId && this.textLibraryService) {
266
+ // 获取文本库数据
267
+ const textLibraryData = this.textLibraryService.getTextLibraryById(typeof textLibraryId === 'string' ? parseInt(textLibraryId, 10) : textLibraryId);
268
+ if (textLibraryData && textLibraryData.data) {
269
+ // 使用状态ID作为value查找对应的文本条目
270
+ const textEntry = textLibraryData.data.find(entry => entry.value === stateId.toString());
271
+ if (textEntry) {
272
+ // 获取当前语种ID
273
+ const currentLanguageId = (_j = (_h = (_g = this.guiContext) === null || _g === void 0 ? void 0 : _g.getCurrentLanguageId) === null || _h === void 0 ? void 0 : _h.call(_g)) !== null && _j !== void 0 ? _j : null;
274
+ // 确定要使用的语种代码(culture)
275
+ let targetLanguage;
276
+ const defaultLanguage = ((_k = this.languageService) === null || _k === void 0 ? void 0 : _k.getDefaultLanguage()) || 'zh-CN';
277
+ if (currentLanguageId === null || currentLanguageId === undefined) {
278
+ // 设备未设置当前语种,使用默认语种
279
+ targetLanguage = defaultLanguage;
280
+ }
281
+ else {
282
+ // 设备已设置当前语种,获取对应的语种代码
283
+ const currentLanguage = (_m = (_l = this.guiContext) === null || _l === void 0 ? void 0 : _l.getLanguageCultureById) === null || _m === void 0 ? void 0 : _m.call(_l, currentLanguageId);
284
+ if (currentLanguage) {
285
+ // 直接使用设备设置的语种,不再fallback
286
+ targetLanguage = currentLanguage;
287
+ }
288
+ else {
289
+ targetLanguage = defaultLanguage;
290
+ }
291
+ }
292
+ // 返回对应语种的文本,如果没有则返回空字符串
293
+ if (textEntry.cultures && textEntry.cultures[targetLanguage]) {
294
+ const text = textEntry.cultures[targetLanguage];
295
+ return text;
296
+ }
297
+ else {
298
+ // 对应语种没有文本,返回空字符串
299
+ return '';
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }
305
+ // 处理字符串格式的 defaultContent
306
+ if (typeof defaultContent === 'string') {
307
+ return defaultContent;
308
+ }
309
+ return '';
310
+ }
136
311
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"TextStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"./text-state.model","name":"TextState","line":18,"character":45}]},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":21,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":23,"character":41}]}]}],"switchToState":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"createNewForeignObjectText":[{"__symbolic":"method"}],"removeForeignObjectlement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"TextStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"./text-state.model","name":"TextState","line":23,"character":45}]},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":26,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":28,"character":41}]},{"__symbolic":"reference","module":"../../../model/base/font-setting-model","name":"TextLibrarySetting","line":29,"character":46},{"__symbolic":"reference","module":"../../../service","name":"TextLibraryService","line":30,"character":46},{"__symbolic":"reference","module":"../../../service","name":"LanguageService","line":31,"character":43},{"__symbolic":"reference","module":"../../../gui/gui-context","name":"GuiContext","line":32,"character":38},{"__symbolic":"reference","name":"boolean"},{"__symbolic":"error","message":"Expression form not supported","line":34,"character":45}]}],"switchToState":[{"__symbolic":"method"}],"subscribeLanguageChange":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"removeForeignObjectlement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}],"getFontForState":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}]}}}}]