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' AND (c) <= 'z') OR ((c) >= 'A' AND (c) <= 'Z'))
00035 #define IsWhiteSpace(c) ((c) < 126 AND strchr(GDocView::WhiteSpace, c) != 0)
00037 #define IsDelimiter(c) ((c) < 126 AND strchr(GDocView::Delimiters, c) != 0)
00039 #define IsDigit(c) ((c) >= '0' AND (c) <= '9')
00041 #define IsLetter(c) (((c) >= 'a' AND (c) <= 'z') OR ((c) >= 'A' AND (c) <= 'Z'))
00043 #define IsText(c) (IsDigit(c) OR IsAlpha(c) OR (c) == '_')
00045 #define IsWordBoundry(c) (strchr(GDocView::WhiteSpace, c) OR strchr(GDocView::Delimiters, c))
00047 #define UrlChar(c) ( \
00048 strchr(GDocView::UrlDelim, (c)) OR \
00049 AlphaOrDigit((c)) OR \
00050 ((c) >= 256) \
00051 )
00053 #define EmailChar(c) (strchr("._-:+", (c)) OR AlphaOrDigit((c)))
00054
00055 extern char16 *ConvertToCrLf(char16 *Text);
00056
00057
00058 class GDocView;
00059
00061 class GDocumentEnv : public GThreadOwner
00062 {
00063 GArray<GDocView*> Viewers;
00064
00065 public:
00066 GDocumentEnv(GDocView *v = 0);
00067 virtual ~GDocumentEnv();
00068
00069 enum LoadType
00070 {
00071 LoadError,
00072 LoadNotImpl,
00073 LoadImmediate,
00074 LoadDeferred,
00075 };
00076
00077 struct LoadJob : public GThreadJob
00078 {
00079 enum PrefFormat
00080 {
00081 FmtNone,
00082 FmtStream,
00083 FmtSurface,
00084 FmtFilename,
00085 };
00086
00087
00088 GDocView *View;
00089 void *UserData;
00090 uint32 UserUid;
00091 PrefFormat Pref;
00092
00093
00094 GAutoString Uri;
00095
00096
00097 GAutoPtr<GStreamI> Stream;
00098 GAutoPtr<GSurface> pDC;
00099 GAutoString Filename;
00100 GAutoString Error;
00101
00102 LoadJob(GThreadTarget *o) : GThreadJob(o)
00103 {
00104 View = 0;
00105 UserUid = 0;
00106 UserData = 0;
00107 Pref = FmtNone;
00108 }
00109 };
00110
00111 LoadJob *NewJob()
00112 {
00113 return new LoadJob(this);
00114 }
00115
00116 bool AttachView(GDocView *v)
00117 {
00118 if (!v)
00119 return false;
00120 if (!Lock(_FL))
00121 return false;
00122 LgiAssert(!Viewers.HasItem(v));
00123 Viewers.Add(v);
00124 Unlock();
00125 return true;
00126 }
00127
00128 bool DetachView(GDocView *v)
00129 {
00130 if (!v)
00131 return false;
00132 if (!Lock(_FL))
00133 return false;
00134 LgiAssert(Viewers.HasItem(v));
00135 Viewers.Delete(v);
00136 Unlock();
00137 return true;
00138 }
00139
00142 virtual bool AppendItems(GSubMenu *Menu, int Base = 1000) { return false; }
00143
00146 virtual bool OnMenu(GDocView *View, int Id, void *Context) { return false; }
00147
00150 virtual LoadType GetContent(LoadJob *&j) { return LoadNotImpl; }
00152 void OnDone(GThreadJob *j);
00153
00155 virtual bool OnNavigate(char *Uri) { return false; }
00156
00160 virtual char *OnDynamicContent(char *Code) { return 0; }
00161
00163 virtual bool OnCompileScript(char *Script, char *Language, char *MimeType) { return false; }
00164
00166 virtual bool OnExecuteScript(char *Script) { return false; }
00167 };
00168
00174 class GDefaultDocumentEnv : public GDocumentEnv
00175 {
00176 public:
00177 LoadType GetContent(LoadJob *&j);
00178 bool OnNavigate(char *Uri);
00179 };
00180
00182 class GDocFindReplaceParams {};
00183
00185 class
00186 #ifdef MAC
00187 LgiClass
00188 #endif
00189 GDocView : public GLayout
00190 {
00191 friend class GDocumentEnv;
00192
00193 protected:
00194 GDocumentEnv *Environment;
00195 char *Charset;
00196
00197 public:
00198
00199 static char *WhiteSpace;
00200 static char *Delimiters;
00201 static char *UrlDelim;
00202 static bool AlphaOrDigit(char c);
00203
00205
00206 #define _TvMenuProp(Type, Name) \
00207 protected: \
00208 Type Name; \
00209 public: \
00210 virtual void Set##Name(Type i) { Name=i; } \
00211 Type Get##Name() { return Name; }
00212
00213 _TvMenuProp(uint16, WrapAtCol)
00214 _TvMenuProp(bool, UrlDetect)
00215 _TvMenuProp(bool, ReadOnly)
00216 _TvMenuProp(uint8, WrapType)
00217 _TvMenuProp(uint8, TabSize)
00218 _TvMenuProp(uint8, IndentSize)
00219 _TvMenuProp(bool, HardTabs)
00220 _TvMenuProp(bool, ShowWhiteSpace)
00221 _TvMenuProp(bool, ObscurePassword)
00222 _TvMenuProp(bool, CrLf)
00223 _TvMenuProp(bool, AutoIndent)
00224 _TvMenuProp(bool, FixedWidthFont)
00225 _TvMenuProp(COLOUR, BackColour)
00226 _TvMenuProp(bool, LoadImages)
00227 _TvMenuProp(bool, OverideDocCharset)
00228 #undef _TvMenuProp
00229
00230 char *GetCharset() { return Charset; }
00231 void SetCharset(char *s) { char *cs = NewStr(s); DeleteArray(Charset); Charset = cs; }
00232 virtual char *GetMimeType() = 0;
00233
00235
00236 GDocView(GDocumentEnv *e = 0)
00237 {
00238 WrapAtCol = 0;
00239 UrlDetect = true;
00240 ReadOnly = false;
00241 WrapType = TEXTED_WRAP_REFLOW;
00242 TabSize = 4;
00243 IndentSize = 4;
00244 HardTabs = true;
00245 ShowWhiteSpace = false;
00246 ObscurePassword = false;
00247 CrLf = false;
00248 AutoIndent = true;
00249 FixedWidthFont = false;
00250 BackColour = Rgb24(255, 255, 255);
00251 LoadImages = false;
00252 Charset = 0;
00253 OverideDocCharset = false;
00254
00255 Environment = 0;
00256
00257 SetEnv(e);
00258 }
00259
00260 virtual ~GDocView()
00261 {
00262 SetEnv(0);
00263 }
00264
00265 char *GetClass() { return "GDocView"; }
00266
00268 virtual bool Open(char *Name, char *Cs = 0) { return false; }
00270 virtual bool Save(char *Name, char *Cs = 0) { return false; }
00271
00273
00275 virtual bool DoFind() { return false; }
00277 virtual bool DoReplace() { return false; }
00278 virtual GDocFindReplaceParams *CreateFindReplaceParams() { return 0; }
00279 virtual void SetFindReplaceParams(GDocFindReplaceParams *Params) { }
00280
00282
00284 virtual GDocumentEnv *GetEnv() { return Environment; }
00286 virtual void SetEnv(GDocumentEnv *e)
00287 {
00288 if (Environment) Environment->DetachView(this);
00289 Environment = e;
00290 if (Environment) Environment->AttachView(this);
00291 }
00295 virtual void OnContent(GDocumentEnv::LoadJob *Res) {}
00296
00298
00299
00302 virtual void SetCursor(int i, bool Select, bool ForceFullUpdate = false) {}
00303
00306 virtual int GetCursor(bool Cursor = true) { return 0; }
00307
00309 virtual bool HasSelection() { return false; }
00311 virtual void UnSelectAll() {}
00313 virtual void SelectWord(int From) {}
00315 virtual void SelectAll() {}
00317 virtual char *GetSelection() { return 0; }
00318
00320 virtual int IndexAt(int x, int y) { return 0; }
00321
00323 virtual void PositionAt(int &x, int &y, int Index = -1) { }
00324
00326 virtual bool IsDirty() { return false; }
00328 virtual int GetLines() { return 0; }
00330 virtual void GetTextExtent(int &x, int &y) {}
00331
00333
00335 virtual bool Cut() { return false; }
00337 virtual bool Copy() { return false; }
00339 virtual bool Paste() { return false; }
00340
00342
00344 virtual void OnEscape(GKey &K) {}
00346 virtual void OnEnter(GKey &k) {}
00348 virtual void OnUrl(char *Url) {}
00349
00351
00352 struct ContentMedia
00353 {
00354 GAutoString Id;
00355 GVariant Data;
00356 GAutoPtr<GStream> Stream;
00357 };
00358
00360 virtual bool GetFormattedContent
00361 (
00363 char *MimeType,
00365 GAutoString &Out,
00367 GArray<ContentMedia> *Media = 0
00368 )
00369 { return false; }
00370 };
00371
00372 #endif