/// <summary>
/// Renames a TAG without rebuilding the map.
/// Allows names to be expanded by however many characters are available in the padding.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
/// <remarks></remarks>
private void renameToolStripMenuItem_Click(object sender, EventArgs e)
{
int extraSpace = map.FileNames.Offset[map.FileNames.Offset.Length - 1];
extraSpace = map.MapHeader.offsetTofileIndex - map.MapHeader.offsetTofileNames - extraSpace - 1;
newName = treeView1.SelectedNode.Text;
do
{
// Create a form for renaming a new tag
askForName a = new askForName("Rename Tag", "Enter new tag name", "&Rename Tag", newName, newName.Substring(newName.LastIndexOf('\\') + 1), true);
if (a.ShowDialog() != DialogResult.OK)
{
return;
}
newName = a.getTextBoxValue();
a.Dispose();
// Check if there is enough space for new name
if (extraSpace - (newName.Length - treeView1.SelectedNode.Text.Length) < 0)
{
MessageBox.Show(
"Name is " + (-(extraSpace - (newName.Length - treeView1.SelectedNode.Text.Length))) +
" characters too long!");
}
}
while (extraSpace - (newName.Length - treeView1.SelectedNode.Text.Length) < 0);
if (newName == treeView1.SelectedNode.Text)
{
return;
}
if (newName != string.Empty)
{
int id = map.Functions.ForMeta.FindByNameAndTagType(
treeView1.SelectedNode.Parent.Text, treeView1.SelectedNode.Text);
if (id == -1)
{
MessageBox.Show("Tag name cannot be found in Meta!");
return;
}
int offset = map.FileNames.Offset[id];
int diff = newName.Length - treeView1.SelectedNode.Text.Length;
map.FileNames.Name[id] = newName;
map.OpenMap(MapTypes.Internal);
BinaryReader br = map.BR;
BinaryWriter bw = map.BW;
// If we are removing characters, null out data at end
if (diff < 0)
{
bw.BaseStream.Position = map.MapHeader.offsetTofileNames +
map.FileNames.Offset[map.FileNames.Offset.Length - 1] +
map.FileNames.Length[map.FileNames.Name.Length - 1];
bw.Write(new byte[-diff]);
}
// reposition filename within file and update the filename index
for (int x = map.FileNames.Offset.Length - 1; x >= 0; x--)
{
if (map.FileNames.Offset[x] >= offset)
{
br.BaseStream.Position = map.MapHeader.offsetTofileIndex + x * 4;
int o = br.ReadInt32();
map.FileNames.Offset[x] += diff;
bw.BaseStream.Position = map.MapHeader.offsetTofileIndex + x * 4;
bw.Write(map.FileNames.Offset[x]);
bw.BaseStream.Position = map.MapHeader.offsetTofileNames + map.FileNames.Offset[x];
bw.Write(map.FileNames.Name[x].ToCharArray());
bw.Write((byte)0);
}
else
{
break;
}
}
map.CloseMap();
toolStripHistoryList.DropDownItems[0].Name = "[" + map.MetaInfo.TagType[id] + "] " + newName;
toolStripHistoryList.DropDownItems[0].Text = toolStripHistoryList.DropDownItems[0].Name;
toolStripHistoryList.DropDownItems[0].Tag = new[]
{
id.ToString(), map.MetaInfo.TagType[id], map.FileNames.Name[id]
};
addToQuickList(map.MetaInfo.TagType[id], map.FileNames.Name[id]);
RefreshTreeView();
tsItem_Click(toolStripHistoryList.DropDownItems[0], null);
}
}