diff --git a/src/gui/interact/ui-coord-resolver.hpp b/src/gui/interact/ui-coord-resolver.hpp new file mode 100644 index 000000000..efdae5c43 --- /dev/null +++ b/src/gui/interact/ui-coord-resolver.hpp @@ -0,0 +1,106 @@ +/* + UI-COORD-RESOLVER.hpp - resolve UI coordinate spec against actual window topology + + Copyright (C) Lumiera.org + 2017, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +/** @file ui-coord-resolver.hpp + ** Evaluation of UI coordinates against a concrete window topology. + ** [UI-Coordinates](\ref UICoord) allow to describe and locate an interface component within the + ** Lumiera GUI through a topological access path. As such these coordinate specifications are abstract, + ** and need to be related, attached or resolved against the actual configuration of widgets in the UI. + ** Through this relation it becomes possible to pose meaningful queries over these coordinates, or to + ** build, rebuild and remould a coordinate specification. + ** + ** We need to avoid tainting with the intrinsics of the actual UI toolkit though -- which indicates + ** the UICoordResolver should be designed as an abstract intermediary, built on top of a command and + ** query interface, provided by the \ref Navigator and backed by the actual UI configuration. + ** + ** @todo WIP 10/2017 first draft ////////////////////////////////////////////////////////////////////////////TICKET #1106 generic UI coordinate system + ** + ** @see UICoordResolver_test + ** @see UICoord_test + ** @see navigator.hpp + ** @see view-locator.hpp + */ + + +#ifndef GUI_INTERACT_UI_COORD_RESOLVER_H +#define GUI_INTERACT_UI_COORD_RESOLVER_H + +#include "lib/error.hpp" +//#include "lib/symbol.hpp" +#include "gui/interact/ui-coord.hpp" +//#include "lib/util.hpp" + +//#include +//#include +//#include +//#include +//#include + + +namespace gui { +namespace interact { + + namespace error = lumiera::error; + +// using std::unique_ptr; +// using std::string; +// using lib::Literal; +// using lib::Symbol; +// using util::unConst; +// using util::isnil; +// using util::min; + + + + + /** + * Query and mutate UICoord specifications in relation to actual UI topology. + * + * @todo initial draft as of 10/2017 + */ + class UICoordResolver + { + + public: + + + + /* === named component access === */ + + /** */ + + + + /* === query functions === */ + + /** + */ + + + private: + }; + + + +}}// namespace gui::interact +#endif /*GUI_INTERACT_UI_COORD_RESOLVER_H*/ diff --git a/tests/gui/interact/ui-coord-resolver-test.cpp b/tests/gui/interact/ui-coord-resolver-test.cpp new file mode 100644 index 000000000..892a3b399 --- /dev/null +++ b/tests/gui/interact/ui-coord-resolver-test.cpp @@ -0,0 +1,396 @@ +/* + UICoordResolver(Test) - resolve UI coordinates against actual topology + + Copyright (C) Lumiera.org + 2017, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + +/** @file ui-coord-resolver-test.cpp + ** unit test \ref UICoordResolver_test + */ + + +#include "lib/test/run.hpp" +#include "lib/test/test-helper.hpp" +#include "gui/interact/ui-coord.hpp" +#include "gui/interact/ui-coord-resolver.hpp" +#include "lib/format-cout.hpp"/////////////////////////TODO RLY? +#include "lib/format-util.hpp" +//#include "lib/idi/entry-id.hpp" +//#include "lib/diff/gen-node.hpp" +#include "lib/util.hpp" + +#include + + +using std::string; +//using lib::idi::EntryID; +//using lib::diff::GenNode; +//using util::isSameObject; +using lib::Symbol; +using util::isnil; +using util::join; + + + +namespace gui { +namespace interact { +namespace test { + +// using lumiera::error::LUMIERA_ERROR_WRONG_TYPE; + using lumiera::error::LUMIERA_ERROR_INDEX_BOUNDS; + using lumiera::error::LUMIERA_ERROR_LOGIC; + + namespace { //Test fixture... + + }//(End)Test fixture + + + /******************************************************************************//** + * @test verify query and mutation of UICoord in relation to actual UI topology. + * + * @see UICoordResolver + * @see navigator.hpp + * @see ViewLocator + * @see UICoord_test + */ + class UICoordResolver_test : public Test + { + + virtual void + run (Arg) + { + verify_basics(); + verify_builder(); + verify_stringRepr(); + verify_comparisons(); + verify_queryAnchor(); + verify_queryCoverage(); + verify_mutateAnchor(); + verify_mutateCover(); + verify_mutateExtend(); + verify_mutateCreate(); + } + + + void + verify_basics() + { + UICoord undef; + CHECK (isnil (undef)); + + UICoord uic{"Γ","Δ","Θ","Ξ","Σ","Ψ","Φ","Ω"}; + CHECK (not isnil (uic)); + CHECK (8 == uic.size()); + // path is iterable + CHECK ("ΓΔΘΞΣΨΦΩ" == join(uic,"")); + + // indexed access + CHECK ("Γ" == uic[UIC_WINDOW]); + CHECK ("Δ" == uic[UIC_PERSP]); + CHECK ("Θ" == uic[UIC_PANEL]); + CHECK ("Ξ" == uic[UIC_VIEW]); + CHECK ("Σ" == uic[UIC_TAB]); + CHECK ("Ψ" == uic[UIC_PATH]); + CHECK ("Φ" == uic[UIC_PATH+1]); + CHECK ("Ω" == uic[UIC_PATH+2]); + + // iteration matches index order + uint i=0; + for (UICoord::iterator ii = uic.begin(); ii; ++ii, ++i) + CHECK (uic[i] == *ii); + CHECK (8 == i); + + VERIFY_ERROR (INDEX_BOUNDS, uic[8]); + + // string representation + CHECK ("UI:Γ[Δ]-Θ.Ξ.Σ/Ψ/Φ/Ω" == string(uic)); + CHECK ("Γ[Δ]-Θ.Ξ.Σ" == uic.getComp()); + CHECK ("Ψ/Φ/Ω" == uic.getPath()); + + // new value can be assigned, but not altered in place + uic = UICoord{nullptr,nullptr,"Θ",nullptr,"Σ",nullptr,"Φ"}; + CHECK (7 == uic.size()); + + // representation is trimmed and filled + CHECK ("UI:?-Θ.*.Σ/*/Φ" == string(uic)); + CHECK (Symbol::EMPTY == uic[UIC_WINDOW]); + CHECK (Symbol::EMPTY == uic[UIC_PERSP]); + CHECK ("Θ" == uic[UIC_PANEL]); + CHECK ("*" == uic[UIC_VIEW]); + CHECK ("Σ" == uic[UIC_TAB]); + CHECK ("*" == uic[UIC_PATH]); + CHECK ("Φ" == uic[UIC_PATH+1]); + VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH+2]); + } + + + void + verify_builder() + { + UICoord uic1 = UICoord::window("window"); + UICoord uic2 = uic1.view("view"); + CHECK ("UI:window" == string(uic1)); + CHECK ("UI:window[*]-*.view" == string(uic2)); + CHECK (1 == uic1.size()); + CHECK (4 == uic2.size()); + + // fault-tolerant accessors for the generic part + CHECK ("window" == uic1.getWindow()); + CHECK ("window" == uic2.getWindow()); + CHECK ("" == uic1.getPersp()); + CHECK ("*" == uic2.getPersp()); + CHECK ("" == uic1.getPanel()); + CHECK ("*" == uic2.getPanel()); + CHECK ("" == uic1.getView()); + CHECK ("view" == uic2.getView()); + CHECK ("" == uic1.getTab()); + CHECK ("" == uic2.getTab()); + CHECK ("" == uic1.getPath()); + CHECK ("" == uic2.getPath()); + CHECK ("window" == uic1.getComp()); + CHECK ("window[*]-*.view" == uic2.getComp()); + + VERIFY_ERROR (INDEX_BOUNDS, uic1[UIC_PERSP]); + VERIFY_ERROR (INDEX_BOUNDS, uic2[UIC_TAB]); + + UICoord uic3 = UICoord().view("view"); + CHECK (4 == uic3.size()); + CHECK ("UI:?.view" == string(uic3)); + CHECK ("" == uic3.getWindow()); + CHECK ("" == uic3.getPersp()); + CHECK ("" == uic3.getPanel()); + CHECK ("view" == uic3.getView()); + + UICoord uic4 = uic3.persp("persp"); + CHECK (4 == uic4.size()); + CHECK ("UI:?[persp]-*.view" == string(uic4)); + + uic4 = uic3.append("tab"); + CHECK (5 == uic4.size()); + CHECK ("UI:?.view.tab" == string(uic4)); + uic4 = uic3.prepend("panel"); + CHECK (4 == uic4.size()); + CHECK ("UI:?-panel.view" == string(uic4)); + uic4 = uic4.tab(555); + CHECK (5 == uic4.size()); + CHECK ("UI:?-panel.view.#555" == string(uic4)); + VERIFY_ERROR(LOGIC, uic1.prepend("root")); + } + + + void + verify_stringRepr() + { + UICoord uic; + CHECK ("UI:?" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("" == uic.getPath()); + + uic = uic.path("ἁρχή"); + CHECK ("UI:?/ἁρχή" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("ἁρχή" == uic.getPath()); + + uic = uic.path("α/β/γ"); + CHECK ("UI:?/α/β/γ" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("α/β/γ" == uic.getPath()); + + uic = uic.append("δ"); + CHECK ("UI:?/α/β/γ/δ" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("α/β/γ/δ" == uic.getPath()); + + uic = uic.append(""); + CHECK ("UI:?/α/β/γ/δ" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("α/β/γ/δ" == uic.getPath()); + + uic = uic.append("ε/λ/ον"); + CHECK ("UI:?/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + // note: we built a partially empty path array... + CHECK (12 == uic.size()); + CHECK (Symbol::EMPTY == uic.getView()); + CHECK (Symbol::EMPTY == uic.getTab()); + CHECK (Symbol::EMPTY == uic[UIC_WINDOW]); + CHECK (Symbol::EMPTY == uic[UIC_PERSP]); + CHECK (Symbol::EMPTY == uic[UIC_PANEL]); + CHECK (Symbol::EMPTY == uic[UIC_VIEW]); + CHECK (Symbol::EMPTY == uic[UIC_TAB]); + CHECK ("α" == uic[UIC_PATH]); + CHECK ("β" == uic[UIC_PATH+1]); + CHECK ("γ" == uic[UIC_PATH+2]); + CHECK ("δ" == uic[UIC_PATH+3]); + CHECK ("ε" == uic[UIC_PATH+4]); + CHECK ("λ" == uic[UIC_PATH+5]); + CHECK ("ον" == uic[UIC_PATH+6]); + + uic = uic.prepend("ειδος"); + CHECK ("UI:?.ειδος/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?.ειδος" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + CHECK (12 == uic.size()); + + uic = uic.tab(""); + CHECK ("UI:?/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.view("ειδος"); + CHECK ("UI:?.ειδος.*/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?.ειδος.*" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.prepend("panel"); + CHECK ("UI:?-panel.ειδος.*/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?-panel.ειδος.*" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.view(nullptr); + CHECK ("UI:?-panel.*.*/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?-panel.*.*" == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.tab(" "); + CHECK ("UI:?-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?-panel.*. " == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.prepend("perspective"); + CHECK ("UI:?[perspective]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?[perspective]-panel.*. " == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.prepend("win"); + CHECK ("UI:win[perspective]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("win[perspective]-panel.*. " == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + + uic = uic.persp(""); + CHECK ("UI:win[*]-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + CHECK (12 == uic.size()); + + uic = uic.path(" "); + CHECK ("UI:win[*]-panel.*. / " == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK (" " == uic.getPath()); + CHECK (6 == uic.size()); + CHECK (" " == uic[UIC_PATH]); + VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH+1]); + + uic = uic.path(nullptr); + CHECK ("UI:win[*]-panel.*. " == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK ("" == uic.getPath()); + CHECK (5 == uic.size()); + VERIFY_ERROR (INDEX_BOUNDS, uic[UIC_PATH]); + + uic = uic.append(nullptr); + CHECK ("UI:win[*]-panel.*. " == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK ("" == uic.getPath()); + CHECK (5 == uic.size()); + + uic = uic.append("*"); + CHECK ("UI:win[*]-panel.*. " == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK ("" == uic.getPath()); + CHECK (5 == uic.size()); + + uic = uic.append("**"); + CHECK ("UI:win[*]-panel.*. /**" == string(uic)); + CHECK ("win[*]-panel.*. " == uic.getComp()); + CHECK ("**" == uic.getPath()); + CHECK ("**" == uic[UIC_PATH]); + CHECK (6 == uic.size()); + + uic = uic.tab(""); + CHECK ("UI:win[*]-panel.*.*/**" == string(uic)); + CHECK ("win[*]-panel.*.*" == uic.getComp()); + CHECK ("**" == uic.getPath()); + CHECK (6 == uic.size()); + + uic = uic.path(""); + CHECK ("UI:win[*]-panel" == string(uic)); + CHECK ("win[*]-panel" == uic.getComp()); + CHECK ("" == uic.getPath()); + CHECK (3 == uic.size()); + } + + + void + verify_comparisons() + { + UNIMPLEMENTED ("verify comparison of UI coordinates"); + } + + + void + verify_queryAnchor() + { + UNIMPLEMENTED ("query anchorage of given UI coordinates"); + } + + + void + verify_queryCoverage() + { + UNIMPLEMENTED ("query coverage of given UI coordinates with respect to actual UI"); + } + + + void + verify_mutateAnchor() + { + UNIMPLEMENTED ("mutate given UI coordinates by anchoring them"); + } + + + void + verify_mutateCover() + { + UNIMPLEMENTED ("mutate given UI coordinates by reducing to covered part"); + } + + + void + verify_mutateExtend() + { + UNIMPLEMENTED ("mutate given UI coordinates by uncovered extension"); + } + + + void + verify_mutateCreate() + { + UNIMPLEMENTED ("mutate given UI coordinates by creating new components"); + } + }; + + + /** Register this test class... */ + LAUNCHER (UICoordResolver_test, "unit gui"); + + +}}} // namespace gui::interact::test diff --git a/tests/gui/interact/ui-coord-test.cpp b/tests/gui/interact/ui-coord-test.cpp index 6d1b9eb0f..60f769ee7 100644 --- a/tests/gui/interact/ui-coord-test.cpp +++ b/tests/gui/interact/ui-coord-test.cpp @@ -61,12 +61,19 @@ namespace test { /******************************************************************************//** - * @test verify the mechanics of a functor based internal DSL - * to configure access and allocation patters for component views. + * @test verify the basic properties of topological UI coordinate specifications. + * - created as path-like sequence of components + * - provides a builder API for definition and mutation + * - Normalisation and handling of missing parts + * - access to UI coordinate components + * - string representation + * - comparisons * - * @see id-scheme.hpp - * @see ViewLocator - * @see UICoord_test + * @see ui-coord.hpp + * @see path-array.hpp + * @see PathArray_test + * @see UICoordResolver_test + * @see ViewSpecDSL_test */ class UICoord_test : public Test { @@ -97,19 +104,19 @@ namespace test { CHECK (not isnil (uic)); CHECK (8 == uic.size()); // path is iterable - CHECK ("ΓΔΘΞΣΨΦΩ" == join(uic,"")); + CHECK ("Γ-Δ-Θ-Ξ-Σ-Ψ-Φ-Ω" == join(uic,"-")); // indexed access - CHECK ("Γ" == uic[UIC_WINDOW]); - CHECK ("Δ" == uic[UIC_PERSP]); - CHECK ("Θ" == uic[UIC_PANEL]); - CHECK ("Ξ" == uic[UIC_VIEW]); - CHECK ("Σ" == uic[UIC_TAB]); - CHECK ("Ψ" == uic[UIC_PATH]); - CHECK ("Φ" == uic[UIC_PATH+1]); + CHECK ("Γ" == uic[UIC_WINDOW]); // window spec to anchor the path + CHECK ("Δ" == uic[UIC_PERSP]); // the perspective used within that window + CHECK ("Θ" == uic[UIC_PANEL]); // the docking panel within the window + CHECK ("Ξ" == uic[UIC_VIEW]); // the view residing in the docking panel + CHECK ("Σ" == uic[UIC_TAB]); // the tab or element group within the view + CHECK ("Ψ" == uic[UIC_PATH]); // a path sequence... + CHECK ("Φ" == uic[UIC_PATH+1]); // ...descending through local widgets CHECK ("Ω" == uic[UIC_PATH+2]); - // iteration matches index order + // iteration of complete path matches index order uint i=0; for (UICoord::iterator ii = uic.begin(); ii; ++ii, ++i) CHECK (uic[i] == *ii); @@ -119,8 +126,8 @@ namespace test { // string representation CHECK ("UI:Γ[Δ]-Θ.Ξ.Σ/Ψ/Φ/Ω" == string(uic)); - CHECK ("Γ[Δ]-Θ.Ξ.Σ" == uic.getComp()); - CHECK ("Ψ/Φ/Ω" == uic.getPath()); + CHECK ( "Γ[Δ]-Θ.Ξ.Σ" == uic.getComp()); + CHECK ( "Ψ/Φ/Ω" == uic.getPath()); // new value can be assigned, but not altered in place uic = UICoord{nullptr,nullptr,"Θ",nullptr,"Σ",nullptr,"Φ"}; @@ -143,8 +150,8 @@ namespace test { verify_builder() { UICoord uic1 = UICoord::window("window"); - UICoord uic2 = uic1.view("view"); - CHECK ("UI:window" == string(uic1)); + UICoord uic2 = uic1.view("view"); // Note: does not alter uic1 + CHECK ("UI:window" == string(uic1)); CHECK ("UI:window[*]-*.view" == string(uic2)); CHECK (1 == uic1.size()); CHECK (4 == uic2.size()); @@ -168,6 +175,7 @@ namespace test { VERIFY_ERROR (INDEX_BOUNDS, uic1[UIC_PERSP]); VERIFY_ERROR (INDEX_BOUNDS, uic2[UIC_TAB]); + // partial (incomplete) coordinate spec UICoord uic3 = UICoord().view("view"); CHECK (4 == uic3.size()); CHECK ("UI:?.view" == string(uic3)); @@ -176,9 +184,9 @@ namespace test { CHECK ("" == uic3.getPanel()); CHECK ("view" == uic3.getView()); - UICoord uic4 = uic3.persp("persp"); + UICoord uic4 = uic3.persp("perspective"); CHECK (4 == uic4.size()); - CHECK ("UI:?[persp]-*.view" == string(uic4)); + CHECK ("UI:?[perspective]-*.view" == string(uic4)); uic4 = uic3.append("tab"); CHECK (5 == uic4.size()); @@ -269,6 +277,11 @@ namespace test { CHECK ("?-panel.*.*" == uic.getComp()); CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + uic = uic.tab(8); + CHECK ("UI:?-panel.*.#8/α/β/γ/δ/ε/λ/ον" == string(uic)); + CHECK ("?-panel.*. " == uic.getComp()); + CHECK ("α/β/γ/δ/ε/λ/ον" == uic.getPath()); + uic = uic.tab(" "); CHECK ("UI:?-panel.*. /α/β/γ/δ/ε/λ/ον" == string(uic)); CHECK ("?-panel.*. " == uic.getComp()); diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 7327fddf0..addeec73c 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -9615,7 +9615,7 @@ The dispatch of //diff messages// is directly integrated into the UI-Bus -- whic The Graphical User interface, the upper layer in this hierarchy, embodies everything of tangible relevance to the user working with the application. The interplay with Proc-Layer, the middle layer below the UI, is organised along the distinction between two realms of equal importance: on one side, there is the immediate //mechanics of the interface,// which is implemented directly within the ~UI-Layer, based on the Graphical User Interface Toolkit. And, on the other side, there are those //core concerns of working with media,// which are cast into the HighLevelModel at the heart of the middle layer. -
+
//A topological addressing scheme to designate structural locations within the UI.//
 Contrary to conventional screen pixel coordinates, here we aim at a topological description of the UI structure. Such a framework of structural reference allows us                                                                     
 * to refer to some "place" or "space" within the interface                                    
