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