bool _FillProperties(bool newWindow) { bool isCon = !_con.Is0; _WinInfo f = default; if (!_GetClassName(_wnd, out f.wClass)) { return(false); //note: get even if !newWindow, to detect closed window } if (isCon && !_GetClassName(_con, out f.cClass)) { return(false); } bool _GetClassName(wnd w, out string cn) { cn = w.ClassName; if (cn != null) { return(true); } _winInfo.zText = "Failed to get " + (w == _wnd ? "window" : "control") + " properties: \r\n" + lastError.message; _scroller.Visibility = Visibility.Hidden; return(false); } _noeventValueChanged = true; var wndName = _wnd.NameTL_; if (newWindow) { nameW.Set(true, TUtil.EscapeWindowName(wndName, true)); classW.Set(true, TUtil.StripWndClassName(f.wClass, true)); f.wProg = _wnd.ProgramName; var ap = new List <string> { f.wProg, "WOwner.Process(processId)", "WOwner.Thread(threadId)" }; if (!_wnd.Get.Owner.Is0) { ap.Add("WOwner.Window(ow)"); } programW.Set(wndName.NE(), f.wProg, ap); containsW.Set(false, null, _ContainsCombo_DropDown); } else if (wndName != _wndName) { if (TUtil.ShouldChangeTextBoxWildex(nameW.t.Text, wndName)) { nameW.Set(true, TUtil.EscapeWindowName(wndName, true)); } } f.wName = _wndName = wndName; if (isCon) { //name combo f.cName = _con.Name; int iSel = f.cName.NE() ? -1 : 0; var an = new List <string> { TUtil.EscapeWildex(f.cName) }; _ConNameAdd("***wfName ", f.cWF = _con.NameWinforms); /*bool isElm =*/ _ConNameAdd("***elmName ", f.cElm = _con.NameElm); //bool isLabel = _ConNameAdd("***label ", f.cLabel = _con.NameLabel); //if(isElm && isLabel && iSel == an.Count - 2 && f.cElm == f.cLabel) iSel++; //if label == elmName, prefer label if (iSel < 0) { iSel = 0; //never select text, even if all others unavailable } _ConNameAdd("***text ", f.cText = _con.ControlText); bool _ConNameAdd(string prefix, string value) { if (value.NE()) { return(false); } if (iSel < 0) { iSel = an.Count; } an.Add(prefix + TUtil.EscapeWildex(value)); return(true); } bool idUseful = TUtil.GetUsefulControlId(_con, _wnd, out f.cId); //idC.Visible = idUseful; idC.Set(idUseful, f.cId.ToS() + (idUseful ? null : " /*probably not useful*/")); string sName = an[iSel], sClass = TUtil.StripWndClassName(f.cClass, true); nameC.Set(!idUseful, sName, an); classC.Set(!idUseful, sClass); bool hiddenToo = !_con.IsVisible; cHiddenTooC.IsChecked = hiddenToo; var skip = idUseful ? null : TUtil.GetControlSkip(_wnd, _con, sName, sClass, hiddenToo); skipC.Set(skip != null, skip); } bool checkControl = isCon && _checkControl; _cControl.IsChecked = checkControl; _ShowControlProperties(showGrid: checkControl, showAll: isCon); _noeventValueChanged = false; _scroller.Visibility = Visibility.Visible; _FillWindowInfo(f); return(true); List <string> _ContainsCombo_DropDown() { try { var a1 = new List <string>(); //child foreach (var c in _wnd.Get.Children(onlyVisible: true)) { var cn = c.Name; if (cn.NE()) { continue; } cn = "c '" + TUtil.StripWndClassName(c.ClassName, true) + "' " + TUtil.EscapeWildex(cn); if (!a1.Contains(cn)) { a1.Add(cn); } } //elm var a2 = new List <string>(); var a3 = _wnd.Elm[name : "?*", prop : "notin=SCROLLBAR\0maxcc=100", flags : EFFlags.ClientArea].FindAll(); //all that have a name string prevName = null; for (int i = a3.Length; --i >= 0;) { if (!a3[i].GetProperties("Rn", out var prop)) { continue; } if (prop.Name == prevName && prop.Role == "WINDOW") { continue; } prevName = prop.Name; //skip parent WINDOW string rn = "e '" + prop.Role + "' " + TUtil.EscapeWildex(prop.Name); if (!a2.Contains(rn)) { a2.Add(rn); } } a2.Reverse(); a1.AddRange(a2); return(a1); //rejected: sort } catch (Exception ex) { Debug_.Print(ex); return(null); } } }
/// <summary> /// Returns code to find window w and optionally control con in it. Without newline at the end. /// If w/con is same as previous and code of this control is modified and valid, gets code from this code control, from the start to ZReadonlyStart. /// Else creates code "var w = wnd.find(...);". If w is invalid, creates code "wnd w = default;". /// The returned wndVar is final wnd variable name (of window or control). /// </summary> public (string code, string wndVar) ZGetWndFindCode(bool test, wnd w, wnd con = default, bool private1 = false) { if (test) //remove 'wait' and 'activate' from wnd.find and wnd.Child. If no 'wait', insert 0 to throw notfoundexception. { var k = ZGetWndFindCode(false, w, con, private1: true); var s = k.code; var p = _ParseWndFind(s, test: true); if (p?.wVar != null) { void _Replace(int end, int argsStart, int argsEnd, int nameStart, bool orRun = false, bool orRunReplace = false, int funcNameEnd = 0) { if (orRun && !orRunReplace) { return; } s = s.ReplaceAt(argsEnd..end, ");"); //remove '.Activate()' etc. If orRun, removes run etc arguments. s = s.ReplaceAt(argsStart..nameStart, nameStart < argsEnd ? "0, " : "0"); //remove 'waitS, ' and add '0, ' (to throw NotFoundException) if (orRun) { s = s.Remove(funcNameEnd - 5, 5); //findOrRun -> find } } if (p.cVar != null) { _Replace(p.cEnd, p.cArgsStart, p.cArgsEnd, p.cNameStart); } _Replace(p.wEnd, p.wArgsStart, p.wArgsEnd, p.wNameStart, p.orRun, p.orRunReplace, p.wFuncNameEnd); } //print.it(s); k.code = s; return(k); } string R = null, sCode = null, wndVar = "w", conVar = "c"; if (w != _wnd) { _userModified = false; } else if (!_userModified) { _userModified = 0 != Call(Sci.SCI_GETMODIFY); } if (!w.Is0) { if (_userModified) { sCode = zRangeText(false, 0, _ReadonlyStartUtf8); var p = _ParseWndFind(sCode, test: false); if (p?.wVar != null) { bool isConCode = p.cVar != null; //print.it(isConCode); if (con == _con && !con.Is0 == isConCode) { //print.it(isConCode ? "same control" : "no control"); if (!private1 && p.wName != null) { //if window name changed and does not match the name in code, change it in code var name = w.NameTL_; if (name != null && !new wildex(p.wName, noException: true).Match(name)) { var s = TUtil.EscapeWindowName(name, true); if (!(TUtil.IsVerbatim(s, out _) || TUtil.MakeVerbatim(ref s))) { s = s.Escape(quote: true); } sCode = sCode.ReplaceAt(p.wNameStart..p.wNameEnd, s); } } return(sCode, p.cVar ?? p.wVar); } wndVar = p.wVar; if (isConCode) { sCode = sCode[..p.cStart];