1/*
2Open Tracker License
3
4Terms and Conditions
5
6Copyright (c) 1991-2001, Be Incorporated. All rights reserved.
7
8Permission is hereby granted, free of charge, to any person obtaining a copy of
9this software and associated documentation files (the "Software"), to deal in
10the Software without restriction, including without limitation the rights to
11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12of the Software, and to permit persons to whom the Software is furnished to do
13so, subject to the following conditions:
14
15The above copyright notice and this permission notice applies to all licensees
16and shall be included in all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
25Except as contained in this notice, the name of Be Incorporated shall not be
26used in advertising or otherwise to promote the sale, use or other dealings in
27this Software without prior written authorization from Be Incorporated.
28
29BeMail(TM), Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30of Be Incorporated in the United States and other countries. Other brand product
31names are registered trademarks or trademarks of their respective holders.
32All 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
59class TMailWindow;
60class TScrollView;
61class TTextView;
62class BFile;
63class BList;
64class BPopUpMenu;
65
66struct text_run_array;
67
68typedef 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
81enum ENCLOSURE_TYPE {
82	TYPE_ENCLOSURE = 100,
83	TYPE_BE_ENCLOSURE,
84	TYPE_URL,
85	TYPE_MAILTO
86};
87
88struct 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
102class TSavePanel;
103
104
105class TContentView : public BView {
106public:
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
117private:
118			TTextView*			fTextView;
119			bool				fFocus;
120			bool				fIncoming;
121			float				fOffset;
122};
123
124
125enum {
126	S_CLEAR_ERRORS = 1,
127	S_SHOW_ERRORS = 2
128};
129
130struct 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
148class 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
280class 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
293class 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
306extern 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