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