Terminal: move jediterm library to platform and provide open url in browser action...
[idea/community.git] / platform / platform-impl / src / com / intellij / terminal / AppendableTerminalDataStream.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.terminal;
17
18 import com.jediterm.terminal.TerminalDataStream;
19
20 import java.io.IOException;
21 import java.util.concurrent.LinkedBlockingDeque;
22
23 /**
24  * @author traff
25  */
26 public class AppendableTerminalDataStream implements TerminalDataStream, Appendable {
27   private LinkedBlockingDeque<Character> myQueue = new LinkedBlockingDeque<>(10000000);
28
29   @Override
30   public char getChar() throws IOException {
31     try {
32       return myQueue.take();
33     }
34     catch (InterruptedException e) {
35       throw new IOException(e);
36     }
37   }
38
39   @Override
40   public void pushChar(char c) throws IOException {
41     myQueue.push(c);
42   }
43
44   @Override
45   public String readNonControlCharacters(int maxLength) throws IOException {
46     StringBuilder sb = new StringBuilder();
47     while (sb.length() < maxLength) {
48       Character c = myQueue.peek();
49       if (c == null || c.charValue() < 32) {
50         break;
51       }
52       sb.append(myQueue.poll());
53     }
54
55     return sb.toString();
56   }
57
58   @Override
59   public void pushBackBuffer(char[] chars, int length) throws IOException {
60     for (int i = 0; i < length; i++) {
61       myQueue.addFirst(chars[length - i - i]);
62     }
63   }
64
65   @Override
66   public Appendable append(CharSequence csq) throws IOException {
67     for (int i = 0; i<csq.length(); i++) {
68       append(csq.charAt(i));
69     }
70     return this;
71   }
72
73   @Override
74   public Appendable append(CharSequence csq, int start, int end) throws IOException {
75     for (int i = start; i<end; i++) {
76       append(csq.charAt(i));
77     }
78
79     return this;
80   }
81
82   @Override
83   public Appendable append(char c) throws IOException {
84     try {
85       myQueue.put(c);
86     }
87     catch (InterruptedException e) {
88       throw new IOException(e);
89     }
90     return this;
91   }
92 }