1/*
2 * Copyright (c) 2005-2010, Haiku, Inc.
3 * Distributed under the terms of the MIT license.
4 *
5 * Author:
6 *		DarkWyrm <darkwyrm@gmail.com>
7 */
8#include "ResourceRoster.h"
9
10#include <Application.h>
11#include <Bitmap.h>
12#include <Directory.h>
13#include <Entry.h>
14#include <image.h>
15#include <Path.h>
16#include <Roster.h>
17#include <String.h>
18
19#include "InternalEditors.h"
20#include "ResourceData.h"
21#include "ResFields.h"
22
23// For the MakeFieldForType temp code
24#include <TranslatorFormats.h>
25#include <TranslationUtils.h>
26#include <DataIO.h>
27#include <Mime.h>
28#include <TypeConstants.h>
29
30class EditorInfo
31{
32public:
33					EditorInfo(const image_id &id, const char *name,
34								create_editor *allocator);
35					~EditorInfo(void);
36
37	status_t		ID(void) const { return fID; }
38	const char *	Name(void) const { return fName.String(); }
39	Editor *		Instantiate(void);
40
41private:
42	image_id		fID;
43	BString			fName;
44	create_editor *	fAllocator;
45};
46
47EditorInfo::EditorInfo(const image_id &id, const char *name,
48						create_editor *allocator)
49  :	fID(id),
50  	fName(name),
51  	fAllocator(allocator)
52{
53}
54
55
56EditorInfo::~EditorInfo(void)
57{
58}
59
60
61Editor *
62EditorInfo::Instantiate(void)
63{
64	return fAllocator();
65}
66
67
68ResourceRoster::ResourceRoster(void)
69{
70}
71
72
73ResourceRoster::~ResourceRoster(void)
74{
75}
76
77
78BField *
79ResourceRoster::MakeFieldForType(const int32 &type, const char *data,
80								const size_t &length)
81{
82	// temporary code until editors are done
83	switch (type) {
84		case B_MIME_STRING_TYPE:
85			return new StringPreviewField(data);
86		case B_GIF_FORMAT:
87		case B_PPM_FORMAT:
88		case B_TGA_FORMAT:
89		case B_BMP_FORMAT:
90		case B_TIFF_FORMAT:
91		case B_PNG_FORMAT:
92		case B_JPEG_FORMAT: {
93			BMemoryIO memio(data, length);
94			BBitmap *bitmap = BTranslationUtils::GetBitmap(&memio);
95			if (bitmap) {
96				BitmapPreviewField *field = new BitmapPreviewField(bitmap);
97				return field;
98			}
99			break;
100		}
101		default:
102			return NULL;
103	}
104
105	return NULL;
106}
107
108
109void
110ResourceRoster::LoadEditors(void)
111{
112	app_info info;
113	be_app->GetAppInfo(&info);
114
115	BDirectory dir;
116	BEntry entry(&info.ref);
117	entry.GetParent(&dir);
118	entry.SetTo(&dir, "addons");
119	dir.SetTo(&entry);
120
121	entry_ref ref;
122	dir.Rewind();
123	while (dir.GetNextRef(&ref) == B_OK) {
124		BPath path(&ref);
125
126		image_id addon = load_add_on(path.Path());
127		if (addon < 0)
128			continue;
129
130		char *temp;
131		if (get_image_symbol(addon, "description", B_SYMBOL_TYPE_DATA, (void **)(&temp)) != B_OK) {
132			unload_add_on(addon);
133			continue;
134		}
135
136		create_editor *createFunc;
137		if (get_image_symbol(addon, "instantiate_editor", B_SYMBOL_TYPE_TEXT, (void **)(&createFunc)) != B_OK) {
138			delete temp;
139			unload_add_on(addon);
140			continue;
141		}
142
143		if (createFunc && temp)
144			fList.AddItem(new EditorInfo(addon, temp, createFunc));
145
146		delete temp;
147	}
148}
149
150void
151ResourceRoster::SpawnEditor(ResourceData *data, BHandler *handler)
152{
153	// temporary code until editors are done
154	switch (data->GetType()) {
155		case B_STRING_TYPE:
156		case B_MIME_STRING_TYPE: {
157			StringEditor *strEd = new StringEditor(BRect(100, 100, 400, 200),
158													data, handler);
159			strEd->Show();
160			break;
161		}
162		case B_GIF_FORMAT:
163		case B_PPM_FORMAT:
164		case B_TGA_FORMAT:
165		case B_BMP_FORMAT:
166		case B_TIFF_FORMAT:
167		case B_PNG_FORMAT:
168		case B_JPEG_FORMAT: {
169			ImageEditor *imgEd = new ImageEditor(BRect(100, 100, 300, 200),
170													data, handler);
171			imgEd->Show();
172			break;
173		}
174		default:
175			break;
176	}
177}
178
179