home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / minibuffer.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  7KB  |  279 lines

  1. /* ###########################################################################
  2.  *
  3.  *                 The MiniBuffer Class
  4.  *                 read minibuffer.h for more
  5.  *                 information.
  6.  * 
  7.  *           Copyright (C) 1995 Matthias Ettrich
  8.  *           Copyright (C) 1995-1998 The LyX Team.  
  9.  * 
  10.  * ###########################################################################
  11.  */
  12.  
  13. #include <config.h>
  14.  
  15. #ifdef __GNUG__
  16. #pragma implementation "minibuffer.h"
  17. #endif
  18.  
  19. #include "filetools.h"
  20. #include "lyx_main.h" 
  21. #include "lyxfunc.h"
  22. #include FORMS_H_LOCATION
  23. #include "minibuffer.h"  
  24. #include "LyXView.h"
  25. #include "error.h"
  26. #include "gettext.h"
  27.  
  28. //     $Id: minibuffer.C,v 1.1.1.1 1998/04/23 16:02:56 larsbj Exp $    
  29.  
  30. #if !defined(lint) && !defined(WITH_WARNINGS)
  31. static char vcid[] = "$Id: minibuffer.C,v 1.1.1.1 1998/04/23 16:02:56 larsbj Exp $";
  32. #endif /* lint */
  33.  
  34. extern bool keyseqUncomplete();
  35. extern LyXAction lyxaction;
  36.  
  37. void MiniBuffer::TimerCB(FL_OBJECT *, long tmp)
  38. {
  39.     MiniBuffer *obj= (MiniBuffer*)tmp;
  40.     obj->Init();
  41. }
  42.  
  43.  
  44. void MiniBuffer::ExecutingCB(FL_OBJECT *ob, long)
  45. {
  46.     MiniBuffer *obj = (MiniBuffer*)ob->u_vdata;
  47.     lyxerr.debug("Getting ready to execute: " + obj->cur_cmd);
  48.     fl_set_focus_object(obj->owner->getForm(),
  49.                 obj->owner->currentView()->getWorkArea());
  50.     if (obj->cur_cmd.empty()) { 
  51.         obj->Init();
  52.         return ; 
  53.     }
  54.     obj->Set(_("Executing:"), obj->cur_cmd);
  55.     obj->addHistory(obj->cur_cmd);
  56.     
  57.     // Split command into function and argument
  58.     // This is done wrong Asger. Instead of <function argument>
  59.     // it ends up as <argument function> Queer solution:
  60.     LString arg = obj->cur_cmd;
  61.     LString function;
  62.     if (arg.contains(" ")) {
  63.         arg.split(function, ' ');
  64.         function.strip();
  65.     } else {
  66.         function = arg;
  67.         arg.erase();
  68.     }
  69.     lyxerr.print("Function: " + function);
  70.     lyxerr.print("Arg     : " + arg);
  71.     // Check if the name is valid (ale)
  72.     // No, let the dispatch functions handle that.
  73.     //int action = lyxaction.LookupFunc(function.c_str());
  74.     //lyxerr.debug(LString("minibuffer action: ") + action);
  75.     //if (action>=0) {
  76.         // Dispatch only returns requested data for a few commands (ale)
  77.     LString res=obj->owner->getLyXFunc()->Dispatch(function.c_str(),
  78.                                arg.c_str());
  79.     lyxerr.print(LString("Minibuffer Res: ") + res);
  80. /*    if (!res.empty())
  81.         if(obj->owner->getLyXFunc()->errorStat())
  82.             obj->Set(_("Error:"), _(res.c_str()), LString(), 4);
  83.         else
  84.             obj->Set(_("Result:"), _(res.c_str()), LString(), 4);
  85.     else
  86.         obj->Init();
  87. */
  88.     //} else {
  89. #ifdef WITH_WARNINGS
  90. #warning Look at this.
  91. #endif
  92.     //obj->Set(_("Cannot find function"), function, "!");
  93.     obj->shows_no_match = false;
  94.     //}
  95.  
  96.     return ;
  97. }
  98.  
  99.  
  100. void MiniBuffer::ExecCommand()
  101. {
  102.     text.erase();
  103.     fl_set_input(the_buffer, "");
  104.     fl_set_focus_object(owner->getForm(),the_buffer);
  105. }
  106.  
  107.  
  108. FL_OBJECT *MiniBuffer::add(int type, FL_Coord x, FL_Coord y,
  109.                FL_Coord w, FL_Coord h)
  110. {
  111.     FL_OBJECT *obj;
  112.     
  113.     the_buffer = obj = fl_add_input(type,x,y,w,h,text.c_str());
  114.         fl_set_object_boxtype(obj,FL_DOWN_BOX);
  115.         fl_set_object_resize(obj, FL_RESIZE_ALL);
  116.         fl_set_object_gravity(obj, SouthWestGravity, SouthEastGravity);
  117.         fl_set_object_color(obj,FL_MCOL,FL_MCOL);
  118.         fl_set_object_lsize(obj,FL_NORMAL_SIZE);
  119.     fl_set_object_callback(obj,ExecutingCB, 0);
  120.  
  121.     // To intercept Up, Down, Table for history
  122.         fl_set_object_prehandler(obj, peek_event);
  123.         obj->u_vdata = (void*)this;
  124.         obj->wantkey = FL_KEY_TAB;
  125.     
  126.     // timer
  127.     timer = fl_add_timer(FL_HIDDEN_TIMER, 0,0,0,0, "Timer");
  128.     fl_set_object_callback(timer, TimerCB, (long)this);
  129.     fl_set_input(the_buffer, text.c_str());
  130.  
  131.     return obj;
  132. }
  133.  
  134.  
  135. // Added optional arg `delay_secs', defaults to 4.
  136. //When 0, no timeout is done. RVDK_PATCH_5 
  137. void MiniBuffer::Set(LString const& s1, LString const& s2,
  138.              LString const& s3, int delay_secs)
  139. {
  140.     setTimer(delay_secs);
  141.  
  142.     LString ntext = s1 + ' ' + s2 + ' ' + s3;
  143.     ntext.strip(' ');
  144.  
  145.     if (!the_buffer->focus) {
  146.         fl_set_input(the_buffer, ntext.c_str());
  147.         XFlush(fl_display);
  148.         text = ntext;
  149.     }
  150. }
  151.  
  152.  
  153. void MiniBuffer::Init()
  154. {
  155.     // If we have focus, we don't want to change anything.
  156.     if (the_buffer->focus)
  157.         return;
  158.  
  159.     // When meta-fake key is pressed, show the key sequence so far + "M-".
  160.     if (owner->getLyXFunc()->wasMetaKey()) {
  161.         text = owner->getLyXFunc()->keyseqStr();
  162.         text += " M-";
  163.     }
  164.  
  165.     // Else, when a non-complete key sequence is pressed,
  166.     // show the available options.
  167.     else if (owner->getLyXFunc()->keyseqUncomplete()) 
  168.         text = owner->getLyXFunc()->keyseqOptions();
  169.    
  170.     // Else, show the buffer state.
  171.     else {
  172.         if (owner->currentView()->available()) {
  173.             LString nicename =
  174.                 MakeDisplayPath(owner->currentBuffer()->
  175.                         getFileName());
  176.             // Should we do this instead? (kindo like emacs)
  177.             // leaves more room for other information
  178.             text = "LyX: ";
  179.             text += nicename;
  180.             if (owner->currentBuffer()->lyxvc.inUse()) {
  181.                 text += " [RCS:";
  182.                 text += owner->currentBuffer()->lyxvc.getVersion();
  183.                 text += ' ';
  184.                 text += owner->currentBuffer()->lyxvc.getLocker();
  185.                 if (owner->currentBuffer()->isReadonly())
  186.                     text += " (RO)";
  187.                 text += ']';
  188.             } else if (owner->currentBuffer()->isReadonly())
  189.                 text += " [RO]";
  190.             if (!owner->currentBuffer()->isLyxClean())
  191.                 text += _(" (Changed)");
  192.         } else {
  193.             text = _("* No document open *");
  194.         }
  195.     }
  196.  
  197.     fl_set_input(the_buffer, text.c_str());
  198.     setTimer(0);
  199.     XFlush(fl_display);
  200. }
  201.  
  202.  
  203. // allows to store and reset the contents one time. Usefull for
  204. // status messages like "load font" (Matthias)
  205. void MiniBuffer::Store()
  206. {
  207.     text_stored = fl_get_input(the_buffer);
  208. }
  209.  
  210.  
  211. void MiniBuffer::Reset()
  212. {
  213.     if (!text_stored.empty()){
  214.         Set(text_stored);
  215.         text_stored.erase();
  216.     }
  217. }
  218.  
  219. void MiniBuffer::Activate()
  220. {
  221.     fl_activate_object(the_buffer);
  222. }
  223.  
  224. void MiniBuffer::Deactivate()
  225. {
  226.     fl_deactivate_object(the_buffer);
  227. }
  228.  
  229.  
  230. // This is not as dirty as it seems, the hidden buttons removed by this
  231. // function were just kludges for an uncomplete keyboard callback (ale)
  232. int MiniBuffer::peek_event(FL_OBJECT *ob, int event, FL_Coord, FL_Coord,
  233.                int key, void */*xev*/)
  234. {
  235.     MiniBuffer *mini = (MiniBuffer*)ob->u_vdata;
  236.     
  237.     if (event==FL_KEYBOARD){
  238.         switch (key) {
  239.         case XK_Down:
  240.             mini->history_idx++;
  241.             if (!mini->getHistory().empty()) {
  242.                 fl_set_input(ob, mini->getHistory().c_str());
  243.             } else
  244.                 mini->history_idx--;
  245.             return 1; 
  246.         case XK_Up:
  247.             if (mini->history_idx > 0) mini->history_idx--;
  248.             fl_set_input(ob, mini->getHistory().c_str());
  249.             return 1; 
  250.         case 9:
  251.         case XK_Tab:
  252.         {
  253.             // complete or increment the command
  254.             LString s = lyxaction.getApproxFuncName(fl_get_input(ob));
  255.             if (!s.empty())
  256.                 fl_set_input(ob, s.c_str());
  257.             return 1; 
  258.         }
  259.         case 27:
  260.         case XK_Escape:
  261.             // Abort
  262.             fl_set_focus_object(mini->owner->getForm(),
  263.                         mini->owner->currentView()->getWorkArea());
  264.             mini->Init();
  265.             return 1; 
  266.         case 13:
  267.         case XK_Return:
  268.             // Execute a command. 
  269.             mini->cur_cmd = LString(fl_get_input(ob));
  270.             ExecutingCB(ob, 0);
  271.             return 1;
  272.         default:
  273.             return 0;
  274.         }
  275.     }
  276.     return 0;
  277. }
  278.  
  279.