summaryrefslogtreecommitdiff
path: root/src/www/minibar/minibar.js
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2011-10-12 17:03:54 +0000
committerhallgren <hallgren@chalmers.se>2011-10-12 17:03:54 +0000
commit44d1a5a9f71b03d9aceeccd760a63fcdc45f8bad (patch)
treed51076a708997d6f1af6ac0deefd535bbc25f804 /src/www/minibar/minibar.js
parent0aba45560d2033c37c3d2e876e6f3ef89e1554d6 (diff)
Improvements of "gf -server" mode and related setup
"gf -server" mode now contains everything needed to run the minibar and the grammar editor (including example-based grammar writing). The Setup.hs script installs the required files where gf -server can find them. These files have been moved to a new directory: src/www. The separate server program pgf-http is now obsolete.
Diffstat (limited to 'src/www/minibar/minibar.js')
-rw-r--r--src/www/minibar/minibar.js176
1 files changed, 176 insertions, 0 deletions
diff --git a/src/www/minibar/minibar.js b/src/www/minibar/minibar.js
new file mode 100644
index 000000000..778a3957b
--- /dev/null
+++ b/src/www/minibar/minibar.js
@@ -0,0 +1,176 @@
+/* minibar.js
+needs: minibar_support.js, minibar_input.js, minibar_translations.js, support.js
+*/
+
+/*
+// This is essentially what happens when you call start_minibar:
+if(server.grammar_list) grammars=server.grammar_list;
+else grammars=server.get_grammarlist();
+show_grammarlist(grammars)
+select_grammar(grammars[0])
+grammar_info=server.get_languages()
+show_languages(grammar_info)
+new_language()
+complete_output=get_completions()
+show_completions(complete_output)
+*/
+
+// For backward compatibility:
+function start_minibar(server,opts,target) {
+ if(target) opts.target=target;
+ return new Minibar(server,opts);
+}
+
+/* --- Main Minibar object -------------------------------------------------- */
+function Minibar(server,opts) {
+ // Contructor, typically called when the HTML document is loaded
+
+ /* --- Configuration ---------------------------------------------------- */
+
+ // default values for options:
+ this.options={
+ target: "minibar",
+ try_google: true,
+ feedback_url: null,
+ help_url: null
+ }
+
+ // Apply supplied options
+ if(opts) for(var o in opts) this.options[o]=opts[o];
+
+ /* --- Creating the components of the minibar --------------------------- */
+ this.translations=new Translations(server,this.options)
+ this.input=new Input(server,this.translations,this.options)
+
+ /* --- Creating user interface elements --------------------------------- */
+
+ this.menubar=empty("div");
+ this.extra=div_id("extra");
+
+ this.minibar=element(this.options.target);
+ this.minibar.innerHTML="";
+ with(this) {
+ appendChildren(menubar,[input.menus,translations.menus,input.buttons])
+ appendChildren(minibar,[menubar,input.main,translations.main,extra]);
+ append_extra_buttons(extra,options);
+ }
+
+ /* --- Minibar client state initialisation ------------------------------ */
+ this.grammar=null;
+
+ this.server=server;
+
+ /* --- Main program, this gets things going ----------------------------- */
+ with(this) {
+ if(server.grammar_list) show_grammarlist(server.grammar_list);
+ else server.get_grammarlist(bind(show_grammarlist,this));
+ }
+}
+
+Minibar.prototype.show_grammarlist=function(grammars) {
+ this.grammar_menu=empty_id("select","grammar_menu");
+ with(this) {
+ if(grammars.length>1) {
+ function opt(g) { return option(g,g); }
+ appendChildren(grammar_menu,map(opt,grammars));
+ grammar_menu.onchange=
+ bind(function() { select_grammar(grammar_menu.value); },this);
+ insertFirst(menubar,grammar_menu);
+ insertFirst(menubar,text("Grammar: "));
+ }
+ if(options.help_url)
+ menubar.appendChild(button("Help",bind(open_help,this)));
+ select_grammar(grammars[0]);
+ }
+}
+
+Minibar.prototype.select_grammar=function(grammar_name) {
+ var t=this;
+ //debug("select_grammar ");
+ function change_grammar() {
+ t.server.grammar_info(bind(t.change_grammar,t));
+ }
+ t.server.switch_grammar(grammar_name,change_grammar);
+}
+
+Minibar.prototype.change_grammar=function(grammar_info) {
+ var t=this;
+ with(t) {
+ //debug("show_languages ");
+ grammar=grammar_info;
+
+ input.change_grammar(grammar)
+ translations.change_grammar(grammar)
+ }
+}
+
+Minibar.prototype.append_extra_buttons=function(extra,options) {
+ with(this) {
+ if(options.try_google)
+ extra.appendChild(button("Try Google Translate",bind(try_google,this)));
+ if(options.feedback_url)
+ appendChildren(extra,[text(" "),button("Feedback",bind(open_feedback,this))]);
+ }
+}
+
+Minibar.prototype.try_google=function() {
+ with(this) {
+ var to=translations.target_lang();
+ var s=input.current.input;
+ if(input.surface.typed) s+=input.surface.typed.value;
+ var url="http://translate.google.com/?sl="
+ +langpart(input.current.from,grammar.name);
+ if(to!="All") url+="&tl="+to;
+ url+="&q="+encodeURIComponent(s);
+ window.open(url);
+ }
+}
+
+Minibar.prototype.open_help=function() {
+ with(this) open_popup(options.help_url,"help");
+}
+
+Minibar.prototype.open_feedback=function() {
+ with(this) {
+ // make the minibar state easily accessible from the feedback page:
+ minibar.state={grammar:grammar,current:input.current,
+ to:translations.to_menu.value,
+ translations:translations.translations};
+ open_popup(options.feedback_url,'feedback');
+ }
+}
+
+// This function is called from feedback.html
+function prefill_feedback_form() {
+ var state=opener_element("minibar").state;
+ var trans=state.translations;
+ var gn=state.grammar.name
+ var to=langpart(state.to,gn);
+
+ var form=document.forms.namedItem("feedback");
+ setField(form,"grammar",gn);
+ setField(form,"from",langpart(state.current.from,gn));
+ setField(form,"input",state.current.input);
+ setField(form,"to",to);
+ if(to=="All") element("translation_box").style.display="none";
+ else setField(form,"translation",trans.single_translation.join(" / "));
+
+ // Browser info:
+ form["inner_size"].value=window.innerWidth+"×"+window.innerHeight;
+ form["outer_size"].value=window.outerWidth+"×"+window.outerHeight;
+ form["screen_size"].value=screen.width+"×"+screen.height;
+ form["available_screen_size"].value=screen.availWidth+"×"+screen.availHeight;
+ form["color_depth"].value=screen.colorDepth;
+ form["pixel_depth"].value=screen.pixelDepth;
+
+ window.focus();
+}
+
+
+/*
+se.chalmers.cs.gf.gwt.TranslateApp/align-btn.png
+
+GET /grammars/Foods.pgf?&command=abstrtree&tree=Pred+(This+Fish)+(Very+Fresh)
+GET /grammars/Foods.pgf?&command=parsetree&tree=Pred+(This+Fish)+Expensive&from=FoodsAfr
+GET /grammars/Foods.pgf?&command=alignment&tree=Pred+(This+Fish)+Expensive
+*/