concrete 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/CHANGELOG +32 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +87 -0
  4. data/concrete/basic_inline_editor.js +73 -0
  5. data/concrete/clipboard.js +72 -0
  6. data/concrete/concrete.js +58 -0
  7. data/concrete/constraint_checker.js +297 -0
  8. data/concrete/editor.js +964 -0
  9. data/concrete/element_extension.js +68 -0
  10. data/concrete/external_identifier_provider.js +112 -0
  11. data/concrete/helper.js +63 -0
  12. data/concrete/identifier_provider.js +168 -0
  13. data/concrete/inline_editor.js +55 -0
  14. data/concrete/metamodel_provider.js +171 -0
  15. data/concrete/model_interface.js +429 -0
  16. data/concrete/scroller.js +106 -0
  17. data/concrete/selector.js +302 -0
  18. data/concrete/template_provider.js +141 -0
  19. data/concrete/ui/abstract_dialog.js +80 -0
  20. data/concrete/ui/concrete_ui.js +28 -0
  21. data/concrete/ui/create_module_dialog.js +55 -0
  22. data/concrete/ui/images/close.png +0 -0
  23. data/concrete/ui/images/document-new.png +0 -0
  24. data/concrete/ui/images/document-save.png +0 -0
  25. data/concrete/ui/images/edit-find-replace.png +0 -0
  26. data/concrete/ui/images/emblem-symbolic-link.png +0 -0
  27. data/concrete/ui/images/help-browser.png +0 -0
  28. data/concrete/ui/images/minus_11px.png +0 -0
  29. data/concrete/ui/images/plus_11px.png +0 -0
  30. data/concrete/ui/images/preferences-system.png +0 -0
  31. data/concrete/ui/images/process-stop.png +0 -0
  32. data/concrete/ui/images/system-search.png +0 -0
  33. data/concrete/ui/layout_manager.js +54 -0
  34. data/concrete/ui/module_browser.js +88 -0
  35. data/concrete/ui/module_editor.js +217 -0
  36. data/concrete/ui/open_element_dialog.js +90 -0
  37. data/concrete/ui/preferences_dialog.js +75 -0
  38. data/concrete/ui/proceed_dialog.js +52 -0
  39. data/concrete/ui/search_replace_dialog.js +323 -0
  40. data/concrete/ui/style.css +296 -0
  41. data/concrete/ui/toolbar.js +74 -0
  42. data/concrete/ui/workbench.js +165 -0
  43. data/doc/concrete_developers_guide.html +1054 -0
  44. data/doc/concrete_developers_guide.txt +502 -0
  45. data/doc/concrete_users_guide.html +694 -0
  46. data/doc/concrete_users_guide.txt +223 -0
  47. data/example/formula_editor/example_data/example1.json +11 -0
  48. data/example/formula_editor/formula_editor.html +83 -0
  49. data/example/formula_editor/sqrt_horz.png +0 -0
  50. data/example/formula_editor/sqrt_vert.png +0 -0
  51. data/example/formula_editor/style.css +31 -0
  52. data/example/metamodel_editor/edit.rb +54 -0
  53. data/example/metamodel_editor/example_data/formula_metamodel.json +18 -0
  54. data/example/metamodel_editor/example_data/meta_metamodel.json +22 -0
  55. data/example/metamodel_editor/example_data/statemachine_metamodel.json +32 -0
  56. data/example/metamodel_editor/metamodel_editor.html +120 -0
  57. data/example/metamodel_editor/metamodel_editor2.html +135 -0
  58. data/example/metamodel_editor/metamodel_editor3.html +151 -0
  59. data/example/metamodel_editor/style.css +8 -0
  60. data/example/metamodel_editor/style2.css +19 -0
  61. data/example/metamodel_editor/style3.css +35 -0
  62. data/example/minimal_editor/minimal_editor.html +43 -0
  63. data/example/statemachine_editor/example_data/example1.json +11 -0
  64. data/example/statemachine_editor/state_background.png +0 -0
  65. data/example/statemachine_editor/statemachine_editor0.html +55 -0
  66. data/example/statemachine_editor/statemachine_editor1.html +62 -0
  67. data/example/statemachine_editor/statemachine_editor2.html +103 -0
  68. data/example/statemachine_editor/style0.css +8 -0
  69. data/example/statemachine_editor/style1.css +32 -0
  70. data/example/statemachine_editor/style2.css +43 -0
  71. data/example/themes/cobalt.css +176 -0
  72. data/example/themes/dialog-error.png +0 -0
  73. data/example/themes/dialog-information.png +0 -0
  74. data/example/themes/dialog-warning.png +0 -0
  75. data/example/themes/dots_12px.png +0 -0
  76. data/example/themes/fold_button_dots_when_hidden.css +18 -0
  77. data/example/themes/fold_button_plus_minus.css +21 -0
  78. data/example/themes/fold_button_plus_when_hidden.css +18 -0
  79. data/example/themes/light_blue.css +177 -0
  80. data/example/themes/minus_11px.png +0 -0
  81. data/example/themes/minus_13px.png +0 -0
  82. data/example/themes/minus_9px.png +0 -0
  83. data/example/themes/plus_11px.png +0 -0
  84. data/example/themes/plus_13px.png +0 -0
  85. data/example/themes/plus_9px.png +0 -0
  86. data/example/themes/white.css +177 -0
  87. data/lib/concrete/concrete_syntax_provider.rb +63 -0
  88. data/lib/concrete/config.rb +36 -0
  89. data/lib/concrete/file_cache_map.rb +88 -0
  90. data/lib/concrete/index_builder.rb +108 -0
  91. data/lib/concrete/metamodel/concrete_mmm.rb +45 -0
  92. data/lib/concrete/metamodel/ecore_to_concrete.rb +80 -0
  93. data/lib/concrete/server.rb +92 -0
  94. data/lib/concrete/util/logger.rb +24 -0
  95. data/lib/concrete/util/string_writer.rb +17 -0
  96. data/lib/concrete/working_set.rb +41 -0
  97. data/rakefile +33 -0
  98. data/redist/prototype.js +4320 -0
  99. data/redist/scriptaculous/builder.js +136 -0
  100. data/redist/scriptaculous/controls.js +991 -0
  101. data/redist/scriptaculous/dragdrop.js +975 -0
  102. data/redist/scriptaculous/effects.js +1130 -0
  103. data/redist/scriptaculous/scriptaculous.js +60 -0
  104. data/redist/scriptaculous/slider.js +275 -0
  105. data/redist/scriptaculous/sound.js +55 -0
  106. data/redist/scriptaculous/unittest.js +568 -0
  107. data/test/concrete_test.rb +5 -0
  108. data/test/file_cache_map_test.rb +90 -0
  109. data/test/file_cache_map_test/testdir/fileA +1 -0
  110. data/test/index_builder_test.rb +68 -0
  111. data/test/index_builder_test/ecore_index.js +85 -0
  112. data/test/index_builder_test/ecore_index_expected.js +85 -0
  113. data/test/integration/external_elements_test.html +114 -0
  114. data/test/metamodel_test.rb +40 -0
  115. data/test/metamodel_test/concrete_mmm_expected.js +19 -0
  116. data/test/metamodel_test/concrete_mmm_generated.js +19 -0
  117. data/test/metamodel_test/concrete_mmm_regenerated.js +19 -0
  118. data/test/unit/external_identifier_provider_test.html +138 -0
  119. data/test/unit/identifier_provider_test.html +269 -0
  120. data/test/unit/metamodel_provider_test.html +318 -0
  121. data/test/unit/model_interface_test.html +257 -0
  122. data/test/unit/template_provider_test.html +171 -0
  123. data/test/unit/test.css +90 -0
  124. data/test/working_set_test.rb +54 -0
  125. data/test/working_set_test/file1.txt +0 -0
  126. data/test/working_set_test/file2 +0 -0
  127. data/test/working_set_test/subdir/file3.xml +0 -0
  128. metadata +201 -0
