public bool Parse(idScriptParser parser, bool rebuild)
{
if(this.Disposed == true)
{
throw new ObjectDisposedException(this.GetType().Name);
}
if(rebuild == true)
{
CleanUp();
}
_timeLineEvents.Clear();
_namedEvents.Clear();
_transitions.Clear();
idToken token2;
idToken token = parser.ExpectTokenType(TokenType.Name, 0);
DrawWindow drawWindow;
SetInitialState(token.ToString());
parser.ExpectTokenString("{");
token = parser.ExpectAnyToken();
bool ret = true;
while(token.ToString() != "}")
{
string tokenLower = token.ToString().ToLower();
// track what was parsed so we can maintain it for the guieditor
parser.SetMarker();
if((tokenLower == "windowdef") || (tokenLower == "animationdef"))
{
if(tokenLower == "animationdef")
{
_visible.Set(false);
_rect.Set(new idRectangle(0, 0, 0, 0));
}
token = parser.ExpectTokenType(TokenType.Name, 0);
token2 = token;
parser.UnreadToken(token);
drawWindow = FindChildByName(token2.ToString());
if((drawWindow != null) && (drawWindow.Window != null))
{
SaveExpressionParseState();
drawWindow.Window.Parse(parser, rebuild);
RestoreExpressionParseState();
}
else
{
idWindow window = new idWindow(_gui, _context);
SaveExpressionParseState();
window.Parse(parser, rebuild);
RestoreExpressionParseState();
window.Parent = this;
drawWindow = new DrawWindow();
if(window.IsSimple == true)
{
drawWindow.Simple = new idSimpleWindow(window);
_drawWindows.Add(drawWindow);
}
else
{
AddChild(window);
SetFocus(window, false);
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
}
}
else if(tokenLower == "editdef")
{
SaveExpressionParseState();
idEditWindow window = new idEditWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "choicedef")
{
SaveExpressionParseState();
idChoiceWindow window = new idChoiceWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "sliderdef")
{
SaveExpressionParseState();
idSliderWindow window = new idSliderWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "markerdef")
{
idConsole.Warning("TODO: markerDef");
/*idMarkerWindow *win = new idMarkerWindow(dc, gui);
SaveExpressionParseState();
win->Parse(src, rebuild);
RestoreExpressionParseState();
AddChild(win);
win->SetParent(this);
dwt.simp = NULL;
dwt.win = win;
drawWindows.Append(dwt);*/
}
else if(tokenLower == "binddef")
{
SaveExpressionParseState();
idBindWindow window = new idBindWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "listdef")
{
SaveExpressionParseState();
idListWindow window = new idListWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "fielddef")
{
idConsole.Warning("TODO: fieldDef");
/*idFieldWindow *win = new idFieldWindow(dc, gui);
SaveExpressionParseState();
win->Parse(src, rebuild);
RestoreExpressionParseState();
AddChild(win);
win->SetParent(this);
dwt.simp = NULL;
dwt.win = win;
drawWindows.Append(dwt);*/
}
else if(tokenLower == "renderdef")
{
SaveExpressionParseState();
idRenderWindow window = new idRenderWindow(_context, _gui);
window.Parse(parser, rebuild);
RestoreExpressionParseState();
AddChild(window);
window.Parent = this;
drawWindow = new DrawWindow();
drawWindow.Simple = null;
drawWindow.Window = window;
_drawWindows.Add(drawWindow);
}
else if(tokenLower == "gamessddef")
{
idConsole.Warning("TODO: gameSSDDef");
/*idGameSSDWindow *win = new idGameSSDWindow(dc, gui);
SaveExpressionParseState();
win->Parse(src, rebuild);
RestoreExpressionParseState();
AddChild(win);
win->SetParent(this);
dwt.simp = NULL;
dwt.win = win;
drawWindows.Append(dwt);*/
}
else if(tokenLower == "gamebearshootdef")
{
idConsole.Warning("TODO: gameBearShootDef");
/*idGameBearShootWindow *win = new idGameBearShootWindow(dc, gui);
SaveExpressionParseState();
win->Parse(src, rebuild);
RestoreExpressionParseState();
AddChild(win);
win->SetParent(this);
dwt.simp = NULL;
dwt.win = win;
drawWindows.Append(dwt);*/
}
else if(tokenLower == "gamebustoutdef")
{
idConsole.Warning("TODO: gameBustOutDef");
/*idGameBustOutWindow *win = new idGameBustOutWindow(dc, gui);
SaveExpressionParseState();
win->Parse(src, rebuild);
RestoreExpressionParseState();
AddChild(win);
win->SetParent(this);
dwt.simp = NULL;
dwt.win = win;
drawWindows.Append(dwt);*/
}
//
// added new onEvent
else if(tokenLower == "onnamedevent")
{
// read the event name
if((token = parser.ReadToken()) == null)
{
parser.Error("Expected event name");
return false;
}
idNamedEvent ev = new idNamedEvent(token.ToString());
parser.SetMarker();
if(ParseScript(parser, ev.Event) == false)
{
ret = false;
break;
}
_namedEvents.Add(ev);
}
else if(tokenLower == "ontime")
{
idTimeLineEvent ev = new idTimeLineEvent();
if((token = parser.ReadToken()) == null)
{
parser.Error("Unexpected end of file");
return false;
}
int tmp;
int.TryParse(token.ToString(), out tmp);
ev.Time = tmp;
// reset the mark since we dont want it to include the time
parser.SetMarker();
if(ParseScript(parser, ev.Event) == false)
{
ret = false;
break;
}
// this is a timeline event
ev.Pending = true;
_timeLineEvents.Add(ev);
}
else if(tokenLower == "definefloat")
{
token = parser.ReadToken();
tokenLower = token.ToString().ToLower();
idWinFloat var = new idWinFloat(tokenLower);
_definedVariables.Add(var);
// add the float to the editors wrapper dict
// Set the marker after the float name
parser.SetMarker();
// Read in the float
_regList.AddRegister(tokenLower, RegisterType.Float, parser, this, var);
}
else if(tokenLower == "definevec4")
{
token = parser.ReadToken();
tokenLower = token.ToString().ToLower();
idWinVector4 var = new idWinVector4(tokenLower);
// set the marker so we can determine what was parsed
// set the marker after the vec4 name
parser.SetMarker();
// FIXME: how about we add the var to the desktop instead of this window so it won't get deleted
// when this window is destoyed which even happens during parsing with simple windows ?
//definedVars.Append(var);
_gui.Desktop._definedVariables.Add(var);
_gui.Desktop._regList.AddRegister(tokenLower, RegisterType.Vector4, parser, _gui.Desktop, var);
}
else if(tokenLower == "float")
{
token = parser.ReadToken();
tokenLower = token.ToString();
idWinFloat var = new idWinFloat(tokenLower);
_definedVariables.Add(var);
// add the float to the editors wrapper dict
// set the marker to after the float name
parser.SetMarker();
// Parse the float
_regList.AddRegister(tokenLower, RegisterType.Float, parser, this, var);
}
else if(ParseScriptEntry(token, parser) == true)
{
}
else if(ParseInternalVariable(token.ToString(), parser) == true)
{
}
else
{
ParseRegisterEntry(token.ToString(), parser);
}
if((token = parser.ReadToken()) == null)
{
parser.Error("Unexpected end of file");
ret = false;
break;
}
}
if(ret == true)
{
EvaluateRegisters(-1, true);
}
SetupFromState();
PostParse();
return ret;
}