// Event.cpp : main project file.

#include "stdafx.h"

using namespace System;
// Delegates
delegate void FirstEventHandler(String^);
delegate void SecondEventHandler(String^);

// Event source class
ref class EvtSrc
{
	public:
		// Declare the events
		event FirstEventHandler^ OnFirstEvent;
		event SecondEventHandler^ OnSecondEvent;

		// Event raising functions
		void RaiseOne(String^ pMsg)
		{
			OnFirstEvent(pMsg);
		}

		void RaiseTwo(String^ pMsg)
		{
			OnSecondEvent(pMsg);
		}
};

// Event receiver class
ref class EvtRcv
{
	EvtSrc^ theSource;
	public:
		EvtRcv(EvtSrc^ pSrc)
		{
			if (pSrc == nullptr)
				throw gcnew ArgumentNullException("Must have event source");
			// Save the source
			theSource = pSrc;

			// Add our handlers
			theSource->OnFirstEvent += 
				gcnew FirstEventHandler(this, &EvtRcv::FirstEvent);
			theSource->OnSecondEvent += 
				gcnew SecondEventHandler(this, &EvtRcv::SecondEvent);
		}

		// Handler functions
		void FirstEvent(String^ pMsg)
		{
			Console::WriteLine("EvtRcv: event one, message was {0}", pMsg);
		}

		void SecondEvent(String^ pMsg)
		{
			Console::WriteLine("EvtRcv: event two, message was {0}", pMsg);
		}

		// Remove a handler
		void RemoveHandler()
		{
			// Remove the handler for the first event
			theSource->OnFirstEvent -= 
				gcnew FirstEventHandler(this, &EvtRcv::FirstEvent);
		}
};

int main(array<System::String ^> ^args)
{
	Console::WriteLine(L"Event Example");

	// Create a source
	EvtSrc^ pSrc = gcnew EvtSrc();
	// Create a receiver, and bind it to the source
	EvtRcv^ pRcv = gcnew EvtRcv(pSrc);

	// Fire events
    Console::WriteLine(L"Fire both events:");
    pSrc->RaiseOne(L"Hello, mum!");
    pSrc->RaiseTwo(L"One big step");

	// Remove the handler for event one
	pRcv->RemoveHandler();

	// Fire events again
	Console::WriteLine(L"Fire both events again:");
	pSrc->RaiseOne(L"Hello, mum!");
	pSrc->RaiseTwo(L"One big step");

    return 0;
}






