% Define node group background % The first 4 arguments are nodes that define the group borders in (left, % top, right, bottom) order, the last argument is a text label \usetikzlibrary{shapes,arrows} \pgfdeclarelayer{background} \pgfdeclarelayer{foreground} \pgfsetlayers{background,main,foreground} % Layer order \newcommand{\grouppadding}{0.5} \newcommand{\group}[5]{ \begin{pgfonlayer}{background} % Left top corner \path (#1.west |- #2.north)+(-0.7, 0.7) node (lefttop) {}; % Right bottom corner \path (#3.east |- #4.south)+(0.7, -0.4) node (rightbottom) {}; % Draw rectangle \path[draw, rounded corners, dashed] (lefttop) rectangle (rightbottom); % Text label \path (rightbottom.west |- lefttop.south)+(-1.2, -0.3) node {\emph{#5}}; \end{pgfonlayer} } \tikzstyle{block} = [ rectangle, draw=black, fill=white, thick, minimum height=2em, text centered, rounded corners, text width=6em ] \tikzstyle{lineto} = [ ->, thick, shorten <= 2pt, shorten >= 2pt ] \tikzstyle{linefrom} = [ <-, thick, shorten <= 2pt, shorten >= 2pt ] \newcommand{\architecture}[1]{ \begin{tikzpicture}[node distance=6em, auto] \node[block] (driver) {Driver}; #1 \end{tikzpicture} } \newcommand{\basicdiagram}[1]{ \begin{figure}[H] \label{fig:basicdiagram} \center \architecture{ \node[block, dashed, below of=driver] (arch) {Architecture} edge[linefrom] node[right] {driver-specific messages} (driver); \node[block, below of=arch] {Application} edge[linefrom] node[right] {gestures} (arch); } \caption{#1} \end{figure} } \newcommand{\driverdiagram}[1]{ \begin{figure}[H] \label{fig:driverdiagram} \center \architecture{ \node[block, below of=driver] (eventdriver) {Event driver} edge[linefrom] node[right, near end] {driver-specific messages} (driver); \node[block, below of=eventdriver, dashed] (analysis) {Event analysis} edge[linefrom] node[right] {events} (eventdriver); \node[block, below of=analysis] {Application} edge[linefrom] node[right, near start] {gestures} (analysis); \node[right of=eventdriver, xshift=2em] (dummy) {}; \group{eventdriver}{eventdriver}{dummy}{analysis}{Architecture} } \caption{#1} \end{figure} } \newcommand{\widgetdiagram}[1]{ \begin{figure}[H] \label{fig:widgetdiagram} \center \architecture{ \node[block, below of=driver] (eventdriver) {Event driver} edge[linefrom] node[right, near end] {driver-specific messages} (driver); \node[block, below of=eventdriver] (widget) {Widget tree} edge[linefrom] node[right] {events} (eventdriver); \node[block, right of=widget, xshift=7em, dashed] (analysis) {Event analysis} edge[linefrom, bend right=10] node[above] {events} (widget) edge[lineto, bend left=10] node[] {gestures} (widget); \node[block, below of=widget] {Application} edge[linefrom] node[right, near start] {gestures} (widget); \group{eventdriver}{eventdriver}{analysis}{widget}{Architecture} } \caption{#1} \end{figure} } \newcommand{\trackerdiagram}[1]{ \begin{figure}[H] \label{fig:trackerdiagram} \center \architecture{ \node[block, below of=driver] (eventdriver) {Event driver} edge[linefrom] node[right, near end] {driver-specific messages} (driver); \node[block, below of=eventdriver] (widget) {Widget tree} edge[linefrom] node[right] {events} (eventdriver); \node[block, right of=widget, xshift=7em] (tracker) {Gesture trackers} edge[linefrom, bend right=10] node[above] {events} (widget) edge[lineto, bend left=10] node[] {gestures} (widget); \node[block, below of=widget] {Application} edge[linefrom] node[right, near start] {gestures} (widget); \group{eventdriver}{eventdriver}{tracker}{widget}{Architecture} } \caption{#1} \end{figure} } \newcommand{\examplediagram}[1]{ \begin{figure}[H] \center \architecture{ \node[block, below of=driver] (eventdriver) {Event driver} edge[linefrom] node[right, near end] {driver-specific messages} (driver); \node[block, below of=eventdriver] (rootwidget) {Root widget} edge[linefrom] (eventdriver); \node[block, below of=rootwidget] (subwidget) {Button widget} edge[linefrom] (rootwidget) edge[lineto, bend right=45] node[right=3] {event propagation} (rootwidget); \node[block, right of=rootwidget, xshift=5em] {\emph{pinch} tracker} edge[lineto, dotted, bend left=10] (rootwidget) edge[linefrom, bend right=10] (rootwidget); \node[block, right of=subwidget, xshift=5em] (tracker) {\emph{tap} tracker} edge[lineto, dotted, bend left=10] (subwidget) edge[linefrom, bend right=10] (subwidget); \node[block, below of=subwidget, yshift=-.5em] {Application} edge[linefrom, dotted, bend left=60] (rootwidget) edge[linefrom, dotted] (subwidget); \group{subwidget}{eventdriver}{tracker}{subwidget}{Architecture} } \caption{#1} \end{figure} }