xref: /haiku/src/apps/mail/Content.h (revision 820dca4df6c7bf955c46e8f6521b9408f50b2900)
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 //====================================================================
106 
107 class TContentView : public BView {
108 	public:
109 		TContentView(BRect, bool incoming, BFont*,
110 			bool showHeader, bool coloredQuotes);
111 		virtual void MessageReceived(BMessage *);
112 		void FindString(const char *);
113 		void Focus(bool);
114 		void FrameResized(float, float);
115 
116 		TTextView *fTextView;
117 
118 	private:
119 		bool	fFocus;
120 		bool	fIncoming;
121 		float	fOffset;
122 };
123 
124 //====================================================================
125 
126 enum {
127 	S_CLEAR_ERRORS = 1,
128 	S_SHOW_ERRORS = 2
129 };
130 
131 struct quote_context {
132 	quote_context()
133 		:
134 		level(0),
135 		diff_mode(0),
136 		begin(true),
137 		in_diff(false),
138 		was_diff(false)
139 	{
140 	}
141 
142 	int32	level;
143 	int32	diff_mode;
144 	bool	begin;
145 	bool	in_diff;
146 	bool	was_diff;
147 };
148 
149 class TTextView : public BTextView {
150 	public:
151 								TTextView(BRect, BRect, bool incoming,
152 									TContentView*, BFont*, bool showHeader,
153 									bool coloredQuotes);
154 								~TTextView();
155 
156 		virtual	void AttachedToWindow();
157 		virtual void KeyDown(const char*, int32);
158 		virtual void MakeFocus(bool);
159 		virtual void MessageReceived(BMessage*);
160 		virtual void MouseDown(BPoint);
161 		virtual void MouseMoved(BPoint, uint32, const BMessage*);
162 		virtual void InsertText(const char *text, int32 length, int32 offset,
163 			const text_run_array *runs);
164 		virtual void  DeleteText(int32 start, int32 finish);
165 
166 		void ClearList();
167 		void LoadMessage(BEmailMessage *mail, bool quoteIt, const char *insertText);
168 		void Open(hyper_text*);
169 		status_t Save(BMessage *, bool makeNewFile = true);
170 		void StopLoad();
171 		bool IsReaderThreadRunning();
172 		void AddAsContent(BEmailMessage *mail, bool wrap, uint32 charset, mail_encoding encoding);
173 		void CheckSpelling(int32 start, int32 end,
174 			int32 flags = S_CLEAR_ERRORS | S_SHOW_ERRORS);
175 		void FindSpellBoundry(int32 length, int32 offset, int32 *start,
176 			int32 *end);
177 		void EnableSpellCheck(bool enable);
178 
179 		void AddQuote(int32 start, int32 finish);
180 		void RemoveQuote(int32 start, int32 finish);
181 		void UpdateFont(const BFont* newFont);
182 
183 		void	WindowActivated(bool flag);
184 		void	Undo(BClipboard *clipboard);
185 		void	Redo();
186 
187 		const BFont *Font() const { return &fFont; }
188 
189 		bool fHeader;
190 		bool fColoredQuotes;
191 		bool fReady;
192 
193 	private:
194 		struct { bool replaced, deleted; } fUndoState;
195 		KUndoBuffer	fUndoBuffer;
196 
197 		struct { bool active, replace; } fInputMethodUndoState;
198 		KUndoBuffer	fInputMethodUndoBuffer;
199 			// For handling Input Method changes in undo.
200 
201 		struct spell_mark;
202 
203 		spell_mark *FindSpellMark(int32 start, int32 end, spell_mark **_previousMark = NULL);
204 		void UpdateSpellMarks(int32 offset, int32 length);
205 		status_t AddSpellMark(int32 start, int32 end);
206 		bool RemoveSpellMark(int32 start, int32 end);
207 		void RemoveSpellMarks();
208 
209 		void ContentChanged(void);
210 
211 		class Reader;
212 		friend class TTextView::Reader;
213 
214 		char *fYankBuffer;
215 		int32 fLastPosition;
216 		BFile *fFile;
217 		BEmailMessage *fMail;
218 			// for incoming/replied/forwarded mails only
219 		BFont fFont;
220 		TContentView *fParent;
221 		sem_id fStopSem;
222 		bool fStopLoading;
223 		thread_id fThread;
224 		BList *fEnclosures;
225 		BPopUpMenu *fEnclosureMenu;
226 		BPopUpMenu *fLinkMenu;
227 		TSavePanel *fPanel;
228 		bool fIncoming;
229 		bool fSpellCheck;
230 		bool fRaw;
231 		bool fCursor;
232 
233 		struct spell_mark {
234 			spell_mark *next;
235 			int32	start;
236 			int32	end;
237 			struct text_run_array *style;
238 		};
239 
240 		spell_mark *fFirstSpellMark;
241 
242 		class Reader {
243 			public:
244 				Reader(bool header, bool raw, bool quote, bool incoming,
245 					bool stripHeaders, bool mime, TTextView* view,
246 					BEmailMessage* mail, BList* list, sem_id sem);
247 
248 				static status_t Run(void* _dummy);
249 
250 			private:
251 				bool ParseMail(BMailContainer* container,
252 					BTextMailComponent* ignore);
253 				bool Process(const char* data, int32 length,
254 					bool isHeader = false);
255 				bool Insert(const char* line, int32 count, bool isHyperLink,
256 					bool isHeader = false);
257 
258 				bool Lock();
259 				status_t Unlock();
260 
261 				bool fHeader;
262 				bool fRaw;
263 				bool fQuote;
264 				quote_context fQuoteContext;
265 				bool fIncoming;
266 				bool fStripHeader;
267 				bool fMime;
268 				TTextView* fView;
269 				BEmailMessage* fMail;
270 				BList *fEnclosures;
271 				sem_id fStopSem;
272 		};
273 };
274 
275 
276 //====================================================================
277 
278 class TSavePanel : public BFilePanel {
279 	public:
280 		TSavePanel(hyper_text*, TTextView*);
281 		virtual void SendMessage(const BMessenger*, BMessage*);
282 		void SetEnclosure(hyper_text*);
283 
284 	private:
285 		hyper_text *fEnclosure;
286 		TTextView *fView;
287 };
288 
289 //====================================================================
290 
291 class TextRunArray {
292 	public:
293 		TextRunArray(size_t entries);
294 		~TextRunArray();
295 
296 		text_run_array &Array() { return *fArray; }
297 		size_t MaxEntries() const { return fNumEntries; }
298 
299 	private:
300 		text_run_array *fArray;
301 		size_t fNumEntries;
302 };
303 
304 extern void FillInQuoteTextRuns(BTextView* view, quote_context* context,
305 	const char* line, int32 length, const BFont& font, text_run_array* style,
306 	int32 maxStyles = 5);
307 
308 #endif	/* #ifndef _CONTENT_H */
309 
310