diagrams.tex 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. % Define node group background
  2. % The first 4 arguments are nodes that define the group borders in (left,
  3. % top, right, bottom) order, the last argument is a text label
  4. \usetikzlibrary{shapes,arrows}
  5. \pgfdeclarelayer{background}
  6. \pgfdeclarelayer{foreground}
  7. \pgfsetlayers{background,main,foreground} % Layer order
  8. \newcommand{\grouppadding}{0.5}
  9. \newcommand{\group}[5]{
  10. \begin{pgfonlayer}{background}
  11. % Left top corner
  12. \path (#1.west |- #2.north)+(-0.7, 0.7)
  13. node (lefttop) {};
  14. % Right bottom corner
  15. \path (#3.east |- #4.south)+(0.7, -0.4)
  16. node (rightbottom) {};
  17. % Draw rectangle
  18. \path[draw, rounded corners, dashed] (lefttop) rectangle (rightbottom);
  19. % Text label
  20. \path (rightbottom.west |- lefttop.south)+(-1.2, -0.3) node {\emph{#5}};
  21. \end{pgfonlayer}
  22. }
  23. \tikzstyle{block} = [
  24. rectangle,
  25. draw=black,
  26. fill=white,
  27. thick,
  28. minimum height=2em,
  29. text centered,
  30. rounded corners,
  31. text width=6em
  32. ]
  33. \tikzstyle{lineto} = [
  34. ->,
  35. thick,
  36. shorten <= 2pt,
  37. shorten >= 2pt
  38. ]
  39. \tikzstyle{linefrom} = [
  40. <-,
  41. thick,
  42. shorten <= 2pt,
  43. shorten >= 2pt
  44. ]
  45. \newcommand{\architecture}[1]{
  46. \begin{tikzpicture}[node distance=6em, auto]
  47. \node[block] (driver) {Driver};
  48. #1
  49. \end{tikzpicture}
  50. }
  51. \newcommand{\basicdiagram}[1]{
  52. \begin{figure}[H]
  53. \label{fig:basicdiagram}
  54. \center
  55. \architecture{
  56. \node[block, dashed, below of=driver] (arch) {Architecture}
  57. edge[linefrom] node[right] {driver-specific messages} (driver);
  58. \node[block, below of=arch] {Application}
  59. edge[linefrom] node[right] {gestures} (arch);
  60. }
  61. \caption{#1}
  62. \end{figure}
  63. }
  64. \newcommand{\driverdiagram}[1]{
  65. \begin{figure}[H]
  66. \label{fig:driverdiagram}
  67. \center
  68. \architecture{
  69. \node[block, below of=driver] (eventdriver) {Event driver}
  70. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  71. \node[block, below of=eventdriver, dashed] (analysis) {Event analysis}
  72. edge[linefrom] node[right] {events} (eventdriver);
  73. \node[block, below of=analysis] {Application}
  74. edge[linefrom] node[right, near start] {gestures} (analysis);
  75. \node[right of=eventdriver, xshift=2em] (dummy) {};
  76. \group{eventdriver}{eventdriver}{dummy}{analysis}{Architecture}
  77. }
  78. \caption{#1}
  79. \end{figure}
  80. }
  81. \newcommand{\widgetdiagram}[1]{
  82. \begin{figure}[H]
  83. \label{fig:widgetdiagram}
  84. \center
  85. \architecture{
  86. \node[block, below of=driver] (eventdriver) {Event driver}
  87. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  88. \node[block, below of=eventdriver] (widget) {Widget tree}
  89. edge[linefrom] node[right] {events} (eventdriver);
  90. \node[block, right of=widget, xshift=7em, dashed] (analysis) {Event analysis}
  91. edge[linefrom, bend right=10] node[above] {events} (widget)
  92. edge[lineto, bend left=10] node[] {gestures} (widget);
  93. \node[block, below of=widget] {Application}
  94. edge[linefrom] node[right, near start] {gestures} (widget);
  95. \group{eventdriver}{eventdriver}{analysis}{widget}{Architecture}
  96. }
  97. \caption{#1}
  98. \end{figure}
  99. }
  100. \newcommand{\trackerdiagram}[1]{
  101. \begin{figure}[H]
  102. \label{fig:trackerdiagram}
  103. \center
  104. \architecture{
  105. \node[block, below of=driver] (eventdriver) {Event driver}
  106. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  107. \node[block, below of=eventdriver] (widget) {Widget tree}
  108. edge[linefrom] node[right] {events} (eventdriver);
  109. \node[block, right of=widget, xshift=7em] (tracker) {Gesture trackers}
  110. edge[linefrom, bend right=10] node[above] {events} (widget)
  111. edge[lineto, bend left=10] node[] {gestures} (widget);
  112. \node[block, below of=widget] {Application}
  113. edge[linefrom] node[right, near start] {gestures} (widget);
  114. \group{eventdriver}{eventdriver}{tracker}{widget}{Architecture}
  115. }
  116. \caption{#1}
  117. \end{figure}
  118. }
  119. \newcommand{\examplediagrams}{
  120. \begin{figure}[H]
  121. \hspace{-2.3em}
  122. \subfigure[Architecture using a single widget, demonstration gesture
  123. delegation from the widget to the application. Dotted arrows
  124. represent gestures, regular arrows represent events (unless
  125. labeled otherwise).]{
  126. \architecture{
  127. \node[block, below of=driver] (eventdriver) {Event driver}
  128. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  129. \node[block, below of=eventdriver] (widget) {Widget}
  130. edge[linefrom] (eventdriver);
  131. \node[block, right of=widget, xshift=5em] (tracker) {Gesture tracker}
  132. edge[lineto, dotted, bend left=10] (widget)
  133. edge[linefrom, bend right=10] (widget);
  134. \node[block, below of=widget] {Application}
  135. edge[linefrom, dotted] node[right, near start] {delegation} (widget);
  136. \group{eventdriver}{eventdriver}{tracker}{tracker}{Architecture}
  137. }
  138. }
  139. \hspace{1.5em}
  140. \subfigure[Architecture using a sub widget, demonstrating gesture
  141. propagation. Dotted arrows represent gestures, regular arrows
  142. represent events (unless labeled otherwise).]{
  143. \architecture{
  144. \node[block, below of=driver] (eventdriver) {Event driver}
  145. edge[linefrom] node[right, near end] {driver-specific messages} (driver);
  146. \node[block, below of=eventdriver] (rootwidget) {Root widget}
  147. edge[linefrom] (eventdriver);
  148. \node[block, below of=rootwidget] (subwidget) {Sub widget}
  149. edge[linefrom] (rootwidget)
  150. edge[lineto, bend right=45] node[right=3] {propagation} (rootwidget);
  151. \node[block, right of=rootwidget, xshift=5em] {Gesture tracker}
  152. edge[lineto, dotted, bend left=10] (rootwidget)
  153. edge[linefrom, bend right=10] (rootwidget);
  154. \node[block, right of=subwidget, xshift=5em] (tracker) {Gesture tracker}
  155. edge[lineto, dotted, bend left=10] (subwidget)
  156. edge[linefrom, bend right=10] (subwidget);
  157. \node[block, below of=subwidget, yshift=-.5em] {Application}
  158. edge[linefrom, dotted, bend left=60] (rootwidget)
  159. edge[linefrom, dotted] (subwidget);
  160. \group{subwidget}{eventdriver}{tracker}{subwidget}{Architecture}
  161. }
  162. }
  163. \end{figure}
  164. }