//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
// MDI.cpp : Definiuje zachowanie klas w aplikacji.
//

// Jest to część biblioteki Microsoft Foundation Classes C++.
// Copyright (c) Microsoft Corporation. Wszystkie prawa zastrzeżone.
//
// Poniższy kod źródłowy powstał tylko w celu uzupełnienia
// Microsoft Foundation Classes Reference i powiązanej
// dokumentacji elektronicznej, jaka została udostępniona wraz z biblioteką.
// Szczegółowe informacji na temat produktu Microsoft Foundation Classes
// można odnaleźć w tej dokumentacji.

#include "stdafx.h"
#include "MDI.h"

#include "MainFrm.h"

#include "AssemblyDoc.h"
#include "AssemblyFrame.h"
#include "AssemblyView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMDIApp

BEGIN_MESSAGE_MAP(CMDIApp, CWinApp)
	//{{AFX_MSG_MAP(CMDIApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	//}}AFX_MSG_MAP
	// ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Tworzenie CMDIApp

CMDIApp::CMDIApp()
{
}

/////////////////////////////////////////////////////////////////////////////
// Jedyny obiekt CMDIApp

CMDIApp theApp;

/////////////////////////////////////////////////////////////////////////////
// Inicjalizacja CMDIApp

BOOL CMDIApp::InitInstance()
{
	CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

	// Rejestracja szablonów dokumentów aplikacji. Szablony dokumentów służą 
	// jako połączenie między dokumentami, oknami i widokami.

	CMultiDocTemplate* pAssemblyTemplate = new CMultiDocTemplate(
		IDR_ASSEMBLYVIEW,
		RUNTIME_CLASS(CAssemblyDoc),
		RUNTIME_CLASS(CAssemblyFrame),
		RUNTIME_CLASS(CAssemblyView));
	AddDocTemplate(pAssemblyTemplate);

	// Utworzenie głównego okna MDI Frame
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
		return FALSE;
	m_pMainWnd = pMainFrame;

	// Główne okno zostało utworzone, a więc można je wyświetlić i zaktualizować.
	pMainFrame->ShowWindow(m_nCmdShow);
	pMainFrame->UpdateWindow();

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// Okno dialogowe CAboutDlg używane przez App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dane okna dialogowego
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// Wygenerowana przez ClassWizard funkcja wirtualna zastępuje
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // Obsługa DDX/DDV
	//}}AFX_VIRTUAL

// Implementacja
protected:
	//{{AFX_MSG(CAboutDlg)
		// Brak procedur obsługi wiadomości
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// Brak procedur obsługi wiadomości
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// Polecenie uruchamiające okno dialogowe
void CMDIApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// inne ustawienia globalne

/////////////////////////////////////////////////////////////////////////////
// Polecenia CMDIApp

void CMDIApp::OnFileOpen()
{
	// Przeszukuje listę szablonów w celu odnalezienia typu dokumentu 
	// zawierającego ciąg "AssemblyView".

	POSITION curTemplatePos = GetFirstDocTemplatePosition();

	while(curTemplatePos != NULL)
	{
		CDocTemplate* curTemplate =
			GetNextDocTemplate(curTemplatePos);
		CString str;
		curTemplate->GetDocString(str, CDocTemplate::docName);
		if(str == _T("AssemblyView"))
		{
			// szFilters to ciąg tekstowy zawierający dwa filtry nazwy pliku:
			TCHAR szFilters[]=
				_T("Pliki podzespołów (*.exe)|*.exe|DLL (*.dll)|*.dll||");

			// Utworzenie okna dialogowego Open; domyślne rozszerzenie nazwy pliku to ".exe".
			CFileDialog fd (TRUE, _T("exe"), _T("*.exe"),
				            OFN_FILEMUSTEXIST| OFN_HIDEREADONLY,
							szFilters, 0);
			if(fd.DoModal() == IDOK)
			{
				curTemplate->OpenDocumentFile(fd.GetPathName());
				return;
			}
		}
	}
	AfxMessageBox(IDS_NOASSEMBLYTEMPLATE);
}

int CMDIApp::ExitInstance()
{
	CoUninitialize();

	return CWinApp::ExitInstance();
}
