xref: /haiku/src/apps/mail/Content.h (revision d374a27286b8a52974a97dba0d5966ea026a665d)
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 		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 
181 		void	WindowActivated(bool flag);
182 		void	Undo(BClipboard *clipboard);
183 		void	Redo();
184 
185 		const BFont *Font() const { return &fFont; }
186 
187 		bool fHeader;
188 		bool fColoredQuotes;
189 		bool fReady;
190 
191 	private:
192 		struct { bool replaced, deleted; } fUndoState;
193 		KUndoBuffer	fUndoBuffer;
194 
195 		struct { bool active, replace; } fInputMethodUndoState;
196 		KUndoBuffer	fInputMethodUndoBuffer;
197 			// For handling Input Method changes in undo.
198 
199 		struct spell_mark;
200 
201 		spell_mark *FindSpellMark(int32 start, int32 end, spell_mark **_previousMark = NULL);
202 		void UpdateSpellMarks(int32 offset, int32 length);
203 		status_t AddSpellMark(int32 start, int32 end);
204 		bool RemoveSpellMark(int32 start, int32 end);
205 		void RemoveSpellMarks();
206 
207 		void ContentChanged(void);
208 
209 		class Reader;
210 		friend class TTextView::Reader;
211 
212 		char *fYankBuffer;
213 		int32 fLastPosition;
214 		BFile *fFile;
215 		BEmailMessage *fMail;
216 			// for incoming/replied/forwarded mails only
217 		BFont fFont;
218 		TContentView *fParent;
219 		sem_id fStopSem;
220 		bool fStopLoading;
221 		thread_id fThread;
222 		BList *fEnclosures;
223 		BPopUpMenu *fEnclosureMenu;
224 		BPopUpMenu *fLinkMenu;
225 		TSavePanel *fPanel;
226 		bool fIncoming;
227 		bool fSpellCheck;
228 		bool fRaw;
229 		bool fCursor;
230 
231 		struct spell_mark {
232 			spell_mark *next;
233 			int32	start;
234 			int32	end;
235 			struct text_run_array *style;
236 		};
237 
238 		spell_mark *fFirstSpellMark;
239 
240 		class Reader {
241 			public:
242 				Reader(bool header, bool raw, bool quote, bool incoming,
243 					bool stripHeaders, bool mime, TTextView* view,
244 					BEmailMessage* mail, BList* list, sem_id sem);
245 
246 				static status_t Run(void* _dummy);
247 
248 			private:
249 				bool ParseMail(BMailContainer* container,
250 					BTextMailComponent* ignore);
251 				bool Process(const char* data, int32 length,
252 					bool isHeader = false);
253 				bool Insert(const char* line, int32 count, bool isHyperLink,
254 					bool isHeader = false);
255 
256 				bool Lock();
257 				status_t Unlock();
258 
259 				bool fHeader;
260 				bool fRaw;
261 				bool fQuote;
262 				quote_context fQuoteContext;
263 				bool fIncoming;
264 				bool fStripHeader;
265 				bool fMime;
266 				TTextView* fView;
267 				BEmailMessage* fMail;
268 				BList *fEnclosures;
269 				sem_id fStopSem;
270 		};
271 };
272 
273 
274 //====================================================================
275 
276 class TSavePanel : public BFilePanel {
277 	public:
278 		TSavePanel(hyper_text*, TTextView*);
279 		virtual void SendMessage(const BMessenger*, BMessage*);
280 		void SetEnclosure(hyper_text*);
281 
282 	private:
283 		hyper_text *fEnclosure;
284 		TTextView *fView;
285 };
286 
287 //====================================================================
288 
289 class TextRunArray {
290 	public:
291 		TextRunArray(size_t entries);
292 		~TextRunArray();
293 
294 		text_run_array &Array() { return *fArray; }
295 		size_t MaxEntries() const { return fNumEntries; }
296 
297 	private:
298 		text_run_array *fArray;
299 		size_t fNumEntries;
300 };
301 
302 extern void FillInQuoteTextRuns(BTextView* view, quote_context* context,
303 	const char* line, int32 length, const BFont& font, text_run_array* style,
304 	int32 maxStyles = 5);
305 
306 #endif	/* #ifndef _CONTENT_H */
307 
308