컴포넌트는 C++ 기반으로 구현되지만, 유연한 UX/UI 기능을 제공하기 위해서는 WPF로 프런트엔드 기능을 구현한 후 cpp_cs_intf를 이용하여 WPF 기반의 프런트엔드와 C++ 기반의 컴포넌트를 연결한다.
Figure: C++ component to WPF Frontend Interface

interface manager는 컴포넌트의 Component interface를 통해 event를 전달하고 property를 엑세스하고 command를 실행한다. 컴포넌트는 역시 cpp_cs_intf를 통해 WPF에 event를 event를 전달하고 property를 엑세스하고 command를 실행한다. 이를 위해 cpp_cs_intf는 다음과 같이 Component interface의 일부 인터페이스를 제공한다:
public ref class cpp_cs_intf_t { … public: event Reinitialize_Delegator^ reinitialize_delegator; event Ready_to_run_Delegator^ ready_to_run_delegator; event Finish_Delegator^ finish_delegator; event Event_Delegator^ event_delegator; event Execute_Command_Delegator^ execute_command_delegator; event Activated_Delegator^ activated_delegator; event Deactivated_Delegator^ deactivated_delegator; event Set_Focus_Delegator^ set_focus_delegator; event Kill_Focus_Delegator^ kill_focus_delegator; event Sleep_Delegator^ sleep_delegator; event Wakeup_Delegator^ wakeup_delegator; void reinitialize_cs() { reinitialize_delegator(); } void ready_to_run_cs() { ready_to_run_delegator(); } void finish_cs() { finish_delegator(); } void event_cs(swa::LocalId lid, System::Object^ wp, System::Object^ lp) { event_delegator(lid, wp, lp); } Object^ execute_command_cs(swa::LocalId lid, System::Object^ wp, System::Object^ lp) { return execute_command_delegator(lid, wp, lp); } void activated_cs() { activated_delegator(); } void deactivated_cs() { deactivated_delegator(); } void set_focus_cs() { set_focus_delegator(); } void kill_focus_cs() { kill_focus(); } void sleep_cs() { sleep_delegator(); } void wakeup_cs() { wakeup_delegator(); } }; |
위의 내용을 시퀀스 다이어그램으로 살펴보면 다음과 같다:
Figure: Interface flow from the interface manager to an WPF frontend

interface manager가 컴포넌트를 생성하는 과정에서 WPF_Frontend 오브젝트는 cpp_cs_intf 오브젝의 event delegator에 자신의 event handler를 연결한다.
interface manager가, 예를 들어, 컴포넌트의 Component interface인 reinitialize()를 호출하면, 컴포넌트는 cpp_cs_intf의 reinitialize_cs()를 호출하며, reinitialize_cs()는 내부적으로 reinitialize_delegator()을 호출하며, reinitialize_delegator()에 의해 WPF_Frontend의 on_initialize()가 실행된다.
WPF_Frontend는 interface manager를 통해 다른 컴포넌트와 통신을 할 수 있어야 하며, C++ 컴포넌트와도 통신을 할 수 있어야 한다. 이를 위해 cpp_cs_intf는 다음과 같은 인터페이스를 제공한다:
public ref class cpp_cs_intf_t { … public: cpp_cs_intf (Component_Bus* bus, GlobalId cid, const swa::Component_Data* data, cpp_cs_cb_t* cb); System::Object^ execute_command_cpp(System::String^ command, System::Object^ wp, System::Object^ lp); }; |
cpp_cs_cb 인터페이스는 다음과 같다:
class cpp_cs_cb_t { public: cpp_cs_cb_t(){} virtual ~ cpp_cs_cb_t(){} virtual std::unique_ptr<swa::Value> execute_command_cpp( const wchar_t* command, const Value& wp, const Value& lp ) = 0; }; |