1 /* 2 Open Tracker License 3 4 Terms and Conditions 5 6 Copyright (c) 1991-2001, Be Incorporated. All rights reserved. 7 8 Permission is hereby granted, free of charge, to any person obtaining a copy of 9 this software and associated documentation files (the "Software"), to deal in 10 the Software without restriction, including without limitation the rights to 11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12 of the Software, and to permit persons to whom the Software is furnished to do 13 so, subject to the following conditions: 14 15 The above copyright notice and this permission notice applies to all licensees 16 and shall be included in all copies or substantial portions of the Software. 17 18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY, 20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION 23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25 Except as contained in this notice, the name of Be Incorporated shall not be 26 used in advertising or otherwise to promote the sale, use or other dealings in 27 this Software without prior written authorization from Be Incorporated. 28 29 BeMail(TM), Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks 30 of Be Incorporated in the United States and other countries. Other brand product 31 names are registered trademarks or trademarks of their respective holders. 32 All rights reserved. 33 */ 34 #ifndef _CONTENT_H 35 #define _CONTENT_H 36 37 #include <FilePanel.h> 38 #include <FindDirectory.h> 39 #include <Font.h> 40 #include <fs_attr.h> 41 #include <Point.h> 42 #include <Rect.h> 43 #include <MessageFilter.h> 44 45 #include "KUndoBuffer.h" 46 47 #define MESSAGE_TEXT "Message:" 48 #define MESSAGE_TEXT_H 16 49 #define MESSAGE_TEXT_V 5 50 #define MESSAGE_FIELD_H 59 51 #define MESSAGE_FIELD_V 11 52 53 #define CONTENT_TYPE "content-type: " 54 #define CONTENT_ENCODING "content-transfer-encoding: " 55 #define CONTENT_DISPOSITION "Content-Disposition: " 56 #define MIME_TEXT "text/" 57 #define MIME_MULTIPART "multipart/" 58 59 class TMailWindow; 60 class TScrollView; 61 class TTextView; 62 class BFile; 63 class BList; 64 class BPopUpMenu; 65 66 struct text_run_array; 67 68 typedef struct { 69 bool header; 70 bool raw; 71 bool quote; 72 bool incoming; 73 bool close; 74 bool mime; 75 TTextView *view; 76 BEmailMessage *mail; 77 BList *enclosures; 78 sem_id *stop_sem; 79 } reader_info; 80 81 enum ENCLOSURE_TYPE { 82 TYPE_ENCLOSURE = 100, 83 TYPE_BE_ENCLOSURE, 84 TYPE_URL, 85 TYPE_MAILTO 86 }; 87 88 struct hyper_text { 89 int32 type; 90 char *name; 91 char *content_type; 92 char *encoding; 93 int32 text_start; 94 int32 text_end; 95 BMailComponent *component; 96 bool saved; 97 bool have_ref; 98 entry_ref ref; 99 node_ref node; 100 }; 101 102 class TSavePanel; 103 104 105 class TContentView : public BView { 106 public: 107 TContentView(bool incoming, BFont* font, 108 bool showHeader, bool coloredQuotes); 109 110 void FindString(const char *); 111 void Focus(bool); 112 TextView()113 TTextView* TextView() const { return fTextView; } 114 115 virtual void MessageReceived(BMessage* message); 116 117 private: 118 TTextView* fTextView; 119 bool fFocus; 120 bool fIncoming; 121 float fOffset; 122 }; 123 124 125 enum { 126 S_CLEAR_ERRORS = 1, 127 S_SHOW_ERRORS = 2 128 }; 129 130 struct quote_context { quote_contextquote_context131 quote_context() 132 : 133 level(0), 134 diff_mode(0), 135 begin(true), 136 in_diff(false), 137 was_diff(false) 138 { 139 } 140 141 int32 level; 142 int32 diff_mode; 143 bool begin; 144 bool in_diff; 145 bool was_diff; 146 }; 147 148 class TTextView : public BTextView { 149 public: 150 TTextView(bool incoming, 151 TContentView*, BFont*, bool showHeader, 152 bool coloredQuotes); 153 ~TTextView(); 154 155 virtual void AttachedToWindow(); 156 virtual void KeyDown(const char*, int32); 157 virtual void MakeFocus(bool); 158 virtual void MessageReceived(BMessage*); 159 virtual void MouseDown(BPoint); 160 virtual void MouseMoved(BPoint, uint32, const BMessage*); 161 virtual void InsertText(const char *text, int32 length, int32 offset, 162 const text_run_array *runs); 163 virtual void DeleteText(int32 start, int32 finish); 164 165 void ClearList(); 166 void LoadMessage(BEmailMessage *mail, bool quoteIt, const char *insertText); 167 void Open(hyper_text*); 168 status_t Save(BMessage *, bool makeNewFile = true); 169 void StopLoad(); 170 bool IsReaderThreadRunning(); 171 void AddAsContent(BEmailMessage *mail, bool wrap, uint32 charset, mail_encoding encoding); 172 void CheckSpelling(int32 start, int32 end, 173 int32 flags = S_CLEAR_ERRORS | S_SHOW_ERRORS); 174 void FindSpellBoundry(int32 length, int32 offset, int32 *start, 175 int32 *end); 176 void EnableSpellCheck(bool enable); 177 178 void AddQuote(int32 start, int32 finish); 179 void RemoveQuote(int32 start, int32 finish); 180 void UpdateFont(const BFont* newFont); 181 182 void WindowActivated(bool flag); 183 void Undo(BClipboard *clipboard); 184 void Redo(); 185 Font()186 const BFont *Font() const { return &fFont; } 187 188 bool fHeader; 189 bool fColoredQuotes; 190 bool fReady; 191 192 private: 193 struct { bool replaced, deleted; } fUndoState; 194 KUndoBuffer fUndoBuffer; 195 196 struct { bool active, replace; } fInputMethodUndoState; 197 KUndoBuffer fInputMethodUndoBuffer; 198 // For handling Input Method changes in undo. 199 200 struct spell_mark; 201 202 spell_mark *FindSpellMark(int32 start, int32 end, spell_mark **_previousMark = NULL); 203 void UpdateSpellMarks(int32 offset, int32 length); 204 status_t AddSpellMark(int32 start, int32 end); 205 bool RemoveSpellMark(int32 start, int32 end); 206 void RemoveSpellMarks(); 207 208 void ContentChanged(void); 209 210 int32 LineStart(int32 offset); 211 int32 PreviousByte(int32 offset) const; 212 213 class Reader; 214 friend class TTextView::Reader; 215 216 char *fYankBuffer; 217 int32 fLastPosition; 218 BFile *fFile; 219 BEmailMessage *fMail; 220 // for incoming/replied/forwarded mails only 221 BFont fFont; 222 TContentView *fParent; 223 sem_id fStopSem; 224 bool fStopLoading; 225 thread_id fThread; 226 BList *fEnclosures; 227 BPopUpMenu *fEnclosureMenu; 228 BPopUpMenu *fLinkMenu; 229 TSavePanel *fPanel; 230 bool fIncoming; 231 bool fSpellCheck; 232 bool fRaw; 233 bool fCursor; 234 235 struct spell_mark { 236 spell_mark *next; 237 int32 start; 238 int32 end; 239 struct text_run_array *style; 240 }; 241 242 spell_mark *fFirstSpellMark; 243 244 class Reader { 245 public: 246 Reader(bool header, bool raw, bool quote, bool incoming, 247 bool stripHeaders, bool mime, TTextView* view, 248 BEmailMessage* mail, BList* list, sem_id sem); 249 250 static status_t Run(void* _dummy); 251 252 private: 253 bool ParseMail(BMailContainer* container, 254 BTextMailComponent* ignore); 255 bool Process(const char* data, int32 length, 256 bool isHeader = false); 257 bool Insert(const char* line, int32 count, bool isHyperLink, 258 bool isHeader = false); 259 260 bool Lock(); 261 status_t Unlock(); 262 263 bool fHeader; 264 bool fRaw; 265 bool fQuote; 266 quote_context fQuoteContext; 267 bool fIncoming; 268 bool fStripHeader; 269 bool fMime; 270 TTextView* fView; 271 BEmailMessage* fMail; 272 BList *fEnclosures; 273 sem_id fStopSem; 274 }; 275 }; 276 277 278 //==================================================================== 279 280 class TSavePanel : public BFilePanel { 281 public: 282 TSavePanel(hyper_text*, TTextView*); 283 virtual void SendMessage(const BMessenger*, BMessage*); 284 void SetEnclosure(hyper_text*); 285 286 private: 287 hyper_text *fEnclosure; 288 TTextView *fView; 289 }; 290 291 //==================================================================== 292 293 class TextRunArray { 294 public: 295 TextRunArray(size_t entries); 296 ~TextRunArray(); 297 Array()298 text_run_array &Array() { return *fArray; } MaxEntries()299 size_t MaxEntries() const { return fNumEntries; } 300 301 private: 302 text_run_array *fArray; 303 size_t fNumEntries; 304 }; 305 306 extern void FillInQuoteTextRuns(BTextView* view, quote_context* context, 307 const char* line, int32 length, const BFont& font, text_run_array* style, 308 int32 maxStyles = 5); 309 310 #endif /* #ifndef _CONTENT_H */ 311 312