// Path: src/main/java/in/tombo/kashiki/buffer/BufferChar.java
// public class BufferChar implements Comparable<BufferChar> {
// 
//   private String c;
//   private int row;
//   private int col;
//   private BufferCharObserver observer = new BufferCharObserver();
// 
//   public BufferChar(String c, int row, int col) {
//     this.c = c;
//     this.row = row;
//     this.col = col;
//   }
// 
//   public void addListener(BufferCharListener listener) {
//     observer.addListener(listener);
//   }
// 
//   public void updatePosition(int row, int col) {
//     this.row = row;
//     this.col = col;
//     observer.update(this);
//   }
// 
//   public String getChar() {
//     return c;
//   }
// 
//   public int getRow() {
//     return row;
//   }
// 
//   public int getCol() {
//     return col;
//   }
// 
//   @Override
//   public int compareTo(BufferChar o) {
//     int rowCompare = Integer.compare(row, o.row);
//     if (rowCompare != 0) {
//       return rowCompare;
//     }
//     return Integer.compare(col, o.col);
//   }
// }
// 
// Path: src/main/java/in/tombo/kashiki/buffer/BufferLine.java
// public class BufferLine implements Comparable<BufferLine> {
// 
//   private int rowNum;
//   private List<BufferChar> chars = new ArrayList<>();
//   private BufferLineObserver observer = new BufferLineObserver();
// 
//   public void addListener(BufferLineListener listener) {
//     observer.addListener(listener);
//   }
// 
//   public void updatePosition(int rowNum) {
//     this.rowNum = rowNum;
//     for (int i = 0; i < chars.size(); i++) {
//       chars.get(i).updatePosition(rowNum, i);
//     }
//     observer.update(this);
//   }
// 
//   public int getLength() {
//     return chars.size();
//   }
// 
//   public String toLineString() {
//     StringBuilder buf = new StringBuilder();
//     for (BufferChar bc : chars) {
//       buf.append(bc.getChar());
//     }
//     return buf.toString();
//   }
// 
//   public String posString(int position) {
//     return chars.get(position).getChar();
//   }
// 
//   public void insertLast(BufferChar bufferChar) {
//     chars.add(bufferChar);
//   }
// 
//   public void insertChar(int col, String c) {
//     BufferChar bc = new BufferChar(c, rowNum, col);
//     chars.add(col, bc);
//     updatePosition(rowNum);
//     observer.addChar(bc);
//   }
// 
//   public List<BufferChar> insertEnter(int col) {
//     List<BufferChar> results = new ArrayList<>();
//     if (col == chars.size()) {
//       return results;
//     }
//     while (chars.size() > col) {
//       results.add(chars.remove(col));
//     }
//     observer.update(this);
//     return results;
//   }
// 
//   public BufferChar removeChar(int col) {
//     BufferChar removedChar = chars.remove(col);
//     observer.removeChar(removedChar);
//     return removedChar;
//   }
// 
//   public void join(BufferLine line) {
//     for (BufferChar bc : line.chars) {
//       chars.add(bc);
//     }
//     updatePosition(rowNum);
//   }
// 
//   public List<BufferChar> getChars() {
//     return ImmutableList.copyOf(chars);
//   }
// 
//   public int getRowNum() {
//     return rowNum;
//   }
// 
//   @Override
//   public int compareTo(BufferLine o) {
//     return Integer.compare(rowNum, o.rowNum);
//   }
// }
// 
// Path: src/main/java/in/tombo/kashiki/buffer/BufferLineListener.java
// public interface BufferLineListener {
//   public void update(BufferLine bl);
// 
//   public void addChar(BufferChar bufferChar);
// 
//   public void removeChar(BufferChar bufferChar);
// 
// }


import in.tombo.kashiki.buffer.BufferChar;
import in.tombo.kashiki.buffer.BufferLine;
import in.tombo.kashiki.buffer.BufferLineListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import com.jogamp.opengl.GL2;
package in.tombo.kashiki.view;




public class LineView extends Base implements BufferLineListener, Comparable<LineView> {

  private BufferLine bufferLine;
  private List<CharView> chars = new ArrayList<>();
  private List<CharView> removedChars = new ArrayList<>();

