UI-Coordinates: polish test and consider next steps

After completing the self-contained UICoord data elements,
the next thing to consider might be how to resolve UI coordinates
against an actual window topology. We need to define a suitable
command-and-query interface in order to build and verify this
intricate resolution process separated from the actual UI code.
This commit is contained in:
Fischlurch 2017-10-02 18:11:21 +02:00
parent 5c113b058d
commit 18d1e7a280
5 changed files with 607 additions and 53 deletions

View file

@ -0,0 +1,106 @@
/*
UI-COORD-RESOLVER.hpp - resolve UI coordinate spec against actual window topology
Copyright (C) Lumiera.org
2017, Hermann Vosseler <Ichthyostega@web.de>
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 <boost/noncopyable.hpp>
//#include <string>
//#include <vector>
//#include <utility>
//#include <memory>
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*/

View file

@ -0,0 +1,396 @@
/*
UICoordResolver(Test) - resolve UI coordinates against actual topology
Copyright (C) Lumiera.org
2017, Hermann Vosseler <Ichthyostega@web.de>
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 <string>
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

View file

@ -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());

View file

@ -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.</pre>
</div>
<div title="UICoord" creator="Ichthyostega" modifier="Ichthyostega" created="201709222300" modified="201710011858" tags="def draft spec GuiPattern" changecount="6">
<div title="UICoord" creator="Ichthyostega" modifier="Ichthyostega" created="201709222300" modified="201710021428" tags="def draft spec GuiPattern" changecount="11">
<pre>//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 &quot;place&quot; or &quot;space&quot; 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

View file

@ -1379,7 +1379,7 @@
<node CREATED="1501939240217" ID="ID_325602880" MODIFIED="1501939252187" TEXT="triggert Proc-Command"/>
<node CREATED="1501939252991" ID="ID_31140909" MODIFIED="1501939261802" TEXT="dieses sendet Mark zur&#xfc;ck"/>
<node CREATED="1501939263030" ID="ID_381890207" MODIFIED="1501939271161" TEXT="ein Widget im UI reagiert">
<node CREATED="1504200793444" ID="ID_340215113" MODIFIED="1504478476617" TEXT="mi&#xdf;brauche InfoBox">
<node CREATED="1504200793444" ID="ID_340215113" MODIFIED="1506957535426" TEXT="mi&#xdf;brauche InfoBox">
<arrowlink COLOR="#f5dd67" DESTINATION="ID_19179662" ENDARROW="Default" ENDINCLINATION="743;-1563;" ID="Arrow_ID_1195014928" STARTARROW="None" STARTINCLINATION="-452;605;"/>
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504200974955" ID="ID_1182589184" MODIFIED="1504200979244" TEXT="neues Dock">
@ -3572,7 +3572,8 @@
<node CREATED="1506176108473" ID="ID_241520424" MODIFIED="1506176114467" TEXT="Interpretation"/>
<node CREATED="1506176114984" ID="ID_332155493" MODIFIED="1506176117235" TEXT="Abgleich"/>
</node>
<node CREATED="1506175984577" ID="ID_610939878" MODIFIED="1506175987228" TEXT="im Resolver">
<node CREATED="1506175984577" HGAP="25" ID="ID_610939878" MODIFIED="1506957372981" TEXT="im Resolver" VSHIFT="-1">
<arrowlink COLOR="#65759f" DESTINATION="ID_1878859300" ENDARROW="Default" ENDINCLINATION="-439;-594;" ID="Arrow_ID_68163828" STARTARROW="None" STARTINCLINATION="307;351;"/>
<node CREATED="1506176010590" ID="ID_901285927" MODIFIED="1506176067906" TEXT="Kontext-Infos">
<node CREATED="1506176024596" ID="ID_1050302466" MODIFIED="1506176028175" TEXT="Aktuelles Fenster"/>
<node CREATED="1506176028787" ID="ID_1768321192" MODIFIED="1506176037158" TEXT="existierende">
@ -3826,7 +3827,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181068556" ID="ID_749871444" MODIFIED="1506181084051" TEXT="UICoord">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1506181721910" FOLDED="true" ID="ID_1680105436" MODIFIED="1506831506238" TEXT="Folge von Symbolen">
<node COLOR="#338800" CREATED="1506181721910" FOLDED="true" ID="ID_1680105436" MODIFIED="1506956411552" TEXT="Folge von Symbolen">
<icon BUILTIN="button_ok"/>
<node CREATED="1506263953722" ID="ID_1293486815" MODIFIED="1506831482410" TEXT="Basis-Abstraktion">
<icon BUILTIN="info"/>
@ -3939,7 +3940,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181073556" ID="ID_1878859300" MODIFIED="1506181084811" TEXT="Resolver">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181073556" ID="ID_1878859300" MODIFIED="1506957351600" TEXT="Resolver">
<linktarget COLOR="#65759f" DESTINATION="ID_1878859300" ENDARROW="Default" ENDINCLINATION="-439;-594;" ID="Arrow_ID_68163828" SOURCE="ID_610939878" STARTARROW="None" STARTINCLINATION="307;351;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506181794428" ID="ID_333406817" MODIFIED="1506181807435" TEXT="Setup">
<icon BUILTIN="flag-yellow"/>
@ -3950,6 +3952,24 @@
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1506957414370" ID="ID_848105210" MODIFIED="1506957613469">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Integration
</p>
<p>
Resolver / Navigator
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" SOURCE="ID_1256149179" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1506175097367" ID="ID_1442345755" MODIFIED="1506181085379" TEXT="ViewSpec-DSL">
<arrowlink COLOR="#b45c5a" DESTINATION="ID_686917529" ENDARROW="Default" ENDINCLINATION="-468;-196;" ID="Arrow_ID_1955094318" STARTARROW="None" STARTINCLINATION="360;85;"/>
@ -3970,8 +3990,8 @@
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1506181908037" HGAP="-29" ID="ID_1925951134" MODIFIED="1506182045240" TEXT="Test" VSHIFT="21">
<icon BUILTIN="stop"/>
<node CREATED="1506181908037" HGAP="-29" ID="ID_1925951134" MODIFIED="1506956365444" TEXT="Test" VSHIFT="21">
<icon BUILTIN="prepare"/>
<node CREATED="1506181922767" ID="ID_1642380411" MODIFIED="1506181922767" TEXT="UICoord_test">
<node COLOR="#338800" CREATED="1506182009518" ID="ID_138248232" MODIFIED="1506906630089" TEXT="verify_basics">
<icon BUILTIN="button_ok"/>
@ -4584,7 +4604,7 @@
<node CREATED="1486763385591" ID="ID_6651258" MODIFIED="1486763391202" TEXT="Zugang zum Asset-Management"/>
<node CREATED="1486763391862" ID="ID_1568245541" MODIFIED="1486763397977" TEXT="Zugang zur Konfiguration"/>
<node CREATED="1486763408780" ID="ID_520762274" MODIFIED="1486763417950" TEXT="Zugang zum persistenten Interface-State"/>
<node CREATED="1504371285442" ID="ID_634013434" MODIFIED="1504386979259" TEXT="Allokation von ComponentViews">
<node CREATED="1504371285442" ID="ID_634013434" MODIFIED="1506957035235" TEXT="Allokation von ComponentViews">
<arrowlink DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="87;-34;" ID="Arrow_ID_1863964331" STARTARROW="None" STARTINCLINATION="157;10;"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1486768073223" HGAP="38" ID="ID_1457876217" MODIFIED="1488566292402" TEXT="konkret" VSHIFT="16">
@ -4798,27 +4818,19 @@
</node>
<node CREATED="1487461242609" ID="ID_164538059" MODIFIED="1487461245308" TEXT="Struktur">
<node CREATED="1487461304560" ID="ID_349728972" MODIFIED="1488492188626" TEXT="betreibt">
<node CREATED="1487273437019" ID="ID_1653934212" MODIFIED="1506956689947" TEXT="Navigator">
<node CREATED="1506957512565" ID="ID_1256149179" MODIFIED="1506957613469" TEXT="betreibt Resolver">
<arrowlink COLOR="#3f4b87" DESTINATION="ID_848105210" ENDARROW="Default" ENDINCLINATION="-1260;542;" ID="Arrow_ID_1760927309" STARTARROW="None" STARTINCLINATION="1244;-591;"/>
</node>
</node>
<node CREATED="1487270206369" ID="ID_1888334597" MODIFIED="1487461321289" TEXT="SpotLocator"/>
<node CREATED="1487273437019" ID="ID_1653934212" MODIFIED="1487461312002" TEXT="Navigator"/>
<node CREATED="1487275297855" ID="ID_898365328" MODIFIED="1487461316314" TEXT="FocusTracker"/>
<node CREATED="1504368969990" ID="ID_948587913" MODIFIED="1504386990881" TEXT="ViewLocator">
<linktarget COLOR="#7f97bd" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_954883780" SOURCE="ID_1747666798" STARTARROW="None" STARTINCLINATION="1159;303;"/>
<node CREATED="1504368969990" ID="ID_948587913" MODIFIED="1506957107818" TEXT="ViewLocator">
<arrowlink COLOR="#9da9b7" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-96;-128;" ID="Arrow_ID_17315740" STARTARROW="None" STARTINCLINATION="-94;5;"/>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="87;-34;" ID="Arrow_ID_1863964331" SOURCE="ID_634013434" STARTARROW="None" STARTINCLINATION="157;10;"/>
<linktarget COLOR="#7c8aa8" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-592;150;" ID="Arrow_ID_1156487076" SOURCE="ID_869653682" STARTARROW="None" STARTINCLINATION="641;-106;"/>
<node CREATED="1504370345039" ID="ID_1018366676" MODIFIED="1504370348218" TEXT="Service"/>
<node CREATED="1504373189956" ID="ID_1625042163" MODIFIED="1504373207181" TEXT="intern direkt verdrahtet mit dem PanelLocator"/>
<node CREATED="1504370354446" ID="ID_1714266927" MODIFIED="1504370416721" TEXT="findet, ggfs alloziert einen ComponentView"/>
<node CREATED="1504387078950" ID="ID_1433555277" MODIFIED="1504387097144" TEXT="bietet Komponenten-Management">
<node CREATED="1504387105363" ID="ID_631730744" MODIFIED="1504387110342" TEXT="neue Komponente"/>
<node CREATED="1504387110866" ID="ID_879632055" MODIFIED="1504387115157" TEXT="Komponente l&#xf6;schen"/>
<node CREATED="1504387189744" ID="ID_934669703" MODIFIED="1504387202285" TEXT="notwendig f&#xfc;r Kind-Mutation">
<icon BUILTIN="info"/>
</node>
<node CREATED="1504368969990" ID="ID_1346454848" MODIFIED="1504387179279" TEXT="impl delegiert an den PanelLocator">
<linktarget COLOR="#7c8aa8" DESTINATION="ID_1346454848" ENDARROW="None" ENDINCLINATION="139;18;" ID="Arrow_ID_1776804306" SOURCE="ID_1606296935" STARTARROW="Default" STARTINCLINATION="425;-69;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1487461353681" ID="ID_1117222917" MODIFIED="1488492194073" TEXT="Modell">
@ -4843,6 +4855,27 @@
</node>
</node>
</node>
<node CREATED="1506956798915" HGAP="-73" ID="ID_1897228503" MODIFIED="1506956825070" TEXT="Services" VSHIFT="32">
<node CREATED="1506956866802" ID="ID_652269096" MODIFIED="1506956900479" TEXT="Navigator"/>
<node CREATED="1504368969990" ID="ID_344392695" MODIFIED="1506957099012" TEXT="ViewLocator">
<linktarget COLOR="#7f97bd" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_1627222173" SOURCE="ID_1747666798" STARTARROW="None" STARTINCLINATION="1159;303;"/>
<linktarget COLOR="#7c8aa8" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-676;143;" ID="Arrow_ID_1224269755" SOURCE="ID_869653682" STARTARROW="None" STARTINCLINATION="641;-106;"/>
<linktarget COLOR="#9da9b7" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-96;-128;" ID="Arrow_ID_17315740" SOURCE="ID_948587913" STARTARROW="None" STARTINCLINATION="-94;5;"/>
<node CREATED="1504387078950" ID="ID_1433555277" MODIFIED="1504387097144" TEXT="bietet Komponenten-Management">
<node CREATED="1504387105363" ID="ID_631730744" MODIFIED="1504387110342" TEXT="neue Komponente"/>
<node CREATED="1504387110866" ID="ID_879632055" MODIFIED="1504387115157" TEXT="Komponente l&#xf6;schen"/>
<node CREATED="1504387189744" ID="ID_934669703" MODIFIED="1504387202285" TEXT="notwendig f&#xfc;r Kind-Mutation">
<icon BUILTIN="info"/>
</node>
<node CREATED="1504368969990" ID="ID_1346454848" MODIFIED="1504387179279" TEXT="impl delegiert an den PanelLocator">
<linktarget COLOR="#7c8aa8" DESTINATION="ID_1346454848" ENDARROW="None" ENDINCLINATION="139;18;" ID="Arrow_ID_1776804306" SOURCE="ID_1606296935" STARTARROW="Default" STARTINCLINATION="425;-69;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1506956871401" ID="ID_1817966830" MODIFIED="1506956891024" TEXT="SpotLocator"/>
<node CREATED="1506956892303" ID="ID_238906242" MODIFIED="1506956898082" TEXT="FocusTracker"/>
</node>
</node>
<node CREATED="1485126466520" ID="ID_717310004" MODIFIED="1488423306865" TEXT="WindowManager" VSHIFT="34">
<icon BUILTIN="button_cancel"/>
@ -5051,7 +5084,7 @@
</html>
</richcontent>
</node>
<node CREATED="1504371342426" ID="ID_869653682" MODIFIED="1504387002927">
<node CREATED="1504371342426" ID="ID_869653682" MODIFIED="1506957062518">
<richcontent TYPE="NODE"><html>
<head>
@ -5063,7 +5096,7 @@
</body>
</html>
</richcontent>
<arrowlink COLOR="#7c8aa8" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-592;150;" ID="Arrow_ID_1156487076" STARTARROW="None" STARTINCLINATION="641;-106;"/>
<arrowlink COLOR="#7c8aa8" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-676;143;" ID="Arrow_ID_1224269755" STARTARROW="None" STARTINCLINATION="641;-106;"/>
</node>
</node>
</node>
@ -6470,8 +6503,8 @@
<node CREATED="1504368500421" ID="ID_184425569" MODIFIED="1504368925887" TEXT="es gibt einen PanelLocator im WindowLocator">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1504368540111" ID="ID_1747666798" MODIFIED="1504386996704" TEXT="es gibt einen ViewLocator im InteractionDirector">
<arrowlink COLOR="#7f97bd" DESTINATION="ID_948587913" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_954883780" STARTARROW="None" STARTINCLINATION="1159;303;"/>
<node CREATED="1504368540111" ID="ID_1747666798" MODIFIED="1506957054528" TEXT="es gibt einen ViewLocator im InteractionDirector">
<arrowlink COLOR="#7f97bd" DESTINATION="ID_344392695" ENDARROW="Default" ENDINCLINATION="-977;81;" ID="Arrow_ID_1627222173" STARTARROW="None" STARTINCLINATION="1159;303;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504200512737" ID="ID_320931452" MODIFIED="1504200533688" TEXT="M&#xfc;llhaufen">
@ -6479,7 +6512,7 @@
</node>
<node CREATED="1504200743610" ID="ID_1973994759" MODIFIED="1504200749701" TEXT="vorl&#xe4;ufig....">
<node CREATED="1504200750905" ID="ID_1728645080" MODIFIED="1504200758236" TEXT="gibt es noch eine ZombieTimeline"/>
<node CREATED="1504200758920" ID="ID_19179662" MODIFIED="1504478476617" TEXT="hab ich schon mal eine InfoBox dazugebaut">
<node CREATED="1504200758920" ID="ID_19179662" MODIFIED="1506957535426" TEXT="hab ich schon mal eine InfoBox dazugebaut">
<linktarget COLOR="#f5dd67" DESTINATION="ID_19179662" ENDARROW="Default" ENDINCLINATION="743;-1563;" ID="Arrow_ID_1195014928" SOURCE="ID_340215113" STARTARROW="None" STARTINCLINATION="-452;605;"/>
<node CREATED="1504200878312" ID="ID_1934842950" MODIFIED="1504201022642" TEXT="...f&#xfc;r #1099 DemoGuiRoundtrip">
<richcontent TYPE="NOTE"><html>
@ -13111,6 +13144,12 @@
<node CREATED="1504463067051" ID="ID_1393457815" MODIFIED="1504463076837" TEXT="Komponente.Komponente..."/>
</node>
</node>
<node CREATED="1506956495003" ID="ID_364730867" MODIFIED="1506956499822" TEXT="konktete Topologie">
<node CREATED="1506956525336" ID="ID_344871464" MODIFIED="1506956531880" TEXT="stateful"/>
<node CREATED="1506956501474" ID="ID_905779000" MODIFIED="1506956515389" TEXT="zug&#xe4;nglich duch Navigator">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
</node>