UltimateZoneBuilder/Source/Core/General/ErrorItem.cs
MaxED aecd017b19 Added, Errors and Warnings window: most of warnings/errors related to (G)ZDoom text lump parsing can now be double-clicked to show warning/error source in the Script Editor.
Fixed: some map format conversion errors were never displayed, because errors list was cleared after performing map conversion.
Fixed: 3d floor indicators in 2D modes were not updated after leaving Visual mode.
Fixed: some UDMF-only interface buttons were never removed after converting map format from UDMF.
2016-11-26 00:02:56 +00:00

312 lines
8.2 KiB
C#

#region ================== Copyright (c) 2007 Pascal vd Heiden
/*
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#endregion
#region ================== Namespaces
using System;
using System.Collections.Generic;
using System.Drawing;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Editing;
using CodeImp.DoomBuilder.Geometry;
using CodeImp.DoomBuilder.Map;
#endregion
namespace CodeImp.DoomBuilder
{
#region ================== ErrorItem (mxd)
public class ErrorItem
{
protected ErrorType type;
protected string description;
protected Image icon;
public ErrorType Type { get { return type; } }
public string Description { get { return description; } }
public Image Icon { get { return icon; } }
internal virtual bool IsShowable { get { return false; } }
public ErrorItem(ErrorType type, string description)
{
this.type = type;
this.description = description;
this.icon = GetIcon();
}
protected virtual Image GetIcon()
{
return (type == ErrorType.Error ? Properties.Resources.ErrorLarge : Properties.Resources.WarningLarge);
}
internal virtual void ShowSource() { }
}
#endregion
#region ================== MapElementErrorItem (mxd)
public class MapElementErrorItem : ErrorItem
{
private MapElement target;
private RectangleF zoomarea;
private string targetmodename;
internal override bool IsShowable { get { return true; } }
public MapElementErrorItem(ErrorType type, MapElement target, string description) : base(type, description)
{
this.target = target;
// Calculate zoom area
List<Vector2D> points = new List<Vector2D>();
RectangleF area = MapSet.CreateEmptyArea();
// Add all points to a list
if(target is Vertex)
{
points.Add((target as Vertex).Position);
targetmodename = "VerticesMode";
}
else if(target is Linedef)
{
points.Add((target as Linedef).Start.Position);
points.Add((target as Linedef).End.Position);
targetmodename = "LinedefsMode";
}
else if(target is Sidedef)
{
points.Add((target as Sidedef).Line.Start.Position);
points.Add((target as Sidedef).Line.End.Position);
targetmodename = "LinedefsMode";
}
else if(target is Sector)
{
Sector s = (target as Sector);
foreach(Sidedef sd in s.Sidedefs)
{
points.Add(sd.Line.Start.Position);
points.Add(sd.Line.End.Position);
}
targetmodename = "SectorsMode";
}
else if(target is Thing)
{
Thing t = (target as Thing);
Vector2D p = t.Position;
points.Add(p);
points.Add(p + new Vector2D(t.Size * 2.0f, t.Size * 2.0f));
points.Add(p + new Vector2D(t.Size * 2.0f, -t.Size * 2.0f));
points.Add(p + new Vector2D(-t.Size * 2.0f, t.Size * 2.0f));
points.Add(p + new Vector2D(-t.Size * 2.0f, -t.Size * 2.0f));
targetmodename = "ThingsMode";
}
else
{
General.Fail("Unknown object given to zoom in on.");
}
// Make a view area from the points
foreach(Vector2D p in points)
area = MapSet.IncreaseArea(area, p);
// Make the area square, using the largest side
if(area.Width > area.Height)
{
float delta = area.Width - area.Height;
area.Y -= delta * 0.5f;
area.Height += delta;
}
else
{
float delta = area.Height - area.Width;
area.X -= delta * 0.5f;
area.Width += delta;
}
// Add padding
area.Inflate(100f, 100f);
// Store
this.zoomarea = area;
}
internal override void ShowSource()
{
// Switch to appropriate mode...
if(General.Editing.Mode.GetType().Name != targetmodename)
{
// Leave any volatile mode
General.Editing.CancelVolatileMode();
General.Editing.ChangeMode(targetmodename);
}
// Select map element if it still exists
if(target != null && !target.IsDisposed)
{
General.Map.Map.ClearAllSelected();
if(target is Vertex)
{
((Vertex)target).Selected = true;
}
else if(target is Sidedef)
{
((Sidedef)target).Line.Selected = true;
}
else if(target is Linedef)
{
((Linedef)target).Selected = true;
}
else if(target is Sector)
{
Sector s = (Sector)target;
((ClassicMode)General.Editing.Mode).SelectMapElement(s);
foreach(Sidedef sd in s.Sidedefs) sd.Line.Selected = true;
}
else if(target is Thing)
{
((Thing)target).Selected = true;
}
else
{
throw new NotImplementedException("Unknown MapElement type!");
}
}
// Show area
ClassicMode editmode = (General.Editing.Mode as ClassicMode);
editmode.CenterOnArea(zoomarea, 0.6f);
}
protected override Image GetIcon()
{
return (type == ErrorType.Error ? Properties.Resources.ErrorLargeMapObject : Properties.Resources.WarningLargeMapObject);
}
}
#endregion
#region ================== TextResourceErrorItem (mxd)
public class TextResourceErrorItem : ErrorItem
{
private string resourcelocation;
private ScriptType scripttype;
private string lumpname;
private int lumpindex;
private int linenumber;
public string ResourceLocation { get { return resourcelocation; } }
public ScriptType ScriptType { get { return scripttype; } }
public string LumpName { get { return lumpname; } }
public int LumpIndex { get { return lumpindex; } }
public int LineNumber { get { return linenumber; } }
internal override bool IsShowable { get { return true; } }
internal TextResourceErrorItem(ErrorType type, ScriptType scripttype, DataLocation resourcelocation, string lumpname, int lumpindex, int linenumber, string description)
: base(type, description)
{
this.resourcelocation = resourcelocation.location;
this.scripttype = scripttype;
this.lumpname = lumpname;
this.lumpindex = lumpindex;
this.linenumber = linenumber;
}
internal override void ShowSource()
{
// Only when a map is loaded
if(General.Map == null || General.Map.Data == null) return;
// Show Script Editor
General.Map.ShowScriptEditor();
// Show in ScriptEditor
General.Map.ScriptEditor.DisplayError(this);
}
protected override Image GetIcon()
{
return (type == ErrorType.Error ? Properties.Resources.ErrorLargeText : Properties.Resources.WarningLargeText);
}
}
#endregion
#region ================== TextFileErrorItem (mxd)
/*public class TextFileErrorItem : ErrorItem
{
private string filepathname;
private ScriptType scripttype;
private int linenumber;
public string Filename { get { return filepathname; } }
public ScriptType ScriptType { get { return scripttype; } }
public int LineNumber { get { return linenumber; } }
internal override bool IsShowable { get { return true; } }
public TextFileErrorItem(ErrorType type, ScriptType scripttype, string filepathname, int linenumber, string description)
: base(type, description)
{
this.filepathname = filepathname;
this.scripttype = scripttype;
this.linenumber = linenumber;
}
internal override void ShowSource()
{
// Only when a map is loaded
if(General.Map == null || General.Map.Data == null) return;
// Show Script Editor
General.Map.ShowScriptEditor();
// Show in ScriptEditor
General.Map.ScriptEditor.DisplayError(this);
}
protected override Image GetIcon()
{
return (type == ErrorType.Error ? Properties.Resources.ErrorLargeText : Properties.Resources.WarningLargeText);
}
}*/
#endregion
#region ================== ErrorType
public enum ErrorType
{
/// <summary>
/// This indicates a significant error that may cause problems for the data displayed or editing behaviour.
/// </summary>
Error,
/// <summary>
/// This indicates a potential problem.
/// </summary>
Warning
}
#endregion
}