Supported types can now be edited and saved (but not their icons yet).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16691 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
da192ba4dd
commit
f5d5a442b8
@ -39,10 +39,57 @@
|
|||||||
const uint32 kMsgSave = 'save';
|
const uint32 kMsgSave = 'save';
|
||||||
const uint32 kMsgFlagsChanged = 'flgc';
|
const uint32 kMsgFlagsChanged = 'flgc';
|
||||||
|
|
||||||
|
const uint32 kMsgTypeSelected = 'tpsl';
|
||||||
const uint32 kMsgAddType = 'adtp';
|
const uint32 kMsgAddType = 'adtp';
|
||||||
|
const uint32 kMsgTypeAdded = 'tpad';
|
||||||
const uint32 kMsgRemoveType = 'rmtp';
|
const uint32 kMsgRemoveType = 'rmtp';
|
||||||
|
|
||||||
|
|
||||||
|
class SupportedTypeItem : public BStringItem {
|
||||||
|
public:
|
||||||
|
SupportedTypeItem(const char* type);
|
||||||
|
~SupportedTypeItem();
|
||||||
|
|
||||||
|
const char* Type() const { return fType.String(); }
|
||||||
|
|
||||||
|
static int Compare(const void* _a, const void* _b);
|
||||||
|
|
||||||
|
private:
|
||||||
|
BString fType;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SupportedTypeItem::SupportedTypeItem(const char* type)
|
||||||
|
: BStringItem(type),
|
||||||
|
fType(type)
|
||||||
|
{
|
||||||
|
BMimeType mimeType(type);
|
||||||
|
|
||||||
|
char description[B_MIME_TYPE_LENGTH];
|
||||||
|
if (mimeType.GetShortDescription(description) == B_OK && description[0])
|
||||||
|
SetText(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SupportedTypeItem::~SupportedTypeItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/
|
||||||
|
int
|
||||||
|
SupportedTypeItem::Compare(const void* _a, const void* _b)
|
||||||
|
{
|
||||||
|
const SupportedTypeItem* a = *(const SupportedTypeItem**)_a;
|
||||||
|
const SupportedTypeItem* b = *(const SupportedTypeItem**)_b;
|
||||||
|
|
||||||
|
return strcasecmp(a->Type(), b->Type());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entry)
|
ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entry)
|
||||||
: BWindow(BRect(0.0f, 0.0f, 250.0f, 340.0f).OffsetBySelf(position),
|
: BWindow(BRect(0.0f, 0.0f, 250.0f, 340.0f).OffsetBySelf(position),
|
||||||
"Application Type", B_TITLED_WINDOW,
|
"Application Type", B_TITLED_WINDOW,
|
||||||
@ -202,8 +249,7 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
|
|||||||
// take scrollview border into account
|
// take scrollview border into account
|
||||||
fTypeListView = new BListView(rect, "type listview",
|
fTypeListView = new BListView(rect, "type listview",
|
||||||
B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT_RIGHT);
|
B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT_RIGHT);
|
||||||
// fTypeListView->SetSelectionMessage(new BMessage(kMsgExtensionSelected));
|
fTypeListView->SetSelectionMessage(new BMessage(kMsgTypeSelected));
|
||||||
// fTypeListView->SetInvocationMessage(new BMessage(kMsgExtensionInvoked));
|
|
||||||
|
|
||||||
BScrollView* scrollView = new BScrollView("type scrollview", fTypeListView,
|
BScrollView* scrollView = new BScrollView("type scrollview", fTypeListView,
|
||||||
B_FOLLOW_LEFT_RIGHT, B_FRAME_EVENTS | B_WILL_DRAW, false, true);
|
B_FOLLOW_LEFT_RIGHT, B_FRAME_EVENTS | B_WILL_DRAW, false, true);
|
||||||
@ -450,8 +496,9 @@ ApplicationTypeWindow::_SetTo(const BEntry& entry)
|
|||||||
|
|
||||||
const char* type;
|
const char* type;
|
||||||
for (int32 i = 0; supportedTypes.FindString("types", i, &type) == B_OK; i++) {
|
for (int32 i = 0; supportedTypes.FindString("types", i, &type) == B_OK; i++) {
|
||||||
fTypeListView->AddItem(new BStringItem(type));
|
fTypeListView->AddItem(new SupportedTypeItem(type));
|
||||||
}
|
}
|
||||||
|
fTypeListView->SortItems(&SupportedTypeItem::Compare);
|
||||||
fRemoveTypeButton->SetEnabled(false);
|
fRemoveTypeButton->SetEnabled(false);
|
||||||
|
|
||||||
// version info
|
// version info
|
||||||
@ -536,7 +583,14 @@ ApplicationTypeWindow::_Save()
|
|||||||
}
|
}
|
||||||
|
|
||||||
BMessage supportedTypes;
|
BMessage supportedTypes;
|
||||||
// TODO!
|
for (int32 i = 0; i < fTypeListView->CountItems(); i++) {
|
||||||
|
SupportedTypeItem* item = dynamic_cast<SupportedTypeItem*>(
|
||||||
|
fTypeListView->ItemAt(i));
|
||||||
|
if (item == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
supportedTypes.AddString("types", item->Type());
|
||||||
|
}
|
||||||
|
|
||||||
version_info versionInfo;
|
version_info versionInfo;
|
||||||
versionInfo.major = atol(fMajorVersionControl->Text());
|
versionInfo.major = atol(fMajorVersionControl->Text());
|
||||||
@ -557,11 +611,12 @@ ApplicationTypeWindow::_Save()
|
|||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = info.SetVersionInfo(&versionInfo, B_APP_VERSION_KIND);
|
status = info.SetVersionInfo(&versionInfo, B_APP_VERSION_KIND);
|
||||||
|
|
||||||
// TODO: icon & supported types
|
// TODO: icon & supported types icons
|
||||||
// if (status == B_OK)
|
// if (status == B_OK)
|
||||||
// status = info.SetIcon(&icon);
|
// status = info.SetIcon(&icon);
|
||||||
// if (status == B_OK)
|
|
||||||
// status = info.SetSupportedTypes(&supportedTypes);
|
if (status == B_OK)
|
||||||
|
status = info.SetSupportedTypes(&supportedTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -585,6 +640,71 @@ ApplicationTypeWindow::MessageReceived(BMessage* message)
|
|||||||
_Save();
|
_Save();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kMsgTypeSelected:
|
||||||
|
{
|
||||||
|
int32 index;
|
||||||
|
if (message->FindInt32("index", &index) == B_OK) {
|
||||||
|
BStringItem* item = (BStringItem*)fTypeListView->ItemAt(index);
|
||||||
|
fRemoveTypeButton->SetEnabled(item != NULL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kMsgAddType:
|
||||||
|
{
|
||||||
|
BWindow* window = new TypeListWindow(NULL,
|
||||||
|
kMsgTypeAdded, this);
|
||||||
|
window->Show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kMsgTypeAdded:
|
||||||
|
{
|
||||||
|
const char* type;
|
||||||
|
if (message->FindString("type", &type) != B_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// check if this type already exists
|
||||||
|
|
||||||
|
SupportedTypeItem* newItem = new SupportedTypeItem(type);
|
||||||
|
int32 insertAt = 0;
|
||||||
|
|
||||||
|
for (int32 i = fTypeListView->CountItems(); i-- > 0;) {
|
||||||
|
SupportedTypeItem* item = dynamic_cast<SupportedTypeItem*>(
|
||||||
|
fTypeListView->ItemAt(i));
|
||||||
|
if (item == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int compare = strcasecmp(item->Type(), type);
|
||||||
|
if (!compare) {
|
||||||
|
// type does already exist, select it and bail out
|
||||||
|
delete newItem;
|
||||||
|
newItem = NULL;
|
||||||
|
fTypeListView->Select(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (compare < 0)
|
||||||
|
insertAt = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newItem == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
fTypeListView->AddItem(newItem, insertAt);
|
||||||
|
fTypeListView->Select(insertAt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kMsgRemoveType:
|
||||||
|
{
|
||||||
|
int32 index = fTypeListView->CurrentSelection();
|
||||||
|
if (index < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
delete fTypeListView->RemoveItem(index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case B_SIMPLE_DATA:
|
case B_SIMPLE_DATA:
|
||||||
{
|
{
|
||||||
entry_ref ref;
|
entry_ref ref;
|
||||||
|
Loading…
Reference in New Issue
Block a user