package ru.rsdn.patterns.mvc.view;

import ru.rsdn.patterns.mvc.controller.Controller;
import ru.rsdn.patterns.mvc.model.IModelSubscriber;
import ru.rsdn.patterns.mvc.model.Model;

/**
 * Абстрактное представление
 * @param <M> модель
 * @param
 * <P>
 * свойство модели
 */
public abstract class AbstractView<M extends Model<P>, P> implements
		IModelSubscriber<P> {
	private M model;

	private final Controller<M, P> controller = new Controller<M, P>();

	/**
	 * @return модель
	 */
	protected M getModel() {
		return model;
	}

	/**
	 * Установить модель
	 * @param _model модель
	 */
	public void setModel(M _model) {
		unsubscribe();
		model = _model;
		controller.setModel(model);
		subscribe();
	}

	private void subscribe() {
		if (model != null)
			model.subscribe(this);
	}

	/**
	 * Снять подписку с модели
	 */
	protected void unsubscribe() {
		if (model != null)
			model.unsubscribe(this);
	}

	/**
	 * @return контроллер
	 */
	protected Controller<M, P> getController() {
		return controller;
	}

	/**
	 * Отменить последнее изменение
	 */
	protected void undo() {
		controller.queryUndo();
	}

	/**
	 * Повторить последнее отмененное изменение
	 */
	protected void redo() {
		controller.queryRedo();
	}
}