/*
 * File: TwoConsoleDemo.java
 * -------------------------
 * This program test the multithreading capabilities of the IOConsole
 * class by building a two-console communicator.
 */

import acm.io.*;
import acm.program.*;
import java.awt.*;
import java.io.*;
import java.util.*;

/**
 * This class simulates an interactive discussion between two consoles.
 * Its primary purpose is to test the facilities of the <code>IOConsole</code>
 * class.
 */

public class TwoConsoleDemo extends Program {

	public void init() {
		TCModel model = new TCModel();
		c1 = new TCView(model, 1);
		c2 = new TCView(model, 2);
		add(c1);
		add(c2);
	}

	public void run() {
		new Thread(c1).start();
		new Thread(c2).start();
	}

	private TCView c1;
	private TCView c2;

/* Standard Java entry point */
/* This method can be eliminated in most Java environments */
	public static void main(String[] args) {
		new TwoConsoleDemo().start(args);
	}
}

class TCView extends IOConsole implements Runnable {

	public TCView(TCModel model, int index) {
		consoleIndex = index;
		consoleModel = model;
		consoleModel.addView(this);
		Color inputColor = (index % 2 == 0) ? Color.MAGENTA : Color.BLUE;
		Color errorColor = (index % 2 == 1) ? Color.MAGENTA : Color.BLUE;
		String inputColorName = (index % 2 == 0) ? "magenta" : "blue";
		String errorColorName = (index % 2 == 1) ? "magenta" : "blue";
		setInputColor(inputColor);
		setErrorColor(errorColor);
		int r = Math.max(0xCC, inputColor.getRed());
		int g = Math.max(0xCC, inputColor.getGreen());
		int b = Math.max(0xCC, inputColor.getBlue());
		setBackground(new Color(r, g, b));
		println("Console " + index);
		print("On this console, input appears in ");
		setInputScript(new BufferedReader(new StringReader(inputColorName + "\n")));
		readLine();
		print("Output from other consoles appears in ");
		showErrorMessage(errorColorName);
	}

	public void run() {
		while (true) {
			String line = readLine();
			consoleModel.inputReceived(this, line);
		}
	}

	public int getIndex() {
		return consoleIndex;
	}

	public void inputReceived(String line) {
		showErrorMessage(line);
	}

	private TCModel consoleModel;
	private int consoleIndex;
}

class TCModel {

	public TCModel() {
		views = new ArrayList();
	}

	public void addView(TCView view) {
		views.add(view);
	}

	public void inputReceived(TCView source, String line) {
		int nViews = views.size();
		for (int i = 0; i < nViews; i++) {
			TCView view = (TCView) views.get(i);
			if (view != source) view.inputReceived(line);
		}
	}

	private ArrayList views;
}


		