ide: Mimic case option in find

git-svn-id: svn://ultimatepp.org/upp/trunk@5584 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-11-26 20:19:04 +00:00
parent 0d8002fa2b
commit 110d992629
8 changed files with 73 additions and 16 deletions

View file

@ -160,6 +160,11 @@ struct FindReplaceDlg : WithIDEFindReplaceLayout<TopWindow> {
Size GetAdjustedSize();
virtual bool Key(dword key, int count);
void Setup(bool doreplace);
void Sync();
typedef FindReplaceDlg CLASSNAME;
FindReplaceDlg();
};
class CodeEditor : public LineEdit {
@ -351,7 +356,7 @@ protected:
int Match(const wchar *f, const wchar *s, int line, bool we, bool icase, int fi = 0);
WString GetWild(int type, int& i);
WString GetReplaceText();
WString GetReplaceText(WString replace, bool wildcards);
WString GetReplaceText(WString replace, bool wildcards, bool samecase);
bool InsertRS(int chr, int count = 1);
void IndentEnter(int count = 1);
@ -434,7 +439,8 @@ public:
bool FindLangString(bool back);
void Replace();
void BlockReplace();
int BlockReplace(WString find, WString replace, bool wholeword, bool ignorecase, bool wildcards);
int BlockReplace(WString find, WString replace, bool wholeword, bool ignorecase,
bool wildcards, bool samecase);
void MakeTabsOrSpaces(bool tabs);
void MakeLineEnds();

View file

@ -3,9 +3,10 @@ LAYOUT(IDEFindReplaceLayout, 376, 118)
ITEM(WithDropChoice<EditString>, find, HSizePosZ(54, 8).TopPosZ(4, 19))
ITEM(Label, replace_lbl, SetLabel(t_("Replace:")).LeftPosZ(8, 46).TopPosZ(28, 19))
ITEM(WithDropChoice<EditString>, replace, HSizePosZ(54, 8).TopPosZ(28, 19))
ITEM(Option, wholeword, SetLabel(t_("&Whole word")).LeftPosZ(8, 76).BottomPosZ(40, 18))
ITEM(Option, ignorecase, SetLabel(t_("&Ignore case")).LeftPosZ(100, 88).BottomPosZ(40, 18))
ITEM(Option, wildcards, SetLabel(t_("Wild&cards")).LeftPosZ(192, 68).BottomPosZ(40, 18))
ITEM(Option, wholeword, SetLabel(t_("&Whole word")).LeftPosZ(8, 76).BottomPosZ(38, 20))
ITEM(Option, wildcards, SetLabel(t_("Wild&cards")).LeftPosZ(92, 68).BottomPosZ(38, 20))
ITEM(Option, ignorecase, SetLabel(t_("&Ignore case")).LeftPosZ(168, 88).BottomPosZ(38, 20))
ITEM(Option, samecase, SetLabel(t_("Mimic case")).LeftPosZ(260, 108).TopPosZ(60, 20))
ITEM(Button, amend, SetLabel(t_("R&eplace")).LeftPosZ(8, 68).BottomPosZ(6, 24))
ITEM(Button, findback, SetLabel(t_("Find Previous")).LeftPosZ(136, 80).BottomPosZ(6, 24))
ITEM(Button, ok, SetLabel(t_("Find Next")).RightPosZ(80, 76).BottomPosZ(6, 24))

View file

@ -2,6 +2,18 @@
NAMESPACE_UPP
FindReplaceDlg::FindReplaceDlg()
{
ignorecase <<= THISBACK(Sync);
samecase <<= true;
Sync();
}
void FindReplaceDlg::Sync()
{
samecase.Enable(ignorecase);
}
bool FindReplaceDlg::Key(dword key, int cnt) {
if(key == K_CTRL_I) {
if(find.HasFocus()) {
@ -253,10 +265,11 @@ WString CodeEditor::GetWild(int type, int& i)
WString CodeEditor::GetReplaceText()
{
return GetReplaceText(findreplace.replace.GetText(), findreplace.wildcards);
return GetReplaceText(~findreplace.replace, findreplace.wildcards,
findreplace.wildcards && findreplace.samecase);
}
WString CodeEditor::GetReplaceText(WString rs, bool wildcards)
WString CodeEditor::GetReplaceText(WString rs, bool wildcards, bool samecase)
{
int anyi = 0, onei = 0, spacei = 0, numberi = 0, idi = 0;
WString rt;
@ -312,6 +325,23 @@ WString CodeEditor::GetReplaceText(WString rs, bool wildcards)
rt.Cat(c);
}
}
if(samecase) {
WString h = GetSelectionW();
if(h.GetCount() && rt.GetCount()) {
if(IsUpper(h[0]))
rt.Set(0, ToUpper(rt[0]));
if(IsLower(h[0]))
rt.Set(0, ToLower(rt[0]));
}
if(h.GetCount() > 1) {
if(IsUpper(h[1]))
for(int i = 1; i < rt.GetCount(); i++)
rt.Set(i, ToUpper(rt[i]));
if(IsLower(h[1]))
for(int i = 1; i < rt.GetCount(); i++)
rt.Set(i, ToLower(rt[i]));
}
}
return rt;
}
@ -328,7 +358,7 @@ void CodeEditor::Replace()
}
}
int CodeEditor::BlockReplace(WString find, WString replace, bool wholeword, bool ignorecase, bool wildcards)
int CodeEditor::BlockReplace(WString find, WString replace, bool wholeword, bool ignorecase, bool wildcards, bool samecase)
{
NextUndo();
int l, h;
@ -340,7 +370,7 @@ int CodeEditor::BlockReplace(WString find, WString replace, bool wholeword, bool
int hh, ll;
GetSelection(ll, hh);
CachePos(ll);
h = h - (hh - ll) + Paste(GetReplaceText(replace, wildcards));
h = h - (hh - ll) + Paste(GetReplaceText(replace, wildcards, ignorecase && samecase));
count++;
}
SetSelection(l, h);
@ -351,7 +381,7 @@ int CodeEditor::BlockReplace(WString find, WString replace, bool wholeword, bool
void CodeEditor::BlockReplace()
{
BlockReplace(~findreplace.find, ~findreplace.replace, findreplace.wholeword,
findreplace.ignorecase, findreplace.wildcards);
findreplace.ignorecase, findreplace.wildcards, findreplace.samecase);
/*
NextUndo();
int l, h;
@ -537,9 +567,13 @@ void CodeEditor::DoFindBack()
void CodeEditor::SerializeFind(Stream& s)
{
int version = 0;
s / version;
s % findreplace.find;
findreplace.find.SerializeList(s);
s % findreplace.wholeword % findreplace.ignorecase % findreplace.wildcards;
if(version >= 0)
s % findreplace.samecase;
s % findreplace.replace;
findreplace.replace.SerializeList(s);
}

View file

@ -239,7 +239,6 @@ void Ctrl::Jsonize(JsonIO& jio)
{
GuiLock __;
Value x;
bool empty = false;
if(jio.IsStoring())
x = GetData();
x.Jsonize(jio);

View file

@ -1,9 +1,13 @@
#include "ide.h"
void Ide::SerializeFf(Stream& s) {
int version = 0;
s / version;
s % ff.find;
ff.find.SerializeList(s);
s % ff.wholeword % ff.ignorecase % ff.wildcards;
if(version >= 0)
s % ff.samecase;
s % ff.replace;
s % ff.readonly;
ff.replace.SerializeList(s);
@ -21,7 +25,7 @@ FileSel& sSD()
}
void Ide::SerializeFindInFiles(Stream& s) {
int version = 3;
int version = 4;
s / version;
s % ff.files;
ff.files.SerializeList(s);
@ -37,6 +41,8 @@ void Ide::SerializeFindInFiles(Stream& s) {
s % sSD();
if(version >= 3)
s % ff.readonly;
if(version >= 4)
s % ff.samecase;
}
void SearchForFiles(Vector<String>& files, String dir, String mask, int readonly, Progress& pi) {
@ -373,6 +379,11 @@ void Ide::FindFolder()
ff.folder <<= ~sSD();
}
void Ide::SyncFindInFiles()
{
ff.samecase.Enable(ff.ignorecase);
}
void Ide::ConstructFindInFiles() {
ff.find.AddButton().SetMonoImage(CtrlImg::smallright()).Tip("Wildcard") <<= THISBACK(FindWildcard);
static const char *defs = "*.cpp *.h *.hpp *.c *.m *.C *.M *.cxx *.cc *.mm *.MM *.icpp *.sch *.lay *.rc";
@ -385,6 +396,9 @@ void Ide::ConstructFindInFiles() {
editor.PutI(ff.find);
editor.PutI(ff.replace);
CtrlLayoutOKCancel(ff, "Find In Files");
ff.ignorecase <<= THISBACK(SyncFindInFiles);
ff.samecase <<= true;
SyncFindInFiles();
}
void FindInFilesDlg::Sync()

View file

@ -186,13 +186,14 @@ void Ide::MacroReplace(EscEscape& e)
{
int n = e.GetCount();
if(n < 2 || n > 5)
e.ThrowError("wrong number of arguments in call to Find (2 to 5 expected)");
e.ThrowError("wrong number of arguments in call to Find (2 to 6 expected)");
WString find = e[0];
WString replace = e[1];
bool whole_word = (n > 2 && e.Int(2) > 0);
bool ignore_case = (n > 3 && e.Int(3) > 0);
bool wildcards = (n > 4 && e.Int(4) > 0);
e = editor.BlockReplace(find, replace, whole_word, ignore_case, wildcards);
bool samecase = (n > 5 && e.Int(5) > 0);
e = editor.BlockReplace(find, replace, whole_word, ignore_case, wildcards, samecase);
}
void Ide::MacroFindMatchingBrace(EscEscape& e)

View file

@ -1009,6 +1009,7 @@ public:
void SerializeFf(Stream& s);
bool SearchInFile(const String& fn, const String& pattern,
bool wholeword, bool ignorecase, int& n);
void SyncFindInFiles();
void ConstructFindInFiles();
void SerializeFindInFiles(Stream& s);

View file

@ -79,8 +79,9 @@ LAYOUT(FindInFilesLayout, 420, 152)
ITEM(Switch, style, SetLabel(t_("&None\nCo&nfirm\n&Auto")).LeftPosZ(52, 164).TopPosZ(78, 15))
ITEM(Label, replace_lbl2, SetLabel(t_("with:")).LeftPosZ(220, 28).TopPosZ(76, 19))
ITEM(Option, wholeword, SetLabel(t_("&Whole word")).LeftPosZ(54, 80).BottomPosZ(34, 18))
ITEM(Option, ignorecase, SetLabel(t_("&Ignore case")).LeftPosZ(140, 84).BottomPosZ(34, 18))
ITEM(Option, wildcards, SetLabel(t_("Wild&cards")).LeftPosZ(226, 72).BottomPosZ(34, 18))
ITEM(Option, wildcards, SetLabel(t_("Wild&cards")).LeftPosZ(140, 72).BottomPosZ(34, 18))
ITEM(Option, ignorecase, SetLabel(t_("&Ignore case")).LeftPosZ(216, 84).BottomPosZ(34, 18))
ITEM(Option, samecase, SetLabel(t_("Mimic case")).LeftPosZ(304, 108).TopPosZ(100, 18))
ITEM(Option, readonly, ThreeState(true).SetLabel(t_("Read-only files")).LeftPosZ(54, 142).BottomPosZ(14, 16))
ITEM(Button, ok, SetLabel(t_("OK")).RightPosZ(76, 64).BottomPosZ(6, 22))
ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(6, 22))