Exemple #1
0
void CScriptDlg::InitPythonForObjects()
{
	if(pApp == NULL)
		return;


	POSITION pos = pApp->object_types.GetStartPosition();
	CObjType* oT;
	long nKey = 0;
	int objectnumber = 0;
	while (pos != NULL) 
	{	
		pApp->object_types.GetNextAssoc(pos, nKey, oT);
		if(oT && !oT->m_bIsGroupType)
		{
			CString name = oT->GetName();
			name.Replace("&", "");
			PyInfoClass* pClass = &m_Intell.classes[name];
			InitPythonForObject(oT, pClass);

			PyInfoMapItem& item = m_IntellMap[name];
			item[&m_Intell] = PY_CLASS;
		}
	}

	// System
	oT = &pApp->m_System;
	PyInfoClass* pClass = &m_Intell.classes[oT->GetName()];
	InitPythonForObject(oT, pClass);

	PyInfoMapItem& item = m_IntellMap[oT->GetName()];
	item[&m_Intell] = PY_CLASS;
}
Exemple #2
0
void CEventWizardDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting

	g_PaintManager->PaintDockerBkgnd( true, dc, this );

	CRect rect;
	GetClientRect(&rect);

	dc.FillSolidRect(0, 0, rect.Width(), 46, RGB(255, 255, 255));
	dc.FillSolidRect(0, 46, rect.Width(), 1, RGB(0, 0, 0));

	dc.FillSolidRect(0, rect.bottom - 40, rect.Width(), 1, RGB(158, 158, 158));
	dc.FillSolidRect(0, rect.bottom - 39, rect.Width(), 1, RGB(255, 255, 255));

	CFont* pOldFont = NULL;

	if (m_iStep == 1)
	{
		pOldFont = dc.SelectObject(&m_FontBold);
		dc.DrawText("Select an object.", CRect(7, 7, 200, 21), 0);
	}

	if (m_iStep == 2)
	{
		pOldFont = dc.SelectObject(&m_FontBold);

		CObjType* pType = application->FindObjTypeFromNumber(m_pSelectedObject);

		CString text;
		if (m_aceType == CONDITION)
			text.Format("Conditions for '%s'", pType->GetName());
		if (m_aceType == ACTION)
			text.Format("Actions for '%s'", pType->GetName());
		if (m_aceType == EXPRESSION)
			text.Format("Expressions for '%s'", pType->GetName());

		dc.DrawText(text, CRect(7, 7, 200, 21), 0);
	}

	if (m_iStep == 3)
	{
		pOldFont = dc.SelectObject(&m_FontBold);

		CObjType* pType = application->FindObjTypeFromNumber(m_pSelectedObject);
		CString text;
		text.Format("Parameters for '%s - %s'", pType->GetName(), pAce->aceListName);

		dc.DrawText(text, CRect(7, 7, 400, 21), 0);
	}

	if (pOldFont) dc.SelectObject(pOldFont);
}
bool CTypeChecker::PrivateVariableExists(CString objName, CString expName, int paramNum, int numParams, CString varName)
{
	CString actualvarName = varName;
	objName.MakeLower();
	expName.MakeLower();
	varName.MakeLower();

	if (objName == "<system>")
		if(exists_element(pApp->global_variables.begin(), pApp->global_variables.end(), varName))
			return true;
		else
		{
			// Variable is undefined, add it to our list of undefined variables
			push_back_unique(m_UndefinedVariables, CUndefinedVariable(true, 0, varName));
			return true;
		}

	CObjType* oT;

	POSITION pos = objMap->GetStartPosition();
	long mapKey;

	// Loop through and add the objects
	while (pos != NULL) 
	{
		objMap->GetNextAssoc(pos, mapKey, oT);

		CString Name = oT->GetName();
		Name.MakeLower();

		if (Name == objName)
		{
			if(exists_element(oT->m_PrivateValues.begin(), oT->m_PrivateValues.end(), varName))
				return true;
			else
			{
				// Variable undefined, add it to our list of undefined variables
				push_back_unique(m_UndefinedVariables, CUndefinedVariable(false, oT, actualvarName));
				return true;
			}
		}
	}

	// Check families
	list<Family>::iterator f = pApp->families.begin();

	for ( ; f != pApp->families.end(); f++) {
		if(f->is_in_use)
		{
			CString familyName = f->name;
			familyName.MakeLower();

			f->UpdateFamilyData();

			if (objName == familyName) {

				return f->VariableNameExists(varName);

			}
		}
	}

	return false;
}
void CEditorAction::Render(CRect &Pos, CDC& dc,bool EventSelected, CChronoEventEditor& Ed, int renderType, bool bEnabled)
{
	COLORREF ActionBG	=m_select(&Ed)? ACTION_BG_SEL : (EventSelected? ACTION_BG_EVSEL : ACTION_BG);
	// Animating
	if(m_Anim.m_bDestroyed)
	{
		if(renderType == 3)
		{
			Pos.OffsetRect(0,m_Anim.Space);
		}
		if(renderType == 1)
		{
			Pos.OffsetRect(-30 + m_Anim.Space, 0);
		}
		//dc.FillSolidRect(Calc,BG);
		return;
	}

	

	switch(renderType)
	{
/*		case 0:
		{
			if(m_select(&Ed))
			{
				dc.FillSolidRect(Pos,ActionBG);
				dc.Draw3dRect(Pos,ACTION_BG_SEL2,ACTION_BG_SEL2);
			}

			HBITMAP load = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_DOT));
			HDC hdcScreenCompat = CreateCompatibleDC(dc.m_hDC);
			HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcScreenCompat, load);
			BitBlt(dc.m_hDC, Pos.left + 1, Pos.top + 1, 16, 16, hdcScreenCompat, 0, 0, SRCCOPY);
			SelectObject(hdcScreenCompat, hbmpOld);
			DeleteDC(hdcScreenCompat);
			DeleteObject(load);
		}
		break;*/

		case 1:
		{
			if(m_select(&Ed))
			{
				Pos.InflateRect(3,3);
				dc.FillSolidRect(Pos,ActionBG);
				dc.Draw3dRect(Pos,ACTION_BG_SEL2,ACTION_BG_SEL2);
				Pos.DeflateRect(3,3);
			}
			int icon = 0;
			if(m_Family)
				((EventSheetEditor*)(&Ed))->m_familyhbitmaps.Lookup(oid, icon);
			else
				((EventSheetEditor*)(&Ed))->m_objecthbitmaps.Lookup(oid, icon);

			static HDC dcMem = CreateCompatibleDC(dc.m_hDC);
						HBITMAP old = (HBITMAP)SelectObject(dcMem, Ed.GetIcon(icon));
						BitBlt(dc.m_hDC,Pos.left, Pos.top
							,16
							,16,dcMem,0,0,SRCCOPY);
			SelectObject(dcMem, old);
			//DeleteDC(dcMem); - its static so we cant delete it

			m_Anim.Space = 30;
		}
		break;

		case 2:
		{
			CHTMLFont f;
			f.SetBold(false);
			f.SetSize(8);
			f.SetName("Arial");
			f.SetImage(false);

			if (!bEnabled)
				f.SetStrike(true);

			CRect Calc = Pos;
			Calc.bottom  += m_rect(&Ed).Height();

			// Draw the action
			CString Out = m_Text;
			g_HTMLDraw.DrawText(&dc, Out, f, Calc, 0, &Ed, &m_imgs,&params);
			m_Readable = Out;

			Pos.bottom = Pos.top + Calc.Height();
			Calc = Pos;
			dc.FillSolidRect(Pos,ActionBG);

			// We may be hovering over something.
			CPoint mouse;
			GetCursorPos(&mouse);
			Ed.ScreenToClient(&mouse);

			if(Pos.PtInRect(mouse) && m_select(&Ed))
			{
				for(int p = 0; p < params.size(); p++)
					for(int d = 0; d < params[p]->displayrects.size(); d++)
						if(params[p]->displayrects[d].PtInRect(mouse))
						{
							for(int a = 0; a < params[p]->displayrects.size(); a++)
								dc.FillSolidRect(params[p]->displayrects[a], RGB(100,255,100));
							continue;
						}
			}

			// End hover
			Out = m_Text;
			g_HTMLDraw.DrawText(&dc, Out, f, Calc, 0, &Ed, &m_imgs,&params);
			m_Readable = Out;

			if(m_select(&Ed))
				dc.Draw3dRect(Calc,ACTION_BG_SEL2,ACTION_BG_SEL2);
		}
		break;

		case 3:
		{
			CHTMLFont f;
			f.SetBold(false);
			f.SetSize(8);
			f.SetName("Arial");
			f.SetImage(false);

			if (!bEnabled)
				f.SetStrike(true);

			CRect Calc = Pos;
			Calc.bottom  += m_rect(&Ed).Height();

			CString newtext;			
			CObjType* objectType =	((EventSheetEditor*)&Ed)->application->FindObjTypeFromNumber(oid);

			int icon = 0;

			if(m_Family)
				((EventSheetEditor*)(&Ed))->m_familyhbitmaps.Lookup(oid, icon);
			else
				((EventSheetEditor*)(&Ed))->m_objecthbitmaps.Lookup(oid, icon);

			bool show_name = true;
			bool show_icon = true;
			bool show_quotes = true;

			if (m_Text.Find("#noname") != -1) show_name = false;
			if (m_Text.Find("#noicon") != -1) show_icon = false;
			if (m_Text.Find("#noquotes") != -1) show_quotes = false;

			CString display_text = m_Text;

			display_text.Replace("#noname", "");
			display_text.Replace("#noicon", "");
			display_text.Replace("#noquotes", "");

			if (!show_quotes) display_text.Replace("\"", "");

			if (show_name && show_icon)
				newtext.Format("<img>%d</img> %s: %s",  icon, objectType->GetName(), display_text);
			else if (show_name && !show_icon)
				newtext.Format("%s: %s", objectType->GetName(), display_text);
			else if (!show_name && show_icon)
				newtext.Format("<img>%d</img> %s", icon, display_text);
			else
				newtext.Format("%s", display_text);

			CString Out = newtext;
			g_HTMLDraw.DrawText(&dc, Out, f, Calc, 0, &Ed, &m_imgs,&params);

			dc.FillSolidRect(Calc,ActionBG);

			//We may be hovering over something.
			CPoint mouse;
			GetCursorPos(&mouse);
			Ed.ScreenToClient(&mouse);

			if(Calc.PtInRect(mouse) && m_select(&Ed))
			{
				for(int p = 0; p < params.size(); p++)
					for(int d = 0; d < params[p]->displayrects.size(); d++)
						if(params[p]->displayrects[d].PtInRect(mouse))
						{
							for(int a = 0; a < params[p]->displayrects.size(); a++)
								dc.FillSolidRect(params[p]->displayrects[a], RGB(100,255,100));
							continue;
						}
			}


			// End hover
			Calc = Pos;
			Calc.bottom  += m_rect(&Ed).Height();

			// Get readable text
			g_HTMLDraw.DrawText(&dc, newtext, f, Calc, 0, &Ed, &m_imgs,&params);
			m_Readable = newtext.Right(newtext.GetLength() - newtext.ReverseFind(':'));

			Pos.bottom = Pos.top + Calc.Height();
		
			if(m_select(&Ed))
				dc.Draw3dRect(Calc,ACTION_BG_SEL2,ACTION_BG_SEL2);

			m_Anim.Space = Calc.Height();
		}

		break;
	}

	m_visible = true;

	m_rect(&Ed) = Pos;
	if(renderType == 1)
	{
		Pos.InflateRect(3,3);
		m_rect(&Ed) = Pos;
		Pos.DeflateRect(3,3);
	}

	

}
Exemple #5
0
CString CEditorParam::CreateFormattedParamString(EventSheetEditor* pEd, CEditorAction* pAction, CEditorCondition* pCondition)
{
	CApplication* pApp = pEd->application;
	CObjTypeMap& typemap = pApp->object_types;

	valid = true;
	CString ret;

	for( int a = 0; a < ttokens.size(); a++)
	{
		Token& tokenitem = ttokens[a];
	
		if(tokenitem.t == T_IDENTIFIER && tokenitem.tsub == TT_OBJECTNAME)	// object param
		{
			long number = tokenitem.oidOwner;

			CObjType* pType = pEd->application->FindObjTypeFromNumber(number);
			if(pType)
			{
				int specialvalue = 0;
				if(pAction)
				{
					pAction->m_imgs.push_back(CEditorImage());
					CEditorImage* image = &pAction->m_imgs.back();
					image->tok = &tokenitem;
					specialvalue = pAction->m_imgs.size()-1;
				}
				if(pCondition)
				{
					pCondition->m_imgs.push_back(CEditorImage());
					CEditorImage* image = &pCondition->m_imgs.back();
					image->tok = &tokenitem;
					
					specialvalue = pCondition->m_imgs.size()-1;
				}		
				ret += pType->GetName();
				ret += " <special_image>";
				ret.AppendFormat("%d", specialvalue);
				ret += "</special_image> ";
				
				
			}
			else
				valid = false;
			//else - we need some sort of tempory name if we cant find one or the user could lose information!
		
		}
		else {
			CString string = tokenitem.str;

			string.Replace("&", "&amp;");
			string.Replace("<", "&lt;");
			string.Replace(">", "&gt;");

			if (tokenitem.t == T_STRINGLITERAL)
				string = CString("\"") + string + "\"";
			if (tokenitem.t == T_VARIABLENAME)
			{
				string = CString("'");
				if(tokenitem.oidOwner == -1)
				{
					CApplication::GlobalVariable* global = pApp->GetGlobalVariable(tokenitem.id);
					if(global)
						string += global->name;
					else
						valid = false;
				}
				else if(CObjType* pType = pApp->FindObjTypeFromNumber(tokenitem.oidOwner))
				{
					PrivateValue* Private = pType->GetPrivateVariable(tokenitem.id);
					if(Private)
						string += Private->name;
					else {

						// Not found; look up by name instead (valid expressions sometimes get here for families - AG)
						vector<PrivateValue>::iterator i = pType->m_PrivateValues.begin();
						bool found = false;
						CString l = tokenitem.str;
						l.MakeLower();

						for ( ; i != pType->m_PrivateValues.end(); i++) {
							CString r = i->name;
							r.MakeLower();

							if (l == r) {
								found = true;
								string += i->name;
								break;
							}
						}

						if (!found)
							valid = false;
					}
				}
				else
					valid = false; //added to prevent family bug where deleting a family wont remove params refering to it
					
				string += "'";
			}

			ret += string;
		}

		/*
		if(tokenitem.type == PTOK_COLOR) // for later when we have color tokens 
		{
			int specialvalue = 0;
			if(pAction)
			{
				pAction->m_imgs.push_back(CEditorImage());
				CEditorImage* image = &pAction->m_imgs.back();
				image->tok = &tokenitem;
				specialvalue = pAction->m_imgs.size()-1;
			}
			if(pCondition)
			{
				pCondition->m_imgs.push_back(CEditorImage());
				CEditorImage* image = &pCondition->m_imgs.back();
				image->tok = &tokenitem;
					
				specialvalue = pCondition->m_imgs.size()-1;
			}				


			ret += "<special_image>";
			ret.AppendFormat("%d", specialvalue);
			ret += "</special_image> ";
		}
		*/
	}

	// Okay we have now recreated our token and everything...lets check what type of parameter it is!

	// Final step: 
	if(m_type == 9 || m_type == 15)
	{
		CString formatted;
		formatted.Format("<b>%s</b>", m_reserved);
		return formatted;
	}

	// Private variable
	if(m_type == 14)
	{
		int varid = atoi(ret);
		CObjType* pType = pApp->FindObjTypeFromNumber(this->oid);

		if(pType)
		{
			for(vector<PrivateValue>::iterator v = pType->m_PrivateValues.begin(); v!=  pType->m_PrivateValues.end(); v++)
			{
				if(v->identifier == varid)
				{
					CString formatted;
					formatted.Format("'%s'", v->name);
					return formatted;
				}
			}	
		}
	}

	// Global variable
	if (m_type == 13) {
		int varid = atoi(ret);

		for(list<CApplication::GlobalVariable>::iterator v = pApp->global_variables.begin(); v !=  pApp->global_variables.end(); v++)
		{
			if(v->identifier == varid)
			{
				CString formatted;
				formatted.Format("'%s'", v->name);
				return formatted;
			}
		}	
	}
		
	if(m_type == 6) // object..translate the parameter to a new number
	{
		int id = atoi(ret);
		CString newstring;
		newstring.Format("%d", id);
		if(ret == newstring)	// will fail if its an attribute	
		{
/*
			int iconid;
			if(!pEd->m_familyhbitmaps.Lookup(id, iconid))
				pEd->m_objecthbitmaps.Lookup(id, iconid);


			ret.Format("<img>%d</img>", iconid);
				
*/
			long number = atol(ret);

			CObjType* pType;
	

			if(pType = pApp->FindObjTypeFromNumber(number))
			{
				int specialvalue = 0;
				if(ttokens[0].t == T_INTEGER)
				{
				//	ttokens[0].tsub = TT_OBJECTNAME;
				//	ttokens[0].t = T_IDENTIFIER;
					ttokens[0].oidOwner = number;
					ttokens[0].id = number;
					//ttokens[0].trans = false;
				}
				
				if(pAction)
				{
					pAction->m_imgs.push_back(CEditorImage());
					CEditorImage* image = &pAction->m_imgs.back();
					image->tok = &ttokens[0];
					specialvalue = pAction->m_imgs.size()-1;
				}
				if(pCondition)
				{
					pCondition->m_imgs.push_back(CEditorImage());
					CEditorImage* image = &pCondition->m_imgs.back();
					image->tok = &ttokens[0];
					
					specialvalue = pCondition->m_imgs.size()-1;
				}				

				ret = "<b>";
				ret += pType->GetName();
				ret += "</b>";
				ret += " <special_image>";
				ret.AppendFormat("%d", specialvalue);
				ret += "</special_image> ";

				return ret;
				
			}
			else
				valid = false;


		}
		else
		{
			// attribute..


		}
		return ret;

	

	}
	if(m_type == 3) // colors
	{
		int id = atoi(ret);
		CString newstring;
		newstring.Format("%d", id);
		ttokens[0].t = T_COLOR;
		if(ret == newstring)	// will fail if its an attribute	
		{
			int specialvalue = 0;
			if(pAction)
			{
				pAction->m_imgs.push_back(CEditorImage());
				CEditorImage* image = &pAction->m_imgs.back();
				image->tok = &ttokens[0];
				image->tok->id = atoi(image->tok->str);
				specialvalue = pAction->m_imgs.size()-1;
			}
			if(pCondition)
			{
				pCondition->m_imgs.push_back(CEditorImage());
				CEditorImage* image = &pCondition->m_imgs.back();
				image->tok = &ttokens[0];
				image->tok->id = atoi(image->tok->str);					
				specialvalue = pCondition->m_imgs.size()-1;
			}				


			ret = "<special_image>";
			ret.AppendFormat("%d", specialvalue);
			ret += "</special_image> ";

			return ret;
		}


	}
	// otherwise just return ret ;p
	CString format;
	format.Format("<i>%s</i>", ret);

	return format;
}
Exemple #6
0
CString CEditorParam::CreateParamString(CApplication* pApp)
{
	CObjTypeMap& typemap = pApp->object_types;

	CString ret;

	valid = true;

	vector<Token>::iterator i = ttokens.begin();
	vector<Token>::iterator ttokens_end = ttokens.end();

	ttokens_end = ttokens.end();

	for ( ; i != ttokens_end; i++) {
		switch (i->t) {
		case T_IDENTIFIER:

			switch (i->tsub) {
			case TT_OBJECTNAME:
				{
				if(CObjType* pType = pApp->FindObjTypeFromNumber(i->oidOwner))
					ret += pType->GetName();
				else
					valid = false;

				break;
				}
			case TT_FAMILYNAME:
				ret += i->str;
				break;
			case TT_MOVEMENTNAME:
				{
				CObjType* pType;
				CBehavior* pMov;

				if(pType = pApp->FindObjTypeFromNumber(i->oidOwner))
					ret += pType->GetName();
				else
				{
					valid = false;
					break;
				}

				ret += "[";

				if (pMov = pType->GetBehaviorByUniqueID(i->id))
					ret += pMov->Text + "]";
				else
					valid = false;

				break;
				}				
			case TT_NORMAL:
				ret += i->str;
				break;
			}
			break;
		case T_VARIABLENAME:
			ret += "'";
			if(i->oidOwner == -1)
			{
				CApplication::GlobalVariable* pGlobal = pApp->GetGlobalVariable(i->id);
				if(pGlobal)
					ret += pGlobal->name;	

				else
					valid = false;
			}
			else if(CObjType* pType = pApp->FindObjTypeFromNumber(i->oidOwner))
			{
				PrivateValue* pValue = pType->GetPrivateVariable(i->id);
				if(pValue)
					ret += pValue->name;
				else
					valid = false;
			}
			ret += "'";
			break;
		case T_STRINGLITERAL:
			ret += "\"";
			ret += i->str;
			ret += "\"";
			break;
		default:
			ret += i->str;
			break;
		}
	}


	return ret;


	// Davos code

	//CString ret;
	//for( int a = 0; a < tokens.size(); a ++)
	//{
	//	CEditorParamToken tokenitem = tokens[a];
	//	if(tokenitem.trans)
	//	{
	//		if(tokenitem.type == 0)	// normal
	//			ret += tokenitem.tok;
	//		else if(tokenitem.type == 1)	// object name
	//		{
	//			
	//			long number = atol(tokenitem.tok);

	//			CObjType* pType;
	//		
	//			if(typemap.Lookup(number,pType))
	//				ret += pType->m_name;
	//			//else - we need some sort of tempory name if we cant find one or the user could lose information!
	//		}
	//			

	//			
	//		
	//		
	//		else if(tokenitem.type == 2)	// family
	//		{
	//			ret += tokenitem.tok;
	//			/*
	//			long number = atol(tokenitem.tok);
	//			//list<CFamily>::iterator i = pApp->m_Families.begin();
	//			//advance(i, number);
	//			CFamily* i = pApp->FindFamilyFromNumber(number);
	//			// TODO error checking...what if a family is removed?
	//			ret += i->m_Name;
	//			*/
	//		}
	//		else
	//			ret += tokenitem.tok;
	//	}
	//	
	//	else
	//	{
	//		ret += tokenitem.tok;
	//	}
	//}

	//// TODO: Reform objectID tokens into object name
	//return ret;
}
void ObjectBarDialog::OnDblClickObject(NMHDR *pNMHDR, LRESULT *pResult)
{
	POSITION Pos = objects.GetFirstSelectedItemPosition();
	int Item = objects.GetNextSelectedItem(Pos);

	if (Item == -1) return;

	CObjType* pType;
	long ID = objects.GetItemData(Item);

	if (ID == -1)  // object folder
	{
		if (folderfilter == -1)  //Default folder
		{
			for(int i=0; i < application->object_folders.size(); i++)
			{
				if (objects.GetItemText(Item,0) == application->object_folders[i].name)
				{
					folderfilter=i;
					break;
				}
			}
		}
		else //return folder
		{
			folderfilter = -1;
		}
		Refresh();
		return;
	}

	application->object_types.Lookup(ID, pType);

	if (!pType) return;

	// If layout editor open..
	if (parent.m_tabs.SelectionGet() == 0 && parent.m_tabs.ItemGetCount() == 2)
	{
		POSITION ObjectPos = layout->objects.GetStartPosition();
		CObj* pObject;
		long ID = 0;

		for (int i = 0; i < layout->objects.GetCount(); i++) 
		{
			layout->objects.GetNextAssoc(ObjectPos, ID, pObject);

			CObjType* type = pObject->GetObjectType(application);

			if (type->ObjectIdentifier == pType->ObjectIdentifier)
			{
				OINFO* info = GetOINFO(pType->DLLIndex);
				if(info->ETOnNotify)
					info->ETOnNotify(pObject->editObject, 1);

				return;
			}
		}
	}

	// If event sheet editor, see if it has conditions. If so, open Event Wizard
	if ((parent.m_tabs.SelectionGet() == 1) && (parent.m_tabs.ItemGetCount() == 2) || parent.m_tabs.ItemGetCount() == 1)
	{
		bool bUse = false;

		for (int i = 0; i < pType->GetTableCount(CONDITION); i++)
		{
			ACESEntry2* pAce = pType->GetACESEntry(CONDITION, i);
			if(pAce == NULL || pAce->aceListName == "")
				continue; // Ignore null entries

			bUse = true;
		}

		if (bUse)
		{
			parent.m_pEventView[0][0]->m_InitialStage = 2;
			parent.m_pEventView[0][0]->m_InitialSelect = ID;
			parent.m_pEventView[0][0]->m_OldName = pType->GetName();
			parent.m_pEventView[0][0]->AddCondition(true);
		}
	}
}
void ObjectBarDialog::Refresh(bool layer_changed)
{
	// check for unnecessary refresh
	if (layer_changed && !show_only_selected_layer)
		return;

	// clear all lists
	objects.DeleteAllItems();

	for (int i = 0; i < large_images.GetImageCount(); i++)
		large_images.Remove(0);

	for (int i = 0; i < small_images.GetImageCount(); i++)
		small_images.Remove(0);

	if(folderfilter > -1 && folderfilter >= application->object_folders.size())
		folderfilter = -1;

	CObj*			pObject;
	CObjType*		pObjectType;
	CStringArray	List; // Object list

	//object folders
	if (folderfilter == -1)
	{
		HBITMAP large_image = (HBITMAP) LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(20150), IMAGE_BITMAP, 32, 32, LR_LOADTRANSPARENT);
		HBITMAP small_image = (HBITMAP) LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(20150), IMAGE_BITMAP, 16, 16, LR_LOADTRANSPARENT);
		
		int ImageID = ImageList_Add(large_images.m_hImageList, large_image, NULL);
		ImageList_Add(small_images.m_hImageList, small_image, NULL);
		
		DeleteObject(large_image);
		DeleteObject(small_image);

		for (int i=0; i<application->object_folders.size(); ++i)
		{
			if(application->object_folders[i].name == "Default")
				continue;
			int item = objects.InsertItem(objects.GetItemCount(), application->object_folders[i].name, ImageID);
			objects.SetItemData(item, (DWORD_PTR)(const char*)"-1");
		}
	} // -1 is Default, -2 is disabled
	else if(folderfilter != -2 && application->object_folders[folderfilter].name != "Default")
	{
		HBITMAP large_image = (HBITMAP) LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(20150), IMAGE_BITMAP, 32, 32, LR_LOADTRANSPARENT);
		HBITMAP small_image = (HBITMAP) LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(20150), IMAGE_BITMAP, 16, 16, LR_LOADTRANSPARENT);
		
		int ImageID = ImageList_Add(large_images.m_hImageList, large_image, NULL);
		ImageList_Add(small_images.m_hImageList, small_image, NULL);
		
		DeleteObject(large_image);
		DeleteObject(small_image);

		int item = objects.InsertItem(0,"...\\"+application->object_folders[folderfilter].name, ImageID);
		objects.SetItemData(item, (DWORD_PTR)(const char*)"-1");
	}

	if (layout)
	{
		POSITION LayerPos = layout->layers.GetHeadPosition();

		// For each layer
		while(LayerPos)
		{
			CLayer* pLayer = layout->layers.GetNext(LayerPos);

			if (show_only_selected_layer && pLayer != layout->current_layer)
				continue;

			if (!show_nonlayout_objects && pLayer->m_layerType == LAYER_NONFRAME)
				continue;

			// Loop all objects
			CObjList Objects;
			pLayer->GetEveryObject(Objects, layout);

			POSITION ObjectPos = Objects.GetHeadPosition();

			for (int i = 0; i < Objects.GetCount(); i++) 
			{
				long ID = Objects.GetNext(ObjectPos);
				layout->objects.Lookup(ID, pObject);

				if (pObject->GetGlobalID() != -1) 
				{
					pObjectType = pObject->GetObjectType(application);
					
					// Failed/invalid object type, for some reason
					if(!pObjectType)
						continue;

					//folder filtering
					if(folderfilter ==-1 && pObjectType->GetFolder() != "Default")
						continue;
					else if(folderfilter > -1 && pObjectType->GetFolder()!=application->object_folders[folderfilter].name)
						continue;

					bool bAdd = true;

					for (int j = 0; j < List.GetSize(); j++)
						if (List.GetAt(j) == pObjectType->GetName())
							bAdd = false;

					if (bAdd)
					{
						HBITMAP large_image = pObjectType->m_Image.MakeBitmap();
						HBITMAP small_image = pObjectType->small_image.MakeBitmap();

						int ImageID = ImageList_Add(large_images.m_hImageList, large_image, NULL);
						ImageList_Add(small_images.m_hImageList, small_image, NULL);

						DeleteObject(large_image);
						DeleteObject(small_image);

						int Item = objects.InsertItem(objects.GetItemCount(), pObjectType->GetName(), ImageID);

						objects.SetItemData(Item, (LPARAM)((const char*)pObjectType->GetName()));

						List.Add(pObjectType->GetName());
					}
				} // Iterate each object
			} // Iterate each layer
		}
	}

	else
	{
		POSITION Pos = application->object_types.GetStartPosition();
		CObjType* oT;
		long nKey = 0;

		while (Pos != NULL) 
		{	
			application->object_types.GetNextAssoc(Pos, nKey, oT);
			if(oT && !oT->m_bIsGroupType)
			{
				int ImageID = ImageList_Add(large_images.m_hImageList, oT->m_Image.MakeBitmap(), NULL);
				int Item = objects.InsertItem(objects.GetItemCount(), oT->GetName(), ImageID);

				objects.SetItemData(Item, (DWORD)((LPCSTR)oT->GetName()));

				List.Add(oT->GetName());
			}
		}
	}

	objects.ShowScrollBar(SB_VERT); 

	// Work out if there's a vertical scrollbar. If there is, we'll resize a bit.
	int iListCount = objects.GetItemCount();
	int iListSize = objects.GetCountPerPage();

	if(iListCount < iListSize)
	{
		// Disable the arrows on the vertical scrollbar
		objects.EnableScrollBar(SB_VERT, ESB_DISABLE_BOTH);
		objects.SetScrollRange(SB_VERT, 0, 2);
	}

	else
	{
		// Enable the vertical scrollbar
		objects.EnableScrollBar(SB_VERT, ESB_ENABLE_BOTH);
	}

	if (sorting == ob_sort_az)
		objects.SortItems(ObjectCompare, (LPARAM)&objects);
	if (sorting == ob_sort_za)
		objects.SortItems(ObjectCompareZA, (LPARAM)&objects);

	// now replace the ids
	for (int i = 0; i < objects.GetItemCount(); i++)
	{
		if((const char*)objects.GetItemData(i) == "-1")
		{
			objects.SetItemData(i, -1);
			continue;
		}
		CObjType* type = GetTypeFromName(application, objects.GetItemText(i, 0));
		objects.SetItemData(i, type->ObjectIdentifier);
	}
}
Exemple #9
0
void CParamScintilla::OnChar(NMHDR* pNMHDR, LRESULT* pResult,CScintillaWnd& scintWin, CObjTypeMap* objectMap,
		CParamTooltipCtrl& m_Tooltip,
		bool& m_ParameterTooltipIsVisible,
		bool& m_QuotesOpen,
		CApplication* pApp,
		bool bInline)
{
	// This function is only for CScintilla...
	SCNotification *scn = (SCNotification*)pNMHDR;

	CString text;
	scintWin.GetWindowText(text);

	CString theChar = "a";
	theChar.SetAt(0, scn->ch);

	::SendMessage(scintWin.m_hWnd, SCI_AUTOCSETSEPARATOR, '|', '|');

	int carretPosition = scintWin.GetCurrentPosition();
	text = text.Left(carretPosition); // everything to the right is irrelavant

	// Get last char
	if (scn->ch=='.')
	{
		// Get name of object
		// First we need to get the current char.

		text = text.Left(scintWin.GetCurrentPosition());

		int pos = 0;
		char finds[] = " ()+-/*{},";
		for(int a = 0; a < strlen(finds); a++)
			pos = max(pos, text.ReverseFind(finds[a]));
		
		CString name = text.Right(text.GetLength() - pos);
		name = name.Left(name.GetLength() - 1);
		if(pos!=0)
			name = name.Right(name.GetLength()-1);
		
		bool exists = true;
		{		
			pApp->m_sort.RemoveAll();
			CString intel;

			if (name != "System")
			{
				// Display intellisense
				// Loop m_TypeCheckerressions
				CObjType* oT;

		
				//POSITION pos = objectMap->GetStartPosition();
				//long nKey;

				//while (pos != NULL) 
				vector<CObjType*> objects;
				pApp->GetObjectTypes(objects);
				pApp->GetFamilyObjectTypes(objects);
				vector<CObjType*>::iterator i = objects.begin();
				for(; i != objects.end(); i++)
				{
					oT = *i;
					//objectMap->GetNextAssoc(pos, nKey, oT);

					CString l = oT->GetName();
					CString r = name;
					l.MakeLower();
					r.MakeLower();
	
					if (l == r)
					{	
						// Enum m_TypeCheckerressions
						for (int i = 0; i < oT->GetTableCount(2); i++)
						{
							ACESEntry2* acesEntry = oT->GetACESEntry(2, i);
							if(acesEntry->aceDisplayText != "")
								pApp->m_sort.Add(acesEntry->aceDisplayText);
						}

						break;
					}
				}	
			}

			else // System
			{
				for (int i = 0; i < GetSystemTableCount(2); i++)
				{
					ACESEntry2* ACE;
					GetSystemExpression(i, ACE);
					pApp->m_sort.Add(ACE->aceDisplayText);
				}
			}
							
			pApp->m_sort.Sort();

			for (int i = 0; i < pApp->m_sort.GetSize(); i++)
			{
				intel += pApp->m_sort.GetAt(i);				
				intel += "|";
			}
			
			intel = intel.Left(intel.GetLength() - 1);
			
			if (intel != "")
				::SendMessage(scintWin.m_hWnd, SCI_AUTOCSHOW, 0, (long)(const char*)intel);
		}
	}

	// Add: Check for inline editing, don't handle this if we are. 0.96.2
	else if (scn->ch == '(' && !bInline)
	{
		if (m_ParameterTooltipIsVisible)
		{
			m_Tooltip.ShowWindow(SW_HIDE);
			m_ParameterTooltipIsVisible = false;
		}

		CString m_TypeCheckerressionName, ObjectName;

		// Get name of m_TypeCheckerression
		int pos = text.ReverseFind('.');

		CString name = text.Right(text.GetLength() - pos - 1);
		int start = (text.GetLength() - pos) - 1;
		m_TypeCheckerressionName = name.Left(name.GetLength() - 1);

		// Get name of object
		CString object = text.Left(text.GetLength() - start);
		pos = object.ReverseFind(' ');

		name = object.Right(object.GetLength() - pos);
		ObjectName = name.Left(name.GetLength() - 1);
		ObjectName.Trim();

		bool exists = true;
		bool alsoexists = false;

		if (ObjectName == "")
			ObjectName = "System";

		if (exists)
		{
			vector<CString> setParams;
			m_Tooltip.FlushMethods();

			if (ObjectName != "System")
			{
				CObjType* oT;
		
				POSITION pos = objectMap->GetStartPosition();
				long nKey;

				while (pos != NULL) 
				{
					objectMap->GetNextAssoc(pos, nKey, oT);

					CString l = oT->GetName();
					CString r = ObjectName;
					l.MakeLower();
					r.MakeLower();
	
					if (l == r)
					{	
						// Enum m_TypeCheckerressions
						for (int i = 0; i < oT->GetTableCount(2); i++)
						{
							ACESEntry2* acesEntry = oT->GetACESEntry(2, i);
							if (acesEntry->aceDisplayText == m_TypeCheckerressionName)
							{
								alsoexists = true;

								for (int x = 0; x < acesEntry->params.size();x++)
								{
									CString addParameter;

									// Check type
									if (acesEntry->params[x].type == 1)
										addParameter.Format("%s [number]", acesEntry->params[x].name);

									if (acesEntry->params[x].type == 2)
										addParameter.Format("%s [string]", acesEntry->params[x].name);

									setParams.push_back(addParameter);
								}
							}	
						}

						break;
					}
				}	
			}

			/*else
			{
				int numTableEntries = sizeof(SysExpIntellisenseTable) / sizeof(SysExpIntellisenseTable[0]);
				setParams.resize(0);

				for (int i = 0; i < numTableEntries; i++) {

					CString l = m_TypeCheckerressionName;
					CString r = SysExpIntellisenseTable[i].expname;

					l.MakeLower();
					r.MakeLower();

					if (l == r) {
						alsoexists = true;
						
						CString curParam;
						int paramNum = 0;

						do {
							AfxExtractSubString(curParam, SysExpIntellisenseTable[i].params, paramNum, ',');
							curParam.Trim();
							if (curParam != "")
								setParams.push_back(curParam);
							paramNum++;
						} while (curParam != "");

						m_Tooltip.AddMethod(m_TypeCheckerressionName, setParams);
						setParams.resize(0);
					}
				}
			}*/

			if (alsoexists && !m_ParameterTooltipIsVisible)
			{
				// Get position of caret
				int currentPosition = scintWin.SendMessage(SCI_GETCURRENTPOS, 0, 0);

				int caretX = scintWin.SendMessage(SCI_POINTXFROMPOSITION, 0, 0);
				int caretY = scintWin.SendMessage(SCI_POINTXFROMPOSITION, 0, 0);

				if (ObjectName != "System")
				{
					CString sMethod;
					m_Tooltip.AddMethod(m_TypeCheckerressionName, setParams);
				}

				m_Tooltip.SetCurMethod(0);
				m_Tooltip.SetCurParam(0);
				m_Tooltip.ShowTooltip(CPoint(caretX, caretY));

				m_ParameterTooltipIsVisible = true;
				m_QuotesOpen = false;
			}
		}
	}

	// Increment parameter count
	else if (scn->ch == ',' && !bInline)
	{
		//scintWin.SendMessage(SCI_AUTOCCOMPLETE, 0, 0);
		if (m_ParameterTooltipIsVisible && !m_QuotesOpen)
			m_Tooltip.ShowNextParam();
	}

	// Hide parameter tooltip
	else if (scn->ch == ')' && !bInline)
	{
		//scintWin.SendMessage(SCI_AUTOCCOMPLETE, 0, 0);
		if (m_ParameterTooltipIsVisible)
		{
			m_Tooltip.ShowWindow(SW_HIDE);
			m_ParameterTooltipIsVisible = false;
		}
	}
	// Hide parameter tooltip
	else if (scn->ch == '"')
	{
		if (m_QuotesOpen)
			m_QuotesOpen = false;
		else
			m_QuotesOpen = true;
	}

	// Prompt variable names
	else if (scn->ch == '\'')
	{
		// Trim the right two (' chars eg. Sprite('
		text = text.Left(text.GetLength() - 2);

		CString temp = text;
		temp.MakeReverse();
		int index = temp.FindOneOf(" {}()+-*/");

		if (index > -1)
			text = text.Right(index);

		// Now find if there's a dot to get the object name
		index = text.Find('.');

		if (index > -1)
			text = text.Left(index);

		CObjType* pType = GetTypeFromName(pApp, text);

		if (pType != NULL) {

			CString varnames;

			vector<PrivateValue>::iterator i = pType->m_PrivateValues.begin();
			vector<PrivateValue>::iterator end = pType->m_PrivateValues.end();

			for ( ; i != end; i++)
				varnames += i->name + "|";

			varnames = varnames.Left(varnames.GetLength() - 1);

			if (varnames != "")
				::SendMessage(scintWin.m_hWnd, SCI_AUTOCSHOW, 0, (long)(const char*)varnames);
		}
		else{
			if(text == "global")
			{

			CString varnames;

			list<CApplication::GlobalVariable>::iterator i = pApp->global_variables.begin();
			list<CApplication::GlobalVariable>::iterator end = pApp->global_variables.end();

			for ( ; i != end; i++)
				varnames += i->name + "|";

			varnames = varnames.Left(varnames.GetLength() - 1);

			if (varnames != "")
				::SendMessage(scintWin.m_hWnd, SCI_AUTOCSHOW, 0, (long)(const char*)varnames);

			}

		}
	}
	/*else
	{
		
		if(text.GetLength() == 2)
		{
		// Any other type of letter, display intellisense for system expressions and object names
		CString suggestions;

		int numTableEntries = sizeof(SysExpIntellisenseTable) / sizeof(SysExpIntellisenseTable[0]);
		for (int i = 0; i < numTableEntries; i++) {
			CString expression = SysExpIntellisenseTable[i].expname;
			suggestions += expression + "|";
		}
		suggestions = suggestions.Left(suggestions.GetLength() - 1);
		if (suggestions != "")
			::SendMessage(scintWin.m_hWnd, SCI_AUTOCSHOW, 0, (long)(const char*)suggestions);
		}


	}*/
}
// OnRClick(NMHDR* pNMHDR, LRESULT* pResult) 
// Handle right clicking an object and inserting an expression.
void CParametersDlg::OnDblClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POSITION listpos = m_Expand.GetFirstSelectedItemPosition();
	int item = m_Expand.GetNextSelectedItem(listpos);

	//if(item == -1) return;

	CObjType* pObjType = (CObjType*)m_Expand.GetItemData(item);

	CEventWizardDlg EventWizard;
	EventWizard.m_aceType = EXPRESSION;
	EventWizard.layout = layout;
	EventWizard.application = application;

	if(pObjType){
		EventWizard.m_pSelectedObject = pObjType->ObjectIdentifier;
		EventWizard.m_iStep = 2;
	}
	else
		EventWizard.m_iStep = 1;
	
	EventWizard.SetMap(&application->object_types);

	if(EventWizard.DoModal() != IDOK)
		return;

	// The user can click Back and get a different object's expression, so make sure we're using the current one.
	pObjType = application->FindObjTypeFromNumber(EventWizard.m_pSelectedObject);

	int aceIndex = EventWizard.m_aceIndex;
	int mID = EventWizard.m_childid;

	CObjType tmp;
	CObjType *pInfoType = NULL;
	if(mID == -1)
		pInfoType = pObjType;

	CBehavior* pMov = NULL;
	CEffect* pEffect = NULL; // there are no effect expressions but perhaps in the future...
	if(mID < -1)
	{
		pInfoType = &tmp;
		pEffect = pObjType->GetEffect(-mID);
		tmp.CreateFromEffect(pEffect);
	}
	if(mID > -1)
	{
		pInfoType = &tmp;
		pMov = pObjType->GetBehaviorByUniqueID(mID);
		tmp.CreateFromBehavior(pMov);
	}

	if(!pInfoType)
		return;
	ACESEntry2* pACE = pInfoType->GetACESEntry(EXPRESSION, aceIndex);

	if (pWndFocusParam == NULL) 
		return;

	CString Func;
	if(pObjType->ObjectIdentifier == -1)
	{
		Func.Format("%s",  pACE->aceDisplayText);

		if (pACE->auxStr != "") 
		{
			Func += "(";
			Func += pACE->auxStr;
			Func += ")";
		}
	}
	else 
	{
		if(pMov)
		{
			Func.Format("%s[%s].%s", pObjType->GetName(), pMov->Text, pACE->aceDisplayText);

			if (pACE->params.size() != 0)
			{
				Func += "(";

				for (int i = 0; i < pACE->params.size(); i++)
				{
					Func += pACE->params[i].name;

					if (i != (pACE->params.size() - 1))
						Func += ", ";
				}

				Func += ")";
			}
		}

		else
		{
			// Starts with <:  interpret as shortcut for other expression eg. <MouseX>
			if (pACE->aceDisplayText.Left(1) == "<") {
				Func = pACE->aceDisplayText.Mid(1, pACE->aceDisplayText.GetLength() - 2);
			}
			else {
				Func = pObjType->GetName();

				// Allow expressions to specify object name like 'Counter'
				if (pACE->aceDisplayText != "") {
					// Allow expressions to specify an ACE name like "(x,y,z)" eg. Array(x,y,z)
					if (pACE->aceDisplayText.Left(1) != "(")
						Func += ".";

					Func += pACE->aceDisplayText;
				}

				if (pACE->params.size() != 0)
				{
					Func += "(";
					// okay loop params, add name and ,
					for (int i = 0; i < pACE->params.size(); i++)
					{
						Func += pACE->params[i].name;
						//only add if liek not last 0ne
						if (i != (pACE->params.size() - 1))
							Func += ", ";
					}
					Func += ")";
				}
			}
		}
	}

	pWndFocusParam->SendMessage(SCI_REPLACESEL, 0, (LPARAM)(const char*)Func);

	*pResult = 0;
}