//////////////////////////////////////////////////////////////////
// Apply the specified set of commands to the map.
//
void c_RestFetchImage::ApplyMapViewCommands(MgMap* map, MgPropertyCollection* mapViewCommands)
{
	if(mapViewCommands == NULL)
		return;

	Ptr<MgProperty> val;

	//Set view center X
	val = mapViewCommands->FindItem(m_mapCmdSetViewCenterX);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetViewCenterX);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		Ptr<MgPoint> center = map->GetViewCenter();
		Ptr<MgCoordinate> coord = center? center->GetCoordinate(): NULL;
		double y = coord? coord->GetY(): 0.;
		MgGeometryFactory gf;
		Ptr<MgCoordinate> coordNewCenter = gf.CreateCoordinateXY(MgUtil::StringToDouble(((MgStringProperty*)((MgProperty*)val))->GetValue()), y);
		Ptr<MgPoint> ptNewCenter = gf.CreatePoint(coordNewCenter);
		map->SetViewCenter(ptNewCenter);
	}

	//Set view center Y
	val = mapViewCommands->FindItem(m_mapCmdSetViewCenterY);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetViewCenterY);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		Ptr<MgPoint> center = map->GetViewCenter();
		Ptr<MgCoordinate> coord = center? center->GetCoordinate(): NULL;
		double x = coord? coord->GetX(): 0.;
		MgGeometryFactory gf;
		Ptr<MgCoordinate> coordNewCenter = gf.CreateCoordinateXY(x, MgUtil::StringToDouble(((MgStringProperty*)((MgProperty*)val))->GetValue()));
		Ptr<MgPoint> ptNewCenter = gf.CreatePoint(coordNewCenter);
		map->SetViewCenter(ptNewCenter);
	}

	//Set view scale
	val = mapViewCommands->FindItem(m_mapCmdSetViewScale);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetViewScale);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		STRING sScale = ((MgStringProperty*)((MgProperty*)val))->GetValue();
		double scale = MgUtil::StringToDouble(sScale);
		if(scale <= 0.0)
		{
			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetViewScale);
			arguments.Add(sScale);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgValueCannotBeLessThanOrEqualToZero", NULL);
		}

		map->SetViewScale(scale);

		//refresh all layers that are visible
		map->SetLayerRefreshMode(MgMap::refreshAll);
	}

	//Set display dpi
	val = mapViewCommands->FindItem(m_mapCmdSetDisplayDpi);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayDpi);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		STRING sDpi = ((MgStringProperty*)((MgProperty*)val))->GetValue();
		INT32 dpi = MgUtil::StringToInt32(sDpi);
		if(dpi <= 0)
		{
			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayDpi);
			arguments.Add(sDpi);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgValueCannotBeLessThanOrEqualToZero", NULL);
		}

		map->SetDisplayDpi(dpi);
	}

	//Set display width
	val = mapViewCommands->FindItem(m_mapCmdSetDisplayWidth);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayWidth);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		STRING sWidth = ((MgStringProperty*)((MgProperty*)val))->GetValue();
		INT32 width = MgUtil::StringToInt32(sWidth);
		if(width <= 0)
		{
			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayWidth);
			arguments.Add(sWidth);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgValueCannotBeLessThanOrEqualToZero", NULL);
		}

		map->SetDisplayWidth(width);
	}

	//Set display height
	val = mapViewCommands->FindItem(m_mapCmdSetDisplayHeight);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayHeight);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		STRING sHeight = ((MgStringProperty*)((MgProperty*)val))->GetValue();
		INT32 height = MgUtil::StringToInt32(sHeight);
		if(height <= 0)
		{
			MgStringCollection arguments;
			arguments.Add(m_mapCmdSetDisplayHeight);
			arguments.Add(sHeight);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgValueCannotBeLessThanOrEqualToZero", NULL);
		}

		map->SetDisplayHeight(height);
	}

	//Show layers
	val = mapViewCommands->FindItem(m_mapCmdShowLayers);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdShowLayers);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		ShowLayers(map, ((MgStringProperty*)((MgProperty*)val))->GetValue(), true);
	}

	//Hide layers
	val = mapViewCommands->FindItem(m_mapCmdHideLayers);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdHideLayers);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		ShowLayers(map, ((MgStringProperty*)((MgProperty*)val))->GetValue(), false);
	}

	//Show groups
	val = mapViewCommands->FindItem(m_mapCmdShowGroups);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdShowGroups);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		ShowGroups(map, ((MgStringProperty*)((MgProperty*)val))->GetValue(), true);
	}

	//Hide groups
	val = mapViewCommands->FindItem(m_mapCmdHideGroups);
	if(val != NULL)
	{
		if(val->GetPropertyType() != MgPropertyType::String)
		{
			STRING buffer;
			MgUtil::Int32ToString((INT32)val->GetPropertyType(), buffer);

			MgStringCollection arguments;
			arguments.Add(m_mapCmdHideGroups);
			arguments.Add(buffer);

			throw new MgInvalidArgumentException(L"MgController.ApplyMapViewCommands",
				__LINE__, __WFILE__, &arguments, L"MgInvalidPropertyTypeForCommand", NULL);
		}

		ShowGroups(map, ((MgStringProperty*)((MgProperty*)val))->GetValue(), false);
	}

	//Refresh layers - applies only to DwfController
}//end of c_RestFetchImage::ApplyMapViewCommands