00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00030
00031
00032
00033 #ifndef OPERATOR_H
00034 #define OPERATOR_H
00035
00036
00037 #ifdef __GNUG__
00038 #pragma interface "Operator.h"
00039 #endif
00040
00041
00042 #include "mc/Decoration.h"
00043
00044
00045
00046 mcDEFINE_HELPER_CLASSES(mcOperator)
00047
00048
00049
00050
00051
00052 class mcOperatorHelpers : public mcDecorationHelpers
00053 {
00054 #ifdef mcENABLE_DATA
00055 public:
00056
00061
00064 mcElementType mdata_nType;
00065
00067 #define mcNUM_OPERATORS 4
00068
00071 mcKey kOpBeginChar[mcNUM_OPERATORS];
00072
00076 static wxString strOpSymbol[mcNUM_OPERATORS];
00077
00080
00081
00083
00084 #endif
00085
00086
00087
00088 #ifdef mcENABLE_GUI
00089 protected:
00090
00098 static wxSize sgui_szReal[mcNUM_OPERATORS][mcELEMENTMATH_MAX_EXPDEPTH];
00099
00101 static wxSize sgui_sz[mcELEMENTMATH_MAX_EXPDEPTH];
00102
00105 static const mcStyleArray *sgui_pLastStyle;
00106
00107 #endif
00108
00109
00110
00111
00112 #ifdef mcENABLE_MATH
00113 protected:
00114
00116 int m_nPriority;
00117
00118 #endif
00119
00120
00121
00122 public:
00123
00124 mcOperatorHelpers() {
00125 mdata_nType = mcET_INVALID;
00126 }
00127
00128 virtual ~mcOperatorHelpers() {}
00129
00130
00131
00132 #ifdef mcENABLE_DATA
00133 public:
00134
00135
00137 bool data_isAllowedBefore(mcElementType type) const;
00138
00139
00140 int data_GetOpIndex() const { return data_GetOpIndex(data_GetType()); }
00141 wxString data_GetOpSymbol() const { return data_GetOpSymbol(data_GetType()); }
00142
00143
00144 void data_DeepCopy(const mcElementHelpers *p) {
00145 const mcOperatorHelpers *o = (const mcOperatorHelpers *)p;
00146 mdata_nType = o->mdata_nType;
00147 mcDecorationHelpers::data_DeepCopy(p);
00148 }
00149
00150
00152 static int data_GetOpIndex(mcElementType t) {
00153 mcASSERT(t != mcET_INVALID, wxT("Invalid operator type"));
00154 return t-mcET_ADDOP;
00155 }
00156
00158 static wxString data_GetOpSymbol(mcElementType t) {
00159 mcASSERT(t != mcET_INVALID, wxT("Invalid operator type"));
00160 return strOpSymbol[data_GetOpIndex(t)];
00161 }
00162
00164 static bool data_isOp(mcElementType t) {
00165 return (t == mcET_ADDOP || t == mcET_SUBOP ||
00166 t == mcET_MULTOP || t == mcET_DIVOP);
00167 }
00168
00169 #endif // mcENABLE_DATA
00170
00171
00172
00173
00174 #ifdef mcENABLE_GUI
00175 public:
00176
00180
00181 bool gui_isBeginKey(const mcKey &ev) const;
00182
00183
00184
00185 bool gui_isEndKey(const mcKey &ev) const { return TRUE; }
00186
00187 mcMoveCursorRes gui_MoveCursor(mcMoveCursorFlag flag, long modifiers);
00188 mcInputRes gui_Input(const mcKey &ev, mcElement *newelem);
00189 int gui_MoveCursorUsingPoint(wxDC &dc, const wxPoint &p);
00190 int gui_Draw(wxDC &dc, int x, int y, long flags, const wxPoint &pt) const;
00191 int gui_GetRelCursorPos(wxDC &dc, wxPoint *pt) const;
00192 void gui_DoRecalcSize();
00193
00194
00195 void gui_GetCursorPos(mcCursorPos &p) const { p.gui_Push(mcCP_BEGINEND); }
00196 void gui_SetCursorPos(const mcCursorPos &) { ; }
00197 bool gui_LetInCursor(mcCursorPos code) { return FALSE; }
00198
00201 wxSize gui_GetRealSize() const
00202 { return sgui_szReal[data_GetType()-mcET_ADDOP][gui_GetExpDepth()]; }
00203
00205
00206 #endif // mcENABLE_GUI
00207
00208
00209
00210
00211 #ifdef mcENABLE_MATH
00212 public:
00213
00215 mcRealValue math_GetLenght() const { return 1.5; }
00216
00217
00221
00225 virtual bool math_CanBeApplied(const mcElement &l, const mcElement &r) const = 0;
00226
00229 virtual mcBasicOpRes math_Apply(mcElement &, const mcElement &, mcElement *) const = 0;
00230
00233 virtual mcBasicOpRes math_ApplySimple(mcElement &, const mcElement &) const = 0;
00234
00236 virtual mcRealValue math_Evaluate(mcRealValue val, mcRealValue val2) const = 0;
00237
00238
00239
00240 bool math_Compare(const mcElement &p, long flags) const
00241 { return math_CompareThisOnly(p, flags); }
00242
00243
00245 #endif // mcENABLE_MATH
00246
00247
00248
00249 #ifdef mcENABLE_IO
00250 public:
00251
00252 bool io_isBeginTag(const wxXml2Node &tag) const;
00253 bool io_isBeginChar(const wxString &str) const;
00254
00255
00256 wxXml2Node io_GetMathML(bool bGetPresentation) const;
00257 wxString io_GetInlinedExpr() const;
00258
00259 bool io_ImportPresentationMathML(wxXml2Node tag, wxString &pErr);
00260 bool io_ImportInlinedExpr(const wxString &, int *count, wxString &pErr);
00261
00262 #endif // mcENABLE_IO
00263 };
00264
00265
00266
00267
00270 class mcOperator : public mcDecoration
00271 {
00272 mcDEFINE_ABSTRACT_CLASS(Operator, mcDecoration);
00273
00274 public:
00275
00276 static wxString data_GetOpSymbol(mcElementType t)
00277 { return mcOperatorHelpers::data_GetOpSymbol(t); }
00278
00279 wxString data_GetOpSymbol() const
00280 { return hlp()->data_GetOpSymbol(); }
00281
00282 bool data_isValidContainerFor(mcElementType t) const
00283 { return t == mcET_ADDOP || t == mcET_MULTOP ||
00284 t == mcET_SUBOP || t == mcET_DIVOP; }
00285
00286 mcWRAPPER bool math_CanBeApplied(const mcElement &l, const mcElement &r) const
00287 { return hlp()->math_CanBeApplied(l, r); }
00288
00289 mcWRAPPER mcBasicOpRes math_Apply(mcElement &l, const mcElement &r, mcElement *pp) const
00290 { return hlp()->math_Apply(l, r, pp); }
00291
00292 mcWRAPPER mcBasicOpRes math_ApplySimple(mcElement &l, const mcElement &r) const
00293 { return hlp()->math_ApplySimple(l, r); }
00294
00295 mcWRAPPER mcRealValue math_Evaluate(mcRealValue val, mcRealValue val2) const
00296 { return hlp()->math_Evaluate(val, val2); }
00297 };
00298
00299
00300 #endif // OPERATOR_H
00301
00302