@@ -0,0 +1,32 @@
1
+ [{"_class": "Datatype", "name": "String"},
2
+ {"_class": "Class", "name": "Statemachine", "features": [
3
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"},
4
+ {"_class": "Feature", "name": "variables", "kind": "containment", "type": "Variable"},
5
+ {"_class": "Feature", "name": "triggers", "kind": "containment", "type": "Trigger"},
6
+ {"_class": "Feature", "name": "states", "kind": "containment", "type": "State"}]},
7
+ {"_class": "Class", "name": "Variable", "features":
8
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"}},
9
+ {"_class": "Class", "name": "Trigger", "features":
10
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"}},
11
+ {"_class": "Class", "name": "State", "abstract": true, "features": [
12
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"},
13
+ {"_class": "Feature", "name": "transitions", "kind": "containment", "upperLimit": -1, "type": "Transition"}]},
14
+ {"_class": "Class", "name": "SimpleState", "superTypes": "State"},
15
+ {"_class": "Class", "name": "CompositeState", "superTypes": "State", "features":
16
+ {"_class": "Feature", "name": "subStates", "kind": "containment", "upperLimit": -1, "type": "State"}},
17
+ {"_class": "Class", "name": "Transition", "features": [
18
+ {"_class": "Feature", "name": "target", "kind": "reference", "lowerLimit": 1, "upperLimit": 1, "type": "State"},
19
+ {"_class": "Feature", "name": "trigger", "kind": "reference", "upperLimit": -1, "type": "Trigger"},
20
+ {"_class": "Feature", "name": "condition", "kind": "containment", "upperLimit": 1, "type": "Expression"}]},
21
+ {"_class": "Class", "name": "Expression"},
22
+ {"_class": "Class", "name": "AndExpression", "superTypes": "Expression", "features": [
23
+ {"_class": "Feature", "name": "expr1", "kind": "containment", "lowerLimit": 1, "upperLimit": -1, "type": "Expression"},
24
+ {"_class": "Feature", "name": "expr2", "kind": "containment", "lowerLimit": 1, "upperLimit": -1, "type": "Expression"}]},
25
+ {"_class": "Class", "name": "OrExpression", "superTypes": "Expression", "features": [
26
+ {"_class": "Feature", "name": "expr1", "kind": "containment", "lowerLimit": 1, "upperLimit": -1, "type": "Expression"},
27
+ {"_class": "Feature", "name": "expr2", "kind": "containment", "lowerLimit": 1, "upperLimit": -1, "type": "Expression"}]},
28
+ {"_class": "Class", "name": "NotExpression", "superTypes": "Expression", "features":
29
+ {"_class": "Feature", "name": "expr", "kind": "containment", "lowerLimit": 1, "upperLimit": -1, "type": "Expression"}},
30
+ {"_class": "Class", "name": "VarRef", "superTypes": "Expression", "features":
31
+ {"_class": "Feature", "name": "variable", "kind": "reference", "lowerLimit": 1, "upperLimit": 1, "type": "Variable"}}]
32
+
@@ -0,0 +1,120 @@
1
+ <html>
2
+ <head>
3
+ <link rel="stylesheet" href="../../example/themes/cobalt.css" type="text/css" />
4
+ <link rel="stylesheet" href="../../example/themes/fold_button_dots_when_hidden.css" type="text/css" />
5
+ <link rel="stylesheet" href="../../example/metamodel_editor/style.css" type="text/css" />
6
+ <script src="../../redist/prototype.js" type="text/javascript"></script>
7
+ <script src="../../redist/scriptaculous/scriptaculous.js" type="text/javascript"></script>
8
+ <script src="../../concrete/concrete.js" type="text/javascript"></script>
9
+ </head>
10
+ <body>
11
+ <div id="templates1" style="display: none">
12
+ </div>
13
+
14
+ <div id="metamodel1" style="display: none">
15
+ [
16
+ {"_class": "Datatype", "name": "String"},
17
+ {"_class": "Datatype", "name": "Integer"},
18
+ {"_class": "Datatype", "name": "Boolean"},
19
+ {"_class": "Enum", "name": "FeatureKindType", "literals": ["attribute", "reference", "containment"]},
20
+ {"_class": "Class", "name": "Classifier", "abstract": true, "features": {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"}},
21
+ {"_class": "Class", "name": "Datatype", "superTypes": "Classifier"},
22
+ {"_class": "Class", "name": "Enum", "superTypes": "Datatype", "features": {"_class": "Feature", "name": "literals", "kind": "attribute", "lowerLimit": 1, "upperLimit": -1, "type": "String"}},
23
+ {"_class": "Class", "name": "Class", "superTypes": "Classifier", "features": [
24
+ {"_class": "Feature", "name": "superTypes", "kind": "reference", "upperLimit": -1, "type": "Class"},
25
+ {"_class": "Feature", "name": "features", "kind": "containment", "upperLimit": -1, "type": "Feature"},
26
+ {"_class": "Feature", "name": "abstract", "kind": "attribute", "upperLimit": 1, "type": "Boolean"}
27
+ ]},
28
+ {"_class": "Class", "name": "Feature", "features": [
29
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"},
30
+ {"_class": "Feature", "name": "kind", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "FeatureKindType"},
31
+ {"_class": "Feature", "name": "lowerLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
32
+ {"_class": "Feature", "name": "upperLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
33
+ {"_class": "Feature", "name": "type", "kind": "reference", "lowerLimit": 1, "upperLimit": 1, "type": "Classifier"}
34
+ ]}
35
+ ]
36
+ </div>
37
+
38
+ <div id="model1" style="display: none">
39
+ <!-- json model here -->
40
+ </div>
41
+
42
+ <div class="ct_editor" id="editor1">
43
+ </div>
44
+
45
+ <div id="controlbuttons" style="display: none">
46
+ <!-- the buttons will only be shown in ajax mode -->
47
+ <input type="button" style="margin: 10px" value="Save" onclick="saveModel();"/>
48
+ <input type="button" style="margin: 10px" value="Exit" onclick="exitEditor();"/>
49
+ </div>
50
+
51
+ <br/>
52
+ <textarea id="clipboard1" style="background-color: white; color: black; border: 1px solid grey" cols="80" rows="10" wrap="off"></textarea>
53
+
54
+ <script type="text/javascript" language="javascript" charset="utf-8">
55
+ // <![CDATA[
56
+ var tp = new Concrete.TemplateProvider($("templates1"), {identifierAttribute: "name"});
57
+ var mp = new Concrete.MetamodelProvider($("metamodel1").textContent.evalJSON());
58
+ var ip = new Concrete.QualifiedNameBasedIdentifierProvider({nameAttribute: "name", separator: "/", leadingSeparator: false});
59
+ var cb = new Concrete.Clipboard($("clipboard1"));
60
+ var ed = new Concrete.Editor($("editor1"), tp, mp, ip, {clipboard: cb,
61
+ rootClasses: mp.metaclasses.select(function(c) { return ["Class", "Datatype", "Enum"].include(c.name)})});
62
+
63
+ // Editor specific constraints
64
+
65
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
66
+ class: "Datatype", feature: "name",
67
+ message: "primitive types (Datatype) must be named 'String', 'Integer', 'Float' or 'Boolean'",
68
+ checker: function(element, value) {
69
+ return ["String", "Integer", "Float", "Boolean"].include(value);
70
+ }
71
+ }));
72
+
73
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
74
+ class: "Feature", feature: "type",
75
+ message: "features of kind 'attribute' must only reference primitive types (Datatype or Enum)",
76
+ checker: function(element, target) {
77
+ return !element.featureValues("kind").include("attribute") || !target || ["Datatype", "Enum"].include(target.mmClass.name);
78
+ }
79
+ }));
80
+
81
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
82
+ class: "Feature", feature: "type",
83
+ message: "features of kind 'reference' or 'containment' must only reference classes",
84
+ checker: function(element, target) {
85
+ var kind = element.featureValues("kind");
86
+ return (!kind.include("reference") && !kind.include("containment")) || !target || target.mmClass.name == "Class";
87
+ }
88
+ }));
89
+
90
+ // load model if present
91
+ var modelData = $("model1").textContent;
92
+ if (modelData.isJSON()) {
93
+ ed.setModel(modelData);
94
+ $("controlbuttons").show();
95
+ }
96
+
97
+ function saveModel() {
98
+ new Ajax.Request("/save", {
99
+ method: 'post',
100
+ postBody: ed.getModel(),
101
+ });
102
+ }
103
+
104
+ function exitEditor() {
105
+ new Ajax.Request("/exit", { onSuccess: function() {$$("body").first().innerHTML = "<p>Editor exited. Close window.</p>"}});
106
+ }
107
+
108
+ Event.observe(window, 'click', function(event) {
109
+ ed.handleEvent(event);
110
+ });
111
+ Event.observe(window, 'keydown', function(event) {
112
+ ed.handleEvent(event);
113
+ });
114
+ Event.observe(window, 'mousemove', function(event) {
115
+ ed.handleEvent(event);
116
+ });
117
+ // ]]>
118
+ </script>
119
+ </body>
120
+ </html>
@@ -0,0 +1,135 @@
1
+ <html>
2
+ <head>
3
+ <link rel="stylesheet" href="../../example/themes/white.css" type="text/css" />
4
+ <link rel="stylesheet" href="../../example/themes/fold_button_dots_when_hidden.css" type="text/css" />
5
+ <link rel="stylesheet" href="../../example/metamodel_editor/style2.css" type="text/css" />
6
+ <script src="../../redist/prototype.js" type="text/javascript"></script>
7
+ <script src="../../redist/scriptaculous/scriptaculous.js" type="text/javascript"></script>
8
+ <script src="../../concrete/concrete.js" type="text/javascript"></script>
9
+ </head>
10
+ <body>
11
+ <div id="templates1" style="display: none">
12
+ <div class="ct_element ctc_Class" style="">
13
+ <div class="ct_reference ctn_superTypes ct_auto_hide" style="text-align: right; text-decoration: italic"><span class="ct_slot"></span></div>
14
+ <div class="ct_attribute ctn_name" style="text-align: center; font-size: 150%; border-bottom: 1px solid grey"><span class="ct_slot"></span></div>
15
+ <div class="ct_attribute ctn_abstract ct_always_hide" style="">abstract: <span class="ct_slot"></span></div>
16
+ <div class="ct_containment ctn_features" style="padding: 5px">
17
+ <div class="ct_slot"></div>
18
+ </div>
19
+ </div>
20
+ <div class="ct_element ctc_Feature" style="margin: 0">
21
+ <span class="ct_attribute ctn_kind ct_always_hide" style=""><span class="ct_slot"></span></span>
22
+ <span class="ct_attribute ctn_name" style=""><span class="ct_slot"></span></span>:
23
+ <span class="ct_reference ctn_type" style=""><span class="ct_slot"></span></span>
24
+ [<span class="ct_attribute ctn_lowerLimit ct_auto_hide" style=""><span class="ct_slot"></span></span>;
25
+ <span class="ct_attribute ctn_upperLimit ct_auto_hide" style=""><span class="ct_slot"></span></span>]
26
+ </div>
27
+ </div>
28
+
29
+ <div id="metamodel1" style="display: none">
30
+ [
31
+ {"_class": "Datatype", "name": "String"},
32
+ {"_class": "Datatype", "name": "Integer"},
33
+ {"_class": "Datatype", "name": "Boolean"},
34
+ {"_class": "Enum", "name": "FeatureKindType", "literals": ["attribute", "reference", "containment"]},
35
+ {"_class": "Class", "name": "Classifier", "abstract": true, "features": {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"}},
36
+ {"_class": "Class", "name": "Datatype", "superTypes": "Classifier"},
37
+ {"_class": "Class", "name": "Enum", "superTypes": "Datatype", "features": {"_class": "Feature", "name": "literals", "kind": "attribute", "lowerLimit": 1, "upperLimit": -1, "type": "String"}},
38
+ {"_class": "Class", "name": "Class", "superTypes": "Classifier", "features": [
39
+ {"_class": "Feature", "name": "superTypes", "kind": "reference", "upperLimit": -1, "type": "Class"},
40
+ {"_class": "Feature", "name": "features", "kind": "containment", "upperLimit": -1, "type": "Feature"},
41
+ {"_class": "Feature", "name": "abstract", "kind": "attribute", "upperLimit": 1, "type": "Boolean"}
42
+ ]},
43
+ {"_class": "Class", "name": "Feature", "features": [
44
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"},
45
+ {"_class": "Feature", "name": "kind", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "FeatureKindType"},
46
+ {"_class": "Feature", "name": "lowerLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
47
+ {"_class": "Feature", "name": "upperLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
48
+ {"_class": "Feature", "name": "type", "kind": "reference", "lowerLimit": 1, "upperLimit": 1, "type": "Classifier"}
49
+ ]}
50
+ ]
51
+ </div>
52
+
53
+ <div id="model1" style="display: none">
54
+ <!-- json model here -->
55
+ </div>
56
+
57
+ <div class="ct_editor" id="editor1">
58
+ </div>
59
+
60
+ <div id="controlbuttons" style="display: none">
61
+ <!-- the buttons will only be shown in ajax mode -->
62
+ <input type="button" style="margin: 10px" value="Save" onclick="saveModel();"/>
63
+ <input type="button" style="margin: 10px" value="Exit" onclick="exitEditor();"/>
64
+ </div>
65
+
66
+ <br/>
67
+ <textarea id="clipboard1" style="background-color: white; color: black; border: 1px solid grey" cols="80" rows="10" wrap="off"></textarea>
68
+
69
+ <script type="text/javascript" language="javascript" charset="utf-8">
70
+ // <![CDATA[
71
+ var tp = new Concrete.TemplateProvider($("templates1"), {identifierAttribute: "name"});
72
+ var mp = new Concrete.MetamodelProvider($("metamodel1").textContent.evalJSON());
73
+ var ip = new Concrete.QualifiedNameBasedIdentifierProvider({nameAttribute: "name", separator: "/", leadingSeparator: false});
74
+ var cb = new Concrete.Clipboard($("clipboard1"));
75
+ var ed = new Concrete.Editor($("editor1"), tp, mp, ip, {clipboard: cb,
76
+ rootClasses: mp.metaclasses.select(function(c) { return ["Class", "Datatype", "Enum"].include(c.name)})});
77
+
78
+ // Editor specific constraints
79
+
80
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
81
+ class: "Datatype", feature: "name",
82
+ message: "primitive types (Datatype) must be named 'String', 'Integer', 'Float' or 'Boolean'",
83
+ checker: function(element, value) {
84
+ return ["String", "Integer", "Float", "Boolean"].include(value);
85
+ }
86
+ }));
87
+
88
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
89
+ class: "Feature", feature: "type",
90
+ message: "features of kind 'attribute' must only reference primitive types (Datatype or Enum)",
91
+ checker: function(element, target) {
92
+ return !element.featureValues("kind").include("attribute") || !target || ["Datatype", "Enum"].include(target.mmClass.name);
93
+ }
94
+ }));
95
+
96
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
97
+ class: "Feature", feature: "type",
98
+ message: "features of kind 'reference' or 'containment' must only reference classes",
99
+ checker: function(element, target) {
100
+ var kind = element.featureValues("kind");
101
+ return (!kind.include("reference") && !kind.include("containment")) || !target || target.mmClass.name == "Class";
102
+ }
103
+ }));
104
+
105
+ // load model if present
106
+ var modelData = $("model1").textContent;
107
+ if (modelData.isJSON()) {
108
+ ed.setModel(modelData);
109
+ $("controlbuttons").show();
110
+ }
111
+
112
+ function saveModel() {
113
+ new Ajax.Request("/save", {
114
+ method: 'post',
115
+ postBody: ed.getModel(),
116
+ });
117
+ }
118
+
119
+ function exitEditor() {
120
+ new Ajax.Request("/exit", { onSuccess: function() {$$("body").first().innerHTML = "<p>Editor exited. Close window.</p>"}});
121
+ }
122
+
123
+ Event.observe(window, 'click', function(event) {
124
+ ed.handleEvent(event);
125
+ });
126
+ Event.observe(window, 'keydown', function(event) {
127
+ ed.handleEvent(event);
128
+ });
129
+ Event.observe(window, 'mousemove', function(event) {
130
+ ed.handleEvent(event);
131
+ });
132
+ // ]]>
133
+ </script>
134
+ </body>
135
+ </html>
@@ -0,0 +1,151 @@
1
+ <html>
2
+ <head>
3
+ <link rel="stylesheet" href="../../example/themes/white.css" type="text/css" />
4
+ <link rel="stylesheet" href="../../example/themes/fold_button_dots_when_hidden.css" type="text/css" />
5
+ <link rel="stylesheet" href="../../example/metamodel_editor/style3.css" type="text/css" />
6
+ <script src="../../redist/prototype.js" type="text/javascript"></script>
7
+ <script src="../../redist/scriptaculous/scriptaculous.js" type="text/javascript"></script>
8
+ <script src="../../concrete/concrete.js" type="text/javascript"></script>
9
+ </head>
10
+ <body>
11
+ <div id="templates1" style="display: none">
12
+ <div class="ct_element ctc_Class">
13
+ <span class="ct_handle ct_class_name">Class</span>
14
+ <span class="ct_attribute ctn_name ct_identifier_attribute">
15
+ <span class="ct_feature_name">name: </span><span class="ct_slot"></span>
16
+ </span>
17
+ <span class="ct_reference ctn_superTypes ct_auto_hide">
18
+ <span class="ct_feature_name">superTypes: </span><span class="ct_slot"></span>
19
+ </span>
20
+ <span class="ct_attribute ctn_abstract ct_auto_hide">
21
+ <span class="ct_feature_name">abstract: </span><span class="ct_slot"></span>
22
+ </span>
23
+ <div class="ct_containment ctn_features ct_auto_hide">
24
+ <span class="ct_feature_name">features: </span>
25
+ <table>
26
+ <thead>
27
+ <tr><td>Name</td><td>Kind</td><td>Lower Limit</td><td>Upper Limit</td><td>Type</td></tr>
28
+ </thead>
29
+ <tbody class="ct_slot">
30
+ </tbody>
31
+ </table>
32
+ </div>
33
+ </div>
34
+ <table> <!-- dummy table to make valid template dom -->
35
+ <tr class="ct_element ctc_Feature">
36
+ <td class="ct_attribute ctn_name"><span class="ct_slot"></span></td>
37
+ <td class="ct_attribute ctn_kind"><span class="ct_slot"></span></td>
38
+ <td class="ct_attribute ctn_lowerLimit"><span class="ct_slot"></span></td>
39
+ <td class="ct_attribute ctn_upperLimit"><span class="ct_slot"></span></td>
40
+ <td class="ct_reference ctn_type"><span class="ct_slot"></span></td>
41
+ </tr>
42
+ </table>
43
+ </div>
44
+
45
+ <div id="metamodel1" style="display: none">
46
+ [
47
+ {"_class": "Datatype", "name": "String"},
48
+ {"_class": "Datatype", "name": "Integer"},
49
+ {"_class": "Datatype", "name": "Boolean"},
50
+ {"_class": "Enum", "name": "FeatureKindType", "literals": ["attribute", "reference", "containment"]},
51
+ {"_class": "Class", "name": "Classifier", "abstract": true, "features": {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"}},
52
+ {"_class": "Class", "name": "Datatype", "superTypes": "Classifier"},
53
+ {"_class": "Class", "name": "Enum", "superTypes": "Datatype", "features": {"_class": "Feature", "name": "literals", "kind": "attribute", "lowerLimit": 1, "upperLimit": -1, "type": "String"}},
54
+ {"_class": "Class", "name": "Class", "superTypes": "Classifier", "features": [
55
+ {"_class": "Feature", "name": "superTypes", "kind": "reference", "upperLimit": -1, "type": "Class"},
56
+ {"_class": "Feature", "name": "features", "kind": "containment", "upperLimit": -1, "type": "Feature"},
57
+ {"_class": "Feature", "name": "abstract", "kind": "attribute", "upperLimit": 1, "type": "Boolean"}
58
+ ]},
59
+ {"_class": "Class", "name": "Feature", "features": [
60
+ {"_class": "Feature", "name": "name", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "String"},
61
+ {"_class": "Feature", "name": "kind", "kind": "attribute", "lowerLimit": 1, "upperLimit": 1, "type": "FeatureKindType"},
62
+ {"_class": "Feature", "name": "lowerLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
63
+ {"_class": "Feature", "name": "upperLimit", "kind": "attribute", "upperLimit": 1, "type": "Integer"},
64
+ {"_class": "Feature", "name": "type", "kind": "reference", "lowerLimit": 1, "upperLimit": 1, "type": "Classifier"} ]}
65
+ ]
66
+ </div>
67
+
68
+ <div id="model1" style="display: none">
69
+ <!-- json model here -->
70
+ </div>
71
+
72
+ <div class="ct_editor" id="editor1">
73
+ </div>
74
+
75
+ <div id="controlbuttons" style="display: none">
76
+ <!-- the buttons will only be shown in ajax mode -->
77
+ <input type="button" style="margin: 10px" value="Save" onclick="saveModel();"/>
78
+ <input type="button" style="margin: 10px" value="Exit" onclick="exitEditor();"/>
79
+ </div>
80
+
81
+ <br/>
82
+ <textarea id="clipboard1" style="background-color: white; color: black; border: 1px solid grey" cols="80" rows="10" wrap="off"></textarea>
83
+
84
+ <script type="text/javascript" language="javascript" charset="utf-8">
85
+ // <![CDATA[
86
+ var tp = new Concrete.TemplateProvider($("templates1"), {identifierAttribute: "name"});
87
+ var mp = new Concrete.MetamodelProvider($("metamodel1").textContent.evalJSON());
88
+ var ip = new Concrete.QualifiedNameBasedIdentifierProvider({nameAttribute: "name", separator: "/", leadingSeparator: false});
89
+ var cb = new Concrete.Clipboard($("clipboard1"));
90
+ var ed = new Concrete.Editor($("editor1"), tp, mp, ip, {clipboard: cb,
91
+ rootClasses: mp.metaclasses.select(function(c) { return ["Class", "Datatype", "Enum"].include(c.name)}),
92
+ selector: new Concrete.Selector({cursorEdgeOnly: false})});
93
+
94
+ // Editor specific constraints
95
+
96
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
97
+ class: "Datatype", feature: "name",
98
+ message: "primitive types (Datatype) must be named 'String', 'Integer', 'Float' or 'Boolean'",
99
+ checker: function(element, value) {
100
+ return ["String", "Integer", "Float", "Boolean"].include(value);
101
+ }
102
+ }));
103
+
104
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
105
+ class: "Feature", feature: "type",
106
+ message: "features of kind 'attribute' must only reference primitive types (Datatype or Enum)",
107
+ checker: function(element, target) {
108
+ return !element.featureValues("kind").include("attribute") || !target || ["Datatype", "Enum"].include(target.mmClass.name);
109
+ }
110
+ }));
111
+
112
+ ed.constraintChecker.addConstraint(new Concrete.ConstraintChecker.FeatureValueConstraint({
113
+ class: "Feature", feature: "type",
114
+ message: "features of kind 'reference' or 'containment' must only reference classes",
115
+ checker: function(element, target) {
116
+ var kind = element.featureValues("kind");
117
+ return (!kind.include("reference") && !kind.include("containment")) || !target || target.mmClass.name == "Class";
118
+ }
119
+ }));
120
+
121
+ // load model if present
122
+ var modelData = $("model1").textContent;
123
+ if (modelData.isJSON()) {
124
+ ed.setModel(modelData);
125
+ $("controlbuttons").show();
126
+ }
127
+
128
+ function saveModel() {
129
+ new Ajax.Request("/save", {
130
+ method: 'post',
131
+ postBody: ed.getModel(),
132
+ });
133
+ }
134
+
135
+ function exitEditor() {
136
+ new Ajax.Request("/exit", { onSuccess: function() {$$("body").first().innerHTML = "<p>Editor exited. Close window.</p>"}});
137
+ }
138
+
139
+ Event.observe(window, 'click', function(event) {
140
+ ed.handleEvent(event);
141
+ });
142
+ Event.observe(window, 'keydown', function(event) {
143
+ ed.handleEvent(event);
144
+ });
145
+ Event.observe(window, 'mousemove', function(event) {
146
+ ed.handleEvent(event);
147
+ });
148
+ // ]]>
149
+ </script>
150
+ </body>
151
+ </html>
@@ -0,0 +1,8 @@
1
+
2
+ /* Metamodel Specific Styles
3
+ *****************************************************************************/
4
+
5
+ /* add some space around the classes to make reading easier */
6
+ .ctc_Class {
7
+ padding: 2px 0 2px 0;
8
+ }