// -*- mode:C++ ; compile-command: "g++ -I.. -I../include -I../../giac/include -g -c Help1.cc" -*- #include "Help1.h" #include "Xcas1.h" /* * Copyright (C) 2000,2014 B. Parisse, Institut Fourier, 38402 St Martin d'Heres * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBFLTK #include #include #include #include #include "vector.h" #include #include #include #include // for nanosleep #include #include #include // auto-recovery function using namespace std; using namespace giac; #ifndef NO_NAMESPACE_XCAS namespace xcas { #endif // ndef NO_NAMESPACE_XCAS string translate_html_title(const string & s){ if (debug_infolevel) cerr << s << endl; int l=s.size(); string res; for (int i=0;i=l || pos<=i) res +=s[i]; else { unsigned code=0,base=10; char c; for (int cur=i+2;cur<=pos;++cur){ c=s[cur]; if (c=='x' || c=='X') base=16; if (c=='o' || c=='O') base=8; if (c!=';'){ if (base!=16) code = code*base+c-'0'; else { if (c>='A' && c<='F') code = code*base + c-'A'+10; if (c>='a' && c<='f') code = code*base + c-'a'+10; if (c>='0' && c<='9') code = code*base + c-'0'; } continue; } switch (code){ case 0xe8: case 0xe9: case 0xea: c='e'; break; case 0xe0: case 0xe2: c='a'; break; case 0xf4: c='o'; break; case 0xf9: case 0xfb: c='u'; break; case 0xe7: c='c'; break; case 238: c='i'; break; case 0x2019: c=' '; break; } // end switch break; } // end loop for (cur=i;cur v; if (!w){ #ifdef IPAQ int dx=230,dy=140,l=10; #else int dx=460,dy=260,l=20; #endif if (xcas::Xcas_input_focus && xcas::Xcas_input_focus->window()){ dx=max(dx,2*xcas::Xcas_input_focus->window()->w()/3); dy=max(dy,2*xcas::Xcas_input_focus->window()->h()/3); l=xcas::Xcas_input_focus->window()->labelsize(); } l += 6; Fl_Group::current(0); w = new Fl_Window(dx,dy); w->label(gettext("Find word in HTML help")); button0 = new Fl_Button(2,2,dx/2-4,l); button1 = new Fl_Button(dx/2+2,2,dx/2-4,l); in = new Fl_Input(dx/4,l+4,3*dx/4-2,l); br = new Fl_Hold_Browser(2,2*l+6,dx-4,dy-2*l-8); w->end(); l -= 6; change_group_fontsize(w,l); button0->shortcut("^["); button1->label(gettext("Finish")); button1->color(FL_ROUGE_PALE); in->label(gettext("Searching for ")); in->when(FL_WHEN_ENTER_KEY|FL_WHEN_NOT_CHANGED); } if (!s_orig.empty()){ in->value(s_orig.c_str()); in->position(s_orig.size(),s_orig.size()); } Fl::focus(in); // Xcas->hide(); w->resizable(w); w->set_modal(); w->show(); Fl::wait(0.0001); int r=0; for (;r!=1;){ button0->label(br->size()>0?gettext("View"):gettext("Find")); button0->color(FL_VERT_PALE); for (;;) { Fl_Widget *o = Fl::readqueue(); if (!o) Fl::wait(); else { if (o == button0) { // view help file int tmp=br->value(); if (tmp) { if (use_external_browser) system_browser_command(v[tmp-1]); else { use_external_browser=false; if (Xcas_help_window){ Xcas_help_window->load((v[tmp-1]).c_str()); xcas::Xcas_help_window->show(); } } } else { if (!br->size()) in->do_callback(); else fl_alert(gettext("Please select the title of the page")); } } if (o == button1) {r = 1; break;} if (o == w) { r=1; break; } if (o==in) { break; } } } if (r==0){ string s=help_translate(in->value()); button0->label(gettext("Stop")); button0->color(FL_MAGENTA); br->clear(); // fill browser //multimap::const_iterator it=html_mtt.begin(),itend=html_mtt.end(); v.clear(); vector::const_iterator it=html_vall.begin(),itend=html_vall.end(); for (;it!=itend;++it){ Fl_Widget *o = Fl::readqueue(); if (o){ if (o==button0) {break;} if (o==button1 || o==w){ r=1; break; } } else { if ( ! ((itend-it)%10) ) Fl::wait(0.0001); } //string fname(absolute_path(it->second)); string fname(absolute_path(*it)); // remove #... part at the end of the URL int lf=fname.size()-1; for (;lf>0;--lf){ if (fname[lf]=='#'){ fname=fname.substr(0,lf); break; } } if (grep(fname,s)){ FILE * f=fopen(fname.c_str(),"r"); if (f && grep(f,"")){ string title; for (;!feof(f) && !ferror(f);){ char c=fgetc(f); if (feof(f) || c=='<') break; title += c; } fclose(f); br->add(translate_html_title(title).c_str()); //v.push_back(it->second); v.push_back(*it); br->redraw(); } } } // end for (;it!=itend;) } // end if (r==0) } // end for (;;) w->hide(); } #ifndef NO_NAMESPACE_XCAS } // namespace giac #endif // ndef NO_NAMESPACE_XCAS #endif // HAVE_LIBFLTK