Ejemplo n.º 1
0
        public void Input(byte[] data, int offset, int length)
        {
            _manipulator.Load(GetDocument().CurrentLine, 0);
            _manipulator.CaretColumn       = GetDocument().CaretColumn;
            _manipulator.DefaultDecoration = _currentdecoration;

            _decoder.Input(this, data, offset, length);

            GetDocument().ReplaceCurrentLine(_manipulator.Export());
            GetDocument().CaretColumn = _manipulator.CaretColumn;
        }
Ejemplo n.º 2
0
        public void OnReception(ByteDataFragment data)
        {
            try {
                bool pass_to_terminal = true;
                if (_modalTerminalTask != null)
                {
                    bool show_input = _modalTerminalTask.ShowInputInTerminal;
                    _modalTerminalTask.OnReception(data);
                    if (!show_input)
                    {
                        pass_to_terminal = false; //入力を見せない(XMODEMとか)のときはターミナルに与えない
                    }
                }

                //バイナリログの出力
                _logService.BinaryLogger.Write(data);

                if (pass_to_terminal)
                {
                    TerminalDocument document = _document;
                    lock (document) {
                        //_invalidateParam.Reset();
                        //ここから旧Input()
                        _manipulator.Load(GetDocument().CurrentLine, 0);
                        _manipulator.CaretColumn       = GetDocument().CaretColumn;
                        _manipulator.DefaultDecoration = _currentdecoration;

                        //処理本体
                        _decoder.OnReception(data);

                        GetDocument().ReplaceCurrentLine(_manipulator.Export());
                        GetDocument().CaretColumn = _manipulator.CaretColumn;
                        //ここまで

                        //右端にキャレットが来たときは便宜的に次行の頭にもっていく
                        if (document.CaretColumn == document.TerminalWidth)
                        {
                            document.CurrentLineNumber++; //これによって次行の存在を保証
                            document.CaretColumn = 0;
                        }

                        CheckDiscardDocument();
                        AdjustTransientScrollBar();

                        //現在行が下端に見えるようなScrollBarValueを計算
                        int n = document.CurrentLineNumber - document.TerminalHeight + 1 - document.FirstLineNumber;
                        if (n < 0)
                        {
                            n = 0;
                        }

                        //Debug.WriteLine(String.Format("E={0} C={1} T={2} H={3} LC={4} MAX={5} n={6}", _transientScrollBarEnabled, _tag.Document.CurrentLineNumber, _tag.Document.TopLineNumber, _tag.Connection.TerminalHeight, _transientScrollBarLargeChange, _transientScrollBarMaximum, n));
                        if (IsAutoScrollMode(n))
                        {
                            _scrollBarValues.Value = n;
                            document.TopLineNumber = n + document.FirstLineNumber;
                        }
                        else
                        {
                            _scrollBarValues.Value = document.TopLineNumber - document.FirstLineNumber;
                        }

                        //Invalidateをlockの外に出す。このほうが安全と思われた

                        //受信スレッド内ではマークをつけるのみ。タイマーで行うのはIntelliSenseに副作用あるので一時停止
                        //_promptRecognizer.SetContentUpdateMark();
                        _promptRecognizer.Recognize();
                    }

                    if (_afterExitLockActions.Count > 0)
                    {
                        Control main = _session.OwnerWindow.AsControl();
                        foreach (AfterExitLockDelegate action in _afterExitLockActions)
                        {
                            main.Invoke(action);
                        }
                        _afterExitLockActions.Clear();
                    }
                }

                if (_modalTerminalTask != null)
                {
                    _modalTerminalTask.NotifyEndOfPacket();
                }
                _session.NotifyViewsDataArrived();
            }
            catch (Exception ex) {
                RuntimeUtil.ReportException(ex);
            }
        }