// MultiView.cpp 
//

#include "stdafx.h"
#include "Multi.h"

#include "MultiDoc.h"
#include "MultiView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Объекты класса CMultiView создаются динамически
IMPLEMENT_DYNCREATE(CMultiView, CView)

// Таблица сообщений класса CMultiView 
BEGIN_MESSAGE_MAP(CMultiView, CView)
   //{{AFX_MSG_MAP(CMultiView)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
   ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
   ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
   ON_COMMAND(ID_FILE_PRINT_PREVIEW, 
                             CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Конструктор и деструктор класса CMultiView 

CMultiView::CMultiView()
{
	// TODO: 

}

CMultiView::~CMultiView()
{
}


/////////////////////////////////////////////////////////////////////////////
// Метод PreCreateWindow класса CMultiView 

BOOL CMultiView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// Метод OnDraw класса CMultiView 

void CMultiView::OnDraw(CDC* pDC)
{
   CMultiDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   int i;
   for (i=0; i<pDoc->pointFigCenter.GetSize(); i++)
      pDC->Rectangle(
         pDoc->pointFigCenter[i].x-10,
         pDoc->pointFigCenter[i].y-10, 
         pDoc->pointFigCenter[i].x+10, 
         pDoc->pointFigCenter[i].y+10
      );
}

/////////////////////////////////////////////////////////////////////////////
// Методы класса CMultiView, управляющие печатью документов

BOOL CMultiView::OnPreparePrinting(CPrintInfo* pInfo)
{
	return DoPreparePrinting(pInfo);
}

void CMultiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 
}

void CMultiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 
}

/////////////////////////////////////////////////////////////////////////////
// Диагностические методы 

#ifdef _DEBUG
void CMultiView::AssertValid() const
{
	CView::AssertValid();
}

void CMultiView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

/////////////////////////////////////////////////////////////////////////////
// Отладочная версия метода GetDocumentкласса CMultiView 

CMultiDoc* CMultiView::GetDocument() 
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMultiDoc)));
	return (CMultiDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////


void CMultiView::OnLButtonDown(UINT nFlags, CPoint point) 
{
   // Получаем указатель на документ (объект класса CSingleDoc)
   CMultiDoc* pDoc = GetDocument();

   // Проверяем указатель pDoc
   ASSERT_VALID(pDoc);

   // Отображаем на экране квадрат
   CClientDC dc(this);
   dc.Rectangle(
         point.x-10, point.y-10, point.x+10, point.y+10);

   // Добавляем к массиву, определяющему документ, новый 
   // элемент
   pDoc->pointFigCenter.Add(point);

   // Устанавливаем флаг изменения документа
   pDoc->SetModifiedFlag();

   // Записываем в переменную nNewFig индекс последнего 
   // элемента массива pointFigCenter
   int nNewFig;
   nNewFig = pDoc->pointFigCenter.GetUpperBound();

   // Сообщаем всем окнам просмотра кроме данного об 
   // изменении документа, указывая индекс нового элемента 
   // массива, представляющего документ
   pDoc->UpdateAllViews(this, nNewFig);

   // Вызываем метод OnLButtonDown базового класса CView
   CView::OnLButtonDown(nFlags, point);

}

void CMultiView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	   // Получаем указатель на документ, относящийся к данному
   // окну просмотра
   CMultiDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // Если lHint равен нулю, выполняем обработку по умолчанию
   if (lHint==0L) 
      CView::OnUpdate(pSender, lHint, pHint);

   // В противном случае отображаем заданный элемент документа
   else
   {
      // Получаем контекст отображения окна просмотра
      CClientDC dc(this);

      // Отображаем фигуру, определенную элементом массива 
      // pointFigCenter с индексом lHint
      dc.Rectangle(
            pDoc->pointFigCenter[lHint].x-10,
            pDoc->pointFigCenter[lHint].y-10,
            pDoc->pointFigCenter[lHint].x+10,
            pDoc->pointFigCenter[lHint].y+10
      );
   }

}
