Some more work on the application type window: it now shows the correct

entries, and you can edit everything but icons and supported types.
Saving is also possible now (but it won't ask yet if you close the
window and has made some changes).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16674 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2006-03-09 14:21:25 +00:00
parent 539d69fc6b
commit b57ef1e651
3 changed files with 250 additions and 28 deletions

View File

@ -11,6 +11,7 @@
#include "StringView.h" #include "StringView.h"
#include "TypeListWindow.h" #include "TypeListWindow.h"
#include <AppFileInfo.h>
#include <Application.h> #include <Application.h>
#include <Bitmap.h> #include <Bitmap.h>
#include <Box.h> #include <Box.h>
@ -25,12 +26,19 @@
#include <NodeInfo.h> #include <NodeInfo.h>
#include <PopUpMenu.h> #include <PopUpMenu.h>
#include <RadioButton.h> #include <RadioButton.h>
#include <Roster.h>
#include <ScrollView.h> #include <ScrollView.h>
#include <TextControl.h> #include <TextControl.h>
#include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
const uint32 kMsgSave = 'save';
const uint32 kMsgFlagsChanged = 'flgc';
const uint32 kMsgAddType = 'adtp'; const uint32 kMsgAddType = 'adtp';
const uint32 kMsgRemoveType = 'rmtp'; const uint32 kMsgRemoveType = 'rmtp';
@ -46,9 +54,11 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
AddChild(menuBar); AddChild(menuBar);
BMenu* menu = new BMenu("File"); BMenu* menu = new BMenu("File");
menu->AddItem(new BMenuItem("Save", NULL, 'S', B_COMMAND_KEY)); menu->AddItem(new BMenuItem("Save", new BMessage(kMsgSave), 'S', B_COMMAND_KEY));
menu->AddItem(new BMenuItem("Save Into Resource File" B_UTF8_ELLIPSIS, BMenuItem* item;
menu->AddItem(item = new BMenuItem("Save Into Resource File" B_UTF8_ELLIPSIS,
NULL)); NULL));
item->SetEnabled(false);
menu->AddSeparatorItem(); menu->AddSeparatorItem();
menu->AddItem(new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED), menu->AddItem(new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED),
@ -75,6 +85,7 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
// filter out invalid characters that can't be part of a MIME type name // filter out invalid characters that can't be part of a MIME type name
BTextView* textView = fSignatureControl->TextView(); BTextView* textView = fSignatureControl->TextView();
textView->SetMaxBytes(B_MIME_TYPE_LENGTH);
const char* disallowedCharacters = "/<>@,;:\"()[]?="; const char* disallowedCharacters = "/<>@,;:\"()[]?=";
for (int32 i = 0; disallowedCharacters[i]; i++) { for (int32 i = 0; disallowedCharacters[i]; i++) {
textView->DisallowChar(disallowedCharacters[i]); textView->DisallowChar(disallowedCharacters[i]);
@ -97,7 +108,7 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
topView->AddChild(box); topView->AddChild(box);
fFlagsCheckBox = new BCheckBox(rect, "flags", "Application Flags", fFlagsCheckBox = new BCheckBox(rect, "flags", "Application Flags",
NULL); //new BMessage(kMsgFlagChanged)); new BMessage(kMsgFlagsChanged));
fFlagsCheckBox->SetValue(B_CONTROL_ON); fFlagsCheckBox->SetValue(B_CONTROL_ON);
fFlagsCheckBox->ResizeToPreferred(); fFlagsCheckBox->ResizeToPreferred();
box->SetLabel(fFlagsCheckBox); box->SetLabel(fFlagsCheckBox);
@ -223,10 +234,8 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
topView->AddChild(box); topView->AddChild(box);
BMenuField* menuField; BMenuField* menuField;
BPopUpMenu *popUpMenu;
BMenuItem* item;
#if 0 #if 0
popUpMenu = new BPopUpMenu("version info", true, true); BPopUpMenu *popUpMenu = new BPopUpMenu("version info", true, true);
item = new BMenuItem("Version Info", NULL); item = new BMenuItem("Version Info", NULL);
item->SetMarked(true); item->SetMarked(true);
popUpMenu->AddItem(item); popUpMenu->AddItem(item);
@ -247,38 +256,41 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
fMajorVersionControl->GetPreferredSize(&width, &height); fMajorVersionControl->GetPreferredSize(&width, &height);
width = 12.0f + fMajorVersionControl->StringWidth("99"); width = 12.0f + fMajorVersionControl->StringWidth("99");
fMajorVersionControl->ResizeTo(fMajorVersionControl->Divider() + width, height); fMajorVersionControl->ResizeTo(fMajorVersionControl->Divider() + width, height);
_MakeNumberTextControl(fMajorVersionControl);
box->AddChild(fMajorVersionControl); box->AddChild(fMajorVersionControl);
rect.left = fMajorVersionControl->Frame().right; rect.left = fMajorVersionControl->Frame().right + 1.0f;
fMiddleVersionControl = new BTextControl(rect, "middle", ".", NULL, fMiddleVersionControl = new BTextControl(rect, "middle", ".", NULL,
NULL); NULL);
fMiddleVersionControl->SetDivider(fMiddleVersionControl->StringWidth( fMiddleVersionControl->SetDivider(fMiddleVersionControl->StringWidth(
fMiddleVersionControl->Label()) + 4.0f); fMiddleVersionControl->Label()) + 4.0f);
fMiddleVersionControl->ResizeTo(fMiddleVersionControl->Divider() + width, height); fMiddleVersionControl->ResizeTo(fMiddleVersionControl->Divider() + width, height);
_MakeNumberTextControl(fMiddleVersionControl);
box->AddChild(fMiddleVersionControl); box->AddChild(fMiddleVersionControl);
rect.left = fMiddleVersionControl->Frame().right; rect.left = fMiddleVersionControl->Frame().right + 1.0f;
fMinorVersionControl = new BTextControl(rect, "middle", ".", NULL, fMinorVersionControl = new BTextControl(rect, "middle", ".", NULL,
NULL); NULL);
fMinorVersionControl->SetDivider(fMinorVersionControl->StringWidth( fMinorVersionControl->SetDivider(fMinorVersionControl->StringWidth(
fMinorVersionControl->Label()) + 4.0f); fMinorVersionControl->Label()) + 4.0f);
fMinorVersionControl->ResizeTo(fMinorVersionControl->Divider() + width, height); fMinorVersionControl->ResizeTo(fMinorVersionControl->Divider() + width, height);
_MakeNumberTextControl(fMinorVersionControl);
box->AddChild(fMinorVersionControl); box->AddChild(fMinorVersionControl);
popUpMenu = new BPopUpMenu("variety", true, true); fVarietyMenu = new BPopUpMenu("variety", true, true);
popUpMenu->AddItem(new BMenuItem("Development", NULL)); fVarietyMenu->AddItem(new BMenuItem("Development", NULL));
popUpMenu->AddItem(new BMenuItem("Alpha", NULL)); fVarietyMenu->AddItem(new BMenuItem("Alpha", NULL));
popUpMenu->AddItem(new BMenuItem("Beta", NULL)); fVarietyMenu->AddItem(new BMenuItem("Beta", NULL));
popUpMenu->AddItem(new BMenuItem("Gamma", NULL)); fVarietyMenu->AddItem(new BMenuItem("Gamma", NULL));
popUpMenu->AddItem(item = new BMenuItem("Golden Master", NULL)); fVarietyMenu->AddItem(item = new BMenuItem("Golden Master", NULL));
item->SetMarked(true); item->SetMarked(true);
popUpMenu->AddItem(new BMenuItem("Final", NULL)); fVarietyMenu->AddItem(new BMenuItem("Final", NULL));
rect.top--; rect.top--;
// BMenuField oddity // BMenuField oddity
rect.left = fMinorVersionControl->Frame().right + 6.0f; rect.left = fMinorVersionControl->Frame().right + 6.0f;
menuField = new BMenuField(rect, menuField = new BMenuField(rect,
"variety", NULL, popUpMenu, true); "variety", NULL, fVarietyMenu, true);
menuField->ResizeToPreferred(); menuField->ResizeToPreferred();
box->AddChild(menuField); box->AddChild(menuField);
@ -301,6 +313,7 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
fShortDescriptionControl->SetDivider(labelWidth); fShortDescriptionControl->SetDivider(labelWidth);
fShortDescriptionControl->GetPreferredSize(&width, &height); fShortDescriptionControl->GetPreferredSize(&width, &height);
fShortDescriptionControl->ResizeTo(rect.Width(), height); fShortDescriptionControl->ResizeTo(rect.Width(), height);
fShortDescriptionControl->TextView()->SetMaxBytes(sizeof(version_info::short_info));
box->AddChild(fShortDescriptionControl); box->AddChild(fShortDescriptionControl);
rect.OffsetBy(0.0f, fShortDescriptionControl->Bounds().Height() + 5.0f); rect.OffsetBy(0.0f, fShortDescriptionControl->Bounds().Height() + 5.0f);
@ -315,6 +328,8 @@ ApplicationTypeWindow::ApplicationTypeWindow(BPoint position, const BEntry& entr
rect.bottom = rect.top + fShortDescriptionControl->Bounds().Height() * 3.0f - 1.0f; rect.bottom = rect.top + fShortDescriptionControl->Bounds().Height() * 3.0f - 1.0f;
fLongDescriptionView = new BTextView(rect, "long desc", fLongDescriptionView = new BTextView(rect, "long desc",
rect.OffsetToCopy(B_ORIGIN), B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS); rect.OffsetToCopy(B_ORIGIN), B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS);
fLongDescriptionView->SetMaxBytes(sizeof(version_info::long_info));
// box->AddChild(fLongDescriptionView);
scrollView = new BScrollView("desc scrollview", fLongDescriptionView, scrollView = new BScrollView("desc scrollview", fLongDescriptionView,
B_FOLLOW_ALL, B_FRAME_EVENTS | B_WILL_DRAW, false, false); B_FOLLOW_ALL, B_FRAME_EVENTS | B_WILL_DRAW, false, false);
@ -364,6 +379,197 @@ ApplicationTypeWindow::_SetTo(const BEntry& entry)
{ {
SetTitle(_Title(entry).String()); SetTitle(_Title(entry).String());
fEntry = entry; fEntry = entry;
// Retrieve Info
BFile file(&entry, B_READ_ONLY);
if (file.InitCheck() != B_OK)
return;
BAppFileInfo info(&file);
if (info.InitCheck() != B_OK)
return;
char signature[B_MIME_TYPE_LENGTH];
if (info.GetSignature(signature) != B_OK)
signature[0] = '\0';
bool gotFlags = false;
uint32 flags;
if (info.GetAppFlags(&flags) == B_OK)
gotFlags = true;
else
flags = B_MULTIPLE_LAUNCH;
BMessage supportedTypes;
info.GetSupportedTypes(&supportedTypes);
version_info versionInfo;
if (info.GetVersionInfo(&versionInfo, B_APP_VERSION_KIND) != B_OK)
memset(&versionInfo, 0, sizeof(version_info));
// Set Controls
fSignatureControl->SetText(signature);
// flags
switch (flags & (B_SINGLE_LAUNCH | B_MULTIPLE_LAUNCH | B_EXCLUSIVE_LAUNCH)) {
case B_SINGLE_LAUNCH:
fSingleLaunchButton->SetValue(B_CONTROL_ON);
break;
case B_EXCLUSIVE_LAUNCH:
fExclusiveLaunchButton->SetValue(B_CONTROL_ON);
break;
case B_MULTIPLE_LAUNCH:
default:
fMultipleLaunchButton->SetValue(B_CONTROL_ON);
break;
}
fArgsOnlyCheckBox->SetValue((flags & B_ARGV_ONLY) != 0);
fBackgroundAppCheckBox->SetValue((flags & B_BACKGROUND_APP) != 0);
fFlagsCheckBox->SetValue(gotFlags);
_UpdateAppFlagsEnabled();
// icon
entry_ref ref;
if (entry.GetRef(&ref) == B_OK)
fIconView->SetTo(&ref);
// supported types
for (int32 i = fTypeListView->CountItems(); i-- > 0;) {
BListItem* item = fTypeListView->RemoveItem(i);
delete item;
}
const char* type;
for (int32 i = 0; supportedTypes.FindString("types", i, &type) == B_OK; i++) {
fTypeListView->AddItem(new BStringItem(type));
}
fRemoveTypeButton->SetEnabled(false);
// version info
char text[256];
snprintf(text, sizeof(text), "%ld", versionInfo.major);
fMajorVersionControl->SetText(text);
snprintf(text, sizeof(text), "%ld", versionInfo.middle);
fMiddleVersionControl->SetText(text);
snprintf(text, sizeof(text), "%ld", versionInfo.minor);
fMinorVersionControl->SetText(text);
if (versionInfo.variety >= (uint32)fVarietyMenu->CountItems())
versionInfo.variety = 0;
BMenuItem* item = fVarietyMenu->ItemAt(versionInfo.variety);
if (item != NULL)
item->SetMarked(true);
snprintf(text, sizeof(text), "%ld", versionInfo.internal);
fInternalVersionControl->SetText(text);
fShortDescriptionControl->SetText(versionInfo.short_info);
fLongDescriptionView->SetText(versionInfo.long_info);
}
void
ApplicationTypeWindow::_UpdateAppFlagsEnabled()
{
bool enabled = fFlagsCheckBox->Value() != B_CONTROL_OFF;
fSingleLaunchButton->SetEnabled(enabled);
fMultipleLaunchButton->SetEnabled(enabled);
fExclusiveLaunchButton->SetEnabled(enabled);
fArgsOnlyCheckBox->SetEnabled(enabled);
fBackgroundAppCheckBox->SetEnabled(enabled);
}
void
ApplicationTypeWindow::_MakeNumberTextControl(BTextControl* control)
{
// filter out invalid characters that can't be part of a MIME type name
BTextView* textView = control->TextView();
textView->SetMaxBytes(10);
for (int32 i = 0; i < 256; i++) {
if (!isdigit(i))
textView->DisallowChar(i);
}
}
void
ApplicationTypeWindow::_Save()
{
BFile file;
status_t status = file.SetTo(&fEntry, B_READ_WRITE);
if (status != B_OK)
return;
BAppFileInfo info(&file);
status = info.InitCheck();
if (status != B_OK)
return;
// Retrieve Info
uint32 flags = 0;
if (fFlagsCheckBox->Value() != B_CONTROL_OFF) {
if (fSingleLaunchButton->Value() != B_CONTROL_OFF)
flags |= B_SINGLE_LAUNCH;
else if (fMultipleLaunchButton->Value() != B_CONTROL_OFF)
flags |= B_MULTIPLE_LAUNCH;
else if (fExclusiveLaunchButton->Value() != B_CONTROL_OFF)
flags |= B_EXCLUSIVE_LAUNCH;
if (fArgsOnlyCheckBox->Value() != B_CONTROL_OFF)
flags |= B_ARGV_ONLY;
if (fBackgroundAppCheckBox->Value() != B_CONTROL_OFF)
flags |= B_BACKGROUND_APP;
}
BMessage supportedTypes;
// TODO!
version_info versionInfo;
versionInfo.major = atol(fMajorVersionControl->Text());
versionInfo.middle = atol(fMiddleVersionControl->Text());
versionInfo.minor = atol(fMinorVersionControl->Text());
versionInfo.variety = fVarietyMenu->IndexOf(fVarietyMenu->FindMarked());
versionInfo.internal = atol(fInternalVersionControl->Text());
strlcpy(versionInfo.short_info, fShortDescriptionControl->Text(),
sizeof(versionInfo.short_info));
strlcpy(versionInfo.long_info, fLongDescriptionView->Text(),
sizeof(versionInfo.long_info));
// Save
status = info.SetSignature(fSignatureControl->Text());
if (status == B_OK)
status = info.SetAppFlags(flags);
if (status == B_OK)
status = info.SetVersionInfo(&versionInfo, B_APP_VERSION_KIND);
// TODO: icon & supported types
// if (status == B_OK)
// status = info.SetIcon(&icon);
// if (status == B_OK)
// status = info.SetSupportedTypes(&supportedTypes);
}
void
ApplicationTypeWindow::FrameResized(float width, float height)
{
// This works around a flaw of BTextView
fLongDescriptionView->SetTextRect(fLongDescriptionView->Bounds());
} }
@ -371,6 +577,14 @@ void
ApplicationTypeWindow::MessageReceived(BMessage* message) ApplicationTypeWindow::MessageReceived(BMessage* message)
{ {
switch (message->what) { switch (message->what) {
case kMsgFlagsChanged:
_UpdateAppFlagsEnabled();
break;
case kMsgSave:
_Save();
break;
case B_SIMPLE_DATA: case B_SIMPLE_DATA:
{ {
entry_ref ref; entry_ref ref;

View File

@ -13,7 +13,7 @@
class BButton; class BButton;
class BCheckBox; class BCheckBox;
class BListView; class BListView;
class BMenuField; class BPopUpMenu;
class BRadioButton; class BRadioButton;
class BTextControl; class BTextControl;
class BTextView; class BTextView;
@ -27,12 +27,16 @@ class ApplicationTypeWindow : public BWindow {
ApplicationTypeWindow(BPoint position, const BEntry& entry); ApplicationTypeWindow(BPoint position, const BEntry& entry);
virtual ~ApplicationTypeWindow(); virtual ~ApplicationTypeWindow();
virtual void FrameResized(float width, float height);
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
virtual bool QuitRequested(); virtual bool QuitRequested();
private: private:
BString _Title(const BEntry& entry); BString _Title(const BEntry& entry);
void _SetTo(const BEntry& entry); void _SetTo(const BEntry& entry);
void _UpdateAppFlagsEnabled();
void _MakeNumberTextControl(BTextControl* control);
void _Save();
private: private:
BEntry fEntry; BEntry fEntry;
@ -55,6 +59,7 @@ class ApplicationTypeWindow : public BWindow {
BTextControl* fMajorVersionControl; BTextControl* fMajorVersionControl;
BTextControl* fMiddleVersionControl; BTextControl* fMiddleVersionControl;
BTextControl* fMinorVersionControl; BTextControl* fMinorVersionControl;
BPopUpMenu* fVarietyMenu;
BTextControl* fInternalVersionControl; BTextControl* fInternalVersionControl;
BTextControl* fShortDescriptionControl; BTextControl* fShortDescriptionControl;
BTextView* fLongDescriptionView; BTextView* fLongDescriptionView;

View File

@ -84,24 +84,27 @@ IconView::MouseDown(BPoint where)
void void
IconView::SetTo(entry_ref* file) IconView::SetTo(entry_ref* ref)
{ {
delete fIcon; delete fIcon;
fIcon = NULL; fIcon = NULL;
BNode node(file); if (ref != NULL) {
BNodeInfo info(&node); BNode node(ref);
if (node.InitCheck() != B_OK BNodeInfo info(&node);
|| info.InitCheck() != B_OK) if (node.InitCheck() != B_OK
return; || info.InitCheck() != B_OK)
return;
BBitmap* icon = new BBitmap(BRect(0, 0, B_LARGE_ICON - 1, B_LARGE_ICON - 1), B_CMAP8); BBitmap* icon = new BBitmap(BRect(0, 0, B_LARGE_ICON - 1, B_LARGE_ICON - 1), B_CMAP8);
if (info.GetIcon(icon, B_LARGE_ICON) != B_OK) { if (info.GetIcon(icon, B_LARGE_ICON) != B_OK) {
delete icon; delete icon;
return; return;
}
fIcon = icon;
} }
fIcon = icon;
Invalidate(); Invalidate();
} }