\documentclass{minimal} \usepackage{tikz} \usetikzlibrary{shapes,arrows} \begin{document} \pagestyle{empty} % Block+line styles \tikzstyle{block} = [rectangle, draw, fill=blue!20, text width=5em, text centered, rounded corners, minimum height=4em] \tikzstyle{impl} = [rectangle, draw, fill=yellow, text width=5em, text centered, rounded corners, minimum height=4em] \tikzstyle{app} = [rectangle, draw, fill=green, text width=5em, text centered, rounded corners, minimum height=4em] \tikzstyle{line} = [draw, -latex'] \begin{tikzpicture}[node distance = 7em, auto] % Servers \node [block] (inputserver) {Input server}; \node [right of=inputserver] (inputserverdots) {$\cdots$}; \node [impl, right of=inputserverdots] (tuioserver) {TUIO server}; \node [block, below of=inputserver] (gestureserver) {Gesture server}; \path [line] (inputserver) -- node {triggers [down, move, up]}(gestureserver); % Window \node [block, below of=gestureserver] (window) {Window}; \node [right of=window] (windowdots) {$\cdots$}; \path [line] (gestureserver) -- node {triggers [down, move, up]}(window); \node [impl, right of=windowdots] (rectangularwindow) {Rectangular window}; \node [impl, right of=rectangularwindow] (circularwindow) {Circular window}; % Tracker \node [block, below of=window] (tracker) {Gesture tracker}; \node [right of=tracker] (trackerdots) {$\cdots$}; \path [line] (window) -- node {triggers [down, move, up]}(tracker); \node [impl, right of=trackerdots] (taptracker) {Tap tracker}; \node [impl, right of=taptracker, text width=7em] (transformtracker) {Transformation tracker}; % Gesture \node [block, below of=tracker] (gesture) {Gesture}; \node [right of=gesture] (gesturedots) {$\cdots$}; \path [line] (tracker) -- node {triggers gesture}(gesture); % Client application \node [app, left of=window, xshift=-14em] (app) {Client application}; \path [line, dashed] (app) -- node [near start] {binds gesture handler}(tracker); \path [line, dashed] (tracker) -- node [near start] {triggers gesture handler}(app); \path [line, dashed] (app) -- node [near start] {starts}(gestureserver); \path [line, dashed] (app) -- node [near start] {adds to server}(window); \end{tikzpicture} \end{document}