The Meta-Environment API
00001 #ifndef __TERM_EDITOR_UTILS__ 00002 #define __TERM_EDITOR_UTILS__ 00003 00004 #include <editing.tb> 00005 #include <term-utils.tb> 00006 #include <sdf-module-utils.tb> 00007 00008 process EditTerm(Path: str, ModuleId: module-id, GetTree: bool) is 00009 let 00010 Event: attribute-changed-event, 00011 AlreadyExists: bool, 00012 Available: bool, 00013 EditorType: term, 00014 Error: str, 00015 Modulename: str, 00016 Sid: session-id, 00017 Tree: term, 00018 Valid: bool, 00019 Languagename: str, 00020 Menuname: str 00021 in 00022 CheckSanity(Path, ModuleId, Valid?) 00023 . 00024 if equal(Valid, true) then 00025 Edit(Path, Sid?) 00026 . 00027 if not-equal(Sid, UNDEFINED) then 00028 MM-GetAttribute(ModuleId, SDF_NAMESPACE, "name", Modulename?) 00029 . ComputeCanonicalLanguagename(Modulename, Languagename?) 00030 . EditorType := quote(term-editor(Languagename)) 00031 . EditText(Sid, EditorType, AlreadyExists?) 00032 . snd-msg(term-editor-started(Path, ModuleId, Sid)) 00033 . 00034 if equal(AlreadyExists, false) then 00035 snd-msg(te-set-info(Sid, Modulename)) 00036 . snd-msg(em-bind-session(Sid, ModuleId)) 00037 . rec-msg(em-session-bound(Sid, ModuleId)) 00038 . 00039 if equal(GetTree, true) then 00040 GetTermParsetree(ModuleId, Path, Tree?) 00041 . SE-UpdateTree(Sid, Tree) 00042 else 00043 tau 00044 fi 00045 . MM-Subscribe-Attribute-Changed(ModuleId, SDF_NAMESPACE,"status",<term>,complete) 00046 . 00047 ( 00048 MenuSelected(Sid, EditorType) 00049 + 00050 MouseClicked(Sid) 00051 + 00052 rec-msg(te-contents-changed(Sid)) 00053 /*. TODO("Add status of term to module manager, so it can be used to clear the cached term parsetree.")*/ 00054 . snd-note(term-modified(Path)) 00055 . RemoveSummaryFor(Path) 00056 + 00057 rec-msg(te-contents-saved(Sid)) 00058 . UpdateTextRepository(Sid) 00059 . UpdateTermStructure(Sid) 00060 + 00061 rec-note(mm-attribute-changed(Event?)) 00062 /*. printf("SDF changed so must reparse editor\n")*/ 00063 . ClearTermParsetreeCache(Path) 00064 . UpdateTermStructure(Sid) 00065 ) 00066 * 00067 EditorDisconnected(Sid) 00068 . DeleteSession(Sid) 00069 . RemoveSummaryFor(Path) 00070 else 00071 tau 00072 fi 00073 else 00074 Error := "Term is too big." 00075 . snd-msg(term-editor-not-started(Path, ModuleId, Error)) 00076 fi 00077 else 00078 Error := "Term is already being edited over a different module." 00079 . snd-msg(term-editor-not-started(Path, ModuleId, Error)) 00080 fi 00081 endlet 00082 00083 process UpdateTermStructure(Sid: session-id) is 00084 let 00085 ModuleId: module-id, 00086 Slices: list, 00087 Tree: term, 00088 Path: str 00089 in 00090 GetModuleId(Sid, ModuleId?) 00091 . GetPath(Sid, Path?) 00092 . DeleteStructureEditor(Sid) 00093 . GetTermParsetree(ModuleId, Path, Tree?) 00094 . 00095 if not-equal(Tree, UNDEFINED) then 00096 SE-UpdateTree(Sid, Tree) 00097 else 00098 tau 00099 fi 00100 endlet 00101 00102 process ActivateEditorWithTree(Tree: term, ModuleId: module-id, Filename: str) is 00103 let 00104 Error: term, 00105 Pid: int, 00106 Sid: session-id, 00107 Text: str, 00108 ErrorMessage: str 00109 in 00110 if not-equal(Tree, UNDEFINED) then 00111 snd-msg(unparse(Tree)) 00112 . rec-msg(unparsed-text(Text?)) 00113 . snd-msg(io-write-text-list(Filename, [Text])) 00114 . 00115 ( 00116 rec-msg(io-file-written) 00117 . create(EditTerm(Filename, ModuleId, false), Pid?) 00118 . 00119 ( 00120 rec-msg(term-editor-started(Filename, ModuleId, Sid?)) 00121 . SE-UpdateTree(Sid, Tree) 00122 . PutCachedValue(TERM_TREE_CACHE, Filename, Tree) 00123 + 00124 rec-msg(term-editor-not-started(Filename, ModuleId, ErrorMessage?)) 00125 . printf("error: %s\n", ErrorMessage) 00126 ) 00127 + 00128 rec-msg(io-file-not-written(Error?)) 00129 . printf("error: %s not written, %t\n", Filename, Error) 00130 ) 00131 fi 00132 endlet 00133 00134 process DumpTermParsetree(ModuleId: module-id, Path: str, Filename: str) is 00135 let 00136 Error: term, 00137 Parsetree: term 00138 in 00139 AddJob(Filename) 00140 . GetTermParsetree(ModuleId, Path, Parsetree?) 00141 . 00142 if not-equal(Parsetree, UNDEFINED) then 00143 snd-msg(io-unpack-and-write-term-in-baf(Filename, Parsetree)) 00144 . 00145 ( 00146 rec-msg(io-file-written) 00147 + 00148 rec-msg(io-file-not-written(Error?)) 00149 ) 00150 else 00151 tau 00152 fi 00153 . JobDone(Filename) 00154 endlet 00155 00156 process DumpTermFocusParsetree(EditorId: session-id, Filename: str) is 00157 let 00158 Error: term, 00159 Parsetree: term 00160 in 00161 AddJob(Filename) 00162 . GetFocus(EditorId, Parsetree?) 00163 . 00164 if not-equal(Parsetree, UNDEFINED) then 00165 snd-msg(io-unpack-and-write-term-in-baf(Filename, Parsetree)) 00166 . 00167 ( 00168 rec-msg(io-file-written) 00169 + 00170 rec-msg(io-file-not-written(Error?)) 00171 ) 00172 else 00173 tau 00174 fi 00175 . JobDone(Filename) 00176 endlet 00177 00178 #endif /* __TERM_EDITOR_UTILS__ */