WIP: Yet more style fixes, mostly 80 char violations.
This commit is contained in:
parent
0d47dc5dd2
commit
a51764c53e
@ -156,8 +156,8 @@ AttributeStreamNode::Contains(const char* name, uint32 type)
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamNode::Read(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
AttributeStreamNode::Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
{
|
||||
if (!fReadFrom)
|
||||
return 0;
|
||||
@ -288,8 +288,8 @@ AttributeStreamFileNode::Contains(const char* name, uint32 type)
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamFileNode::Read(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
AttributeStreamFileNode::Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
{
|
||||
if (name && fNode->ReadAttr(name, type, 0, buffer, (size_t)size) == size)
|
||||
return size;
|
||||
@ -306,8 +306,8 @@ AttributeStreamFileNode::Read(const char* name, const char* foreignName, uint32
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamFileNode::Write(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, const void* buffer)
|
||||
AttributeStreamFileNode::Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer)
|
||||
{
|
||||
ASSERT(fNode);
|
||||
ASSERT(dynamic_cast<BNode*>(fNode));
|
||||
@ -659,8 +659,8 @@ AttributeStreamFilterNode::Contains(const char* name, uint32 type)
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamFilterNode::Read(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
AttributeStreamFilterNode::Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*))
|
||||
{
|
||||
if (!fReadFrom)
|
||||
return 0;
|
||||
@ -673,8 +673,8 @@ AttributeStreamFilterNode::Read(const char* name, const char* foreignName, uint3
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamFilterNode::Write(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, const void* buffer)
|
||||
AttributeStreamFilterNode::Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer)
|
||||
{
|
||||
if (!fWriteTo)
|
||||
return 0;
|
||||
@ -693,7 +693,7 @@ NamesToAcceptAttrFilter::NamesToAcceptAttrFilter(const char** nameList)
|
||||
|
||||
|
||||
bool
|
||||
NamesToAcceptAttrFilter::Reject(const char* name, uint32 , off_t )
|
||||
NamesToAcceptAttrFilter::Reject(const char* name, uint32, off_t)
|
||||
{
|
||||
for (int32 index = 0; ;index++) {
|
||||
if (!fNameList[index])
|
||||
|
@ -114,11 +114,11 @@ public:
|
||||
virtual off_t Contains(const char*, uint32);
|
||||
// returns size of attribute if found
|
||||
|
||||
virtual off_t Read(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
|
||||
// read from this node
|
||||
virtual off_t Write(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
const void* buffer);
|
||||
virtual off_t Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer);
|
||||
// write to this node
|
||||
|
||||
// work calls
|
||||
@ -307,22 +307,25 @@ private:
|
||||
class SelectiveAttributeTransformer : public AttributeStreamNode {
|
||||
// node applies a transformation on specified attributes
|
||||
public:
|
||||
SelectiveAttributeTransformer(const char* attributeName, bool (*)(const char*,
|
||||
uint32 , off_t , void*, void*), void* params);
|
||||
SelectiveAttributeTransformer(const char* attributeName,
|
||||
bool (*)(const char*, uint32 , off_t , void*, void*), void* params);
|
||||
virtual ~SelectiveAttributeTransformer();
|
||||
|
||||
virtual off_t Read(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Read(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, void* buffer, void (*swapFunc)(void*) = 0);
|
||||
|
||||
virtual void Rewind();
|
||||
|
||||
protected:
|
||||
virtual bool WillTransform(const char* name, uint32 type, off_t size, const char* data) const;
|
||||
virtual bool WillTransform(const char* name, uint32 type, off_t size,
|
||||
const char* data) const;
|
||||
// override to implement filtering; should only return true if transformation will
|
||||
// occur
|
||||
virtual char* CopyAndApplyTransformer(const char* name, uint32 type, off_t size, const char* data);
|
||||
virtual char* CopyAndApplyTransformer(const char* name, uint32 type,
|
||||
off_t size, const char* data);
|
||||
// makes a copy of data
|
||||
virtual bool ApplyTransformer(const char* name, uint32 type, off_t size, char* data);
|
||||
virtual bool ApplyTransformer(const char* name, uint32 type, off_t size,
|
||||
char* data);
|
||||
// transforms in place
|
||||
virtual const AttributeInfo* Next();
|
||||
virtual const char* Get();
|
||||
@ -342,7 +345,8 @@ private:
|
||||
template <class Type>
|
||||
class AttributeStreamConstValue : public AttributeStreamNode {
|
||||
public:
|
||||
AttributeStreamConstValue(const char* name, uint32 attributeType, Type value);
|
||||
AttributeStreamConstValue(const char* name, uint32 attributeType,
|
||||
Type value);
|
||||
|
||||
protected:
|
||||
virtual bool CanFeed() const { return true; }
|
||||
|
@ -31,10 +31,10 @@ of Be Incorporated in the United States and other countries. Other brand product
|
||||
names are registered trademarks or trademarks of their respective holders.
|
||||
All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _TRACKER_BACKGROUND_H
|
||||
#define _TRACKER_BACKGROUND_H
|
||||
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
@ -45,12 +45,18 @@ All rights reserved.
|
||||
/*----------------------------------------------------------------*/
|
||||
/*----- Tracker background BMessage entries --------------------*/
|
||||
|
||||
#define B_BACKGROUND_IMAGE "be:bgndimginfopath" // string path
|
||||
#define B_BACKGROUND_MODE "be:bgndimginfomode" // int32, the enum below
|
||||
#define B_BACKGROUND_ORIGIN "be:bgndimginfooffset" // BPoint
|
||||
#define B_BACKGROUND_TEXT_OUTLINE "be:bgndimginfoerasetext" // bool
|
||||
// NOTE: the actual attribute name is kept for backwards compatible settings
|
||||
#define B_BACKGROUND_WORKSPACES "be:bgndimginfoworkspaces" // uint32
|
||||
#define B_BACKGROUND_IMAGE "be:bgndimginfopath"
|
||||
// string path
|
||||
#define B_BACKGROUND_MODE "be:bgndimginfomode"
|
||||
// int32, the enum below
|
||||
#define B_BACKGROUND_ORIGIN "be:bgndimginfooffset"
|
||||
// BPoint
|
||||
#define B_BACKGROUND_TEXT_OUTLINE "be:bgndimginfoerasetext"
|
||||
// bool
|
||||
// NOTE: the actual attribute name is kept for backwards
|
||||
// compatible settings
|
||||
#define B_BACKGROUND_WORKSPACES "be:bgndimginfoworkspaces"
|
||||
// uint32
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
/*----- Background mode values ---------------------------------*/
|
||||
@ -65,7 +71,7 @@ enum {
|
||||
/*----------------------------------------------------------------*/
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
const int32 B_RESTORE_BACKGROUND_IMAGE = 'Tbgr'; // force a Tracker window to
|
||||
// use a new background image
|
||||
const int32 B_RESTORE_BACKGROUND_IMAGE = 'Tbgr';
|
||||
// force a Tracker window to use a new background image
|
||||
|
||||
#endif // _TRACKER_BACKGROUND_H
|
||||
|
@ -71,7 +71,7 @@ BackgroundImage::GetBackgroundImage(const BNode* node, bool isDesktop)
|
||||
return NULL;
|
||||
|
||||
BMessage container;
|
||||
char* buffer = new char [info.size];
|
||||
char* buffer = new char[info.size];
|
||||
|
||||
status_t error = node->ReadAttr(kBackgroundImageInfo, info.type, 0, buffer, (size_t)info.size);
|
||||
if (error == info.size)
|
||||
@ -104,14 +104,16 @@ BackgroundImage::GetBackgroundImage(const BNode* node, bool isDesktop)
|
||||
be_control_look->SetBackgroundInfo(container);
|
||||
}
|
||||
|
||||
container.FindInt32(kBackgroundImageInfoWorkspaces, index, (int32*)&workspaces);
|
||||
container.FindInt32(kBackgroundImageInfoWorkspaces, index,
|
||||
(int32*)&workspaces);
|
||||
container.FindInt32(kBackgroundImageInfoMode, index, (int32*)&mode);
|
||||
container.FindBool(kBackgroundImageInfoTextOutline, index, &textWidgetLabelOutline);
|
||||
container.FindBool(kBackgroundImageInfoTextOutline, index,
|
||||
&textWidgetLabelOutline);
|
||||
container.FindPoint(kBackgroundImageInfoOffset, index, &offset);
|
||||
|
||||
BackgroundImage::BackgroundImageInfo* imageInfo = new
|
||||
BackgroundImage::BackgroundImageInfo(workspaces, bitmap, mode, offset,
|
||||
textWidgetLabelOutline);
|
||||
BackgroundImage::BackgroundImageInfo(workspaces, bitmap, mode,
|
||||
offset, textWidgetLabelOutline);
|
||||
|
||||
if (!result)
|
||||
result = new BackgroundImage(node, isDesktop);
|
||||
|
@ -104,7 +104,8 @@ BImageResources::FinishResources(BResources* res) const
|
||||
|
||||
|
||||
const void*
|
||||
BImageResources::LoadResource(type_code type, int32 id, size_t* out_size) const
|
||||
BImageResources::LoadResource(type_code type, int32 id,
|
||||
size_t* out_size) const
|
||||
{
|
||||
// Serialize execution.
|
||||
// Looks like BResources is not really thread safe. We should
|
||||
@ -116,12 +117,14 @@ BImageResources::LoadResource(type_code type, int32 id, size_t* out_size) const
|
||||
// Return the resource. Because we never change the BResources
|
||||
// object, the returned data will not change until TTracker is
|
||||
// destroyed.
|
||||
return const_cast<BResources*>(&fResources)->LoadResource(type, id, out_size);
|
||||
return const_cast<BResources*>(&fResources)->LoadResource(type, id,
|
||||
out_size);
|
||||
}
|
||||
|
||||
|
||||
const void*
|
||||
BImageResources::LoadResource(type_code type, const char* name, size_t* out_size) const
|
||||
BImageResources::LoadResource(type_code type, const char* name,
|
||||
size_t* out_size) const
|
||||
{
|
||||
// Serialize execution.
|
||||
BAutolock lock(fLock);
|
||||
@ -131,12 +134,14 @@ BImageResources::LoadResource(type_code type, const char* name, size_t* out_size
|
||||
// Return the resource. Because we never change the BResources
|
||||
// object, the returned data will not change until TTracker is
|
||||
// destroyed.
|
||||
return const_cast<BResources*>(&fResources)->LoadResource(type, name, out_size);
|
||||
return const_cast<BResources*>(&fResources)->LoadResource(type, name,
|
||||
out_size);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BImageResources::GetIconResource(int32 id, icon_size size, BBitmap* dest) const
|
||||
BImageResources::GetIconResource(int32 id, icon_size size,
|
||||
BBitmap* dest) const
|
||||
{
|
||||
size_t length = 0;
|
||||
const void* data;
|
||||
@ -144,8 +149,10 @@ BImageResources::GetIconResource(int32 id, icon_size size, BBitmap* dest) const
|
||||
#ifdef __HAIKU__
|
||||
// try to load vector icon
|
||||
data = LoadResource(B_VECTOR_ICON_TYPE, id, &length);
|
||||
if (data != NULL && BIconUtils::GetVectorIcon((uint8*)data, length, dest) == B_OK)
|
||||
if (data != NULL
|
||||
&& BIconUtils::GetVectorIcon((uint8*)data, length, dest) == B_OK) {
|
||||
return B_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
// fall back to R5 icon
|
||||
@ -155,7 +162,8 @@ BImageResources::GetIconResource(int32 id, icon_size size, BBitmap* dest) const
|
||||
length = 0;
|
||||
data = LoadResource(size == B_LARGE_ICON ? 'ICON' : 'MICN', id, &length);
|
||||
|
||||
if (data == NULL || length != (size_t)(size == B_LARGE_ICON ? 1024 : 256)) {
|
||||
if (data == NULL
|
||||
|| length != (size_t)(size == B_LARGE_ICON ? 1024 : 256)) {
|
||||
TRESPASS();
|
||||
return B_ERROR;
|
||||
}
|
||||
@ -212,7 +220,8 @@ BImageResources::find_image(void* memAddr) const
|
||||
|
||||
|
||||
status_t
|
||||
BImageResources::GetBitmapResource(type_code type, int32 id, BBitmap** out) const
|
||||
BImageResources::GetBitmapResource(type_code type, int32 id,
|
||||
BBitmap** out) const
|
||||
{
|
||||
*out = NULL;
|
||||
|
||||
|
@ -110,12 +110,14 @@ namespace BPrivate {
|
||||
|
||||
class DraggableContainerIcon : public BView {
|
||||
public:
|
||||
DraggableContainerIcon(BRect rect, const char* name, uint32 resizeMask);
|
||||
DraggableContainerIcon(BRect rect, const char* name,
|
||||
uint32 resizeMask);
|
||||
|
||||
virtual void AttachedToWindow();
|
||||
virtual void MouseDown(BPoint where);
|
||||
virtual void MouseUp(BPoint where);
|
||||
virtual void MouseMoved(BPoint point, uint32 /*transit*/, const BMessage* message);
|
||||
virtual void MouseMoved(BPoint point, uint32 /*transit*/,
|
||||
const BMessage* message);
|
||||
virtual void FrameMoved(BPoint newLocation);
|
||||
virtual void Draw(BRect updateRect);
|
||||
|
||||
@ -215,7 +217,8 @@ CompareLabels(const BMenuItem* item1, const BMenuItem* item2)
|
||||
|
||||
|
||||
static bool
|
||||
AddOneAddon(const Model* model, const char* name, uint32 shortcut, bool primary, void* context)
|
||||
AddOneAddon(const Model* model, const char* name, uint32 shortcut,
|
||||
bool primary, void* context)
|
||||
{
|
||||
AddOneAddonParams* params = (AddOneAddonParams*)context;
|
||||
|
||||
@ -249,14 +252,16 @@ AddOnThread(BMessage* refsMessage, entry_ref addonRef, entry_ref dirRef)
|
||||
image_id addonImage = load_add_on(path.Path());
|
||||
if (addonImage >= 0) {
|
||||
void (*processRefs)(entry_ref, BMessage*, void*);
|
||||
result = get_image_symbol(addonImage, "process_refs", 2, (void**)&processRefs);
|
||||
result = get_image_symbol(addonImage, "process_refs", 2,
|
||||
(void**)&processRefs);
|
||||
|
||||
#ifndef __INTEL__
|
||||
if (result < 0) {
|
||||
PRINT(("trying old legacy ppc signature\n"));
|
||||
// try old-style addon signature
|
||||
result = get_image_symbol(addonImage,
|
||||
"process_refs__F9entry_refP8BMessagePv", 2, (void**)&processRefs);
|
||||
"process_refs__F9entry_refP8BMessagePv", 2,
|
||||
(void**)&processRefs);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -279,8 +284,8 @@ AddOnThread(BMessage* refsMessage, entry_ref addonRef, entry_ref dirRef)
|
||||
buffer.ReplaceFirst("%error", strerror(result));
|
||||
buffer.ReplaceFirst("%name", addonRef.name);
|
||||
|
||||
BAlert* alert = new BAlert("", buffer.String(), B_TRANSLATE("Cancel"), 0, 0,
|
||||
B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
BAlert* alert = new BAlert("", buffer.String(), B_TRANSLATE("Cancel"),
|
||||
0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
|
||||
@ -946,10 +951,12 @@ BContainerWindow::Init(const BMessage* message)
|
||||
float iconSize = fMenuBar->Bounds().Height() - 2;
|
||||
if (iconSize < 16)
|
||||
iconSize = 16;
|
||||
float iconPosY = 1 + (fMenuBar->Bounds().Height() - 2 - iconSize) / 2;
|
||||
BView* icon = new DraggableContainerIcon(BRect(Bounds().Width() - 4 - iconSize + 1,
|
||||
iconPosY, Bounds().Width() - 4, iconPosY + iconSize - 1),
|
||||
"ThisContainer", B_FOLLOW_RIGHT);
|
||||
float iconPosY = 1 + (fMenuBar->Bounds().Height() - 2
|
||||
- iconSize) / 2;
|
||||
BView* icon = new DraggableContainerIcon(BRect(Bounds().Width()
|
||||
- 4 - iconSize + 1, iconPosY, Bounds().Width() - 4,
|
||||
iconPosY + iconSize - 1), "ThisContainer",
|
||||
B_FOLLOW_RIGHT);
|
||||
fMenuBar->AddChild(icon);
|
||||
}
|
||||
} else {
|
||||
@ -958,11 +965,12 @@ BContainerWindow::Init(const BMessage* message)
|
||||
}
|
||||
|
||||
AddContextMenus();
|
||||
AddShortcut('T', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kDelete), PoseView());
|
||||
AddShortcut('T', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kDelete),
|
||||
PoseView());
|
||||
AddShortcut('K', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kCleanupAll),
|
||||
PoseView());
|
||||
AddShortcut('Q', B_COMMAND_KEY | B_OPTION_KEY | B_SHIFT_KEY | B_CONTROL_KEY,
|
||||
new BMessage(kQuitTracker));
|
||||
AddShortcut('Q', B_COMMAND_KEY | B_OPTION_KEY | B_SHIFT_KEY
|
||||
| B_CONTROL_KEY, new BMessage(kQuitTracker));
|
||||
|
||||
AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY, new BMessage(kOpenSelection),
|
||||
PoseView());
|
||||
@ -971,9 +979,12 @@ BContainerWindow::Init(const BMessage* message)
|
||||
|
||||
#if DEBUG
|
||||
// add some debugging shortcuts
|
||||
AddShortcut('D', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dbug'), PoseView());
|
||||
AddShortcut('C', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dpcc'), PoseView());
|
||||
AddShortcut('F', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dpfl'), PoseView());
|
||||
AddShortcut('D', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dbug'),
|
||||
PoseView());
|
||||
AddShortcut('C', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dpcc'),
|
||||
PoseView());
|
||||
AddShortcut('F', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage('dpfl'),
|
||||
PoseView());
|
||||
AddShortcut('F', B_COMMAND_KEY | B_CONTROL_KEY | B_OPTION_KEY,
|
||||
new BMessage('dpfL'), PoseView());
|
||||
#endif
|
||||
@ -1007,7 +1018,8 @@ BContainerWindow::Init(const BMessage* message)
|
||||
void
|
||||
BContainerWindow::RestoreState()
|
||||
{
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000, kContainerWindowHeightLimit, 10000);
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000,
|
||||
kContainerWindowHeightLimit, 10000);
|
||||
|
||||
UpdateTitle();
|
||||
|
||||
@ -1022,7 +1034,8 @@ BContainerWindow::RestoreState()
|
||||
void
|
||||
BContainerWindow::RestoreState(const BMessage &message)
|
||||
{
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000, kContainerWindowHeightLimit, 10000);
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000,
|
||||
kContainerWindowHeightLimit, 10000);
|
||||
|
||||
UpdateTitle();
|
||||
|
||||
@ -1057,7 +1070,8 @@ BContainerWindow::RestoreStateCommon()
|
||||
if (!fBackgroundImage && !isDesktop
|
||||
&& DefaultStateSourceNode(kDefaultFolderTemplate, &defaultingNode))
|
||||
// look for background image info in the source for defaults
|
||||
fBackgroundImage = BackgroundImage::GetBackgroundImage(&defaultingNode, isDesktop);
|
||||
fBackgroundImage
|
||||
= BackgroundImage::GetBackgroundImage(&defaultingNode, isDesktop);
|
||||
}
|
||||
|
||||
|
||||
@ -1075,7 +1089,8 @@ BContainerWindow::UpdateTitle()
|
||||
SetTitle(TargetModel()->Name());
|
||||
|
||||
if (Navigator())
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(), kActionUpdatePath);
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(),
|
||||
kActionUpdatePath);
|
||||
}
|
||||
|
||||
|
||||
@ -1121,7 +1136,8 @@ BContainerWindow::FrameResized(float, float)
|
||||
if (offsetY < 0 && PoseView()->Bounds().bottom > extent.bottom
|
||||
&& Bounds().Height() > fPreviousBounds.Height())
|
||||
scroll.y
|
||||
= max_c(fPreviousBounds.Height() - Bounds().Height(), offsetY);
|
||||
= max_c(fPreviousBounds.Height() - Bounds().Height(),
|
||||
offsetY);
|
||||
|
||||
if (scroll != B_ORIGIN)
|
||||
PoseView()->ScrollBy(scroll.x, scroll.y);
|
||||
@ -1154,7 +1170,8 @@ BContainerWindow::ViewModeChanged(uint32 oldMode, uint32 newMode)
|
||||
{
|
||||
BView* view = FindView("MenuBar");
|
||||
if (view != NULL) {
|
||||
// make sure the draggable icon hides if it doesn't have space left anymore
|
||||
// make sure the draggable icon hides if it doesn't
|
||||
// have space left anymore
|
||||
view = view->FindView("ThisContainer");
|
||||
if (view != NULL)
|
||||
view->FrameMoved(view->Frame().LeftTop());
|
||||
@ -1248,8 +1265,10 @@ BContainerWindow::GetLayoutState(BNode* node, BMessage* message)
|
||||
continue;
|
||||
|
||||
char* buffer = new char[info.size];
|
||||
if (node->ReadAttr(attrName, info.type, 0, buffer, (size_t)info.size) == info.size)
|
||||
if (node->ReadAttr(attrName, info.type, 0, buffer,
|
||||
(size_t)info.size) == info.size) {
|
||||
message->AddData(attrName, info.type, buffer, (ssize_t)info.size);
|
||||
}
|
||||
delete [] buffer;
|
||||
}
|
||||
return B_OK;
|
||||
|
@ -241,7 +241,8 @@ DesktopPoseView::AdaptToVolumeChange(BMessage* message)
|
||||
entryMessage.AddInt32("opcode", B_ENTRY_REMOVED);
|
||||
entry_ref ref;
|
||||
if (entry.GetRef(&ref) == B_OK) {
|
||||
BContainerWindow* disksWindow = tracker->FindContainerWindow(&ref);
|
||||
BContainerWindow* disksWindow
|
||||
= tracker->FindContainerWindow(&ref);
|
||||
if (disksWindow) {
|
||||
disksWindow->Lock();
|
||||
disksWindow->Close();
|
||||
@ -252,7 +253,8 @@ DesktopPoseView::AdaptToVolumeChange(BMessage* message)
|
||||
entryMessage.AddInt64("node", model.NodeRef()->node);
|
||||
entryMessage.AddInt64("directory", model.EntryRef()->directory);
|
||||
entryMessage.AddString("name", model.EntryRef()->name);
|
||||
BContainerWindow* deskWindow = dynamic_cast<BContainerWindow*>(Window());
|
||||
BContainerWindow* deskWindow
|
||||
= dynamic_cast<BContainerWindow*>(Window());
|
||||
if (deskWindow)
|
||||
deskWindow->PostMessage(&entryMessage, deskWindow->PoseView());
|
||||
}
|
||||
|
@ -195,8 +195,8 @@ FSClipboardClear()
|
||||
*/
|
||||
|
||||
uint32
|
||||
FSClipboardAddPoses(const node_ref* directory, PoseList* list, uint32 moveMode,
|
||||
bool clearClipboard)
|
||||
FSClipboardAddPoses(const node_ref* directory, PoseList* list,
|
||||
uint32 moveMode, bool clearClipboard)
|
||||
{
|
||||
uint32 refsAdded = 0;
|
||||
int32 listCount = list->CountItems();
|
||||
@ -409,13 +409,16 @@ FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
|
||||
// we need this data later on
|
||||
MakeModeNameFromRefName(modeName, refName);
|
||||
if (!linksMode && clip->FindInt32(modeName, (int32*)&moveMode) != B_OK)
|
||||
if (!linksMode && clip->FindInt32(modeName, (int32*)&moveMode)
|
||||
!= B_OK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
BEntry entry(&ref);
|
||||
|
||||
uint32 newMoveMode = 0;
|
||||
bool sameDirectory = destNodeRef->device == ref.device && destNodeRef->node == ref.directory;
|
||||
bool sameDirectory = destNodeRef->device == ref.device
|
||||
&& destNodeRef->node == ref.directory;
|
||||
|
||||
if (!entry.Exists()) {
|
||||
// The entry doesn't exist anymore, so we'll remove
|
||||
@ -435,9 +438,10 @@ FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
copyList->AddItem(new entry_ref(ref));
|
||||
}
|
||||
|
||||
// if the entry should have been removed from its directory,
|
||||
// we want to copy that entry next time, no matter if the
|
||||
// items don't have to be moved at all (source == target)
|
||||
// if the entry should have been removed from its
|
||||
// directory, we want to copy that entry next time, no
|
||||
// matter if the items don't have to be moved at all
|
||||
// (source == target)
|
||||
if (moveMode == kMoveSelectionTo)
|
||||
newMoveMode = kCopySelectionTo;
|
||||
}
|
||||
@ -449,8 +453,8 @@ FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
TClipboardNodeRef clipNode;
|
||||
MakeNodeFromName(&clipNode.node, modeName);
|
||||
clipNode.moveMode = kDelete;
|
||||
updateMessage->AddData("tcnode", T_CLIPBOARD_NODE, &clipNode,
|
||||
sizeof(TClipboardNodeRef), true);
|
||||
updateMessage->AddData("tcnode", T_CLIPBOARD_NODE,
|
||||
&clipNode, sizeof(TClipboardNodeRef), true);
|
||||
}
|
||||
}
|
||||
be_clipboard->Commit();
|
||||
@ -470,7 +474,7 @@ FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
if (model->IsRoot()) {
|
||||
BAlert* alert = new BAlert("",
|
||||
B_TRANSLATE("You must drop items on one of the disk icons "
|
||||
"in the \"Disks\" window."), B_TRANSLATE("Cancel"), NULL, NULL,
|
||||
"in the \"Disks\" window."), B_TRANSLATE("Cancel"), NULL, NULL,
|
||||
B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
@ -499,9 +503,10 @@ FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
}
|
||||
|
||||
// asynchronous calls take over ownership of the objects passed to it
|
||||
if (moveList->CountItems() > 0)
|
||||
FSMoveToFolder(moveList, new BEntry(entry), linksMode ? linksMode : kMoveSelectionTo);
|
||||
else
|
||||
if (moveList->CountItems() > 0) {
|
||||
FSMoveToFolder(moveList, new BEntry(entry),
|
||||
linksMode ? linksMode : kMoveSelectionTo);
|
||||
} else
|
||||
delete moveList;
|
||||
|
||||
if (copyList->CountItems() > 0)
|
||||
@ -761,7 +766,8 @@ BClipboardRefsWatcher::Clear()
|
||||
|
||||
|
||||
//void
|
||||
//BClipboardRefsWatcher::UpdatePoseViews(bool clearClipboard, const node_ref* node)
|
||||
//BClipboardRefsWatcher::UpdatePoseViews(bool clearClipboard,
|
||||
// const node_ref* node)
|
||||
//{
|
||||
// BMessage message(kFSClipboardChanges);
|
||||
// message.AddInt32("device", node->device);
|
||||
|
@ -67,7 +67,7 @@ class BClipboardRefsWatcher : public BLooper {
|
||||
void UpdatePoseViews(BMessage* reportMessage);
|
||||
|
||||
protected:
|
||||
virtual void MessageReceived(BMessage*);
|
||||
virtual void MessageReceived(BMessage*);
|
||||
|
||||
private:
|
||||
bool fRefsInClipboard;
|
||||
@ -87,10 +87,12 @@ void FSClipboardStartWatch(BMessenger target);
|
||||
void FSClipboardStopWatch(BMessenger target);
|
||||
|
||||
void FSClipboardClear();
|
||||
uint32 FSClipboardAddPoses(const node_ref* directory, PoseList* list, uint32 moveMode, bool clearClipboard);
|
||||
uint32 FSClipboardAddPoses(const node_ref* directory, PoseList* list,
|
||||
uint32 moveMode, bool clearClipboard);
|
||||
uint32 FSClipboardRemovePoses(const node_ref* directory, PoseList* list);
|
||||
bool FSClipboardPaste(Model* model, uint32 linksMode = 0);
|
||||
void FSClipboardRemove(Model* model);
|
||||
uint32 FSClipboardFindNodeMode(Model* model, bool autoLock, bool updateRefIfNeeded);
|
||||
uint32 FSClipboardFindNodeMode(Model* model, bool autoLock,
|
||||
bool updateRefIfNeeded);
|
||||
|
||||
#endif // FS_CLIPBOARD_H
|
||||
|
@ -50,7 +50,8 @@ class UndoItemMove : public UndoItem {
|
||||
/** source - list of file(s) that were moved. Assumes ownership.
|
||||
* origfolder - location it was moved from
|
||||
*/
|
||||
UndoItemMove(BObjectList<entry_ref>* sourceList, BDirectory &target, BList* pointList);
|
||||
UndoItemMove(BObjectList<entry_ref>* sourceList, BDirectory &target,
|
||||
BList* pointList);
|
||||
virtual ~UndoItemMove();
|
||||
|
||||
virtual status_t Undo();
|
||||
@ -72,10 +73,12 @@ class UndoItemFolder : public UndoItem {
|
||||
virtual status_t Redo();
|
||||
|
||||
private:
|
||||
/* this ref has two different meanings in the different states of this object:
|
||||
- Undo() - fRef indicates the folder that was created via FSCreateNewFolderIn(...)
|
||||
- Redo() - fRef indicates the folder in which FSCreateNewFolderIn() should be performed
|
||||
*/
|
||||
// this ref has two different meanings in the different states of
|
||||
// this object:
|
||||
// - Undo() - fRef indicates the folder that was created via
|
||||
// FSCreateNewFolderIn(...)
|
||||
// - Redo() - fRef indicates the folder in which
|
||||
// FSCreateNewFolderIn() should be performed
|
||||
entry_ref fRef;
|
||||
};
|
||||
|
||||
@ -169,8 +172,8 @@ Undo::Remove()
|
||||
}
|
||||
|
||||
|
||||
MoveCopyUndo::MoveCopyUndo(BObjectList<entry_ref>* sourceList, BDirectory &dest,
|
||||
BList* pointList, uint32 moveMode)
|
||||
MoveCopyUndo::MoveCopyUndo(BObjectList<entry_ref>* sourceList,
|
||||
BDirectory &dest, BList* pointList, uint32 moveMode)
|
||||
{
|
||||
if (moveMode == kMoveSelectionTo)
|
||||
fUndo = new UndoItemMove(sourceList, dest, pointList);
|
||||
@ -200,8 +203,8 @@ RenameVolumeUndo::RenameVolumeUndo(BVolume &volume, const char* newName)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
UndoItemCopy::UndoItemCopy(BObjectList<entry_ref>* sourceList, BDirectory &target,
|
||||
BList* /*pointList*/, uint32 moveMode)
|
||||
UndoItemCopy::UndoItemCopy(BObjectList<entry_ref>* sourceList,
|
||||
BDirectory &target, BList* /*pointList*/, uint32 moveMode)
|
||||
:
|
||||
fSourceList(*sourceList),
|
||||
fTargetList(*sourceList),
|
||||
@ -264,8 +267,8 @@ UndoItemCopy::UpdateEntry(BEntry* entry, const char* name)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
UndoItemMove::UndoItemMove(BObjectList<entry_ref>* sourceList, BDirectory &target,
|
||||
BList* /*pointList*/)
|
||||
UndoItemMove::UndoItemMove(BObjectList<entry_ref>* sourceList,
|
||||
BDirectory &target, BList* /*pointList*/)
|
||||
:
|
||||
fSourceList(*sourceList)
|
||||
{
|
||||
@ -293,7 +296,8 @@ UndoItemMove::Undo()
|
||||
ChangeListSource(*list, entry);
|
||||
|
||||
// FSMoveToFolder() owns its arguments
|
||||
FSMoveToFolder(list, new BEntry(&fSourceRef), FSUndoMoveMode(kMoveSelectionTo), NULL);
|
||||
FSMoveToFolder(list, new BEntry(&fSourceRef),
|
||||
FSUndoMoveMode(kMoveSelectionTo), NULL);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
@ -303,8 +307,8 @@ status_t
|
||||
UndoItemMove::Redo()
|
||||
{
|
||||
// FSMoveToFolder() owns its arguments
|
||||
FSMoveToFolder(new BObjectList<entry_ref>(fSourceList), new BEntry(&fTargetRef),
|
||||
FSUndoMoveMode(kMoveSelectionTo), NULL);
|
||||
FSMoveToFolder(new BObjectList<entry_ref>(fSourceList),
|
||||
new BEntry(&fTargetRef), FSUndoMoveMode(kMoveSelectionTo), NULL);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
@ -46,8 +46,8 @@ All rights reserved.
|
||||
#include "ObjectList.h"
|
||||
|
||||
|
||||
// Note - APIs/code in FSUtils.h and FSUtils.cpp is slated for a major cleanup
|
||||
// -- in other words, you will find a lot of ugly cruft in here
|
||||
// APIs/code in FSUtils.h and FSUtils.cpp is slated for a major cleanup
|
||||
// -- in other words, you will find a lot of ugly cruft in here
|
||||
|
||||
class BDirectory;
|
||||
class BEntry;
|
||||
@ -165,36 +165,39 @@ private:
|
||||
#endif
|
||||
_IMPEXP_TRACKER status_t FSCopyAttributesAndStats(BNode*, BNode*);
|
||||
|
||||
_IMPEXP_TRACKER void FSDuplicate(BObjectList<entry_ref>* srcList, BList* pointList);
|
||||
_IMPEXP_TRACKER void FSMoveToFolder(BObjectList<entry_ref>* srcList, BEntry*, uint32 moveMode,
|
||||
BList* pointList = NULL);
|
||||
_IMPEXP_TRACKER void FSMakeOriginalName(char* name, BDirectory* destDir, const char* suffix);
|
||||
_IMPEXP_TRACKER void FSDuplicate(BObjectList<entry_ref>* srcList,
|
||||
BList* pointList);
|
||||
_IMPEXP_TRACKER void FSMoveToFolder(BObjectList<entry_ref>* srcList, BEntry*,
|
||||
uint32 moveMode, BList* pointList = NULL);
|
||||
_IMPEXP_TRACKER void FSMakeOriginalName(char* name, BDirectory* destDir,
|
||||
const char* suffix);
|
||||
_IMPEXP_TRACKER bool FSIsTrashDir(const BEntry*);
|
||||
_IMPEXP_TRACKER bool FSIsPrintersDir(const BEntry*);
|
||||
_IMPEXP_TRACKER bool FSIsDeskDir(const BEntry*);
|
||||
_IMPEXP_TRACKER bool FSIsHomeDir(const BEntry*);
|
||||
_IMPEXP_TRACKER bool FSIsRootDir(const BEntry*);
|
||||
_IMPEXP_TRACKER void FSMoveToTrash(BObjectList<entry_ref>* srcList, BList* pointList = NULL,
|
||||
bool async = true);
|
||||
_IMPEXP_TRACKER void FSMoveToTrash(BObjectList<entry_ref>* srcList,
|
||||
BList* pointList = NULL, bool async = true);
|
||||
// Deprecated
|
||||
|
||||
void FSDeleteRefList(BObjectList<entry_ref>*, bool, bool confirm = true);
|
||||
void FSDelete(entry_ref*, bool, bool confirm = true);
|
||||
void FSRestoreRefList(BObjectList<entry_ref>* list, bool async);
|
||||
|
||||
_IMPEXP_TRACKER status_t FSLaunchItem(const entry_ref* application, const BMessage* refsReceived,
|
||||
bool async, bool openWithOK);
|
||||
// Preferred way of launching; only pass an actual application in <application>, not
|
||||
// a document; to open documents with the preferred app, pase 0 in <application> and
|
||||
// stuff all the document refs into <refsReceived>
|
||||
// Consider having silent mode that does not show alerts, just returns error code
|
||||
_IMPEXP_TRACKER status_t FSLaunchItem(const entry_ref* application,
|
||||
const BMessage* refsReceived, bool async, bool openWithOK);
|
||||
// Preferred way of launching; only pass an actual application in
|
||||
// <application>, not a document; to open documents with the preferred
|
||||
// app, pase 0 in <application> and stuff all the document refs into
|
||||
// <refsReceived> Consider having silent mode that does not show alerts,
|
||||
// just returns error code
|
||||
|
||||
_IMPEXP_TRACKER status_t FSOpenWith(BMessage* listOfRefs);
|
||||
// runs the Open With window; pas a list of refs
|
||||
|
||||
_IMPEXP_TRACKER void FSEmptyTrash();
|
||||
_IMPEXP_TRACKER status_t FSCreateNewFolderIn(const node_ref* destDir, entry_ref* newRef,
|
||||
node_ref* new_node);
|
||||
_IMPEXP_TRACKER status_t FSCreateNewFolderIn(const node_ref* destDir,
|
||||
entry_ref* newRef, node_ref* new_node);
|
||||
_IMPEXP_TRACKER void FSCreateTrashDirs();
|
||||
_IMPEXP_TRACKER status_t FSGetTrashDir(BDirectory* trashDir, dev_t volume);
|
||||
_IMPEXP_TRACKER status_t FSGetDeskDir(BDirectory* deskDir);
|
||||
@ -218,23 +221,26 @@ enum ReadAttrResult {
|
||||
kReadAttrForeignOK
|
||||
};
|
||||
|
||||
ReadAttrResult ReadAttr(const BNode*, const char* hostAttrName, const char* foreignAttrName,
|
||||
type_code , off_t , void*, size_t , void (*swapFunc)(void*) = 0,
|
||||
bool isForeign = false);
|
||||
// Endian swapping ReadAttr call; endianness is determined by trying first the
|
||||
// native attribute name, then the foreign one; an endian swapping function can
|
||||
// be passed, if null data won't be swapped; if <isForeign> set the foreign endianness
|
||||
// will be read directly without first trying the native one
|
||||
ReadAttrResult ReadAttr(const BNode*, const char* hostAttrName,
|
||||
const char* foreignAttrName, type_code, off_t, void*, size_t,
|
||||
void (*swapFunc)(void*) = 0, bool isForeign = false);
|
||||
// Endian swapping ReadAttr call; endianness is determined by trying
|
||||
// first the native attribute name, then the foreign one; an endian
|
||||
// swapping function can be passed, if null data won't be swapped;
|
||||
// if <isForeign> set the foreign endianness will be read directly
|
||||
// without first trying the native one
|
||||
|
||||
ReadAttrResult GetAttrInfo(const BNode*, const char* hostAttrName, const char* foreignAttrName,
|
||||
type_code* = NULL, size_t* = NULL);
|
||||
ReadAttrResult GetAttrInfo(const BNode*, const char* hostAttrName,
|
||||
const char* foreignAttrName, type_code* = NULL, size_t* = NULL);
|
||||
|
||||
status_t FSCreateNewFolder(const entry_ref*);
|
||||
status_t FSRecursiveCreateFolder(const char* path);
|
||||
void FSMakeOriginalName(BString &name, const BDirectory* destDir, const char* suffix = 0);
|
||||
void FSMakeOriginalName(BString &name, const BDirectory* destDir,
|
||||
const char* suffix = 0);
|
||||
|
||||
status_t TrackerLaunch(const entry_ref* app, bool async);
|
||||
status_t TrackerLaunch(const BMessage* refs, bool async, bool okToRunOpenWith = true);
|
||||
status_t TrackerLaunch(const BMessage* refs, bool async,
|
||||
bool okToRunOpenWith = true);
|
||||
status_t TrackerLaunch(const entry_ref* app, const BMessage* refs, bool async,
|
||||
bool okToRunOpenWith = true);
|
||||
status_t LaunchBrokenLink(const char*, const BMessage*);
|
||||
@ -243,9 +249,9 @@ status_t FSFindTrackerSettingsDir(BPath*, bool autoCreate = true);
|
||||
|
||||
bool FSIsDeskDir(const BEntry*);
|
||||
|
||||
// two separate ifYouDoAction and toDoAction versions are needed for localization
|
||||
// purposes. The first one is used in "If you do action ..." sentence,
|
||||
// the second one in the "To do action" sentence.
|
||||
// two separate ifYouDoAction and toDoAction versions are needed for
|
||||
// localization purposes. The first one is used in "If you do action..."
|
||||
// sentence, the second one in the "To do action" sentence.
|
||||
bool ConfirmChangeIfWellKnownDirectory(const BEntry* entry,
|
||||
const char* ifYouDoAction, const char* toDoAction,
|
||||
const char* toConfirmAction, bool dontAsk = false,
|
||||
@ -254,12 +260,14 @@ bool ConfirmChangeIfWellKnownDirectory(const BEntry* entry,
|
||||
bool CheckDevicesEqual(const entry_ref* entry, const Model* targetModel);
|
||||
|
||||
// Deprecated calls use newer calls above instead
|
||||
_IMPEXP_TRACKER void FSLaunchItem(const entry_ref*, BMessage* = NULL, int32 workspace = -1);
|
||||
_IMPEXP_TRACKER void FSLaunchItem(const entry_ref*, BMessage* = NULL,
|
||||
int32 workspace = -1);
|
||||
_IMPEXP_TRACKER status_t FSLaunchItem(const entry_ref*, BMessage*,
|
||||
int32 workspace, bool asynch);
|
||||
_IMPEXP_TRACKER void FSOpenWithDocuments(const entry_ref* executableToLaunch,
|
||||
BMessage* documentEntryRefs);
|
||||
_IMPEXP_TRACKER status_t FSLaunchUsing(const entry_ref* ref, BMessage* listOfRefs);
|
||||
_IMPEXP_TRACKER status_t FSLaunchUsing(const entry_ref* ref,
|
||||
BMessage* listOfRefs);
|
||||
|
||||
|
||||
// some extra directory_which values
|
||||
@ -279,7 +287,8 @@ class WellKnowEntryList {
|
||||
// system hierarchy
|
||||
public:
|
||||
struct WellKnownEntry {
|
||||
WellKnownEntry(const node_ref* node, directory_which which, const char* name)
|
||||
WellKnownEntry(const node_ref* node, directory_which which,
|
||||
const char* name)
|
||||
:
|
||||
node(*node),
|
||||
which(which),
|
||||
@ -314,8 +323,8 @@ class WellKnowEntryList {
|
||||
WellKnowEntryList();
|
||||
void AddOne(directory_which, const char* name);
|
||||
void AddOne(directory_which, const char* path, const char* name);
|
||||
void AddOne(directory_which, directory_which base, const char* extension,
|
||||
const char* name);
|
||||
void AddOne(directory_which, directory_which base,
|
||||
const char* extension, const char* name);
|
||||
|
||||
std::vector<WellKnownEntry> entries;
|
||||
static WellKnowEntryList* self;
|
||||
|
@ -124,7 +124,8 @@ FavoritesMenu::AddNextItem()
|
||||
|
||||
try {
|
||||
BPath path;
|
||||
ThrowOnError( find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) );
|
||||
ThrowOnError(find_directory(B_USER_SETTINGS_DIRECTORY,
|
||||
&path, true));
|
||||
path.Append(kGoDirectory);
|
||||
mkdir(path.Path(), 0777);
|
||||
|
||||
@ -169,7 +170,8 @@ FavoritesMenu::AddNextItem()
|
||||
if (item == NULL)
|
||||
return true;
|
||||
|
||||
item->SetLabel(ref.name); // this is the name of the link in the Go dir
|
||||
item->SetLabel(ref.name);
|
||||
// this is the name of the link in the Go dir
|
||||
|
||||
if (!fAddedSeparatorForSection) {
|
||||
fAddedSeparatorForSection = true;
|
||||
@ -214,7 +216,8 @@ FavoritesMenu::AddNextItem()
|
||||
if (!ShouldShowModel(&model))
|
||||
return true;
|
||||
|
||||
BMenuItem* item = BNavMenu::NewModelItem(&model, fOpenFileMessage, fTarget);
|
||||
BMenuItem* item = BNavMenu::NewModelItem(&model,
|
||||
fOpenFileMessage, fTarget);
|
||||
if (item) {
|
||||
if (!fAddedSeparatorForSection) {
|
||||
fAddedSeparatorForSection = true;
|
||||
@ -252,8 +255,10 @@ FavoritesMenu::AddNextItem()
|
||||
|
||||
// don't add folders that are already in the GoTo section
|
||||
if (find_if(fUniqueRefCheck.begin(), fUniqueRefCheck.end(),
|
||||
bind2nd(std::equal_to<entry_ref>(), ref)) != fUniqueRefCheck.end())
|
||||
bind2nd(std::equal_to<entry_ref>(), ref))
|
||||
!= fUniqueRefCheck.end()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Model model(&ref, true);
|
||||
if (model.InitCheck() != B_OK)
|
||||
@ -262,8 +267,8 @@ FavoritesMenu::AddNextItem()
|
||||
if (!ShouldShowModel(&model))
|
||||
return true;
|
||||
|
||||
BMenuItem* item = BNavMenu::NewModelItem(&model, fOpenFolderMessage,
|
||||
fTarget, true);
|
||||
BMenuItem* item = BNavMenu::NewModelItem(&model,
|
||||
fOpenFolderMessage, fTarget, true);
|
||||
if (item) {
|
||||
if (!fAddedSeparatorForSection) {
|
||||
fAddedSeparatorForSection = true;
|
||||
|
@ -507,7 +507,8 @@ TFilePanel::AdjustButton()
|
||||
if (!button)
|
||||
return;
|
||||
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>(FindView("text view"));
|
||||
BTextControl* textControl
|
||||
= dynamic_cast<BTextControl*>(FindView("text view"));
|
||||
BObjectList<BPose>* selectionList = fPoseView->SelectionList();
|
||||
BString buttonText = fButtonText;
|
||||
bool enabled = false;
|
||||
@ -522,7 +523,8 @@ TFilePanel::AdjustButton()
|
||||
enabled = true;
|
||||
buttonText = B_TRANSLATE("Open");
|
||||
} else {
|
||||
// insert the name of the selected model into the text field
|
||||
// insert the name of the selected model into
|
||||
// the text field
|
||||
textControl->SetText(model->Name());
|
||||
textControl->MakeFocus(true);
|
||||
}
|
||||
@ -736,30 +738,39 @@ TFilePanel::Init(const BMessage*)
|
||||
|
||||
AddShortcut('W', B_COMMAND_KEY, new BMessage(kCancelButton));
|
||||
AddShortcut('H', B_COMMAND_KEY, new BMessage(kSwitchToHome));
|
||||
AddShortcut('A', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kShowSelectionWindow));
|
||||
AddShortcut('A', B_COMMAND_KEY | B_SHIFT_KEY,
|
||||
new BMessage(kShowSelectionWindow));
|
||||
AddShortcut('A', B_COMMAND_KEY, new BMessage(B_SELECT_ALL), PoseView());
|
||||
AddShortcut('S', B_COMMAND_KEY, new BMessage(kInvertSelection), PoseView());
|
||||
AddShortcut('S', B_COMMAND_KEY, new BMessage(kInvertSelection),
|
||||
PoseView());
|
||||
AddShortcut('Y', B_COMMAND_KEY, new BMessage(kResizeToFit), PoseView());
|
||||
AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY, new BMessage(kOpenDir));
|
||||
AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_OPTION_KEY, new BMessage(kOpenDir));
|
||||
AddShortcut(B_DOWN_ARROW, B_COMMAND_KEY | B_OPTION_KEY,
|
||||
new BMessage(kOpenDir));
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY, new BMessage(kOpenParentDir));
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_OPTION_KEY, new BMessage(kOpenParentDir));
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_OPTION_KEY,
|
||||
new BMessage(kOpenParentDir));
|
||||
|
||||
// New code to make buttons font sensitive
|
||||
rect = windRect;
|
||||
rect.top = rect.bottom - 35;
|
||||
rect.bottom -= 10;
|
||||
rect.right -= 25;
|
||||
float default_width = be_plain_font->StringWidth(fButtonText.String()) + 20;
|
||||
rect.left = (default_width > 75) ? (rect.right - default_width) : (rect.right - 75);
|
||||
float default_width
|
||||
= be_plain_font->StringWidth(fButtonText.String()) + 20;
|
||||
rect.left = default_width > 75
|
||||
? rect.right - default_width : rect.right - 75;
|
||||
|
||||
BButton* default_button = new BButton(rect, "default button", fButtonText.String(),
|
||||
new BMessage(kDefaultButton), B_FOLLOW_RIGHT + B_FOLLOW_BOTTOM);
|
||||
BButton* default_button = new BButton(rect, "default button",
|
||||
fButtonText.String(), new BMessage(kDefaultButton),
|
||||
B_FOLLOW_RIGHT + B_FOLLOW_BOTTOM);
|
||||
fBackView->AddChild(default_button);
|
||||
|
||||
rect.right = rect.left -= 10;
|
||||
float cancel_width = be_plain_font->StringWidth(B_TRANSLATE("Cancel")) + 20;
|
||||
rect.left = (cancel_width > 75) ? (rect.right - cancel_width) : (rect.right - 75);
|
||||
float cancel_width
|
||||
= be_plain_font->StringWidth(B_TRANSLATE("Cancel")) + 20;
|
||||
rect.left = cancel_width > 75
|
||||
? rect.right - cancel_width : rect.right - 75;
|
||||
|
||||
BButton* cancel_button = new BButton(rect, "cancel button",
|
||||
B_TRANSLATE("Cancel"), new BMessage(kCancelButton),
|
||||
@ -804,7 +815,8 @@ void
|
||||
TFilePanel::RestoreState()
|
||||
{
|
||||
BNode defaultingNode;
|
||||
if (DefaultStateSourceNode(kDefaultFilePanelTemplate, &defaultingNode, false)) {
|
||||
if (DefaultStateSourceNode(kDefaultFilePanelTemplate, &defaultingNode,
|
||||
false)) {
|
||||
AttributeStreamFileNode streamNodeSource(&defaultingNode);
|
||||
RestoreWindowState(&streamNodeSource);
|
||||
PoseView()->Init(&streamNodeSource);
|
||||
@ -882,7 +894,8 @@ TFilePanel::AddFileContextMenus(BMenu* menu)
|
||||
new BMessage(B_CUT), 'X'));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Copy"),
|
||||
new BMessage(B_COPY), 'C'));
|
||||
// menu->AddItem(pasteItem = new BMenuItem("Paste", new BMessage(B_PASTE), 'V'));
|
||||
//menu->AddItem(pasteItem = new BMenuItem("Paste", new BMessage(B_PASTE),
|
||||
// 'V'));
|
||||
|
||||
menu->SetTargetForItems(PoseView());
|
||||
}
|
||||
@ -898,10 +911,12 @@ TFilePanel::AddVolumeContextMenus(BMenu* menu)
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Edit name"),
|
||||
new BMessage(kEditItem), 'E'));
|
||||
menu->AddSeparatorItem();
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Cut"), new BMessage(B_CUT), 'X'));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Cut"), new BMessage(B_CUT),
|
||||
'X'));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Copy"),
|
||||
new BMessage(B_COPY), 'C'));
|
||||
// menu->AddItem(pasteItem = new BMenuItem("Paste", new BMessage(B_PASTE), 'V'));
|
||||
//menu->AddItem(pasteItem = new BMenuItem("Paste", new BMessage(B_PASTE),
|
||||
// 'V'));
|
||||
|
||||
menu->SetTargetForItems(PoseView());
|
||||
}
|
||||
@ -955,7 +970,8 @@ TFilePanel::MenusBeginning()
|
||||
int32 count = PoseView()->SelectionList()->CountItems();
|
||||
|
||||
EnableNamedMenuItem(fMenuBar, kNewFolder, !TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fMenuBar, kMoveToTrash, !TargetModel()->IsRoot() && count);
|
||||
EnableNamedMenuItem(fMenuBar, kMoveToTrash, !TargetModel()->IsRoot()
|
||||
&& count);
|
||||
EnableNamedMenuItem(fMenuBar, kGetInfo, count != 0);
|
||||
EnableNamedMenuItem(fMenuBar, kEditItem, count == 1);
|
||||
|
||||
@ -977,9 +993,12 @@ TFilePanel::MenusEnded()
|
||||
void
|
||||
TFilePanel::ShowContextMenu(BPoint point, const entry_ref* ref, BView* view)
|
||||
{
|
||||
EnableNamedMenuItem(fWindowContextMenu, kNewFolder, !TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fWindowContextMenu, kOpenParentDir, !TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fWindowContextMenu, kMoveToTrash, !TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fWindowContextMenu, kNewFolder,
|
||||
!TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fWindowContextMenu, kOpenParentDir,
|
||||
!TargetModel()->IsRoot());
|
||||
EnableNamedMenuItem(fWindowContextMenu, kMoveToTrash,
|
||||
!TargetModel()->IsRoot());
|
||||
|
||||
_inherited::ShowContextMenu(point, ref, view);
|
||||
}
|
||||
@ -998,7 +1017,8 @@ TFilePanel::SetButtonLabel(file_panel_button selector, const char* text)
|
||||
switch (selector) {
|
||||
case B_CANCEL_BUTTON:
|
||||
{
|
||||
BButton* button = dynamic_cast<BButton*>(FindView("cancel button"));
|
||||
BButton* button
|
||||
= dynamic_cast<BButton*>(FindView("cancel button"));
|
||||
if (!button)
|
||||
break;
|
||||
|
||||
@ -1016,7 +1036,8 @@ TFilePanel::SetButtonLabel(file_panel_button selector, const char* text)
|
||||
{
|
||||
fButtonText = text;
|
||||
float delta = 0;
|
||||
BButton* button = dynamic_cast<BButton*>(FindView("default button"));
|
||||
BButton* button
|
||||
= dynamic_cast<BButton*>(FindView("default button"));
|
||||
if (button) {
|
||||
float old_width = button->StringWidth(button->Label());
|
||||
button->SetLabel(text);
|
||||
@ -1043,7 +1064,8 @@ TFilePanel::SetSaveText(const char* text)
|
||||
if (!text)
|
||||
return;
|
||||
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>(FindView("text view"));
|
||||
BTextControl* textControl
|
||||
= dynamic_cast<BTextControl*>(FindView("text view"));
|
||||
textControl->SetText(text);
|
||||
textControl->TextView()->SelectAll();
|
||||
}
|
||||
@ -1060,9 +1082,9 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
if (message->FindRef("refs", &ref) == B_OK) {
|
||||
BEntry entry(&ref, true);
|
||||
if (entry.InitCheck() == B_OK) {
|
||||
// Double-click on dir or link-to-dir ALWAYS opens the dir.
|
||||
// If more than one dir is selected, the
|
||||
// first is entered.
|
||||
// Double-click on dir or link-to-dir ALWAYS opens the
|
||||
// dir. If more than one dir is selected, the first is
|
||||
// entered.
|
||||
if (entry.IsDirectory()) {
|
||||
entry.GetRef(&ref);
|
||||
bool isDesktop = SwitchDirToDesktopIfNeeded(ref);
|
||||
@ -1075,7 +1097,8 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
// Otherwise, we have a file or a link to a file.
|
||||
// AdjustButton has already tested the flavor;
|
||||
// all we have to do is see if the button is enabled.
|
||||
BButton* button = dynamic_cast<BButton*>(FindView("default button"));
|
||||
BButton* button = dynamic_cast<BButton*>(
|
||||
FindView("default button"));
|
||||
if (!button)
|
||||
break;
|
||||
|
||||
@ -1087,15 +1110,19 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
// Don't allow saves of multiple files
|
||||
if (count > 1) {
|
||||
ShowCenteredAlert(
|
||||
B_TRANSLATE("Sorry, saving more than one item is not allowed."),
|
||||
B_TRANSLATE(
|
||||
"Sorry, saving more than one "
|
||||
"item is not allowed."),
|
||||
B_TRANSLATE("Cancel"));
|
||||
} else {
|
||||
// if we are a savepanel, set up the filepanel correctly
|
||||
// then pass control so we follow the same path as if the user
|
||||
// if we are a savepanel, set up the
|
||||
// filepanel correctly then pass control
|
||||
// so we follow the same path as if the user
|
||||
// clicked the save button
|
||||
|
||||
// set the 'name' fld to the current ref's name
|
||||
// notify the panel that the default button should be enabled
|
||||
// set the 'name' fld to the current ref's
|
||||
// name notify the panel that the default
|
||||
// button should be enabled
|
||||
SetSaveText(ref.name);
|
||||
SelectionChanged();
|
||||
|
||||
@ -1144,8 +1171,10 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
case kAddCurrentDir:
|
||||
{
|
||||
BPath path;
|
||||
if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
|
||||
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path, true)
|
||||
!= B_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
path.Append(kGoDirectory);
|
||||
BDirectory goDirectory(path.Path());
|
||||
@ -1155,7 +1184,8 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
entry.GetPath(&path);
|
||||
|
||||
BSymLink link;
|
||||
goDirectory.CreateSymLink(TargetModel()->Name(), path.Path(), &link);
|
||||
goDirectory.CreateSymLink(TargetModel()->Name(), path.Path(),
|
||||
&link);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1163,8 +1193,10 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
case kEditFavorites:
|
||||
{
|
||||
BPath path;
|
||||
if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
|
||||
if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true)
|
||||
!= B_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
path.Append(kGoDirectory);
|
||||
BMessenger msgr(kTrackerSignature);
|
||||
@ -1199,7 +1231,8 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
if (fIsSavePanel) {
|
||||
if (PoseView()->IsFocus()
|
||||
&& PoseView()->SelectionList()->CountItems() == 1) {
|
||||
Model* model = (PoseView()->SelectionList()->FirstItem())->TargetModel();
|
||||
Model* model = (PoseView()->SelectionList()->
|
||||
FirstItem())->TargetModel();
|
||||
if (model->ResolveIfLink()->IsDirectory()) {
|
||||
PoseView()->CommitActivePose();
|
||||
PoseView()->OpenSelection();
|
||||
@ -1215,13 +1248,17 @@ TFilePanel::MessageReceived(BMessage* message)
|
||||
case B_OBSERVER_NOTICE_CHANGE:
|
||||
{
|
||||
int32 observerWhat;
|
||||
if (message->FindInt32("be:observe_change_what", &observerWhat) == B_OK) {
|
||||
if (message->FindInt32("be:observe_change_what", &observerWhat)
|
||||
== B_OK) {
|
||||
switch (observerWhat) {
|
||||
case kDesktopFilePanelRootChanged:
|
||||
{
|
||||
bool desktopIsRoot = true;
|
||||
if (message->FindBool("DesktopFilePanelRoot", &desktopIsRoot) == B_OK)
|
||||
TrackerSettings().SetDesktopFilePanelRoot(desktopIsRoot);
|
||||
if (message->FindBool("DesktopFilePanelRoot",
|
||||
&desktopIsRoot) == B_OK) {
|
||||
TrackerSettings().
|
||||
SetDesktopFilePanelRoot(desktopIsRoot);
|
||||
}
|
||||
SetTo(TargetModel()->EntryRef());
|
||||
break;
|
||||
}
|
||||
@ -1416,9 +1453,10 @@ TFilePanel::HandleSaveButton()
|
||||
fTextControl->TextView()->SelectAll();
|
||||
return;
|
||||
} else {
|
||||
// if this was invoked by a dbl click, it is an explicit replacement
|
||||
// of the file.
|
||||
BString str(B_TRANSLATE("The file \"%name\" already exists in the specified folder. Do you want to replace it?"));
|
||||
// if this was invoked by a dbl click, it is an explicit
|
||||
// replacement of the file.
|
||||
BString str(B_TRANSLATE("The file \"%name\" already exists in "
|
||||
"the specified folder. Do you want to replace it?"));
|
||||
str.ReplaceFirst("%name", fTextControl->Text());
|
||||
|
||||
if (ShowCenteredAlert(str.String(), B_TRANSLATE("Cancel"),
|
||||
@ -1512,8 +1550,10 @@ TFilePanel::HandleOpenButton()
|
||||
if (((fNodeFlavors & B_DIRECTORY_NODE) != 0
|
||||
&& model->ResolveIfLink()->IsDirectory())
|
||||
|| ((fNodeFlavors & B_SYMLINK_NODE) != 0 && model->IsSymLink())
|
||||
|| ((fNodeFlavors & B_FILE_NODE) != 0 && model->ResolveIfLink()->IsFile()))
|
||||
|| ((fNodeFlavors & B_FILE_NODE) != 0
|
||||
&& model->ResolveIfLink()->IsFile())) {
|
||||
message.AddRef("refs", model->EntryRef());
|
||||
}
|
||||
}
|
||||
|
||||
OpenSelectionCommon(&message);
|
||||
@ -1550,7 +1590,8 @@ TFilePanel::WindowActivated(bool active)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
BFilePanelPoseView::BFilePanelPoseView(Model* model, BRect frame, uint32 resizeMask)
|
||||
BFilePanelPoseView::BFilePanelPoseView(Model* model, BRect frame,
|
||||
uint32 resizeMask)
|
||||
: BPoseView(model, frame, kListMode, resizeMask),
|
||||
fIsDesktop(model->IsDesktop())
|
||||
{
|
||||
@ -1583,8 +1624,8 @@ bool
|
||||
BFilePanelPoseView::FSNotification(const BMessage* message)
|
||||
{
|
||||
if (IsDesktopView()) {
|
||||
// Pretty much copied straight from DesktopPoseView. Would be better
|
||||
// if the code could be shared somehow.
|
||||
// Pretty much copied straight from DesktopPoseView.
|
||||
// Would be better if the code could be shared somehow.
|
||||
switch (message->FindInt32("opcode")) {
|
||||
case B_DEVICE_MOUNTED:
|
||||
{
|
||||
@ -1600,7 +1641,8 @@ BFilePanelPoseView::FSNotification(const BMessage* message)
|
||||
break;
|
||||
|
||||
if (settings.MountVolumesOntoDesktop()
|
||||
&& (!volume.IsShared() || settings.MountSharedVolumesOntoDesktop())) {
|
||||
&& (!volume.IsShared()
|
||||
|| settings.MountSharedVolumesOntoDesktop())) {
|
||||
// place an icon for the volume onto the desktop
|
||||
CreateVolumePose(&volume, true);
|
||||
}
|
||||
@ -1692,7 +1734,8 @@ BFilePanelPoseView::AdaptToVolumeChange(BMessage* message)
|
||||
|
||||
message->FindBool("ShowDisksIcon", &showDisksIcon);
|
||||
message->FindBool("MountVolumesOntoDesktop", &mountVolumesOnDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop", &mountSharedVolumesOntoDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop",
|
||||
&mountSharedVolumesOntoDesktop);
|
||||
|
||||
BEntry entry("/");
|
||||
Model model(&entry);
|
||||
@ -1725,7 +1768,8 @@ BFilePanelPoseView::AdaptToDesktopIntegrationChange(BMessage* message)
|
||||
bool mountSharedVolumesOntoDesktop = true;
|
||||
|
||||
message->FindBool("MountVolumesOntoDesktop", &mountVolumesOnDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop", &mountSharedVolumesOntoDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop",
|
||||
&mountSharedVolumesOntoDesktop);
|
||||
|
||||
ShowVolumes(false, mountSharedVolumesOntoDesktop);
|
||||
ShowVolumes(mountVolumesOnDesktop, mountSharedVolumesOntoDesktop);
|
||||
|
@ -122,7 +122,8 @@ protected:
|
||||
virtual void WindowActivated(bool state);
|
||||
|
||||
static filter_result FSFilter(BMessage*, BHandler**, BMessageFilter*);
|
||||
static filter_result MessageDropFilter(BMessage*, BHandler**, BMessageFilter*);
|
||||
static filter_result MessageDropFilter(BMessage*, BHandler**,
|
||||
BMessageFilter*);
|
||||
|
||||
int32 ShowCenteredAlert(const char* text, const char* button1,
|
||||
const char* button2 = NULL, const char* button3 = NULL);
|
||||
|
@ -106,7 +106,8 @@ namespace BPrivate {
|
||||
|
||||
class MostUsedNames {
|
||||
public:
|
||||
MostUsedNames(const char* fileName, const char* directory, int32 maxCount = 5);
|
||||
MostUsedNames(const char* fileName, const char* directory,
|
||||
int32 maxCount = 5);
|
||||
~MostUsedNames();
|
||||
|
||||
bool ObtainList(BList* list);
|
||||
@ -175,8 +176,8 @@ MoreOptionsStruct::QueryTemporary(const BNode* node)
|
||||
|
||||
FindWindow::FindWindow(const entry_ref* newRef, bool editIfTemplateOnly)
|
||||
:
|
||||
BWindow(kInitialRect, B_TRANSLATE("Find"), B_TITLED_WINDOW, B_NOT_RESIZABLE
|
||||
| B_NOT_ZOOMABLE),
|
||||
BWindow(kInitialRect, B_TRANSLATE("Find"), B_TITLED_WINDOW,
|
||||
B_NOT_RESIZABLE | B_NOT_ZOOMABLE),
|
||||
fFile(TryOpening(newRef)),
|
||||
fFromTemplate(false),
|
||||
fEditTemplateOnly(false),
|
||||
@ -218,7 +219,8 @@ FindWindow::FindWindow(const entry_ref* newRef, bool editIfTemplateOnly)
|
||||
|
||||
fFromTemplate = IsQueryTemplate(fFile);
|
||||
|
||||
fBackground = new FindPanel(Bounds(), fFile, this, fFromTemplate, fEditTemplateOnly);
|
||||
fBackground = new FindPanel(Bounds(), fFile, this, fFromTemplate,
|
||||
fEditTemplateOnly);
|
||||
AddChild(fBackground);
|
||||
}
|
||||
|
||||
@ -292,8 +294,10 @@ const char*
|
||||
FindWindow::QueryName() const
|
||||
{
|
||||
if (fFromTemplate) {
|
||||
if (!fQueryNameFromTemplate.Length())
|
||||
fFile->ReadAttrString(kAttrQueryTemplateName, &fQueryNameFromTemplate);
|
||||
if (!fQueryNameFromTemplate.Length()) {
|
||||
fFile->ReadAttrString(kAttrQueryTemplateName,
|
||||
&fQueryNameFromTemplate);
|
||||
}
|
||||
|
||||
return fQueryNameFromTemplate.String();
|
||||
}
|
||||
@ -375,7 +379,8 @@ FindWindow::SaveQueryAttributes(BNode* file, bool queryTemplate)
|
||||
|
||||
// save date/time info for recent query support and transient query killer
|
||||
int32 currentTime = (int32)time(0);
|
||||
file->WriteAttr(kAttrQueryLastChange, B_INT32_TYPE, 0, ¤tTime, sizeof(int32));
|
||||
file->WriteAttr(kAttrQueryLastChange, B_INT32_TYPE, 0, ¤tTime,
|
||||
sizeof(int32));
|
||||
int32 tmp = 1;
|
||||
file->WriteAttr("_trk/recentQuery", B_INT32_TYPE, 0, &tmp, sizeof(int32));
|
||||
}
|
||||
@ -393,7 +398,8 @@ FindWindow::SaveQueryAsAttributes(BNode* file, BEntry* entry, bool queryTemplate
|
||||
// and the file's location
|
||||
FSSetPoseLocation(entry, *oldLocation);
|
||||
|
||||
BNodeInfo(file).SetType(queryTemplate ? B_QUERY_TEMPLATE_MIMETYPE : B_QUERY_MIMETYPE);
|
||||
BNodeInfo(file).SetType(queryTemplate
|
||||
? B_QUERY_TEMPLATE_MIMETYPE : B_QUERY_MIMETYPE);
|
||||
|
||||
BString predicate;
|
||||
bool dynamicDate;
|
||||
@ -509,7 +515,8 @@ FindWindow::Find()
|
||||
}
|
||||
|
||||
int32 currentTime = (int32)time(0);
|
||||
fFile->WriteAttr(kAttrQueryLastChange, B_INT32_TYPE, 0, ¤tTime, sizeof(int32));
|
||||
fFile->WriteAttr(kAttrQueryLastChange, B_INT32_TYPE, 0, ¤tTime,
|
||||
sizeof(int32));
|
||||
|
||||
// tell the tracker about it
|
||||
BMessage message(B_REFS_RECEIVED);
|
||||
@ -683,7 +690,8 @@ FindPanel::FindPanel(BRect frame, BFile* node, FindWindow* parent,
|
||||
|
||||
BMessenger self(this);
|
||||
fRecentQueries = new BPopUpMenu("RecentQueries");
|
||||
FindPanel::AddRecentQueries(fRecentQueries, true, &self, kSwitchToQueryTemplate);
|
||||
FindPanel::AddRecentQueries(fRecentQueries, true, &self,
|
||||
kSwitchToQueryTemplate);
|
||||
|
||||
AddChild(new MiniMenuField(rect, "RecentQueries", fRecentQueries));
|
||||
|
||||
@ -741,8 +749,8 @@ FindPanel::FindPanel(BRect frame, BFile* node, FindWindow* parent,
|
||||
B_TRANSLATE_NOCOLLECT(kDragNDropActionSpecifiers[1]));
|
||||
|
||||
BMessenger self(this);
|
||||
fDraggableIcon = new DraggableQueryIcon(DraggableIcon::PreferredRect(draggableIconOrigin,
|
||||
B_LARGE_ICON), "saveHere", &dragNDropMessage,
|
||||
fDraggableIcon = new DraggableQueryIcon(DraggableIcon::PreferredRect(
|
||||
draggableIconOrigin, B_LARGE_ICON), "saveHere", &dragNDropMessage,
|
||||
self, B_FOLLOW_LEFT | B_FOLLOW_BOTTOM);
|
||||
AddChild(fDraggableIcon);
|
||||
}
|
||||
@ -769,8 +777,8 @@ FindPanel::FindPanel(BRect frame, BFile* node, FindWindow* parent,
|
||||
rect = expandedBounds;
|
||||
rect.right = rect.left + 200;
|
||||
rect.bottom = rect.top + 20;;
|
||||
fQueryName = new BTextControl(rect, "queryName", B_TRANSLATE("Query name:"),
|
||||
"", 0);
|
||||
fQueryName = new BTextControl(rect, "queryName",
|
||||
B_TRANSLATE("Query name:"), "", 0);
|
||||
fQueryName->SetDivider(fQueryName->StringWidth(fQueryName->Label()) + 5);
|
||||
fMoreOptionsPane->AddItem(fQueryName, 1);
|
||||
FillCurrentQueryName(fQueryName, parent);
|
||||
@ -838,9 +846,9 @@ FindPanel::AttachedToWindow()
|
||||
fQueryName->SetTarget(this);
|
||||
fLatch->SetTarget(fMoreOptionsPane);
|
||||
RestoreMimeTypeMenuSelection(node);
|
||||
// preselect the mime we used the last time
|
||||
// have to do it here because AddByAttributeItems will build different
|
||||
// menus based on which mime type is preselected
|
||||
// preselect the mime we used the last time have to do it here
|
||||
// because AddByAttributeItems will build different menus based
|
||||
// on which mime type is preselected
|
||||
RestoreWindowState(node);
|
||||
|
||||
if (!Window()->CurrentFocus()) {
|
||||
@ -971,9 +979,10 @@ FindPanel::ShowVolumeMenuLabel()
|
||||
tmpItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
if (countSelected == 0) {
|
||||
// no disk selected, for now revert to search all disks
|
||||
// ToDo:
|
||||
// TODO:
|
||||
// show no disks here and add a check that will not let the
|
||||
// query go if the user doesn't pick at least one
|
||||
fVolMenu->ItemAt(0)->SetMarked(true);
|
||||
@ -997,51 +1006,49 @@ FindPanel::MessageReceived(BMessage* message)
|
||||
|
||||
switch (message->what) {
|
||||
case kVolumeItem:
|
||||
{
|
||||
// volume changed
|
||||
BMenuItem* invokedItem;
|
||||
dev_t dev;
|
||||
if (message->FindPointer("source", (void**)&invokedItem) != B_OK)
|
||||
return;
|
||||
{
|
||||
// volume changed
|
||||
BMenuItem* invokedItem;
|
||||
dev_t dev;
|
||||
if (message->FindPointer("source", (void**)&invokedItem) != B_OK)
|
||||
return;
|
||||
|
||||
if (message->FindInt32("device", &dev) != B_OK)
|
||||
break;
|
||||
if (message->FindInt32("device", &dev) != B_OK)
|
||||
break;
|
||||
|
||||
BMenu* menu = invokedItem->Menu();
|
||||
ASSERT(menu);
|
||||
BMenu* menu = invokedItem->Menu();
|
||||
ASSERT(menu);
|
||||
|
||||
if (dev == -1) {
|
||||
if (dev == -1) {
|
||||
// all disks selected, uncheck everything else
|
||||
int32 count = menu->CountItems();
|
||||
for (int32 index = 2; index < count; index++)
|
||||
menu->ItemAt(index)->SetMarked(false);
|
||||
|
||||
// all disks selected, uncheck everything else
|
||||
int32 count = menu->CountItems();
|
||||
for (int32 index = 2; index < count; index++)
|
||||
menu->ItemAt(index)->SetMarked(false);
|
||||
// make all disks the title and check it
|
||||
PopUpMenuSetTitle(menu, menu->ItemAt(0)->Label());
|
||||
menu->ItemAt(0)->SetMarked(true);
|
||||
} else {
|
||||
// a specific volume selected, unmark "all disks"
|
||||
menu->ItemAt(0)->SetMarked(false);
|
||||
|
||||
// make all disks the title and check it
|
||||
PopUpMenuSetTitle(menu, menu->ItemAt(0)->Label());
|
||||
menu->ItemAt(0)->SetMarked(true);
|
||||
// toggle mark on invoked item
|
||||
int32 count = menu->CountItems();
|
||||
for (int32 index = 2; index < count; index++) {
|
||||
BMenuItem* item = menu->ItemAt(index);
|
||||
|
||||
} else {
|
||||
// a specific volume selected, unmark "all disks"
|
||||
menu->ItemAt(0)->SetMarked(false);
|
||||
|
||||
// toggle mark on invoked item
|
||||
int32 count = menu->CountItems();
|
||||
for (int32 index = 2; index < count; index++) {
|
||||
BMenuItem* item = menu->ItemAt(index);
|
||||
|
||||
if (invokedItem == item) {
|
||||
// we just selected this
|
||||
bool wasMarked = item->IsMarked();
|
||||
item->SetMarked(!wasMarked);
|
||||
}
|
||||
if (invokedItem == item) {
|
||||
// we just selected this
|
||||
bool wasMarked = item->IsMarked();
|
||||
item->SetMarked(!wasMarked);
|
||||
}
|
||||
}
|
||||
// make sure the right label is showing
|
||||
ShowVolumeMenuLabel();
|
||||
|
||||
break;
|
||||
}
|
||||
// make sure the right label is showing
|
||||
ShowVolumeMenuLabel();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case kByAttributeItem:
|
||||
case kByNameItem:
|
||||
@ -1058,102 +1065,110 @@ FindPanel::MessageReceived(BMessage* message)
|
||||
break;
|
||||
|
||||
case kMIMETypeItem:
|
||||
{
|
||||
BMenuItem* item;
|
||||
if (message->FindPointer("source", (void**)&item) == B_OK) {
|
||||
// don't add the "All files and folders" to the list
|
||||
if (fMimeTypeMenu->IndexOf(item) != 0)
|
||||
gMostUsedMimeTypes.AddName(item->Label());
|
||||
{
|
||||
BMenuItem* item;
|
||||
if (message->FindPointer("source", (void**)&item) == B_OK) {
|
||||
// don't add the "All files and folders" to the list
|
||||
if (fMimeTypeMenu->IndexOf(item) != 0)
|
||||
gMostUsedMimeTypes.AddName(item->Label());
|
||||
|
||||
SetCurrentMimeType(item);
|
||||
}
|
||||
|
||||
// mime type switched
|
||||
if (fMode != kByAttributeItem)
|
||||
break;
|
||||
|
||||
// the attributes for this type may be different, rip out the existing ones
|
||||
RemoveAttrViewItems();
|
||||
|
||||
Window()->ResizeTo(Window()->Frame().Width(),
|
||||
ViewHeightForMode(kByAttributeItem, fLatch->Value() != 0));
|
||||
|
||||
BBox* box = dynamic_cast<BBox*>(FindView("Box"));
|
||||
ASSERT(box);
|
||||
box->ResizeTo(box->Bounds().Width(),
|
||||
BoxHeightForMode(kByAttributeItem, fLatch->Value() != 0));
|
||||
|
||||
AddAttrView();
|
||||
break;
|
||||
SetCurrentMimeType(item);
|
||||
}
|
||||
|
||||
// mime type switched
|
||||
if (fMode != kByAttributeItem)
|
||||
break;
|
||||
|
||||
// the attributes for this type may be different,
|
||||
// rip out the existing ones
|
||||
RemoveAttrViewItems();
|
||||
|
||||
Window()->ResizeTo(Window()->Frame().Width(),
|
||||
ViewHeightForMode(kByAttributeItem, fLatch->Value() != 0));
|
||||
|
||||
BBox* box = dynamic_cast<BBox*>(FindView("Box"));
|
||||
ASSERT(box);
|
||||
box->ResizeTo(box->Bounds().Width(),
|
||||
BoxHeightForMode(kByAttributeItem, fLatch->Value() != 0));
|
||||
|
||||
AddAttrView();
|
||||
break;
|
||||
}
|
||||
|
||||
case kNameModifiedMessage:
|
||||
// the query name was edited, make the query permanent
|
||||
fTemporaryCheck->SetValue(0);
|
||||
break;
|
||||
|
||||
case B_SAVE_REQUESTED:
|
||||
{
|
||||
// finish saving query template from a SaveAs panel
|
||||
entry_ref ref;
|
||||
status_t error = message->FindRef("refs", &ref);
|
||||
{
|
||||
// finish saving query template from a SaveAs panel
|
||||
entry_ref ref;
|
||||
status_t error = message->FindRef("refs", &ref);
|
||||
|
||||
if (error == B_OK) {
|
||||
// direct entry selected, convert to parent dir and name
|
||||
BEntry entry(&ref);
|
||||
error = entry.GetParent(&entry);
|
||||
if (error == B_OK) {
|
||||
// direct entry selected, convert to parent dir and name
|
||||
BEntry entry(&ref);
|
||||
error = entry.GetParent(&entry);
|
||||
if (error == B_OK) {
|
||||
entry.GetRef(&dir);
|
||||
name = ref.name;
|
||||
}
|
||||
} else {
|
||||
// parent dir and name selected
|
||||
error = message->FindRef("directory", &dir);
|
||||
if (error == B_OK)
|
||||
error = message->FindString("name", &name);
|
||||
entry.GetRef(&dir);
|
||||
name = ref.name;
|
||||
}
|
||||
} else {
|
||||
// parent dir and name selected
|
||||
error = message->FindRef("directory", &dir);
|
||||
if (error == B_OK)
|
||||
SaveAsQueryOrTemplate(&dir, name, true);
|
||||
error = message->FindString("name", &name);
|
||||
}
|
||||
|
||||
if (error == B_OK)
|
||||
SaveAsQueryOrTemplate(&dir, name, true);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case B_COPY_TARGET:
|
||||
{
|
||||
// finish drag&drop
|
||||
const char* str;
|
||||
const char* mimeType = NULL;
|
||||
const char* actionSpecifier = NULL;
|
||||
if (message->FindString("be:types", &str) == B_OK
|
||||
&& strcasecmp(str, B_FILE_MIME_TYPE) == 0
|
||||
&& (message->FindString("be:actionspecifier", &actionSpecifier) == B_OK
|
||||
|| message->FindString("be:filetypes", &mimeType) == B_OK)
|
||||
&& message->FindString("name", &name) == B_OK
|
||||
&& message->FindRef("directory", &dir) == B_OK) {
|
||||
{
|
||||
// finish drag&drop
|
||||
const char* str;
|
||||
const char* mimeType = NULL;
|
||||
const char* actionSpecifier = NULL;
|
||||
|
||||
bool query = false;
|
||||
bool queryTemplate = false;
|
||||
if (message->FindString("be:types", &str) == B_OK
|
||||
&& strcasecmp(str, B_FILE_MIME_TYPE) == 0
|
||||
&& (message->FindString("be:actionspecifier",
|
||||
&actionSpecifier) == B_OK
|
||||
|| message->FindString("be:filetypes", &mimeType) == B_OK)
|
||||
&& message->FindString("name", &name) == B_OK
|
||||
&& message->FindRef("directory", &dir) == B_OK) {
|
||||
|
||||
if (actionSpecifier
|
||||
&& strcasecmp(actionSpecifier,
|
||||
B_TRANSLATE_NOCOLLECT(
|
||||
kDragNDropActionSpecifiers[0])) == 0) {
|
||||
query = true;
|
||||
} else if (actionSpecifier
|
||||
&& strcasecmp(actionSpecifier,
|
||||
B_TRANSLATE_NOCOLLECT(
|
||||
kDragNDropActionSpecifiers[1])) == 0) {
|
||||
queryTemplate = true;
|
||||
} else if (mimeType && strcasecmp(mimeType,
|
||||
kDragNDropTypes[0]) == 0) {
|
||||
query = true;
|
||||
} else if (mimeType && strcasecmp(mimeType, kDragNDropTypes[1]) == 0)
|
||||
queryTemplate = true;
|
||||
bool query = false;
|
||||
bool queryTemplate = false;
|
||||
|
||||
if (query || queryTemplate)
|
||||
SaveAsQueryOrTemplate(&dir, name, queryTemplate);
|
||||
if (actionSpecifier
|
||||
&& strcasecmp(actionSpecifier,
|
||||
B_TRANSLATE_NOCOLLECT(
|
||||
kDragNDropActionSpecifiers[0])) == 0) {
|
||||
query = true;
|
||||
} else if (actionSpecifier
|
||||
&& strcasecmp(actionSpecifier,
|
||||
B_TRANSLATE_NOCOLLECT(
|
||||
kDragNDropActionSpecifiers[1])) == 0) {
|
||||
queryTemplate = true;
|
||||
} else if (mimeType && strcasecmp(mimeType,
|
||||
kDragNDropTypes[0]) == 0) {
|
||||
query = true;
|
||||
} else if (mimeType && strcasecmp(mimeType,
|
||||
kDragNDropTypes[1]) == 0) {
|
||||
queryTemplate = true;
|
||||
}
|
||||
|
||||
if (query || queryTemplate)
|
||||
SaveAsQueryOrTemplate(&dir, name, queryTemplate);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
_inherited::MessageReceived(message);
|
||||
@ -1163,11 +1178,13 @@ FindPanel::MessageReceived(BMessage* message)
|
||||
|
||||
|
||||
void
|
||||
FindPanel::SaveAsQueryOrTemplate(const entry_ref* dir, const char* name, bool queryTemplate)
|
||||
FindPanel::SaveAsQueryOrTemplate(const entry_ref* dir, const char* name,
|
||||
bool queryTemplate)
|
||||
{
|
||||
BDirectory directory(dir);
|
||||
BFile file(&directory, name, O_RDWR | O_CREAT | O_TRUNC);
|
||||
BNodeInfo(&file).SetType(queryTemplate ? B_QUERY_TEMPLATE_MIMETYPE : B_QUERY_MIMETYPE);
|
||||
BNodeInfo(&file).SetType(queryTemplate
|
||||
? B_QUERY_TEMPLATE_MIMETYPE : B_QUERY_MIMETYPE);
|
||||
|
||||
BMessage attach(kAttachFile);
|
||||
attach.AddRef("directory", dir);
|
||||
@ -1194,7 +1211,8 @@ FindPanel::BuildAttrQuery(BQuery* query, bool &dynamicDate) const
|
||||
if (!textControl)
|
||||
return;
|
||||
|
||||
BMenuField* menuField = dynamic_cast<BMenuField*>(view->FindView("MenuField"));
|
||||
BMenuField* menuField
|
||||
= dynamic_cast<BMenuField*>(view->FindView("MenuField"));
|
||||
if (!menuField)
|
||||
return;
|
||||
|
||||
@ -1218,78 +1236,85 @@ FindPanel::BuildAttrQuery(BQuery* query, bool &dynamicDate) const
|
||||
break;
|
||||
|
||||
case B_TIME_TYPE:
|
||||
{
|
||||
int flags = 0;
|
||||
DEBUG_ONLY(time_t result =)
|
||||
parsedate_etc(textControl->TextView()->Text(), -1, &flags);
|
||||
dynamicDate = (flags & PARSEDATE_RELATIVE_TIME) != 0;
|
||||
PRINT(("parsedate_etc - date is %srelative, %"
|
||||
B_PRIdTIME "\n",
|
||||
dynamicDate ? "" : "not ", result));
|
||||
{
|
||||
int flags = 0;
|
||||
DEBUG_ONLY(time_t result =)
|
||||
parsedate_etc(textControl->TextView()->Text(), -1,
|
||||
&flags);
|
||||
dynamicDate = (flags & PARSEDATE_RELATIVE_TIME) != 0;
|
||||
PRINT(("parsedate_etc - date is %srelative, %"
|
||||
B_PRIdTIME "\n",
|
||||
dynamicDate ? "" : "not ", result));
|
||||
|
||||
query->PushDate(textControl->TextView()->Text());
|
||||
}
|
||||
query->PushDate(textControl->TextView()->Text());
|
||||
break;
|
||||
}
|
||||
|
||||
case B_BOOL_TYPE:
|
||||
{
|
||||
uint32 value;
|
||||
if (strcasecmp(textControl->TextView()->Text(), "true") == 0)
|
||||
value = 1;
|
||||
else if (strcasecmp(textControl->TextView()->Text(), "true") == 0)
|
||||
value = 1;
|
||||
else
|
||||
value = (uint32)atoi(textControl->TextView()->Text());
|
||||
{
|
||||
uint32 value;
|
||||
if (strcasecmp(textControl->TextView()->Text(),
|
||||
"true") == 0) {
|
||||
value = 1;
|
||||
} else if (strcasecmp(textControl->TextView()->Text(),
|
||||
"true") == 0) {
|
||||
value = 1;
|
||||
} else
|
||||
value = (uint32)atoi(textControl->TextView()->Text());
|
||||
|
||||
value %= 2;
|
||||
query->PushUInt32(value);
|
||||
}
|
||||
value %= 2;
|
||||
query->PushUInt32(value);
|
||||
break;
|
||||
}
|
||||
|
||||
case B_UINT8_TYPE:
|
||||
case B_UINT16_TYPE:
|
||||
case B_UINT32_TYPE:
|
||||
query->PushUInt32((uint32)StringToScalar(textControl->TextView()->Text()));
|
||||
query->PushUInt32((uint32)StringToScalar(
|
||||
textControl->TextView()->Text()));
|
||||
break;
|
||||
|
||||
case B_INT8_TYPE:
|
||||
case B_INT16_TYPE:
|
||||
case B_INT32_TYPE:
|
||||
query->PushInt32((int32)StringToScalar(textControl->TextView()->Text()));
|
||||
query->PushInt32((int32)StringToScalar(
|
||||
textControl->TextView()->Text()));
|
||||
break;
|
||||
|
||||
case B_UINT64_TYPE:
|
||||
query->PushUInt64((uint64)StringToScalar(textControl->TextView()->Text()));
|
||||
query->PushUInt64((uint64)StringToScalar(
|
||||
textControl->TextView()->Text()));
|
||||
break;
|
||||
|
||||
case B_OFF_T_TYPE:
|
||||
case B_INT64_TYPE:
|
||||
query->PushInt64(StringToScalar(textControl->TextView()->Text()));
|
||||
query->PushInt64(StringToScalar(
|
||||
textControl->TextView()->Text()));
|
||||
break;
|
||||
|
||||
case B_FLOAT_TYPE:
|
||||
{
|
||||
float floatVal;
|
||||
sscanf(textControl->TextView()->Text(), "%f", &floatVal);
|
||||
query->PushFloat(floatVal);
|
||||
}
|
||||
{
|
||||
float floatVal;
|
||||
sscanf(textControl->TextView()->Text(), "%f", &floatVal);
|
||||
query->PushFloat(floatVal);
|
||||
break;
|
||||
}
|
||||
|
||||
case B_DOUBLE_TYPE:
|
||||
{
|
||||
double doubleVal;
|
||||
sscanf(textControl->TextView()->Text(), "%lf", &doubleVal);
|
||||
query->PushDouble(doubleVal);
|
||||
}
|
||||
{
|
||||
double doubleVal;
|
||||
sscanf(textControl->TextView()->Text(), "%lf", &doubleVal);
|
||||
query->PushDouble(doubleVal);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
query_op theOperator;
|
||||
BMenuItem* operatorItem = item->Submenu()->FindMarked();
|
||||
if (operatorItem && operatorItem->Message() != NULL) {
|
||||
operatorItem->Message()->FindInt32("operator", (int32*)&theOperator);
|
||||
operatorItem->Message()->FindInt32("operator",
|
||||
(int32*)&theOperator);
|
||||
query->PushOp(theOperator);
|
||||
} else
|
||||
query->PushOp(B_EQ);
|
||||
@ -1297,7 +1322,8 @@ FindPanel::BuildAttrQuery(BQuery* query, bool &dynamicDate) const
|
||||
// add logic based on selection in Logic menufield
|
||||
if (index > 0) {
|
||||
TAttrView* prevView = fAttrViewList.ItemAt(index - 1);
|
||||
menuField = dynamic_cast<BMenuField*>(prevView->FindView("Logic"));
|
||||
menuField
|
||||
= dynamic_cast<BMenuField*>(prevView->FindView("Logic"));
|
||||
if (menuField) {
|
||||
item = menuField->Menu()->FindMarked();
|
||||
if (item) {
|
||||
@ -1348,7 +1374,8 @@ FindPanel::GetByAttrPredicate(BQuery* query, bool &dynamicDate) const
|
||||
void
|
||||
FindPanel::GetDefaultName(BString &result) const
|
||||
{
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>(FindView("TextControl"));
|
||||
BTextControl* textControl
|
||||
= dynamic_cast<BTextControl*>(FindView("TextControl"));
|
||||
switch (Mode()) {
|
||||
case kByNameItem:
|
||||
result.SetTo(B_TRANSLATE_COMMENT("Name = %name",
|
||||
@ -1393,16 +1420,17 @@ void
|
||||
FindPanel::GetByNamePredicate(BQuery* query) const
|
||||
{
|
||||
ASSERT(Mode() == (int32)kByNameItem);
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>(FindView("TextControl"));
|
||||
BTextControl* textControl
|
||||
= dynamic_cast<BTextControl*>(FindView("TextControl"));
|
||||
ASSERT(textControl);
|
||||
|
||||
query->PushAttr("name");
|
||||
query->PushString(textControl->TextView()->Text(), true);
|
||||
|
||||
if (strstr(textControl->TextView()->Text(), "*"))
|
||||
if (strstr(textControl->TextView()->Text(), "*")) {
|
||||
// assume pattern is a regular expression and try doing an exact match
|
||||
query->PushOp(B_EQ);
|
||||
else
|
||||
} else
|
||||
query->PushOp(B_CONTAINS);
|
||||
|
||||
PushMimeType(query);
|
||||
@ -1446,14 +1474,16 @@ FindPanel::SwitchMode(uint32 mode)
|
||||
bounds.bottom -= 10;
|
||||
if (fLatch->Value())
|
||||
bounds.bottom -= kMoreOptionsDelta;
|
||||
box->ResizeTo(bounds.Width(), BoxHeightForMode(mode, fLatch->Value() != 0));
|
||||
box->ResizeTo(bounds.Width(), BoxHeightForMode(mode,
|
||||
fLatch->Value() != 0));
|
||||
|
||||
RemoveByAttributeItems();
|
||||
ShowOrHideMimeTypeMenu();
|
||||
AddByNameOrFormulaItems();
|
||||
|
||||
if (buffer.Length()) {
|
||||
ASSERT(mode == kByFormulaItem || oldMode == kByAttributeItem);
|
||||
ASSERT(mode == kByFormulaItem
|
||||
|| oldMode == kByAttributeItem);
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>
|
||||
(FindView("TextControl"));
|
||||
textControl->SetText(buffer.String());
|
||||
@ -1492,9 +1522,11 @@ FindPanel::CurrentMimeType(const char** type) const
|
||||
// search for marked item in the list
|
||||
BMenuItem* item = MimeTypeMenu()->FindMarked();
|
||||
|
||||
// if it's one of the most used items, ignore it
|
||||
if (item != NULL && MimeTypeMenu()->IndexOf(item) != 0 && item->Submenu() == NULL)
|
||||
if (item != NULL && MimeTypeMenu()->IndexOf(item) != 0
|
||||
&& item->Submenu() == NULL) {
|
||||
// if it's one of the most used items, ignore it
|
||||
item = NULL;
|
||||
}
|
||||
|
||||
if (item == NULL) {
|
||||
for (int32 index = MimeTypeMenu()->CountItems(); index-- > 0;) {
|
||||
@ -1536,7 +1568,7 @@ FindPanel::SetCurrentMimeType(BMenuItem* item)
|
||||
fMimeTypeField->MenuItem()->SetLabel(item->Label());
|
||||
|
||||
BMenuItem* search;
|
||||
for (int32 i = 2;(search = MimeTypeMenu()->ItemAt(i)) != NULL;i++) {
|
||||
for (int32 i = 2; (search = MimeTypeMenu()->ItemAt(i)) != NULL; i++) {
|
||||
if (item == search || !search->Label())
|
||||
continue;
|
||||
if (!strcmp(item->Label(),search->Label())) {
|
||||
@ -1583,12 +1615,14 @@ FindPanel::SetCurrentMimeType(const char* label)
|
||||
if (submenu != NULL && !found) {
|
||||
for (int32 subIndex = submenu->CountItems(); subIndex-- > 0;) {
|
||||
BMenuItem* subItem = submenu->ItemAt(subIndex);
|
||||
if (subItem->Label() != NULL && !strcmp(label, subItem->Label())) {
|
||||
if (subItem->Label() != NULL
|
||||
&& !strcmp(label, subItem->Label())) {
|
||||
subItem->SetMarked(true);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (item->Label() != NULL && !strcmp(label, item->Label())) {
|
||||
item->SetMarked(true);
|
||||
return B_OK;
|
||||
@ -1615,8 +1649,9 @@ FindPanel::AddOneMimeTypeToMenu(const ShortMimeInfo* info, void* castToMenu)
|
||||
BMessage* msg = new BMessage(kMIMETypeItem);
|
||||
msg->AddString("mimetype", info->InternalName());
|
||||
|
||||
superItem->Submenu()->AddItem(new IconMenuItem(info->ShortDescription(),
|
||||
msg, info->InternalName(), B_MINI_ICON));
|
||||
superItem->Submenu()->AddItem(new IconMenuItem(
|
||||
info->ShortDescription(), msg, info->InternalName(),
|
||||
B_MINI_ICON));
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -1628,8 +1663,8 @@ FindPanel::AddMimeTypesToMenu()
|
||||
{
|
||||
BMessage* itemMessage = new BMessage(kMIMETypeItem);
|
||||
itemMessage->AddString("mimetype", kAllMimeTypes);
|
||||
MimeTypeMenu()->AddItem(new BMenuItem(B_TRANSLATE("All files and folders"),
|
||||
itemMessage));
|
||||
MimeTypeMenu()->AddItem(
|
||||
new BMenuItem(B_TRANSLATE("All files and folders"), itemMessage));
|
||||
MimeTypeMenu()->AddSeparatorItem();
|
||||
MimeTypeMenu()->ItemAt(0)->SetMarked(true);
|
||||
|
||||
@ -1777,8 +1812,8 @@ AddOneRecentItem(const entry_ref* ref, void* castToParams)
|
||||
|
||||
|
||||
void
|
||||
FindPanel::AddRecentQueries(BMenu* menu, bool addSaveAsItem, const BMessenger* target,
|
||||
uint32 what)
|
||||
FindPanel::AddRecentQueries(BMenu* menu, bool addSaveAsItem,
|
||||
const BMessenger* target, uint32 what)
|
||||
{
|
||||
BObjectList<entry_ref> templates(10, true);
|
||||
BObjectList<EntryWithDate> recentQueries(10, true);
|
||||
@ -1788,7 +1823,8 @@ FindPanel::AddRecentQueries(BMenu* menu, bool addSaveAsItem, const BMessenger* t
|
||||
BVolume volume;
|
||||
roster.Rewind();
|
||||
while (roster.GetNextVolume(&volume) == B_OK) {
|
||||
if (volume.IsPersistent() && volume.KnowsQuery() && volume.KnowsAttr()) {
|
||||
if (volume.IsPersistent() && volume.KnowsQuery()
|
||||
&& volume.KnowsAttr()) {
|
||||
|
||||
BQuery query;
|
||||
query.SetVolume(&volume);
|
||||
@ -2046,9 +2082,11 @@ FindPanel::SaveWindowState(BNode* node, bool editTemplate)
|
||||
saveMoreOptions.searchTrash = fSearchTrashCheck->Value() != 0;
|
||||
saveMoreOptions.temporary = fTemporaryCheck->Value() != 0;
|
||||
|
||||
if (node->WriteAttr(kAttrQueryMoreOptions, B_RAW_TYPE, 0, &saveMoreOptions,
|
||||
sizeof(saveMoreOptions)) == sizeof(saveMoreOptions))
|
||||
if (node->WriteAttr(kAttrQueryMoreOptions, B_RAW_TYPE, 0,
|
||||
&saveMoreOptions,
|
||||
sizeof(saveMoreOptions)) == sizeof(saveMoreOptions)) {
|
||||
node->RemoveAttr(kAttrQueryMoreOptionsForeign);
|
||||
}
|
||||
|
||||
if (editTemplate) {
|
||||
if (UserSpecifiedName()) {
|
||||
@ -2059,36 +2097,37 @@ FindPanel::SaveWindowState(BNode* node, bool editTemplate)
|
||||
|
||||
switch (Mode()) {
|
||||
case kByAttributeItem:
|
||||
{
|
||||
BMessage message;
|
||||
int32 count = fAttrViewList.CountItems();
|
||||
node->WriteAttr(kAttrQueryInitialNumAttrs, B_INT32_TYPE, 0,
|
||||
&count, sizeof(int32));
|
||||
{
|
||||
BMessage message;
|
||||
int32 count = fAttrViewList.CountItems();
|
||||
node->WriteAttr(kAttrQueryInitialNumAttrs, B_INT32_TYPE, 0,
|
||||
&count, sizeof(int32));
|
||||
|
||||
for (int32 index = 0; index < count; index++)
|
||||
fAttrViewList.ItemAt(index)->SaveState(&message, index);
|
||||
for (int32 index = 0; index < count; index++)
|
||||
fAttrViewList.ItemAt(index)->SaveState(&message, index);
|
||||
|
||||
ssize_t size = message.FlattenedSize();
|
||||
char* buffer = new char[size];
|
||||
status_t result = message.Flatten(buffer, size);
|
||||
if (result == B_OK) {
|
||||
node->WriteAttr(kAttrQueryInitialAttrs, B_MESSAGE_TYPE, 0,
|
||||
buffer, (size_t)size);
|
||||
}
|
||||
delete [] buffer;
|
||||
ssize_t size = message.FlattenedSize();
|
||||
char* buffer = new char[size];
|
||||
status_t result = message.Flatten(buffer, size);
|
||||
if (result == B_OK) {
|
||||
node->WriteAttr(kAttrQueryInitialAttrs, B_MESSAGE_TYPE, 0,
|
||||
buffer, (size_t)size);
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
break;
|
||||
}
|
||||
|
||||
case kByNameItem:
|
||||
case kByFormulaItem:
|
||||
{
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>
|
||||
(FindView("TextControl"));
|
||||
ASSERT(textControl);
|
||||
BString formula(textControl->TextView()->Text());
|
||||
node->WriteAttrString(kAttrQueryInitialString, &formula);
|
||||
break;
|
||||
}
|
||||
{
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>
|
||||
(FindView("TextControl"));
|
||||
ASSERT(textControl);
|
||||
BString formula(textControl->TextView()->Text());
|
||||
node->WriteAttrString(kAttrQueryInitialString, &formula);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2169,7 +2208,8 @@ FindPanel::RestoreWindowState(const BNode* node)
|
||||
// set modification message after checking the temporary check box,
|
||||
// and filling out the text control so that we do not
|
||||
// always trigger clearing of the temporary check box.
|
||||
fQueryName->SetModificationMessage(new BMessage(kNameModifiedMessage));
|
||||
fQueryName->SetModificationMessage(
|
||||
new BMessage(kNameModifiedMessage));
|
||||
}
|
||||
|
||||
// get volumes to perform query on
|
||||
@ -2178,23 +2218,25 @@ FindPanel::RestoreWindowState(const BNode* node)
|
||||
attr_info info;
|
||||
if (node->GetAttrInfo(kAttrQueryVolume, &info) == B_OK) {
|
||||
char* buffer = new char[info.size];
|
||||
if (node->ReadAttr(kAttrQueryVolume, B_MESSAGE_TYPE, 0, buffer, (size_t)info.size)
|
||||
== info.size) {
|
||||
if (node->ReadAttr(kAttrQueryVolume, B_MESSAGE_TYPE, 0, buffer,
|
||||
(size_t)info.size) == info.size) {
|
||||
BMessage message;
|
||||
if (message.Unflatten(buffer) == B_OK) {
|
||||
for (int32 index = 0; ;index++) {
|
||||
ASSERT(index < 100);
|
||||
BVolume volume;
|
||||
// match a volume with the info embedded in the message
|
||||
status_t result = MatchArchivedVolume(&volume, &message, index);
|
||||
// match a volume with the info embedded in
|
||||
// the message
|
||||
status_t result = MatchArchivedVolume(&volume, &message,
|
||||
index);
|
||||
if (result == B_OK) {
|
||||
char name[256];
|
||||
volume.GetName(name);
|
||||
SelectItemWithLabel(fVolMenu, name);
|
||||
searchAllVolumes = false;
|
||||
} else if (result != B_DEV_BAD_DRIVE_NUM)
|
||||
// if B_DEV_BAD_DRIVE_NUM, the volume just isn't mounted this
|
||||
// time around, keep looking for more
|
||||
// if B_DEV_BAD_DRIVE_NUM, the volume just isn't
|
||||
// mounted this time around, keep looking for more
|
||||
// if other error, bail
|
||||
break;
|
||||
}
|
||||
@ -2208,37 +2250,40 @@ FindPanel::RestoreWindowState(const BNode* node)
|
||||
|
||||
switch (Mode()) {
|
||||
case kByAttributeItem:
|
||||
{
|
||||
int32 count = InitialAttrCount(node);
|
||||
{
|
||||
int32 count = InitialAttrCount(node);
|
||||
|
||||
attr_info info;
|
||||
if (node->GetAttrInfo(kAttrQueryInitialAttrs, &info) != B_OK)
|
||||
break;
|
||||
char* buffer = new char[info.size];
|
||||
if (node->ReadAttr(kAttrQueryInitialAttrs, B_MESSAGE_TYPE, 0, buffer, (size_t)info.size)
|
||||
== info.size) {
|
||||
BMessage message;
|
||||
if (message.Unflatten(buffer) == B_OK)
|
||||
for (int32 index = 0; index < count; index++)
|
||||
fAttrViewList.ItemAt(index)->RestoreState(message, index);
|
||||
}
|
||||
delete [] buffer;
|
||||
attr_info info;
|
||||
if (node->GetAttrInfo(kAttrQueryInitialAttrs, &info) != B_OK)
|
||||
break;
|
||||
char* buffer = new char[info.size];
|
||||
if (node->ReadAttr(kAttrQueryInitialAttrs, B_MESSAGE_TYPE, 0,
|
||||
buffer, (size_t)info.size) == info.size) {
|
||||
BMessage message;
|
||||
if (message.Unflatten(buffer) == B_OK)
|
||||
for (int32 index = 0; index < count; index++) {
|
||||
fAttrViewList.ItemAt(index)->RestoreState(message,
|
||||
index);
|
||||
}
|
||||
}
|
||||
delete[] buffer;
|
||||
break;
|
||||
}
|
||||
|
||||
case kByNameItem:
|
||||
case kByFormulaItem:
|
||||
{
|
||||
BString buffer;
|
||||
if (node->ReadAttrString(kAttrQueryInitialString, &buffer) == B_OK) {
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>
|
||||
(FindView("TextControl"));
|
||||
ASSERT(textControl);
|
||||
{
|
||||
BString buffer;
|
||||
if (node->ReadAttrString(kAttrQueryInitialString, &buffer)
|
||||
== B_OK) {
|
||||
BTextControl* textControl = dynamic_cast<BTextControl*>
|
||||
(FindView("TextControl"));
|
||||
ASSERT(textControl);
|
||||
|
||||
textControl->TextView()->SetText(buffer.String());
|
||||
}
|
||||
textControl->TextView()->SetText(buffer.String());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// try to restore focus and possibly text selection
|
||||
@ -2304,7 +2349,8 @@ FindPanel::AddByNameOrFormulaItems()
|
||||
|
||||
BRect bounds(box->Bounds());
|
||||
bounds.InsetBy(10, 10);
|
||||
BTextControl* textControl = new BTextControl(bounds, "TextControl", "", "", NULL);
|
||||
BTextControl* textControl = new BTextControl(bounds, "TextControl",
|
||||
"", "", NULL);
|
||||
textControl->SetDivider(0.0f);
|
||||
box->AddChild(textControl);
|
||||
textControl->MakeFocus();
|
||||
@ -2353,7 +2399,8 @@ FindPanel::RemoveByAttributeItems()
|
||||
void
|
||||
FindPanel::ShowOrHideMimeTypeMenu()
|
||||
{
|
||||
BMenuField* menuField = dynamic_cast<BMenuField*>(FindView("MimeTypeMenu"));
|
||||
BMenuField* menuField
|
||||
= dynamic_cast<BMenuField*>(FindView("MimeTypeMenu"));
|
||||
if (Mode() == (int32)kByFormulaItem && !menuField->IsHidden())
|
||||
menuField->Hide();
|
||||
else if (menuField->IsHidden())
|
||||
@ -2398,8 +2445,8 @@ TAttrView::TAttrView(BRect frame, int32 index)
|
||||
for (int32 i = 0; i < 5; i++) {
|
||||
message = new BMessage(kAttributeItem);
|
||||
message->AddInt32("operator", operators[i]);
|
||||
submenu->AddItem(new BMenuItem(B_TRANSLATE_NOCOLLECT(operatorLabels[i]),
|
||||
message));
|
||||
submenu->AddItem(new BMenuItem(B_TRANSLATE_NOCOLLECT(
|
||||
operatorLabels[i]), message));
|
||||
}
|
||||
|
||||
// mark first item
|
||||
@ -2464,7 +2511,7 @@ TAttrView::TAttrView(BRect frame, int32 index)
|
||||
AddChild(fTextControl);
|
||||
|
||||
AddChild(fMenuField);
|
||||
// add attributes from currently selected mimetype
|
||||
// add attributes from currently selected mimetype
|
||||
}
|
||||
|
||||
|
||||
@ -2558,7 +2605,8 @@ TAttrView::SaveState(BMessage* message, int32)
|
||||
if (field) {
|
||||
BMenuItem* item = field->Menu()->FindMarked();
|
||||
ASSERT(item);
|
||||
message->AddInt32("logicalRelation", item ? field->Menu()->IndexOf(item) : 0);
|
||||
message->AddInt32("logicalRelation",
|
||||
item ? field->Menu()->IndexOf(item) : 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2618,7 +2666,8 @@ TAttrView::Draw(BRect)
|
||||
// draws the is/contains, etc. string
|
||||
bounds.left -= (width + 10);
|
||||
bounds.bottom -= 6;
|
||||
DrawString(item->Submenu()->FindMarked()->Label(), bounds.LeftBottom());
|
||||
DrawString(item->Submenu()->FindMarked()->Label(),
|
||||
bounds.LeftBottom());
|
||||
}
|
||||
}
|
||||
|
||||
@ -2677,15 +2726,19 @@ TAttrView::AddAttributes(BMenu* menu, const BMimeType &mimeType)
|
||||
// go through each field in meta mime and add it to a menu
|
||||
for (int32 index = 0; ; index++) {
|
||||
const char* publicName;
|
||||
if (attributeMessage.FindString("attr:public_name", index, &publicName) != B_OK)
|
||||
if (attributeMessage.FindString("attr:public_name", index,
|
||||
&publicName) != B_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!attributeMessage.FindBool("attr:viewable"))
|
||||
continue;
|
||||
|
||||
const char* attributeName;
|
||||
if (attributeMessage.FindString("attr:name", index, &attributeName) != B_OK)
|
||||
if (attributeMessage.FindString("attr:name", index, &attributeName)
|
||||
!= B_OK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int32 type;
|
||||
if (attributeMessage.FindInt32("attr:type", index, &type) != B_OK)
|
||||
@ -2714,7 +2767,8 @@ TAttrView::AddAttributes(BMenu* menu, const BMimeType &mimeType)
|
||||
|
||||
message = new BMessage(kAttributeItem);
|
||||
message->AddInt32("operator", B_NE);
|
||||
submenu->AddItem(new BMenuItem(B_TRANSLATE("is not"), message));
|
||||
submenu->AddItem(new BMenuItem(B_TRANSLATE("is not"),
|
||||
message));
|
||||
submenu->SetTargetForItems(this);
|
||||
|
||||
message = new BMessage(kAttributeItem);
|
||||
@ -2942,12 +2996,14 @@ DeleteTransientQueriesTask::ProcessOneRef(Model* model)
|
||||
ASSERT(dynamic_cast<TTracker*>(be_app));
|
||||
|
||||
// check that it is not showing
|
||||
if (dynamic_cast<TTracker*>(be_app)->EntryHasWindowOpen(model->EntryRef())) {
|
||||
if (dynamic_cast<TTracker*>(be_app)->EntryHasWindowOpen(
|
||||
model->EntryRef())) {
|
||||
PRINT(("query %s, showing, can't delete\n", model->Name()));
|
||||
return false;
|
||||
}
|
||||
|
||||
PRINT(("query %s, old, temporary, not shownig - deleting\n", model->Name()));
|
||||
PRINT(("query %s, old, temporary, not shownig - deleting\n",
|
||||
model->Name()));
|
||||
BEntry entry(model->EntryRef());
|
||||
entry.Remove();
|
||||
|
||||
@ -2993,8 +3049,8 @@ DeleteTransientQueriesTask::StartUpTransientQueryCleaner()
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
RecentFindItemsMenu::RecentFindItemsMenu(const char* title, const BMessenger* target,
|
||||
uint32 what)
|
||||
RecentFindItemsMenu::RecentFindItemsMenu(const char* title,
|
||||
const BMessenger* target, uint32 what)
|
||||
: BMenu(title, B_ITEMS_IN_COLUMN),
|
||||
fTarget(*target),
|
||||
fWhat(what)
|
||||
@ -3029,7 +3085,8 @@ TrackerBuildRecentFindItemsMenu(const char* title)
|
||||
|
||||
|
||||
DraggableQueryIcon::DraggableQueryIcon(BRect frame, const char* name,
|
||||
const BMessage* message, BMessenger messenger, uint32 resizeFlags, uint32 flags)
|
||||
const BMessage* message, BMessenger messenger, uint32 resizeFlags,
|
||||
uint32 flags)
|
||||
: DraggableIcon(frame, name, B_QUERY_MIMETYPE, B_LARGE_ICON,
|
||||
message, messenger, resizeFlags, flags)
|
||||
{
|
||||
@ -3056,7 +3113,8 @@ DraggableQueryIcon::DragStarted(BMessage* dragMessage)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
MostUsedNames::MostUsedNames(const char* fileName, const char* directory, int32 maxCount)
|
||||
MostUsedNames::MostUsedNames(const char* fileName, const char* directory,
|
||||
int32 maxCount)
|
||||
:
|
||||
fFileName(fileName),
|
||||
fDirectory(directory),
|
||||
@ -3157,7 +3215,8 @@ MostUsedNames::AddName(const char* name)
|
||||
list_entry* entry = NULL;
|
||||
|
||||
if (fList.CountItems() > fCount * 2) {
|
||||
entry = static_cast<list_entry*>(fList.RemoveItem(fList.CountItems() - 1));
|
||||
entry = static_cast<list_entry*>(
|
||||
fList.RemoveItem(fList.CountItems() - 1));
|
||||
|
||||
// is this the name we want to add here?
|
||||
if (strcmp(name, entry->name)) {
|
||||
@ -3169,9 +3228,12 @@ MostUsedNames::AddName(const char* name)
|
||||
}
|
||||
|
||||
if (entry == NULL) {
|
||||
for (int32 i = 0; (entry = static_cast<list_entry*>(fList.ItemAt(i))) != NULL; i++)
|
||||
for (int32 i = 0;
|
||||
(entry = static_cast<list_entry*>(fList.ItemAt(i))) != NULL;
|
||||
i++) {
|
||||
if (!strcmp(entry->name, name))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry == NULL) {
|
||||
|
@ -176,8 +176,10 @@ TGroupedMenu::TGroupedMenu(const char* name)
|
||||
TGroupedMenu::~TGroupedMenu()
|
||||
{
|
||||
TMenuItemGroup* group;
|
||||
while ((group = static_cast<TMenuItemGroup*>(fGroups.RemoveItem(0L))) != NULL)
|
||||
while ((group = static_cast<TMenuItemGroup*>(fGroups.RemoveItem(0L)))
|
||||
!= NULL) {
|
||||
delete group;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -247,7 +249,8 @@ TGroupedMenu::CountGroups()
|
||||
|
||||
|
||||
void
|
||||
TGroupedMenu::AddGroupItem(TMenuItemGroup* group, BMenuItem* item, int32 atIndex)
|
||||
TGroupedMenu::AddGroupItem(TMenuItemGroup* group, BMenuItem* item,
|
||||
int32 atIndex)
|
||||
{
|
||||
int32 groupIndex = fGroups.IndexOf(group);
|
||||
bool addSeparator = false;
|
||||
@ -257,7 +260,8 @@ TGroupedMenu::AddGroupItem(TMenuItemGroup* group, BMenuItem* item, int32 atIndex
|
||||
if (groupIndex > 0) {
|
||||
// add this group after an existing one
|
||||
TMenuItemGroup* previous = GroupAt(groupIndex - 1);
|
||||
group->fFirstItemIndex = previous->fFirstItemIndex + previous->fItemsTotal;
|
||||
group->fFirstItemIndex = previous->fFirstItemIndex
|
||||
+ previous->fItemsTotal;
|
||||
addSeparator = true;
|
||||
} else {
|
||||
// this is the first group
|
||||
@ -283,7 +287,8 @@ TGroupedMenu::AddGroupItem(TMenuItemGroup* group, BMenuItem* item, int32 atIndex
|
||||
|
||||
// insert item for real
|
||||
|
||||
AddItem(item, atIndex + group->fFirstItemIndex + (group->HasSeparator() ? 1 : 0));
|
||||
AddItem(item,
|
||||
atIndex + group->fFirstItemIndex + (group->HasSeparator() ? 1 : 0));
|
||||
|
||||
// move the groups after this one
|
||||
|
||||
@ -320,4 +325,3 @@ TGroupedMenu::RemoveGroupItem(TMenuItemGroup* group, BMenuItem* item)
|
||||
group->fFirstItemIndex -= removedSeparator ? 2 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -242,13 +242,17 @@ IconCacheEntry::IconHitTest(BPoint where, IconDrawMode mode, icon_size size) con
|
||||
|
||||
|
||||
BBitmap*
|
||||
IconCacheEntry::ConstructBitmap(BBitmap* constructFrom, IconDrawMode requestedMode,
|
||||
IconDrawMode constructFromMode, icon_size size, LazyBitmapAllocator* lazyBitmap)
|
||||
IconCacheEntry::ConstructBitmap(BBitmap* constructFrom,
|
||||
IconDrawMode requestedMode, IconDrawMode constructFromMode,
|
||||
icon_size size, LazyBitmapAllocator* lazyBitmap)
|
||||
{
|
||||
ASSERT(requestedMode == kSelected && constructFromMode == kNormalIcon);
|
||||
// for now
|
||||
if (requestedMode == kSelected && constructFromMode == kNormalIcon)
|
||||
return IconCache::sIconCache->MakeSelectedIcon(constructFrom, size, lazyBitmap);
|
||||
|
||||
if (requestedMode == kSelected && constructFromMode == kNormalIcon) {
|
||||
return IconCache::sIconCache->MakeSelectedIcon(constructFrom, size,
|
||||
lazyBitmap);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -260,7 +264,8 @@ IconCacheEntry::ConstructBitmap(IconDrawMode requestedMode, icon_size size,
|
||||
{
|
||||
BBitmap* source = (size == B_MINI_ICON) ? fMiniIcon : fLargeIcon;
|
||||
ASSERT(source);
|
||||
return ConstructBitmap(source, requestedMode, kNormalIcon, size, lazyBitmap);
|
||||
return ConstructBitmap(source, requestedMode, kNormalIcon, size,
|
||||
lazyBitmap);
|
||||
}
|
||||
|
||||
|
||||
@ -303,14 +308,13 @@ IconCache::IconCache()
|
||||
}
|
||||
|
||||
|
||||
// The following calls use the icon lookup sequence node-prefered app for node-
|
||||
// metamime-preferred app for metamime to find an icon;
|
||||
// The following calls use the icon lookup sequence node-prefered app for
|
||||
// node-metamime-preferred app for metamime to find an icon;
|
||||
// if we are trying to get a specialized icon, we will first look for a normal
|
||||
// icon in each of the locations, if we get a hit, we look for the specialized,
|
||||
// if we don't find one, we try to auto-construct one, if we can't we assume the
|
||||
// icon is not available
|
||||
// for now the code only looks for normal icons, selected icons are auto-generated
|
||||
|
||||
// icon in each of the locations, if we get a hit, we look for the
|
||||
// specialized, if we don't find one, we try to auto-construct one, if we
|
||||
// can't we assume the icon is not available for now the code only looks for
|
||||
// normal icons, selected icons are auto-generated
|
||||
IconCacheEntry*
|
||||
IconCache::GetIconForPreferredApp(const char* fileTypeSignature,
|
||||
const char* preferredApp, IconDrawMode mode, icon_size size,
|
||||
@ -336,20 +340,24 @@ IconCache::GetIconForPreferredApp(const char* fileTypeSignature,
|
||||
|
||||
if (!entry || !entry->HaveIconBitmap(NORMAL_ICON_ONLY, size)) {
|
||||
|
||||
PRINT_DISK_HITS(("File %s; Line %d # hitting disk for preferredApp %s, type %s\n",
|
||||
PRINT_DISK_HITS(
|
||||
("File %s; Line %d # hitting disk for preferredApp %s, type %s\n",
|
||||
__FILE__, __LINE__, preferredApp, fileTypeSignature));
|
||||
|
||||
BMimeType preferredAppType(preferredApp);
|
||||
BString signature(fileTypeSignature);
|
||||
signature.ToLower();
|
||||
if (preferredAppType.GetIconForType(signature.String(), lazyBitmap->Get(),
|
||||
size) != B_OK)
|
||||
if (preferredAppType.GetIconForType(signature.String(),
|
||||
lazyBitmap->Get(), size) != B_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BBitmap* bitmap = lazyBitmap->Adopt();
|
||||
if (!entry) {
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry for preferredApp %s, type %s\n",
|
||||
__FILE__, __LINE__, preferredApp, fileTypeSignature));
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry for preferredApp %s, "
|
||||
"type %s\n", __FILE__, __LINE__, preferredApp,
|
||||
fileTypeSignature));
|
||||
entry = fSharedCache.AddItem(fileTypeSignature, preferredApp);
|
||||
}
|
||||
entry->SetIcon(bitmap, kNormalIcon, size);
|
||||
@ -394,8 +402,10 @@ IconCache::GetIconFromMetaMime(const char* fileType, IconDrawMode mode,
|
||||
return NULL;
|
||||
|
||||
SharedCacheEntry* aliasTo = NULL;
|
||||
if (entry)
|
||||
aliasTo = (SharedCacheEntry*)entry->ResolveIfAlias(&fSharedCache);
|
||||
if (entry) {
|
||||
aliasTo
|
||||
= (SharedCacheEntry*)entry->ResolveIfAlias(&fSharedCache);
|
||||
}
|
||||
|
||||
// look for icon defined by preferred app from metamime
|
||||
aliasTo = (SharedCacheEntry*)GetIconForPreferredApp(fileType,
|
||||
@ -407,7 +417,8 @@ IconCache::GetIconFromMetaMime(const char* fileType, IconDrawMode mode,
|
||||
// make an aliased entry so that the next time we get a
|
||||
// hit on the first FindItem in here
|
||||
if (!entry) {
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry as alias for type %s\n",
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry as alias for type %s\n",
|
||||
__FILE__, __LINE__, fileType));
|
||||
entry = fSharedCache.AddItem(&aliasTo, fileType);
|
||||
entry->SetAliasFor(&fSharedCache, aliasTo);
|
||||
@ -489,8 +500,9 @@ IconCache::GetIconFromFileTypes(ModelNodeLazyOpener* modelOpener,
|
||||
lazyBitmap, entry);
|
||||
#if DEBUG
|
||||
else
|
||||
PRINT(("File %s; Line %d # failed to get supertype for type %s\n",
|
||||
__FILE__, __LINE__, fileType));
|
||||
PRINT(
|
||||
("File %s; Line %d # failed to get supertype for "
|
||||
"type %s\n", __FILE__, __LINE__, fileType));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -503,15 +515,20 @@ IconCache::GetIconFromFileTypes(ModelNodeLazyOpener* modelOpener,
|
||||
// make an aliased entry so that the next time we get a
|
||||
// hit and substitute a generic icon right away
|
||||
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry as alias for preferredApp %s, type %s\n",
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry as alias for "
|
||||
"preferredApp %s, type %s\n",
|
||||
__FILE__, __LINE__, nodePreferredApp, fileType));
|
||||
IconCacheEntry* aliasedEntry = fSharedCache.AddItem((SharedCacheEntry**)&entry,
|
||||
fileType, nodePreferredApp);
|
||||
aliasedEntry->SetAliasFor(&fSharedCache, (SharedCacheEntry*)entry);
|
||||
IconCacheEntry* aliasedEntry
|
||||
= fSharedCache.AddItem((SharedCacheEntry**)&entry, fileType,
|
||||
nodePreferredApp);
|
||||
aliasedEntry->SetAliasFor(&fSharedCache,
|
||||
(SharedCacheEntry*)entry);
|
||||
// OK to cast here, have a runtime check
|
||||
source = kPreferredAppForNode;
|
||||
// set source as preferred for node, so that next time we get a hit in
|
||||
// the initial find that uses GetIconForPreferredApp
|
||||
// set source as preferred for node, so that next time we
|
||||
// get a hit in the initial find that uses
|
||||
// GetIconForPreferredApp
|
||||
} else
|
||||
source = kMetaMime;
|
||||
#if DEBUG
|
||||
@ -542,8 +559,8 @@ IconCache::GetVolumeIcon(AutoLock<SimpleIconCache>*nodeCacheLocker,
|
||||
|
||||
if (source == kTrackerDefault) {
|
||||
// if tracker default, resolved entry is from shared cache
|
||||
// this could be done a little cleaner if entry had a way to reach
|
||||
// the cache it is in
|
||||
// this could be done a little cleaner if entry had a way to
|
||||
// reach the cache it is in
|
||||
*resultingOpenCache = sharedCacheLocker;
|
||||
sharedCacheLocker->Lock();
|
||||
}
|
||||
@ -563,7 +580,8 @@ IconCache::GetVolumeIcon(AutoLock<SimpleIconCache>*nodeCacheLocker,
|
||||
BBitmap* bitmap = lazyBitmap->Get();
|
||||
GetTrackerResources()->GetIconResource(R_ShareIcon, size, bitmap);
|
||||
if (!entry) {
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry for model %s\n",
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry for model %s\n",
|
||||
__FILE__, __LINE__, model->Name()));
|
||||
entry = fNodeCache.AddItem(model->NodeRef());
|
||||
}
|
||||
@ -573,7 +591,8 @@ IconCache::GetVolumeIcon(AutoLock<SimpleIconCache>*nodeCacheLocker,
|
||||
BBitmap* bitmap = lazyBitmap->Adopt();
|
||||
ASSERT(bitmap);
|
||||
if (!entry) {
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry for model %s\n",
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry for model %s\n",
|
||||
__FILE__, __LINE__, model->Name()));
|
||||
entry = fNodeCache.AddItem(model->NodeRef());
|
||||
}
|
||||
@ -584,7 +603,8 @@ IconCache::GetVolumeIcon(AutoLock<SimpleIconCache>*nodeCacheLocker,
|
||||
*resultingOpenCache = sharedCacheLocker;
|
||||
sharedCacheLocker->Lock();
|
||||
|
||||
// If the volume doesnt have a device it should have the generic icon
|
||||
// If the volume doesnt have a device it should have
|
||||
// the generic icon
|
||||
entry = GetIconFromMetaMime(B_VOLUME_MIMETYPE, mode,
|
||||
size, lazyBitmap, entry);
|
||||
}
|
||||
@ -754,8 +774,10 @@ IconCache::GetNodeIcon(ModelNodeLazyOpener* modelOpener,
|
||||
status_t result;
|
||||
if (file)
|
||||
result = GetAppIconFromAttr(file, lazyBitmap->Get(), size);
|
||||
else
|
||||
result = GetFileIconFromAttr(model->Node(), lazyBitmap->Get(), size);
|
||||
else {
|
||||
result = GetFileIconFromAttr(model->Node(), lazyBitmap->Get(),
|
||||
size);
|
||||
}
|
||||
|
||||
if (result == B_OK) {
|
||||
// node has it's own icon, use it
|
||||
@ -806,7 +828,8 @@ IconCache::GetGenericIcon(AutoLock<SimpleIconCache>* sharedCacheLocker,
|
||||
|
||||
// make an aliased entry so that the next time we get a
|
||||
// hit and substitute a generic icon right away
|
||||
PRINT_ADD_ITEM(("File %s; Line %d # adding entry for preferredApp %s, type %s\n",
|
||||
PRINT_ADD_ITEM(
|
||||
("File %s; Line %d # adding entry for preferredApp %s, type %s\n",
|
||||
__FILE__, __LINE__, model->PreferredAppSignature(),
|
||||
model->MimeType()));
|
||||
IconCacheEntry* aliasedEntry = fSharedCache.AddItem(
|
||||
@ -913,9 +936,9 @@ IconCache::Preload(AutoLock<SimpleIconCache>* nodeCacheLocker,
|
||||
model, source, mode, size, &lazyBitmap, entry);
|
||||
}
|
||||
}
|
||||
|
||||
// update the icon source
|
||||
model->SetIconFrom(source);
|
||||
|
||||
} else {
|
||||
// we already know where the icon should come from,
|
||||
// use shortcuts to get it
|
||||
@ -1001,18 +1024,21 @@ IconCache::Preload(AutoLock<SimpleIconCache>* nodeCacheLocker,
|
||||
|
||||
if (!entry || !entry->HaveIconBitmap(mode, size)) {
|
||||
// we don't have an icon, go with the generic
|
||||
PRINT(("icon cache complete miss, falling back on generic icon for %s\n",
|
||||
model->Name()));
|
||||
PRINT(
|
||||
("icon cache complete miss, falling back on generic icon "
|
||||
"for %s\n", model->Name()));
|
||||
entry = GetGenericIcon(sharedCacheLocker, &resultingOpenCache,
|
||||
model, source, mode, size, &lazyBitmap, entry);
|
||||
|
||||
// we don't even have generic, something is really broken,
|
||||
// go with hardcoded generic icon
|
||||
if (!entry || !entry->HaveIconBitmap(mode, size)) {
|
||||
PRINT(("icon cache complete miss, falling back on generic icon for %s\n",
|
||||
model->Name()));
|
||||
entry = GetFallbackIcon(sharedCacheLocker, &resultingOpenCache,
|
||||
model, mode, size, &lazyBitmap, entry);
|
||||
PRINT(
|
||||
("icon cache complete miss, falling back on generic "
|
||||
"icon for %s\n", model->Name()));
|
||||
entry = GetFallbackIcon(sharedCacheLocker,
|
||||
&resultingOpenCache, model, mode, size, &lazyBitmap,
|
||||
entry);
|
||||
}
|
||||
|
||||
// force icon pick up next time around because we probably just
|
||||
@ -1061,8 +1087,9 @@ IconCache::Draw(Model* model, BView* view, BPoint where, IconDrawMode mode,
|
||||
|
||||
|
||||
void
|
||||
IconCache::SyncDraw(Model* model, BView* view, BPoint where, IconDrawMode mode,
|
||||
icon_size size, void (*blitFunc)(BView*, BPoint, BBitmap*, void*),
|
||||
IconCache::SyncDraw(Model* model, BView* view, BPoint where,
|
||||
IconDrawMode mode, icon_size size,
|
||||
void (*blitFunc)(BView*, BPoint, BBitmap*, void*),
|
||||
void* passThruState)
|
||||
{
|
||||
AutoLock<SimpleIconCache> nodeCacheLocker(&fNodeCache, false);
|
||||
@ -1083,12 +1110,14 @@ IconCache::SyncDraw(Model* model, BView* view, BPoint where, IconDrawMode mode,
|
||||
|
||||
|
||||
void
|
||||
IconCache::Preload(Model* model, IconDrawMode mode, icon_size size, bool permanent)
|
||||
IconCache::Preload(Model* model, IconDrawMode mode, icon_size size,
|
||||
bool permanent)
|
||||
{
|
||||
AutoLock<SimpleIconCache> nodeCacheLocker(&fNodeCache, false);
|
||||
AutoLock<SimpleIconCache> sharedCacheLocker(&fSharedCache, false);
|
||||
|
||||
Preload(&nodeCacheLocker, &sharedCacheLocker, 0, model, mode, size, permanent);
|
||||
Preload(&nodeCacheLocker, &sharedCacheLocker, 0, model, mode, size,
|
||||
permanent);
|
||||
}
|
||||
|
||||
|
||||
@ -1358,9 +1387,8 @@ IconCacheEntry::RetireIcons(BObjectList<BBitmap>* retiredBitmapList)
|
||||
|
||||
|
||||
// In debug mode keep the hash table sizes small so that they grow a lot and
|
||||
// execercise the resizing code a lot. In release mode allocate them large up-front
|
||||
// for better performance
|
||||
|
||||
// execercise the resizing code a lot. In release mode allocate them large
|
||||
// up-front for better performance
|
||||
SharedIconCache::SharedIconCache()
|
||||
#if DEBUG
|
||||
: SimpleIconCache("Shared Icon cache aka \"The Dead-Locker\""),
|
||||
@ -1397,26 +1425,31 @@ SharedIconCache::Draw(IconCacheEntry* entry, BView* view, BPoint where,
|
||||
|
||||
|
||||
SharedCacheEntry*
|
||||
SharedIconCache::FindItem(const char* fileType, const char* appSignature) const
|
||||
SharedIconCache::FindItem(const char* fileType,
|
||||
const char* appSignature) const
|
||||
{
|
||||
ASSERT(fileType);
|
||||
if (!fileType)
|
||||
fileType = B_FILE_MIMETYPE;
|
||||
|
||||
SharedCacheEntry* result = fHashTable.FindFirst(SharedCacheEntry::Hash(fileType,
|
||||
appSignature));
|
||||
SharedCacheEntry* result
|
||||
= fHashTable.FindFirst(SharedCacheEntry::Hash(fileType,
|
||||
appSignature));
|
||||
|
||||
if (!result)
|
||||
return NULL;
|
||||
|
||||
for(;;) {
|
||||
if (result->fFileType == fileType && result->fAppSignature == appSignature)
|
||||
if (result->fFileType == fileType
|
||||
&& result->fAppSignature == appSignature) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (result->fNext < 0)
|
||||
break;
|
||||
|
||||
result = const_cast<SharedCacheEntry*>(&fElementArray.At(result->fNext));
|
||||
result
|
||||
= const_cast<SharedCacheEntry*>(&fElementArray.At(result->fNext));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -1438,8 +1471,8 @@ SharedIconCache::AddItem(const char* fileType, const char* appSignature)
|
||||
|
||||
|
||||
SharedCacheEntry*
|
||||
SharedIconCache::AddItem(SharedCacheEntry** outstandingEntry, const char* fileType,
|
||||
const char* appSignature)
|
||||
SharedIconCache::AddItem(SharedCacheEntry** outstandingEntry,
|
||||
const char* fileType, const char* appSignature)
|
||||
{
|
||||
int32 entryToken = fHashTable.ElementIndex(*outstandingEntry);
|
||||
ASSERT(entryToken >= 0);
|
||||
@ -1481,7 +1514,8 @@ SharedIconCache::RemoveAliasesTo(int32 aliasIndex)
|
||||
|
||||
|
||||
void
|
||||
SharedIconCache::SetAliasFor(IconCacheEntry* alias, const SharedCacheEntry* original) const
|
||||
SharedIconCache::SetAliasFor(IconCacheEntry* alias,
|
||||
const SharedCacheEntry* original) const
|
||||
{
|
||||
alias->fAliasForIndex = fHashTable.ElementIndex(original);
|
||||
}
|
||||
@ -1493,7 +1527,8 @@ SharedCacheEntry::SharedCacheEntry()
|
||||
}
|
||||
|
||||
|
||||
SharedCacheEntry::SharedCacheEntry(const char* fileType, const char* appSignature)
|
||||
SharedCacheEntry::SharedCacheEntry(const char* fileType,
|
||||
const char* appSignature)
|
||||
: fNext(-1),
|
||||
fFileType(fileType),
|
||||
fAppSignature(appSignature)
|
||||
@ -1502,8 +1537,8 @@ SharedCacheEntry::SharedCacheEntry(const char* fileType, const char* appSignatur
|
||||
|
||||
|
||||
void
|
||||
SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size size,
|
||||
bool async)
|
||||
SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode,
|
||||
icon_size size, bool async)
|
||||
{
|
||||
BBitmap* bitmap = IconForMode(mode, size);
|
||||
ASSERT(bitmap);
|
||||
@ -1529,8 +1564,9 @@ SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size s
|
||||
|
||||
|
||||
void
|
||||
SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size size,
|
||||
void (*blitFunc)(BView*, BPoint, BBitmap*, void*), void* passThruState)
|
||||
SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode,
|
||||
icon_size size, void (*blitFunc)(BView*, BPoint, BBitmap*, void*),
|
||||
void* passThruState)
|
||||
{
|
||||
BBitmap* bitmap = IconForMode(mode, size);
|
||||
if (!bitmap)
|
||||
@ -1542,7 +1578,7 @@ SharedCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size s
|
||||
// } else {
|
||||
// view->SetDrawingMode(B_OP_OVER);
|
||||
// }
|
||||
//
|
||||
|
||||
(blitFunc)(view, where, bitmap, passThruState);
|
||||
}
|
||||
|
||||
@ -1572,7 +1608,8 @@ SharedCacheEntry::Hash() const
|
||||
bool
|
||||
SharedCacheEntry::operator==(const SharedCacheEntry &entry) const
|
||||
{
|
||||
return fFileType == entry.FileType() && fAppSignature == entry.AppSignature();
|
||||
return fFileType == entry.FileType()
|
||||
&& fAppSignature == entry.AppSignature();
|
||||
}
|
||||
|
||||
|
||||
@ -1616,8 +1653,8 @@ NodeCacheEntry::NodeCacheEntry(const node_ref* node, bool permanent)
|
||||
|
||||
|
||||
void
|
||||
NodeCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size size,
|
||||
bool async)
|
||||
NodeCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode,
|
||||
icon_size size, bool async)
|
||||
{
|
||||
BBitmap* bitmap = IconForMode(mode, size);
|
||||
if (!bitmap)
|
||||
@ -1646,8 +1683,9 @@ NodeCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size siz
|
||||
|
||||
|
||||
void
|
||||
NodeCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode, icon_size size,
|
||||
void (*blitFunc)(BView*, BPoint, BBitmap*, void*), void* passThruState)
|
||||
NodeCacheEntry::Draw(BView* view, BPoint where, IconDrawMode mode,
|
||||
icon_size size, void (*blitFunc)(BView*, BPoint, BBitmap*, void*),
|
||||
void* passThruState)
|
||||
{
|
||||
BBitmap* bitmap = IconForMode(mode, size);
|
||||
if (!bitmap)
|
||||
@ -1766,7 +1804,8 @@ NodeIconCache::FindItem(const node_ref* node) const
|
||||
if (result->fNext < 0)
|
||||
break;
|
||||
|
||||
result = const_cast<NodeCacheEntry*>(&fElementArray.At(result->fNext));
|
||||
result
|
||||
= const_cast<NodeCacheEntry*>(&fElementArray.At(result->fNext));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -1786,7 +1825,8 @@ NodeIconCache::AddItem(const node_ref* node, bool permanent)
|
||||
|
||||
|
||||
NodeCacheEntry*
|
||||
NodeIconCache::AddItem(NodeCacheEntry** outstandingEntry, const node_ref* node)
|
||||
NodeIconCache::AddItem(NodeCacheEntry** outstandingEntry,
|
||||
const node_ref* node)
|
||||
{
|
||||
int32 entryToken = fHashTable.ElementIndex(*outstandingEntry);
|
||||
|
||||
@ -1876,8 +1916,8 @@ SimpleIconCache::SimpleIconCache(const char* name)
|
||||
|
||||
|
||||
void
|
||||
SimpleIconCache::Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode ,
|
||||
icon_size , bool )
|
||||
SimpleIconCache::Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode,
|
||||
icon_size, bool)
|
||||
{
|
||||
TRESPASS();
|
||||
// pure virtual, do nothing
|
||||
@ -1885,8 +1925,8 @@ SimpleIconCache::Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode ,
|
||||
|
||||
|
||||
void
|
||||
SimpleIconCache::Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode, icon_size,
|
||||
void(*)(BView*, BPoint, BBitmap*, void*), void*)
|
||||
SimpleIconCache::Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode,
|
||||
icon_size, void(*)(BView*, BPoint, BBitmap*, void*), void*)
|
||||
{
|
||||
TRESPASS();
|
||||
// pure virtual, do nothing
|
||||
@ -1917,8 +1957,8 @@ SimpleIconCache::IsLocked() const
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
LazyBitmapAllocator::LazyBitmapAllocator(icon_size size, color_space colorSpace,
|
||||
bool preallocate)
|
||||
LazyBitmapAllocator::LazyBitmapAllocator(icon_size size,
|
||||
color_space colorSpace, bool preallocate)
|
||||
: fBitmap(NULL),
|
||||
fSize(size),
|
||||
fColorSpace(colorSpace)
|
||||
|
@ -49,13 +49,13 @@ All rights reserved.
|
||||
#include "Utilities.h"
|
||||
|
||||
|
||||
// Icon cache splits icons into two caches - the shared cache, likely to get the
|
||||
// most hits and the node cache. Every icon that is found in a mime based
|
||||
// structure goes into the shared cache, only files that have their own private
|
||||
// icon use the node cache;
|
||||
// Entries are only deleted from the shared cache if an icon for a mime type changes,
|
||||
// this makes async icon drawing easier. Node cache deletes it's entries whenever a
|
||||
// file gets deleted.
|
||||
// Icon cache splits icons into two caches - the shared cache, likely to
|
||||
// get the most hits and the node cache. Every icon that is found in a
|
||||
// mime-based structure goes into the shared cache, only files that have
|
||||
// their own private icon use the node cache;
|
||||
// Entries are only deleted from the shared cache if an icon for a mime type
|
||||
// changes, this makes async icon drawing easier. Node cache deletes it's
|
||||
// entries whenever a file gets deleted.
|
||||
|
||||
// if a view ever uses the cache to draw in async mode, it needs to call
|
||||
// it when it is being destroyed
|
||||
@ -100,13 +100,14 @@ enum IconDrawMode {
|
||||
// Where did an icon come from
|
||||
enum IconSource {
|
||||
kUnknownSource,
|
||||
kUnknownNotFromNode, // icon origin not known but determined not to be from
|
||||
// the node itself
|
||||
kTrackerDefault, // file has no type, Tracker provides generic, folder,
|
||||
// symlink or app
|
||||
kUnknownNotFromNode, // icon origin not known but determined not
|
||||
// to be from the node itself
|
||||
kTrackerDefault, // file has no type, Tracker provides generic,
|
||||
// folder, symlink or app
|
||||
kTrackerSupplied, // home directory, boot volume, trash, etc.
|
||||
kMetaMime, // from BMimeType
|
||||
kPreferredAppForType, // have a preferred application for a type, has an icon
|
||||
kPreferredAppForType, // have a preferred application for a type,
|
||||
// has an icon
|
||||
kPreferredAppForNode, // have a preferred application for this node,
|
||||
// has an icon
|
||||
kVolume,
|
||||
@ -117,17 +118,18 @@ enum IconSource {
|
||||
class IconCacheEntry {
|
||||
// aliased entries don't own their icons, just point
|
||||
// to some other entry that does
|
||||
|
||||
|
||||
// This is used for icons that are defined by a preferred app for
|
||||
// a metamime, types that do not have an icon get to point to
|
||||
// generic, etc.
|
||||
|
||||
|
||||
public:
|
||||
IconCacheEntry();
|
||||
~IconCacheEntry();
|
||||
|
||||
void SetAliasFor(const SharedIconCache*, const SharedCacheEntry*);
|
||||
static IconCacheEntry* ResolveIfAlias(const SharedIconCache*, IconCacheEntry*);
|
||||
static IconCacheEntry* ResolveIfAlias(const SharedIconCache*,
|
||||
IconCacheEntry*);
|
||||
IconCacheEntry* ResolveIfAlias(const SharedIconCache*);
|
||||
|
||||
void SetIcon(BBitmap* bitmap, IconDrawMode mode, icon_size size,
|
||||
@ -137,9 +139,9 @@ public:
|
||||
bool CanConstructBitmap(IconDrawMode mode, icon_size size) const;
|
||||
static bool AlternateModeForIconConstructing(IconDrawMode requestedMode,
|
||||
IconDrawMode &alternate, icon_size size);
|
||||
BBitmap* ConstructBitmap(BBitmap* constructFrom, IconDrawMode requestedMode,
|
||||
IconDrawMode constructFromMode, icon_size size,
|
||||
LazyBitmapAllocator*);
|
||||
BBitmap* ConstructBitmap(BBitmap* constructFrom,
|
||||
IconDrawMode requestedMode, IconDrawMode constructFromMode,
|
||||
icon_size size, LazyBitmapAllocator*);
|
||||
BBitmap* ConstructBitmap(IconDrawMode requestedMode, icon_size size,
|
||||
LazyBitmapAllocator*);
|
||||
// same as above, always uses normal icon as source
|
||||
@ -242,16 +244,18 @@ public:
|
||||
virtual void Draw(IconCacheEntry*, BView*, BPoint, IconDrawMode,
|
||||
icon_size, void (*)(BView*, BPoint, BBitmap*, void*), void* = NULL);
|
||||
|
||||
SharedCacheEntry* FindItem(const char* fileType, const char* appSignature = 0)
|
||||
const;
|
||||
SharedCacheEntry* AddItem(const char* fileType, const char* appSignature = 0);
|
||||
SharedCacheEntry* AddItem(SharedCacheEntry** outstandingEntry, const char* fileType,
|
||||
SharedCacheEntry* FindItem(const char* fileType,
|
||||
const char* appSignature = 0) const;
|
||||
SharedCacheEntry* AddItem(const char* fileType,
|
||||
const char* appSignature = 0);
|
||||
// same as previous AddItem, updates the pointer to outstandingEntry, because
|
||||
// adding to the hash table makes any pending pointer invalid
|
||||
SharedCacheEntry* AddItem(SharedCacheEntry** outstandingEntry,
|
||||
const char* fileType, const char* appSignature = 0);
|
||||
// same as previous AddItem, updates the pointer to outstandingEntry,
|
||||
// because adding to the hash table makes any pending pointer invalid
|
||||
void IconChanged(SharedCacheEntry*);
|
||||
|
||||
void SetAliasFor(IconCacheEntry* alias, const SharedCacheEntry* original) const;
|
||||
void SetAliasFor(IconCacheEntry* alias,
|
||||
const SharedCacheEntry* original) const;
|
||||
IconCacheEntry* ResolveIfAlias(IconCacheEntry* entry) const;
|
||||
int32 EntryIndex(const SharedCacheEntry* entry) const;
|
||||
|
||||
@ -261,9 +265,9 @@ private:
|
||||
OpenHashTable<SharedCacheEntry, SharedCacheEntryArray> fHashTable;
|
||||
SharedCacheEntryArray fElementArray;
|
||||
BObjectList<BBitmap> fRetiredBitmaps;
|
||||
// icons are drawn asynchronously, can't just delete them
|
||||
// right away, instead have to place them onto the retired bitmap list
|
||||
// and wait for the next sync to delete them
|
||||
// icons are drawn asynchronously, can't just delete them right away,
|
||||
// instead have to place them onto the retired bitmap list and wait
|
||||
// for the next sync to delete them
|
||||
};
|
||||
|
||||
|
||||
@ -317,11 +321,13 @@ public:
|
||||
|
||||
NodeCacheEntry* FindItem(const node_ref*) const;
|
||||
NodeCacheEntry* AddItem(const node_ref*, bool permanent = false);
|
||||
NodeCacheEntry* AddItem(NodeCacheEntry** outstandingEntry, const node_ref*);
|
||||
// same as previous AddItem, updates the pointer to outstandingEntry, because
|
||||
// adding to the hash table makes any pending pointer invalid
|
||||
NodeCacheEntry* AddItem(NodeCacheEntry** outstandingEntry,
|
||||
const node_ref*);
|
||||
// same as previous AddItem, updates the pointer to outstandingEntry,
|
||||
// because adding to the hash table makes any pending pointer invalid
|
||||
void Deleting(const node_ref*);
|
||||
// model for this node is getting deleted (not necessarily the node itself)
|
||||
// model for this node is getting deleted
|
||||
// (not necessarily the node itself)
|
||||
void Removing(const node_ref*);
|
||||
// used by permanent NodeIconCache entries, when an entry gets deleted
|
||||
void Deleting(const BView*);
|
||||
@ -406,12 +412,12 @@ private:
|
||||
IconCacheEntry* GetIconForPreferredApp(const char* mimeTypeSignature,
|
||||
const char* preferredApp, IconDrawMode mode, icon_size size,
|
||||
LazyBitmapAllocator*, IconCacheEntry*);
|
||||
IconCacheEntry* GetIconFromFileTypes(ModelNodeLazyOpener*, IconSource &source,
|
||||
IconCacheEntry* GetIconFromFileTypes(ModelNodeLazyOpener*,
|
||||
IconSource &source, IconDrawMode mode, icon_size size,
|
||||
LazyBitmapAllocator*, IconCacheEntry*);
|
||||
IconCacheEntry* GetIconFromMetaMime(const char* fileType,
|
||||
IconDrawMode mode, icon_size size, LazyBitmapAllocator*,
|
||||
IconCacheEntry*);
|
||||
IconCacheEntry* GetIconFromMetaMime(const char* fileType, IconDrawMode mode,
|
||||
icon_size size, LazyBitmapAllocator*,
|
||||
IconCacheEntry*);
|
||||
IconCacheEntry* GetVolumeIcon(AutoLock<SimpleIconCache>* nodeCache,
|
||||
AutoLock<SimpleIconCache>* sharedCache,
|
||||
AutoLock<SimpleIconCache>** resultingLockedCache,
|
||||
@ -431,12 +437,14 @@ private:
|
||||
AutoLock<SimpleIconCache>* nodeCache,
|
||||
AutoLock<SimpleIconCache>** resultingLockedCache,
|
||||
Model*, IconSource&, IconDrawMode mode,
|
||||
icon_size size, LazyBitmapAllocator*, IconCacheEntry*, bool permanent);
|
||||
icon_size size, LazyBitmapAllocator*, IconCacheEntry*,
|
||||
bool permanent);
|
||||
IconCacheEntry* GetGenericIcon(AutoLock<SimpleIconCache>* sharedCache,
|
||||
AutoLock<SimpleIconCache>** resultingLockedCache,
|
||||
Model*, IconSource&, IconDrawMode mode,
|
||||
icon_size size, LazyBitmapAllocator*, IconCacheEntry*);
|
||||
IconCacheEntry* GetFallbackIcon(AutoLock<SimpleIconCache>* sharedCacheLocker,
|
||||
IconCacheEntry* GetFallbackIcon(
|
||||
AutoLock<SimpleIconCache>* sharedCacheLocker,
|
||||
AutoLock<SimpleIconCache>** resultingOpenCache,
|
||||
Model* model, IconDrawMode mode, icon_size size,
|
||||
LazyBitmapAllocator* lazyBitmap, IconCacheEntry* entry);
|
||||
|
@ -120,7 +120,8 @@ class AttributeView : public BView {
|
||||
|
||||
BTextView* TextView() const { return fTitleEditView; }
|
||||
|
||||
static filter_result TextViewFilter(BMessage*, BHandler**, BMessageFilter*);
|
||||
static filter_result TextViewFilter(BMessage*, BHandler**,
|
||||
BMessageFilter*);
|
||||
|
||||
off_t LastSize() const;
|
||||
void SetLastSize(off_t);
|
||||
@ -278,7 +279,8 @@ OpenToolTipWindow(BScreen& screen, BRect rect, const char* name,
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
BInfoWindow::BInfoWindow(Model* model, int32 group_index, LockingList<BWindow>* list)
|
||||
BInfoWindow::BInfoWindow(Model* model, int32 group_index,
|
||||
LockingList<BWindow>* list)
|
||||
: BWindow(BInfoWindow::InfoWindowRect(false),
|
||||
"InfoWindow", B_TITLED_WINDOW,
|
||||
B_NOT_RESIZABLE | B_NOT_ZOOMABLE, B_CURRENT_WORKSPACE),
|
||||
@ -366,7 +368,8 @@ BInfoWindow::Show()
|
||||
AddChild(fAttributeView);
|
||||
|
||||
// position window appropriately based on index
|
||||
BRect windRect(InfoWindowRect(TargetModel()->IsSymLink() || TargetModel()->IsFile()));
|
||||
BRect windRect(InfoWindowRect(TargetModel()->IsSymLink()
|
||||
|| TargetModel()->IsFile()));
|
||||
if ((fIndex + 2) % 2 == 1) {
|
||||
windRect.OffsetBy(320, 0);
|
||||
fIndex--;
|
||||
@ -499,8 +502,9 @@ BInfoWindow::MessageReceived(BMessage* message)
|
||||
// We now have to re-target the broken symlink. Unfortunately,
|
||||
// there's no way to change the target of an existing symlink.
|
||||
// So we have to delete the old one and create a new one.
|
||||
// First, stop watching the broken node (we don't want this window
|
||||
// to quit when the node is removed.)
|
||||
// First, stop watching the broken node
|
||||
// (we don't want this window to quit when the node
|
||||
// is removed.)
|
||||
stop_watching(this);
|
||||
|
||||
// Get the parent
|
||||
@ -601,8 +605,10 @@ BInfoWindow::MessageReceived(BMessage* message)
|
||||
case B_STAT_CHANGED:
|
||||
case B_ATTR_CHANGED:
|
||||
fAttributeView->ModelChanged(TargetModel(), message);
|
||||
// must be called before the FilePermissionView::ModelChanged()
|
||||
// call, because it changes the model... (bad style!)
|
||||
// must be called before the
|
||||
// FilePermissionView::ModelChanged()
|
||||
// call, because it changes the model...
|
||||
// (bad style!)
|
||||
|
||||
if (fPermissionsView != NULL)
|
||||
fPermissionsView->ModelChanged(TargetModel());
|
||||
@ -610,13 +616,15 @@ BInfoWindow::MessageReceived(BMessage* message)
|
||||
|
||||
case B_DEVICE_UNMOUNTED:
|
||||
{
|
||||
// We were watching a volume that is no longer mounted,
|
||||
// we might as well quit
|
||||
// We were watching a volume that is no longer
|
||||
// mounted, we might as well quit
|
||||
node_ref itemNode;
|
||||
// Only the device information is available
|
||||
message->FindInt32("device", &itemNode.device);
|
||||
if (TargetModel()->NodeRef()->device == itemNode.device)
|
||||
if (TargetModel()->NodeRef()->device
|
||||
== itemNode.device) {
|
||||
Close();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@ -629,8 +637,10 @@ BInfoWindow::MessageReceived(BMessage* message)
|
||||
case kPermissionsSelected:
|
||||
if (fPermissionsView == NULL) {
|
||||
// Only true on first call.
|
||||
fPermissionsView = new FilePermissionsView(BRect(kBorderWidth + 1,
|
||||
fAttributeView->Bounds().bottom, fAttributeView->Bounds().right,
|
||||
fPermissionsView
|
||||
= new FilePermissionsView(BRect(kBorderWidth + 1,
|
||||
fAttributeView->Bounds().bottom,
|
||||
fAttributeView->Bounds().right,
|
||||
fAttributeView->Bounds().bottom+80), fModel);
|
||||
|
||||
ResizeBy(0, fPermissionsView->Bounds().Height());
|
||||
@ -661,7 +671,7 @@ BInfoWindow::GetSizeString(BString &result, off_t size, int32 fileCount)
|
||||
char sizeBuffer[128];
|
||||
result << string_for_size((double)size, sizeBuffer, sizeof(sizeBuffer));
|
||||
|
||||
// when we show the byte size, format it with a thousands delimiter (comma)
|
||||
// when we show the byte size, format it with a thousands delimiter
|
||||
// TODO: use BCountry::FormatNumber
|
||||
if (size >= kKBSize) {
|
||||
char numStr[128];
|
||||
@ -784,7 +794,8 @@ BInfoWindow::CalcSize(void* castToWindow)
|
||||
void
|
||||
BInfoWindow::SetSizeStr(const char* sizeStr)
|
||||
{
|
||||
AttributeView* view = dynamic_cast<AttributeView *>(FindView("attr_view"));
|
||||
AttributeView* view
|
||||
= dynamic_cast<AttributeView *>(FindView("attr_view"));
|
||||
if (view)
|
||||
view->SetSizeStr(sizeStr);
|
||||
}
|
||||
@ -803,7 +814,8 @@ BInfoWindow::OpenFilePanel(const entry_ref* ref)
|
||||
false, &message);
|
||||
|
||||
if (fFilePanel != NULL) {
|
||||
fFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, B_TRANSLATE("Select"));
|
||||
fFilePanel->SetButtonLabel(B_DEFAULT_BUTTON,
|
||||
B_TRANSLATE("Select"));
|
||||
fFilePanel->Window()->ResizeTo(500, 300);
|
||||
BString title(B_TRANSLATE_COMMENT("Link \"%name\" to:",
|
||||
"File dialog title for new sym link"));
|
||||
@ -826,7 +838,8 @@ BInfoWindow::OpenFilePanel(const entry_ref* ref)
|
||||
|
||||
|
||||
AttributeView::AttributeView(BRect rect, Model* model)
|
||||
: BView(rect, "attr_view", B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_PULSE_NEEDED),
|
||||
: BView(rect, "attr_view", B_FOLLOW_ALL_SIDES,
|
||||
B_WILL_DRAW | B_PULSE_NEEDED),
|
||||
fDivider(0),
|
||||
fPreferredAppMenu(NULL),
|
||||
fModel(model),
|
||||
@ -873,9 +886,12 @@ AttributeView::AttributeView(BRect rect, Model* model)
|
||||
fTitleRect.left = fIconRect.right + 5;
|
||||
fTitleRect.top = 0;
|
||||
fTitleRect.bottom = fontMetrics.ascent + 1;
|
||||
fTitleRect.right = min_c(fTitleRect.left + currentFont.StringWidth(fModel->Name()), Bounds().Width() - 5);
|
||||
fTitleRect.right = min_c(
|
||||
fTitleRect.left + currentFont.StringWidth(fModel->Name()),
|
||||
Bounds().Width() - 5);
|
||||
// Offset so that it centers with the icon
|
||||
fTitleRect.OffsetBy(0, fIconRect.top + ((fIconRect.Height() - fTitleRect.Height()) / 2));
|
||||
fTitleRect.OffsetBy(0,
|
||||
fIconRect.top + ((fIconRect.Height() - fTitleRect.Height()) / 2));
|
||||
// Make some room for the border for when we are in edit mode
|
||||
// (Negative numbers increase the size of the rect)
|
||||
fTitleRect.InsetBy(-1, -2);
|
||||
@ -904,8 +920,10 @@ AttributeView::AttributeView(BRect rect, Model* model)
|
||||
BRect preferredAppRect(kBorderWidth + kBorderMargin,
|
||||
fTitleRect.bottom + (lineHeight * 7),
|
||||
Bounds().Width() - 5, fTitleRect.bottom + (lineHeight * 8));
|
||||
fPreferredAppMenu = new BMenuField(preferredAppRect, "", "", new BPopUpMenu(""));
|
||||
fDivider = currentFont.StringWidth(B_TRANSLATE("Opens with:")) + 5;
|
||||
fPreferredAppMenu = new BMenuField(preferredAppRect, "", "",
|
||||
new BPopUpMenu(""));
|
||||
fDivider = currentFont.StringWidth(B_TRANSLATE("Opens with:"))
|
||||
+ 5;
|
||||
fPreferredAppMenu->SetDivider(fDivider);
|
||||
fDivider += (preferredAppRect.left - 2);
|
||||
fPreferredAppMenu->SetFont(¤tFont);
|
||||
@ -928,8 +946,10 @@ AttributeView::AttributeView(BRect rect, Model* model)
|
||||
|
||||
for (int32 index = 0; ; index++) {
|
||||
const char* signature;
|
||||
if (supportingAppList.FindString("applications", index, &signature) != B_OK)
|
||||
if (supportingAppList.FindString("applications", index,
|
||||
&signature) != B_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Only add separator item if there are more items
|
||||
if (index == 0)
|
||||
@ -1020,7 +1040,8 @@ AttributeView::InitStrings(const Model* model)
|
||||
|
||||
// If the BPath is initialized, then check the file for existence
|
||||
if (traversedPath.InitCheck() == B_OK) {
|
||||
BEntry entry(traversedPath.Path(), false); // look at the target itself
|
||||
BEntry entry(traversedPath.Path(), false);
|
||||
// look at the target itself
|
||||
if (entry.InitCheck() == B_OK && entry.Exists())
|
||||
linked = true;
|
||||
}
|
||||
@ -1034,8 +1055,10 @@ AttributeView::InitStrings(const Model* model)
|
||||
if (!linked)
|
||||
fLinkToStr += " (broken)"; // link points to missing object
|
||||
} else if (model->IsExecutable()) {
|
||||
if (((Model*)model)->GetLongVersionString(fDescStr, B_APP_VERSION_KIND) == B_OK) {
|
||||
// we want a flat string, so we replace all newlines/tabs with spaces
|
||||
if (((Model*)model)->GetLongVersionString(fDescStr,
|
||||
B_APP_VERSION_KIND) == B_OK) {
|
||||
// we want a flat string, so replace all newlines and tabs
|
||||
// with spaces
|
||||
fDescStr.ReplaceAll('\n', ' ');
|
||||
fDescStr.ReplaceAll('\t', ' ');
|
||||
} else
|
||||
@ -1097,10 +1120,10 @@ AttributeView::ModelChanged(Model* model, BMessage* message)
|
||||
// ensure notification is for us
|
||||
if (*model->NodeRef() == itemNode
|
||||
// For volumes, the device ID is obviously not handled in a
|
||||
// consistent way; the node monitor sends us the ID of the parent
|
||||
// device, while the model is set to the device of the volume
|
||||
// directly - this hack works for volumes that are mounted in
|
||||
// the root directory
|
||||
// consistent way; the node monitor sends us the ID of the
|
||||
// parent device, while the model is set to the device of the
|
||||
// volume directly - this hack works for volumes that are
|
||||
// mounted in the root directory
|
||||
|| (model->IsVolume()
|
||||
&& itemNode.device == 1
|
||||
&& itemNode.node == model->NodeRef()->node)) {
|
||||
@ -1167,8 +1190,8 @@ AttributeView::ModelChanged(Model* model, BMessage* message)
|
||||
|
||||
fModel = model;
|
||||
if (fModel->IsSymLink()) {
|
||||
// if we are looking at a symlink, deference the model and look at the
|
||||
// target
|
||||
// if we are looking at a symlink, deference the model and look
|
||||
// at the target
|
||||
Model* resolvedModel = new Model(model->EntryRef(), true, true);
|
||||
if (resolvedModel->InitCheck() == B_OK) {
|
||||
if (fIconModel != fModel)
|
||||
@ -1245,7 +1268,8 @@ AttributeView::MouseDown(BPoint point)
|
||||
} else if (fTitleEditView) {
|
||||
FinishEditingTitle(true);
|
||||
} else if (fSizeRect.Contains(point)) {
|
||||
if (fModel->IsDirectory() && !fModel->IsVolume() && !fModel->IsRoot()) {
|
||||
if (fModel->IsDirectory() && !fModel->IsVolume()
|
||||
&& !fModel->IsRoot()) {
|
||||
InvertRect(fSizeRect);
|
||||
fTrackingState = size_track;
|
||||
} else
|
||||
@ -1253,13 +1277,16 @@ AttributeView::MouseDown(BPoint point)
|
||||
} else if (fIconRect.Contains(point)) {
|
||||
uint32 buttons;
|
||||
Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
||||
if (((modifiers() & B_CONTROL_KEY) != 0) || (buttons & B_SECONDARY_MOUSE_BUTTON) != 0) {
|
||||
if (((modifiers() & B_CONTROL_KEY) != 0)
|
||||
|| (buttons & B_SECONDARY_MOUSE_BUTTON) != 0) {
|
||||
// Show contextual menu
|
||||
BPopUpMenu* contextMenu = new BPopUpMenu("FileContext", false, false);
|
||||
BPopUpMenu* contextMenu
|
||||
= new BPopUpMenu("FileContext", false, false);
|
||||
if (contextMenu) {
|
||||
BuildContextMenu(contextMenu);
|
||||
contextMenu->SetAsyncAutoDestruct(true);
|
||||
contextMenu->Go(ConvertToScreen(point), true, true, ConvertToScreen(fIconRect));
|
||||
contextMenu->Go(ConvertToScreen(point), true, true,
|
||||
ConvertToScreen(fIconRect));
|
||||
}
|
||||
} else {
|
||||
// Check to see if the point is actually on part of the icon,
|
||||
@ -1268,21 +1295,25 @@ AttributeView::MouseDown(BPoint point)
|
||||
BPoint offsetPoint;
|
||||
offsetPoint.x = point.x - fIconRect.left;
|
||||
offsetPoint.y = point.y - fIconRect.top;
|
||||
if (IconCache::sIconCache->IconHitTest(offsetPoint, fIconModel, kNormalIcon, B_LARGE_ICON)) {
|
||||
if (IconCache::sIconCache->IconHitTest(offsetPoint, fIconModel,
|
||||
kNormalIcon, B_LARGE_ICON)) {
|
||||
// Can't drag the trash anywhere..
|
||||
fTrackingState = fModel->IsTrash() ? open_only_track : icon_track;
|
||||
fTrackingState = fModel->IsTrash()
|
||||
? open_only_track : icon_track;
|
||||
|
||||
// Check for possible double click
|
||||
if (abs((int32)(fClickPoint.x - point.x)) < kDragSlop
|
||||
&& abs((int32)(fClickPoint.y - point.y)) < kDragSlop) {
|
||||
int32 clickCount;
|
||||
Window()->CurrentMessage()->FindInt32("clicks", &clickCount);
|
||||
Window()->CurrentMessage()->FindInt32("clicks",
|
||||
&clickCount);
|
||||
|
||||
// This checks the* previous* click point
|
||||
if (clickCount == 2) {
|
||||
offsetPoint.x = fClickPoint.x - fIconRect.left;
|
||||
offsetPoint.y = fClickPoint.y - fIconRect.top;
|
||||
fDoubleClick = IconCache::sIconCache->IconHitTest(offsetPoint,
|
||||
fDoubleClick
|
||||
= IconCache::sIconCache->IconHitTest(offsetPoint,
|
||||
fIconModel, kNormalIcon, B_LARGE_ICON);
|
||||
}
|
||||
}
|
||||
@ -1301,7 +1332,8 @@ AttributeView::MouseMoved(BPoint point, uint32, const BMessage* message)
|
||||
// Highlight Drag target
|
||||
if (message && message->ReturnAddress() != BMessenger(this)
|
||||
&& message->what == B_SIMPLE_DATA
|
||||
&& BPoseView::CanHandleDragSelection(fModel, message, (modifiers() & B_CONTROL_KEY) != 0)) {
|
||||
&& BPoseView::CanHandleDragSelection(fModel, message,
|
||||
(modifiers() & B_CONTROL_KEY) != 0)) {
|
||||
bool overTarget = fIconRect.Contains(point);
|
||||
SetDrawingMode(B_OP_OVER);
|
||||
if (overTarget != fIsDropTarget) {
|
||||
@ -1334,19 +1366,23 @@ AttributeView::MouseMoved(BPoint point, uint32, const BMessage* message)
|
||||
break;
|
||||
|
||||
case icon_track:
|
||||
if (fMouseDown && !fDragging && (abs((int32)(point.x - fClickPoint.x)) > kDragSlop
|
||||
|| abs((int32)(point.y - fClickPoint.y)) > kDragSlop)) {
|
||||
if (fMouseDown && !fDragging
|
||||
&& (abs((int32)(point.x - fClickPoint.x)) > kDragSlop
|
||||
|| abs((int32)(point.y - fClickPoint.y)) > kDragSlop)) {
|
||||
// Find the required height
|
||||
BFont font;
|
||||
GetFont(&font);
|
||||
font.SetSize(kAttribFontHeight);
|
||||
|
||||
float height = CurrentFontHeight(kAttribFontHeight) + fIconRect.Height() + 8;
|
||||
float height = CurrentFontHeight(kAttribFontHeight)
|
||||
+ fIconRect.Height() + 8;
|
||||
BRect rect(0, 0, min_c(fIconRect.Width()
|
||||
+ font.StringWidth(fModel->Name()) + 4, fIconRect.Width() * 3), height);
|
||||
+ font.StringWidth(fModel->Name()) + 4,
|
||||
fIconRect.Width() * 3), height);
|
||||
BBitmap* dragBitmap = new BBitmap(rect, B_RGBA32, true);
|
||||
dragBitmap->Lock();
|
||||
BView* view = new BView(dragBitmap->Bounds(), "", B_FOLLOW_NONE, 0);
|
||||
BView* view = new BView(dragBitmap->Bounds(), "",
|
||||
B_FOLLOW_NONE, 0);
|
||||
dragBitmap->AddChild(view);
|
||||
view->SetOrigin(0, 0);
|
||||
BRect clipRect(view->Bounds());
|
||||
@ -1358,23 +1394,27 @@ AttributeView::MouseMoved(BPoint point, uint32, const BMessage* message)
|
||||
view->SetHighColor(0, 0, 0, 0);
|
||||
view->FillRect(view->Bounds());
|
||||
view->SetDrawingMode(B_OP_ALPHA);
|
||||
view->SetHighColor(0, 0, 0, 128); // set the level of transparency by value
|
||||
view->SetHighColor(0, 0, 0, 128);
|
||||
// set the level of transparency by value
|
||||
view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE);
|
||||
|
||||
// Draw the icon
|
||||
float hIconOffset = (rect.Width() - fIconRect.Width()) / 2;
|
||||
IconCache::sIconCache->Draw(fIconModel, view, BPoint(hIconOffset, 0),
|
||||
kNormalIcon, B_LARGE_ICON, true);
|
||||
IconCache::sIconCache->Draw(fIconModel, view,
|
||||
BPoint(hIconOffset, 0), kNormalIcon, B_LARGE_ICON, true);
|
||||
|
||||
// See if we need to truncate the string
|
||||
BString nameString(fModel->Name());
|
||||
if (view->StringWidth(fModel->Name()) > rect.Width())
|
||||
view->TruncateString(&nameString, B_TRUNCATE_END, rect.Width() - 5);
|
||||
if (view->StringWidth(fModel->Name()) > rect.Width()) {
|
||||
view->TruncateString(&nameString, B_TRUNCATE_END,
|
||||
rect.Width() - 5);
|
||||
}
|
||||
|
||||
// Draw the label
|
||||
font_height fontHeight;
|
||||
font.GetHeight(&fontHeight);
|
||||
float leftText = (view->StringWidth(nameString.String()) - fIconRect.Width()) / 2;
|
||||
float leftText = (view->StringWidth(nameString.String())
|
||||
- fIconRect.Width()) / 2;
|
||||
view->MovePenTo(BPoint(hIconOffset - leftText + 2,
|
||||
fIconRect.Height() + (fontHeight.ascent + 2)));
|
||||
view->DrawString(nameString.String());
|
||||
@ -1391,9 +1431,11 @@ AttributeView::MouseMoved(BPoint point, uint32, const BMessage* message)
|
||||
message.AddInt32("buttons", (int32)button);
|
||||
|
||||
message.AddInt32("be:actions",
|
||||
(modifiers() & B_OPTION_KEY) != 0 ? B_COPY_TARGET : B_MOVE_TARGET);
|
||||
(modifiers() & B_OPTION_KEY) != 0
|
||||
? B_COPY_TARGET : B_MOVE_TARGET);
|
||||
message.AddRef("refs", fModel->EntryRef());
|
||||
DragMessage(&message, dragBitmap, B_OP_ALPHA, BPoint((fClickPoint.x - fIconRect.left)
|
||||
DragMessage(&message, dragBitmap, B_OP_ALPHA,
|
||||
BPoint((fClickPoint.x - fIconRect.left)
|
||||
+ hIconOffset, fClickPoint.y - fIconRect.top), this);
|
||||
fDragging = true;
|
||||
}
|
||||
@ -1413,47 +1455,57 @@ AttributeView::MouseMoved(BPoint point, uint32, const BMessage* message)
|
||||
BPoint point;
|
||||
GetMouse(&point, &buttons);
|
||||
if (Window()->IsActive() && !buttons) {
|
||||
// If we are down here, then that means that we're tracking the mouse
|
||||
// but not from a mouse down. In this case, we're just interested in
|
||||
// knowing whether or not we need to display the "pop-up" version
|
||||
// of the path or link text.
|
||||
// If we are down here, then that means that we're tracking
|
||||
// the mouse but not from a mouse down. In this case, we're
|
||||
// just interested in knowing whether or not we need to
|
||||
// display the "pop-up" version of the path or link text.
|
||||
BScreen screen(Window());
|
||||
BFont font;
|
||||
GetFont(&font);
|
||||
font.SetSize(kAttribFontHeight);
|
||||
float maxWidth = (Bounds().Width() - (fDivider + kBorderMargin));
|
||||
float maxWidth = (Bounds().Width()
|
||||
- (fDivider + kBorderMargin));
|
||||
|
||||
if (fPathRect.Contains(point)
|
||||
&& font.StringWidth(fPathStr.String()) > maxWidth) {
|
||||
fTrackingState = no_track;
|
||||
BRect rect(fPathRect);
|
||||
rect.OffsetBy(Window()->Frame().left, Window()->Frame().top);
|
||||
rect.OffsetBy(Window()->Frame().left,
|
||||
Window()->Frame().top);
|
||||
|
||||
if (!fPathWindow || BMessenger(fPathWindow).IsValid() == false) {
|
||||
fPathWindow = OpenToolTipWindow(screen, rect, "fPathWindow",
|
||||
fPathStr.String(), BMessenger(this),
|
||||
if (!fPathWindow
|
||||
|| BMessenger(fPathWindow).IsValid() == false) {
|
||||
fPathWindow = OpenToolTipWindow(screen, rect,
|
||||
"fPathWindow", fPathStr.String(),
|
||||
BMessenger(this),
|
||||
new BMessage(kOpenLinkSource));
|
||||
}
|
||||
} else if (fLinkRect.Contains(point)
|
||||
&& font.StringWidth(fLinkToStr.String()) > maxWidth) {
|
||||
fTrackingState = no_track;
|
||||
BRect rect(fLinkRect);
|
||||
rect.OffsetBy(Window()->Frame().left, Window()->Frame().top);
|
||||
rect.OffsetBy(Window()->Frame().left,
|
||||
Window()->Frame().top);
|
||||
|
||||
if (!fLinkWindow || BMessenger(fLinkWindow).IsValid() == false) {
|
||||
fLinkWindow = OpenToolTipWindow(screen, rect, "fLinkWindow",
|
||||
fLinkToStr.String(), BMessenger(this),
|
||||
if (!fLinkWindow
|
||||
|| BMessenger(fLinkWindow).IsValid() == false) {
|
||||
fLinkWindow = OpenToolTipWindow(screen, rect,
|
||||
"fLinkWindow", fLinkToStr.String(),
|
||||
BMessenger(this),
|
||||
new BMessage(kOpenLinkTarget));
|
||||
}
|
||||
} else if (fDescRect.Contains(point)
|
||||
&& font.StringWidth(fDescStr.String()) > maxWidth) {
|
||||
fTrackingState = no_track;
|
||||
BRect rect(fDescRect);
|
||||
rect.OffsetBy(Window()->Frame().left, Window()->Frame().top);
|
||||
rect.OffsetBy(Window()->Frame().left,
|
||||
Window()->Frame().top);
|
||||
|
||||
if (!fDescWindow || BMessenger(fDescWindow).IsValid() == false) {
|
||||
fDescWindow = OpenToolTipWindow(screen, rect, "fDescWindow",
|
||||
fDescStr.String(), BMessenger(this), NULL);
|
||||
if (!fDescWindow
|
||||
|| BMessenger(fDescWindow).IsValid() == false) {
|
||||
fDescWindow = OpenToolTipWindow(screen, rect,
|
||||
"fDescWindow", fDescStr.String(),
|
||||
BMessenger(this), NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1509,12 +1561,13 @@ AttributeView::MouseUp(BPoint point)
|
||||
} else if (fTrackingState == path_track && fPathRect.Contains(point)) {
|
||||
InvertRect(fPathRect);
|
||||
OpenLinkSource();
|
||||
} else if ((fTrackingState == icon_track || fTrackingState == open_only_track)
|
||||
} else if ((fTrackingState == icon_track
|
||||
|| fTrackingState == open_only_track)
|
||||
&& fIconRect.Contains(point)) {
|
||||
// If it was a double click, then tell Tracker to open the item
|
||||
// The CurrentMessage() here does* not* have a "clicks" field,
|
||||
// which is why we are tracking the clicks with this temp var
|
||||
if (fDoubleClick){
|
||||
if (fDoubleClick) {
|
||||
// Double click, launch.
|
||||
BMessage message(B_REFS_RECEIVED);
|
||||
message.AddRef("refs", fModel->EntryRef());
|
||||
@ -1580,8 +1633,10 @@ AttributeView::CheckAndSetSize()
|
||||
StatStruct statBuf;
|
||||
BModelOpener opener(fModel);
|
||||
|
||||
if (fModel->InitCheck() != B_OK || fModel->Node()->GetStat(&statBuf) != B_OK)
|
||||
if (fModel->InitCheck() != B_OK
|
||||
|| fModel->Node()->GetStat(&statBuf) != B_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (fLastSize == statBuf.st_size)
|
||||
return;
|
||||
@ -1594,7 +1649,8 @@ AttributeView::CheckAndSetSize()
|
||||
|
||||
BRect bounds(Bounds());
|
||||
float lineHeight = CurrentFontHeight() + 2;
|
||||
bounds.Set(fDivider, fIconRect.bottom, bounds.right, fIconRect.bottom + lineHeight);
|
||||
bounds.Set(fDivider, fIconRect.bottom, bounds.right,
|
||||
fIconRect.bottom + lineHeight);
|
||||
Invalidate(bounds);
|
||||
}
|
||||
|
||||
@ -1606,8 +1662,10 @@ AttributeView::MessageReceived(BMessage* message)
|
||||
&& message->what == B_SIMPLE_DATA
|
||||
&& message->ReturnAddress() != BMessenger(this)
|
||||
&& fIconRect.Contains(ConvertFromScreen(message->DropPoint()))
|
||||
&& BPoseView::CanHandleDragSelection(fModel, message, (modifiers() & B_CONTROL_KEY) != 0)) {
|
||||
BPoseView::HandleDropCommon(message, fModel, 0, this, message->DropPoint());
|
||||
&& BPoseView::CanHandleDragSelection(fModel, message,
|
||||
(modifiers() & B_CONTROL_KEY) != 0)) {
|
||||
BPoseView::HandleDropCommon(message, fModel, 0, this,
|
||||
message->DropPoint());
|
||||
Invalidate(fIconRect);
|
||||
return;
|
||||
}
|
||||
@ -1679,7 +1737,8 @@ AttributeView::Draw(BRect)
|
||||
MovePenTo(BPoint(fIconRect.right + 6, lineBase));
|
||||
|
||||
// Recalculate the rect width
|
||||
fTitleRect.right = min_c(fTitleRect.left + currentFont.StringWidth(fModel->Name()),
|
||||
fTitleRect.right = min_c(
|
||||
fTitleRect.left + currentFont.StringWidth(fModel->Name()),
|
||||
Bounds().Width() - 5);
|
||||
// Check for possible need of truncation
|
||||
if (StringWidth(fModel->Name()) > fTitleRect.Width()) {
|
||||
@ -1718,12 +1777,14 @@ AttributeView::Draw(BRect)
|
||||
MovePenTo(BPoint(fDivider + kDrawMargin, lineBase));
|
||||
SetHighColor(kAttrValueColor);
|
||||
// Check for possible need of truncation
|
||||
if (StringWidth(fSizeStr.String()) > (Bounds().Width() - (fDivider + kBorderMargin))) {
|
||||
if (StringWidth(fSizeStr.String())
|
||||
> (Bounds().Width() - (fDivider + kBorderMargin))) {
|
||||
BString tmpString(fSizeStr.String());
|
||||
TruncateString(&tmpString, B_TRUNCATE_MIDDLE,
|
||||
Bounds().Width() - (fDivider + kBorderMargin));
|
||||
DrawString(tmpString.String());
|
||||
fSizeRect.right = fSizeRect.left + StringWidth(tmpString.String()) + 3;
|
||||
fSizeRect.right = fSizeRect.left + StringWidth(tmpString.String())
|
||||
+ 3;
|
||||
} else {
|
||||
DrawString(fSizeStr.String());
|
||||
fSizeRect.right = fSizeRect.left + StringWidth(fSizeStr.String()) + 3;
|
||||
@ -1752,7 +1813,8 @@ AttributeView::Draw(BRect)
|
||||
lineBase += lineHeight;
|
||||
|
||||
// Kind
|
||||
MovePenTo(BPoint(fDivider - (StringWidth(B_TRANSLATE("Kind:"))), lineBase));
|
||||
MovePenTo(BPoint(fDivider - (StringWidth(B_TRANSLATE("Kind:"))),
|
||||
lineBase));
|
||||
SetHighColor(kAttrTitleColor);
|
||||
DrawString(B_TRANSLATE("Kind:"));
|
||||
MovePenTo(BPoint(fDivider + kDrawMargin, lineBase));
|
||||
@ -1773,7 +1835,8 @@ AttributeView::Draw(BRect)
|
||||
SetHighColor(kLinkColor);
|
||||
|
||||
// Check for truncation
|
||||
if (StringWidth(fPathStr.String()) > (Bounds().Width() - (fDivider + kBorderMargin))) {
|
||||
if (StringWidth(fPathStr.String()) > (Bounds().Width()
|
||||
- (fDivider + kBorderMargin))) {
|
||||
BString nameString(fPathStr.String());
|
||||
TruncateString(&nameString, B_TRUNCATE_MIDDLE,
|
||||
Bounds().Width() - (fDivider + kBorderMargin));
|
||||
@ -1799,7 +1862,8 @@ AttributeView::Draw(BRect)
|
||||
SetHighColor(kLinkColor);
|
||||
|
||||
// Check for truncation
|
||||
if (StringWidth(fLinkToStr.String()) > (Bounds().Width() - (fDivider + kBorderMargin))) {
|
||||
if (StringWidth(fLinkToStr.String()) > (Bounds().Width()
|
||||
- (fDivider + kBorderMargin))) {
|
||||
BString nameString(fLinkToStr.String());
|
||||
TruncateString(&nameString, B_TRUNCATE_MIDDLE,
|
||||
Bounds().Width() - (fDivider + kBorderMargin));
|
||||
@ -1811,7 +1875,8 @@ AttributeView::Draw(BRect)
|
||||
fLinkRect.top = lineBase - fontMetrics.ascent;
|
||||
fLinkRect.bottom = lineBase + fontMetrics.descent;
|
||||
fLinkRect.left = fDivider + 2;
|
||||
fLinkRect.right = fLinkRect.left + StringWidth(fLinkToStr.String()) + 3;
|
||||
fLinkRect.right = fLinkRect.left + StringWidth(fLinkToStr.String())
|
||||
+ 3;
|
||||
|
||||
// No description field
|
||||
fDescRect = BRect(-1, -1, -1, -1);
|
||||
@ -1838,7 +1903,8 @@ AttributeView::Draw(BRect)
|
||||
MovePenTo(BPoint(fDivider + kDrawMargin, lineBase));
|
||||
SetHighColor(kAttrValueColor);
|
||||
// Check for truncation
|
||||
if (StringWidth(fDescStr.String()) > (Bounds().Width() - (fDivider + kBorderMargin))) {
|
||||
if (StringWidth(fDescStr.String()) > (Bounds().Width()
|
||||
- (fDivider + kBorderMargin))) {
|
||||
BString nameString(fDescStr.String());
|
||||
TruncateString(&nameString, B_TRUNCATE_MIDDLE,
|
||||
Bounds().Width() - (fDivider + kBorderMargin));
|
||||
@ -1873,8 +1939,9 @@ AttributeView::BeginEditingTitle()
|
||||
textRect.OffsetTo(0, 0);
|
||||
textRect.InsetBy(1, 1);
|
||||
|
||||
// Just make it some really large size, since we don't do any line wrapping.
|
||||
// The text filter will make sure to scroll the cursor into position
|
||||
// Just make it some really large size, since we don't do any line
|
||||
// wrapping. The text filter will make sure to scroll the cursor
|
||||
// into position
|
||||
|
||||
textRect.right = 2000;
|
||||
fTitleEditView = new BTextView(textFrame, "text_editor",
|
||||
@ -1911,7 +1978,8 @@ AttributeView::FinishEditingTitle(bool commit)
|
||||
|
||||
const char* text = fTitleEditView->Text();
|
||||
uint32 length = strlen(text);
|
||||
if (commit && strcmp(text, fModel->Name()) != 0 && length < B_FILE_NAME_LENGTH) {
|
||||
if (commit && strcmp(text, fModel->Name()) != 0
|
||||
&& length < B_FILE_NAME_LENGTH) {
|
||||
BEntry entry(fModel->EntryRef());
|
||||
BDirectory parent;
|
||||
if (entry.InitCheck() == B_OK
|
||||
@ -1936,7 +2004,8 @@ AttributeView::FinishEditingTitle(bool commit)
|
||||
GetFont(¤tFont);
|
||||
currentFont.SetSize(kTitleFontHeight);
|
||||
fTitleRect.right = min_c(fTitleRect.left
|
||||
+ currentFont.StringWidth(fTitleEditView->Text()), Bounds().Width() - 5);
|
||||
+ currentFont.StringWidth(fTitleEditView->Text()),
|
||||
Bounds().Width() - 5);
|
||||
}
|
||||
}
|
||||
} else if (length >= B_FILE_NAME_LENGTH) {
|
||||
@ -2081,12 +2150,14 @@ AttributeView::BuildContextMenu(BMenu* parent)
|
||||
|
||||
BMenuItem* sizeItem = NULL;
|
||||
if (model.IsDirectory() && !model.IsVolume() && !model.IsRoot()) {
|
||||
parent->AddItem(sizeItem = new BMenuItem(B_TRANSLATE("Recalculate folder size"),
|
||||
parent->AddItem(sizeItem
|
||||
= new BMenuItem(B_TRANSLATE("Recalculate folder size"),
|
||||
new BMessage(kRecalculateSize)));
|
||||
}
|
||||
|
||||
if (model.IsSymLink()) {
|
||||
parent->AddItem(sizeItem = new BMenuItem(B_TRANSLATE("Set new link target"),
|
||||
parent->AddItem(sizeItem
|
||||
= new BMenuItem(B_TRANSLATE("Set new link target"),
|
||||
new BMessage(kSetLinkTarget)));
|
||||
}
|
||||
|
||||
@ -2116,7 +2187,8 @@ AttributeView::SetPermissionsSwitchState(int32 state)
|
||||
|
||||
|
||||
filter_result
|
||||
AttributeView::TextViewFilter(BMessage* message, BHandler**, BMessageFilter* filter)
|
||||
AttributeView::TextViewFilter(BMessage* message, BHandler**,
|
||||
BMessageFilter* filter)
|
||||
{
|
||||
uchar key;
|
||||
AttributeView* attribView = static_cast<AttributeView*>(
|
||||
@ -2162,7 +2234,8 @@ AttributeView::SetSizeStr(const char* sizeStr)
|
||||
|
||||
BRect bounds(Bounds());
|
||||
float lineHeight = CurrentFontHeight(kAttribFontHeight) + 6;
|
||||
bounds.Set(fDivider, fIconRect.bottom, bounds.right, fIconRect.bottom + lineHeight);
|
||||
bounds.Set(fDivider, fIconRect.bottom, bounds.right,
|
||||
fIconRect.bottom + lineHeight);
|
||||
Invalidate(bounds);
|
||||
}
|
||||
|
||||
@ -2171,7 +2244,8 @@ AttributeView::SetSizeStr(const char* sizeStr)
|
||||
|
||||
|
||||
TrackingView::TrackingView(BRect frame, const char* str, BMessage* message)
|
||||
: BControl(frame, "trackingView", str, message, B_FOLLOW_ALL, B_WILL_DRAW),
|
||||
: BControl(frame, "trackingView", str, message, B_FOLLOW_ALL,
|
||||
B_WILL_DRAW),
|
||||
fMouseDown(false),
|
||||
fMouseInView(false)
|
||||
{
|
||||
|
@ -77,7 +77,8 @@ ShortMimeInfo::ShortDescription() const
|
||||
}
|
||||
|
||||
int
|
||||
ShortMimeInfo::CompareShortDescription(const ShortMimeInfo* a, const ShortMimeInfo* b)
|
||||
ShortMimeInfo::CompareShortDescription(const ShortMimeInfo* a,
|
||||
const ShortMimeInfo* b)
|
||||
{
|
||||
return a->fShortDescription.ICompare(b->fShortDescription);
|
||||
}
|
||||
@ -160,5 +161,3 @@ MimeTypeList::Build()
|
||||
fCommonMimeList.SortItems(&ShortMimeInfo::CompareShortDescription);
|
||||
fLock.Unlock();
|
||||
}
|
||||
|
||||
|
||||
|
@ -270,8 +270,8 @@ Model::SetTo(const entry_ref* newRef, bool traverse, bool open, bool writable)
|
||||
|
||||
|
||||
status_t
|
||||
Model::SetTo(const node_ref* dirNode, const node_ref* nodeRef, const char* name,
|
||||
bool open, bool writable)
|
||||
Model::SetTo(const node_ref* dirNode, const node_ref* nodeRef,
|
||||
const char* name, bool open, bool writable)
|
||||
{
|
||||
delete fNode;
|
||||
fNode = NULL;
|
||||
@ -425,7 +425,8 @@ Model::OpenNodeCommon(bool writable)
|
||||
case kQueryTemplateNode:
|
||||
// open or reopen
|
||||
delete fNode;
|
||||
fNode = new BFile(&fEntryRef, (uint32)(writable ? O_RDWR : O_RDONLY));
|
||||
fNode = new BFile(&fEntryRef,
|
||||
(uint32)(writable ? O_RDWR : O_RDONLY));
|
||||
break;
|
||||
|
||||
case kDirectoryNode:
|
||||
@ -455,11 +456,12 @@ Model::OpenNodeCommon(bool writable)
|
||||
PrintToStream();
|
||||
#endif
|
||||
TRESPASS();
|
||||
// this can only happen if GetStat failed before, in which case
|
||||
// we shouldn't be here
|
||||
// ToDo: Obviously, we can also be here if the type could not be determined,
|
||||
// for example for block devices (so the TRESPASS() macro shouldn't be
|
||||
// used here)!
|
||||
// this can only happen if GetStat failed before,
|
||||
// in which case we shouldn't be here
|
||||
|
||||
// ToDo: Obviously, we can also be here if the type could not
|
||||
// be determined, for example for block devices (so the TRESPASS()
|
||||
// macro shouldn't be used here)!
|
||||
return fStatus = B_ERROR;
|
||||
}
|
||||
|
||||
@ -598,11 +600,12 @@ Model::FinishSettingUpType()
|
||||
&& fBaseType != kLinkNode
|
||||
&& !CheckNodeIconHintPrivate(fNode, dynamic_cast<TTracker*>(be_app) == NULL)
|
||||
&& !HasVectorIconHint(fNode)) {
|
||||
// when checking for the node icon hint, if we are libtracker, only check
|
||||
// for small icons - checking for the large icons is a little more
|
||||
// work for the filesystem and this will speed up the test.
|
||||
// This makes node icons only work if there is a small and a large node
|
||||
// icon on a file - for libtracker that is not a problem though
|
||||
// when checking for the node icon hint, if we are libtracker,
|
||||
// only check for small icons - checking for the large icons
|
||||
// is a little more work for the filesystem and this will
|
||||
// speed up the test. This makes node icons only work if there
|
||||
// is a small and a large node icon on a file - for libtracker
|
||||
// that is not a problem though
|
||||
fIconFrom = kUnknownNotFromNode;
|
||||
}
|
||||
|
||||
@ -648,9 +651,11 @@ Model::FinishSettingUpType()
|
||||
fMimeType = mimeString;
|
||||
|
||||
if (fIconFrom == kUnknownNotFromNode
|
||||
&& WellKnowEntryList::Match(NodeRef()) > (directory_which)-1)
|
||||
&& WellKnowEntryList::Match(NodeRef())
|
||||
> (directory_which)-1) {
|
||||
// one of home, beos, system, boot, etc.
|
||||
fIconFrom = kTrackerSupplied;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -695,9 +700,8 @@ Model::FinishSettingUpType()
|
||||
case kExecutableNode:
|
||||
if (IsNodeOpen()) {
|
||||
char signature[B_MIME_TYPE_LENGTH];
|
||||
if (GetAppSignatureFromAttr(dynamic_cast<BFile*>(fNode), signature)
|
||||
== B_OK) {
|
||||
|
||||
if (GetAppSignatureFromAttr(dynamic_cast<BFile*>(fNode),
|
||||
signature) == B_OK) {
|
||||
if (fPreferredAppName)
|
||||
DeletePreferredAppVolumeNameLinkTo();
|
||||
|
||||
@ -706,7 +710,8 @@ Model::FinishSettingUpType()
|
||||
}
|
||||
}
|
||||
if (!fMimeType.Length())
|
||||
fMimeType = B_APP_MIME_TYPE; // should use a shared string here
|
||||
fMimeType = B_APP_MIME_TYPE;
|
||||
// should use a shared string here
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -728,7 +733,8 @@ Model::ResetIconFrom()
|
||||
// mirror the logic from FinishSettingUpType
|
||||
if ((fBaseType == kDirectoryNode || fBaseType == kVolumeNode
|
||||
|| fBaseType == kTrashNode || fBaseType == kDesktopNode)
|
||||
&& !CheckNodeIconHintPrivate(fNode, dynamic_cast<TTracker*>(be_app) == NULL)) {
|
||||
&& !CheckNodeIconHintPrivate(fNode,
|
||||
dynamic_cast<TTracker*>(be_app) == NULL)) {
|
||||
if (WellKnowEntryList::Match(NodeRef()) > (directory_which)-1) {
|
||||
fIconFrom = kTrackerSupplied;
|
||||
return;
|
||||
@ -813,7 +819,8 @@ Model::GetPreferredAppForBrokenSymLink(BString &result)
|
||||
|
||||
BModelOpener opener(this);
|
||||
BNodeInfo info(fNode);
|
||||
status_t error = info.GetPreferredApp(result.LockBuffer(B_MIME_TYPE_LENGTH));
|
||||
status_t error
|
||||
= info.GetPreferredApp(result.LockBuffer(B_MIME_TYPE_LENGTH));
|
||||
result.UnlockBuffer();
|
||||
|
||||
if (error != B_OK)
|
||||
@ -1078,9 +1085,10 @@ Model::SupportsMimeType(const char* type, const BObjectList<BString>* list,
|
||||
const char* mimeSignature;
|
||||
int32 bufferLength;
|
||||
|
||||
if (message.FindData("types", 'CSTR', index, (const void**)&mimeSignature,
|
||||
&bufferLength))
|
||||
if (message.FindData("types", 'CSTR', index,
|
||||
(const void**)&mimeSignature, &bufferLength)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (IsSuperHandlerSignature(mimeSignature)) {
|
||||
if (!exactReason)
|
||||
@ -1098,7 +1106,8 @@ Model::SupportsMimeType(const char* type, const BObjectList<BString>* list,
|
||||
} else
|
||||
match = WhileEachListItem(const_cast<BObjectList<BString>*>(list),
|
||||
MatchMimeTypeString, mimeSignature);
|
||||
// const_cast shouldnt be here, have to have it until MW cleans up
|
||||
// const_cast shouldnt be here, have to have it until
|
||||
// MW cleans up
|
||||
|
||||
if (match == kMatch)
|
||||
// supports the actual type, it can't get any better
|
||||
@ -1150,9 +1159,10 @@ Model::IsSuperHandler() const
|
||||
const char* mimeSignature;
|
||||
int32 bufferLength;
|
||||
|
||||
if (message.FindData("types", 'CSTR', index, (const void**)&mimeSignature,
|
||||
&bufferLength))
|
||||
if (message.FindData("types", 'CSTR', index,
|
||||
(const void**)&mimeSignature, &bufferLength)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IsSuperHandlerSignature(mimeSignature))
|
||||
return true;
|
||||
@ -1261,7 +1271,8 @@ Model::GetVersionString(BString &result, version_kind kind)
|
||||
return error;
|
||||
|
||||
char vstr[32];
|
||||
sprintf(vstr, "%ld.%ld.%ld", version.major, version.middle, version.minor);
|
||||
sprintf(vstr, "%ld.%ld.%ld", version.major, version.middle,
|
||||
version.minor);
|
||||
result = vstr;
|
||||
return B_OK;
|
||||
}
|
||||
@ -1271,8 +1282,8 @@ Model::GetVersionString(BString &result, version_kind kind)
|
||||
void
|
||||
Model::PrintToStream(int32 level, bool deep)
|
||||
{
|
||||
PRINT(("model name %s, entry name %s, inode %" B_PRIdINO ", dev %" B_PRIdDEV
|
||||
", directory inode %" B_PRIdINO "\n",
|
||||
PRINT(("model name %s, entry name %s, inode %" B_PRIdINO ", dev %"
|
||||
B_PRIdDEV ", directory inode %" B_PRIdINO "\n",
|
||||
Name() ? Name() : "**empty name**",
|
||||
EntryRef()->name ? EntryRef()->name : "**empty ref name**",
|
||||
NodeRef()->node,
|
||||
@ -1324,8 +1335,10 @@ Model::PrintToStream(int32 level, bool deep)
|
||||
if (level < 1)
|
||||
return;
|
||||
|
||||
if (!IsVolume())
|
||||
PRINT(("preferred app %s\n", fPreferredAppName ? fPreferredAppName : ""));
|
||||
if (!IsVolume()) {
|
||||
PRINT(("preferred app %s\n",
|
||||
fPreferredAppName ? fPreferredAppName : ""));
|
||||
}
|
||||
|
||||
PRINT(("icon from: "));
|
||||
switch (IconFrom()) {
|
||||
@ -1426,8 +1439,9 @@ Model::TrackIconSource(icon_size size)
|
||||
BMimeType preferredAppType(preferredApp);
|
||||
err = preferredAppType.GetIconForType(MimeType(), &bitmap, size);
|
||||
if (err == B_OK) {
|
||||
PRINT(("track icon - got icon for type %s from preferred app %s for file\n",
|
||||
MimeType(), preferredApp));
|
||||
PRINT(
|
||||
("track icon - got icon for type %s from preferred "
|
||||
"app %s for file\n", MimeType(), preferredApp));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1453,12 +1467,14 @@ Model::TrackIconSource(icon_size size)
|
||||
err = preferredAppType.GetIconForType(MimeType(), &bitmap, size);
|
||||
if (err == B_OK) {
|
||||
// the preferred app knew icon to use for the type, we are done
|
||||
PRINT(("track icon - signature %s, got icon from preferred app %s\n",
|
||||
MimeType(), preferredApp));
|
||||
PRINT(
|
||||
("track icon - signature %s, got icon from preferred "
|
||||
"app %s\n", MimeType(), preferredApp));
|
||||
return;
|
||||
}
|
||||
PRINT(("track icon - signature %s, preferred app %s, no icon, error %s\n",
|
||||
MimeType(), preferredApp, strerror(err)));
|
||||
PRINT(
|
||||
("track icon - signature %s, preferred app %s, no icon, "
|
||||
"error %s\n", MimeType(), preferredApp, strerror(err)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,11 +88,12 @@ class Model {
|
||||
|
||||
status_t InitCheck() const;
|
||||
|
||||
status_t SetTo(const BEntry*, bool open = false, bool writable = false);
|
||||
status_t SetTo(const entry_ref*, bool traverse = false, bool open = false,
|
||||
status_t SetTo(const BEntry*, bool open = false,
|
||||
bool writable = false);
|
||||
status_t SetTo(const node_ref* dirNode, const node_ref* node, const char* name,
|
||||
status_t SetTo(const entry_ref*, bool traverse = false,
|
||||
bool open = false, bool writable = false);
|
||||
status_t SetTo(const node_ref* dirNode, const node_ref* node,
|
||||
const char* name, bool open = false, bool writable = false);
|
||||
|
||||
int CompareFolderNamesFirst(const Model* compareModel) const;
|
||||
|
||||
@ -124,9 +125,9 @@ class Model {
|
||||
void SetPreferredAppSignature(const char*);
|
||||
|
||||
void GetPreferredAppForBrokenSymLink(BString &result);
|
||||
// special purpose call - if a symlink is unresolvable, it makes sense
|
||||
// to be able to get at it's preferred handler which may be different
|
||||
// from the Tracker. Used by the network neighborhood.
|
||||
// special purpose call - if a symlink is unresolvable, it makes
|
||||
// sense to be able to get at it's preferred handler which may be
|
||||
// different from the Tracker. Used by the network neighborhood.
|
||||
|
||||
// type getters
|
||||
bool IsFile() const;
|
||||
@ -159,8 +160,8 @@ class Model {
|
||||
|
||||
status_t GetLongVersionString(BString &, version_kind);
|
||||
status_t GetVersionString(BString &, version_kind);
|
||||
status_t AttrAsString(BString &, int64* value, const char* attributeName,
|
||||
uint32 attributeType);
|
||||
status_t AttrAsString(BString &, int64* value,
|
||||
const char* attributeName, uint32 attributeType);
|
||||
|
||||
// Node monitor update call
|
||||
void UpdateEntryRef(const node_ref* dirRef, const char* name);
|
||||
@ -189,8 +190,8 @@ class Model {
|
||||
#endif
|
||||
|
||||
bool IsSuperHandler() const;
|
||||
int32 SupportsMimeType(const char* type, const BObjectList<BString>* list,
|
||||
bool exactReason = false) const;
|
||||
int32 SupportsMimeType(const char* type,
|
||||
const BObjectList<BString>* list, bool exactReason = false) const;
|
||||
// pass in one string in <type> or a bunch in <list>
|
||||
// if <exactReason> false, returns as soon as it figures out that
|
||||
// app supports a given type, if true, returns an exact reason
|
||||
@ -200,8 +201,9 @@ class Model {
|
||||
const void* buffer, size_t );
|
||||
// cover call, creates a writable node and writes out attributes
|
||||
// into it; work around for file nodes not being writeable
|
||||
ssize_t WriteAttrKillForeign(const char* attr, const char* foreignAttr,
|
||||
type_code type, off_t, const void* buffer, size_t);
|
||||
ssize_t WriteAttrKillForeign(const char* attr,
|
||||
const char* foreignAttr, type_code type, off_t,
|
||||
const void* buffer, size_t);
|
||||
|
||||
bool Mimeset(bool force);
|
||||
// returns true if mime type changed
|
||||
@ -242,11 +244,13 @@ class Model {
|
||||
|
||||
entry_ref fEntryRef;
|
||||
StatStruct fStatBuf;
|
||||
BString fMimeType; // should use string that may be shared for common types
|
||||
BString fMimeType;
|
||||
// should use string that may be shared for common types
|
||||
|
||||
// bit of overloading hackery here to save on footprint
|
||||
union {
|
||||
char* fPreferredAppName; // used if we are neither a volume nor a symlink
|
||||
char* fPreferredAppName; // used if we are neither a volume
|
||||
// nor a symlink
|
||||
char* fVolumeName; // used if we are a volume
|
||||
Model* fLinkTo; // used if we are a symlink
|
||||
};
|
||||
@ -267,7 +271,8 @@ class ModelNodeLazyOpener {
|
||||
public:
|
||||
// consider failing when open does not succeed
|
||||
|
||||
ModelNodeLazyOpener(Model* model, bool writable = false, bool openLater = true);
|
||||
ModelNodeLazyOpener(Model* model, bool writable = false,
|
||||
bool openLater = true);
|
||||
~ModelNodeLazyOpener();
|
||||
|
||||
bool IsOpen() const;
|
||||
@ -463,7 +468,8 @@ Model::HasLocalizedName() const
|
||||
|
||||
|
||||
inline
|
||||
ModelNodeLazyOpener::ModelNodeLazyOpener(Model* model, bool writable, bool openLater)
|
||||
ModelNodeLazyOpener::ModelNodeLazyOpener(Model* model, bool writable,
|
||||
bool openLater)
|
||||
: fModel(model),
|
||||
fWasOpen(model->IsNodeOpen()),
|
||||
fWasOpenForWriting(model->IsNodeOpenForWriting())
|
||||
|
@ -58,8 +58,8 @@ static const int32 kMaxHistory = 32;
|
||||
static BPicture sPicture;
|
||||
|
||||
|
||||
BNavigatorButton::BNavigatorButton(BRect rect, const char* name, BMessage* message,
|
||||
int32 resIDon, int32 resIDoff, int32 resIDdisabled)
|
||||
BNavigatorButton::BNavigatorButton(BRect rect, const char* name,
|
||||
BMessage* message, int32 resIDon, int32 resIDoff, int32 resIDdisabled)
|
||||
: BPictureButton(rect, name, &sPicture, &sPicture, message),
|
||||
fResIDOn(resIDon),
|
||||
fResIDOff(resIDoff),
|
||||
@ -81,17 +81,20 @@ void
|
||||
BNavigatorButton::AttachedToWindow()
|
||||
{
|
||||
BBitmap* bmpOn = 0;
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDOn, &bmpOn);
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDOn,
|
||||
&bmpOn);
|
||||
SetPicture(bmpOn, true, true);
|
||||
delete bmpOn;
|
||||
|
||||
BBitmap* bmpOff = 0;
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDOff, &bmpOff);
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDOff,
|
||||
&bmpOff);
|
||||
SetPicture(bmpOff, true, false);
|
||||
delete bmpOff;
|
||||
|
||||
BBitmap* bmpDisabled = 0;
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDDisabled, &bmpDisabled);
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, fResIDDisabled,
|
||||
&bmpDisabled);
|
||||
SetPicture(bmpDisabled, false, false);
|
||||
SetPicture(bmpDisabled, false, true);
|
||||
delete bmpDisabled;
|
||||
@ -197,8 +200,10 @@ BNavigator::Draw(BRect)
|
||||
// Draws a beveled smooth border
|
||||
BeginLineArray(4);
|
||||
AddLine(Bounds().LeftTop(), Bounds().RightTop(), shineColor);
|
||||
AddLine(Bounds().LeftTop(), Bounds().LeftBottom() - BPoint(0, 1), shineColor);
|
||||
AddLine(Bounds().LeftBottom() - BPoint(-1, 1), Bounds().RightBottom() - BPoint(0, 1), halfDarkColor);
|
||||
AddLine(Bounds().LeftTop(), Bounds().LeftBottom() - BPoint(0, 1),
|
||||
shineColor);
|
||||
AddLine(Bounds().LeftBottom() - BPoint(-1, 1),
|
||||
Bounds().RightBottom() - BPoint(0, 1), halfDarkColor);
|
||||
AddLine(Bounds().LeftBottom(), Bounds().RightBottom(), darkColor);
|
||||
EndLineArray();
|
||||
}
|
||||
@ -275,14 +280,17 @@ BNavigator::GoUp(bool option)
|
||||
BEntry entry;
|
||||
if (entry.SetTo(fPath.Path()) == B_OK) {
|
||||
BEntry parentEntry;
|
||||
if (entry.GetParent(&parentEntry) == B_OK && !FSIsDeskDir(&parentEntry))
|
||||
if (entry.GetParent(&parentEntry) == B_OK
|
||||
&& !FSIsDeskDir(&parentEntry)) {
|
||||
SendNavigationMessage(kActionUp, &parentEntry, option);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BNavigator::SendNavigationMessage(NavigationAction action, BEntry* entry, bool option)
|
||||
BNavigator::SendNavigationMessage(NavigationAction action, BEntry* entry,
|
||||
bool option)
|
||||
{
|
||||
entry_ref ref;
|
||||
|
||||
@ -298,26 +306,33 @@ BNavigator::SendNavigationMessage(NavigationAction action, BEntry* entry, bool o
|
||||
else
|
||||
nodeRef = NULL;
|
||||
|
||||
// if the option key was held down, open in new window (send message to be_app)
|
||||
// otherwise send message to this window. TTracker (be_app) understands nodeRefToSlection,
|
||||
// BContainerWindow doesn't, so we have to select the item manually
|
||||
// if the option key was held down, open in new window (send message
|
||||
// to be_app) otherwise send message to this window. TTracker
|
||||
// (be_app) understands nodeRefToSlection, BContainerWindow doesn't,
|
||||
// so we have to select the item manually
|
||||
if (option) {
|
||||
message.what = B_REFS_RECEIVED;
|
||||
if (nodeRef)
|
||||
message.AddData("nodeRefToSelect", B_RAW_TYPE, nodeRef, sizeof(node_ref));
|
||||
if (nodeRef) {
|
||||
message.AddData("nodeRefToSelect", B_RAW_TYPE, nodeRef,
|
||||
sizeof(node_ref));
|
||||
}
|
||||
be_app->PostMessage(&message);
|
||||
} else {
|
||||
message.what = kSwitchDirectory;
|
||||
Window()->PostMessage(&message);
|
||||
UnlockLooper();
|
||||
// This is to prevent a dead-lock situation. SelectChildInParentSoon()
|
||||
// eventually locks the TaskLoop::fLock. Later, when StandAloneTaskLoop::Run()
|
||||
// runs, it also locks TaskLoop::fLock and subsequently locks this window's looper.
|
||||
// Therefore we can't call SelectChildInParentSoon with our Looper locked,
|
||||
// because we would get different orders of locking (thus the risk of dead-locking).
|
||||
// This is to prevent a dead-lock situation.
|
||||
// SelectChildInParentSoon() eventually locks the
|
||||
// TaskLoop::fLock. Later, when StandAloneTaskLoop::Run()
|
||||
// runs, it also locks TaskLoop::fLock and subsequently
|
||||
// locks this window's looper. Therefore we can't call
|
||||
// SelectChildInParentSoon with our Looper locked,
|
||||
// because we would get different orders of locking
|
||||
// (thus the risk of dead-locking).
|
||||
//
|
||||
// Todo: Change the locking behaviour of StandAloneTaskLoop::Run() and sub-
|
||||
// sequently called functions.
|
||||
// Todo: Change the locking behaviour of
|
||||
// StandAloneTaskLoop::Run() and subsequently called
|
||||
// functions.
|
||||
if (nodeRef)
|
||||
dynamic_cast<TTracker*>(be_app)->SelectChildInParentSoon(&ref, nodeRef);
|
||||
LockLooper();
|
||||
@ -387,7 +402,8 @@ BNavigator::UpdateLocation(const Model* newmodel, int32 action)
|
||||
BEntry entry;
|
||||
if (entry.SetTo(fPath.Path()) == B_OK) {
|
||||
BEntry parentEntry;
|
||||
fUp->SetEnabled(entry.GetParent(&parentEntry) == B_OK && !FSIsDeskDir(&parentEntry));
|
||||
fUp->SetEnabled(entry.GetParent(&parentEntry) == B_OK
|
||||
&& !FSIsDeskDir(&parentEntry));
|
||||
}
|
||||
|
||||
// Enable history buttons if history contains something
|
||||
|
@ -1433,8 +1433,8 @@ SearchForSignatureEntryList::Relation(const BMessage* entriesToOpen,
|
||||
|
||||
void
|
||||
SearchForSignatureEntryList::RelationDescription(const BMessage* entriesToOpen,
|
||||
const Model* applicationModel, BString* description, const entry_ref* preferredApp,
|
||||
const entry_ref* preferredAppForFile)
|
||||
const Model* applicationModel, BString* description,
|
||||
const entry_ref* preferredApp, const entry_ref* preferredAppForFile)
|
||||
{
|
||||
for (int32 index = 0; ;index++) {
|
||||
entry_ref ref;
|
||||
@ -1482,10 +1482,11 @@ SearchForSignatureEntryList::RelationDescription(const BMessage* entriesToOpen,
|
||||
{
|
||||
mimeType.SetTo(model.MimeType());
|
||||
|
||||
if (preferredApp && *applicationModel->EntryRef() == *preferredApp)
|
||||
if (preferredApp
|
||||
&& *applicationModel->EntryRef() == *preferredApp) {
|
||||
// application matches cached preferred app, we are done
|
||||
description->SetTo(B_TRANSLATE("Preferred for %type"));
|
||||
else
|
||||
} else
|
||||
description->SetTo(B_TRANSLATE("Handles %type"));
|
||||
|
||||
char shortDescription[256];
|
||||
@ -1543,7 +1544,9 @@ SearchForSignatureEntryList::CanOpenWithFilter(const Model* appModel,
|
||||
BEntry entry2(&trackerInfo.ref);
|
||||
entry2.GetPath(&path2);
|
||||
|
||||
PRINT(("filtering out %s, sig %s, active Tracker at %s, result %s, refName %s\n",
|
||||
PRINT(
|
||||
("filtering out %s, sig %s, active Tracker at %s, "
|
||||
"result %s, refName %s\n",
|
||||
path.Path(), signature, path2.Path(), strerror(result),
|
||||
trackerInfo.ref.name));
|
||||
#endif
|
||||
@ -1583,7 +1586,8 @@ SearchForSignatureEntryList::CanOpenWithFilter(const Model* appModel,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (relation != kNoRelation && relation != kSuperhandler && !fGenericFilesOnly) {
|
||||
if (relation != kNoRelation && relation != kSuperhandler
|
||||
&& !fGenericFilesOnly) {
|
||||
// we hit at least one app that is not a superhandler and
|
||||
// handles the document
|
||||
fFoundOneNonSuperHandler = true;
|
||||
@ -1614,7 +1618,8 @@ ConditionalAllAppsIterator::Instantiate()
|
||||
BString lookForAppsPredicate;
|
||||
lookForAppsPredicate << "(" << kAttrAppSignature << " = \"*\" ) && ( "
|
||||
<< kAttrMIMEType << " = " << B_APP_MIME_TYPE << " ) ";
|
||||
fWalker = new BTrackerPrivate::TQueryWalker(lookForAppsPredicate.String());
|
||||
fWalker
|
||||
= new BTrackerPrivate::TQueryWalker(lookForAppsPredicate.String());
|
||||
}
|
||||
|
||||
|
||||
@ -1647,8 +1652,8 @@ ConditionalAllAppsIterator::GetNextRef(entry_ref* ref)
|
||||
|
||||
|
||||
int32
|
||||
ConditionalAllAppsIterator::GetNextDirents(struct dirent* buffer, size_t length,
|
||||
int32 count)
|
||||
ConditionalAllAppsIterator::GetNextDirents(struct dirent* buffer,
|
||||
size_t length, int32 count)
|
||||
{
|
||||
if (!Iterate())
|
||||
return 0;
|
||||
|
@ -91,23 +91,26 @@ class SearchForSignatureEntryList : public EntryListBase {
|
||||
void TrySettingPreferredAppForFile(const entry_ref*);
|
||||
|
||||
int32 Relation(const BMessage* entriesToOpen, const Model*) const;
|
||||
// returns the reason why an application is shown in Open With window
|
||||
// returns the reason why an application is shown in
|
||||
// Open With window
|
||||
void RelationDescription(const BMessage* entriesToOpen, const Model*,
|
||||
BString*) const;
|
||||
// returns a string describing why application handles files to open
|
||||
// returns a string describing why application handles files
|
||||
// to open
|
||||
|
||||
static int32 Relation(const BMessage* entriesToOpen,
|
||||
const Model*, const entry_ref* preferredApp,
|
||||
const entry_ref* preferredAppForFile);
|
||||
// returns the reason why an application is shown in Open With window
|
||||
// static version, needs the preferred app for preformance
|
||||
// returns the reason why an application is shown in Open With
|
||||
// window static version, needs the preferred app for preformance
|
||||
static void RelationDescription(const BMessage* entriesToOpen,
|
||||
const Model*, BString*, const entry_ref* preferredApp,
|
||||
const entry_ref* preferredAppForFile);
|
||||
// returns a string describing why application handles files to open
|
||||
// returns a string describing why application handles files
|
||||
// to open
|
||||
|
||||
bool CanOpenWithFilter(const Model* appModel, const BMessage* entriesToOpen,
|
||||
const entry_ref* preferredApp);
|
||||
bool CanOpenWithFilter(const Model* appModel,
|
||||
const BMessage* entriesToOpen, const entry_ref* preferredApp);
|
||||
|
||||
void NonGenericFileFound();
|
||||
bool GenericFilesOnly() const;
|
||||
@ -116,7 +119,8 @@ class SearchForSignatureEntryList : public EntryListBase {
|
||||
|
||||
private:
|
||||
static int32 Relation(const Model* node, const Model* app);
|
||||
// returns the reason why an application is shown in Open With window
|
||||
// returns the reason why an application is shown in
|
||||
// Open With window
|
||||
|
||||
CachedEntryIteratorList* fIteratorList;
|
||||
BObjectList<BString> fSignatures;
|
||||
@ -152,7 +156,8 @@ class OpenWithContainerWindow : public BContainerWindow {
|
||||
OpenWithPoseView* PoseView() const;
|
||||
|
||||
protected:
|
||||
virtual BPoseView* NewPoseView(Model* model, BRect rect, uint32 viewMode);
|
||||
virtual BPoseView* NewPoseView(Model* model, BRect rect,
|
||||
uint32 viewMode);
|
||||
|
||||
virtual bool ShouldAddMenus() const;
|
||||
virtual void ShowContextMenu(BPoint, const entry_ref*, BView*);
|
||||
@ -176,10 +181,12 @@ class OpenWithContainerWindow : public BContainerWindow {
|
||||
void OpenWithSelection();
|
||||
// open entries with the selected app
|
||||
void MakeDefaultAndOpen();
|
||||
// open entries with the selected app and make it the default handler
|
||||
// open entries with the selected app and make it
|
||||
// the default handler
|
||||
|
||||
private:
|
||||
static filter_result KeyDownFilter(BMessage*, BHandler**, BMessageFilter*);
|
||||
static filter_result KeyDownFilter(BMessage*, BHandler**,
|
||||
BMessageFilter*);
|
||||
|
||||
BMessage* fEntriesToOpen;
|
||||
BButton* fLaunchButton;
|
||||
@ -198,16 +205,19 @@ class OpenWithPoseView : public BPoseView {
|
||||
// open entries with the selected app
|
||||
|
||||
int32 OpenWithRelation(const Model*) const;
|
||||
// returns the reason why an application is shown in Open With window
|
||||
// returns the reason why an application is shown in
|
||||
// Open With window
|
||||
void OpenWithRelationDescription(const Model*, BString*) const;
|
||||
// returns a string describing why application handles files to open
|
||||
// returns a string describing why application handles files
|
||||
// to open
|
||||
|
||||
OpenWithContainerWindow* ContainerWindow() const;
|
||||
|
||||
virtual bool AddPosesThreadValid(const entry_ref*) const;
|
||||
|
||||
protected:
|
||||
// don't do any volume watching and memtamime watching in open with panels for now
|
||||
// don't do any volume watching and memtamime watching in open with
|
||||
// panels for now
|
||||
virtual void InitialStartWatching() {}
|
||||
virtual void FinalStopWatching() {}
|
||||
|
||||
@ -225,18 +235,22 @@ class OpenWithPoseView : public BPoseView {
|
||||
virtual void SavePoseLocations(BRect* = NULL);
|
||||
virtual void MoveSelectionToTrash(bool selectNext = true);
|
||||
virtual void MoveSelectionTo(BPoint, BPoint, BContainerWindow*);
|
||||
virtual void MoveSelectionInto(Model* destFolder, BContainerWindow* srcWindow,
|
||||
bool forceCopy, bool create_link = false);
|
||||
virtual void MoveSelectionInto(Model* destFolder,
|
||||
BContainerWindow* srcWindow, bool forceCopy,
|
||||
bool create_link = false);
|
||||
virtual bool HandleMessageDropped(BMessage*);
|
||||
virtual bool CanHandleDragSelection(const Model*, const BMessage*, bool);
|
||||
virtual bool CanHandleDragSelection(const Model*, const BMessage*,
|
||||
bool);
|
||||
|
||||
virtual bool Represents(const node_ref*) const;
|
||||
virtual bool Represents(const entry_ref*) const;
|
||||
|
||||
virtual void CreatePoses(Model** models, PoseInfo* poseInfoArray, int32 count,
|
||||
BPose** resultingPoses, bool insertionSort = true, int32* lastPoseIndexPtr = NULL,
|
||||
BRect* boundsPtr = NULL, bool forceDraw = false);
|
||||
// override to add selecting the default handling app for selection
|
||||
virtual void CreatePoses(Model** models, PoseInfo* poseInfoArray,
|
||||
int32 count, BPose** resultingPoses, bool insertionSort = true,
|
||||
int32* lastPoseIndexPtr = NULL, BRect* boundsPtr = NULL,
|
||||
bool forceDraw = false);
|
||||
// override to add selecting the default handling app
|
||||
// for selection
|
||||
|
||||
virtual bool ShouldShowPose(const Model*, const PoseInfo*);
|
||||
|
||||
@ -260,7 +274,8 @@ class RelationCachingModelProxy {
|
||||
RelationCachingModelProxy(Model* model);
|
||||
~RelationCachingModelProxy();
|
||||
|
||||
int32 Relation(SearchForSignatureEntryList* iterator, BMessage* entries) const;
|
||||
int32 Relation(SearchForSignatureEntryList* iterator,
|
||||
BMessage* entries) const;
|
||||
|
||||
Model* fModel;
|
||||
mutable int32 fRelation;
|
||||
|
@ -101,8 +101,9 @@ OverrideAlert::OverPosition(float width, float height)
|
||||
{
|
||||
// This positions the alert window like a normal alert, put
|
||||
// places it on top of the calling window if possible.
|
||||
|
||||
BWindow* window = dynamic_cast<BWindow*>(BLooper::LooperForThread(find_thread(NULL)));
|
||||
|
||||
BWindow* window
|
||||
= dynamic_cast<BWindow*>(BLooper::LooperForThread(find_thread(NULL)));
|
||||
BRect screenFrame;
|
||||
BRect desirableRect;
|
||||
screenFrame = BScreen(window).Frame();
|
||||
@ -149,7 +150,9 @@ OverrideAlert::UpdateButtons(uint32 modifiers, bool force)
|
||||
fCurModifiers = modifiers;
|
||||
for (int32 i = 0; i < 3; i++) {
|
||||
BButton* button = ButtonAt(i);
|
||||
if (button)
|
||||
button->SetEnabled(((fButtonModifiers[i] & fCurModifiers) == fButtonModifiers[i]));
|
||||
if (button) {
|
||||
button->SetEnabled(((fButtonModifiers[i] & fCurModifiers)
|
||||
== fButtonModifiers[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +56,8 @@ CalcFreeSpace(BVolume* volume)
|
||||
if (capacity == 0)
|
||||
return 100;
|
||||
|
||||
int32 percent = static_cast<int32>(volume->FreeBytes() / (capacity / 100));
|
||||
int32 percent
|
||||
= static_cast<int32>(volume->FreeBytes() / (capacity / 100));
|
||||
|
||||
// warn below 20 MB of free space (if this is less than 10% of free space)
|
||||
if (volume->FreeBytes() < 20 * 1024 * 1024 && percent < 10)
|
||||
@ -69,7 +70,8 @@ CalcFreeSpace(BVolume* volume)
|
||||
// symlink pose uses the resolved model to retrieve the icon, if not broken
|
||||
// everything else, like the attributes, etc. is retrieved directly from the
|
||||
// symlink itself
|
||||
BPose::BPose(Model* model, BPoseView* view, uint32 clipboardMode, bool selected)
|
||||
BPose::BPose(Model* model, BPoseView* view, uint32 clipboardMode,
|
||||
bool selected)
|
||||
: fModel(model),
|
||||
fWidgetList(4, true),
|
||||
fClipboardMode(clipboardMode),
|
||||
@ -148,7 +150,8 @@ BPose::AddWidget(BPoseView* poseView, BColumn* column)
|
||||
|
||||
|
||||
BTextWidget*
|
||||
BPose::AddWidget(BPoseView* poseView, BColumn* column, ModelNodeLazyOpener &opener)
|
||||
BPose::AddWidget(BPoseView* poseView, BColumn* column,
|
||||
ModelNodeLazyOpener &opener)
|
||||
{
|
||||
opener.OpenNode();
|
||||
if (fModel->InitCheck() != B_OK)
|
||||
@ -171,7 +174,8 @@ BPose::RemoveWidget(BPoseView*, BColumn* column)
|
||||
|
||||
|
||||
void
|
||||
BPose::Commit(bool saveChanges, BPoint loc, BPoseView* poseView, int32 poseIndex)
|
||||
BPose::Commit(bool saveChanges, BPoint loc, BPoseView* poseView,
|
||||
int32 poseIndex)
|
||||
{
|
||||
int32 count = fWidgetList.CountItems();
|
||||
for (int32 index = 0; index < count; index++) {
|
||||
@ -185,8 +189,8 @@ BPose::Commit(bool saveChanges, BPoint loc, BPoseView* poseView, int32 poseIndex
|
||||
|
||||
|
||||
inline bool
|
||||
OneMouseUp(BTextWidget* widget, BPose* pose, BPoseView* poseView, BColumn* column,
|
||||
BPoint poseLoc, BPoint where)
|
||||
OneMouseUp(BTextWidget* widget, BPose* pose, BPoseView* poseView,
|
||||
BColumn* column, BPoint poseLoc, BPoint where)
|
||||
{
|
||||
BRect rect;
|
||||
if (poseView->ViewMode() == kListMode)
|
||||
@ -258,7 +262,8 @@ BPose::UpdateWidgetAndModel(Model* resolvedModel, const char* attrName,
|
||||
BTextWidget* widget = fWidgetList.ItemAt(i);
|
||||
BColumn* column = poseView->ColumnFor(widget->AttrHash());
|
||||
if (column != NULL && !strcmp(column->AttrName(), attrName)) {
|
||||
widget->CheckAndUpdate(poseLoc, column, poseView, visible);
|
||||
widget->CheckAndUpdate(poseLoc, column, poseView,
|
||||
visible);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -283,8 +288,10 @@ BPose::UpdateWidgetAndModel(Model* resolvedModel, const char* attrName,
|
||||
|
||||
if (column->StatField()) {
|
||||
BTextWidget* widget = WidgetFor(column->AttrHash());
|
||||
if (widget)
|
||||
widget->CheckAndUpdate(poseLoc, column, poseView, visible);
|
||||
if (widget) {
|
||||
widget->CheckAndUpdate(poseLoc, column, poseView,
|
||||
visible);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -403,7 +410,8 @@ BPose::EditPreviousNextWidgetCommon(BPoseView* poseView, bool next)
|
||||
{
|
||||
bool found = false;
|
||||
int32 delta = next ? 1 : -1;
|
||||
for (int32 index = next ? 0 : poseView->CountColumns() - 1; ; index += delta) {
|
||||
for (int32 index = next ? 0 : poseView->CountColumns() - 1; ;
|
||||
index += delta) {
|
||||
BColumn* column = poseView->ColumnAt(index);
|
||||
if (!column)
|
||||
break;
|
||||
@ -510,7 +518,8 @@ BPose::PointInPose(BPoint loc, const BPoseView* poseView, BPoint where,
|
||||
if (!column)
|
||||
break;
|
||||
BTextWidget* widget = WidgetFor(column->AttrHash());
|
||||
if (widget && widget->CalcClickRect(loc, column, poseView).Contains(where)) {
|
||||
if (widget
|
||||
&& widget->CalcClickRect(loc, column, poseView).Contains(where)) {
|
||||
if (hitWidget)
|
||||
*hitWidget = widget;
|
||||
return true;
|
||||
@ -522,8 +531,8 @@ BPose::PointInPose(BPoint loc, const BPoseView* poseView, BPoint where,
|
||||
|
||||
|
||||
void
|
||||
BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* drawView,
|
||||
bool fullDraw, BPoint offset, bool selected)
|
||||
BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView,
|
||||
BView* drawView, bool fullDraw, BPoint offset, bool selected)
|
||||
{
|
||||
// If the background wasn't cleared and Draw() is not called after
|
||||
// having edited a name or similar (with fullDraw)
|
||||
@ -549,8 +558,8 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra
|
||||
iconRect.top = iconRect.bottom - size;
|
||||
if (updateRect.Intersects(iconRect)) {
|
||||
iconRect.OffsetBy(offset);
|
||||
DrawIcon(iconRect.LeftTop(), drawView, poseView->IconSize(), directDraw,
|
||||
!windowActive && !showSelectionWhenInactive);
|
||||
DrawIcon(iconRect.LeftTop(), drawView, poseView->IconSize(),
|
||||
directDraw, !windowActive && !showSelectionWhenInactive);
|
||||
}
|
||||
|
||||
// draw text
|
||||
@ -571,8 +580,8 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra
|
||||
poseView));
|
||||
|
||||
if (updateRect.Intersects(widgetRect)) {
|
||||
BRect widgetTextRect(widget->CalcRect(rect.LeftTop(), column,
|
||||
poseView));
|
||||
BRect widgetTextRect(widget->CalcRect(rect.LeftTop(),
|
||||
column, poseView));
|
||||
|
||||
bool selectDuringDraw = directDraw && selected
|
||||
&& windowActive;
|
||||
@ -583,12 +592,15 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra
|
||||
drawView->SetLowColor(0, 0, 0);
|
||||
}
|
||||
|
||||
if (index == 0)
|
||||
widget->Draw(widgetRect, widgetTextRect, column->Width(),
|
||||
poseView, drawView, selected, fClipboardMode, offset, directDraw);
|
||||
else
|
||||
if (index == 0) {
|
||||
widget->Draw(widgetRect, widgetTextRect,
|
||||
column->Width(), poseView, drawView, selected,
|
||||
fClipboardMode, offset, directDraw);
|
||||
} else {
|
||||
widget->Draw(widgetTextRect, widgetTextRect, column->Width(),
|
||||
poseView, drawView, false, fClipboardMode, offset, directDraw);
|
||||
poseView, drawView, false, fClipboardMode,
|
||||
offset, directDraw);
|
||||
}
|
||||
|
||||
if (index == 0 && selectDuringDraw)
|
||||
drawView->PopState();
|
||||
@ -596,7 +608,8 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra
|
||||
if (windowActive || isDrawingSelectionRect) {
|
||||
widgetTextRect.OffsetBy(offset);
|
||||
drawView->InvertRect(widgetTextRect);
|
||||
} else if (!windowActive && showSelectionWhenInactive) {
|
||||
} else if (!windowActive
|
||||
&& showSelectionWhenInactive) {
|
||||
widgetTextRect.OffsetBy(offset);
|
||||
drawView->PushState();
|
||||
drawView->SetDrawingMode(B_OP_BLEND);
|
||||
@ -705,8 +718,10 @@ BPose::MoveTo(BPoint point, BPoseView* poseView, bool inval)
|
||||
// might need to move a text view if we're active
|
||||
if (poseView->ActivePose() == this) {
|
||||
BView* border_view = poseView->FindView("BorderView");
|
||||
if (border_view)
|
||||
border_view->MoveBy(point.x - oldLocation.x, point.y - oldLocation.y);
|
||||
if (border_view) {
|
||||
border_view->MoveBy(point.x - oldLocation.x,
|
||||
point.y - oldLocation.y);
|
||||
}
|
||||
}
|
||||
|
||||
float scale = 1.0;
|
||||
@ -756,8 +771,8 @@ BPose::WidgetFor(uint32 attr, int32* index) const
|
||||
|
||||
|
||||
BTextWidget*
|
||||
BPose::WidgetFor(BColumn* column, BPoseView* poseView, ModelNodeLazyOpener &opener,
|
||||
int32* index)
|
||||
BPose::WidgetFor(BColumn* column, BPoseView* poseView,
|
||||
ModelNodeLazyOpener &opener, int32* index)
|
||||
{
|
||||
BTextWidget* widget = WidgetFor(column->AttrHash(), index);
|
||||
if (!widget)
|
||||
@ -777,17 +792,20 @@ BPose::TestLargeIconPixel(BPoint point) const
|
||||
|
||||
|
||||
void
|
||||
BPose::DrawIcon(BPoint where, BView* view, icon_size kind, bool direct, bool drawUnselected)
|
||||
BPose::DrawIcon(BPoint where, BView* view, icon_size kind, bool direct,
|
||||
bool drawUnselected)
|
||||
{
|
||||
if (fClipboardMode == kMoveSelectionTo) {
|
||||
view->SetDrawingMode(B_OP_ALPHA);
|
||||
view->SetHighColor(0, 0, 0, 64); // set the level of transparency
|
||||
view->SetHighColor(0, 0, 0, 64);
|
||||
// set the level of transparency
|
||||
view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
|
||||
} else if (direct)
|
||||
view->SetDrawingMode(B_OP_OVER);
|
||||
|
||||
IconCache::sIconCache->Draw(ResolvedModel(), view, where,
|
||||
fIsSelected && !drawUnselected ? kSelectedIcon : kNormalIcon, kind, true);
|
||||
fIsSelected && !drawUnselected ? kSelectedIcon : kNormalIcon, kind,
|
||||
true);
|
||||
|
||||
if (fPercent != -1)
|
||||
DrawBar(where, view, kind);
|
||||
@ -816,7 +834,8 @@ BPose::DrawBar(BPoint where,BView* view,icon_size kind)
|
||||
view->SetHighColor(32, 32, 32, 92);
|
||||
view->MovePenTo(BPoint(where.x + size, where.y + 1 + yOffset));
|
||||
view->StrokeLine(BPoint(where.x + size, where.y + size - yOffset));
|
||||
view->StrokeLine(BPoint(where.x + size - barWidth + 1, where.y + size - yOffset));
|
||||
view->StrokeLine(BPoint(where.x + size - barWidth + 1,
|
||||
where.y + size - yOffset));
|
||||
|
||||
view->SetDrawingMode(B_OP_ALPHA);
|
||||
|
||||
@ -846,7 +865,9 @@ BPose::DrawBar(BPoint where,BView* view,icon_size kind)
|
||||
// the used space bar
|
||||
bar.top = bar.bottom + 1;
|
||||
bar.bottom = rect.bottom;
|
||||
view->SetHighColor(fPercent < -1 ? TrackerSettings().WarningSpaceColor() : TrackerSettings().UsedSpaceColor());
|
||||
view->SetHighColor(fPercent < -1
|
||||
? TrackerSettings().WarningSpaceColor()
|
||||
: TrackerSettings().UsedSpaceColor());
|
||||
view->FillRect(bar);
|
||||
|
||||
view->PopState();
|
||||
@ -899,8 +920,10 @@ BPose::CalcRect(BPoint loc, const BPoseView* poseView, bool minimalRect) const
|
||||
|
||||
if (minimalRect) {
|
||||
BTextWidget* widget = WidgetFor(poseView->FirstColumn()->AttrHash());
|
||||
if (widget)
|
||||
rect.right = widget->CalcRect(loc, poseView->FirstColumn(), poseView).right;
|
||||
if (widget) {
|
||||
rect.right = widget->CalcRect(loc, poseView->FirstColumn(),
|
||||
poseView).right;
|
||||
}
|
||||
}
|
||||
|
||||
return rect;
|
||||
|
@ -55,11 +55,13 @@ enum {
|
||||
|
||||
class BPose {
|
||||
public:
|
||||
BPose(Model* adopt, BPoseView*, uint32 clipboardMode, bool selected = false);
|
||||
BPose(Model* adopt, BPoseView*, uint32 clipboardMode,
|
||||
bool selected = false);
|
||||
virtual ~BPose();
|
||||
|
||||
BTextWidget* AddWidget(BPoseView*, BColumn*);
|
||||
BTextWidget* AddWidget(BPoseView*, BColumn*, ModelNodeLazyOpener &opener);
|
||||
BTextWidget* AddWidget(BPoseView*, BColumn*,
|
||||
ModelNodeLazyOpener &opener);
|
||||
void RemoveWidget(BPoseView*, BColumn*);
|
||||
void SetLocation(BPoint, const BPoseView*);
|
||||
void MoveTo(BPoint, BPoseView*, bool inval = true);
|
||||
@ -68,13 +70,15 @@ class BPose {
|
||||
bool fullDraw = true);
|
||||
void Draw(BRect poseRect, const BRect& updateRect, BPoseView*,
|
||||
BView* drawView, bool fullDraw, BPoint offset, bool selected);
|
||||
void DeselectWithoutErasingBackground(BRect rect, BPoseView* poseView);
|
||||
void DeselectWithoutErasingBackground(BRect rect,
|
||||
BPoseView* poseView);
|
||||
// special purpose draw call for deselecting over a textured
|
||||
// background
|
||||
|
||||
void DrawBar(BPoint where, BView* view, icon_size kind);
|
||||
|
||||
void DrawIcon(BPoint, BView*, icon_size, bool direct, bool drawUnselected = false);
|
||||
void DrawIcon(BPoint, BView*, icon_size, bool direct,
|
||||
bool drawUnselected = false);
|
||||
void DrawToggleSwitch(BRect, BPoseView*);
|
||||
void MouseUp(BPoint poseLoc, BPoseView*, BPoint where, int32 index);
|
||||
Model* TargetModel() const;
|
||||
|
@ -73,7 +73,8 @@ public:
|
||||
|
||||
template<class EachParam1>
|
||||
void
|
||||
EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1),
|
||||
EachPoseAndModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, EachParam1),
|
||||
EachParam1 eachParam1)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
@ -87,8 +88,9 @@ EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1
|
||||
|
||||
template<class EachParam1>
|
||||
void
|
||||
EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32 ,
|
||||
EachParam1), EachParam1 eachParam1)
|
||||
EachPoseAndModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, int32, EachParam1),
|
||||
EachParam1 eachParam1)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -101,8 +103,9 @@ EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32 ,
|
||||
|
||||
template<class EachParam1, class EachParam2>
|
||||
void
|
||||
EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1,
|
||||
EachParam2), EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
EachPoseAndModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, EachParam1, EachParam2),
|
||||
EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -114,8 +117,9 @@ EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1
|
||||
|
||||
template<class EachParam1, class EachParam2>
|
||||
void
|
||||
EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32,
|
||||
EachParam1, EachParam2), EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
EachPoseAndModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, int32, EachParam1, EachParam2),
|
||||
EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -127,8 +131,8 @@ EachPoseAndModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32,
|
||||
|
||||
template<class EachParam1>
|
||||
void
|
||||
EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1),
|
||||
EachParam1 eachParam1)
|
||||
EachPoseAndResolvedModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, EachParam1), EachParam1 eachParam1)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -140,8 +144,9 @@ EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, Ea
|
||||
|
||||
template<class EachParam1>
|
||||
void
|
||||
EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32 ,
|
||||
EachParam1), EachParam1 eachParam1)
|
||||
EachPoseAndResolvedModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, int32 , EachParam1),
|
||||
EachParam1 eachParam1)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -153,8 +158,9 @@ EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, in
|
||||
|
||||
template<class EachParam1, class EachParam2>
|
||||
void
|
||||
EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, EachParam1,
|
||||
EachParam2), EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
EachPoseAndResolvedModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, EachParam1, EachParam2),
|
||||
EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
@ -166,8 +172,9 @@ EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, Ea
|
||||
|
||||
template<class EachParam1, class EachParam2>
|
||||
void
|
||||
EachPoseAndResolvedModel(PoseList* list, void (*eachFunction)(BPose*, Model*, int32,
|
||||
EachParam1, EachParam2), EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
EachPoseAndResolvedModel(PoseList* list,
|
||||
void (*eachFunction)(BPose*, Model*, int32, EachParam1, EachParam2),
|
||||
EachParam1 eachParam1, EachParam2 eachParam2)
|
||||
{
|
||||
for (int32 index = list->CountItems() - 1; index >= 0; index--) {
|
||||
BPose* pose = list->ItemAt(index);
|
||||
|
@ -203,7 +203,8 @@ PoseCompareAddWidget(const BPose* p1, const BPose* p2, BPoseView* view);
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
BPoseView::BPoseView(Model* model, BRect bounds, uint32 viewMode, uint32 resizeMask)
|
||||
BPoseView::BPoseView(Model* model, BRect bounds, uint32 viewMode,
|
||||
uint32 resizeMask)
|
||||
: BView(bounds, "PoseView", resizeMask, B_WILL_DRAW | B_PULSE_NEEDED),
|
||||
fIsDrawingSelectionRect(false),
|
||||
fHScrollBar(NULL),
|
||||
@ -265,7 +266,8 @@ BPoseView::BPoseView(Model* model, BRect bounds, uint32 viewMode, uint32 resizeM
|
||||
fDeskbarFrame(0, 0, -1, -1)
|
||||
{
|
||||
fViewState->SetViewMode(viewMode);
|
||||
fShowSelectionWhenInactive = TrackerSettings().ShowSelectionWhenInactive();
|
||||
fShowSelectionWhenInactive
|
||||
= TrackerSettings().ShowSelectionWhenInactive();
|
||||
fTransparentSelection = TrackerSettings().TransparentSelection();
|
||||
fFilterStrings.AddItem(new BString(""));
|
||||
}
|
||||
@ -400,7 +402,8 @@ BPoseView::RestoreColumnState(AttributeStreamNode* node)
|
||||
}
|
||||
|
||||
if (size > 0 && size < 10000) {
|
||||
// check for invalid sizes here to protect against munged attributes
|
||||
// check for invalid sizes here to protect against
|
||||
// munged attributes
|
||||
char* buffer = new char[size];
|
||||
off_t result = node->Read(name, 0, B_RAW_TYPE, size, buffer);
|
||||
if (result) {
|
||||
@ -468,7 +471,8 @@ BPoseView::AddColumnList(BObjectList<BColumn>* list)
|
||||
list->SortItems(&CompareColumns);
|
||||
|
||||
float nextLeftEdge = 0;
|
||||
for (int32 columIndex = 0; columIndex < list->CountItems(); columIndex++) {
|
||||
for (int32 columIndex = 0; columIndex < list->CountItems();
|
||||
columIndex++) {
|
||||
BColumn* column = list->ItemAt(columIndex);
|
||||
|
||||
// Make sure that columns don't overlap
|
||||
@ -477,12 +481,14 @@ BPoseView::AddColumnList(BObjectList<BColumn>* list)
|
||||
column->SetOffset(nextLeftEdge);
|
||||
}
|
||||
|
||||
nextLeftEdge = column->Offset() + column->Width() - kRoomForLine / 2.0f
|
||||
+ kTitleColumnExtraMargin;
|
||||
nextLeftEdge = column->Offset() + column->Width()
|
||||
- kRoomForLine / 2.0f + kTitleColumnExtraMargin;
|
||||
fColumnList->AddItem(column);
|
||||
|
||||
if (!IsWatchingDateFormatChange() && column->AttrType() == B_TIME_TYPE)
|
||||
if (!IsWatchingDateFormatChange()
|
||||
&& column->AttrType() == B_TIME_TYPE) {
|
||||
StartWatchDateFormatChange();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -514,15 +520,17 @@ BPoseView::RestoreState(AttributeStreamNode* node)
|
||||
}
|
||||
|
||||
if (size > 0 && size < 10000) {
|
||||
// check for invalid sizes here to protect against munged attributes
|
||||
// check for invalid sizes here to protect against
|
||||
// munged attributes
|
||||
char* buffer = new char[size];
|
||||
off_t result = node->Read(name, 0, B_RAW_TYPE, size, buffer);
|
||||
if (result) {
|
||||
BMallocIO stream;
|
||||
stream.WriteAt(0, buffer, size);
|
||||
stream.Seek(0, SEEK_SET);
|
||||
BViewState* viewstate = BViewState::InstantiateFromStream(&stream,
|
||||
wrongEndianness);
|
||||
BViewState* viewstate
|
||||
= BViewState::InstantiateFromStream(&stream,
|
||||
wrongEndianness);
|
||||
if (viewstate) {
|
||||
delete fViewState;
|
||||
fViewState = viewstate;
|
||||
@ -805,25 +813,28 @@ BPoseView::SavePoseLocations(BRect* frameIfDesktop)
|
||||
// nuke opposite endianness
|
||||
dir.RemoveAttr(poseInfoAttrForeign);
|
||||
|
||||
if (!isTrash && desktop && dir.WriteAttr(kAttrExtendedDisksPoseInfo,
|
||||
B_RAW_TYPE, 0,
|
||||
extendedPoseInfo, extendedPoseInfoSize)
|
||||
== (ssize_t)extendedPoseInfoSize)
|
||||
if (!isTrash && desktop
|
||||
&& dir.WriteAttr(kAttrExtendedDisksPoseInfo,
|
||||
B_RAW_TYPE, 0, extendedPoseInfo, extendedPoseInfoSize)
|
||||
== (ssize_t)extendedPoseInfoSize) {
|
||||
// nuke opposite endianness
|
||||
dir.RemoveAttr(kAttrExtendedDisksPoseInfoForegin);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
model->WriteAttrKillForeign(kAttrPoseInfo, kAttrPoseInfoForeign,
|
||||
B_RAW_TYPE, 0, &poseInfo, sizeof(poseInfo));
|
||||
model->WriteAttrKillForeign(kAttrPoseInfo,
|
||||
kAttrPoseInfoForeign, B_RAW_TYPE, 0, &poseInfo,
|
||||
sizeof(poseInfo));
|
||||
|
||||
if (desktop) {
|
||||
model->WriteAttrKillForeign(kAttrExtendedPoseInfo,
|
||||
kAttrExtendedPoseInfoForegin,
|
||||
B_RAW_TYPE, 0, extendedPoseInfo, extendedPoseInfoSize);
|
||||
B_RAW_TYPE, 0, extendedPoseInfo,
|
||||
extendedPoseInfoSize);
|
||||
}
|
||||
}
|
||||
|
||||
delete [] (char*)extendedPoseInfo;
|
||||
delete[] (char*)extendedPoseInfo;
|
||||
// TODO: fix up this mess
|
||||
}
|
||||
}
|
||||
@ -935,15 +946,19 @@ BPoseView::AttachedToWindow()
|
||||
if (fIsDesktopWindow)
|
||||
AddFilter(new TPoseViewFilter(this));
|
||||
|
||||
AddFilter(new ShortcutFilter(B_RETURN, B_OPTION_KEY, kOpenSelection, this));
|
||||
// add Option-Return as a shortcut filter because AddShortcut doesn't allow
|
||||
// us to have shortcuts without Command yet
|
||||
AddFilter(new ShortcutFilter(B_RETURN, B_OPTION_KEY, kOpenSelection,
|
||||
this));
|
||||
// add Option-Return as a shortcut filter because AddShortcut
|
||||
// doesn't allow us to have shortcuts without Command yet
|
||||
AddFilter(new ShortcutFilter(B_ESCAPE, 0, B_CANCEL, this));
|
||||
// Escape key, used to abort an on-going clipboard cut or filtering
|
||||
AddFilter(new ShortcutFilter(B_ESCAPE, B_SHIFT_KEY, kCancelSelectionToClipboard, this));
|
||||
// Escape + SHIFT will remove current selection from clipboard, or all poses from current folder if 0 selected
|
||||
AddFilter(new ShortcutFilter(B_ESCAPE, B_SHIFT_KEY,
|
||||
kCancelSelectionToClipboard, this));
|
||||
// Escape + SHIFT will remove current selection from clipboard,
|
||||
// or all poses from current folder if 0 selected
|
||||
|
||||
AddFilter(new LongAndDragTrackingFilter(kMsgMouseLongDown, kMsgMouseDragged));
|
||||
AddFilter(new LongAndDragTrackingFilter(kMsgMouseLongDown,
|
||||
kMsgMouseDragged));
|
||||
|
||||
fLastLeftTop = LeftTop();
|
||||
BFont font(be_plain_font);
|
||||
@ -954,7 +969,8 @@ BPoseView::AttachedToWindow()
|
||||
// static - init just once
|
||||
if (sFontHeight == -1) {
|
||||
font.GetHeight(&sFontInfo);
|
||||
sFontHeight = sFontInfo.ascent + sFontInfo.descent + sFontInfo.leading;
|
||||
sFontHeight = sFontInfo.ascent + sFontInfo.descent
|
||||
+ sFontInfo.leading;
|
||||
}
|
||||
|
||||
if (TTracker* app = dynamic_cast<TTracker*>(be_app)) {
|
||||
@ -981,7 +997,8 @@ BPoseView::SetIconPoseHeight()
|
||||
|
||||
case kMiniIconMode:
|
||||
fViewState->SetIconSize(B_MINI_ICON);
|
||||
fIconPoseHeight = ceilf(sFontHeight < IconSizeInt() ? IconSizeInt() : sFontHeight + 1);
|
||||
fIconPoseHeight = ceilf(sFontHeight <
|
||||
IconSizeInt() ? IconSizeInt() : sFontHeight + 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1263,7 +1280,7 @@ BPoseView::AddPosesTask(void* castToParams)
|
||||
{
|
||||
// AddPosesTask reeds a bunch of models and passes them off to
|
||||
// the pose placing and drawing routine.
|
||||
//
|
||||
|
||||
AddPosesParams* params = (AddPosesParams*)castToParams;
|
||||
BMessenger target(params->target);
|
||||
entry_ref ref(params->ref);
|
||||
@ -1318,8 +1335,9 @@ BPoseView::AddPosesTask(void* castToParams)
|
||||
node_ref itemNode;
|
||||
|
||||
posesResult->fModels[modelChunkIndex] = 0;
|
||||
// ToDo - redo this so that modelChunkIndex increments right before
|
||||
// a new model is added to the array; start with modelChunkIndex = -1
|
||||
// ToDo - redo this so that modelChunkIndex increments
|
||||
// right before a new model is added to the array;
|
||||
// start with modelChunkIndex = -1
|
||||
|
||||
int32 count = container->GetNextDirents(eptr, 1024, 1);
|
||||
if (count <= 0 && !modelChunkIndex)
|
||||
@ -1328,9 +1346,11 @@ BPoseView::AddPosesTask(void* castToParams)
|
||||
if (count) {
|
||||
ASSERT(count == 1);
|
||||
|
||||
if ((!hideDotFiles && (!strcmp(eptr->d_name, ".") || !strcmp(eptr->d_name, "..")))
|
||||
|| (hideDotFiles && eptr->d_name[0] == '.'))
|
||||
if ((!hideDotFiles && (!strcmp(eptr->d_name, ".")
|
||||
|| !strcmp(eptr->d_name, "..")))
|
||||
|| (hideDotFiles && eptr->d_name[0] == '.')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
dirNode.device = eptr->d_pdev;
|
||||
dirNode.node = eptr->d_pino;
|
||||
|
Loading…
Reference in New Issue
Block a user