xref: /haiku/src/apps/mail/Content.h (revision 97dfeb96704e5dbc5bec32ad7b21379d0125e031)
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 
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 {
131 	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 
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 
298 		text_run_array &Array() { return *fArray; }
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