University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

datastruktur.html 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. body {
  7. margin: 0px;
  8. padding: 0px;
  9. }
  10. canvas {
  11. position: absolute;
  12. }
  13. * {
  14. white-space: nowrap;
  15. }
  16. class,
  17. Object {
  18. -moz-user-select: none;
  19. -ms-user-select: none;
  20. -webkit-touch-callout: none;
  21. -webkit-user-select: none;
  22. user-select: none;
  23. vertical-align: top;
  24. border-radius: 20px;
  25. border: 1px solid #333;
  26. display: inline-block;
  27. padding: 20px;
  28. margin: 10px;
  29. margin-top: 30px;
  30. min-width: 250px;
  31. cursor: pointer;
  32. }
  33. class {
  34. border-style: dashed;
  35. }
  36. class>name,
  37. object>name {
  38. position: absolute;
  39. margin-top: -40px;
  40. margin-left: 5px;
  41. }
  42. class>prop,
  43. object>prop {
  44. margin-bottom: 20px;
  45. width: 200px;
  46. display: block;
  47. }
  48. class>prop>name,
  49. class>prop>val,
  50. class>prop>type,
  51. object>prop>name,
  52. object>prop>val,
  53. object>prop>type {
  54. display: block;
  55. text-align: right;
  56. }
  57. class>prop>val,
  58. object>prop>val {
  59. border: 1px solid #333;
  60. height: 24px;
  61. line-height: 24px;
  62. text-align: center;
  63. }
  64. class>method,
  65. object>method {
  66. margin-bottom: 20px;
  67. display: block;
  68. }
  69. class>method:last-child,
  70. object>method:last-child {
  71. margin-bottom: 0px;
  72. }
  73. class>method>name,
  74. object>method>name {
  75. display: block;
  76. border-bottom: 1px solid #000;
  77. margin-left: -20px;
  78. margin-bottom: -1px;
  79. }
  80. class>method>name>.spacer,
  81. object>method>name>.spacer {
  82. width: 20px;
  83. display: inline-block;
  84. }
  85. class>method>name>.pre,
  86. class>method>name>.post,
  87. class>method>name>.args,
  88. object>method>name>.pre,
  89. object>method>name>.post,
  90. object>method>name>.args {
  91. font-weight: bold;
  92. }
  93. class>method>name>.pre,
  94. object>method>name>.pre {
  95. color: green;
  96. }
  97. class>method>name>.args,
  98. object>method>name>.args {
  99. color: #2ea2cc;
  100. }
  101. class>method>name>.post,
  102. object>method>name>.post {
  103. color: blue;
  104. }
  105. class>method>bod,
  106. object>method>bod {
  107. display: block;
  108. border: 1px solid #000;
  109. padding: 5px;
  110. white-space: pre-wrap;
  111. }
  112. </style>
  113. </head>
  114. <body>
  115. <class name="Markasykler">
  116. <prop name="stasjoner" type="Stasjon[]">
  117. <arrow to="stasjon1"></arrow>
  118. <arrow to="stasjon2"></arrow>
  119. </prop>
  120. <prop name="sykler" type="Sykkel[]">
  121. <arrow to="sykkel1"></arrow>
  122. </prop>
  123. <prop name="kunder" type="Kunde[]">
  124. <arrow to="kunde1"></arrow>
  125. </prop>
  126. </class>
  127. <object name="stasjon1" class="Stasjon">
  128. <prop name="sykler" type="Sykkel[]">
  129. <arrow to="sykkel1"></arrow>
  130. <arrow to="sykkel2"></arrow>
  131. </prop>
  132. </object>
  133. <object name="sykkel1" class="Sykkel">
  134. <prop name="id" val="1" type="int"></prop>
  135. <prop name="stasjon" type="Stasjon"><arrow to="stasjon1"></arrow></prop>
  136. <prop name="kunde" type="Kunde"><arrow to="kunde1"></arrow></prop>
  137. <prop name="sykkelType" val="Terreng" type="SykkelType"></prop>
  138. <prop name="startTid" val="2016-05-05 16:00" type="DateTime"></prop>
  139. <prop name="sluttTid" val="null" type="DateTime"></prop>
  140. </object>
  141. <object name="sykkel2" class="Sykkel">
  142. <prop name="id" val="2" type="int"></prop>
  143. <prop name="stasjon" type="Stasjon"><arrow to="stasjon1"></arrow></prop>
  144. <prop name="kunde" val="null" type="Kunde"></prop>
  145. <prop name="sykkelType" val="Terreng" type="SykkelType"></prop>
  146. <prop name="startTid" val="null" type="DateTime"></prop>
  147. <prop name="sluttTid" val="null" type="DateTime"></prop>
  148. </object>
  149. <object name="kunde1" class="Kunde">
  150. <prop name="kundenr" val="1" type="int"></prop>
  151. <prop name="sykkel" type="Sykkel"><arrow to="sykkel1"></arrow></prop>
  152. <prop name="navn" val="Alice" type="String"></prop>
  153. <prop name="email" val="alice@example.com" type="String"></prop>
  154. <prop name="telefonnr" val="55555555" type="String"></prop>
  155. </object>
  156. <object name="stasjon2" class="Stasjon">
  157. <prop name="sykler" type="Sykkel[]"></prop>
  158. </object>
  159. <script>
  160. window.scrollTo(0, 0);
  161. var defaultPos = {
  162. };
  163. document.addEventListener("dragstart", function(evt) {
  164. evt.preventDefault();
  165. });
  166. function draggable(elem) {
  167. var pos;
  168. if (localStorage[elem.id]) {
  169. pos = JSON.parse(localStorage[elem.id]);
  170. } else {
  171. pos = defaultPos[elem.id] || { x: 0, y: 0 };
  172. }
  173. function updatePos() {
  174. elem.style.top = pos.y+"px";
  175. elem.style.left = pos.x+"px";
  176. elem.style.position = "absolute";
  177. drawArrows();
  178. }
  179. setTimeout(updatePos, 10);
  180. var mx, my = 0;
  181. elem.addEventListener("mousedown", function(evt) {
  182. mx = evt.clientX;
  183. my = evt.clientY;
  184. });
  185. elem.addEventListener("mousemove", function(evt) {
  186. if (evt.buttons !== 1)
  187. return;
  188. pos.x += evt.clientX - mx;
  189. pos.y += evt.clientY - my;
  190. mx = evt.clientX;
  191. my = evt.clientY;
  192. updatePos();
  193. });
  194. elem.addEventListener("mouseup", function() {
  195. localStorage[elem.id] = JSON.stringify(pos);
  196. });
  197. }
  198. function htents(str) {
  199. if (!str)
  200. return "";
  201. return str
  202. .replace(/&/g, "&amp;")
  203. .replace(/</g, "&lt;")
  204. .replace(/>/g, "&gt;")
  205. .replace(/{{/g, "&lt;")
  206. .replace(/}}/g, "&gt;")
  207. .replace(/^\t\t/gm, "")
  208. .trim();
  209. }
  210. function attr(elem, attr, noescape) {
  211. if (noescape)
  212. return elem.getAttribute(attr);
  213. else
  214. return htents(elem.getAttribute(attr));
  215. }
  216. function elemPos(elem) {
  217. var rect = elem.getBoundingClientRect();
  218. return {
  219. mid: {
  220. x: rect.left + (rect.width / 2),
  221. y: rect.top + (rect.height / 2)
  222. },
  223. top: rect.top,
  224. bot: rect.top + rect.height,
  225. left: rect.left,
  226. right: rect.right
  227. };
  228. }
  229. /*
  230. function drawArrow(ctx, fromx, fromy, tox, toy){
  231. var headlen = 10; // length of head in pixels
  232. var angle = Math.atan2(toy-fromy,tox-fromx);
  233. ctx.beginPath();
  234. ctx.moveTo(fromx, fromy);
  235. ctx.lineTo(tox, toy);
  236. ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/6),toy-headlen*Math.sin(angle-Math.PI/6));
  237. ctx.moveTo(tox, toy);
  238. ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/6),toy-headlen*Math.sin(angle+Math.PI/6));
  239. ctx.closePath();
  240. ctx.stroke();
  241. }
  242. */
  243. function drawArrow(ctx, fromx, fromy, tox, toy) {
  244. var midx = fromx + ((tox - fromx) / 1.5);
  245. var midy = fromy;
  246. // Start
  247. ctx.beginPath();
  248. ctx.moveTo(fromx, fromy);
  249. // Line
  250. ctx.lineTo(midx, midy);
  251. ctx.lineTo(tox, toy);
  252. // Arrow
  253. var angle = Math.atan2(toy - midy, tox - midx);
  254. var headlen = 20;
  255. ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/6),toy-headlen*Math.sin(angle-Math.PI/6));
  256. ctx.moveTo(tox, toy);
  257. ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/6),toy-headlen*Math.sin(angle+Math.PI/6));
  258. // Close
  259. ctx.closePath();
  260. ctx.stroke();
  261. }
  262. //setup classes
  263. var classes = document.querySelectorAll("class");
  264. for (var i in classes) {
  265. if (!classes.hasOwnProperty(i)) continue;
  266. var c = classes[i];
  267. c.id = attr(c, "name", true);
  268. var eName = document.createElement("name");
  269. eName.innerHTML = "Klassedatastruktur <b>"+attr(c, "name")+"</b>";
  270. c.insertBefore(eName, c.firstChild);
  271. }
  272. //setup objects
  273. var objects = document.querySelectorAll("object");
  274. for (var i in objects) {
  275. if (!objects.hasOwnProperty(i)) continue;
  276. var obj = objects[i];
  277. obj.id = attr(obj, "name", true);
  278. var eName = document.createElement("name");
  279. eName.innerHTML =
  280. "Objekt av klassen <b>"+attr(obj, "class")+"</b>";
  281. obj.insertBefore(eName, obj.firstChild);
  282. }
  283. //setup props
  284. var props = document.querySelectorAll("prop");
  285. for (var i in props) {
  286. if (!props.hasOwnProperty(i)) continue;
  287. var prop = props[i];
  288. var eName = document.createElement("name");
  289. eName.innerHTML = "Navn: <b>"+attr(prop, "name")+"</b>";
  290. prop.appendChild(eName);
  291. var eVal = document.createElement("val");
  292. eVal.innerHTML = attr(prop, "val");
  293. prop.appendChild(eVal);
  294. var eType = document.createElement("type");
  295. eType.innerHTML = "Type: <b>"+attr(prop, "type")+"</b>";
  296. prop.appendChild(eType);
  297. }
  298. //setup methods
  299. var meths = document.querySelectorAll("method");
  300. for (var i in meths) {
  301. if (!meths.hasOwnProperty(i)) continue;
  302. var meth = meths[i];
  303. var body = htents(meth.innerHTML);
  304. meth.innerHTML = "";
  305. var eName = document.createElement("name");
  306. eName.innerHTML = "<span class='spacer'></span>"+
  307. " <span class='pre'>"+attr(meth, "pre")+"</span>"+
  308. " <span class='main'>"+attr(meth, "name")+"</span>"+
  309. "(<span class='args'>"+attr(meth, "args")+"</span>)"+
  310. " <span class='post'>"+attr(meth, "post")+"</span>";
  311. meth.appendChild(eName);
  312. var eBody = document.createElement("bod");
  313. eBody.innerHTML = body;
  314. meth.appendChild(eBody);
  315. }
  316. //create canvas
  317. var canvas = document.createElement("canvas");
  318. document.body.insertBefore(canvas, document.body.firstChild);
  319. var ctx = canvas.getContext("2d");
  320. //draw arrows
  321. function drawArrows() {
  322. canvas.height = window.innerHeight * 2;
  323. canvas.width = window.innerWidth * 2;
  324. var arrows = document.querySelectorAll("arrow");
  325. for (var i in arrows) {
  326. if (!arrows.hasOwnProperty(i)) continue;
  327. var arrow = arrows[i];
  328. var from = elemPos(arrow.parentNode);
  329. try {
  330. var to = elemPos(document.getElementById(arrow.getAttribute("to")));
  331. } catch (err) {
  332. console.log(err.toString());
  333. console.log(arrow);
  334. continue;
  335. }
  336. var fx, fy, tx, ty;
  337. fx = from.mid.x;
  338. fy = from.mid.y;
  339. if (from.mid.x > to.mid.x)
  340. tx = to.right;
  341. else
  342. tx = to.left;
  343. if (from.mid.y > to.mid.y)
  344. ty = to.bot;
  345. else
  346. ty = to.top;
  347. drawArrow(ctx, fx, fy, tx, ty);
  348. }
  349. }
  350. drawArrows();
  351. //draggable
  352. var draggables = document.querySelectorAll("class, object");
  353. for (var i in draggables) {
  354. if (!draggables.hasOwnProperty(i)) continue;
  355. draggable(draggables[i]);
  356. }
  357. </script>
  358. </body>
  359. </html>