00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef INC_MGUI_WYSIWYG_H
00033 #define INC_MGUI_WYSIWYG_H
00034
00035 #ifndef INC_MGUI_CTRL_H
00036 #include <mgui/ctrl.h>
00037 #endif
00038
00039 #ifndef INC_MI32_SIMPLEAR_H
00040 #include <mi32/simplear.h>
00041 #endif
00042
00043 struct TEXTSTYLE;
00044
00045 namespace MGUI {
00046
00047
00048
00049
00050 class CTRL_EDIT_TEXT_WYSIWYG : public MGUI::CTRL {
00051 public:
00052
00053 enum FLAGS {
00054 FLAG_Default = 0x0000,
00055 FLAG_ReadOnly = 0x0001,
00056 };
00057
00058
00059 CTRL_EDIT_TEXT_WYSIWYG (
00060 );
00061
00062
00063 virtual ~CTRL_EDIT_TEXT_WYSIWYG (
00064 );
00065
00066
00067 bool CanUndo (
00068 ) const
00069 #ifdef WIN32_MFC
00070 { return (m_ctrl.CanUndo() != FALSE); }
00071 #endif
00072 ;
00073
00074
00075 void ClearValue (
00076 bool notify = true
00077 );
00078
00079
00080 void ClearSelection (
00081 )
00082 #ifdef WIN32_MFC
00083 { m_ctrl.Clear(); }
00084 #endif
00085 ;
00086
00087
00088 void CutSelection (
00089 )
00090 #ifdef WIN32_MFC
00091 { m_ctrl.Cut(); }
00092 #endif
00093 ;
00094
00095
00096 void CopySelection (
00097 )
00098 #ifdef WIN32_MFC
00099 { m_ctrl.Copy(); }
00100 #endif
00101 ;
00102
00103
00104 void Create (
00105 MGUI::LAYOUT_PANE_BASE& ParentPane,
00106 int width = 0,
00107 int height = 0,
00108 FLAGS flags = FLAG_Default,
00109 MGUI::LAYOUT_SIZEALIGN sizealign = MGUI::LAYOUT_SIZEALIGN_FixedHeight
00110 );
00111
00112 #ifdef WIN32_MFC
00113
00114 CRichEditCtrl& GetCtrl (
00115 ) { return (m_ctrl); }
00116 #endif
00117
00118
00119
00120
00121 int GetFirstVisibleLine (
00122 ) const
00123 #ifdef WIN32_MFC
00124 { return (m_ctrl.GetFirstVisibleLine()); }
00125 #endif
00126 ;
00127
00128
00129 int GetLineCount (
00130 ) const
00131 #ifdef WIN32_MFC
00132 { return (m_ctrl.GetLineCount()); }
00133 #endif
00134 ;
00135
00136
00137
00138
00139
00140 int GetLineFromChar (
00141 int nIndex = -1
00142 ) const
00143 #ifdef WIN32_MFC
00144 { return (m_ctrl.LineFromChar(nIndex)); }
00145 #endif
00146 ;
00147
00148
00149
00150
00151 int GetLineIndex (
00152 int nLine = -1
00153 )
00154 #ifdef WIN32_MFC
00155 { return (m_ctrl.LineIndex(nLine)); }
00156 #endif
00157 ;
00158
00159
00160
00161
00162
00163
00164
00165 int GetLineLength (
00166 int nLine = -1
00167 )
00168 #ifdef WIN32_MFC
00169 { return (m_ctrl.LineLength(nLine)); }
00170 #endif
00171 ;
00172
00173
00174
00175 const bool GetModify (
00176 ) const
00177 #ifdef WIN32_MFC
00178 { return (m_ctrl.GetModify() != FALSE); }
00179 #endif
00180 ;
00181
00182
00183
00184 void GetSelection (
00185 int& nStartChar,
00186 int& nEndChar
00187 ) const
00188 #ifdef WIN32_MFC
00189 { m_ctrl.GetSel(nStartChar,nEndChar); }
00190 #endif
00191 ;
00192
00193
00194
00195 void GetStyle (
00196 TEXTSTYLE& style,
00197 int offset = -1
00198 ) const;
00199
00200
00201 const MISTRING& GetValue (
00202 ) const { return (m_value); }
00203
00204
00205 void HideCursor (
00206 )
00207 #ifdef WIN32_MFC
00208 { m_ctrl.HideCaret(); }
00209 #endif
00210 ;
00211
00212
00213 void LineScroll (
00214 int nLines,
00215 int nChars = 0
00216 )
00217 #ifdef WIN32_MFC
00218 { m_ctrl.LineScroll(nLines,nChars); }
00219 #endif
00220 ;
00221
00222
00223 void Paste (
00224 )
00225 #ifdef WIN32_MFC
00226 { m_ctrl.Paste(); }
00227 #endif
00228 ;
00229
00230 #ifdef WIN32_MFC
00231
00232 virtual bool PreTranslateMessageHook (
00233 MSG *pMsg
00234 );
00235 #endif
00236
00237
00238 void SetCursorPos (
00239 int nCharIndex,
00240 bool bScroll = true
00241 );
00242
00243
00244 void SetCursorPos (
00245 int line,
00246 int col,
00247 bool bScroll = true
00248 )
00249 #ifdef WIN32_MFC
00250 { SetCursorPos(m_ctrl.LineIndex(line) + col, bScroll); }
00251 #endif
00252 ;
00253
00254 #ifdef WIN32_MFC
00255
00256 void SetFont (
00257 const char* faceName,
00258 int pointSize
00259 ) {
00260 if (m_font.CreatePointFont(pointSize, faceName)) {
00261 m_ctrl.SetFont(&m_font);
00262 }
00263 }
00264 #endif
00265
00266
00267 void SetModify (
00268 bool modified = true
00269 )
00270 #ifdef WIN32_MFC
00271 { m_ctrl.SetModify(modified); }
00272 #endif
00273 ;
00274
00275
00276 void SetReadOnly (
00277 bool ReadOnly = true
00278 ) {
00279 #ifdef WIN32_MFC
00280 m_ctrl.SetReadOnly(ReadOnly);
00281 #else
00282 MxSetTextEditable(m_widget,!ReadOnly);
00283 #endif
00284 }
00285
00286
00287 void SetSelection (
00288 int StartChar = 0,
00289 int EndChar = -1,
00290 bool NoScroll = true
00291 )
00292 #ifdef WIN32_MFC
00293 { m_ctrl.SetSel(StartChar,EndChar,NoScroll); }
00294 #endif
00295 ;
00296
00297
00298
00299
00300 void SetStyle (
00301 const TEXTSTYLE& style
00302 );
00303
00304
00305
00306 void SetStyle (
00307 const TEXTSTYLE& style,
00308 int start,
00309 int end
00310 );
00311
00312 #ifdef WIN32_MFC
00313
00314
00315
00316
00317
00318 void SetTabStops (
00319 int cxEachStop
00320 ) { m_ctrl.SetTabStops(cxEachStop); }
00321 #endif
00322
00323 #ifdef WIN32_MFC
00324
00325
00326
00327
00328
00329 void SetTabStops (
00330 SIMPLE_ARRAY<int> stops
00331 ) { m_ctrl.SetTabStops(stops.GetNumItems(), stops); }
00332 #endif
00333
00334
00335
00336
00337 void SetValue (
00338 const UNICODE* string,
00339 bool notify = true
00340 );
00341
00342
00343 void ShowCursor (
00344 )
00345 #ifdef WIN32_MFC
00346 { m_ctrl.ShowCaret(); }
00347 #endif
00348 ;
00349
00350
00351 void Undo (
00352 )
00353 #ifdef WIN32_MFC
00354 { m_ctrl.Undo(); }
00355 #endif
00356 ;
00357
00358 protected:
00359
00360 #ifdef WIN32_MFC
00361 class MyEdit : public CRichEditCtrl {
00362 public:
00363 MyEdit (
00364 CTRL_EDIT_TEXT_WYSIWYG& guictrl
00365 ): m_guictrl(guictrl)
00366 { }
00367 virtual ~MyEdit (
00368 ) { }
00369 virtual BOOL PreCreateWindow (CREATESTRUCT& cs);
00370 protected:
00371 afx_msg void OnChange ();
00372 afx_msg void OnKillFocus ();
00373 DECLARE_MESSAGE_MAP()
00374 private:
00375 #ifndef GENERATING_DOXYGEN_OUTPUT
00376 CTRL_EDIT_TEXT_WYSIWYG& m_guictrl;
00377 #endif // GENERATING_DOXYGEN_OUTPUT
00378 };
00379 friend class MyEdit;
00380 MyEdit m_ctrl;
00381 #endif
00382
00383 #ifdef X_NATIVE
00384 bool m_UserEdited;
00385 Widget m_TraversalWidget;
00386 XmTraversalDirection m_TraversalDir;
00387 bool m_InternalModify;
00388 #endif
00389 #ifdef WIN32_MFC
00390 CFont m_font;
00391 #endif
00392 bool m_HasValue;
00393 MISTRING m_value;
00394
00395 bool GetEditStr (
00396 MISTRING& str
00397 ) const;
00398
00399
00400
00401 virtual void OnActivate ();
00402
00403
00404
00405
00406 virtual void OnChangeValue ();
00407
00408
00409
00410
00411 virtual void OnUserEdit ();
00412
00413
00414 void UpdateCtrl (
00415 const MISTRING& string
00416 );
00417
00418
00419
00420 virtual void UpdateValue (bool notify = true);
00421
00422 #ifdef X_NATIVE
00423 static void CB_Activate (Widget, CTRL_EDIT_TEXT_WYSIWYG*, void*);
00424 static void CB_Focus (Widget, CTRL_EDIT_TEXT_WYSIWYG*, void*);
00425 static void CB_LosingFocus (Widget, CTRL_EDIT_TEXT_WYSIWYG*, void*);
00426 static void CB_ModifyVerify (Widget, CTRL_EDIT_TEXT_WYSIWYG*, void*);
00427 static void CB_ValueChanged (Widget, CTRL_EDIT_TEXT_WYSIWYG*, void*);
00428 #endif
00429
00430
00431 CTRL_EDIT_TEXT_WYSIWYG (const CTRL_EDIT_TEXT_WYSIWYG&);
00432 CTRL_EDIT_TEXT_WYSIWYG& operator= (const CTRL_EDIT_TEXT_WYSIWYG&);
00433 };
00434
00435 DEFINE_ENUM_OPERATORS(MGUI::CTRL_EDIT_TEXT_WYSIWYG::FLAGS);
00436
00437
00438
00439
00440 template <class _CT> class CTRL_EDIT_TEXT_WYSIWYG_T : public MGUI::CTRL_EDIT_TEXT_WYSIWYG {
00441 public:
00442
00443 explicit CTRL_EDIT_TEXT_WYSIWYG_T (
00444 _CT *pContainer = 0
00445 ): m_pContainer(pContainer), m_pfOnChangeValue(0)
00446 { }
00447
00448
00449
00450 void SetContainer (
00451 _CT *pContainer
00452 ) { m_pContainer = pContainer; }
00453
00454
00455 void SetFuncChangeValue (
00456 void (_CT::*pfOnChangeValue)()
00457 ) { m_pfOnChangeValue = pfOnChangeValue; };
00458
00459 private:
00460 #ifndef GENERATING_DOXYGEN_OUTPUT
00461 _CT *m_pContainer;
00462 void (_CT::*m_pfOnChangeValue)();
00463
00464 virtual void OnChangeValue (
00465 ) {
00466 CTRL_EDIT_TEXT_WYSIWYG::OnChangeValue();
00467 if (m_pContainer != 0) (m_pContainer->*m_pfOnChangeValue)();
00468 }
00469 #endif // GENERATING_DOXYGEN_OUTPUT
00470 };
00471
00472
00473
00474
00475 }
00476
00477 #endif // INC_MGUI_CTRL_H