001package gu.dtalk.client;
002
003import java.io.PrintStream;
004
005import com.alibaba.fastjson.JSONArray;
006import com.google.common.base.MoreObjects;
007import com.google.common.base.Strings;
008
009import gu.dtalk.Ack;
010import gu.dtalk.BaseItem;
011import gu.dtalk.BaseOption;
012import gu.dtalk.CheckOption;
013import gu.dtalk.MenuItem;
014import gu.dtalk.Ack.Status;
015
016/**
017 * 文本渲染器,向{@link PrintStream}输出从设备端收到的消息
018 * @author guyadong
019 *
020 */
021public class TextRender implements IMessageRender {
022
023        private PrintStream stream = System.out;
024        
025        public TextRender() {
026        }
027
028        @Override
029        public void rendeAck(Ack<?> ack, boolean renderValueIfOk){
030                Status status = ack.getStatus();
031                if(renderValueIfOk && Ack.Status.OK == status && ack.getValue() != null){
032                        Object v = ack.getValue();
033                        if(v instanceof JSONArray){
034                                for (Object element : (JSONArray)v) {
035                                        stream.append(element.toString()).append("\n");
036                                }                               
037                        }else{
038                                stream.append(v.toString());
039                        }
040                }else{
041                        stream.append(status.name());           
042                        if(status != Ack.Status.OK && !Strings.isNullOrEmpty(ack.getStatusMessage())){
043                                stream.append(":").append(ack.getStatusMessage());
044                        }
045                }
046                stream.append('\n');
047        }
048
049        @Override
050        public void rendeItem(MenuItem menu){
051                stream.println("=========Device Menu============");
052                stream.printf("-->%s\n",menu.getPath());
053                int i=0;
054                for(BaseItem item: menu.getChilds()){
055                        String acc = item.isDisable() ? "x" : " ";
056                        String hide =item.isHide() ? "[H]" : "   ";
057                        String content = "";
058                        if(item instanceof BaseOption){
059                                BaseOption<?> option = (BaseOption<?>)item;
060                                content = MoreObjects.firstNonNull(option.contentOfValue(),"");
061                                // 只读标志
062                                acc = option.isReadOnly() ? "R" : acc;
063                        }
064                        if(!content.isEmpty()){
065                                content = ": " +content;
066                        }                       
067                        
068                        stream.printf("[%d] [%s] %s %s %s\n",
069                                        i++,
070                                        acc,
071                                        hide,
072                                        item.getUiName(),
073                                        content);
074                        if(item instanceof CheckOption){
075                                CheckOption<?> checkOption = (CheckOption<?>)item;
076                                stream.println(checkOption.contentOfOptions());
077                        }
078                }
079                stream.println("==Press number to seleect menu item,'.' show current menu(按数字选项菜单,'.'显示当前菜单)==");
080        }
081        public IMessageRender setStream(PrintStream stream) {
082                if(null != stream){
083                        this.stream = stream;
084                }
085                return this;
086        }
087        public PrintStream getStream() {
088                return stream;
089        }
090}