00001
00049 #ifndef INC_MI32_BIDI_H
00050 #define INC_MI32_BIDI_H
00051
00052 #ifndef INC_MI32_UCSTRING_H
00053 #include <mi32/ucstring.h>
00054 #endif
00055
00056 #ifdef MISYSTEMDLL
00057 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00058 #else
00059 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00060 #endif
00061
00062 class BIDICURSOR;
00063
00074 class CLASSLIBEXPORT BIDISTRING {
00075 public:
00076
00077
00078 enum DIRECTION {
00079 DIRECTION_LTR,
00080 DIRECTION_RTL
00081 };
00082
00083 enum ORDER {
00084 ORDER_VISUAL,
00085 ORDER_LOGICAL
00086 };
00087
00088
00089
00090 BIDISTRING();
00091
00093 BIDISTRING (
00094 const MIUNICODE* source,
00095 DIRECTION DefaultDirection = DIRECTION_LTR,
00096 ORDER StringOrder = ORDER_LOGICAL
00097 );
00098
00099
00100
00101 virtual ~BIDISTRING();
00102
00103
00104
00106 void Clear (
00107 );
00108
00110 DIRECTION GetStringDirection (
00111 ) const;
00112
00115 MIUNICODE* GetStringLogical (
00116 ) const;
00117
00120 MIUNICODE* GetStringVisual (
00121 ) const;
00122
00129 void SetStringLogical (
00130 const MIUNICODE* source,
00131 DIRECTION DefaultDirection = DIRECTION_LTR,
00132 bool bForceDirection = false
00133 );
00134
00155 void SetStringVisual (
00156 const MIUNICODE* source,
00157 DIRECTION DefaultDirection = DIRECTION_LTR
00158 );
00159
00160 private:
00161 #ifndef GENERATING_DOXYGEN_OUTPUT
00162 class SPAN {
00163 public:
00164
00165 SPAN (
00166 BIDISTRING* str,
00167 const MIUNICODE* src,
00168 UINT32 start,
00169 UINT32 end,
00170 DIRECTION direction,
00171 ORDER format
00172 );
00173
00174 ~SPAN();
00175
00176
00177 SPAN *m_VisualPrev;
00178 SPAN *m_VisualNext;
00179
00180 SPAN *m_LogicalPrev;
00181 SPAN *m_LogicalNext;
00182
00183 DIRECTION m_direction;
00184
00185 INT32 m_cursor;
00186
00187
00188 MIUNICODE *m_chars;
00189 UINT32 *m_positions;
00190
00191 UINT32 m_start;
00192 UINT32 m_end;
00193 };
00194
00195 void AddLTRLogicalSegment (
00196 const MIUNICODE* source,
00197 UINT32 start,
00198 UINT32 end
00199 );
00200
00201 void AddRTLLogicalSegment (
00202 const MIUNICODE* source,
00203 UINT32 start,
00204 UINT32 end
00205 );
00206
00207 void AddLTRVisualSegment (
00208 const MIUNICODE* source,
00209 UINT32 start,
00210 UINT32 end
00211 );
00212
00213 void AddRTLVisualSegment (
00214 const MIUNICODE* source,
00215 UINT32 start,
00216 UINT32 end
00217 );
00218
00222 void SetStringLogicalNoClear (
00223 const MIUNICODE* source,
00224 DIRECTION DefaultDirection = DIRECTION_LTR,
00225 bool bForceDirection = false
00226 );
00227
00230 void SetStringVisualNoClear (
00231 const MIUNICODE* source,
00232 DIRECTION DefaultDirection = DIRECTION_LTR
00233 );
00234
00235
00236
00237 DIRECTION m_direction;
00238
00239
00240 SPAN *m_cursor;
00241
00242 SPAN *m_LogicalFirst;
00243 SPAN *m_LogicalLast;
00244
00245 SPAN *m_VisualFirst;
00246 SPAN *m_VisualLast;
00247
00248 MIUNICODE *m_source;
00249 UINT32 m_start;
00250 UINT32 m_end;
00251 bool m_bNeedCursorInfo;
00252
00253 friend class BIDISTRING::SPAN;
00254 friend class BIDICURSOR;
00255 #endif // GENERATING_DOXYGEN_OUTPUT
00256 };
00257
00258
00264 class CLASSLIBEXPORT BIDICURSOR : public BIDISTRING {
00265 public:
00266
00267 BIDICURSOR ();
00268
00269
00273 BIDICURSOR (
00274 const MIUNICODE* source,
00275 DIRECTION DefaultDirection = DIRECTION_LTR
00276 );
00277
00278
00279 virtual ~BIDICURSOR();
00280
00281
00282
00289 UINT32 CursorLeft (
00290 UINT32 count
00291 );
00292
00299 UINT32 CursorRight (
00300 UINT32 count
00301 );
00302
00306 DIRECTION GetCursorDirection (
00307 ) const;
00308
00314 ORDER GetCursorMotion (
00315 ) const;
00316
00317
00321 UINT32 GetCursorPosition (
00322 ) const;
00323
00327 UINT32 GetCursorPositionVisual (
00328 ) const;
00329
00332 ORDER SetCursorMotion (
00333 ORDER CursorMotion
00334 );
00335
00337 void SetCursorPositionVisual (
00338 UINT32 pos
00339 );
00340
00341 private:
00342 #ifndef GENERATING_DOXYGEN_OUTPUT
00343 UINT32 CursorLeftLogical (
00344 UINT32 count
00345 );
00346
00347 UINT32 CursorRightLogical (
00348 UINT32 count
00349 );
00350
00351 UINT32 CursorLeftVisual (
00352 UINT32 count
00353 );
00354
00355 UINT32 CursorRightVisual (
00356 UINT32 count
00357 );
00358
00359 ORDER m_CursorMotion;
00360 #endif // GENERATING_DOXYGEN_OUTPUT
00361 };
00362
00363
00364
00365 #undef CLASSLIBEXPORT
00366
00367
00368 #endif
00369