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 / formulamacro.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  4KB  |  204 lines

  1. /*
  2.  *  File:        formula.h
  3.  *  Purpose:     Implementation of formula inset
  4.  *  Author:      Alejandro Aguilar Sierra <asierra@servidor.unam.mx> 
  5.  *  Created:     January 1996
  6.  *  Description: Allows the edition of math paragraphs inside Lyx. 
  7.  *
  8.  *  Copyright: (c) 1996, 1997 Alejandro Aguilar Sierra
  9.  *
  10.  *  Version: 0.4, Lyx project.
  11.  *
  12.  *   You are free to use and modify this code under the terms of
  13.  *   the GNU General Public Licence version 2 or later.
  14.  */
  15.  
  16. #include <config.h>
  17. #include <stdlib.h>
  18.  
  19. #ifdef __GNUG__
  20. #pragma implementation "formulamacro.h"
  21. #endif
  22.  
  23. #include "formulamacro.h"
  24. #include "commandtags.h"
  25. #include "math_cursor.h"
  26. #include "math_parser.h"
  27. #include "math_macro.h"
  28. #include "lyx_main.h"
  29. #include "bufferlist.h"
  30. #include "lyx_cb.h"
  31. #include "BufferView.h"
  32. #include "lyxscreen.h"
  33. #include "lyxdraw.h"
  34. #include "gettext.h"
  35.  
  36.  
  37. InsetFormulaMacro::InsetFormulaMacro():
  38.         InsetFormula(true)
  39. {
  40.     tmacro = 0;
  41.     opened = false;
  42. }
  43.  
  44.  
  45. InsetFormulaMacro::InsetFormulaMacro(LString nm, int na, bool /*e*/):
  46.         InsetFormula(true), name(nm)
  47. {
  48.     tmacro = MathMacroTable::mathMTable.getTemplate(name.c_str());
  49.     if (!tmacro) {
  50.     tmacro = new MathMacroTemplate(name.c_str(), na);
  51.     MathMacroTable::mathMTable.addTemplate(tmacro);
  52.     }
  53.     opened = false;
  54. }
  55.  
  56.  
  57. InsetFormulaMacro::~InsetFormulaMacro()
  58. {
  59.     par = 0;
  60. }
  61.  
  62.  
  63. Inset* InsetFormulaMacro::Clone()
  64. {
  65.    InsetFormulaMacro* f = new InsetFormulaMacro(name);
  66.    return (Inset*)f;
  67. }
  68.  
  69.  
  70. void InsetFormulaMacro::Write(FILE *file)
  71. {
  72.     fprintf(file, "FormulaMacro ");
  73.     Latex(file, 0);
  74. }
  75.  
  76.  
  77. int InsetFormulaMacro::Latex(FILE *file, signed char /*fragile*/)
  78. {
  79.     int ret = 1;
  80.     tmacro->WriteDef(file);
  81.     return ret;
  82. }
  83.  
  84.  
  85. int InsetFormulaMacro::Latex(LString &file, signed char /*fragile*/)
  86. {
  87.     int ret = 1;
  88.     tmacro->WriteDef(file);
  89.     return ret;
  90. }
  91.  
  92.  
  93. void InsetFormulaMacro::Read(LyXLex &lex)
  94. {
  95.     FILE *file = lex.getFile();
  96.     mathed_parser_file(file, lex.GetLineNo());   
  97.     mathed_parse(0, 0, (MathParInset **)&tmacro);
  98.     
  99.     // Update line number
  100.     lex.setLineNo(mathed_parser_lineno());
  101.     
  102.     MathMacroTable::mathMTable.addTemplate(tmacro);
  103.     name = tmacro->GetName();
  104.     par = tmacro;
  105. }
  106.  
  107.  
  108. int InsetFormulaMacro::Ascent(LyXFont const &f) const
  109. {
  110.     if (opened) {
  111.     tmacro->update();
  112.     return InsetFormula::Ascent(f);
  113.     }
  114.     return f.maxAscent()+3;
  115. }
  116.  
  117.  
  118. int InsetFormulaMacro::Descent(LyXFont const &f) const
  119. {
  120.     if (opened) {
  121.     tmacro->update();
  122.     return InsetFormula::Descent(f);
  123.     }
  124.     return f.maxDescent()+1;
  125. }
  126.  
  127.  
  128. int InsetFormulaMacro::Width(LyXFont const &f) const
  129. {
  130.     if (opened) {
  131.     tmacro->update();
  132.     return InsetFormula::Width(f);
  133.     }
  134.     LString ilabel(_("Macro: "));
  135.     ilabel += name;
  136.     return 6 + f.stringWidth(ilabel);
  137. }
  138.  
  139.  
  140. void InsetFormulaMacro::Draw(LyXFont font, LyXScreen &scr,
  141.                  int baseline, float &x)
  142. {
  143.     tmacro->update();
  144.     if (opened) {
  145.     tmacro->setEditMode(true);
  146.     InsetFormula::Draw(font, scr, baseline, x);
  147.     tmacro->setEditMode(false);    
  148.     } else {
  149.     font.setColor(LyXFont::MATH);
  150.     
  151.     int y=baseline - Ascent(font)+1;
  152.     int w=Width(font) - 2, h=(Ascent(font)+Descent(font)-2);
  153.  
  154.     
  155.     scr.fillRectangle(gc_lighted, int(x), y,  w,  h);
  156.     scr.drawFrame(FL_UP_FRAME, int(x), y, w, h, FL_BLACK, -1); 
  157.     
  158.         LString s(_("Macro: "));
  159.         s += name;
  160.         scr.drawString(font, s, baseline, int(x +2));
  161.     x +=  Width(font) - 1;
  162.     }
  163. }
  164.  
  165.  
  166. void InsetFormulaMacro::Edit(int x, int y)
  167. {
  168.     opened = true;
  169.     par = (MathParInset*)tmacro->Clone();
  170.     InsetFormula::Edit(x, y);
  171. }
  172.  
  173.            
  174. void InsetFormulaMacro::InsetUnlock()
  175. {
  176.     opened = false;
  177.     LyxArrayBase *tarray = tmacro->GetData();
  178.     MathedIter it(tarray);
  179.     it.Clear();
  180.     tmacro->SetData(par->GetData());
  181.     tmacro->setEditMode(false);
  182.     InsetFormula::InsetUnlock();
  183. }
  184.  
  185.  
  186. bool InsetFormulaMacro::LocalDispatch(int action, char const *arg)
  187. {
  188.     if (action==LFUN_MATH_MACROARG) {
  189.     int i = atoi(arg) - 1;
  190.     if (i>=0 && i<tmacro->getNoArgs()) {
  191.         mathcursor->Insert(tmacro->getMacroPar(i), LM_TC_INSET);
  192.         InsetFormula::UpdateLocal();
  193.     }
  194.     
  195.     return true;
  196.     }
  197.     tmacro->setEditMode(true);
  198.     tmacro->Metrics();
  199.     bool result = InsetFormula::LocalDispatch(action, arg);
  200.     tmacro->setEditMode(false);
  201.     
  202.     return result;
  203. }
  204.