@@ -9652,13 +9652,13 @@ Internally the coordinate resolver in turn relies on a context query interface,
 In addition to the //locally decidable properties// of a coordinate spec, which are the explicitness and the presence of some component, several contextual predications may be queried 
 ;anchorage
 :the way the given coordinate spec is or can be anchored
-:* it is already //explicitly anchored// and this anchorage can be covered and backed by the currently existing UI configuration
+:* it is already //explicitly anchored// by referring either to a specific window or by generic specification
 :* it //can be a anchored// by interpolation of some wildcards
 :* it is //incomplete// and need to be extended to allow anchoring
 :* it is //impossible to anchor// in the current UI configuration
 ;coverage
 :the extent to which a given coordinate spec is backed by the actual UI configuration
-:please note: to determine the coverage, the spec need to anchored (either explicitly, or by interpolation, or by extension of an incomplete spec)
+:please note: to determine the coverage, the spec needs to be anchored (either explicitly, or by interpolation, or by extension of an incomplete spec)
 :* it is //completely covered//
 :* it is //partially covered// with an remaining, uncovered extension part
 :* it is //possible to cover completely//
@@ -9666,11 +9666,11 @@ In addition to the //locally decidable properties// of a coordinate spec, which
 !!!Mutations
 In addition to querying the interpretation of a given coordinate spec with respect to the current UI environment, it is also possible to rewrite or extend the spec based on this environment
 ;anchoring
