00001
00002
00003
00004
00005 #ifndef __GDOCVIEW_H
00006 #define __GDOCVIEW_H
00007
00008 #include "GVariant.h"
00009
00010
00011
00013 #define TEXTED_WRAP_NONE 0
00015 #define TEXTED_WRAP_REFLOW 1
00016
00017
00018
00020 #define GTVN_DOC_CHANGED 0x01
00022 #define GTVN_CURSOR_CHANGED 0x02
00024 #define GTVN_CODEPAGE_CHANGED 0x04
00026 #define GTVN_FIXED_WIDTH_CHANGED 0x08
00028 #define GTVN_SHOW_IMGS_CHANGED 0x10
00029
00030
00031
00033 #define IsAlpha(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
00035 #define IsWhiteSpace(c) ((c) < 126 && strchr(GDocView::WhiteSpace, c) != 0)
00037 #define IsDelimiter(c) ((c) < 126 && strchr(GDocView::Delimiters, c) != 0)
00039 #define IsDigit(c) ((c) >= '0' && (c) <= '9')
00041 #define IsLetter(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
00043 #define IsText(c) (IsDigit(c) || IsAlpha(c) || (c) == '_')
00045 #define IsWordBoundry(c) (strchr(GDocView::WhiteSpace, c) || strchr(GDocView::Delimiters, c))
00047 #define AlphaOrDigit(c) (IsDigit(c) || IsLetter(c))
00049 #define UrlChar(c) ( \
00050 strchr(GDocView::UrlDelim, (c)) || \
00051 AlphaOrDigit((c)) || \
00052 ((c) >= 256) \
00053 )
00055 #define EmailChar(c) (strchr("._-:+", (c)) || AlphaOrDigit((c)))
00056
00057 extern char16 *ConvertToCrLf(char16 *Text);
00058
00061 struct GLinkInfo
00062 {
00063 int Start;
00064 int Len;
00065 bool Email;
00066 };
00067
00069 extern bool LgiDetectLinks(GArray<GLinkInfo> &Links, char16 *Text, int Size = -1);
00070
00071
00072 class GDocView;
00073
00075 class
00076 #ifdef MAC
00077 LgiClass
00078 #endif
00079 GDocumentEnv : public GThreadOwner
00080 {
00081 GArray<GDocView*> Viewers;
00082
00083 public:
00084 GDocumentEnv(GDocView *v = 0);
00085 virtual ~GDocumentEnv();
00086
00087 enum LoadType
00088 {
00089 LoadError,
00090 LoadNotImpl,
00091 LoadImmediate,
00092 LoadDeferred,
00093 };
00094
00095 struct
00096 #ifdef MAC
00097 LgiClass
00098 #endif
00099 LoadJob : public GThreadJob
00100 {
00101 enum PrefFormat
00102 {
00103 FmtNone,
00104 FmtStream,
00105 FmtSurface,
00106 FmtFilename,
00107 };
00108
00109
00110 GDocView *View;
00111 void *UserData;
00112 uint32 UserUid;
00113 PrefFormat Pref;
00114
00115
00116 GAutoString Uri;
00117
00118
00119 GAutoPtr<GStreamI> Stream;
00120 GAutoPtr<GSurface> pDC;
00121 GAutoString Filename;
00122 GAutoString Error;
00123
00124 LoadJob(GThreadTarget *o) : GThreadJob(o)
00125 {
00126 View = 0;
00127 UserUid = 0;
00128 UserData = 0;
00129 Pref = FmtNone;
00130 }
00131 };
00132
00133 LoadJob *NewJob()
00134 {
00135 return new LoadJob(this);
00136 }
00137
00138 bool AttachView(GDocView *v)
00139 {
00140 if (!v)
00141 return false;
00142 if (!Lock(_FL))
00143 return false;
00144 LgiAssert(!Viewers.HasItem(v));
00145 Viewers.Add(v);
00146 Unlock();
00147 return true;
00148 }
00149
00150 bool DetachView(GDocView *v)
00151 {
00152 if (!v)
00153 return false;
00154 if (!Lock(_FL))
00155 return false;
00156 LgiAssert(Viewers.HasItem(v));
00157 Viewers.Delete(v);
00158 Unlock();
00159 return true;
00160 }
00161
00164 virtual bool AppendItems(GSubMenu *Menu, int Base = 1000) { return false; }
00165
00168 virtual bool OnMenu(GDocView *View, int Id, void *Context) { return false; }
00169
00172 virtual LoadType GetContent(LoadJob *&j) { return LoadNotImpl; }
00174 void OnDone(GThreadJob *j);
00175
00177 virtual bool OnNavigate(char *Uri) { return false; }
00178
00182 virtual char *OnDynamicContent(const char *Code) { return 0; }
00183
00185 virtual bool OnCompileScript(char *Script, char *Language, char *MimeType) { return false; }
00186
00188 virtual bool OnExecuteScript(char *Script) { return false; }
00189 };
00190
00196 class GDefaultDocumentEnv : public GDocumentEnv
00197 {
00198 public:
00199 LoadType GetContent(LoadJob *&j);
00200 bool OnNavigate(char *Uri);
00201 };
00202
00204 class GDocFindReplaceParams {};
00205
00207 class
00208 #ifdef MAC
00209 LgiClass
00210 #endif
00211 GDocView : public GLayout
00212 {
00213 friend class GDocumentEnv;
00214
00215 protected:
00216 GDocumentEnv *Environment;
00217 char *Charset;
00218
00219 public:
00220
00221 static const char *WhiteSpace;
00222 static const char *Delimiters;
00223 static const char *UrlDelim;
00224
00226
00227 #define _TvMenuProp(Type, Name) \
00228 protected: \
00229 Type Name; \
00230 public: \
00231 virtual void Set##Name(Type i) { Name=i; } \
00232 Type Get##Name() { return Name; }
00233
00234 _TvMenuProp(uint16, WrapAtCol)
00235 _TvMenuProp(bool, UrlDetect)
00236 _TvMenuProp(bool, ReadOnly)
00237 _TvMenuProp(uint8, WrapType)
00238 _TvMenuProp(uint8, TabSize)
00239 _TvMenuProp(uint8, IndentSize)
00240 _TvMenuProp(bool, HardTabs)
00241 _TvMenuProp(bool, ShowWhiteSpace)
00242 _TvMenuProp(bool, ObscurePassword)
00243 _TvMenuProp(bool, CrLf)
00244 _TvMenuProp(bool, AutoIndent)
00245 _TvMenuProp(bool, FixedWidthFont)
00246 _TvMenuProp(COLOUR, BackColour)
00247 _TvMenuProp(bool, LoadImages)
00248 _TvMenuProp(bool, OverideDocCharset)
00249 #undef _TvMenuProp
00250
00251 char *GetCharset() { return Charset; }
00252 void SetCharset(char *s) { char *cs = NewStr(s); DeleteArray(Charset); Charset = cs; }
00253 virtual const char *GetMimeType() = 0;
00254
00256
00257 GDocView(GDocumentEnv *e = 0)
00258 {
00259 WrapAtCol = 0;
00260 UrlDetect = true;
00261 ReadOnly = false;
00262 WrapType = TEXTED_WRAP_REFLOW;
00263 TabSize = 4;
00264 IndentSize = 4;
00265 HardTabs = true;
00266 ShowWhiteSpace = false;
00267 ObscurePassword = false;
00268 CrLf = false;
00269 AutoIndent = true;
00270 FixedWidthFont = false;
00271 BackColour = Rgb24(255, 255, 255);
00272 LoadImages = false;
00273 Charset = 0;
00274 OverideDocCharset = false;
00275
00276 Environment = 0;
00277
00278 SetEnv(e);
00279 }
00280
00281 virtual ~GDocView()
00282 {
00283 SetEnv(0);
00284 }
00285
00286 const char *GetClass() { return "GDocView"; }
00287
00289 virtual bool Open(const char *Name, const char *Cs = 0) { return false; }
00291 virtual bool Save(const char *Name, const char *Cs = 0) { return false; }
00292
00294
00296 virtual bool DoFind() { return false; }
00298 virtual bool DoReplace() { return false; }
00299 virtual GDocFindReplaceParams *CreateFindReplaceParams() { return 0; }
00300 virtual void SetFindReplaceParams(GDocFindReplaceParams *Params) { }
00301
00303
00305 virtual GDocumentEnv *GetEnv() { return Environment; }
00307 virtual void SetEnv(GDocumentEnv *e)
00308 {
00309 if (Environment) Environment->DetachView(this);
00310 Environment = e;
00311 if (Environment) Environment->AttachView(this);
00312 }
00316 virtual void OnContent(GDocumentEnv::LoadJob *Res) {}
00317
00319
00320
00323 virtual void SetCursor(int i, bool Select, bool ForceFullUpdate = false) {}
00324
00327 virtual int GetCursor(bool Cursor = true) { return 0; }
00328
00330 virtual bool HasSelection() { return false; }
00332 virtual void UnSelectAll() {}
00334 virtual void SelectWord(int From) {}
00336 virtual void SelectAll() {}
00338 virtual char *GetSelection() { return 0; }
00339
00341 virtual int IndexAt(int x, int y) { return 0; }
00342
00344 virtual void PositionAt(int &x, int &y, int Index = -1) { }
00345
00347 virtual bool IsDirty() { return false; }
00349 virtual int GetLines() { return 0; }
00351 virtual void GetTextExtent(int &x, int &y) {}
00352
00354
00356 virtual bool Cut() { return false; }
00358 virtual bool Copy() { return false; }
00360 virtual bool Paste() { return false; }
00361
00363
00365 virtual void OnEscape(GKey &K) {}
00367 virtual void OnEnter(GKey &k) {}
00369 virtual void OnUrl(char *Url) {}
00370
00372
00373 struct ContentMedia
00374 {
00375 GAutoString Id;
00376 GVariant Data;
00377 GAutoPtr<GStream> Stream;
00378 };
00379
00381 virtual bool GetFormattedContent
00382 (
00384 const char *MimeType,
00386 GAutoString &Out,
00388 GArray<ContentMedia> *Media = 0
00389 )
00390 { return false; }
00391 };
00392
00393 #endif