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 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  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: -30px;
  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. <object name="rotte" class="Rotte">
  116. <prop name="Tilstand" type="enum" val="Levende, Skadet, Dod"></prop>
  117. <prop name="tilstand" type="Tilstand" val="Skadet"></prop>
  118. <prop name="navn" type="String" val="Remy"></prop>
  119. <method pre="public void" name="bliAngrepet" post="throws Exception">
  120. Tilstand nyTilstand;
  121. if (this.tilstand == Tilstand.Levende)
  122. nyTilstand = Tilstand.Skadet;
  123. else if (this.tilstand == Tilstand.Skadet)
  124. nyTilstand = Tilstand.Dod;
  125. else
  126. return;
  127. System.out.println(...);
  128. tilstand = nyTilstand;
  129. </method>
  130. </object>
  131. <object name="rottebol" class="Bol<Rotte>">
  132. <prop name="dyr" type="Mus"><arrow to="rotte"></arrow></prop>
  133. <method pre="public boolean" name="erTomt">
  134. return dyr == null;
  135. </method>
  136. <method pre="public void" name="settInn" args="Mus dyr" post="throws Exception">
  137. if (!erTomt())
  138. throw new Exception("Bolet er ikke tomt!");
  139. this.dyr = dyr;
  140. </method>
  141. <method pre="public T" name="hent">
  142. return dyr;
  143. </method>
  144. </object>
  145. <class name="Oblig1">
  146. <prop name="musebol" type="Bol<Mus>"><arrow to="musebol"</arrow></prop>
  147. <prop name="rottebol" type="Bol<Rotte>"><arrow to="rottebol"</arrow></prop>
  148. <prop name="rotte" type="Rotte"><arrow to="rotte"></arrow></prop>
  149. <prop name="mus" type="Mus"><arrow to="mus"></arrow></prop>
  150. <prop name="katt" type="Katt"><arrow to="katt"></arrow></prop>
  151. <prop name="mus2" type="Mus"><arrow to="mus2"></arrow></prop>
  152. </class>
  153. <object name="musebol" class="Bol<Mus>">
  154. <prop name="dyr" type="Mus"><arrow to="mus"></arrow></prop>
  155. <method pre="public boolean" name="erTomt">
  156. return dyr == null;
  157. </method>
  158. <method pre="public void" name="settInn" args="Mus dyr" post="throws Exception">
  159. if (!erTomt())
  160. throw new Exception("Bolet er ikke tomt!");
  161. this.dyr = dyr;
  162. </method>
  163. <method pre="public T" name="hent">
  164. return dyr;
  165. </method>
  166. </object>
  167. <object name="mus" class="Mus">
  168. <prop name="Tilstand" type="enum" val="Levende, Dod"></prop>
  169. <prop name="tilstand" type="Tilstand" val="Dod"></prop>
  170. <prop name="navn" type="String" val="Jerry"></prop>
  171. <method pre="public boolean" name="erDod">
  172. return tilstand == Tilstand.Dod;
  173. </method>
  174. <method pre="public void" name="bliAngrepet">
  175. Tilstand nyTilstand;
  176. if (tilstand == Tilstand.Levende)
  177. nyTilstand = Tilstand.Dod;
  178. else
  179. return;
  180. System.out.println(...);
  181. tilstand = nyTilstand;
  182. </method>
  183. </object>
  184. <object name="katt" class="Katt">
  185. <prop name="navn" type="String" val="Tom"></prop>
  186. <method pre="public void" name="jakt" args="Bol<Mus> musebol, Bol<Rotte> rottebol" post="throws Exception">
  187. if (!musebol.erTomt() && !musebol.hent().erDod()) {
  188. Mus mus = musebol.hent();
  189. System.out.println(...);
  190. mus.bliAngrepet();
  191. return;
  192. } else if (!rottebol.erTomt() && !rottebol.hent().erDod()) {
  193. Rotte rotte = rottebol.hent();
  194. System.out.println(...);
  195. rotte.bliAngrepet();
  196. return;
  197. }
  198. System.out.println(...);
  199. </method>
  200. </object>
  201. <object name="mus2" class="Mus">
  202. <prop name="Tilstand" type="enum" val="Levende, Dod"></prop>
  203. <prop name="tilstand" type="Tilstand" val="Levende"></prop>
  204. <prop name="navn" type="String" val="Cray"></prop>
  205. <method pre="public boolean" name="erDod">
  206. return tilstand == Tilstand.Dod;
  207. </method>
  208. <method pre="public void" name="bliAngrepet">
  209. Tilstand nyTilstand;
  210. if (tilstand == Tilstand.Levende)
  211. nyTilstand = Tilstand.Dod;
  212. else
  213. return;
  214. System.out.println(...);
  215. tilstand = nyTilstand;
  216. </method>
  217. </object>
  218. <script>
  219. window.scrollTo(0, 0);
  220. var defaultPos = {
  221. rotte: { x: 23, y: 10 },
  222. katt: { x: 187, y: 607 },
  223. musebol: { x: 1620, y: 47 },
  224. mus2: { x: 1619, y: 575 },
  225. mus: { x: 2145, y: 58 },
  226. Oblig1: { x: 1000, y: 52 },
  227. rottebol: { x: 490, y: 190 }
  228. };
  229. document.addEventListener("dragstart", function(evt) {
  230. evt.preventDefault();
  231. });
  232. function draggable(elem) {
  233. var pos;
  234. if (localStorage[elem.id]) {
  235. pos = JSON.parse(localStorage[elem.id]);
  236. } else {
  237. pos = defaultPos[elem.id];
  238. }
  239. function updatePos() {
  240. elem.style.top = pos.y+"px";
  241. elem.style.left = pos.x+"px";
  242. elem.style.position = "absolute";
  243. drawArrows();
  244. }
  245. setTimeout(updatePos, 10);
  246. var mx, my = 0;
  247. elem.addEventListener("mousedown", function(evt) {
  248. mx = evt.clientX;
  249. my = evt.clientY;
  250. });
  251. elem.addEventListener("mousemove", function(evt) {
  252. if (evt.buttons !== 1)
  253. return;
  254. pos.x += evt.clientX - mx;
  255. pos.y += evt.clientY - my;
  256. mx = evt.clientX;
  257. my = evt.clientY;
  258. updatePos();
  259. });
  260. elem.addEventListener("mouseup", function() {
  261. localStorage[elem.id] = JSON.stringify(pos);
  262. });
  263. }
  264. function htents(str) {
  265. if (!str)
  266. return "";
  267. return str
  268. .replace(/&/g, "&amp;")
  269. .replace(/</g, "&lt;")
  270. .replace(/>/g, "&gt;")
  271. .replace(/{{/g, "&lt;")
  272. .replace(/}}/g, "&gt;")
  273. .replace(/^\t\t/gm, "")
  274. .trim();
  275. }
  276. function attr(elem, attr, noescape) {
  277. if (noescape)
  278. return elem.getAttribute(attr);
  279. else
  280. return htents(elem.getAttribute(attr));
  281. }
  282. function elemPos(elem) {
  283. var rect = elem.getBoundingClientRect();
  284. return {
  285. mid: {
  286. x: rect.left + (rect.width / 2),
  287. y: rect.top + (rect.height / 2)
  288. },
  289. top: rect.top,
  290. bot: rect.top + rect.height,
  291. left: rect.left,
  292. right: rect.right
  293. };
  294. }
  295. function drawArrow(ctx, fromx, fromy, tox, toy){
  296. var headlen = 10; // length of head in pixels
  297. var angle = Math.atan2(toy-fromy,tox-fromx);
  298. ctx.beginPath();
  299. ctx.moveTo(fromx, fromy);
  300. ctx.lineTo(tox, toy);
  301. ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/6),toy-headlen*Math.sin(angle-Math.PI/6));
  302. ctx.moveTo(tox, toy);
  303. ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/6),toy-headlen*Math.sin(angle+Math.PI/6));
  304. ctx.closePath();
  305. ctx.stroke();
  306. }
  307. //setup classes
  308. var classes = document.querySelectorAll("class");
  309. for (var i in classes) {
  310. if (!classes.hasOwnProperty(i)) continue;
  311. var c = classes[i];
  312. c.id = attr(c, "name", true);
  313. var eName = document.createElement("name");
  314. eName.innerHTML = "Klassedatastruktur <b>"+attr(c, "name")+"</b>";
  315. c.insertBefore(eName, c.firstChild);
  316. }
  317. //setup objects
  318. var objects = document.querySelectorAll("object");
  319. for (var i in objects) {
  320. if (!objects.hasOwnProperty(i)) continue;
  321. var obj = objects[i];
  322. obj.id = attr(obj, "name", true);
  323. var eName = document.createElement("name");
  324. eName.innerHTML =
  325. "Objekt <b>"+attr(obj, "name")+"</b>"+
  326. " av klassen <b>"+attr(obj, "class")+"</b>";
  327. obj.insertBefore(eName, obj.firstChild);
  328. }
  329. //setup props
  330. var props = document.querySelectorAll("prop");
  331. for (var i in props) {
  332. if (!props.hasOwnProperty(i)) continue;
  333. var prop = props[i];
  334. var eName = document.createElement("name");
  335. eName.innerHTML = "Navn: <b>"+attr(prop, "name")+"</b>";
  336. prop.appendChild(eName);
  337. var eVal = document.createElement("val");
  338. eVal.innerHTML = attr(prop, "val");
  339. prop.appendChild(eVal);
  340. var eType = document.createElement("type");
  341. eType.innerHTML = "Type: <b>"+attr(prop, "type")+"</b>";
  342. prop.appendChild(eType);
  343. }
  344. //setup methods
  345. var meths = document.querySelectorAll("method");
  346. for (var i in meths) {
  347. if (!meths.hasOwnProperty(i)) continue;
  348. var meth = meths[i];
  349. var body = htents(meth.innerHTML);
  350. meth.innerHTML = "";
  351. var eName = document.createElement("name");
  352. eName.innerHTML = "<span class='spacer'></span>"+
  353. " <span class='pre'>"+attr(meth, "pre")+"</span>"+
  354. " <span class='main'>"+attr(meth, "name")+"</span>"+
  355. "(<span class='args'>"+attr(meth, "args")+"</span>)"+
  356. " <span class='post'>"+attr(meth, "post")+"</span>";
  357. meth.appendChild(eName);
  358. var eBody = document.createElement("bod");
  359. eBody.innerHTML = body;
  360. meth.appendChild(eBody);
  361. }
  362. //create canvas
  363. var canvas = document.createElement("canvas");
  364. document.body.insertBefore(canvas, document.body.firstChild);
  365. var ctx = canvas.getContext("2d");
  366. //draw arrows
  367. function drawArrows() {
  368. canvas.height = window.innerHeight * 2;
  369. canvas.width = window.innerWidth * 2;
  370. var arrows = document.querySelectorAll("arrow");
  371. for (var i in arrows) {
  372. if (!arrows.hasOwnProperty(i)) continue;
  373. var arrow = arrows[i];
  374. var from = elemPos(arrow.parentNode);
  375. var to = elemPos(document.getElementById(arrow.getAttribute("to")));
  376. var fx, fy, tx, ty;
  377. fx = from.mid.x;
  378. fy = from.mid.y;
  379. if (from.mid.x > to.mid.x)
  380. tx = to.right;
  381. else
  382. tx = to.left;
  383. if (from.mid.y > to.mid.y)
  384. ty = to.bot;
  385. else
  386. ty = to.top;
  387. drawArrow(ctx, fx, fy, tx, ty);
  388. }
  389. }
  390. drawArrows();
  391. //draggable
  392. var draggables = document.querySelectorAll("class, object");
  393. for (var i in draggables) {
  394. if (!draggables.hasOwnProperty(i)) continue;
  395. draggable(draggables[i]);
  396. }
  397. </script>
  398. </body>
  399. </html>