Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

MathLine.h

Go to the documentation of this file.
00001 
00002 // MathCore = a WYSIWYG equation editor + a powerful math engine     //
00003 // Copyright (C) 2003 by Francesco Montorsi                          //
00004 //                                                                   //
00005 // This library is free software; you can redistribute it and/or     //
00006 // modify it under the terms of the GNU Lesser General Public        //
00007 // License as published by the Free Software Foundation; either      //
00008 // version 2.1 of the License, or (at your option) any later         //
00009 // version.                                                          //
00010 //                                                                   //
00011 // This library is distributed in the hope that it will be useful,   //
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of    //
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the      //
00014 // GNU Lesser General Public License for more details.               //
00015 //                                                                   //
00016 // You should have received a copy of the GNU Lesser General Public  //
00017 // License along with this program; if not, write to the Free        //
00018 // Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,   //
00019 // MA 02111-1307, USA.                                               //
00020 //                                                                   //
00021 // For any comment, suggestion or feature request, please contact    //
00022 // the administrator of the project at frm@users.sourceforge.net     //
00023 //                                                                   //
00030 
00031 
00032 
00033 #ifndef MATHLINE_H
00034 #define MATHLINE_H
00035 
00036 // optimization for GCC compiler
00037 #ifdef __GNUG__
00038 #pragma interface "MathLine.h"
00039 #endif
00040 
00041 // required includes
00042 #include <wx/dcmemory.h>
00043 #include "mc/MathMng.h"
00044 
00045 
00046 
00049 
00050 #define mcBMP_STDWIDTH  60
00051 #define mcBMP_STDHEIGHT  60 
00052 
00057 #define mcBMP_ADDEDWIDTH  30
00058 #define mcBMP_ADDEDHEIGHT  20
00059 
00064 #define mcBMP_SPACELEFT   5
00065 #define mcBMP_SPACERIGHT  5
00066 
00068 
00069 
00070 
00073 #define mcMATHLINE_DBG_BITMAP    256
00074 
00075 
00076 // global objects
00077 class mcMathLine;
00078 extern mcMathLine mcEmptyLine;
00079 
00080 
00081 
00085 class mcDoubleBufferedElement
00086 {
00087 public:
00088  mcDoubleBufferedElement() {}
00089  virtual ~mcDoubleBufferedElement() {}
00090 
00091 
00092 
00097  
00107  virtual int gui_UpdateBmp(int x, int y, long flags, const wxPoint &p) = 0;
00108  
00115  virtual int gui_DrawBmp(wxDC &dc, int x, int y) const = 0;
00116 
00119  virtual int gui_ForceBmpUpdate(int x, int y, long flags, const wxPoint &p) = 0;
00120 
00123  virtual bool gui_NeedsRefresh() const = 0;
00124 
00127  virtual void gui_SetMask(const wxColour &) = 0;
00128 
00131  virtual void gui_SetBmpBackgroundBrush(const wxBrush &) = 0;
00132  
00134 };
00135 
00136 
00137 
00138 
00148 class mcMathLineHelpers : public mcMathMngHelpers, public mcDoubleBufferedElement
00149 {
00150 #ifdef mcENABLE_GUI
00151 public:   // customizable variables
00152 
00156  static int sgui_nCursorWidth;
00157 
00158 protected: 
00159  
00163  wxBitmap mgui_bmpMath;
00164 
00166  wxBrush mgui_brushBmpBg;
00167 
00169  bool mgui_bUsingMask;
00170  
00172  int mgui_nLastID;
00173  
00175  int mgui_nCurrentID;
00176  
00178  //int mgui_nLastHeight;
00179 
00180 #endif
00181 
00182 
00183 public:
00184  
00188  mcMathLineHelpers() { data_Init(); }
00189  virtual ~mcMathLineHelpers() {}
00190 
00191 
00193  void gui_Init();
00194 
00195 
00196 
00197 #ifdef mcENABLE_DATA
00198 public:
00199  
00201  void data_DeepCopy(const mcElementHelpers *mbl);
00202  
00203 #ifdef __MCDEBUG__
00204 
00206  wxString data_Debug(long flags) const;
00207  
00208 #endif
00209 #endif  // mcENABLE_DATA
00210 
00211 
00212 
00213 #ifdef mcENABLE_GUI
00214 public:
00215 
00220  
00221  int gui_UpdateBmp(int x, int y, long flags, const wxPoint &p);
00222  int gui_DrawBmp(wxDC &dc, int x, int y) const;
00223 
00224  void gui_SetMask(const wxColour &);
00225  
00226  int gui_ForceBmpUpdate(int x, int y, long flags, const wxPoint &p)
00227  { return gui_UpdateBmp(x, y, flags, p); }
00228 
00229  bool gui_NeedsRefresh() const
00230  { return gui_isIDChanged(); }
00231 
00236  void gui_SetBmpBackgroundBrush(const wxBrush &br)
00237  { mgui_brushBmpBg = br; }
00238  
00244  void gui_ExpandBmp();
00245  
00248  bool gui_isIDChanged() const { 
00249   return (mgui_nLastID != mgui_nCurrentID); 
00250  }
00251 
00253  int gui_GetActiveElemID() const {
00254   return mgui_nCurrentID;
00255  }
00256  
00258 
00259 
00260 
00265 
00266  mcElement gui_GetSelection() const;  
00267  int gui_GetRelCursorPos(wxDC &dc, wxPoint *) const;
00268  int gui_MoveCursorUsingPoint(wxDC &, const wxPoint &);
00269  void gui_OnSelect(wxDC &dc, wxRect &);
00270 
00275  void gui_DoRecalcSize();
00276  
00278 
00279 #endif  // mcENABLE_GUI
00280 };
00281 
00282 
00287 class mcMathLine : public mcMathMng
00288 {
00289  // We cannot use the standard mcDEFINE_MAIN_CLASS(MathLine, mcMathMng)
00290  // macro because mcMathLine is based upon a non-abstract parent class
00291  // and thus we need to create some customized constructors.
00292  mcDEFINE_CLASS(MathLine);
00293 
00294 public:
00295 
00296  // VERY IMPORTANT:
00297  // since we don't want mcMathMng() to be called (since it would call
00298  // data_SetRefData(new mcMathMngHelpers()), we must always call another
00299  // mcMathMng constructor, maybe passing to it a NULL pointer to wrap...
00300  // Thus NEVER CALL IMPLICITLY THE DEFAULT mcMathMng CONSTRUCTOR
00301  mcMathLine(const mcElementHelpers *p) : mcMathMng(p) { data_CheckContainer(); }
00302  mcMathLine(const mcElement &v) : mcMathMng(v.hlp()) { data_CheckContainer(); }
00303  mcMathLine(const mcMathLine &toref) : mcMathMng(NULL) { data_Ref(toref); }
00304  mcMathLine() : mcMathMng(NULL) { data_SetRefData(new mcMathLineHelpers); }
00305 
00306  // math constructors
00307  mcMathLine(const mcPolynomial &left, const mcPolynomial &right) : mcMathMng(NULL) 
00308   { data_SetRefData(new mcMathLineHelpers); data_Init(left, right); }
00309  mcMathLine(const mcMathMng &p) : mcMathMng(NULL) {  
00310   mcMathLineHelpers *h = new mcMathLineHelpers();
00311   h->mcMathMngHelpers::data_DeepCopy(p.chlp());
00312   data_SetRefData(h);
00313  }
00314 
00315  virtual ~mcMathLine() {}
00316 
00317 
00318 
00319  bool data_isValidContainerFor(mcElementType t) const
00320   { return t == mcET_MATHMNG; }
00321 
00322  mcWRAPPER int gui_GetActiveElemID() const
00323   { return hlp()->gui_GetActiveElemID(); }
00324  mcWRAPPER int gui_isIDChanged() const
00325   { return hlp()->gui_isIDChanged(); }
00326  
00327  mcWRAPPER int gui_UpdateBmp(int x, int y, long flags, const wxPoint &p)
00328   { return hlp()->gui_UpdateBmp(x, y, flags, p); } 
00329  mcWRAPPER int gui_ForceBmpUpdate(int x, int y, long flags, const wxPoint &p)
00330   { return hlp()->gui_ForceBmpUpdate(x, y, flags, p); } 
00331  mcWRAPPER int gui_DrawBmp(wxDC &dc, int x, int y) const
00332   { return hlp()->gui_DrawBmp(dc, x, y); }
00333 };
00334 
00335 
00336 #endif // MATHLINE_H
00337 
00338 


Documentation generated with Doxygen on Sun Feb 6 17:10:47 2005
Visit MathStudio home page for more info

[ Top ]