mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-23 20:32:34 +00:00
447851e457
Fixed, Script Editor: Find and Replace window now sets keyboard focus to the input textbox when opening the window/switching between tabs. Fixed, Nodes Viewer mode: SEGS overflows were not handled, causing a crash. Also extended SEGS limit is now used. Updated ZDoom_DECORATE.cfg (A_SetSize).
407 lines
No EOL
12 KiB
C#
407 lines
No EOL
12 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;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.Windows.Forms;
|
|
using CodeImp.DoomBuilder.Config;
|
|
using CodeImp.DoomBuilder.Controls;
|
|
|
|
#endregion
|
|
|
|
namespace CodeImp.DoomBuilder.Windows
|
|
{
|
|
public partial class ScriptFindReplaceForm : DelayedForm
|
|
{
|
|
#region ================== Constants
|
|
|
|
private const int MAX_DROPDOWN_ITEMS = 20;
|
|
|
|
#endregion
|
|
|
|
#region ================== Variables
|
|
|
|
private bool appclose;
|
|
private bool canreplace;
|
|
|
|
#endregion
|
|
|
|
#region ================== Properties
|
|
|
|
internal bool CanReplace //mxd
|
|
{
|
|
get { return canreplace; }
|
|
set
|
|
{
|
|
canreplace = value;
|
|
|
|
if(!canreplace)
|
|
{
|
|
if(tabs.TabPages.Contains(tabreplace))
|
|
tabs.TabPages.Remove(tabreplace);
|
|
}
|
|
else if(!tabs.TabPages.Contains(tabreplace))
|
|
{
|
|
tabs.TabPages.Add(tabreplace);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ================== Constructor
|
|
|
|
// Constructor
|
|
public ScriptFindReplaceForm()
|
|
{
|
|
InitializeComponent();
|
|
LoadSettings(); //mxd
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ================== Methods
|
|
|
|
// This makes the Find & Replace options
|
|
private FindReplaceOptions MakeOptions()
|
|
{
|
|
FindReplaceOptions options = new FindReplaceOptions();
|
|
|
|
if(tabs.SelectedTab == tabfind)
|
|
{
|
|
options.FindText = findbox.Text;
|
|
options.CaseSensitive = findmatchcase.Checked;
|
|
options.WholeWord = findwholeword.Checked;
|
|
options.ReplaceWith = null;
|
|
options.SearchMode = (FindReplaceSearchMode)findinbox.SelectedIndex;
|
|
}
|
|
else if(tabs.SelectedTab == tabreplace)
|
|
{
|
|
options.FindText = replacefindbox.Text;
|
|
options.CaseSensitive = replacematchcase.Checked;
|
|
options.WholeWord = replacewholeword.Checked;
|
|
options.ReplaceWith = replacebox.Text;
|
|
options.SearchMode = (FindReplaceSearchMode)replaceinbox.SelectedIndex;
|
|
}
|
|
else
|
|
{
|
|
throw new NotImplementedException("Unsupported tab type");
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
// Close the window
|
|
new public void Close()
|
|
{
|
|
appclose = true;
|
|
base.Close();
|
|
}
|
|
|
|
// This sets the text to find
|
|
public void SetFindText(string text)
|
|
{
|
|
ComboBox target; //mxd
|
|
|
|
if(tabs.SelectedTab == tabfind)
|
|
target = findbox;
|
|
else if(tabs.SelectedTab == tabreplace)
|
|
target = replacefindbox;
|
|
else
|
|
throw new NotImplementedException("Unsupported tab type");
|
|
|
|
target.Text = text;
|
|
target.SelectAll();
|
|
|
|
//mxd. Add to combobox
|
|
AddComboboxText(target, text);
|
|
}
|
|
|
|
//mxd
|
|
private static void AddComboboxText(ComboBox target, string text)
|
|
{
|
|
if(!string.IsNullOrEmpty(text) && !target.Items.Contains(text))
|
|
{
|
|
target.Items.Insert(0, text);
|
|
while(target.Items.Count > MAX_DROPDOWN_ITEMS)
|
|
{
|
|
target.Items.RemoveAt(target.Items.Count - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//mxd
|
|
private void LoadSettings()
|
|
{
|
|
// Load generic search settings
|
|
bool matchcase = General.Settings.ReadSetting("windows." + configname + ".matchcase", false);
|
|
bool matchwholeword = General.Settings.ReadSetting("windows." + configname + ".matchwholeword", false);
|
|
int searchmode = General.Settings.ReadSetting("windows." + configname + ".searchmode", (int)FindReplaceSearchMode.CURRENT_FILE);
|
|
|
|
// Load find settings
|
|
string findtext = General.Settings.ReadSetting("windows." + configname + ".findtext", string.Empty);
|
|
List<string> findtexts = new List<string>();
|
|
IDictionary findtextdic = General.Settings.ReadSetting("windows." + configname + ".findtexts", new Hashtable());
|
|
foreach(DictionaryEntry cde in findtextdic)
|
|
findtexts.Add(cde.Value.ToString());
|
|
|
|
// Load replace settings
|
|
string replacetext = General.Settings.ReadSetting("windows." + configname + ".replacetext", string.Empty);
|
|
List<string> replacetexts = new List<string>();
|
|
IDictionary replacetextdic = General.Settings.ReadSetting("windows." + configname + ".replacetexts", new Hashtable());
|
|
foreach(DictionaryEntry cde in replacetextdic)
|
|
replacetexts.Add(cde.Value.ToString());
|
|
|
|
// Apply find settings...
|
|
findbox.MaxDropDownItems = MAX_DROPDOWN_ITEMS;
|
|
findbox.Text = findtext;
|
|
findbox.SelectAll();
|
|
findbox.Items.AddRange(findtexts.ToArray());
|
|
findinbox.SelectedIndex = searchmode;
|
|
findmatchcase.Checked = matchcase;
|
|
findwholeword.Checked = matchwholeword;
|
|
|
|
// Apply replace settings...
|
|
replacefindbox.MaxDropDownItems = MAX_DROPDOWN_ITEMS;
|
|
replacefindbox.Text = findtext;
|
|
replacefindbox.SelectAll();
|
|
replacefindbox.Items.AddRange(findtexts.ToArray());
|
|
replacebox.MaxDropDownItems = MAX_DROPDOWN_ITEMS;
|
|
replacebox.Text = replacetext;
|
|
replacebox.Items.AddRange(replacetexts.ToArray());
|
|
replaceinbox.SelectedIndex = searchmode;
|
|
replacematchcase.Checked = matchcase;
|
|
replacewholeword.Checked = matchwholeword;
|
|
|
|
// Set selected tab
|
|
tabs.SelectedIndex = General.Clamp(General.Settings.ReadSetting("windows." + configname + ".selectedtab", 0), 0, tabs.TabCount);
|
|
}
|
|
|
|
//mxd
|
|
private void SaveSettings()
|
|
{
|
|
// Save generic search settings
|
|
General.Settings.WriteSetting("windows." + configname + ".matchcase", findmatchcase.Checked);
|
|
General.Settings.WriteSetting("windows." + configname + ".matchwholeword", findwholeword.Checked);
|
|
General.Settings.WriteSetting("windows." + configname + ".searchmode", findinbox.SelectedIndex);
|
|
General.Settings.WriteSetting("windows." + configname + ".selectedtab", tabs.SelectedIndex);
|
|
|
|
// Save find settings
|
|
General.Settings.WriteSetting("windows." + configname + ".findtext", findbox.Text);
|
|
ListDictionary finddata = new ListDictionary();
|
|
for(int i = 0; i < findbox.Items.Count; i++)
|
|
{
|
|
finddata.Add("findtext" + i, findbox.Items[i].ToString());
|
|
}
|
|
if(finddata.Count > 0)
|
|
{
|
|
General.Settings.WriteSetting("windows." + configname + ".findtexts", finddata);
|
|
}
|
|
|
|
// Save replace settings
|
|
General.Settings.WriteSetting("windows." + configname + ".replacetext", replacebox.Text);
|
|
ListDictionary replacedata = new ListDictionary();
|
|
for(int i = 0; i < replacebox.Items.Count; i++)
|
|
{
|
|
replacedata.Add("replacetext" + i, replacebox.Items[i].ToString());
|
|
}
|
|
if(replacedata.Count > 0)
|
|
{
|
|
General.Settings.WriteSetting("windows." + configname + ".replacetexts", replacedata);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ================== Events
|
|
|
|
// Form is closing
|
|
private void ScriptFindReplaceForm_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
SaveSettings(); //mxd
|
|
|
|
if(!appclose)
|
|
{
|
|
General.Map.ScriptEditor.Editor.CloseFindReplace(true);
|
|
}
|
|
}
|
|
|
|
// Find Next
|
|
private void findnextbutton_Click(object sender, EventArgs e)
|
|
{
|
|
FindReplaceOptions options = MakeOptions(); //mxd
|
|
AddComboboxText(findbox, options.FindText); //mxd
|
|
General.Map.ScriptEditor.Editor.FindNext(options);
|
|
}
|
|
|
|
//mxd. Find Previous
|
|
private void findpreviousbutton_Click(object sender, EventArgs e)
|
|
{
|
|
FindReplaceOptions options = MakeOptions();
|
|
AddComboboxText(findbox, options.FindText);
|
|
General.Map.ScriptEditor.Editor.FindPrevious(options);
|
|
}
|
|
|
|
//mxd. Bookmark all
|
|
private void bookmarkallbutton_Click(object sender, EventArgs e)
|
|
{
|
|
FindReplaceOptions options = MakeOptions();
|
|
AddComboboxText(findbox, options.FindText);
|
|
|
|
// Determine script type
|
|
ScriptType scripttype = ScriptType.UNKNOWN;
|
|
switch(options.SearchMode)
|
|
{
|
|
case FindReplaceSearchMode.CURRENT_FILE:
|
|
case FindReplaceSearchMode.CURRENT_PROJECT_CURRENT_SCRIPT_TYPE:
|
|
case FindReplaceSearchMode.OPENED_TABS_CURRENT_SCRIPT_TYPE:
|
|
ScriptDocumentTab t = General.Map.ScriptEditor.Editor.ActiveTab;
|
|
if(t != null) scripttype = t.Config.ScriptType;
|
|
break;
|
|
}
|
|
|
|
if(General.Map.ScriptEditor.Editor.FindUsages(options, scripttype)) this.Close();
|
|
}
|
|
|
|
//mxd. Replace
|
|
private void replacebutton_Click(object sender, EventArgs e)
|
|
{
|
|
var editor = General.Map.ScriptEditor.Editor;
|
|
|
|
FindReplaceOptions options = MakeOptions();
|
|
AddComboboxText(replacefindbox, options.FindText);
|
|
AddComboboxText(replacebox, options.ReplaceWith);
|
|
|
|
ScriptDocumentTab curtab = editor.ActiveTab;
|
|
if(curtab == null) return;
|
|
|
|
// Search from selection start, then replace
|
|
if(!curtab.FindNext(options, true) || !editor.Replace(options))
|
|
{
|
|
editor.DisplayStatus(ScriptStatusType.Warning, "Can't find any occurrence of \"" + options.FindText + "\".");
|
|
return;
|
|
}
|
|
|
|
// Find & show next match
|
|
curtab.FindNext(options);
|
|
}
|
|
|
|
//mxd. Replace All
|
|
private void replaceallbutton_Click(object sender, EventArgs e)
|
|
{
|
|
var editor = General.Map.ScriptEditor.Editor;
|
|
|
|
FindReplaceOptions options = MakeOptions();
|
|
AddComboboxText(replacefindbox, options.FindText);
|
|
AddComboboxText(replacebox, options.ReplaceWith);
|
|
|
|
// Find next match
|
|
ScriptDocumentTab curtab = editor.ActiveTab;
|
|
if(curtab == null || !curtab.FindNext(options, true))
|
|
{
|
|
editor.DisplayStatus(ScriptStatusType.Warning, "Can't find any occurrence of \"" + options.FindText + "\".");
|
|
return;
|
|
}
|
|
|
|
// Replace loop
|
|
int replacements = 0;
|
|
while(editor.FindNext(options) && editor.Replace(options))
|
|
replacements++;
|
|
|
|
// Show result
|
|
if(replacements == 0)
|
|
{
|
|
editor.DisplayStatus(ScriptStatusType.Warning, "Can't find any occurrence of \"" + options.FindText + "\".");
|
|
}
|
|
else
|
|
{
|
|
editor.DisplayStatus(ScriptStatusType.Info, "Replaced " + replacements + " occurrences of \"" + options.FindText + "\" with \"" + options.ReplaceWith + "\".");
|
|
|
|
// Find & select the last match on the now-current tab
|
|
curtab = editor.ActiveTab;
|
|
if(curtab != null)
|
|
{
|
|
options.FindText = options.ReplaceWith;
|
|
options.ReplaceWith = null;
|
|
|
|
curtab.SelectionStart = curtab.Text.Length;
|
|
curtab.SelectionEnd = curtab.SelectionStart;
|
|
curtab.FindPrevious(options);
|
|
}
|
|
}
|
|
}
|
|
|
|
//mxd
|
|
private void tabs_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
// Transfer settings...
|
|
if(tabs.SelectedTab == tabfind)
|
|
{
|
|
findbox.Text = replacefindbox.Text;
|
|
findbox.Items.Clear();
|
|
if(replacefindbox.Items.Count > 0)
|
|
{
|
|
string[] items = new string[replacefindbox.Items.Count];
|
|
replacefindbox.Items.CopyTo(items, 0);
|
|
findbox.Items.AddRange(items);
|
|
}
|
|
findbox.SelectAll();
|
|
findbox.Focus();
|
|
|
|
findinbox.SelectedIndex = replaceinbox.SelectedIndex;
|
|
|
|
findmatchcase.Checked = replacematchcase.Checked;
|
|
findwholeword.Checked = replacewholeword.Checked;
|
|
}
|
|
else if(tabs.SelectedTab == tabreplace)
|
|
{
|
|
replacefindbox.Text = findbox.Text;
|
|
replacefindbox.Items.Clear();
|
|
if(findbox.Items.Count > 0)
|
|
{
|
|
string[] items = new string[findbox.Items.Count];
|
|
findbox.Items.CopyTo(items, 0);
|
|
replacefindbox.Items.AddRange(items);
|
|
}
|
|
replacefindbox.SelectAll();
|
|
replacefindbox.Focus();
|
|
|
|
replaceinbox.SelectedIndex = findinbox.SelectedIndex;
|
|
|
|
replacematchcase.Checked = findmatchcase.Checked;
|
|
replacewholeword.Checked = findwholeword.Checked;
|
|
}
|
|
else
|
|
{
|
|
throw new NotImplementedException("Unsupported tab type");
|
|
}
|
|
}
|
|
|
|
//mxd. Focus text input
|
|
private void ScriptFindReplaceForm_Shown(object sender, EventArgs e)
|
|
{
|
|
if(tabs.SelectedTab == tabfind) findbox.Focus();
|
|
else if(tabs.SelectedTab == tabreplace) replacefindbox.Focus();
|
|
else throw new NotImplementedException("Unsupported tab type");
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |