The Meta-Environment API

term-editor-utils.tb

Go to the documentation of this file.
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__ */

Generated on Fri Sep 12 13:09:47 2008 for sdf-meta by  doxygen 1.4.6