* "Extra Attributes" can now be added as well.
* Moved AttributeListView and AttributeItem into its own file. * Can now be compiled on R5 systems again. (coded by axeld) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16506 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -40,6 +40,15 @@ const uint32 kMsgRemoveUninstalled = 'runs';
|
|||||||
const char*
|
const char*
|
||||||
variety_to_text(uint32 variety)
|
variety_to_text(uint32 variety)
|
||||||
{
|
{
|
||||||
|
#if defined(HAIKU_TARGET_PLATFORM_BEOS) || defined(HAIKU_TARGET_PLATFORM_BONE)
|
||||||
|
# define B_DEVELOPMENT_VERSION 0
|
||||||
|
# define B_ALPHA_VERSION 1
|
||||||
|
# define B_BETA_VERSION 2
|
||||||
|
# define B_GAMMA_VERSION 3
|
||||||
|
# define B_GOLDEN_MASTER_VERSION 4
|
||||||
|
# define B_FINAL_VERSION 5
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (variety) {
|
switch (variety) {
|
||||||
case B_DEVELOPMENT_VERSION:
|
case B_DEVELOPMENT_VERSION:
|
||||||
return "Development";
|
return "Development";
|
||||||
|
|||||||
@@ -0,0 +1,264 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "AttributeListView.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
const struct type_map kTypeMap[] = {
|
||||||
|
{"String", B_STRING_TYPE},
|
||||||
|
{"Boolean", B_BOOL_TYPE},
|
||||||
|
{"Integer 8 bit", B_INT8_TYPE},
|
||||||
|
{"Integer 16 bit", B_INT16_TYPE},
|
||||||
|
{"Integer 32 bit", B_INT32_TYPE},
|
||||||
|
{"Integer 64 bit", B_INT64_TYPE},
|
||||||
|
{"Float", B_FLOAT_TYPE},
|
||||||
|
{"Double", B_DOUBLE_TYPE},
|
||||||
|
{"Time", B_TIME_TYPE},
|
||||||
|
{NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
name_for_type(BString& string, type_code type)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; kTypeMap[i].name != NULL; i++) {
|
||||||
|
if (kTypeMap[i].type == type) {
|
||||||
|
string = kTypeMap[i].name;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char buffer[32];
|
||||||
|
buffer[0] = '\'';
|
||||||
|
buffer[1] = 0xff & (type >> 24);
|
||||||
|
buffer[2] = 0xff & (type >> 16);
|
||||||
|
buffer[3] = 0xff & (type >> 8);
|
||||||
|
buffer[4] = 0xff & (type);
|
||||||
|
buffer[5] = '\'';
|
||||||
|
buffer[6] = 0;
|
||||||
|
for (int16 i = 0;i < 4;i++) {
|
||||||
|
if (buffer[i] < ' ')
|
||||||
|
buffer[i] = '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buffer + 6, sizeof(buffer), " (0x%lx)", type);
|
||||||
|
string = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem *
|
||||||
|
create_attribute_item(BMessage& attributes, int32 index)
|
||||||
|
{
|
||||||
|
const char* publicName;
|
||||||
|
if (attributes.FindString("attr:public_name", index, &publicName) != B_OK)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
const char* name;
|
||||||
|
if (attributes.FindString("attr:name", index, &name) != B_OK)
|
||||||
|
name = "-";
|
||||||
|
|
||||||
|
type_code type;
|
||||||
|
if (attributes.FindInt32("attr:type", index, (int32 *)&type) != B_OK)
|
||||||
|
type = B_STRING_TYPE;
|
||||||
|
|
||||||
|
const char* displayAs;
|
||||||
|
if (attributes.FindString("attr:display_as", index, &displayAs) != B_OK)
|
||||||
|
displayAs = NULL;
|
||||||
|
|
||||||
|
bool editable;
|
||||||
|
if (attributes.FindBool("attr:editable", index, &editable) != B_OK)
|
||||||
|
editable = false;
|
||||||
|
bool visible;
|
||||||
|
if (attributes.FindBool("attr:viewable", index, &visible) != B_OK)
|
||||||
|
visible = false;
|
||||||
|
|
||||||
|
int32 alignment;
|
||||||
|
if (attributes.FindInt32("attr:alignment", index, &alignment) != B_OK)
|
||||||
|
alignment = B_ALIGN_LEFT;
|
||||||
|
|
||||||
|
int32 width;
|
||||||
|
if (attributes.FindInt32("attr:width", index, &width) != B_OK)
|
||||||
|
width = 50;
|
||||||
|
|
||||||
|
return new AttributeItem(name, publicName, type, displayAs, alignment,
|
||||||
|
width, visible, editable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem::AttributeItem(const char* name, const char* publicName,
|
||||||
|
type_code type, const char* displayAs, int32 alignment,
|
||||||
|
int32 width, bool visible, bool editable)
|
||||||
|
: BStringItem(publicName),
|
||||||
|
fName(name),
|
||||||
|
fType(type),
|
||||||
|
fDisplayAs(displayAs),
|
||||||
|
fAlignment(alignment),
|
||||||
|
fWidth(width),
|
||||||
|
fVisible(visible),
|
||||||
|
fEditable(editable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem::AttributeItem()
|
||||||
|
: BStringItem(""),
|
||||||
|
fType(B_STRING_TYPE),
|
||||||
|
fAlignment(B_ALIGN_LEFT),
|
||||||
|
fWidth(60),
|
||||||
|
fVisible(true),
|
||||||
|
fEditable(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem::AttributeItem(const AttributeItem& other)
|
||||||
|
: BStringItem(other.PublicName())
|
||||||
|
{
|
||||||
|
*this = other;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem::~AttributeItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeItem::DrawItem(BView* owner, BRect frame, bool drawEverything)
|
||||||
|
{
|
||||||
|
BStringItem::DrawItem(owner, frame, drawEverything);
|
||||||
|
|
||||||
|
rgb_color highColor = owner->HighColor();
|
||||||
|
rgb_color lowColor = owner->LowColor();
|
||||||
|
|
||||||
|
if (IsSelected())
|
||||||
|
owner->SetLowColor(tint_color(lowColor, B_DARKEN_2_TINT));
|
||||||
|
|
||||||
|
rgb_color black = {0, 0, 0, 255};
|
||||||
|
|
||||||
|
if (!IsEnabled())
|
||||||
|
owner->SetHighColor(tint_color(black, B_LIGHTEN_2_TINT));
|
||||||
|
else
|
||||||
|
owner->SetHighColor(black);
|
||||||
|
|
||||||
|
owner->MovePenTo(frame.left + frame.Width() / 2.0f + 5.0f, owner->PenLocation().y);
|
||||||
|
|
||||||
|
BString type;
|
||||||
|
name_for_type(type, fType);
|
||||||
|
owner->DrawString(type.String());
|
||||||
|
|
||||||
|
owner->SetHighColor(tint_color(owner->ViewColor(), B_DARKEN_1_TINT));
|
||||||
|
|
||||||
|
float middle = frame.left + frame.Width() / 2.0f;
|
||||||
|
owner->StrokeLine(BPoint(middle, 0.0f), BPoint(middle, frame.bottom));
|
||||||
|
|
||||||
|
owner->SetHighColor(highColor);
|
||||||
|
owner->SetLowColor(lowColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem&
|
||||||
|
AttributeItem::operator=(const AttributeItem& other)
|
||||||
|
{
|
||||||
|
SetText(other.PublicName());
|
||||||
|
fName = other.Name();
|
||||||
|
fType = other.Type();
|
||||||
|
fDisplayAs = other.DisplayAs();
|
||||||
|
fAlignment = other.Alignment();
|
||||||
|
fWidth = other.Width();
|
||||||
|
fVisible = other.Visible();
|
||||||
|
fEditable = other.Editable();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
AttributeItem::operator==(const AttributeItem& other) const
|
||||||
|
{
|
||||||
|
return !strcmp(Name(), other.Name())
|
||||||
|
&& !strcmp(PublicName(), other.PublicName())
|
||||||
|
&& !strcmp(DisplayAs(), other.DisplayAs())
|
||||||
|
&& Type() == other.Type()
|
||||||
|
&& Alignment() == other.Alignment()
|
||||||
|
&& Width() == other.Width()
|
||||||
|
&& Visible() == other.Visible()
|
||||||
|
&& Editable() == other.Editable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
AttributeItem::operator!=(const AttributeItem& other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
AttributeListView::AttributeListView(BRect frame, const char* name,
|
||||||
|
uint32 resizingMode)
|
||||||
|
: BListView(frame, name, B_SINGLE_SELECTION_LIST, resizingMode,
|
||||||
|
B_WILL_DRAW | B_NAVIGABLE | B_FULL_UPDATE_ON_RESIZE)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeListView::~AttributeListView()
|
||||||
|
{
|
||||||
|
_DeleteItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeListView::_DeleteItems()
|
||||||
|
{
|
||||||
|
for (int32 i = CountItems(); i-- > 0;) {
|
||||||
|
delete ItemAt(i);
|
||||||
|
}
|
||||||
|
MakeEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeListView::SetTo(BMimeType* type)
|
||||||
|
{
|
||||||
|
_DeleteItems();
|
||||||
|
|
||||||
|
// fill it again
|
||||||
|
|
||||||
|
if (type == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BMessage attributes;
|
||||||
|
if (type->GetAttrInfo(&attributes) != B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
AttributeItem* item;
|
||||||
|
int32 i = 0;
|
||||||
|
while ((item = create_attribute_item(attributes, i++)) != NULL) {
|
||||||
|
AddItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeListView::Draw(BRect updateRect)
|
||||||
|
{
|
||||||
|
BListView::Draw(updateRect);
|
||||||
|
|
||||||
|
SetHighColor(tint_color(ViewColor(), B_DARKEN_1_TINT));
|
||||||
|
|
||||||
|
float middle = Bounds().Width() / 2.0f;
|
||||||
|
StrokeLine(BPoint(middle, 0.0f), BPoint(middle, Bounds().bottom));
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef ATTRIBUTE_LIST_VIEW_H
|
||||||
|
#define ATTRIBUTE_LIST_VIEW_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <ListView.h>
|
||||||
|
#include <Mime.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeItem : public BStringItem {
|
||||||
|
public:
|
||||||
|
AttributeItem(const char* name, const char* publicName, type_code type,
|
||||||
|
const char* displayAs, int32 alignment, int32 width, bool visible,
|
||||||
|
bool editable);
|
||||||
|
AttributeItem();
|
||||||
|
AttributeItem(const AttributeItem& other);
|
||||||
|
virtual ~AttributeItem();
|
||||||
|
|
||||||
|
virtual void DrawItem(BView* owner, BRect itemRect,
|
||||||
|
bool drawEverything = false);
|
||||||
|
|
||||||
|
const char* Name() const { return fName.String(); }
|
||||||
|
const char* PublicName() const { return Text(); }
|
||||||
|
|
||||||
|
type_code Type() const { return fType; }
|
||||||
|
const char* DisplayAs() const { return fDisplayAs.String(); }
|
||||||
|
int32 Alignment() const { return fAlignment; }
|
||||||
|
int32 Width() const { return fWidth; }
|
||||||
|
bool Visible() const { return fVisible; }
|
||||||
|
bool Editable() const { return fEditable; }
|
||||||
|
|
||||||
|
AttributeItem& operator=(const AttributeItem& other);
|
||||||
|
|
||||||
|
bool operator==(const AttributeItem& other) const;
|
||||||
|
bool operator!=(const AttributeItem& other) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
BString fName;
|
||||||
|
type_code fType;
|
||||||
|
BString fDisplayAs;
|
||||||
|
int32 fAlignment;
|
||||||
|
int32 fWidth;
|
||||||
|
bool fVisible;
|
||||||
|
bool fEditable;
|
||||||
|
};
|
||||||
|
|
||||||
|
class AttributeListView : public BListView {
|
||||||
|
public:
|
||||||
|
AttributeListView(BRect frame, const char* name, uint32 resizingMode);
|
||||||
|
virtual ~AttributeListView();
|
||||||
|
|
||||||
|
void SetTo(BMimeType* type);
|
||||||
|
|
||||||
|
virtual void Draw(BRect updateRect);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _DeleteItems();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct type_map {
|
||||||
|
const char* name;
|
||||||
|
type_code type;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct type_map kTypeMap[];
|
||||||
|
|
||||||
|
AttributeItem *create_attribute_item(BMessage& attributes, int32 index);
|
||||||
|
|
||||||
|
#endif // ATTRIBUTE_LIST_VIEW_H
|
||||||
@@ -0,0 +1,392 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "AttributeWindow.h"
|
||||||
|
#include "FileTypesWindow.h"
|
||||||
|
|
||||||
|
#include <Box.h>
|
||||||
|
#include <Button.h>
|
||||||
|
#include <CheckBox.h>
|
||||||
|
#include <MenuField.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
|
#include <Mime.h>
|
||||||
|
#include <PopUpMenu.h>
|
||||||
|
#include <String.h>
|
||||||
|
#include <TextControl.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
const uint32 kMsgAttributeUpdated = 'atup';
|
||||||
|
const uint32 kMsgTypeChosen = 'typc';
|
||||||
|
const uint32 kMsgVisibilityChanged = 'vsch';
|
||||||
|
const uint32 kMsgAlignmentChosen = 'alnc';
|
||||||
|
const uint32 kMsgAccept = 'acpt';
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
compare_attributes(const void* _a, const void* _b)
|
||||||
|
{
|
||||||
|
AttributeItem* a = *(AttributeItem **)_a;
|
||||||
|
AttributeItem* b = *(AttributeItem **)_b;
|
||||||
|
|
||||||
|
int compare = strcasecmp(a->PublicName(), b->PublicName());
|
||||||
|
if (compare != 0)
|
||||||
|
return compare;
|
||||||
|
|
||||||
|
return strcmp(a->Name(), b->Name());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
AttributeWindow::AttributeWindow(FileTypesWindow* target, BMimeType& mimeType,
|
||||||
|
AttributeItem* item)
|
||||||
|
: BWindow(BRect(100, 100, 350, 200), "Attribute", B_MODAL_WINDOW_LOOK,
|
||||||
|
B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE
|
||||||
|
| B_ASYNCHRONOUS_CONTROLS),
|
||||||
|
fTarget(target),
|
||||||
|
fMimeType(mimeType.Type())
|
||||||
|
{
|
||||||
|
if (item != NULL)
|
||||||
|
fAttribute = *item;
|
||||||
|
|
||||||
|
BRect rect = Bounds();
|
||||||
|
BView* topView = new BView(rect, NULL, B_FOLLOW_ALL, B_WILL_DRAW);
|
||||||
|
topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
|
AddChild(topView);
|
||||||
|
|
||||||
|
rect.InsetBy(8.0f, 8.0f);
|
||||||
|
fPublicNameControl = new BTextControl(rect, "public", "Attribute Name:",
|
||||||
|
fAttribute.PublicName(), NULL, B_FOLLOW_LEFT_RIGHT);
|
||||||
|
fPublicNameControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated));
|
||||||
|
|
||||||
|
float labelWidth = fPublicNameControl->StringWidth(fPublicNameControl->Label()) + 2.0f;
|
||||||
|
fPublicNameControl->SetDivider(labelWidth);
|
||||||
|
fPublicNameControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
|
||||||
|
|
||||||
|
float width, height;
|
||||||
|
fPublicNameControl->GetPreferredSize(&width, &height);
|
||||||
|
fPublicNameControl->ResizeTo(rect.Width(), height);
|
||||||
|
topView->AddChild(fPublicNameControl);
|
||||||
|
|
||||||
|
rect = fPublicNameControl->Frame();
|
||||||
|
rect.OffsetBy(0.0f, rect.Height() + 5.0f);
|
||||||
|
fAttributeControl = new BTextControl(rect, "internal", "Internal Name:",
|
||||||
|
fAttribute.Name(), NULL, B_FOLLOW_LEFT_RIGHT);
|
||||||
|
fAttributeControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated));
|
||||||
|
fAttributeControl->SetDivider(labelWidth);
|
||||||
|
fAttributeControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
|
||||||
|
|
||||||
|
// filter out invalid characters that can't be part of an attribute
|
||||||
|
BTextView* textView = fAttributeControl->TextView();
|
||||||
|
const char* disallowedCharacters = "/";
|
||||||
|
for (int32 i = 0; disallowedCharacters[i]; i++) {
|
||||||
|
textView->DisallowChar(disallowedCharacters[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
topView->AddChild(fAttributeControl);
|
||||||
|
|
||||||
|
fTypeMenu = new BPopUpMenu("type");
|
||||||
|
BMenuItem* item;
|
||||||
|
for (int32 i = 0; kTypeMap[i].name != NULL; i++) {
|
||||||
|
BMessage* message = new BMessage(kMsgTypeChosen);
|
||||||
|
message->AddInt32("type", kTypeMap[i].type);
|
||||||
|
|
||||||
|
item = new BMenuItem(kTypeMap[i].name, message);
|
||||||
|
fTypeMenu->AddItem(item);
|
||||||
|
|
||||||
|
if (kTypeMap[i].type == fAttribute.Type())
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
rect.OffsetBy(0.0f, rect.Height() + 4.0f);
|
||||||
|
BMenuField* menuField = new BMenuField(rect, "types",
|
||||||
|
"Type:", fTypeMenu);
|
||||||
|
menuField->SetDivider(labelWidth);
|
||||||
|
menuField->SetAlignment(B_ALIGN_RIGHT);
|
||||||
|
menuField->GetPreferredSize(&width, &height);
|
||||||
|
menuField->ResizeTo(rect.Width(), height);
|
||||||
|
topView->AddChild(menuField);
|
||||||
|
|
||||||
|
rect.OffsetBy(0.0f, rect.Height() + 4.0f);
|
||||||
|
rect.bottom = rect.top + fAttributeControl->Bounds().Height() * 5.0f + 22.0f;
|
||||||
|
BBox* box = new BBox(rect, "", B_FOLLOW_LEFT_RIGHT);
|
||||||
|
topView->AddChild(box);
|
||||||
|
|
||||||
|
fVisibleCheckBox = new BCheckBox(rect, "visible", "Visible",
|
||||||
|
new BMessage(kMsgVisibilityChanged));
|
||||||
|
fVisibleCheckBox->SetValue(fAttribute.Visible());
|
||||||
|
fVisibleCheckBox->ResizeToPreferred();
|
||||||
|
box->SetLabel(fVisibleCheckBox);
|
||||||
|
|
||||||
|
labelWidth -= 8.0f;
|
||||||
|
|
||||||
|
BMenu* menu = new BPopUpMenu("display as");
|
||||||
|
// TODO!
|
||||||
|
menu->AddItem(item = new BMenuItem("Default", NULL));
|
||||||
|
item->SetMarked(true);
|
||||||
|
|
||||||
|
rect.OffsetTo(8.0f, fVisibleCheckBox->Bounds().Height());
|
||||||
|
rect.right -= 18.0f;
|
||||||
|
fDisplayAsMenuField = new BMenuField(rect, "display as",
|
||||||
|
"Display As:", menu);
|
||||||
|
fDisplayAsMenuField->SetDivider(labelWidth);
|
||||||
|
fDisplayAsMenuField->SetAlignment(B_ALIGN_RIGHT);
|
||||||
|
fDisplayAsMenuField->ResizeTo(rect.Width(), height);
|
||||||
|
box->AddChild(fDisplayAsMenuField);
|
||||||
|
|
||||||
|
fEditableCheckBox = new BCheckBox(rect, "editable", "Editable",
|
||||||
|
new BMessage(kMsgAttributeUpdated), B_FOLLOW_RIGHT);
|
||||||
|
fEditableCheckBox->SetValue(fAttribute.Editable());
|
||||||
|
fEditableCheckBox->ResizeToPreferred();
|
||||||
|
fEditableCheckBox->MoveTo(rect.right - fEditableCheckBox->Bounds().Width(),
|
||||||
|
rect.top + (fDisplayAsMenuField->Bounds().Height()
|
||||||
|
- fEditableCheckBox->Bounds().Height()) / 2.0f);
|
||||||
|
box->AddChild(fEditableCheckBox);
|
||||||
|
|
||||||
|
rect.OffsetBy(0.0f, menuField->Bounds().Height() + 4.0f);
|
||||||
|
rect.bottom = rect.top + fPublicNameControl->Bounds().Height();
|
||||||
|
fSpecialControl = new BTextControl(rect, "special", "Special:",
|
||||||
|
NULL, NULL, B_FOLLOW_LEFT_RIGHT);
|
||||||
|
fSpecialControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated));
|
||||||
|
fSpecialControl->SetDivider(labelWidth);
|
||||||
|
fSpecialControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
|
||||||
|
fSpecialControl->SetEnabled(false);
|
||||||
|
box->AddChild(fSpecialControl);
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
snprintf(text, sizeof(text), "%ld", fAttribute.Width());
|
||||||
|
rect.OffsetBy(0.0f, fSpecialControl->Bounds().Height() + 4.0f);
|
||||||
|
fWidthControl = new BTextControl(rect, "width", "Width:",
|
||||||
|
text, NULL, B_FOLLOW_LEFT_RIGHT);
|
||||||
|
fWidthControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated));
|
||||||
|
fWidthControl->SetDivider(labelWidth);
|
||||||
|
fWidthControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
|
||||||
|
|
||||||
|
// filter out invalid characters that can't be part of a width
|
||||||
|
textView = fWidthControl->TextView();
|
||||||
|
for (int32 i = 0; i < 256; i++) {
|
||||||
|
if (!isdigit(i))
|
||||||
|
textView->DisallowChar(i);
|
||||||
|
}
|
||||||
|
textView->SetMaxBytes(4);
|
||||||
|
|
||||||
|
box->AddChild(fWidthControl);
|
||||||
|
|
||||||
|
const struct alignment_map {
|
||||||
|
int32 alignment;
|
||||||
|
const char* name;
|
||||||
|
} kAlignmentMap[] = {
|
||||||
|
{B_ALIGN_LEFT, "Left"},
|
||||||
|
{B_ALIGN_RIGHT, "Right"},
|
||||||
|
{B_ALIGN_CENTER, "Center"},
|
||||||
|
{0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
menu = new BPopUpMenu("alignment");
|
||||||
|
for (int32 i = 0; kAlignmentMap[i].name != NULL; i++) {
|
||||||
|
BMessage* message = new BMessage(kMsgAlignmentChosen);
|
||||||
|
message->AddInt32("alignment", kAlignmentMap[i].alignment);
|
||||||
|
|
||||||
|
item = new BMenuItem(kAlignmentMap[i].name, message);
|
||||||
|
menu->AddItem(item);
|
||||||
|
|
||||||
|
if (kAlignmentMap[i].alignment == fAttribute.Alignment())
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
rect.OffsetBy(0.0f, menuField->Bounds().Height() + 1.0f);
|
||||||
|
fAlignmentMenuField = new BMenuField(rect, "alignment",
|
||||||
|
"Alignment:", menu);
|
||||||
|
fAlignmentMenuField->SetDivider(labelWidth);
|
||||||
|
fAlignmentMenuField->SetAlignment(B_ALIGN_RIGHT);
|
||||||
|
fAlignmentMenuField->ResizeTo(rect.Width(), height);
|
||||||
|
box->AddChild(fAlignmentMenuField);
|
||||||
|
|
||||||
|
fAcceptButton = new BButton(rect, "add", item ? "Done" : "Add",
|
||||||
|
new BMessage(kMsgAccept), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
||||||
|
fAcceptButton->ResizeToPreferred();
|
||||||
|
fAcceptButton->MoveTo(Bounds().Width() - 8.0f - fAcceptButton->Bounds().Width(),
|
||||||
|
Bounds().Height() - 8.0f - fAcceptButton->Bounds().Height());
|
||||||
|
fAcceptButton->SetEnabled(false);
|
||||||
|
topView->AddChild(fAcceptButton);
|
||||||
|
|
||||||
|
BButton* button = new BButton(rect, "cancel", "Cancel",
|
||||||
|
new BMessage(B_QUIT_REQUESTED), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
||||||
|
button->ResizeToPreferred();
|
||||||
|
button->MoveTo(fAcceptButton->Frame().left - 10.0f - button->Bounds().Width(),
|
||||||
|
fAcceptButton->Frame().top);
|
||||||
|
topView->AddChild(button);
|
||||||
|
|
||||||
|
ResizeTo(labelWidth * 4.0f + 24.0f, box->Frame().bottom
|
||||||
|
+ button->Bounds().Height() + 20.0f);
|
||||||
|
SetSizeLimits(fEditableCheckBox->Bounds().Width() + button->Bounds().Width()
|
||||||
|
+ fAcceptButton->Bounds().Width() + labelWidth + 24.0f,
|
||||||
|
32767.0f, Frame().Height(), Frame().Height());
|
||||||
|
|
||||||
|
fAcceptButton->MakeDefault(true);
|
||||||
|
fPublicNameControl->MakeFocus(true);
|
||||||
|
|
||||||
|
target->PlaceSubWindow(this);
|
||||||
|
AddToSubset(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeWindow::~AttributeWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeWindow::_CheckAcceptable()
|
||||||
|
{
|
||||||
|
bool enabled = fAttributeControl->Text() != NULL
|
||||||
|
&& fAttributeControl->Text()[0] != '\0'
|
||||||
|
&& fPublicNameControl->Text() != NULL
|
||||||
|
&& fPublicNameControl->Text()[0] != '\0';
|
||||||
|
|
||||||
|
if (enabled) {
|
||||||
|
// check for equality
|
||||||
|
AttributeItem* item = _NewItemFromCurrent();
|
||||||
|
enabled = fAttribute != *item;
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update button
|
||||||
|
|
||||||
|
if (fAcceptButton->IsEnabled() != enabled)
|
||||||
|
fAcceptButton->SetEnabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AttributeItem*
|
||||||
|
AttributeWindow::_NewItemFromCurrent()
|
||||||
|
{
|
||||||
|
const char* newAttribute = fAttributeControl->Text();
|
||||||
|
|
||||||
|
type_code type = B_STRING_TYPE;
|
||||||
|
BMenuItem* item = fTypeMenu->FindMarked();
|
||||||
|
if (item != NULL && item->Message() != NULL) {
|
||||||
|
int32 value;
|
||||||
|
if (item->Message()->FindInt32("type", &value) == B_OK)
|
||||||
|
type = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 alignment = B_ALIGN_LEFT;
|
||||||
|
item = fAlignmentMenuField->Menu()->FindMarked();
|
||||||
|
if (item != NULL && item->Message() != NULL) {
|
||||||
|
int32 value;
|
||||||
|
if (item->Message()->FindInt32("alignment", &value) == B_OK)
|
||||||
|
alignment = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 width = atoi(fWidthControl->Text());
|
||||||
|
if (width < 0)
|
||||||
|
width = 0;
|
||||||
|
|
||||||
|
char displayAs[512];
|
||||||
|
displayAs[0] = '\0';
|
||||||
|
//strlcpy(displayAs, fSpecialControl->Text(), sizeof(displayAs));
|
||||||
|
|
||||||
|
return new AttributeItem(newAttribute,
|
||||||
|
fPublicNameControl->Text(), type, displayAs, alignment,
|
||||||
|
width, fVisibleCheckBox->Value() == B_CONTROL_ON,
|
||||||
|
fEditableCheckBox->Value() == B_CONTROL_ON);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AttributeWindow::MessageReceived(BMessage* message)
|
||||||
|
{
|
||||||
|
switch (message->what) {
|
||||||
|
case kMsgAttributeUpdated:
|
||||||
|
case kMsgAlignmentChosen:
|
||||||
|
case kMsgTypeChosen:
|
||||||
|
_CheckAcceptable();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kMsgVisibilityChanged:
|
||||||
|
{
|
||||||
|
bool enabled = fVisibleCheckBox->Value() != B_CONTROL_OFF;
|
||||||
|
|
||||||
|
fDisplayAsMenuField->SetEnabled(enabled);
|
||||||
|
//fSpecialControl->SetEnabled(enabled);
|
||||||
|
fWidthControl->SetEnabled(enabled);
|
||||||
|
fAlignmentMenuField->SetEnabled(enabled);
|
||||||
|
fEditableCheckBox->SetEnabled(enabled);
|
||||||
|
|
||||||
|
_CheckAcceptable();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case kMsgAccept:
|
||||||
|
{
|
||||||
|
BMessage attributes;
|
||||||
|
status_t status = fMimeType.GetAttrInfo(&attributes);
|
||||||
|
if (status == B_OK) {
|
||||||
|
// replace the entry, and remove any equivalent entries
|
||||||
|
BList list;
|
||||||
|
|
||||||
|
const char* newAttribute = fAttributeControl->Text();
|
||||||
|
list.AddItem(_NewItemFromCurrent());
|
||||||
|
|
||||||
|
const char* attribute;
|
||||||
|
for (int32 i = 0; attributes.FindString("attr:name", i,
|
||||||
|
&attribute) == B_OK; i++) {
|
||||||
|
if (!strcmp(fAttribute.Name(), attribute)
|
||||||
|
|| !strcmp(newAttribute, attribute)) {
|
||||||
|
// remove this item
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AttributeItem* item = create_attribute_item(attributes, i);
|
||||||
|
if (item != NULL)
|
||||||
|
list.AddItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.SortItems(compare_attributes);
|
||||||
|
|
||||||
|
// Copy them to a new message (their memory is still part of the
|
||||||
|
// original BMessage)
|
||||||
|
BMessage newAttributes;
|
||||||
|
for (int32 i = 0; i < list.CountItems(); i++) {
|
||||||
|
AttributeItem* item = (AttributeItem*)list.ItemAt(i);
|
||||||
|
|
||||||
|
newAttributes.AddString("attr:name", item->Name());
|
||||||
|
newAttributes.AddString("attr:public_name", item->PublicName());
|
||||||
|
newAttributes.AddInt32("attr:type", (int32)item->Type());
|
||||||
|
newAttributes.AddString("attr:display_as", item->DisplayAs());
|
||||||
|
newAttributes.AddInt32("attr:alignment", item->Alignment());
|
||||||
|
newAttributes.AddInt32("attr:width", item->Width());
|
||||||
|
newAttributes.AddBool("attr:viewable", item->Visible());
|
||||||
|
newAttributes.AddBool("attr:editable", item->Editable());
|
||||||
|
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = fMimeType.SetAttrInfo(&newAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != B_OK)
|
||||||
|
error_alert("Could not change attributes", status);
|
||||||
|
|
||||||
|
PostMessage(B_QUIT_REQUESTED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
AttributeWindow::QuitRequested()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef ATTRIBUTE_WINDOW_H
|
||||||
|
#define ATTRIBUTE_WINDOW_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "AttributeListView.h"
|
||||||
|
|
||||||
|
#include <Messenger.h>
|
||||||
|
#include <Mime.h>
|
||||||
|
#include <String.h>
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
|
class BButton;
|
||||||
|
class BMenu;
|
||||||
|
class BTextControl;
|
||||||
|
|
||||||
|
class FileTypesWindow;
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeWindow : public BWindow {
|
||||||
|
public:
|
||||||
|
AttributeWindow(FileTypesWindow* target, BMimeType& type,
|
||||||
|
AttributeItem* item);
|
||||||
|
virtual ~AttributeWindow();
|
||||||
|
|
||||||
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
virtual bool QuitRequested();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _CheckAcceptable();
|
||||||
|
AttributeItem* _NewItemFromCurrent();
|
||||||
|
|
||||||
|
private:
|
||||||
|
BMessenger fTarget;
|
||||||
|
BMimeType fMimeType;
|
||||||
|
AttributeItem fAttribute;
|
||||||
|
BTextControl* fPublicNameControl;
|
||||||
|
BTextControl* fAttributeControl;
|
||||||
|
BMenu* fTypeMenu;
|
||||||
|
BMenuField* fDisplayAsMenuField;
|
||||||
|
BMenuField* fAlignmentMenuField;
|
||||||
|
BCheckBox* fVisibleCheckBox;
|
||||||
|
BCheckBox* fEditableCheckBox;
|
||||||
|
BTextControl* fSpecialControl;
|
||||||
|
BTextControl* fWidthControl;
|
||||||
|
BButton* fAcceptButton;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ATTRIBUTE_WINDOW_H
|
||||||
@@ -41,7 +41,7 @@ compare_extensions(const void* _a, const void* _b)
|
|||||||
|
|
||||||
|
|
||||||
ExtensionWindow::ExtensionWindow(FileTypesWindow* target, BMimeType& type,
|
ExtensionWindow::ExtensionWindow(FileTypesWindow* target, BMimeType& type,
|
||||||
const char* extension)
|
const char* extension)
|
||||||
: BWindow(BRect(100, 100, 350, 200), "Extension", B_MODAL_WINDOW_LOOK,
|
: BWindow(BRect(100, 100, 350, 200), "Extension", B_MODAL_WINDOW_LOOK,
|
||||||
B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE
|
B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE
|
||||||
| B_ASYNCHRONOUS_CONTROLS),
|
| B_ASYNCHRONOUS_CONTROLS),
|
||||||
@@ -177,10 +177,3 @@ ExtensionWindow::MessageReceived(BMessage* message)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
ExtensionWindow::QuitRequested()
|
|
||||||
{
|
|
||||||
fTarget.SendMessage(kMsgNewTypeWindowClosed);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ class FileTypesWindow;
|
|||||||
|
|
||||||
class ExtensionWindow : public BWindow {
|
class ExtensionWindow : public BWindow {
|
||||||
public:
|
public:
|
||||||
ExtensionWindow(FileTypesWindow* target, BMimeType& type, const char* extension);
|
ExtensionWindow(FileTypesWindow* target, BMimeType& type,
|
||||||
|
const char* extension);
|
||||||
virtual ~ExtensionWindow();
|
virtual ~ExtensionWindow();
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
virtual bool QuitRequested();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BMessenger fTarget;
|
BMessenger fTarget;
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "AttributeListView.h"
|
||||||
|
#include "AttributeWindow.h"
|
||||||
#include "ExtensionWindow.h"
|
#include "ExtensionWindow.h"
|
||||||
#include "FileTypes.h"
|
#include "FileTypes.h"
|
||||||
#include "FileTypesWindow.h"
|
#include "FileTypesWindow.h"
|
||||||
@@ -56,22 +58,6 @@ const uint32 kMsgDescriptionEntered = 'dsce';
|
|||||||
|
|
||||||
const uint32 kMsgToggleIcons = 'tgic';
|
const uint32 kMsgToggleIcons = 'tgic';
|
||||||
|
|
||||||
const struct type_map {
|
|
||||||
const char* name;
|
|
||||||
type_code type;
|
|
||||||
} kTypeMap[] = {
|
|
||||||
{"String", B_STRING_TYPE},
|
|
||||||
{"Boolean", B_BOOL_TYPE},
|
|
||||||
{"Integer 8 bit", B_INT8_TYPE},
|
|
||||||
{"Integer 16 bit", B_INT16_TYPE},
|
|
||||||
{"Integer 32 bit", B_INT32_TYPE},
|
|
||||||
{"Integer 64 bit", B_INT64_TYPE},
|
|
||||||
{"Float", B_FLOAT_TYPE},
|
|
||||||
{"Double", B_DOUBLE_TYPE},
|
|
||||||
{"Time", B_TIME_TYPE},
|
|
||||||
{NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
class IconView : public BControl {
|
class IconView : public BControl {
|
||||||
public:
|
public:
|
||||||
IconView(BRect frame, const char* name, BMessage* message);
|
IconView(BRect frame, const char* name, BMessage* message);
|
||||||
@@ -93,38 +79,6 @@ class IconView : public BControl {
|
|||||||
icon_source fIconSource;
|
icon_source fIconSource;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AttributeListView : public BListView {
|
|
||||||
public:
|
|
||||||
AttributeListView(BRect frame, const char* name, uint32 resizingMode);
|
|
||||||
virtual ~AttributeListView();
|
|
||||||
|
|
||||||
void SetTo(BMimeType* type);
|
|
||||||
|
|
||||||
virtual void Draw(BRect updateRect);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void _DeleteItems();
|
|
||||||
};
|
|
||||||
|
|
||||||
class AttributeItem : public BStringItem {
|
|
||||||
public:
|
|
||||||
AttributeItem(const char* name, const char* publicName, type_code type,
|
|
||||||
int32 alignment, int32 width, bool visible, bool editable);
|
|
||||||
virtual ~AttributeItem();
|
|
||||||
|
|
||||||
virtual void DrawItem(BView* owner, BRect itemRect,
|
|
||||||
bool drawEverything = false);
|
|
||||||
|
|
||||||
private:
|
|
||||||
BString fName;
|
|
||||||
BString fPublicName;
|
|
||||||
type_code fType;
|
|
||||||
int32 fAlignment;
|
|
||||||
int32 fWidth;
|
|
||||||
bool fVisible;
|
|
||||||
bool fEditable;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
@@ -153,34 +107,6 @@ is_application_in_message(BMessage& applications, const char* app)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
name_for_type(BString& string, type_code type)
|
|
||||||
{
|
|
||||||
for (int32 i = 0; kTypeMap[i].name != NULL; i++) {
|
|
||||||
if (kTypeMap[i].type == type) {
|
|
||||||
string = kTypeMap[i].name;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[32];
|
|
||||||
buffer[0] = '\'';
|
|
||||||
buffer[1] = 0xff & (type >> 24);
|
|
||||||
buffer[2] = 0xff & (type >> 16);
|
|
||||||
buffer[3] = 0xff & (type >> 8);
|
|
||||||
buffer[4] = 0xff & (type);
|
|
||||||
buffer[5] = '\'';
|
|
||||||
buffer[6] = 0;
|
|
||||||
for (int16 i = 0;i < 4;i++) {
|
|
||||||
if (buffer[i] < ' ')
|
|
||||||
buffer[i] = '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(buffer + 6, sizeof(buffer), " (0x%lx)", type);
|
|
||||||
string = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
error_alert(const char* message, status_t status, alert_type type)
|
error_alert(const char* message, status_t status, alert_type type)
|
||||||
{
|
{
|
||||||
@@ -312,152 +238,6 @@ IconView::GetPreferredSize(float* _width, float* _height)
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
AttributeItem::AttributeItem(const char* name, const char* publicName,
|
|
||||||
type_code type, int32 alignment, int32 width, bool visible,
|
|
||||||
bool editable)
|
|
||||||
: BStringItem(publicName),
|
|
||||||
fName(name),
|
|
||||||
fType(type),
|
|
||||||
fAlignment(alignment),
|
|
||||||
fWidth(width),
|
|
||||||
fVisible(visible),
|
|
||||||
fEditable(editable)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AttributeItem::~AttributeItem()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
AttributeItem::DrawItem(BView* owner, BRect frame, bool drawEverything)
|
|
||||||
{
|
|
||||||
BStringItem::DrawItem(owner, frame, drawEverything);
|
|
||||||
|
|
||||||
rgb_color highColor = owner->HighColor();
|
|
||||||
rgb_color lowColor = owner->LowColor();
|
|
||||||
|
|
||||||
if (IsSelected())
|
|
||||||
owner->SetLowColor(tint_color(lowColor, B_DARKEN_2_TINT));
|
|
||||||
|
|
||||||
rgb_color black = {0, 0, 0, 255};
|
|
||||||
|
|
||||||
if (!IsEnabled())
|
|
||||||
owner->SetHighColor(tint_color(black, B_LIGHTEN_2_TINT));
|
|
||||||
else
|
|
||||||
owner->SetHighColor(black);
|
|
||||||
|
|
||||||
owner->MovePenTo(frame.left + frame.Width() / 2.0f + 5.0f, owner->PenLocation().y);
|
|
||||||
|
|
||||||
BString type;
|
|
||||||
name_for_type(type, fType);
|
|
||||||
owner->DrawString(type.String());
|
|
||||||
|
|
||||||
owner->SetHighColor(tint_color(owner->ViewColor(), B_DARKEN_1_TINT));
|
|
||||||
|
|
||||||
float middle = frame.left + frame.Width() / 2.0f;
|
|
||||||
owner->StrokeLine(BPoint(middle, 0.0f), BPoint(middle, frame.bottom));
|
|
||||||
|
|
||||||
owner->SetHighColor(highColor);
|
|
||||||
owner->SetLowColor(lowColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
AttributeListView::AttributeListView(BRect frame, const char* name,
|
|
||||||
uint32 resizingMode)
|
|
||||||
: BListView(frame, name, B_SINGLE_SELECTION_LIST, resizingMode,
|
|
||||||
B_WILL_DRAW | B_NAVIGABLE | B_FULL_UPDATE_ON_RESIZE)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AttributeListView::~AttributeListView()
|
|
||||||
{
|
|
||||||
_DeleteItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
AttributeListView::_DeleteItems()
|
|
||||||
{
|
|
||||||
for (int32 i = CountItems(); i-- > 0;) {
|
|
||||||
delete ItemAt(i);
|
|
||||||
}
|
|
||||||
MakeEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
AttributeListView::SetTo(BMimeType* type)
|
|
||||||
{
|
|
||||||
_DeleteItems();
|
|
||||||
|
|
||||||
// fill it again
|
|
||||||
|
|
||||||
if (type == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
BMessage attributes;
|
|
||||||
if (type->GetAttrInfo(&attributes) != B_OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const char* publicName;
|
|
||||||
int32 i = 0;
|
|
||||||
while (attributes.FindString("attr:public_name", i, &publicName) == B_OK) {
|
|
||||||
const char* name;
|
|
||||||
if (attributes.FindString("attr:name", i, &name) != B_OK)
|
|
||||||
name = "-";
|
|
||||||
|
|
||||||
type_code type;
|
|
||||||
if (attributes.FindInt32("attr:type", i, (int32 *)&type) != B_OK)
|
|
||||||
type = B_STRING_TYPE;
|
|
||||||
|
|
||||||
bool editable;
|
|
||||||
if (attributes.FindBool("attr:editable", i, &editable) != B_OK)
|
|
||||||
editable = false;
|
|
||||||
bool visible;
|
|
||||||
if (attributes.FindBool("attr:viewable", i, &visible) != B_OK)
|
|
||||||
visible = false;
|
|
||||||
bool extra;
|
|
||||||
if (attributes.FindBool("attr:extra", i, &extra) != B_OK)
|
|
||||||
extra = false;
|
|
||||||
|
|
||||||
int32 alignment;
|
|
||||||
if (attributes.FindInt32("attr:alignment", i, &alignment) != B_OK)
|
|
||||||
alignment = B_ALIGN_LEFT;
|
|
||||||
|
|
||||||
int32 width;
|
|
||||||
if (attributes.FindInt32("attr:width", i, &width) != B_OK)
|
|
||||||
width = 50;
|
|
||||||
|
|
||||||
AddItem(new AttributeItem(name, publicName, type, alignment, width,
|
|
||||||
visible, editable));
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
AttributeListView::Draw(BRect updateRect)
|
|
||||||
{
|
|
||||||
BListView::Draw(updateRect);
|
|
||||||
|
|
||||||
SetHighColor(tint_color(ViewColor(), B_DARKEN_1_TINT));
|
|
||||||
|
|
||||||
float middle = Bounds().Width() / 2.0f;
|
|
||||||
StrokeLine(BPoint(middle, 0.0f), BPoint(middle, Bounds().bottom));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
FileTypesWindow::FileTypesWindow(BRect frame)
|
FileTypesWindow::FileTypesWindow(BRect frame)
|
||||||
: BWindow(frame, "FileTypes", B_TITLED_WINDOW,
|
: BWindow(frame, "FileTypes", B_TITLED_WINDOW,
|
||||||
B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS),
|
B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS),
|
||||||
@@ -1282,12 +1062,32 @@ FileTypesWindow::MessageReceived(BMessage* message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case kMsgAttributeInvoked:
|
case kMsgAttributeInvoked:
|
||||||
puts("attr");
|
{
|
||||||
|
if (fCurrentType.Type() == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
int32 index;
|
||||||
|
if (message->FindInt32("index", &index) == B_OK) {
|
||||||
|
AttributeItem* item = (AttributeItem*)fAttributeListView->ItemAt(index);
|
||||||
|
if (item == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
BWindow* window = new AttributeWindow(this, fCurrentType,
|
||||||
|
item);
|
||||||
|
window->Show();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case kMsgAddAttribute:
|
case kMsgAddAttribute:
|
||||||
puts("add attr");
|
{
|
||||||
|
if (fCurrentType.Type() == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
BWindow* window = new AttributeWindow(this, fCurrentType, NULL);
|
||||||
|
window->Show();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case kMsgRemoveAttribute:
|
case kMsgRemoveAttribute:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ Preference FileTypes :
|
|||||||
FileTypes.cpp
|
FileTypes.cpp
|
||||||
FileTypesWindow.cpp
|
FileTypesWindow.cpp
|
||||||
ApplicationTypesWindow.cpp
|
ApplicationTypesWindow.cpp
|
||||||
|
AttributeListView.cpp
|
||||||
MimeTypeListView.cpp
|
MimeTypeListView.cpp
|
||||||
NewFileTypeWindow.cpp
|
NewFileTypeWindow.cpp
|
||||||
|
AttributeWindow.cpp
|
||||||
ExtensionWindow.cpp
|
ExtensionWindow.cpp
|
||||||
StringView.cpp
|
StringView.cpp
|
||||||
: be tracker
|
: be tracker
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
#include "StringView.h"
|
#include "StringView.h"
|
||||||
|
|
||||||
//#include <Region.h>
|
|
||||||
|
|
||||||
|
|
||||||
StringView::StringView(BRect frame, const char* name, const char* label,
|
StringView::StringView(BRect frame, const char* name, const char* label,
|
||||||
const char* text, uint32 resizeMask, uint32 flags)
|
const char* text, uint32 resizeMask, uint32 flags)
|
||||||
@@ -84,7 +82,13 @@ StringView::Draw(BRect updateRect)
|
|||||||
float y = ceilf(fontHeight.ascent) + 1.0f;
|
float y = ceilf(fontHeight.ascent) + 1.0f;
|
||||||
float x;
|
float x;
|
||||||
|
|
||||||
SetHighColor(IsEnabled() ? ui_color(B_CONTROL_TEXT_COLOR)
|
#if defined(HAIKU_TARGET_PLATFORM_BEOS) || defined(HAIKU_TARGET_PLATFORM_BONE)
|
||||||
|
rgb_color textColor = {0, 0, 0, 255};
|
||||||
|
#else
|
||||||
|
rgb_color textColor = ui_color(B_CONTROL_TEXT_COLOR);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SetHighColor(IsEnabled() ? textColor
|
||||||
: tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DISABLED_LABEL_TINT));
|
: tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DISABLED_LABEL_TINT));
|
||||||
|
|
||||||
if (Label()) {
|
if (Label()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user