  public LineView(BufferLine bufferLine) {
    this.bufferLine = bufferLine;
    bufferLine.addListener(this);
// Path: src/main/java/in/tombo/kashiki/buffer/BufferChar.java
// public class BufferChar implements Comparable<BufferChar> {
// 
//   private String c;
//   private int row;
//   private int col;
//   private BufferCharObserver observer = new BufferCharObserver();
// 
//   public BufferChar(String c, int row, int col) {
//     this.c = c;
//     this.row = row;
//     this.col = col;
//   }
// 
//   public void addListener(BufferCharListener listener) {
//     observer.addListener(listener);
//   }
// 
//   public void updatePosition(int row, int col) {
//     this.row = row;
//     this.col = col;
//     observer.update(this);
//   }
// 
//   public String getChar() {
//     return c;
//   }
// 
//   public int getRow() {
//     return row;
//   }
// 
//   public int getCol() {
//     return col;
//   }
// 
//   @Override
//   public int compareTo(BufferChar o) {
//     int rowCompare = Integer.compare(row, o.row);
//     if (rowCompare != 0) {
//       return rowCompare;
//     }
//     return Integer.compare(col, o.col);
//   }
// }
// 
// Path: src/main/java/in/tombo/kashiki/buffer/BufferLine.java
// public class BufferLine implements Comparable<BufferLine> {
// 
//   private int rowNum;
//   private List<BufferChar> chars = new ArrayList<>();
//   private BufferLineObserver observer = new BufferLineObserver();
// 
//   public void addListener(BufferLineListener listener) {
//     observer.addListener(listener);
//   }
// 
//   public void updatePosition(int rowNum) {
//     this.rowNum = rowNum;
//     for (int i = 0; i < chars.size(); i++) {
//       chars.get(i).updatePosition(rowNum, i);
//     }
//     observer.update(this);
//   }
// 
//   public int getLength() {
//     return chars.size();
//   }
// 
//   public String toLineString() {
//     StringBuilder buf = new StringBuilder();
//     for (BufferChar bc : chars) {
//       buf.append(bc.getChar());
//     }
//     return buf.toString();
//   }
// 
//   public String posString(int position) {
//     return chars.get(position).getChar();
//   }
// 
//   public void insertLast(BufferChar bufferChar) {
//     chars.add(bufferChar);
//   }
// 
//   public void insertChar(int col, String c) {
//     BufferChar bc = new BufferChar(c, rowNum, col);
//     chars.add(col, bc);
//     updatePosition(rowNum);
//     observer.addChar(bc);
//   }
// 
//   public List<BufferChar> insertEnter(int col) {
//     List<BufferChar> results = new ArrayList<>();
//     if (col == chars.size()) {
//       return results;
//     }
//     while (chars.size() > col) {
//       results.add(chars.remove(col));
//     }
//     observer.update(this);
//     return results;
//   }
// 
//   public BufferChar removeChar(int col) {
//     BufferChar removedChar = chars.remove(col);
//     observer.removeChar(removedChar);
//     return removedChar;
//   }
// 
//   public void join(BufferLine line) {
//     for (BufferChar bc : line.chars) {
//       chars.add(bc);
//     }
//     updatePosition(rowNum);
//   }
// 
//   public List<BufferChar> getChars() {
//     return ImmutableList.copyOf(chars);
//   }
// 
//   public int getRowNum() {
//     return rowNum;
//   }
// 
//   @Override
//   public int compareTo(BufferLine o) {
//     return Integer.compare(rowNum, o.rowNum);
//   }
// }
// 
// Path: src/main/java/in/tombo/kashiki/buffer/BufferLineListener.java
// public interface BufferLineListener {
//   public void update(BufferLine bl);
// 
//   public void addChar(BufferChar bufferChar);
// 
//   public void removeChar(BufferChar bufferChar);
// 
// }


// Path: src/main/java/in/tombo/kashiki/view/LineView.java
import in.tombo.kashiki.buffer.BufferChar;
import in.tombo.kashiki.buffer.BufferLine;
import in.tombo.kashiki.buffer.BufferLineListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import com.jogamp.opengl.GL2;

package in.tombo.kashiki.view;




public class LineView extends Base implements BufferLineListener, Comparable<LineView> {

  private BufferLine bufferLine;
  private List<CharView> chars = new ArrayList<>();
  private List<CharView> removedChars = new ArrayList<>();

  public LineView(BufferLine bufferLine) {
    this.bufferLine = bufferLine;
    bufferLine.addListener(this);
    List<BufferChar> bufferChars = bufferLine.getChars();