1/* 2 * Copyright 2003-2008 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT license. 4 * 5 * Authors: 6 * J��r��me Duval 7 * Oliver Ruiz Dorantes 8 * Atsushi Takamatsu 9 */ 10#include "HEventList.h" 11 12#include <Alert.h> 13#include <Catalog.h> 14#include <ColumnTypes.h> 15#include <Entry.h> 16#include <Locale.h> 17#include <MediaFiles.h> 18#include <Path.h> 19#include <stdio.h> 20 21 22#undef B_TRANSLATION_CONTEXT 23#define B_TRANSLATION_CONTEXT "HEventList" 24 25 26HEventRow::HEventRow(const char* name, const char* path) 27 : 28 BRow(), 29 fName(name) 30{ 31 SetField(new BStringField(name), kEventColumn); 32 SetPath(path); 33} 34 35 36HEventRow::~HEventRow() 37{ 38} 39 40 41void 42HEventRow::SetPath(const char* _path) 43{ 44 fPath = _path; 45 BPath path(_path); 46 SetField(new BStringField(_path ? path.Leaf() : B_TRANSLATE("<none>")), 47 kSoundColumn); 48} 49 50 51void 52HEventRow::Remove(const char* type) 53{ 54 BMediaFiles().RemoveItem(type, Name()); 55} 56 57 58HEventList::HEventList(const char* name) 59 : 60 BColumnListView(name, B_NAVIGABLE, B_PLAIN_BORDER, true), 61 fType(NULL) 62{ 63 AddColumn(new BStringColumn(B_TRANSLATE("Event"), 180, 50, 500, 64 B_TRUNCATE_MIDDLE), kEventColumn); 65 AddColumn(new BStringColumn(B_TRANSLATE("Sound"), 130, 50, 500, 66 B_TRUNCATE_END), kSoundColumn); 67} 68 69 70HEventList::~HEventList() 71{ 72 RemoveAll(); 73 free(fType); 74} 75 76 77void 78HEventList::SetType(const char* type) 79{ 80 RemoveAll(); 81 BMediaFiles mfiles; 82 mfiles.RewindRefs(type); 83 free(fType); 84 fType = strdup(type); 85 86 BString name; 87 entry_ref ref; 88 while (mfiles.GetNextRef(&name,&ref) == B_OK) { 89 BPath path(&ref); 90 if (path.InitCheck() != B_OK || ref.name == NULL 91 || strcmp(ref.name, "") == 0) 92 AddRow(new HEventRow(name.String(), NULL)); 93 else 94 AddRow(new HEventRow(name.String(), path.Path())); 95 } 96 97 ResizeAllColumnsToPreferred(); 98} 99 100 101void 102HEventList::RemoveAll() 103{ 104 BRow* row; 105 while ((row = RowAt((int32)0, NULL)) != NULL) { 106 RemoveRow(row); 107 delete row; 108 } 109} 110 111 112void 113HEventList::SelectionChanged() 114{ 115 BColumnListView::SelectionChanged(); 116 117 HEventRow* row = (HEventRow*)CurrentSelection(); 118 if (row != NULL) { 119 entry_ref ref; 120 BMediaFiles().GetRefFor(fType, row->Name(), &ref); 121 122 BPath path(&ref); 123 if (path.InitCheck() == B_OK || ref.name == NULL 124 || strcmp(ref.name, "") == 0) { 125 row->SetPath(path.Path()); 126 UpdateRow(row); 127 } else { 128 printf("name %s\n", ref.name); 129 BMediaFiles().RemoveRefFor(fType, row->Name(), ref); 130 BAlert* alert = new BAlert("alert", 131 B_TRANSLATE("No such file or directory"), B_TRANSLATE("OK")); 132 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 133 alert->Go(); 134 return; 135 } 136 BMessage msg(M_EVENT_CHANGED); 137 msg.AddString("name", row->Name()); 138 msg.AddString("path", row->Path()); 139 Window()->PostMessage(&msg); 140 } 141} 142 143 144void 145HEventList::SetPath(const char* path) 146{ 147 HEventRow* row = (HEventRow*)CurrentSelection(); 148 if (row != NULL) { 149 entry_ref ref; 150 BEntry entry(path); 151 entry.GetRef(&ref); 152 BMediaFiles().SetRefFor(fType, row->Name(), ref); 153 154 row->SetPath(path); 155 UpdateRow(row); 156 } 157} 158