Commands: draft the changes to be done with command instance management
...as consequence to be drawn from the design critique
This commit is contained in:
parent
730f559ab2
commit
67e1032f7d
6 changed files with 256 additions and 33 deletions
|
|
@ -60,6 +60,7 @@
|
|||
#include "lib/error.hpp"
|
||||
#include "proc/control/command.hpp"
|
||||
#include "proc/control/command-dispatch.hpp"
|
||||
#include "lib/diff/gen-node.hpp"
|
||||
#include "lib/symbol.hpp"
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
|
@ -73,6 +74,7 @@ namespace control {
|
|||
|
||||
using std::string;
|
||||
using lib::Symbol;
|
||||
using lib::diff::Rec;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -107,6 +109,7 @@ namespace control {
|
|||
Symbol newInstance (Symbol prototypeID, string const& invocationID);
|
||||
Command getInstance(Symbol instanceID);
|
||||
void dispatch (Symbol instanceID);
|
||||
void bindAndDispatch (Symbol instanceID, Rec const& argSeq);
|
||||
|
||||
bool contains (Symbol instanceID) const;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -252,6 +252,24 @@ namespace control {
|
|||
}
|
||||
|
||||
|
||||
/** fire and forget anonymous command instance.
|
||||
* This is a simplified interface, allowing to create a clone instance
|
||||
* from a global command definition (prototype), bind the arguments and
|
||||
* pass this instance to the dispatcher in one shot. To integrate with the
|
||||
* extended usage cycle, as a variation the given ID may indicate a previously
|
||||
* opened instance, which will then be bound and dispatched likewise.
|
||||
* @param instanceID global commandID or previously opened local instanceID
|
||||
* @param argSeq command argument tuple packaged as Record<GenNode>, which
|
||||
* is the standard format [sent](BusTerm::act(GenNode)) for
|
||||
* command execution via [UI-bus](ui-bus.hpp)
|
||||
*/
|
||||
void
|
||||
CommandInstanceManager::bindAndDispatch (Symbol instanceID, Rec const& argSeq)
|
||||
{
|
||||
UNIMPLEMENTED ("fire and forget anonymous instance");
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
CommandInstanceManager::contains (Symbol instanceID) const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -91,6 +91,14 @@ namespace test {
|
|||
return elm == ref;
|
||||
});
|
||||
}
|
||||
|
||||
void
|
||||
invokeAll()
|
||||
{
|
||||
for (Command& cmd : queue_)
|
||||
cmd();
|
||||
clear();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -108,9 +116,10 @@ namespace test {
|
|||
{
|
||||
|
||||
virtual void
|
||||
run (Arg)
|
||||
run (Arg)
|
||||
{
|
||||
verify_standardUsage();
|
||||
verify_simpleUsage();
|
||||
verify_extendedUsage();
|
||||
verify_instanceIdentity();
|
||||
verify_duplicates();
|
||||
verify_lifecycle();
|
||||
|
|
@ -118,9 +127,49 @@ namespace test {
|
|||
}
|
||||
|
||||
|
||||
/** @test demonstrate the command instance standard usage pattern.*/
|
||||
/** @test demonstrate the transparent instance generation (»fire and forget«)
|
||||
* - when just specifying a global commandID and arguments, an anonymous
|
||||
* instance will be created on-the-fly, bound and dispatched, without
|
||||
* leaving any traces in the global or local registry
|
||||
* - when dispatching a global commandID, where the corresponding
|
||||
* prototype entry is already fully bound and ready for execution,
|
||||
* likewise an anonymous clone copy is created and dispatched.
|
||||
* @remarks these simplified use cases cover a large fraction of all usages,
|
||||
* and most notably, the internal registry embedded within the
|
||||
* CommandInstanceManager won't be used at all. */
|
||||
void
|
||||
verify_standardUsage()
|
||||
verify_simpleUsage()
|
||||
{
|
||||
Fixture fixture;
|
||||
CommandInstanceManager iManager{fixture};
|
||||
CHECK (not iManager.contains (COMMAND_PROTOTYPE));
|
||||
|
||||
int r1{rand()%1000}, r2{rand()%2000};
|
||||
command1::check_ = 0; // commands will add to this on invocation
|
||||
|
||||
iManager.bindAndDispatch (COMMAND_PROTOTYPE, {23});
|
||||
CHECK (not iManager.contains (COMMAND_PROTOTYPE));
|
||||
|
||||
Command com{COMMAND_PROTOTYPE};
|
||||
com.bind(r2);
|
||||
CHECK (com.canExec());
|
||||
|
||||
iManager.dispatch (COMMAND_PROTOTYPE);
|
||||
CHECK (not iManager.contains (COMMAND_PROTOTYPE));
|
||||
|
||||
// an anonymous clone instance was dispatched,
|
||||
// thus re-binding the arguments won't interfere with execution
|
||||
com.bind(-1);
|
||||
|
||||
CHECK (command1::check_ == 0); // nothing invoked yet
|
||||
fixture.invokeAll();
|
||||
CHECK (command1::check_ == r1 + r2); // both instances were invoked with their specific arguments
|
||||
}
|
||||
|
||||
|
||||
/** @test demonstrate the complete command instance usage pattern.*/
|
||||
void
|
||||
verify_extendedUsage()
|
||||
{
|
||||
Fixture fixture;
|
||||
CommandInstanceManager iManager{fixture};
|
||||
|
|
@ -137,9 +186,14 @@ namespace test {
|
|||
CHECK (fixture.contains (cmd));
|
||||
CHECK (not iManager.contains (instanceID));
|
||||
VERIFY_ERROR (LIFECYCLE, iManager.getInstance (instanceID));
|
||||
|
||||
command1::check_ = 0;
|
||||
fixture.invokeAll();
|
||||
CHECK (command1::check_ == 42); // the dispatched instance was executed
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @test relation of command, instanceID and concrete instance
|
||||
* The CommandInstanceManager provides the notion of a _current instance,_
|
||||
* which can then be used to bind arguments. When done, it will be _dispatched,_
|
||||
|
|
@ -269,11 +323,9 @@ namespace test {
|
|||
VERIFY_ERROR (DUPLICATE_COMMAND, iManager.newInstance (COMMAND_PROTOTYPE, "i1"));
|
||||
VERIFY_ERROR (DUPLICATE_COMMAND, iManager.newInstance (COMMAND_PROTOTYPE, "i2"));
|
||||
|
||||
Command c11 = iManager.getInstance (i1);
|
||||
c11.bind(-1);
|
||||
iManager.dispatch (i1);
|
||||
iManager.bindAndDispatch (i1, Rec{-1}); // bind and dispatch i1, thus i1 is ready for new cycle
|
||||
|
||||
iManager.newInstance (COMMAND_PROTOTYPE, "i1");
|
||||
iManager.newInstance (COMMAND_PROTOTYPE, "i1"); // open new cycle for i1
|
||||
VERIFY_ERROR (DUPLICATE_COMMAND, iManager.newInstance (COMMAND_PROTOTYPE, "i2"));
|
||||
|
||||
CHECK (iManager.getInstance (i1));
|
||||
|
|
@ -342,7 +394,11 @@ namespace test {
|
|||
CHECK (not fixture.contains(cmd));
|
||||
|
||||
iManager.dispatch (COMMAND_PROTOTYPE);
|
||||
CHECK (fixture.contains(cmd));
|
||||
CHECK (not fixture.contains(cmd)); // because a clone copy was dispatched
|
||||
|
||||
command1::check_ = 0;
|
||||
fixture.invokeAll();
|
||||
CHECK (command1::check_ == -12); // the clone copy was executed
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -306,7 +306,6 @@ namespace test {
|
|||
SessionCommand::facade().trigger (commandMsg.idi.getSym(), commandMsg.data.get<Rec>());
|
||||
|
||||
__DELAY__
|
||||
CHECK (Command::canUndo(COMMAND_I2));
|
||||
CHECK (testCommandState - prevState == Time(FSecs(3,2))); // execution added 2500ms -2*500ms == 1.5sec
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2668,7 +2668,7 @@ This contrastive approach attempts to keep knowledge and definition clustered in
|
|||
&rarr; CommandSetup
|
||||
</pre>
|
||||
</div>
|
||||
<div title="GuiCommandCycle" creator="Ichthyostega" modifier="Ichthyostega" created="201703031817" modified="201704131647" tags="design operational GuiPattern GuiIntegration draft discuss img" changecount="55">
|
||||
<div title="GuiCommandCycle" creator="Ichthyostega" modifier="Ichthyostega" created="201703031817" modified="201704160028" tags="design operational GuiPattern GuiIntegration draft discuss img" changecount="60">
|
||||
<pre>//the process of issuing a session command from the UI//
|
||||
Within the Lumiera UI, we distinguish between core concerns and the //local mechanics of the UI.// The latter is addressed in the usual way, based on a variation of the [[MVC-Pattern|http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller]]. The UI toolkit set, here the GTK, affords ample ways to express actions and reactions within this framework, where widgets in the presentation view are wired with the corresponding controllers vice versa (GTK terms these connections as //"signals"//, we rely on {{{libSigC++}}} for implementation).
|
||||
A naive approach would extend these mature mechanisms to also cover the actual functionality of the application. This compelling solution allows quickly to get "something tangible" up and running, yet -- on the long run -- inevitably leads to core concerns being tangled into the presentation layer, which in turn becomes hard to maintain and loaded with "code behind". Since we are here "for the long run", we immediately draw the distinction between UI mechanics and core concerns. The latter are, by decree and axiom, required to perform without even an UI layer running. This decision gives rise to the challenge how to form and integrate the invocation of ''core commands'' into the presentation layer.
|
||||
|
|
@ -2698,20 +2698,29 @@ from these use cases, we can derive the //crucial activities for command handlin
|
|||
|
||||
!command invocation protocol
|
||||
* at start-up, command definitions are created in Proc, hard wired
|
||||
* ~UI-Elements know the basic ~Command-IDs relevant to their functionality. These are defined in some central header
|
||||
* when command usage is indicated, some part in the UI queries the {{{CmdAccess}}} for an InteractionState
|
||||
* the latter in turn retrieves a new command instance ID from the {{{CmdInstanceManager}}} in Proc
|
||||
* and the latter keeps a smart-ptr corresponding to this instance in its internal registration table
|
||||
* within the UI, a command instance corresponds to a specific invocation trail, and is thus stored within the managing {{{InteractionState}}}
|
||||
* ~UI-Elements use the services of {{{CmdAccess}}}, either to get arguments directly, or to act as observer of state changes &rarr; GuiCommandAccess
|
||||
* when a command is completely parametrised, it can be invoked. The managing {{{InteractionState}}} knows about this
|
||||
* on invocation, the ID of the instance is sent via UI-Bus to the {{{CmdInstanceManager}}}
|
||||
* which in turn removes the instance handle from its registration table and hands it over into the ProcDispatcher
|
||||
* only the {{{CmdInstanceManager}}} need to know about this actual command instance; there is no global registration
|
||||
* ~UI-Elements know the basic ~Command-IDs relevant to their functionality. These are &rarr; [[defined in some central header|CommandSetup]]
|
||||
* command usage may happen either as simple direct invocation, or as part of an elaborate argument forming process within a context.<br/>thus we have to distinguish two usage patterns
|
||||
*;fire and forget
|
||||
*:a known command is triggered with likewise known arguments
|
||||
*:* just the global ~Command-ID (ID of the prototype) is sent over the UI-Bus, together with the arguments
|
||||
*:* the {{{CmdInstanceManager}}} in Proc creates an anonymous clone copy instance from the prototype
|
||||
*:* arguments are bound and the instance is handed over into the ProcDispatcher, without any further registration
|
||||
*;context bound
|
||||
*:invocation of a command is formed within a context, typically through a //interaction gesture.//
|
||||
*:most, if not all arguments of the command are picked up from the context, based on the current [[Spot]]
|
||||
*:* on setup of such an invocation context, the responsible part in the UI queries the {{{CmdAccess}}} for an InteractionState
|
||||
*:* the latter in turn retrieves a new command instance ID from the {{{CmdInstanceManager}}} in Proc
|
||||
*:* and the latter keeps a smart-ptr corresponding to this instance in its internal registration table
|
||||
*:* within the UI, the InteractionState instance responsible for this context tracks state changes and keeps track of all command instances bound to this context
|
||||
*:* ~UI-Elements use the services of {{{CmdAccess}}} to act as observer of state changes &rarr; GuiCommandAccess
|
||||
*:* when a command is completely parametrised, it can be invoked. The managing {{{InteractionState}}} knows about this
|
||||
*:* on invocation, the ID of the instance and the fully resolved arguments are sent via UI-Bus to the {{{CmdInstanceManager}}}
|
||||
*:* which in turn removes the instance handle from its registration table and hands it over into the ProcDispatcher
|
||||
* in any case, only the {{{CmdInstanceManager}}} need to know about this actual command instance; there is no global registration
|
||||
[<img[Access to Session Commands from UI|uml/Command-ui-access.png]]
|
||||
An immediate consequence is that command instances will be formed //per instance// of InteractionState. Each distinct kind of control system has its own instances, which are kept around, until they are ready for invocation. Each invocation "burns" an instance -- on next access, a new instance ID will be allocated, and the next command invocation cycle starts...
|
||||
An immediate consequence is that command instances may be formed //per instance// of InteractionState. Each distinct kind of control system has its own instances, which are kept around, until they are ready for invocation. Each invocation "burns" an instance -- on next access, a new instance ID will be allocated, and the next command invocation cycle starts...
|
||||
|
||||
Command instances are like prototypes -- thus each additional level of differentiation will create a clone copy and decorate the basic command ID. Yet this extension process is delegated into multiple stages. Already when a specific InvocationTrail is established, the bare command prototype is specialised, and additionally combined with specific context access rules and maybe even a accessor to retrieve some argument value. The {{{CmdInstanceManager}}} internally maintains and tracks a prepared anonymous command instance within a local registration table. The //smart-handle//-nature of command instance is enough to keep concurrently existing instances apart; instances might be around for an extended period, because commands are enqueued with the ProcDispatcher.
|
||||
Command instances are like prototypes -- thus each additional level of differentiation will create a clone copy and decorate the basic command ID. This is necessary, since the same command may be used and parametrised differently at various places in the UI. If necessary, the {{{CmdInstanceManager}}} internally maintains and tracks a prepared anonymous command instance within a local registration table. The //smart-handle//-nature of command instance is enough to keep concurrently existing instances apart; instances might be around for an extended period, because commands are enqueued with the ProcDispatcher.
|
||||
|
||||
''command definition'':
|
||||
&rarr; Command scripts are defined in translation units in {{{proc/cmd}}}
|
||||
|
|
|
|||
|
|
@ -2319,8 +2319,8 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1489777837120" ID="ID_466927949" MODIFIED="1489777843659" TEXT="Ort für Command-Definitionen"/>
|
||||
<node CREATED="1489777846095" ID="ID_1401258681" MODIFIED="1489778075369" TEXT="Design Proc-Command-Framework vorantreiben">
|
||||
<arrowlink COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="39;-3322;" ID="Arrow_ID_1512127407" STARTARROW="None" STARTINCLINATION="2000;0;"/>
|
||||
<node CREATED="1489777846095" ID="ID_1401258681" MODIFIED="1492294315650" TEXT="Design Proc-Command-Framework vorantreiben">
|
||||
<arrowlink COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-240;-3336;" ID="Arrow_ID_1512127407" STARTARROW="None" STARTINCLINATION="1932;0;"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -11478,7 +11478,7 @@
|
|||
<node CREATED="1488940519518" ID="ID_1875791797" MODIFIED="1488940533992" TEXT="bei nächster Anfrage wird CmdInstanceManager daher neue Instanz anlegen"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1488677859619" HGAP="-15" ID="ID_827179653" MODIFIED="1489191299696" TEXT="Problem: Service-Zugang" VSHIFT="24">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1488677859619" HGAP="-15" ID="ID_827179653" MODIFIED="1492293466151" TEXT="Problem: Service-Zugang" VSHIFT="24">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -11496,7 +11496,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#9f5680" DESTINATION="ID_850989325" ENDARROW="Default" ENDINCLINATION="211;189;" ID="Arrow_ID_1007188680" STARTARROW="None" STARTINCLINATION="912;-974;"/>
|
||||
<linktarget COLOR="#758ba4" DESTINATION="ID_827179653" ENDARROW="Default" ENDINCLINATION="173;83;" ID="Arrow_ID_57938013" SOURCE="ID_1621107057" STARTARROW="None" STARTINCLINATION="550;-93;"/>
|
||||
<linktarget COLOR="#758ba4" DESTINATION="ID_827179653" ENDARROW="Default" ENDINCLINATION="173;83;" ID="Arrow_ID_57938013" SOURCE="ID_1621107057" STARTARROW="None" STARTINCLINATION="384;-135;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1488936835940" ID="ID_1322149090" MODIFIED="1488937388772" TEXT="separates Problem">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -11883,7 +11883,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1491656361886" ID="ID_1269299900" MODIFIED="1491656365558" TEXT="Einbindung">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1491656361886" HGAP="62" ID="ID_1269299900" MODIFIED="1492293109808" TEXT="Einbindung" VSHIFT="12">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1491659172438" HGAP="34" ID="ID_1103739498" MODIFIED="1491757376165" TEXT="in SessionCommandService" VSHIFT="-3">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12053,9 +12053,145 @@
|
|||
</node>
|
||||
<node CREATED="1491659180516" ID="ID_655217923" MODIFIED="1491659189047" TEXT="in CmdAccess"/>
|
||||
</node>
|
||||
<node CREATED="1492293088861" HGAP="28" ID="ID_1660020661" MODIFIED="1492293257532" TEXT="Überarbeitung" VSHIFT="14">
|
||||
<linktarget COLOR="#626a9e" DESTINATION="ID_1660020661" ENDARROW="Default" ENDINCLINATION="-324;0;" ID="Arrow_ID_876356993" SOURCE="ID_220910293" STARTARROW="None" STARTINCLINATION="-687;0;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1492293139398" ID="ID_1274577545" MODIFIED="1492293146721" TEXT="als Folge der Design-Kritik"/>
|
||||
<node CREATED="1492293282803" ID="ID_1858980532" MODIFIED="1492293285150" TEXT="Ziel">
|
||||
<node CREATED="1492293286802" ID="ID_980352671" MODIFIED="1492293292141" TEXT="weitgehend automatisch"/>
|
||||
<node CREATED="1492293292801" ID="ID_556604895" MODIFIED="1492293305099" TEXT="Zyklus muß nicht explizit eröffnet werden"/>
|
||||
<node CREATED="1492293307511" ID="ID_582978700" MODIFIED="1492293317442" TEXT="Instanzen selbst für globale Commands"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1489191252503" ID="ID_1621107057" MODIFIED="1489191308469" TEXT="#1090 Command access for UI-Elements">
|
||||
<arrowlink COLOR="#758ba4" DESTINATION="ID_827179653" ENDARROW="Default" ENDINCLINATION="173;83;" ID="Arrow_ID_57938013" STARTARROW="None" STARTINCLINATION="550;-93;"/>
|
||||
<node CREATED="1492293359944" ID="ID_1367582526" MODIFIED="1492293429410" TEXT="Konsequenzen">
|
||||
<node CREATED="1492293430689" ID="ID_1472205001" MODIFIED="1492293430689" TEXT="weitgehender Verzicht auf Konsistenzprüfungen"/>
|
||||
<node CREATED="1492293588400" ID="ID_1878334690" MODIFIED="1492293883630" TEXT="Binden und Dispatch müssen kombiniert werden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...sonst wird die ganze Sache absurd
|
||||
</p>
|
||||
<p>
|
||||
und unsinnigerweise aufwendig
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1492293433222" ID="ID_1665333497" MODIFIED="1492293442272" TEXT="Registry könnte längerfristig wegfallen"/>
|
||||
</node>
|
||||
<node CREATED="1492293450067" ID="ID_1626482891" MODIFIED="1492293452767" TEXT="Fälle">
|
||||
<node CREATED="1492293499701" ID="ID_1165417078" MODIFIED="1492293504344" TEXT="voller Zyklus">
|
||||
<node CREATED="1492293540943" ID="ID_432796112" MODIFIED="1492293561513">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Instanz <i>öffnen</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1492293553405" ID="ID_1787045274" MODIFIED="1492293557912" TEXT="Instanz herausgeben"/>
|
||||
<node CREATED="1492293563028" ID="ID_713648189" MODIFIED="1492293583853" TEXT="Binden und Feuern"/>
|
||||
</node>
|
||||
<node CREATED="1492293984170" ID="ID_1495091918" MODIFIED="1492293990949" TEXT="fire-and-forget">
|
||||
<node CREATED="1492294004119" ID="ID_1322819026" MODIFIED="1492294029307">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
CommandID <i>und</i> Argumente gegeben
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1492294031035" ID="ID_521535374" MODIFIED="1492294048357" TEXT="anonyme Instanz erzeugen, aber nicht speichern"/>
|
||||
<node CREATED="1492294049089" ID="ID_631979849" MODIFIED="1492294052148" TEXT="Argumente binden"/>
|
||||
<node CREATED="1492294052616" ID="ID_1477708688" MODIFIED="1492294062235" TEXT="direkt an Dispatcher übergeben"/>
|
||||
<node CREATED="1492294063183" ID="ID_1341000232" MODIFIED="1492294094983" TEXT="hinterläßt sonst keine Spur">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1492294104665" ID="ID_433710721" MODIFIED="1492294116796" TEXT="globales Command">
|
||||
<node CREATED="1492294207251" ID="ID_1653497945" MODIFIED="1492294212303" TEXT="wenn ID nicht lokal bekannt"/>
|
||||
<node CREATED="1492294212795" ID="ID_82885635" MODIFIED="1492294242178" TEXT="aber globales Command bereits ausführbar"/>
|
||||
<node CREATED="1492294242862" ID="ID_1583400472" MODIFIED="1492294253689" TEXT="anonyme Instanz klonen"/>
|
||||
<node CREATED="1492294254277" ID="ID_57256331" MODIFIED="1492294260560" TEXT="und an Dispatcher übergeben"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1492294356319" ID="ID_1877638479" MODIFIED="1492294363265" TEXT="Semantik-Änderung">
|
||||
<node CREATED="1492294454001" ID="ID_356186975" MODIFIED="1492294483149">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
SessionCommandService::<b>trigger</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1492295091826" ID="ID_96156600" MODIFIED="1492295093557" TEXT="bisher">
|
||||
<node CREATED="1492295094337" ID="ID_420834348" MODIFIED="1492295103364" TEXT="Instanz nur wenn vorher angelegt"/>
|
||||
<node CREATED="1492295104096" ID="ID_104008616" MODIFIED="1492295116282" TEXT="Sonst wird einfach globales Command genomen"/>
|
||||
<node CREATED="1492295116894" ID="ID_930409268" MODIFIED="1492295120945" TEXT="gebunden und gefeuert"/>
|
||||
</node>
|
||||
<node CREATED="1492295122765" ID="ID_1120774629" MODIFIED="1492295124521" TEXT="jetzt">
|
||||
<node CREATED="1492295137387" ID="ID_1142805823" MODIFIED="1492295146318" TEXT="offene Instanz wird genommen"/>
|
||||
<node CREATED="1492295146794" ID="ID_715268835" MODIFIED="1492295159372" TEXT="Sonst wird anonyme Instanz gebildet"/>
|
||||
<node CREATED="1492295160320" ID="ID_289465814" MODIFIED="1492295164348" TEXT="gebunden und gefeuert"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1492294454001" ID="ID_1498558942" MODIFIED="1492295827074">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
SessionCommandService::<b>bindArg</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1492295834844" ID="ID_1373400691" MODIFIED="1492295839063" TEXT="Semantik nicht geändert"/>
|
||||
</node>
|
||||
<node CREATED="1492294454001" ID="ID_48228210" MODIFIED="1492295872142">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
SessionCommandService::<b>invoke</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1492295834844" ID="ID_1465048391" MODIFIED="1492295855364" TEXT="bisher">
|
||||
<node CREATED="1492295891844" ID="ID_219295848" MODIFIED="1492295983675" TEXT="offene Instanz wird zum Dispatcher verschoben"/>
|
||||
<node CREATED="1492295914304" ID="ID_196991118" MODIFIED="1492295939921" TEXT="globales Command wird direkt an den Dispatcher übergeben"/>
|
||||
</node>
|
||||
<node CREATED="1492295855881" ID="ID_1570343929" MODIFIED="1492295857092" TEXT="jetzt">
|
||||
<node CREATED="1492295941981" ID="ID_265372200" MODIFIED="1492295962382" TEXT="offene Instanz wird verschoben (unverändert)"/>
|
||||
<node CREATED="1492295965170" ID="ID_647547612" MODIFIED="1492295973020" TEXT="globales Command wird geklont"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1489191252503" ID="ID_1621107057" MODIFIED="1492293466151" TEXT="#1090 Command access for UI-Elements">
|
||||
<arrowlink COLOR="#758ba4" DESTINATION="ID_827179653" ENDARROW="Default" ENDINCLINATION="173;83;" ID="Arrow_ID_57938013" STARTARROW="None" STARTINCLINATION="384;-135;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1489196597635" ID="ID_850892898" MODIFIED="1489196604278" TEXT="Access-Front-End">
|
||||
<node CREATED="1492095519827" HGAP="16" ID="ID_983435641" MODIFIED="1492095548376" TEXT="Grundprinzip" VSHIFT="-5">
|
||||
|
|
@ -12699,7 +12835,9 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1492281320758" ID="ID_1465764553" MODIFIED="1492281326521" TEXT="InvocationTrail fällt weg"/>
|
||||
<node CREATED="1492281327277" ID="ID_1090150746" MODIFIED="1492281338008" TEXT="Aufruf erfolgt mit reiner Command-ID"/>
|
||||
<node CREATED="1492281338555" ID="ID_220910293" MODIFIED="1492281348366" TEXT="Instanzen werden automatisch generiert"/>
|
||||
<node CREATED="1492281338555" ID="ID_220910293" MODIFIED="1492293273810" TEXT="Instanzen werden automatisch generiert">
|
||||
<arrowlink COLOR="#626a9e" DESTINATION="ID_1660020661" ENDARROW="Default" ENDINCLINATION="-324;0;" ID="Arrow_ID_876356993" STARTARROW="None" STARTINCLINATION="-687;0;"/>
|
||||
</node>
|
||||
<node CREATED="1492281383613" ID="ID_143339688" MODIFIED="1492281399943" TEXT="CmdAccess wird für den komplexen Fall umgewidmet">
|
||||
<node CREATED="1492281402666" ID="ID_1263822028" MODIFIED="1492281416173" TEXT="es bleibt ein Access-front-End"/>
|
||||
<node CREATED="1492281417025" ID="ID_1229681605" MODIFIED="1492281424772" TEXT="der Name wird angepaßt"/>
|
||||
|
|
@ -12711,8 +12849,8 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#252298" CREATED="1489546623162" HGAP="-24" ID="ID_1622574347" MODIFIED="1489778039083" TEXT="was wird gebraucht" VSHIFT="21">
|
||||
<linktarget COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="39;-3322;" ID="Arrow_ID_1512127407" SOURCE="ID_1401258681" STARTARROW="None" STARTINCLINATION="2000;0;"/>
|
||||
<node COLOR="#252298" CREATED="1489546623162" HGAP="-24" ID="ID_1622574347" MODIFIED="1492294315650" TEXT="was wird gebraucht" VSHIFT="21">
|
||||
<linktarget COLOR="#352c7d" DESTINATION="ID_1622574347" ENDARROW="Default" ENDINCLINATION="-240;-3336;" ID="Arrow_ID_1512127407" SOURCE="ID_1401258681" STARTARROW="None" STARTINCLINATION="1932;0;"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node COLOR="#f10a1a" CREATED="1489546678250" ID="ID_228157787" MODIFIED="1492168992958" TEXT="Vorsicht UI-Programmierung">
|
||||
|
|
|
|||
Loading…
Reference in a new issue