source: uKadecot/trunk/tools/EcnlControllerUI/EcnlControllerUI/Control.cs

Last change on this file was 148, checked in by coas-nagasima, 8 years ago

メッセージバッファ領域がなくなったときにWebSocketパケットを誤って処理してしまうのを修正。
Ethernet送信バッファが取れないときにパケットが送信できなかったのを修正。
その他、処理の安定性の向上。

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csharp
File size: 50.8 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2015 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id: Control.cs 148 2016-01-08 05:35:52Z coas-nagasima $
36 */
37
38using System;
39using System.Collections;
40using System.Collections.Generic;
41using System.Diagnostics;
42using System.Html;
43using System.Linq;
44using System.Net.WebSockets;
45using System.Serialization;
46using System.Text;
47using System.Text.RegularExpressions;
48using System.Web;
49using System.Xml;
50using control;
51using ctrlui;
52using jQueryApi;
53using Kadecot;
54
55namespace control
56{
57 public static class UI
58 {
59 public static DeviceController.DeviceInfo GetDeviceInfo(this JsonClassInfo dc, WebApiObjectInfo dev, WampApiKadecotDevice device)
60 {
61 DeviceController.DeviceInfo di = new DeviceController.DeviceInfo(dc, dev);
62 di.Data = device;
63 if (dc != null) {
64 foreach (WebApiPropertyInfo prop in dev.properties) {
65 JsonPropertyInfo epi = dc.properties.FirstOrDefault(p => p.propertyCode == prop.epc);
66 if (epi == null)
67 continue;
68 di.Properties.Add(new DeviceController.DevicePropertyInfo(epi, prop));
69 }
70 }
71 return di;
72 }
73
74 public static List<WampApiKadecotDevice> GetAllDevices(this object args)
75 {
76 dynamic[] devs = (dynamic[])(((dynamic[])args)[4]).deviceList;
77 List<WampApiKadecotDevice> alldevs = new List<WampApiKadecotDevice>();
78 var nodes = new Dictionary<string, List<WampApiKadecotDevice>>();
79
80 foreach (dynamic dev in devs) {
81 WampApiKadecotDevice device = new WampApiKadecotDevice(dev);
82 List<WampApiKadecotDevice> devices;
83
84 if (nodes.TryGetValue(device.ip_addr, out devices)) {
85 devices.Add(device);
86 }
87 else {
88 devices = new List<WampApiKadecotDevice>();
89 devices.Add(device);
90 nodes[device.ip_addr] = devices;
91 }
92
93 alldevs.Add(device);
94 }
95
96 return alldevs;
97 }
98
99 /// <summary>
100 /// jsonファイルをリストに変換します
101 /// </summary>
102 /// <param name="data"></param>
103 /// <returns></returns>
104 public static List<JsonClassGroupInfo> ToJSClassGroupInfoList(this object data)
105 {
106 dynamic[] _classGroups = (dynamic[])((data.GetType() == typeof(string)) ? jQuery.ParseJson((string)data) : data);
107 List<JsonClassGroupInfo> classGroups = new List<JsonClassGroupInfo>();
108 foreach (var _item in _classGroups) {
109 var item = new JsonClassGroupInfo(_item);
110 classGroups.Add(item);
111 }
112 return classGroups;
113 }
114
115 /// <summary>
116 /// jsonファイルをリストに変換します
117 /// </summary>
118 /// <param name="data"></param>
119 /// <param name="classGroup">クラス</param>
120 /// <returns></returns>
121 public static List<JsonClassInfo> ToJSClassInfoList(this object data, JsonClassGroupInfo classGroup)
122 {
123 dynamic[] _classes = (dynamic[])((data.GetType() == typeof(string)) ? jQuery.ParseJson((string)data) : data);
124 List<JsonClassInfo> classes = new List<JsonClassInfo>();
125 JsonClassInfo eclass;
126 foreach (var _item in _classes) {
127 eclass = new JsonClassInfo(_item);
128 eclass.classGroup = classGroup;
129 classes.Add(eclass);
130 }
131 return classes;
132 }
133
134 /// <summary>
135 /// jsonファイルをプロパティリストに変換します
136 /// </summary>
137 /// <param name="data"></param>
138 /// <returns></returns>
139 public static List<JsonPropertyInfo> ToJSPropertyInfoList(this object data)
140 {
141 var _properties = (dynamic[])((data.GetType() == typeof(string)) ? jQuery.ParseJson((string)data) : data);
142 var properties = new List<JsonPropertyInfo>();
143 foreach (var _item in _properties) {
144 var item = new JsonPropertyInfo(_item);
145 properties.Add(item);
146 }
147 return properties;
148 }
149
150 /// <summary>
151 /// disabledをタグに追加します
152 /// </summary>
153 /// <param name="obj"></param>
154 /// <param name="flag">true: disabledをタグに追加 false: disabledをタグから削除</param>
155 /// <returns></returns>
156 public static jQueryObject Disable(this jQueryObject obj, bool flag)
157 {
158 if (flag) {
159 obj.Attribute("disabled", "disabled");
160 }
161 else {
162 obj.RemoveAttr("disabled");
163 }
164
165 return obj;
166 }
167
168 /// <summary>
169 /// クラスを入れ替えます
170 /// </summary>
171 /// <param name="obj"></param>
172 /// <param name="deleteClass">削除するクラス</param>
173 /// <param name="addClass">追加するクラス</param>
174 /// <returns></returns>
175 public static jQueryObject ToggleClass(this jQueryObject obj, string deleteClass, string addClass)
176 {
177 obj.ToggleClass(deleteClass, false);
178 obj.ToggleClass(addClass, true);
179 return obj;
180 }
181
182 public static jQueryObject GetDeviceBtn(this DeviceController.DeviceInfo di)
183 {
184 return di.GetDeviceLi().Children("a");
185 }
186
187 public static jQueryObject GetDeviceLi(this DeviceController.DeviceInfo di)
188 {
189 return jQuery.Select("#li_device_" + di.GetObjectID());
190 }
191
192 /// <summary>
193 /// 書き込み可であるかどうかしらべます
194 /// </summary>
195 /// <returns>true:書き込み可,false:書き込み不可</returns>
196 public static bool IsRULE_SET(this DeviceController.DevicePropertyInfo dpi)
197 {
198 return (dpi.PropertyInfo == null) ? false : dpi.PropertyInfo.access.Contains("RULE_SET");
199 }
200 }
201
202 public class UIObject
203 {
204 public jQueryObject Object;
205 public Element Element { get { return Object.GetElement(0); } }
206
207 public UIObject()
208 {
209 }
210
211 public UIObject(UIObject uiobject)
212 {
213 this.Object = uiobject.Object;
214 }
215
216 public UIObject(jQueryObject @object)
217 {
218 this.Object = @object;
219 }
220
221 public UIObject(string html)
222 {
223 this.Object = jQuery.FromHtml(html);
224 }
225
226 public UIObject Change()
227 {
228 this.Object.Change();
229 return this;
230 }
231
232 public void Change(jQueryEventHandlerWithContext eventHandler)
233 {
234 Object.Change(eventHandler);
235 }
236
237 public void Keypress(jQueryEventHandlerWithContext eventHandler)
238 {
239 Object.Keypress(eventHandler);
240 }
241
242 public jQueryObject Toggle(bool showOrHide)
243 {
244 return this.Object.Toggle(showOrHide);
245 }
246
247 public void Attribute(string attributeName, string value)
248 {
249 this.Object.Attribute(attributeName, value);
250 }
251
252 public void RemoveAttr(string attributeName)
253 {
254 this.Object.RemoveAttr(attributeName);
255 }
256
257 public string GetAttribute(string attributeName)
258 {
259 return Object.GetAttribute(attributeName);
260 }
261
262 public jQueryObject Find(string selector)
263 {
264 return this.Object.Find(selector);
265 }
266
267 public UIObject RemoveClass(string className)
268 {
269 this.Object.RemoveClass(className);
270 return this;
271 }
272
273 public UIObject ToggleClass(string className, bool add)
274 {
275 this.Object.ToggleClass(className, add);
276 return this;
277 }
278
279 public UIObject ToggleClass(string deleteClass, string addClass)
280 {
281 this.Object.ToggleClass(deleteClass, addClass);
282 return this;
283 }
284
285 public UIObject One(string eventName, jQueryEventHandlerWithContext eventHandler)
286 {
287 this.Object.One(eventName, eventHandler);
288 return this;
289 }
290
291 public UIObject Attribute(JsDictionary nameValueMap)
292 {
293 this.Object.Attribute(nameValueMap);
294 return this;
295 }
296
297 public UIObject Click(jQueryEventHandlerWithContext eventHandler)
298 {
299 this.Object.Click(eventHandler);
300 return this;
301 }
302
303 public UIObject Click(jQueryEventHandler eventHandler)
304 {
305 this.Object.Click(eventHandler);
306 return this;
307 }
308
309 public string Text { get { return Object.GetText(); } set { Object.Text(value); } }
310 public string Id { get { return Object.GetAttribute("id"); } set { Object.Attribute("id", value); } }
311 public string For { get { return Object.GetAttribute("for"); } set { Object.Attribute("for", value); } }
312 public string Name { get { return Object.GetAttribute("name"); } set { Object.Attribute("name", value); } }
313 public string DataRole { get { return Object.GetAttribute("data-role"); } set { Object.Attribute("data-role", value); } }
314 public string DataType { get { return Object.GetAttribute("data-type"); } set { Object.Attribute("data-type", value); } }
315 public string Title { get { return Object.GetAttribute("title"); } set { Object.Attribute("title", value); } }
316 public string Value
317 {
318 get
319 {
320 if (Object.Is("fieldset"))
321 return Object.Find("input[type='radio']:checked").GetValue();
322 return Object.GetValue();
323 }
324 set
325 {
326 if (Object.Is("fieldset")) {
327 Object.Find("input[type=\"radio\"]").Each((j, elem) => {
328 if (jQuery.Select(elem).GetValue() == value) {
329 jQuery.Select(elem).Prop("checked", true);
330 }
331 else {
332 jQuery.Select(elem).Prop("checked", false);
333 }
334 });
335 Object.Find("input[type=\"radio\"]").CheckboxRadio().CheckboxRadio("refresh");
336 }
337 else {
338 Object.Value(value);
339 if (DataRole == "flipswitch")
340 Object.Value(value).FlipSwitch("refresh");
341 }
342 }
343 }
344
345 public int Maxlength { get { return int.Parse(GetAttribute("maxlength")); } set { Attribute("maxlength", value.ToString()); } }
346 public int Min { get { return int.Parse(Object.GetAttribute("min")); } set { Object.Attribute("min", value.ToString()); } }
347 public int Max { get { return int.Parse(Object.GetAttribute("max")); } set { Object.Attribute("max", value.ToString()); } }
348 public int TabIndex { get { return int.Parse(Object.GetAttribute("tabindex")); } set { Object.Attribute("tabindex", value.ToString()); } }
349 public string Type { get { return Object.GetAttribute("type"); } set { Object.Attribute("type", value); } }
350
351 public void Append(UIObject uiobject)
352 {
353 this.Object.Append(uiobject.Object);
354 }
355
356 public jQueryObject Append(jQueryObject @object)
357 {
358 return this.Object.Append(@object);
359 }
360
361 public UIObject Disable(bool flag)
362 {
363 if (flag) {
364 this.Attribute("disabled", "disabled");
365 }
366 else {
367 this.RemoveAttr("disabled");
368 }
369 return this;
370 }
371
372 public jQueryObject Children()
373 {
374 return this.Object.Children();
375 }
376
377 public UIObject AddClass(string className)
378 {
379 this.Object.AddClass(className);
380 return this;
381 }
382
383 /// <summary>
384 ///
385 /// </summary>
386 /// <param name="flag">false:イベント不可</param>
387 /// <returns></returns>
388 public UIObject PointerEvents(bool flag)
389 {
390 if (!flag) {
391 this.Object.CSS("pointer-events", "none");
392 }
393 return this;
394 }
395
396 public UIObject Hide()
397 {
398 this.Object.Hide();
399 return this;
400 }
401
402 public UIObject Show()
403 {
404 this.Object.Show();
405 return this;
406 }
407
408 private EcnlClass ecnlclass;
409 public EcnlClass Class
410 {
411 get { return ecnlclass; }
412 set
413 {
414 ecnlclass = value;
415 this.AddClass(EcnlClassString(value));
416 }
417 }
418
419 public enum EcnlClass
420 {
421 ecnl_pink,
422 ecnl_violet,
423 ecnl_light_green,
424 ecnl_light_blue,
425 }
426
427 private string EcnlClassString(EcnlClass @class)
428 {
429 if (@class == EcnlClass.ecnl_pink) {
430 return "ecnl_pink";
431 }
432 else if (@class == EcnlClass.ecnl_violet) {
433 return "ecnl_violet";
434 }
435 else if (@class == EcnlClass.ecnl_light_green) {
436 return "ecnl_light_green";
437 }
438 else if (@class == EcnlClass.ecnl_light_blue) {
439 return "ecnl_light_blue";
440 }
441 else {
442 return "";
443 }
444 }
445 }
446
447 public class UIGrpBox : UIListviewItem
448 {
449 UILabel Label;
450
451 public UIGrpBox()
452 : base()
453 {
454 LiAside = new UIP("", "ui-li-aside");
455 base.Append(LiAside);
456 base.Change(GrpBoxChange);
457 }
458
459 public UIGrpBox(DeviceController.DevicePropertyInfo dpi)
460 : this()
461 {
462 this.dpi = dpi;
463 Label = new UILabel(dpi);
464 this.dpi.PrepareInputInfo();
465
466 if (dpi.PropertyCode == 0x00) {
467
468 }
469 else if (dpi.PropertyCode == 0x97) {
470 SetTimebox();
471 }
472 else if (dpi.PropertyCode == 0x98) {
473 SetCalBox();
474 }
475 else if (this.dpi.InputTypes.Count == 0) {
476 SetTextInput();
477 }
478 else if (dpi.PropertyCode == 0x80 && dpi.InputTypes.Count == 1 && dpi.InputTypes[0].Mode == PropertyInputMode.Select) {
479 SetFlipSwitch();
480 }
481 else {
482 foreach (PropertyInputInfo pii in dpi.InputTypes) {
483
484 switch (pii.Mode) {
485 case PropertyInputMode.Select: {
486 SetFieldSet(pii);
487 }
488 break;
489 case PropertyInputMode.Range: {
490 SetRange(pii);
491 }
492 break;
493 default: {
494 SetDefault();
495 }
496 break;
497 }
498 }
499 }
500 }
501
502 public void SetFlipSwitch()
503 {
504 PropertySelectInput psi = (PropertySelectInput)dpi.InputTypes[0];
505
506 // OFF
507 var off = psi.Option.First((kvp) => { return kvp.Key == 0x31; });
508
509 // ON
510 var on = psi.Option.First((kvp) => { return kvp.Key == 0x30; });
511
512 UIOption OFF = new UIOption(off.Value, off.Key.ToString("X2"));
513 UIOption ON = new UIOption(on.Value, on.Key.ToString("X2"));
514
515 UIFlipSwitch Flipswitch = new UIFlipSwitch(OFF, ON);
516 Flipswitch.Change(this.flip_Change);
517
518 Flipswitch.Disable(!dpi.IsRULE_SET());
519
520 FieldContain = new UIFieldContain(Label, Flipswitch);
521
522 //FieldContain.Object.Trigger("create");
523 Append(FieldContain);
524 }
525
526 public void SetDefault()
527 {
528 UITextInput Textbox = new UITextInput();
529 Textbox.Change(text_Change);
530 var value = ""/*.ToString("X")*/;
531 Textbox.Value = value;
532 FieldContain = new UIFieldContain(Label, Textbox);
533 Append(FieldContain);
534 }
535
536 public void SetRange(PropertyInputInfo pii)
537 {
538 UIRangeInput range = new UIRangeInput();
539 range.Change(range_Change);
540 FieldContain = new UIFieldContain(Label, range);
541 var value = ((PropertyRangeInput)pii).Minimum;
542
543 range.Value = value;
544 range.Min = ((PropertyRangeInput)pii).Minimum;
545 range.Max = ((PropertyRangeInput)pii).Maximum;
546
547 Append(FieldContain.Object).Trigger("create");
548 }
549
550 private void range_Change(Element elem, jQueryEvent ev)
551 {
552 if (!CheckValiable()) { return; };
553 if (!CheckHex()) { return; };
554 byte[] data = ByteValue;
555 dpi.InputData = data;
556 KadecotSet(dpi, data);
557 }
558
559 private void SetCalBox()
560 {
561 UICalBox Textbox = new UICalBox();
562 Textbox.Change(calbox_Change);
563
564 JsonPropertyInfo epi = dpi.PropertyInfo;
565
566 FieldContain = new UIFieldContain(Label, Textbox);
567
568 int len = dpi.GetMaxLength();
569
570 string valueDescription = "";
571 foreach (JsonFieldInfo jfi in epi.fields) {
572 valueDescription += "【" + jfi.description + ":" + jfi.valueDescription + "】";
573 }
574 Textbox.Placeholder = dpi.GetText();
575 Textbox.Value = "";
576 //Textbox.Disable(!dpi.IsRULE_SET());
577 Textbox.ReadOnly = !dpi.IsRULE_SET();
578 Textbox.Title = valueDescription;
579 One("dateboxcreate", calbox_Create);
580 Append(FieldContain.Object);
581 }
582
583 private void calbox_Create(Element ele, jQueryEvent ev)
584 {
585 var textinput = jQuery.Select(ev.Target).Parent(".ui-input-datebox");
586 textinput.Append(BackButton.Object);
587 BackButton.Click(BackButtonClick);
588 }
589
590 private void calbox_Change(Element elem, jQueryEvent ev)
591 {
592 UICalBox Calbox = (UICalBox)FieldContain.Input;
593 byte[] data = new byte[4];
594 RemoveClass();
595
596 if (!((Calbox.dY >= 1 && Calbox.dY < 9999) && ((Calbox.dM >= 1 && Calbox.dM <= 12) && (Calbox.dD >= 1 && Calbox.dD <= 31)))) {
597 ToggleClass(true ? "ecnl_pink" : "ecnl_violet", true);
598 }
599 else {
600 data[0] = Byte.Parse(Calbox.xY.Substring(0, 2), 16);
601 data[1] = Byte.Parse(Calbox.xY.Substring(2, 2), 16);
602 data[2] = Byte.Parse(Calbox.xM, 16);
603 data[3] = Byte.Parse(Calbox.xD, 16);
604
605 dpi.InputData = data;
606 dpi.IsWaitRes = true;
607
608 this.Class = EcnlClass.ecnl_light_green;
609 }
610 }
611
612 private void flip_Change(Element elem, jQueryEvent ev)
613 {
614 byte[] data = ByteValue;
615 dpi.InputData = data;
616 KadecotSet(dpi, data);
617 }
618
619 private void SetTextInput()
620 {
621 UITextInput Textbox = new UITextInput();
622 Textbox.Change(text_Change);
623 Textbox.Keypress(text_KeyPress);
624 Textbox.Keyup(text_Keyup);
625 Textbox.On("textinputcreate", this.text_Create);
626 JsonPropertyInfo epi = dpi.PropertyInfo;
627
628 string valueDescription = "";
629 foreach (JsonFieldInfo jfi in epi.fields) {
630 valueDescription += "【" + jfi.description + ":" + jfi.valueDescription + "】";
631 }
632 Textbox.Value = "";
633 //Textbox.Disable(!dpi.IsRULE_SET());
634 Textbox.ReadOnly = !dpi.IsRULE_SET();
635 Textbox.Maxlength = dpi.GetMaxLength();
636 Textbox.Title = valueDescription;
637 FieldContain = new UIFieldContain(Label, Textbox);
638 base.Append(FieldContain.Object);
639 }
640
641 private void SetTimebox()
642 {
643 UITimeBox Textbox = new UITimeBox();
644 Textbox.Change(timebox_Change);
645 JsonPropertyInfo epi = dpi.PropertyInfo;
646 FieldContain = new UIFieldContain(Label, Textbox);
647 int len = dpi.GetMaxLength();
648 string valueDescription = "";
649
650 foreach (JsonFieldInfo jfi in epi.fields) {
651 valueDescription += "【" + jfi.description + ":" + jfi.valueDescription + "】";
652 }
653
654 Textbox.Placeholder = dpi.GetText();
655 Textbox.Value = "";
656 Textbox.Title = valueDescription;
657 //Textbox.Disable(!dpi.IsRULE_SET());
658 Textbox.ReadOnly = !dpi.IsRULE_SET();
659 this.Append(FieldContain);
660 this.One("dateboxcreate", timebox_Create);
661 }
662
663 private void SetFieldSet(PropertyInputInfo pii)
664 {
665 UIFieldSet FieldSet = new UIFieldSet();
666 UILabel Label = new UILabel();
667 Label.Text = dpi.GetText();
668 FieldSet.Horizontal = true;
669 FieldSet.Change(select_Change);
670 FieldContain = new UIFieldContain(Label, FieldSet);
671
672 foreach (KeyValuePair<long, string> opt in ((PropertySelectInput)pii).Option) {
673 UIRadioInput Radio = new UIRadioInput(opt.Key.ToString("X"));
674 FieldSet.Append(new UIFieldSet.RadioInput(new UILabel(opt.Value), Radio));
675 }
676
677 Append(FieldContain.Object);
678 }
679
680 private void select_Change(Element elem, jQueryEvent ev)
681 {
682 byte[] data = ByteValue;
683 dpi.InputData = data;
684 KadecotSet(dpi, data);
685 }
686
687 /// <summary>
688 /// 時刻入力フォームの入力値が変更された場合
689 /// </summary>
690 /// <param name="ele"></param>
691 /// <param name="ev"></param>
692 private void timebox_Change(Element ele, jQueryEvent ev)
693 {
694 RemoveClass();
695 if (Changed) {
696 timebox_Change();
697 }
698 }
699
700 private void timebox_Change()
701 {
702 string value = FieldContain.Input.Value;
703 string[] val = value.Split(":");
704
705 Byte[] data = new Byte[2];
706 data[0] = byte.Parse(val[0], 10);
707 data[1] = byte.Parse(val[1], 10);
708
709 string hex = data[0].ToString("X2") + data[1].ToString("X2");
710
711 RemoveClass();
712
713 dpi.InputData = data;
714 dpi.IsWaitRes = true;
715 ToggleClass(true ? "ecnl_light_green" : "ecnl_light_blue", true);
716 }
717
718 private void timebox_Create(Element ele, jQueryEvent ev)
719 {
720 var textinput = jQuery.Select(ev.Target).Parent(".ui-input-datebox");
721 textinput.Append(BackButton.Object);
722 BackButton.Click(BackButtonClick);
723 }
724
725 private void text_Keyup(Element elem, jQueryEvent ev)
726 {
727 jQuery.Select(elem).Change();
728 }
729
730 private void text_Create(Element elem, jQueryEvent ev)
731 {
732 var textinput = jQuery.Select(ev.Target).Parent(".ui-input-text");
733 textinput.Append(BackButton.Object);
734 BackButton.Click(BackButtonClick);
735 }
736
737 private void text_KeyPress(Element elem, jQueryEvent ev)
738 {
739 bool number = (ev.Which >= (int)KeyPress._0 && ev.Which <= (int)KeyPress._9);
740 bool lower = (ev.Which >= (int)KeyPress.a && ev.Which <= (int)KeyPress.f);
741 bool upper = (ev.Which >= (int)KeyPress.A && ev.Which <= (int)KeyPress.F);
742 bool BackSpace = (ev.Which == (int)KeyPress.BackSpace);
743 bool Delete = (ev.Which == (int)KeyPress.Delete);
744
745 bool flag = (!number && !lower) && (!BackSpace && !Delete) && !upper;
746 if (flag) ev.PreventDefault();
747 }
748
749 private void BackButtonClick(Element elem, jQueryEvent ev)
750 {
751 FieldContain.Input.Value = ToText(GetValue);
752 FieldContain.Input.Object.Change();
753 }
754
755 private void text_Change(Element elem, jQueryEvent ev)
756 {
757 if (Changed) {
758 RemoveClass();
759 if (!CheckValiable()) { return; };
760 if (!CheckHex()) { return; };
761 SetDpi();
762 }
763 }
764
765 private Type InputType { get { return FieldContain.Input.GetType(); } }
766
767 private byte[] ToByteValue()
768 {
769 string Value = FieldContain.Input.Value;
770 byte[] data = new byte[Value.Length / 2];
771 for (int i = 0, j = 0; j < Value.Length; j += 2) {
772 data[i++] = Byte.Parse(Value.Substring(j, 2), 16);
773 }
774 return data;
775 }
776
777 private void SetDpi()
778 {
779 dpi.InputData = ByteValue;
780 dpi.IsWaitRes = true;
781 ErrorText = "";
782 ToggleClass(user ? "ecnl_light_green" : "ecnl_light_blue", true);
783 }
784
785 bool user = true;
786 private byte[] ByteValue { get { return ToByteValue(); } }
787 private DeviceController.DevicePropertyInfo dpi;
788 private UIP LiAside;
789 public string ErrorText { get { return LiAside.Text; } set { LiAside.Text = value; } }
790 public byte[] GetValue;
791 public UIFieldContain FieldContain;
792
793 public void RemoveClass()
794 {
795 ErrorText = "";
796 BackButton.Hide();
797 RemoveClass("ecnl_pink");
798 RemoveClass("ecnl_violet");
799 RemoveClass("ecnl_light_green");
800 RemoveClass("ecnl_light_blue");
801 }
802
803 public void SetName(string nameid)
804 {
805 string name = nameid;
806 if (InputType == typeof(UICalBox)) {
807 name = "cal_" + nameid;
808 }
809 else if (InputType == typeof(UITimeBox)) {
810 name = "tmb_" + nameid;
811 }
812 else if (InputType == typeof(UITextInput)) {
813 name = "txt_" + nameid;
814 }
815 else if (InputType == typeof(UIRadioInput)) {
816 name = "rng_" + nameid;
817 }
818 else if (InputType == typeof(UIFlipSwitch)) {
819 name = "flp_" + nameid;
820 UIFlipSwitch Flipswitch = (UIFlipSwitch)FieldContain.Input;
821
822 string val0 = Flipswitch.OFF.Value;
823 string val1 = Flipswitch.ON.Value;
824 Flipswitch.OFF.Id = name + val0;
825 Flipswitch.ON.Id = name + val1;
826 }
827 else if (InputType == typeof(UIFieldSet)) {
828 name = "sel_" + nameid;
829 UIFieldSet FieldSet = (UIFieldSet)FieldContain.Input;
830 FieldSet.Id = name;
831
832 for (int i = 0; i < FieldSet.RadioList.Count; i++) {
833 var id = name + FieldSet.RadioList[i].Radio.Value;
834 FieldSet.RadioList[i].Radio.Name = name;
835 FieldSet.RadioList[i].Radio.Id = id;
836 FieldSet.RadioList[i].Label.For = id;
837 }
838 }
839
840 FieldContain.Label.For = name;
841 FieldContain.Input.Id = name;
842 FieldContain.Input.Name = name;
843 }
844
845 public bool CheckHex()
846 {
847 string Value = FieldContain.Input.Value;
848 if (!new Regex("^([0-9A-Fa-f][0-9A-Fa-f])+$").Test(Value)) {
849 ErrorText = "16進数で入力してください";
850 ToggleClass(true ? "ecnl_pink" : "ecnl_violet", true);
851 return false;
852 }
853 return true;
854 }
855
856 public bool CheckValiable()
857 {
858 JsonPropertyInfo epi = dpi.PropertyInfo;
859 //可変長データの場合
860 bool valiable = dpi.IsValiable();
861 int len = dpi.GetMaxLength();
862 string Value = FieldContain.Input.Value;
863 bool length = (Value.Length != len) && (!valiable || (Value.Length > len));
864
865 if ((Value.Length != len) && (!valiable || (Value.Length > len))) {
866 ErrorText = len.ToString() + "文字で入力してください";
867 ToggleClass(user ? "ecnl_pink" : "ecnl_violet", true);
868
869 return false;
870 }
871 return true;
872 }
873
874 public string ToTextDefault(byte[] data)
875 {
876 string value = "";
877 if (data == null) {
878 return "";
879 }
880 for (int i = 0; i < data.Length; i++) {
881 value += data[i].ToString("X2");
882 }
883 return value;
884 }
885
886 public string ToTextTimeBox(byte[] data)
887 {
888
889 string str = ToTextDefault(data);
890 if (str.Length == 4) {
891 int h = int.Parse("0x" + str.Substr(0, 2));
892 int m = int.Parse("0x" + str.Substr(2, 2));
893 return h.ToString("D2") + ":" + m.ToString("D2");
894 }
895 else {
896 return "";
897 }
898 }
899
900 public string ToTextCal(byte[] data)
901 {
902 string str = ToText(data);
903 if (str.Length == 8) {
904 int y = int.Parse("0x" + str.Substr(0, 4));
905 int m = int.Parse("0x" + str.Substr(4, 2));
906 int d = int.Parse("0x" + str.Substr(6, 2));
907 if ((y < 1 || m < 1) || d < 1) {
908 return y.ToString("D4") + "/" + m.ToString("D2") + "/" + m.ToString("D2");
909 }
910 DateTime date = new DateTime(y, m, d);
911 return date.ToString("yyyy/MM/dd");
912 }
913 else {
914 return "";
915 }
916 }
917
918 public string ToText(byte[] data)
919 {
920 if (data == null) {
921 return "";
922 }
923 if (FieldContain.Input.GetType().Equals(typeof(UITimeBox))) {
924 return ToTextTimeBox(data);
925 }
926 else if (FieldContain.Input.GetType().Equals(typeof(UICalBox))) {
927 return ToTextCal(data);
928 }
929 else {
930 return ToTextDefault(data);
931 }
932 }
933
934 /// <summary>
935 /// 値が変わった時true
936 /// </summary>
937 public bool Changed { get { return !FieldContain.Input.Value.Equals(ToText(GetValue)); } }
938
939 public void GrpBoxChange(Element ele, jQueryEvent ev)
940 {
941 BackButton.Toggle(Changed);
942 if (!Changed) {
943 dpi.IsWaitRes = false;
944 dpi.InputData = null;
945 RemoveClass();
946 }
947 }
948
949 public EventHandlerDevicePropertyInfo KadecotSet;
950
951 public void SetGetValue(byte[] data)
952 {
953 RemoveClass();
954 GetValue = data;
955 FieldContain.Input.Value = ToText(data);
956 FieldContain.Input.Change();
957 }
958
959 public UIBackButton BackButton = new UIBackButton();
960 }
961
962 public class UIBackButton : UIButton
963 {
964 public UIBackButton()
965 : base()
966 {
967 base.ButtonIcon = Icon.back;
968 base.Title = "元に戻す";
969 base.TabIndex = -1;
970 base.AddClass("text_backButton");
971 base.Object.Hide();
972 }
973 }
974
975 public class UIDiv : UIObject
976 {
977 public UIDiv()
978 : base("<div>")
979 {
980
981 }
982 }
983
984 public class UILabel : UIObject
985 {
986 public UILabel()
987 : base("<label>")
988 {
989 }
990
991 public UILabel(string text)
992 : this()
993 {
994 base.Text = text;
995 }
996
997 public UILabel(string text, string @for)
998 : this(text)
999 {
1000 base.For = @for;
1001 }
1002
1003 public UILabel(string text, string @for, string name)
1004 : this(text, @for)
1005 {
1006 base.Name = name;
1007 }
1008
1009 public UILabel(DeviceController.DevicePropertyInfo dpi)
1010 : this(dpi.GetText())
1011 {
1012 base.Title = dpi.PropertyInfo.valueDescription;
1013 }
1014 }
1015
1016 public class UIFieldContain : UIObject
1017 {
1018 public UIFieldContain()
1019 : base("<div>")
1020 {
1021 base.DataRole = "fieldcontain";
1022 }
1023
1024 public UIFieldContain(UIObject uiobject)
1025 : this()
1026 {
1027 base.Append(uiobject);
1028 }
1029
1030 public UIFieldContain(UILabel label, UIObject uiobject)
1031 : this()
1032 {
1033 this.Label = label;
1034 this.Input = uiobject;
1035 base.Append(this.Label);
1036 base.Append(this.Input);
1037 }
1038
1039 public UILabel Label;
1040 public UIObject Input;
1041 }
1042
1043 public class UIGridA : UIObject
1044 {
1045 public UIGridA()
1046 : base("<div>")
1047 {
1048 this.Object.AddClass("ui-grid-a");
1049 this.Append(BlockA);
1050 this.Append(BlockB);
1051 }
1052
1053 public UIBlockA BlockA = new UIBlockA();
1054 public UIBlockB BlockB = new UIBlockB();
1055
1056 public class UIBlockA : UIObject
1057 {
1058 public UIBlockA()
1059 : base("<div>")
1060 {
1061 this.Object.AddClass("ui-block-a");
1062 }
1063 }
1064
1065 public class UIBlockB : UIObject
1066 {
1067 public UIBlockB()
1068 : base("<div>")
1069 {
1070 this.Object.AddClass("ui-block-b");
1071 }
1072 }
1073 }
1074
1075 public class UIFlipSwitch : UIObject
1076 {
1077 public UIFlipSwitch()
1078 : base("<select>")
1079 {
1080 base.DataRole = "flipswitch";
1081 //base.Append(new UIOption());
1082 //base.Append(new UIOption());
1083 }
1084
1085 public UIFlipSwitch(UIOption off, UIOption on)
1086 : this()
1087 {
1088 this.OFF = off;
1089 this.ON = on;
1090 base.Append(this.OFF);
1091 base.Append(this.ON);
1092 }
1093
1094 public UIOption ON;//{ get { return new UIOption(base.Object.Find("option").Eq(1)); } set { base.Object.Find("option").Eq(1).ReplaceWith(value.Object); } }
1095 public UIOption OFF;// { get { return new UIOption(base.Object.Find("option").Eq(0)); } set { base.Object.Find("option").Eq(0).ReplaceWith(value.Object); } }
1096 }
1097
1098 public class UIButton : UIObject
1099 {
1100 public UIButton()
1101 : base("<a>")
1102 {
1103 this.Button = true;
1104 this.NoText = true;
1105
1106 this.Href = "#";
1107 this.CornerAll = true;
1108 }
1109
1110 public bool Button { get { return base.Object.HasClass("ui-btn"); } set { base.Object.ToggleClass("ui-btn", value); } }
1111 public bool NoText { get { return base.Object.HasClass("ui-btn-icon-notext"); } set { base.Object.ToggleClass("ui-btn-icon-notext", value); } }
1112 public bool CornerAll { get { return base.Object.HasClass("ui-corner-all"); } set { base.Object.ToggleClass("ui-corner-all", value); } }
1113 public Icon ButtonIcon { get { return getIcon(); } set { base.Object.ToggleClass(getClass(value), true); } }
1114 public string Href { get { return base.Object.GetAttribute("href"); } set { base.Object.Attribute("href", value); } }
1115
1116 public enum Icon
1117 {
1118 delete,
1119 refresh,
1120 back,
1121 }
1122
1123 private string getClass(Icon icon)
1124 {
1125 string text = "";
1126 if (icon == Icon.delete) {
1127 text = "delete";
1128 }
1129 else if (icon == Icon.refresh) {
1130 text = "refresh";
1131 }
1132 else if (icon == Icon.back) {
1133 text = "back";
1134 }
1135 return "ui-icon-" + text;
1136 }
1137
1138 private Icon getIcon()
1139 {
1140 if (base.Object.HasClass("ui-icon-delete")) {
1141 return Icon.delete;
1142 }
1143 else if (base.Object.HasClass("ui-icon-refresh")) {
1144 return Icon.refresh;
1145 }
1146 else if (base.Object.HasClass("ui-icon-back")) {
1147 return Icon.back;
1148 }
1149 return Icon.delete;
1150 }
1151 }
1152
1153 public class UIOption : UIObject
1154 {
1155 public UIOption()
1156 : base("<option>")
1157 {
1158
1159 }
1160
1161 public UIOption(string text, string value)
1162 : this()
1163 {
1164 base.Text = text;
1165 base.Value = value;
1166 }
1167
1168 public UIOption(jQueryObject @object)
1169 : base(@object)
1170 {
1171
1172 }
1173 }
1174
1175 public class UIRadioInput : UIObject
1176 {
1177 public UIRadioInput()
1178 : base("<input>")
1179 {
1180 base.Object.Attribute("type", "radio");
1181 }
1182
1183 public UIRadioInput(string id, string name)
1184 : this()
1185 {
1186 base.Id = id;
1187 base.Name = name;
1188 }
1189
1190 public UIRadioInput(string id, string name, string value)
1191 : this(id, name)
1192 {
1193 base.Value = value;
1194 }
1195
1196 public UIRadioInput(string value)
1197 : this()
1198 {
1199 base.Value = value;
1200 }
1201 }
1202
1203 public class UILi : UIObject
1204 {
1205 public UILi()
1206 : base("<li>")
1207 {
1208 }
1209 }
1210
1211 public class UIFieldSet : UIObject
1212 {
1213 public UIFieldSet()
1214 : base("<fieldset>")
1215 {
1216 this.ControlGroup = true;
1217 }
1218
1219 public UIFieldSet(bool horizontal)
1220 : this()
1221 {
1222 this.Horizontal = horizontal;
1223 }
1224
1225 public string CheckdValue()
1226 {
1227 return jQuery.Select("input[type='radio']:checked", base.Object).GetValue();
1228 }
1229
1230 public void Append(RadioInput radio)
1231 {
1232 if (RadioList == null) {
1233 RadioList = new List<RadioInput>();
1234 }
1235 RadioList.Add(new RadioInput(radio.Label, radio.Radio));
1236 RadioInput last = RadioList.Last<RadioInput>();
1237 base.Append(last.Label);
1238 base.Append(last.Radio);
1239 }
1240
1241 public List<RadioInput> RadioList;
1242 private bool _ControlGroup;
1243
1244 public bool ControlGroup
1245 {
1246 get
1247 {
1248 return _ControlGroup;
1249 }
1250 set
1251 {
1252 if (value) {
1253 base.DataRole = "controlgroup";
1254 }
1255 else {
1256 base.DataRole = "";
1257 }
1258 _ControlGroup = value;
1259 }
1260 }
1261
1262 private bool _Horizontal;
1263
1264 public bool Horizontal
1265 {
1266 get { return _Horizontal; }
1267 set
1268 {
1269 if (value) {
1270 base.DataType = "horizontal";
1271 }
1272 else {
1273 base.DataType = "";
1274 }
1275 _Horizontal = value;
1276 }
1277 }
1278
1279 public class RadioInput
1280 {
1281 public UIRadioInput Radio;
1282 public UILabel Label;
1283
1284 public RadioInput(UILabel Label, UIRadioInput Radio)
1285 {
1286 this.Radio = Radio;
1287 this.Label = Label;
1288 }
1289 }
1290 }
1291
1292 public class UIRangeInput : UIObject
1293 {
1294 public UIRangeInput()
1295 : base("<input>")
1296 {
1297 base.Type = "number";
1298 base.DataType = "range";
1299 this.DataHighlight = true;
1300 base.Keypress(SliderKeypress);
1301 this.Handle = true;
1302 base.One("slidecreate", SliderCreate);
1303 }
1304
1305 public UIRangeInput(int min, int max)
1306 : this()
1307 {
1308 base.Min = min;
1309 base.Max = max;
1310 base.Maxlength = GetMaxLength();
1311 }
1312
1313 private int GetMaxLength()
1314 {
1315 int min = 0;
1316 int j;
1317 if (Min < 0) {
1318 min = 1;
1319 j = -10;
1320 while (Max / j > 1) {
1321 min++;
1322 j *= 10;
1323 }
1324 min++;
1325
1326 }
1327 int i = 1;
1328 j = 10;
1329 while (Max / j >= 1) {
1330 i++;
1331 j *= 10;
1332 }
1333
1334 return (i > min) ? i : min;
1335 }
1336
1337 bool DataHighlight
1338 {
1339 get { return bool.Parse(base.GetAttribute("data-highlight")); }
1340 set { base.Attribute("data-highlight", value.ToString()); }
1341 }
1342
1343 public new int Value
1344 {
1345 get
1346 {
1347 if (base.Value == "") {
1348 this.Value = base.Min;
1349 }
1350 return int.Parse(base.Value);
1351 }
1352 set { base.Value = value.ToString(); }
1353 }
1354
1355 private void SliderKeypress(Element ele, jQueryEvent ev)
1356 {
1357 bool number = (ev.Which >= (int)KeyPress._0 && ev.Which <= (int)KeyPress._9);
1358
1359 bool BackSpace = (ev.Which == (int)KeyPress.BackSpace);
1360 bool Delete = (ev.Which == (int)KeyPress.Delete);
1361 bool minus = (ev.Which == (int)KeyPress.minus);
1362 bool flag = (!number && !minus) && (!BackSpace && !Delete);
1363 if (flag) ev.PreventDefault();
1364 }
1365
1366 public bool Handle;
1367 public UIHandle SliderHandle;
1368
1369 private void SliderCreate(Element ele, jQueryEvent ev)
1370 {
1371 SliderHandle = new UIHandle(ev);
1372 SliderHandle.Toggle(this.Handle);
1373
1374 UISliderTrack SliderTrack = new UISliderTrack(ev);
1375 SliderTrack.PointerEvents(this.Handle);
1376 base.PointerEvents(this.Handle);
1377 }
1378
1379 public class UIHandle : UIObject
1380 {
1381 public UIHandle(jQueryEvent ev)
1382 {
1383 base.Object = jQuery.Select(ev.Target).Parent().Find(".ui-slider-handle");
1384 }
1385 }
1386
1387 public class UISliderTrack : UIObject
1388 {
1389 public UISliderTrack(jQueryEvent ev)
1390 {
1391 base.Object = jQuery.Select(ev.Target).Parent().Find(".ui-slider-track");
1392 }
1393 }
1394 }
1395
1396 public class UITextInput : UIObject
1397 {
1398 public UITextInput()
1399 : base("<input>")
1400 {
1401 base.Type = "text";
1402 this.DataClearBtn = true;
1403 }
1404
1405 public UITextInput(JsDictionary dic)
1406 : this()
1407 {
1408 base.Attribute(dic);
1409 }
1410
1411 public bool DataClearBtn
1412 {
1413 get { return bool.Parse(base.GetAttribute("data-clear-btn")); }
1414 set
1415 {
1416 if (value) { base.Attribute("data-clear-btn", value.ToString()); }
1417 else { base.RemoveAttr("data-clear-btn"); };
1418 }
1419 }
1420
1421 public string Placeholder { get { return base.GetAttribute("placeholder"); } set { base.Attribute("placeholder", value); } }
1422
1423 public JsDictionary DataOptions
1424 {
1425 get
1426 {
1427 return Json.Parse<JsDictionary>(base.GetAttribute("data-options"));
1428 }
1429 set
1430 {
1431 base.Attribute("data-options", Json.Stringify(value));
1432 }
1433 }
1434
1435 public jQueryObject Keyup(jQueryEventHandlerWithContext eventHandler)
1436 {
1437 base.Object.Keyup(eventHandler);
1438 return base.Object;
1439 }
1440
1441 public jQueryObject On(string eventName, jQueryEventHandlerWithContext eventHandler)
1442 {
1443 base.Object.On(eventName, eventHandler);
1444 return base.Object;
1445 }
1446
1447 public bool ReadOnly
1448 {
1449 get { return base.GetAttribute("readonly") == "readonly"; }
1450 set
1451 {
1452 if (value) {
1453 this.Attribute("readonly", "readonly");
1454 }
1455 else {
1456 this.RemoveAttr("readonly");
1457 }
1458 }
1459 }
1460 }
1461
1462 public class UITimeBox : UITextInput
1463 {
1464 public UITimeBox()
1465 : base()
1466 {
1467 base.DataRole = "datebox";
1468 base.DataOptions = new JsDictionary("mode", "timebox");
1469 base.DataClearBtn = false;
1470 base.On("dateboxcreate", DateBoxCreate);
1471 }
1472
1473 private void DateBoxCreate(Element ele, jQueryEvent ev)
1474 {
1475 jQuery.Select(ele).Parents().Find(".ui-icon-grid").ToggleClass("ui-icon-grid", "ui-icon-clock");
1476 }
1477 }
1478
1479 public class UICalBox : UITextInput
1480 {
1481 /// <summary>年</summary>
1482 public int dY { get { return GetCal(0); } }
1483
1484 /// <summary>月</summary>
1485 public int dM { get { return GetCal(1); } }
1486
1487 /// <summary>日</summary>
1488 public int dD { get { return GetCal(2); } }
1489
1490 /// <summary>年(16進4桁)</summary>
1491 public string xY { get { return dY.ToString("X4"); } }
1492
1493 /// <summary>月(16進2桁)</summary>
1494 public string xM { get { return dM.ToString("X2"); } }
1495
1496 /// <summary>日(16進2桁)</summary>
1497 public string xD { get { return dD.ToString("X2"); } }
1498
1499 /// <summary>年月日(16進8桁)</summary>
1500 public string YYYYMMDD { get { return xY + xM + xD; } }
1501
1502 /// <summary>年(10進4桁)/月(10進4桁)/日(10進4桁)</summary>
1503 public string yyyymmdd { get { return dY.ToString("D4") + "/" + dM.ToString("D2") + "/" + dD.ToString("D2"); } }
1504
1505 public UICalBox()
1506 : base()
1507 {
1508 base.DataRole = "datebox";
1509 base.DataOptions = new JsDictionary("mode", "calbox");
1510 base.DataClearBtn = false;
1511 base.On("dateboxcreate", DateBoxCreate);
1512 }
1513
1514 private void DateBoxCreate(Element ele, jQueryEvent ev)
1515 {
1516 jQuery.Select(ele).Parents().Find(".ui-icon-grid").ToggleClass("ui-icon-grid", "ui-icon-calendar");
1517 }
1518
1519 private int GetCal(int i)
1520 {
1521 int x = 0;
1522 if (Value.Contains("/")) {
1523 string[] value = Value.Split("/");
1524 x = int.Parse(value[i]);
1525 }
1526 return x;
1527 }
1528
1529 public class UIInputDate : UIObject
1530 {
1531 public UIInputDate(jQueryEvent ev)
1532 {
1533 base.Object = jQuery.Select(ev.Target).Parent(".ui-input-datebox");
1534 }
1535 }
1536 }
1537
1538 public class UICollapsibleset : UIObject
1539 {
1540 public UICollapsibleset()
1541 : base("<div>")
1542 {
1543 base.DataRole = "collapsible";
1544 }
1545
1546 public UICollapsibleset(JsDictionary attr, string h2)
1547 : this()
1548 {
1549 base.Attribute(attr);
1550 base.Append(new UIH(2, h2));
1551 }
1552
1553 public UICollapsibleset(string h2)
1554 : this()
1555 {
1556 base.Append(new UIH(2, h2));
1557 }
1558
1559 public bool DataInset { get { return bool.Parse(base.Object.GetAttribute("data-inset")); } set { base.Object.Attribute("data-inset", value.ToString()); } }
1560 }
1561
1562 public class UIListview : UIObject
1563 {
1564 public UIListview()
1565 : base("<ul>")
1566 {
1567 base.DataRole = "listview";
1568 }
1569
1570 public UIListview(params object[] nameValuePairs)
1571 : this()
1572 {
1573 base.Attribute(new JsDictionary(nameValuePairs));
1574 }
1575 }
1576
1577 public class UIListviewItem : UIObject
1578 {
1579 public UIListviewItem()
1580 : base("<li>")
1581 {
1582 }
1583
1584 public UIListviewItem(UIObject uiobject)
1585 : this()
1586 {
1587 base.Append(uiobject);
1588 }
1589 }
1590
1591 public class UIListDivider : UIListviewItem
1592 {
1593 public UIListDivider()
1594 : base()
1595 {
1596 base.DataRole = "list-divider";
1597 }
1598
1599 public UIListDivider(string text)
1600 : this()
1601 {
1602 base.Text = text;
1603 }
1604
1605 public UIListDivider(UIObject uiobject)
1606 : this()
1607 {
1608 base.Append(uiobject);
1609 }
1610
1611 public UIListDivider(jQueryObject @object)
1612 : this()
1613 {
1614 base.Append(@object);
1615 }
1616 }
1617
1618 public class UIP : UIObject
1619 {
1620 public UIP()
1621 : base("<p>")
1622 {
1623 }
1624
1625 public UIP(string text)
1626 : this()
1627 {
1628 base.Text = text;
1629 }
1630
1631 public UIP(string text, string @class)
1632 : this(text)
1633 {
1634 base.AddClass(@class);
1635 }
1636 }
1637
1638 public class UIAnchor : UIObject
1639 {
1640 public UIAnchor()
1641 : base("<a>")
1642 {
1643 }
1644
1645 public UIAnchor(string text)
1646 : this()
1647 {
1648 base.Text = text;
1649 }
1650
1651 public UIAnchor(UIObject uiobject)
1652 : this()
1653 {
1654 base.Append(uiobject);
1655 }
1656
1657 public string Href { get { return base.GetAttribute("href"); } set { base.Attribute("href", value); } }
1658 public string Target { get { return base.GetAttribute("target"); } set { base.Attribute("target", value); } }
1659 }
1660
1661 public class UIH : UIObject
1662 {
1663 public UIH()
1664 : base("<h1>")
1665 {
1666 }
1667
1668 public UIH(int i)
1669 : base("<h" + i.ToString() + ">")
1670 {
1671 }
1672
1673 public UIH(int i, string text)
1674 : this(i)
1675 {
1676 base.Text = text;
1677 }
1678 }
1679
1680 public class UIImg : UIObject
1681 {
1682 public UIImg()
1683 : base("<img>")
1684 {
1685 }
1686
1687 public UIImg(JsDictionary attr)
1688 : this()
1689 {
1690 base.Attribute(attr);
1691 }
1692
1693 public UIImg(params object[] nameValuePairs)
1694 : this()
1695 {
1696 base.Attribute(new JsDictionary(nameValuePairs));
1697 }
1698 }
1699
1700 public class UIPin : UILi
1701 {
1702 public UIButton ReadButton;
1703 public UIFieldSet UIPinMode;
1704 public UIRangeInput Range;
1705 public UIRangeInput AnalogRead;
1706 public UIFlipSwitch FlipSwitch;
1707 public int Pin;
1708 public UIListDivider ListDivider;
1709 private UIFieldSet SetUIPinMode(int i)
1710 {
1711 UIPinMode.Append(new UILabel("INPUT", "input" + i.ToString(), "pin" + i.ToString()));
1712 UIPinMode.Append(new UIRadioInput("input" + i.ToString(), "pin" + i.ToString(), "INPUT"));
1713 UIPinMode.Append(new UILabel("OUTPUT", "output" + i.ToString(), "pin" + i.ToString()));
1714 UIPinMode.Append(new UIRadioInput("output" + i.ToString(), "pin" + i.ToString(), "OUTPUT"));
1715 UIPinMode.Append(new UILabel("INPUT_PULLUP", "input_pullup" + i.ToString(), "pin" + i.ToString()));
1716 UIPinMode.Append(new UIRadioInput("input_pullup" + i.ToString(), "pin" + i.ToString(), "INPUT_PULLUP"));
1717 return UIPinMode;
1718 }
1719
1720 private void SetUIDigital(int i)
1721 {
1722 }
1723
1724 private void SetUIRange(int i)
1725 {
1726 Range = new UIRangeInput(-1, 255);
1727 Range.Value = 123;
1728 }
1729
1730 private void SetAnalogRead(int i)
1731 {
1732 AnalogRead = new UIRangeInput(0, 1023);
1733 AnalogRead.Handle = false;
1734 }
1735
1736 public UIPin()
1737 : base()
1738 {
1739 base.AddClass("pin");
1740 ListDivider = new UIListDivider();
1741 UIPinMode = new UIFieldSet(true);
1742
1743 Range = new UIRangeInput();
1744
1745 ReadButton = new UIButton();
1746 ReadButton.Title = "取得";
1747 ReadButton.ButtonIcon = UIButton.Icon.refresh;
1748 }
1749
1750 public UIPin(int pin)
1751 : this()
1752 {
1753 this.Pin = pin;
1754 UIDiv Div = new UIDiv();
1755
1756 Div.Append(new UIH(1, "pin" + pin.ToString()));
1757 Div.Append(ReadButton);
1758 ListDivider.Append(Div);
1759 SetUIPinMode(pin);
1760 SetUIDigital(pin);
1761 SetUIRange(pin);
1762
1763 if (pin >= 0 && pin <= 7) {
1764 FlipSwitch = new UIFlipSwitch(new UIOption("LOW", "LOW"), new UIOption("HIGH", "HIGH"));
1765 base.Append(new UIFieldContain(UIPinMode));
1766 base.Append(new UIFieldContain(FlipSwitch));
1767 base.Append(new UIFieldContain(Range));
1768 }
1769 else if (pin >= 8 && pin <= 13) {
1770 FlipSwitch = new UIFlipSwitch(new UIOption("LOW", "LOW"), new UIOption("HIGH", "HIGH"));
1771 base.Append(new UIFieldContain(UIPinMode));
1772 base.Append(new UIFieldContain(FlipSwitch));
1773 }
1774 else if (pin >= 14 && pin <= 19) {
1775 SetAnalogRead(pin);
1776 base.Append(new UIFieldContain(AnalogRead));
1777 }
1778 }
1779
1780 public Element[] GetElements()
1781 {
1782 Element[] elements = new Element[2];
1783 elements[0] = ListDivider.Element;
1784 elements[1] = base.Element;
1785 return elements;
1786 }
1787
1788 public void SetPinModeChange(EventHandlerFieldSet eventhandler)
1789 {
1790 if (UIPinMode != null) {
1791 UIPinMode.Change((elem, ev) => { eventhandler(UIPinMode, Pin); });
1792 }
1793 }
1794
1795 public void SetDigitalChange(EventHandlerFlipSwitch eventhandler)
1796 {
1797 if (FlipSwitch != null) {
1798 FlipSwitch.Change((elem, ev) => { eventhandler(ReadButton, FlipSwitch, Pin); });
1799 }
1800 }
1801
1802 public void SetReadButtonClick(EventHandlerFlipSwitch eventhandler)
1803 {
1804 if (FlipSwitch != null) {
1805 ReadButton.Click((elem, ev) => { eventhandler(ReadButton, FlipSwitch, Pin); });
1806 }
1807 }
1808
1809 public void SetAnalogWriteChange(EventHandlerRange eventhandler)
1810 {
1811 if (Range != null) {
1812 Range.Change((elem, ev) => { eventhandler(Range, Pin); });
1813 }
1814 }
1815
1816 public void SetAnalogReadChange(EventHandlerRange eventhandler)
1817 {
1818 if (AnalogRead != null) {
1819 ReadButton.Click((elem, ev) => { eventhandler(AnalogRead, Pin); });
1820 }
1821 }
1822 }
1823
1824 public delegate void EventHandlerFieldSet(UIFieldSet fieldcontain, int pin);
1825 public delegate void EventHandlerFlipSwitch(UIButton button, UIFlipSwitch fieldcontain, int pin);
1826 public delegate void EventHandlerDevicePropertyInfo(DeviceController.DevicePropertyInfo dpi, byte[] data);
1827 public delegate void EventHandlerRange(UIRangeInput fieldcontain, int pin);
1828
1829 public class UIDeviceController
1830 {
1831 public DeviceController DeviceController;
1832
1833 public class UIDeviceInfo
1834 {
1835 protected CtrlUI Page;
1836 public DeviceController.DeviceInfo di = null;
1837 Element[] Elements;
1838
1839 protected void UIDeviceSet(DeviceController.DeviceInfo di, CtrlUI Page)
1840 {
1841 this.di = di;
1842 this.Page = Page;
1843 if (((WampApiKadecotDevice)di.Data).protocol == "arduino") {
1844 Elements = di.SetPin(Page);
1845 }
1846 else {
1847 Elements = di.SetEchonetlite(Page);
1848 }
1849 }
1850
1851 public jQueryObject GetPropertys()
1852 {
1853 return jQuery.FromElements(Elements);
1854 }
1855
1856 public void GetData()
1857 {
1858 foreach (DeviceController.DevicePropertyInfo dpi in di.Properties) {
1859 if (dpi.Data != null) {
1860 dpi.GetValue(dpi.Data);
1861 }
1862 }
1863 }
1864
1865 public bool IsWait()
1866 {
1867 bool flag = false;
1868
1869 if (di != null && di.Properties != null) {
1870 foreach (DeviceController.DevicePropertyInfo dpi in di.Properties) {
1871 if (dpi != null && dpi.IsWaitRes) {
1872 flag = true;
1873 }
1874 }
1875 }
1876
1877 return flag;
1878 }
1879
1880 public Element[] SetEchonetlite(CtrlUI ctrlui)
1881 {
1882 Element[] ele = new Element[di.Properties.Count];
1883 int i = 0;
1884 foreach (DeviceController.DevicePropertyInfo dpi in di.Properties) {
1885 dpi.SetProperty(dpi);
1886 dpi.SetName(di);
1887 dpi.SetKadecotGet(Page.KadecotGet);
1888 dpi.SetKadecotSet(Page.KadecotSet);
1889 ele[i++] = dpi.GetElement();
1890 }
1891 return ele;
1892 }
1893
1894 public Element[] SetPin(CtrlUI ctrlui)
1895 {
1896 Page = ctrlui;
1897 Element[] ele = new Element[20];
1898 Element[] element;
1899 int j = 0;
1900 for (int i = 0; i <= 19; i++) {
1901 element = SetPin(i, Page);
1902 ele[j++] = element[0];
1903 ele[j++] = element[1];
1904 }
1905 return ele;
1906 }
1907
1908 public Element[] SetPin(int i, CtrlUI Page)
1909 {
1910 UIPin uiPin = new UIPin(i);
1911 uiPin.SetPinModeChange(Page.pinMode_Change);
1912 uiPin.SetDigitalChange(Page.digital_Change);
1913 uiPin.SetReadButtonClick(Page.DigitalRead);
1914 uiPin.SetAnalogWriteChange(Page.analogWrite_Change);
1915 uiPin.SetAnalogReadChange(Page.analogRead);
1916 return uiPin.GetElements();
1917 }
1918 }
1919
1920 public jQueryObject GetUINodeList(jQueryEventHandlerWithContextDi listitem_click)
1921 {
1922 UINodeList nodelist = new UINodeList(DeviceController.NodeList, listitem_click);
1923
1924 return nodelist.GetNodeList();
1925 }
1926
1927 public delegate void jQueryEventHandlerWithContextDi(Element elem, jQueryEvent e, DeviceController.DeviceInfo node);
1928
1929 public class UIDevicePropertyInfo
1930 {
1931 private UIGrpBox Grpbox;
1932
1933 public Element GetElement()
1934 {
1935 return Grpbox.Object.GetElement(0);
1936 }
1937
1938 public void SetName(DeviceController.DeviceInfo di)
1939 {
1940 string nameid = di.GetObjectID() + dpi.GetPropertyCode("X2");
1941 Grpbox.SetName(nameid);
1942 }
1943
1944 public string ErrorText { get { return Grpbox.ErrorText; } set { Grpbox.ErrorText = value; } }
1945
1946 public int GetMaxLength()
1947 {
1948 int len = 2 * ((dpi.PropertyInfo == null) ? dpi.Size : (((dpi.PropertyInfo.arrayCount == 0) ? 1 : dpi.PropertyInfo.arrayCount) * dpi.PropertyInfo.size));
1949 return len;
1950 }
1951
1952 public void SetProperty(DeviceController.DevicePropertyInfo dpi)
1953 {
1954 this.dpi = dpi;
1955 Grpbox = new UIGrpBox(dpi);
1956 }
1957
1958 public void SetKadecotGet(EventHandlerPropertyInfo KadecotGet)
1959 {
1960 DeviceController.DevicePropertyInfo opeSt = null;
1961
1962 //現在時刻設定
1963 if (dpi.PropertyCode == 0x97) {
1964 }
1965 else if (dpi.PropertyCode == 0x98) {
1966
1967 }
1968 else if (this.dpi.InputTypes.Count == 0) {
1969
1970 }
1971 else if (dpi.PropertyCode == 0x80 && dpi.InputTypes.Count == 1 && dpi.InputTypes[0].Mode == PropertyInputMode.Select) {
1972
1973 }
1974
1975 else {
1976 foreach (PropertyInputInfo pii in dpi.InputTypes) {
1977 if (dpi.PropertyCode == 0x80)
1978 opeSt = dpi;
1979 }
1980 if (opeSt != null)
1981 KadecotGet(opeSt);
1982 }
1983 }
1984
1985 public void SetKadecotSet(EventHandlerDevicePropertyInfo KadecotSet)
1986 {
1987 Grpbox.KadecotSet = KadecotSet;
1988 }
1989
1990 private DeviceController.DevicePropertyInfo dpi;
1991
1992 public delegate void EventHandlerPropertyInfo(DeviceController.DevicePropertyInfo dpi);
1993
1994 public void GetValue(byte[] data)
1995 {
1996 Grpbox.SetGetValue(data);
1997 }
1998 }
1999 }
2000
2001 public class UINodeList
2002 {
2003 public UINodeList(IEnumerable<DeviceController.NodeInfo> NodeList, UIDeviceController.jQueryEventHandlerWithContextDi listitem_click)
2004 {
2005 info = new UIDiv();
2006 string identifer = "";
2007
2008 foreach (var node in NodeList) {
2009 var profile = node.Profile;
2010
2011 if (jQuery.Select("#" + "cl_node_" + identifer).Length > 0)
2012 continue;
2013
2014 UICollapsibleset col = new UICollapsibleset(node.Data.ToString());
2015 col.Id = "cl_node_" + identifer;
2016 col.DataInset = true;
2017 info.Append(col);
2018 UIListview listview = new UIListview("id", "lv_node_" + identifer);
2019
2020 col.Append(listview);
2021
2022 foreach (var item in node.Devices) {
2023 if (item.Profile)
2024 continue;
2025
2026 identifer = item.GetObjectID();
2027 if (jQuery.Select("#" + "li_device_" + identifer).Length > 0)
2028 continue;
2029 UIListviewItem listitem = new UIListviewItem();
2030 listitem.Id = "li_device_" + identifer;
2031 listitem.Click((ele, ev) => { listitem_click(ele, ev, item); });
2032 listview.Append(listitem);
2033
2034
2035 UIAnchor anchor = new UIAnchor();
2036 anchor.Href = "#";
2037 anchor.Title = ((WampApiKadecotDevice)item.Data).description;
2038 anchor.Text = ((WampApiKadecotDevice)item.Data).nickname;
2039 anchor.Click((ele, ev) => { listitem_Click(listitem, item); });
2040
2041 listitem.Append(anchor);
2042 }
2043 }
2044 }
2045
2046 private UIDiv info;
2047
2048 public jQueryObject GetNodeList()
2049 {
2050 return info.Children();
2051 }
2052
2053 /// <summary>
2054 /// "#li_device_XXXXXX"をクリック
2055 /// </summary>
2056 /// <param name="elem"></param>
2057 /// <param name="ev"></param>
2058 private void listitem_Click(UIListviewItem listitem, DeviceController.DeviceInfo item)
2059 {
2060 //選択中クラスの追加
2061 jQuery.Select(".li-select").RemoveClass("li-select");
2062 listitem.AddClass("li-select");
2063 }
2064 }
2065
2066 public static class UIEventNames
2067 {
2068 public static string CurrentNodeChange = "currentnode.change";
2069 public static string LoadingShow = "loading.show";
2070 public static string LoadingHide = "loading.hide";
2071 /// <summary>機器検索開始</summary>
2072 public static string SearchStart = "search.start";
2073 /// <summary>機器検索終了</summary>
2074 public static string SearchEnd = "search.end";
2075 /// <summary>機器検索エラー</summary>
2076 public static string SearchError = "search.error";
2077 /// <summary>入力画面作成開始</summary>
2078 public static string PropertyWriteStart = "propertywrite.start";
2079 /// <summary>入力画面作成終了</summary>
2080 public static string PropertyWriteEnd = "propertywrite.end";
2081 }
2082
2083 public static class UIEventHandler
2084 {
2085 public static void LoadingShow(jQueryEvent ev)
2086 {
2087 jQueryMobile.Loading("show");
2088 }
2089
2090 public static void LoadingHide(jQueryEvent ev)
2091 {
2092 jQueryMobile.Loading("hide");
2093 }
2094 }
2095
2096 public enum KeyPress
2097 {
2098 Delete = 0,
2099 BackSpace = 8,
2100 minus = 45,
2101 dot = 46,
2102 slash = 47,
2103 _0 = 48,
2104 _1 = 49,
2105 _2 = 50,
2106 _3 = 51,
2107 _4 = 52,
2108 _5 = 53,
2109 _6 = 54,
2110 _7 = 55,
2111 _8 = 56,
2112 _9 = 57,
2113 A = 65,
2114 B = 66,
2115 C = 67,
2116 D = 68,
2117 E = 69,
2118 F = 70,
2119 a = 97,
2120 b = 98,
2121 c = 99,
2122 d = 100,
2123 e = 101,
2124 f = 102,
2125 }
2126}
Note: See TracBrowser for help on using the repository browser.