-:in correspondence to the possible states of anchorage, we may derived an explicitly anchored spec
+:in correspondence to the possible states of anchorage, we may derive an explicitly anchored spec
 :*by interpolating the given spec
-:*by interpolation and extension of the given spec
+:*by interpretation and extension of the given spec
 ;covering
-:we may construct the covered part of a given spec, including automatic anchoring.
+:we may construct the covered part of a given spec, which includes automatic anchoring.
 ;navigating
 :we may rewrite a given spec by navigating within the existing UI environment
 :as starting point, the coordinate spec need to be anchored and completely covered
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 341d36b66..518ce256b 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -1379,7 +1379,7 @@
 
 
 
-
+
 
 
 
@@ -3572,7 +3572,8 @@
 
 
 
-
+
+
 
 
 
@@ -3826,7 +3827,7 @@
 
 
 
-
+
 
 
 
@@ -3939,7 +3940,8 @@
 
 
 
-
+
+
 
 
 
@@ -3950,6 +3952,24 @@
 
 
 
+
+
+  
+    
+  
+  
+    

+ Integration +

+

+ Resolver / Navigator +

+ + +
+ + +
@@ -3970,8 +3990,8 @@
- - + + @@ -4584,7 +4604,7 @@ - + @@ -4798,27 +4818,19 @@ + + + + + - - - + + - - - - - - - - - - - - @@ -4843,6 +4855,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -5051,7 +5084,7 @@ - + @@ -5063,7 +5096,7 @@ - + @@ -6470,8 +6503,8 @@ - - + + @@ -6479,7 +6512,7 @@ - + @@ -13111,6 +13144,12 @@ + + + + + +