Merge branch 'master' into x86_64
This commit is contained in:
@@ -4,3 +4,5 @@ build/user_config_headers
|
||||
|
||||
# ignore KDE backup files ending with a ~
|
||||
*~
|
||||
# Vim swp files
|
||||
.*.swp
|
||||
|
||||
@@ -130,11 +130,18 @@ copy_headers $haikuSourceDir/headers/posix $tmpIncludeDir/posix
|
||||
|
||||
# configure gcc
|
||||
cd $gccObjDir
|
||||
case `uname` in
|
||||
Darwin)
|
||||
# GCC 2 compiled for x86_64 OS X is broken, compile for i386.
|
||||
export CC="gcc -arch i386"
|
||||
;;
|
||||
esac
|
||||
CFLAGS="-O2 -U_FORTIFY_SOURCE" CXXFLAGS="-O2" $buildToolsDir/gcc/configure \
|
||||
--prefix=$installDir \
|
||||
--target=i586-pc-haiku --disable-nls --enable-shared=yes \
|
||||
--enable-languages=c,c++ --with-headers=$tmpIncludeDir \
|
||||
--with-libs=$tmpLibDir || exit 1
|
||||
unset CC
|
||||
|
||||
# hack the Makefile to avoid trouble with stuff we don't need anyway
|
||||
sedExpr=
|
||||
|
||||
@@ -102,14 +102,6 @@ protected:
|
||||
void SetupErrorBuffer(int x, int y, int width);
|
||||
void DitherFloydSteinberg(uchar* destination,
|
||||
const uchar* source, int x, int y, int width);
|
||||
// Do nothing method to get around a bug in
|
||||
// the gcc2 cross-compiler built on Mac OS X
|
||||
// Lion where a compiler error occurs when
|
||||
// assigning a member function pointer to NULL
|
||||
// or 0: cast specifies signature type.
|
||||
// However, this should be legal according to
|
||||
// the C++03 standard.
|
||||
void DitherNone(uchar*, const uchar*, int, int, int) {};
|
||||
|
||||
private:
|
||||
enum {
|
||||
|
||||
@@ -80,9 +80,9 @@ private:
|
||||
void _InitData();
|
||||
void _InitMenuData(BMenu* menu);
|
||||
|
||||
void _DrawMarkSymbol(rgb_color backgroundColor);
|
||||
void _DrawMarkSymbol();
|
||||
void _DrawShortcutSymbol();
|
||||
void _DrawSubmenuSymbol(rgb_color backgroundColor);
|
||||
void _DrawSubmenuSymbol();
|
||||
void _DrawControlChar(char shortcut, BPoint where);
|
||||
|
||||
private:
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
Resampler::Resampler(uint32 src_format, uint32 dst_format)
|
||||
:
|
||||
fFunc(&Resampler::no_conversion)
|
||||
fFunc(0)
|
||||
{
|
||||
if (dst_format == media_raw_audio_format::B_AUDIO_FLOAT) {
|
||||
switch (src_format) {
|
||||
@@ -81,7 +81,7 @@ Resampler::~Resampler()
|
||||
status_t
|
||||
Resampler::InitCheck() const
|
||||
{
|
||||
return fFunc != &Resampler::no_conversion ? B_OK : B_ERROR;
|
||||
return fFunc != 0 ? B_OK : B_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -65,15 +65,6 @@ private:
|
||||
int32 srcSampleOffset, int32 srcSampleCount,
|
||||
void* dest, int32 destSampleOffset,
|
||||
int32 destSampleCount, float gain);
|
||||
// Do nothing method to get around a bug in
|
||||
// the gcc2 cross-compiler built on Mac OS X
|
||||
// Lion where a compiler error occurs when
|
||||
// assigning a member function pointer to NULL
|
||||
// or 0: cast specifies signature type.
|
||||
// However, this should be legal according to
|
||||
// the C++03 standard.
|
||||
void no_conversion(const void*, int32, int32, void*,
|
||||
int32, int32, float) {};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -594,14 +594,20 @@ CliDebugger::Run(const Options& options)
|
||||
if (!get_debugged_program(options, programInfo))
|
||||
return false;
|
||||
|
||||
if (start_team_debugger(programInfo.team, &settingsManager, this,
|
||||
programInfo.thread, programInfo.stopInMain, userInterface)
|
||||
== NULL) {
|
||||
TeamDebugger* teamDebugger = start_team_debugger(programInfo.team,
|
||||
&settingsManager, this, programInfo.thread, programInfo.stopInMain,
|
||||
userInterface);
|
||||
if (teamDebugger == NULL)
|
||||
return false;
|
||||
}
|
||||
|
||||
thread_id teamDebuggerThread = teamDebugger->Thread();
|
||||
|
||||
// run the input loop
|
||||
userInterface->Run();
|
||||
|
||||
// wait for the team debugger thread to terminate
|
||||
wait_for_thread(teamDebuggerThread, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
#include <new>
|
||||
|
||||
#include <AutoDeleter.h>
|
||||
#include <Entry.h>
|
||||
#include <FindDirectory.h>
|
||||
#include <Path.h>
|
||||
|
||||
#include "AttributeClasses.h"
|
||||
#include "AttributeValue.h"
|
||||
@@ -27,6 +30,30 @@
|
||||
#include "Variant.h"
|
||||
|
||||
|
||||
// #pragma mark - AutoSectionPutter
|
||||
|
||||
|
||||
class AutoSectionPutter {
|
||||
public:
|
||||
AutoSectionPutter(ElfFile* elfFile, ElfSection* elfSection)
|
||||
:
|
||||
fElfFile(elfFile),
|
||||
fElfSection(elfSection)
|
||||
{
|
||||
}
|
||||
|
||||
~AutoSectionPutter()
|
||||
{
|
||||
if (fElfSection != NULL)
|
||||
fElfFile->PutSection(fElfSection);
|
||||
}
|
||||
|
||||
private:
|
||||
ElfFile* fElfFile;
|
||||
ElfSection* fElfSection;
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - ExpressionEvaluationContext
|
||||
|
||||
|
||||
@@ -281,7 +308,9 @@ private:
|
||||
DwarfFile::DwarfFile()
|
||||
:
|
||||
fName(NULL),
|
||||
fAlternateName(NULL),
|
||||
fElfFile(NULL),
|
||||
fAlternateElfFile(NULL),
|
||||
fDebugInfoSection(NULL),
|
||||
fDebugAbbrevSection(NULL),
|
||||
fDebugStringSection(NULL),
|
||||
@@ -305,19 +334,24 @@ DwarfFile::~DwarfFile()
|
||||
delete table;
|
||||
|
||||
if (fElfFile != NULL) {
|
||||
fElfFile->PutSection(fDebugInfoSection);
|
||||
fElfFile->PutSection(fDebugAbbrevSection);
|
||||
fElfFile->PutSection(fDebugStringSection);
|
||||
fElfFile->PutSection(fDebugRangesSection);
|
||||
fElfFile->PutSection(fDebugLineSection);
|
||||
fElfFile->PutSection(fDebugFrameSection);
|
||||
ElfFile* debugInfoFile = fAlternateElfFile != NULL
|
||||
? fAlternateElfFile : fElfFile;
|
||||
|
||||
debugInfoFile->PutSection(fDebugInfoSection);
|
||||
debugInfoFile->PutSection(fDebugAbbrevSection);
|
||||
debugInfoFile->PutSection(fDebugStringSection);
|
||||
debugInfoFile->PutSection(fDebugRangesSection);
|
||||
debugInfoFile->PutSection(fDebugLineSection);
|
||||
debugInfoFile->PutSection(fDebugFrameSection);
|
||||
fElfFile->PutSection(fEHFrameSection);
|
||||
fElfFile->PutSection(fDebugLocationSection);
|
||||
fElfFile->PutSection(fDebugPublicTypesSection);
|
||||
debugInfoFile->PutSection(fDebugLocationSection);
|
||||
debugInfoFile->PutSection(fDebugPublicTypesSection);
|
||||
delete fElfFile;
|
||||
delete fAlternateElfFile;
|
||||
}
|
||||
|
||||
free(fName);
|
||||
free(fAlternateName);
|
||||
}
|
||||
|
||||
|
||||
@@ -337,23 +371,24 @@ DwarfFile::Load(const char* fileName)
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
// get the interesting sections
|
||||
fDebugInfoSection = fElfFile->GetSection(".debug_info");
|
||||
fDebugAbbrevSection = fElfFile->GetSection(".debug_abbrev");
|
||||
if (fDebugInfoSection == NULL || fDebugAbbrevSection == NULL) {
|
||||
WARNING("DwarfManager::File::Load(\"%s\"): no "
|
||||
".debug_info or .debug_abbrev.\n", fileName);
|
||||
return B_ERROR;
|
||||
}
|
||||
error = _LocateDebugInfo();
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
ElfFile* debugInfoFile = fAlternateElfFile != NULL
|
||||
? fAlternateElfFile : fElfFile;
|
||||
|
||||
// non mandatory sections
|
||||
fDebugStringSection = fElfFile->GetSection(".debug_str");
|
||||
fDebugRangesSection = fElfFile->GetSection(".debug_ranges");
|
||||
fDebugLineSection = fElfFile->GetSection(".debug_line");
|
||||
fDebugFrameSection = fElfFile->GetSection(".debug_frame");
|
||||
fDebugStringSection = debugInfoFile->GetSection(".debug_str");
|
||||
fDebugRangesSection = debugInfoFile->GetSection(".debug_ranges");
|
||||
fDebugLineSection = debugInfoFile->GetSection(".debug_line");
|
||||
fDebugFrameSection = debugInfoFile->GetSection(".debug_frame");
|
||||
// .eh_frame doesn't appear to get copied into separate debug
|
||||
// info files properly, therefore always use it off the main
|
||||
// executable image
|
||||
fEHFrameSection = fElfFile->GetSection(".eh_frame");
|
||||
fDebugLocationSection = fElfFile->GetSection(".debug_loc");
|
||||
fDebugPublicTypesSection = fElfFile->GetSection(".debug_pubtypes");
|
||||
fDebugLocationSection = debugInfoFile->GetSection(".debug_loc");
|
||||
fDebugPublicTypesSection = debugInfoFile->GetSection(".debug_pubtypes");
|
||||
|
||||
// iterate through the debug info section
|
||||
DataReader dataReader(fDebugInfoSection->Data(),
|
||||
@@ -2224,3 +2259,107 @@ DwarfFile::_FindLocationExpression(CompilationUnit* unit, uint64 offset,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
DwarfFile::_LocateDebugInfo()
|
||||
{
|
||||
ElfFile* debugInfoFile = fElfFile;
|
||||
ElfSection* debugLinkSection = fElfFile->GetSection(".gnu_debuglink");
|
||||
if (debugLinkSection != NULL) {
|
||||
AutoSectionPutter putter(fElfFile, debugLinkSection);
|
||||
|
||||
// the file specifies a debug link, look at its target instead
|
||||
// for debug information.
|
||||
// Format: null-terminated filename, as many 0 padding bytes as
|
||||
// needed to reach the next 32-bit address boundary, followed
|
||||
// by a 32-bit CRC
|
||||
|
||||
BString debugPath;
|
||||
status_t result = _GetDebugInfoPath(
|
||||
(const char*)debugLinkSection->Data(), debugPath);
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
|
||||
fAlternateName = strdup(debugPath.String());
|
||||
|
||||
if (fAlternateName == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
/*
|
||||
// TODO: validate CRC
|
||||
int32 debugCRC = *(int32*)((char*)debugLinkSection->Data()
|
||||
+ debugLinkSection->Size() - sizeof(int32));
|
||||
*/
|
||||
fAlternateElfFile = new(std::nothrow) ElfFile;
|
||||
if (fAlternateElfFile == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
result = fAlternateElfFile->Init(fAlternateName);
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
|
||||
debugInfoFile = fAlternateElfFile;
|
||||
}
|
||||
|
||||
// get the interesting sections
|
||||
fDebugInfoSection = debugInfoFile->GetSection(".debug_info");
|
||||
fDebugAbbrevSection = debugInfoFile->GetSection(".debug_abbrev");
|
||||
if (fDebugInfoSection == NULL || fDebugAbbrevSection == NULL) {
|
||||
WARNING("DwarfManager::File::Load(\"%s\"): no "
|
||||
".debug_info or .debug_abbrev.\n", fName);
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
DwarfFile::_GetDebugInfoPath(const char* debugFileName, BString& _infoPath)
|
||||
{
|
||||
const directory_which dirLocations[] = { B_USER_CONFIG_DIRECTORY,
|
||||
B_COMMON_DIRECTORY, B_SYSTEM_DIRECTORY };
|
||||
|
||||
// first, see if we have a relative match to our local directory
|
||||
BPath basePath;
|
||||
status_t result = basePath.SetTo(fName);
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
basePath.GetParent(&basePath);
|
||||
if (strcmp(basePath.Leaf(), "lib") == 0 || strcmp(basePath.Leaf(),
|
||||
"add-ons") == 0) {
|
||||
_infoPath.SetToFormat("%s/../debug/%s", basePath.Path(),
|
||||
debugFileName);
|
||||
} else
|
||||
_infoPath.SetToFormat("%s/debug/%s", basePath.Path(), debugFileName);
|
||||
|
||||
BEntry entry(_infoPath.String());
|
||||
result = entry.InitCheck();
|
||||
if (result != B_OK && result != B_ENTRY_NOT_FOUND)
|
||||
return result;
|
||||
if (entry.Exists())
|
||||
return B_OK;
|
||||
|
||||
// See if our image is in any of the system locations.
|
||||
// if so, look for its debug info in the corresponding location.
|
||||
for (uint16 i = 0; i < sizeof(dirLocations) / sizeof(directory_which);
|
||||
i++) {
|
||||
result = find_directory(dirLocations[i], &basePath);
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
|
||||
if (strncmp(fName, basePath.Path(), strlen(basePath.Path())) == 0) {
|
||||
_infoPath.SetToFormat("%s/develop/debug/%s", basePath.Path(),
|
||||
debugFileName);
|
||||
entry.SetTo(_infoPath.String());
|
||||
result = entry.InitCheck();
|
||||
if (result != B_OK && result != B_ENTRY_NOT_FOUND)
|
||||
return result;
|
||||
return entry.Exists() ? B_OK : B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
return B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
@@ -150,12 +150,18 @@ private:
|
||||
const void*& _expression,
|
||||
off_t& _length) const;
|
||||
|
||||
status_t _LocateDebugInfo();
|
||||
status_t _GetDebugInfoPath(const char* fileName,
|
||||
BString& _infoPath);
|
||||
|
||||
private:
|
||||
friend class DwarfFile::ExpressionEvaluationContext;
|
||||
|
||||
private:
|
||||
char* fName;
|
||||
char* fAlternateName;
|
||||
ElfFile* fElfFile;
|
||||
ElfFile* fAlternateElfFile;
|
||||
ElfSection* fDebugInfoSection;
|
||||
ElfSection* fDebugAbbrevSection;
|
||||
ElfSection* fDebugStringSection;
|
||||
|
||||
@@ -68,11 +68,11 @@ public:
|
||||
|
||||
class UserInterfaceListener {
|
||||
public:
|
||||
enum QuitOption {
|
||||
QUIT_OPTION_ASK_USER,
|
||||
QUIT_OPTION_ASK_KILL_TEAM,
|
||||
QUIT_OPTION_ASK_RESUME_TEAM
|
||||
};
|
||||
enum QuitOption {
|
||||
QUIT_OPTION_ASK_USER,
|
||||
QUIT_OPTION_ASK_KILL_TEAM,
|
||||
QUIT_OPTION_ASK_RESUME_TEAM
|
||||
};
|
||||
|
||||
public:
|
||||
virtual ~UserInterfaceListener();
|
||||
|
||||
@@ -28,16 +28,22 @@ CliContext::CliContext()
|
||||
fHistory(NULL),
|
||||
fPrompt(NULL),
|
||||
fBlockingSemaphore(-1),
|
||||
fInputLoopWaitingForEvents(0),
|
||||
fEventsOccurred(0),
|
||||
fInputLoopWaiting(false),
|
||||
fTerminating(false)
|
||||
{
|
||||
sCurrentContext = this;
|
||||
}
|
||||
|
||||
|
||||
CliContext::~CliContext()
|
||||
{
|
||||
Cleanup();
|
||||
sCurrentContext = NULL;
|
||||
|
||||
if (fBlockingSemaphore >= 0)
|
||||
delete_sem(fBlockingSemaphore);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +53,8 @@ CliContext::Init(Team* team, UserInterfaceListener* listener)
|
||||
fTeam = team;
|
||||
fListener = listener;
|
||||
|
||||
fTeam->AddListener(this);
|
||||
|
||||
status_t error = fLock.InitCheck();
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
@@ -88,6 +96,11 @@ CliContext::Cleanup()
|
||||
history_end(fHistory);
|
||||
fHistory = NULL;
|
||||
}
|
||||
|
||||
if (fTeam != NULL) {
|
||||
fTeam->RemoveListener(this);
|
||||
fTeam = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -97,13 +110,7 @@ CliContext::Terminating()
|
||||
AutoLocker<BLocker> locker(fLock);
|
||||
|
||||
fTerminating = true;
|
||||
|
||||
if (fBlockingSemaphore >= 0) {
|
||||
delete_sem(fBlockingSemaphore);
|
||||
fBlockingSemaphore = -1;
|
||||
}
|
||||
|
||||
fInputLoopWaiting = false;
|
||||
_SignalInputLoop(EVENT_QUIT);
|
||||
|
||||
// TODO: Signal the input loop, should it be in PromptUser()!
|
||||
}
|
||||
@@ -134,27 +141,104 @@ CliContext::AddLineToInputHistory(const char* line)
|
||||
void
|
||||
CliContext::QuitSession(bool killTeam)
|
||||
{
|
||||
AutoLocker<BLocker> locker(fLock);
|
||||
|
||||
sem_id blockingSemaphore = fBlockingSemaphore;
|
||||
fInputLoopWaiting = true;
|
||||
|
||||
locker.Unlock();
|
||||
_PrepareToWaitForEvents(EVENT_QUIT);
|
||||
|
||||
fListener->UserInterfaceQuitRequested(
|
||||
killTeam
|
||||
? UserInterfaceListener::QUIT_OPTION_ASK_KILL_TEAM
|
||||
: UserInterfaceListener::QUIT_OPTION_ASK_RESUME_TEAM);
|
||||
|
||||
while (acquire_sem(blockingSemaphore) == B_INTERRUPTED) {
|
||||
}
|
||||
_WaitForEvents();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CliContext::WaitForThreadOrUser()
|
||||
{
|
||||
// TODO:...
|
||||
// TODO: Deal with SIGINT as well!
|
||||
for (;;) {
|
||||
_PrepareToWaitForEvents(
|
||||
EVENT_USER_INTERRUPT | EVENT_THREAD_STATE_CHANGED);
|
||||
|
||||
// check whether there are any threads stopped already
|
||||
thread_id stoppedThread = -1;
|
||||
AutoLocker<Team> teamLocker(fTeam);
|
||||
|
||||
for (ThreadList::ConstIterator it = fTeam->Threads().GetIterator();
|
||||
Thread* thread = it.Next();) {
|
||||
if (thread->State() == THREAD_STATE_STOPPED) {
|
||||
stoppedThread = thread->ID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
teamLocker.Unlock();
|
||||
|
||||
if (stoppedThread >= 0)
|
||||
_SignalInputLoop(EVENT_THREAD_STATE_CHANGED);
|
||||
|
||||
uint32 events = _WaitForEvents();
|
||||
if ((events & EVENT_QUIT) != 0 || stoppedThread >= 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CliContext::ThreadStateChanged(const Team::ThreadEvent& event)
|
||||
{
|
||||
_SignalInputLoop(EVENT_THREAD_STATE_CHANGED);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CliContext::_PrepareToWaitForEvents(uint32 eventMask)
|
||||
{
|
||||
// Set the events we're going to wait for -- always wait for "quit".
|
||||
AutoLocker<BLocker> locker(fLock);
|
||||
fInputLoopWaitingForEvents = eventMask | EVENT_QUIT;
|
||||
fEventsOccurred = fTerminating ? EVENT_QUIT : 0;
|
||||
}
|
||||
|
||||
|
||||
uint32
|
||||
CliContext::_WaitForEvents()
|
||||
{
|
||||
AutoLocker<BLocker> locker(fLock);
|
||||
|
||||
if (fEventsOccurred == 0) {
|
||||
sem_id blockingSemaphore = fBlockingSemaphore;
|
||||
fInputLoopWaiting = true;
|
||||
|
||||
locker.Unlock();
|
||||
|
||||
while (acquire_sem(blockingSemaphore) == B_INTERRUPTED) {
|
||||
}
|
||||
|
||||
locker.Lock();
|
||||
}
|
||||
|
||||
uint32 events = fEventsOccurred;
|
||||
fEventsOccurred = 0;
|
||||
return events;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CliContext::_SignalInputLoop(uint32 events)
|
||||
{
|
||||
AutoLocker<BLocker> locker(fLock);
|
||||
|
||||
if ((fInputLoopWaitingForEvents & events) == 0)
|
||||
return;
|
||||
|
||||
fEventsOccurred = fInputLoopWaitingForEvents & events;
|
||||
fInputLoopWaitingForEvents = 0;
|
||||
|
||||
if (fInputLoopWaiting) {
|
||||
fInputLoopWaiting = false;
|
||||
release_sem(fBlockingSemaphore);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -12,12 +12,21 @@
|
||||
|
||||
#include <Locker.h>
|
||||
|
||||
#include "Team.h"
|
||||
|
||||
|
||||
class Team;
|
||||
class UserInterfaceListener;
|
||||
|
||||
|
||||
class CliContext {
|
||||
class CliContext : private Team::Listener {
|
||||
public:
|
||||
enum {
|
||||
EVENT_QUIT = 0x01,
|
||||
EVENT_USER_INTERRUPT = 0x02,
|
||||
EVENT_THREAD_STATE_CHANGED = 0x04,
|
||||
};
|
||||
|
||||
public:
|
||||
CliContext();
|
||||
~CliContext();
|
||||
@@ -40,6 +49,15 @@ public:
|
||||
void WaitForThreadOrUser();
|
||||
|
||||
private:
|
||||
// Team::Listener
|
||||
virtual void ThreadStateChanged(
|
||||
const Team::ThreadEvent& event);
|
||||
|
||||
private:
|
||||
void _PrepareToWaitForEvents(uint32 eventMask);
|
||||
uint32 _WaitForEvents();
|
||||
void _SignalInputLoop(uint32 events);
|
||||
|
||||
static const char* _GetPrompt(EditLine* editLine);
|
||||
|
||||
private:
|
||||
@@ -50,6 +68,8 @@ private:
|
||||
History* fHistory;
|
||||
const char* fPrompt;
|
||||
sem_id fBlockingSemaphore;
|
||||
uint32 fInputLoopWaitingForEvents;
|
||||
uint32 fEventsOccurred;
|
||||
bool fInputLoopWaiting;
|
||||
volatile bool fTerminating;
|
||||
};
|
||||
|
||||
@@ -858,7 +858,7 @@ void
|
||||
TBarApp::FetchAppIcon(const char* signature, BBitmap* icon)
|
||||
{
|
||||
app_info appInfo;
|
||||
icon_size size = icon->Bounds().IntegerHeight() >= 32
|
||||
icon_size size = icon->Bounds().IntegerHeight() >= 31
|
||||
? B_LARGE_ICON : B_MINI_ICON;
|
||||
|
||||
if (be_roster->GetAppInfo(signature, &appInfo) == B_OK) {
|
||||
|
||||
@@ -53,7 +53,7 @@ static const uint32 kHidePassword = 'hdpw';
|
||||
AuthenticationPanel::AuthenticationPanel(BRect parentFrame)
|
||||
:
|
||||
BWindow(BRect(-1000, -1000, -900, -900),
|
||||
B_TRANSLATE("Authentication Required"), B_TITLED_WINDOW_LOOK,
|
||||
B_TRANSLATE("Authentication required"), B_TITLED_WINDOW_LOOK,
|
||||
B_MODAL_APP_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS | B_NOT_RESIZABLE
|
||||
| B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE | B_AUTO_UPDATE_SIZE_LIMITS),
|
||||
m_parentWindowFrame(parentFrame),
|
||||
|
||||
@@ -356,7 +356,7 @@ BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings,
|
||||
menu->AddItem(fZoomTextOnlyMenuItem);
|
||||
|
||||
menu->AddSeparatorItem();
|
||||
fFullscreenItem = new BMenuItem(B_TRANSLATE("Fullscreen"),
|
||||
fFullscreenItem = new BMenuItem(B_TRANSLATE("Full screen"),
|
||||
new BMessage(TOGGLE_FULLSCREEN), B_RETURN);
|
||||
menu->AddItem(fFullscreenItem);
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Page source"),
|
||||
@@ -987,13 +987,6 @@ BrowserWindow::MenusBeginning()
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BrowserWindow::Zoom(BPoint origin, float width, float height)
|
||||
{
|
||||
ToggleFullscreen();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BrowserWindow::ScreenChanged(BRect screenSize, color_space format)
|
||||
{
|
||||
@@ -1234,8 +1227,8 @@ BrowserWindow::LoadNegotiating(const BString& url, BWebView* view)
|
||||
|
||||
fURLInputGroup->SetText(url.String());
|
||||
|
||||
BString status(B_TRANSLATE("Requesting: "));
|
||||
status << url;
|
||||
BString status(B_TRANSLATE("Requesting %url"));
|
||||
status.ReplaceFirst("%url", url);
|
||||
view->WebPage()->SetStatusMessage(status);
|
||||
}
|
||||
|
||||
@@ -1249,8 +1242,8 @@ BrowserWindow::LoadCommitted(const BString& url, BWebView* view)
|
||||
// This hook is invoked when the load is commited.
|
||||
fURLInputGroup->SetText(url.String());
|
||||
|
||||
BString status(B_TRANSLATE("Loading: "));
|
||||
status << url;
|
||||
BString status(B_TRANSLATE("Loading %url"));
|
||||
status.ReplaceFirst("%url", url);
|
||||
view->WebPage()->SetStatusMessage(status);
|
||||
}
|
||||
|
||||
@@ -1275,7 +1268,7 @@ BrowserWindow::LoadFailed(const BString& url, BWebView* view)
|
||||
if (view != CurrentWebView())
|
||||
return;
|
||||
|
||||
BString status(B_TRANSLATE_COMMENT("%url failed.", "Loading URL failed. "
|
||||
BString status(B_TRANSLATE_COMMENT("%url failed", "Loading URL failed. "
|
||||
"Don't translate variable %url."));
|
||||
status.ReplaceFirst("%url", url);
|
||||
view->WebPage()->SetStatusMessage(status);
|
||||
@@ -1290,7 +1283,7 @@ BrowserWindow::LoadFinished(const BString& url, BWebView* view)
|
||||
if (view != CurrentWebView())
|
||||
return;
|
||||
|
||||
BString status(B_TRANSLATE_COMMENT("%url finished.", "Loading URL "
|
||||
BString status(B_TRANSLATE_COMMENT("%url finished", "Loading URL "
|
||||
"finished. Don't translate variable %url."));
|
||||
status.ReplaceFirst("%url", url);
|
||||
view->WebPage()->SetStatusMessage(status);
|
||||
|
||||
@@ -96,7 +96,6 @@ public:
|
||||
virtual bool QuitRequested();
|
||||
virtual void MenusBeginning();
|
||||
|
||||
virtual void Zoom(BPoint origin, float width, float height);
|
||||
virtual void ScreenChanged(BRect screenSize,
|
||||
color_space format);
|
||||
virtual void WorkspacesChanged(uint32 oldWorkspaces,
|
||||
|
||||
@@ -326,22 +326,22 @@ SettingsWindow::_CreateGeneralPage(float spacing)
|
||||
fDaysInHistoryMenuControl->TextView()->DisallowChar(i);
|
||||
|
||||
fShowTabsIfOnlyOnePage = new BCheckBox("show tabs if only one page",
|
||||
B_TRANSLATE("Show tabs if only one page is open."),
|
||||
B_TRANSLATE("Show tabs if only one page is open"),
|
||||
new BMessage(MSG_TAB_DISPLAY_BEHAVIOR_CHANGED));
|
||||
fShowTabsIfOnlyOnePage->SetValue(B_CONTROL_ON);
|
||||
|
||||
fAutoHideInterfaceInFullscreenMode = new BCheckBox("auto-hide interface",
|
||||
B_TRANSLATE("Auto-hide interface in fullscreen mode."),
|
||||
B_TRANSLATE("Auto-hide interface in full screen mode"),
|
||||
new BMessage(MSG_AUTO_HIDE_INTERFACE_BEHAVIOR_CHANGED));
|
||||
fAutoHideInterfaceInFullscreenMode->SetValue(B_CONTROL_OFF);
|
||||
|
||||
fAutoHidePointer = new BCheckBox("auto-hide pointer",
|
||||
B_TRANSLATE("Auto-hide mouse pointer."),
|
||||
B_TRANSLATE("Auto-hide mouse pointer"),
|
||||
new BMessage(MSG_AUTO_HIDE_POINTER_BEHAVIOR_CHANGED));
|
||||
fAutoHidePointer->SetValue(B_CONTROL_OFF);
|
||||
|
||||
fShowHomeButton = new BCheckBox("show home button",
|
||||
B_TRANSLATE("Show Home Button"),
|
||||
B_TRANSLATE("Show home button"),
|
||||
new BMessage(MSG_SHOW_HOME_BUTTON_CHANGED));
|
||||
fShowHomeButton->SetValue(B_CONTROL_ON);
|
||||
|
||||
@@ -445,7 +445,7 @@ BView*
|
||||
SettingsWindow::_CreateProxyPage(float spacing)
|
||||
{
|
||||
fUseProxyCheckBox = new BCheckBox("use proxy",
|
||||
B_TRANSLATE("Use proxy server to connect to the internet."),
|
||||
B_TRANSLATE("Use proxy server to connect to the internet"),
|
||||
new BMessage(MSG_USE_PROXY_CHANGED));
|
||||
fUseProxyCheckBox->SetValue(B_CONTROL_ON);
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ TabContainerView::MouseDown(BPoint where)
|
||||
else {
|
||||
if ((buttons & B_TERTIARY_MOUSE_BUTTON) != 0) {
|
||||
// Middle click outside tabs should always open a new tab.
|
||||
fClickCount = 2;
|
||||
fController->DoubleClickOutsideTabs();
|
||||
} else if (clicks > 1)
|
||||
fClickCount++;
|
||||
else
|
||||
|
||||
@@ -454,7 +454,6 @@ private:
|
||||
TabManagerController* fController;
|
||||
bool fOverCloseRect;
|
||||
bool fClicked;
|
||||
bool fCloseOnMouseUp;
|
||||
};
|
||||
|
||||
|
||||
@@ -464,8 +463,7 @@ WebTabView::WebTabView(TabManagerController* controller)
|
||||
fIcon(NULL),
|
||||
fController(controller),
|
||||
fOverCloseRect(false),
|
||||
fClicked(false),
|
||||
fCloseOnMouseUp(false)
|
||||
fClicked(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -539,7 +537,8 @@ void
|
||||
WebTabView::MouseDown(BPoint where, uint32 buttons)
|
||||
{
|
||||
if (buttons & B_TERTIARY_MOUSE_BUTTON) {
|
||||
fCloseOnMouseUp = true;
|
||||
// Immediately close tab
|
||||
fController->CloseTab(ContainerView()->IndexOf(this));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -557,20 +556,12 @@ WebTabView::MouseDown(BPoint where, uint32 buttons)
|
||||
void
|
||||
WebTabView::MouseUp(BPoint where)
|
||||
{
|
||||
if (!fClicked && !fCloseOnMouseUp) {
|
||||
if (!fClicked) {
|
||||
TabView::MouseUp(where);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fCloseOnMouseUp && Frame().Contains(where)) {
|
||||
fCloseOnMouseUp = false;
|
||||
fController->CloseTab(ContainerView()->IndexOf(this));
|
||||
// Probably this object is toast now, better return here.
|
||||
return;
|
||||
}
|
||||
|
||||
fClicked = false;
|
||||
fCloseOnMouseUp = false;
|
||||
|
||||
if (_CloseRectFrame(Frame()).Contains(where))
|
||||
fController->CloseTab(ContainerView()->IndexOf(this));
|
||||
|
||||
@@ -127,7 +127,7 @@ _BMCMenuBar_::AttachedToWindow()
|
||||
if (Parent() != NULL)
|
||||
SetLowColor(Parent()->LowColor());
|
||||
else
|
||||
SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
SetLowColor(ui_color(B_MENU_BACKGROUND_COLOR));
|
||||
}
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ _BMCMenuBar_::Draw(BRect updateRect)
|
||||
{
|
||||
if (be_control_look != NULL) {
|
||||
BRect rect(Bounds());
|
||||
rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
|
||||
rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR);
|
||||
uint32 flags = 0;
|
||||
if (!IsEnabled())
|
||||
flags |= BControlLook::B_DISABLED;
|
||||
|
||||
@@ -443,43 +443,34 @@ BMenuItem::DrawContent()
|
||||
void
|
||||
BMenuItem::Draw()
|
||||
{
|
||||
rgb_color lowColor = fSuper->LowColor();
|
||||
|
||||
bool enabled = IsEnabled();
|
||||
bool selected = IsSelected();
|
||||
|
||||
rgb_color noTint = fSuper->LowColor();
|
||||
rgb_color bgColor = noTint;
|
||||
|
||||
// set low color and fill background if selected
|
||||
bool activated = selected && (enabled || Submenu())
|
||||
/*&& fSuper->fRedrawAfterSticky*/;
|
||||
if (activated) {
|
||||
bgColor = tint_color(bgColor, B_DARKEN_3_TINT);
|
||||
if (be_control_look != NULL) {
|
||||
BRect rect = Frame();
|
||||
be_control_look->DrawMenuItemBackground(fSuper, rect, rect,
|
||||
noTint, BControlLook::B_ACTIVATED);
|
||||
ui_color(B_MENU_SELECTED_BACKGROUND_COLOR),
|
||||
BControlLook::B_ACTIVATED);
|
||||
} else {
|
||||
fSuper->SetLowColor(bgColor);
|
||||
fSuper->SetLowColor(ui_color(B_MENU_SELECTED_BACKGROUND_COLOR));
|
||||
fSuper->FillRect(Frame(), B_SOLID_LOW);
|
||||
}
|
||||
} else {
|
||||
fSuper->SetLowColor(bgColor);
|
||||
}
|
||||
|
||||
// set high color
|
||||
if (be_control_look != NULL) {
|
||||
if (enabled) {
|
||||
fSuper->SetHighColor(tint_color(fSuper->LowColor(),
|
||||
B_DARKEN_MAX_TINT));
|
||||
} else {
|
||||
fSuper->SetHighColor(tint_color(fSuper->LowColor(),
|
||||
B_DISABLED_LABEL_TINT));
|
||||
}
|
||||
} else {
|
||||
if (enabled)
|
||||
fSuper->SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR));
|
||||
else
|
||||
fSuper->SetHighColor(tint_color(bgColor, B_DISABLED_LABEL_TINT));
|
||||
if (activated)
|
||||
fSuper->SetHighColor(ui_color(B_MENU_SELECTED_ITEM_TEXT_COLOR));
|
||||
else if (enabled)
|
||||
fSuper->SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR));
|
||||
else {
|
||||
// TODO: Use a lighten tint if the menu uses a dark background
|
||||
fSuper->SetHighColor(tint_color(lowColor, B_DISABLED_LABEL_TINT));
|
||||
}
|
||||
|
||||
// draw content
|
||||
@@ -490,16 +481,16 @@ BMenuItem::Draw()
|
||||
const menu_layout layout = MenuPrivate(fSuper).Layout();
|
||||
if (layout == B_ITEMS_IN_COLUMN) {
|
||||
if (IsMarked())
|
||||
_DrawMarkSymbol(bgColor);
|
||||
_DrawMarkSymbol();
|
||||
|
||||
if (fShortcutChar)
|
||||
_DrawShortcutSymbol();
|
||||
|
||||
if (Submenu())
|
||||
_DrawSubmenuSymbol(bgColor);
|
||||
_DrawSubmenuSymbol();
|
||||
}
|
||||
|
||||
fSuper->SetLowColor(noTint);
|
||||
fSuper->SetLowColor(lowColor);
|
||||
}
|
||||
|
||||
|
||||
@@ -682,7 +673,7 @@ BMenuItem::Select(bool selected)
|
||||
|
||||
|
||||
void
|
||||
BMenuItem::_DrawMarkSymbol(rgb_color bgColor)
|
||||
BMenuItem::_DrawMarkSymbol()
|
||||
{
|
||||
fSuper->PushState();
|
||||
|
||||
@@ -710,7 +701,6 @@ BMenuItem::_DrawMarkSymbol(rgb_color bgColor)
|
||||
arrowShape.LineTo(BPoint(center.x + size, center.y - size));
|
||||
|
||||
fSuper->SetDrawingMode(B_OP_OVER);
|
||||
fSuper->SetHighColor(tint_color(bgColor, B_DARKEN_MAX_TINT));
|
||||
fSuper->SetPenSize(2.0);
|
||||
// NOTE: StrokeShape() offsets the shape by the current pen position,
|
||||
// it is not documented in the BeBook, but it is true!
|
||||
@@ -742,6 +732,8 @@ BMenuItem::_DrawShortcutSymbol()
|
||||
where.y += (fBounds.Height() - 11) / 2 - 1;
|
||||
where.x -= 4;
|
||||
|
||||
// TODO: It would be nice to draw these taking into account the text (low)
|
||||
// color.
|
||||
if (fModifiers & B_COMMAND_KEY) {
|
||||
const BBitmap *command = MenuPrivate::MenuItemCommand();
|
||||
const BRect &rect = command->Bounds();
|
||||
@@ -773,7 +765,7 @@ BMenuItem::_DrawShortcutSymbol()
|
||||
|
||||
|
||||
void
|
||||
BMenuItem::_DrawSubmenuSymbol(rgb_color bgColor)
|
||||
BMenuItem::_DrawSubmenuSymbol()
|
||||
{
|
||||
fSuper->PushState();
|
||||
|
||||
@@ -802,7 +794,6 @@ BMenuItem::_DrawSubmenuSymbol(rgb_color bgColor)
|
||||
arrowShape.LineTo(BPoint(center.x - hSize, center.y + size));
|
||||
|
||||
fSuper->SetDrawingMode(B_OP_OVER);
|
||||
fSuper->SetHighColor(tint_color(bgColor, B_DARKEN_MAX_TINT));
|
||||
fSuper->SetPenSize(ceilf(size * 0.4));
|
||||
// NOTE: StrokeShape() offsets the shape by the current pen position,
|
||||
// it is not documented in the BeBook, but it is true!
|
||||
|
||||
@@ -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;
|
||||
@@ -167,8 +167,8 @@ AttributeStreamNode::Read(const char* name, const char* foreignName, uint32 type
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamNode::Write(const char* name, const char* foreignName, uint32 type,
|
||||
off_t size, const void* buffer)
|
||||
AttributeStreamNode::Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer)
|
||||
{
|
||||
if (!fWriteTo)
|
||||
return 0;
|
||||
@@ -288,14 +288,15 @@ 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;
|
||||
|
||||
// didn't find the attribute under the native name, try the foreign name
|
||||
if (foreignName && fNode->ReadAttr(foreignName, type, 0, buffer, (size_t)size) == size) {
|
||||
if (foreignName && fNode->ReadAttr(foreignName, type, 0, buffer,
|
||||
(size_t)size) == size) {
|
||||
// foreign attribute, swap the data
|
||||
if (swapFunc)
|
||||
(swapFunc)(buffer);
|
||||
@@ -306,8 +307,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));
|
||||
@@ -353,8 +354,8 @@ bool
|
||||
AttributeStreamFileNode::Fill(char* buffer) const
|
||||
{
|
||||
ASSERT(fNode);
|
||||
return fNode->ReadAttr(fCurrentAttr.Name(), fCurrentAttr.Type(), 0, buffer,
|
||||
(size_t)fCurrentAttr.Size()) == (ssize_t)fCurrentAttr.Size();
|
||||
return fNode->ReadAttr(fCurrentAttr.Name(), fCurrentAttr.Type(), 0,
|
||||
buffer, (size_t)fCurrentAttr.Size()) == (ssize_t)fCurrentAttr.Size();
|
||||
}
|
||||
|
||||
|
||||
@@ -422,8 +423,9 @@ AttributeStreamMemoryNode::Contains(const char* name, uint32 type)
|
||||
|
||||
|
||||
off_t
|
||||
AttributeStreamMemoryNode::Read(const char* name, const char* DEBUG_ONLY(foreignName),
|
||||
uint32 type, off_t bufferSize, void* buffer, void (*DEBUG_ONLY(swapFunc))(void*))
|
||||
AttributeStreamMemoryNode::Read(const char* name,
|
||||
const char* DEBUG_ONLY(foreignName), uint32 type, off_t bufferSize,
|
||||
void* buffer, void (*DEBUG_ONLY(swapFunc))(void*))
|
||||
{
|
||||
ASSERT(!foreignName);
|
||||
ASSERT(!swapFunc);
|
||||
@@ -479,7 +481,8 @@ AttributeStreamMemoryNode::Drive()
|
||||
|
||||
|
||||
AttributeStreamMemoryNode::AttrNode*
|
||||
AttributeStreamMemoryNode::BufferingGet(const char* name, uint32 type, off_t size)
|
||||
AttributeStreamMemoryNode::BufferingGet(const char* name, uint32 type,
|
||||
off_t size)
|
||||
{
|
||||
char* newBuffer = new char[size];
|
||||
if (!fReadFrom->Fill(newBuffer)) {
|
||||
@@ -659,22 +662,24 @@ 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;
|
||||
|
||||
if (!Reject(name, type, size))
|
||||
return fReadFrom->Read(name, foreignName, type, size, buffer, swapFunc);
|
||||
if (!Reject(name, type, size)) {
|
||||
return fReadFrom->Read(name, foreignName, type, size, buffer,
|
||||
swapFunc);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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 +698,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])
|
||||
|
||||
@@ -39,13 +39,13 @@ All rights reserved.
|
||||
//
|
||||
// destinationNode << transformer << buffer << filter << sourceNode
|
||||
//
|
||||
// transformer may for instance perform endian-swapping or offsetting of a B_RECT attribute
|
||||
// filter may withold certain attributes
|
||||
// buffer is a memory allocated snapshot of attributes, may be repeatedly streamed into
|
||||
// transformer may for instance perform endian-swapping or offsetting of
|
||||
// a B_RECT attribute filter may withold certain attributes buffer is a
|
||||
// memory allocated snapshot of attributes, may be repeatedly streamed into
|
||||
// other files, buffers
|
||||
//
|
||||
// In addition to the whacky (but usefull) << syntax, calls like Read, Write are also
|
||||
// available
|
||||
// In addition to the whacky (but usefull) << syntax, calls like Read, Write
|
||||
// are also available
|
||||
#ifndef __ATTRIBUTE_STREAM__
|
||||
#define __ATTRIBUTE_STREAM__
|
||||
|
||||
@@ -104,7 +104,8 @@ public:
|
||||
// any data it has, gets, transforms, doesn't filter out
|
||||
//
|
||||
// under the hood sets up streaming into the next node; hooking
|
||||
// up source and destination, forces the stream head to start streaming
|
||||
// up source and destination, forces the stream head to start
|
||||
// streaming
|
||||
|
||||
virtual void Rewind();
|
||||
// get ready to start all over again
|
||||
@@ -114,11 +115,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
|
||||
@@ -128,14 +129,13 @@ public:
|
||||
virtual const AttributeInfo* Next();
|
||||
// give me the next attribute in the stream
|
||||
virtual const char* Get();
|
||||
// give me the data of the attribute in the stream that was just returned
|
||||
// by Next
|
||||
// assumes there is a buffering node somewhere on the way to
|
||||
// the source, from which the resulting buffer is borrowed
|
||||
// give me the data of the attribute in the stream that was just
|
||||
// returned by Next assumes there is a buffering node somewhere on the
|
||||
// way to the source, from which the resulting buffer is borrowed
|
||||
virtual bool Fill(char* buffer) const;
|
||||
// fill the buffer with data of the attribute in the stream that was just returned
|
||||
// by next
|
||||
// <buffer> is big enough to hold the entire attribute data
|
||||
// fill the buffer with data of the attribute in the stream that was
|
||||
// just returned by next <buffer> is big enough to hold the entire
|
||||
// attribute data
|
||||
|
||||
virtual bool CanFeed() const { return false; }
|
||||
// return true if can work as a source for the entire stream
|
||||
@@ -199,10 +199,10 @@ public:
|
||||
|
||||
virtual void MakeEmpty();
|
||||
virtual off_t Contains(const char* name, uint32 type);
|
||||
virtual off_t Read(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Write(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
const void* buffer);
|
||||
virtual off_t Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer);
|
||||
|
||||
protected:
|
||||
virtual bool CanFeed() const { return true; }
|
||||
@@ -275,10 +275,10 @@ public:
|
||||
AttributeStreamFilterNode()
|
||||
{}
|
||||
virtual off_t Contains(const char* name, uint32 type);
|
||||
virtual off_t Read(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Write(const char* name, const char* foreignName, uint32 type, off_t size,
|
||||
const void* buffer);
|
||||
virtual off_t Read(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
|
||||
virtual off_t Write(const char* name, const char* foreignName,
|
||||
uint32 type, off_t size, const void* buffer);
|
||||
|
||||
protected:
|
||||
virtual bool Reject(const char* name, uint32 type, off_t size);
|
||||
@@ -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;
|
||||
// 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 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);
|
||||
// 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; }
|
||||
|
||||
@@ -119,7 +119,8 @@ AutomountSettingsPanel::AutomountSettingsPanel(BMessage* settings,
|
||||
new BMessage(kAutomountSettingsChanged));
|
||||
|
||||
fAutoMountAllBFSCheck = new BRadioButton("autoBFS",
|
||||
B_TRANSLATE("All BeOS disks"), new BMessage(kAutomountSettingsChanged));
|
||||
B_TRANSLATE("All BeOS disks"),
|
||||
new BMessage(kAutomountSettingsChanged));
|
||||
|
||||
fAutoMountAllCheck = new BRadioButton("autoAll",
|
||||
B_TRANSLATE("All disks"), new BMessage(kAutomountSettingsChanged));
|
||||
@@ -343,4 +344,3 @@ AutomountSettingsDialog::RunAutomountSettings(const BMessenger& target)
|
||||
|
||||
(new AutomountSettingsDialog(&reply, target))->Show();
|
||||
}
|
||||
|
||||
|
||||
@@ -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,9 +71,10 @@ 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);
|
||||
status_t error = node->ReadAttr(kBackgroundImageInfo, info.type, 0,
|
||||
buffer, (size_t)info.size);
|
||||
if (error == info.size)
|
||||
error = container.Unflatten(buffer);
|
||||
|
||||
@@ -91,7 +92,8 @@ BackgroundImage::GetBackgroundImage(const BNode* node, bool isDesktop)
|
||||
BPoint offset;
|
||||
BBitmap* bitmap = NULL;
|
||||
|
||||
if (container.FindString(kBackgroundImageInfoPath, index, &path) == B_OK) {
|
||||
if (container.FindString(kBackgroundImageInfoPath, index, &path)
|
||||
== B_OK) {
|
||||
bitmap = BTranslationUtils::GetBitmap(path);
|
||||
if (!bitmap) {
|
||||
PRINT(("failed to load background bitmap from path\n"));
|
||||
@@ -104,14 +106,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);
|
||||
@@ -175,6 +179,7 @@ BackgroundImage::Show(BView* view, int32 workspace)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BackgroundImage::Show(BackgroundImageInfo* info, BView* view)
|
||||
{
|
||||
@@ -274,13 +279,15 @@ BackgroundImage::Remove()
|
||||
fView->ClearViewBitmap();
|
||||
fView->Invalidate();
|
||||
BPoseView* poseView = dynamic_cast<BPoseView*>(fView);
|
||||
// make sure text widgets draw the default way, erasing their background
|
||||
// make sure text widgets draw the default way, erasing
|
||||
// their background
|
||||
if (poseView)
|
||||
poseView->SetWidgetTextOutline(true);
|
||||
}
|
||||
fShowingBitmap = NULL;
|
||||
}
|
||||
|
||||
|
||||
BackgroundImage::BackgroundImageInfo*
|
||||
BackgroundImage::ImageInfoForWorkspace(int32 workspace) const
|
||||
{
|
||||
@@ -306,6 +313,7 @@ BackgroundImage::ImageInfoForWorkspace(int32 workspace) const
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BackgroundImage::WorkspaceActivated(BView* view, int32 workspace, bool state)
|
||||
{
|
||||
@@ -332,6 +340,7 @@ BackgroundImage::WorkspaceActivated(BView* view, int32 workspace, bool state)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BackgroundImage::ScreenChanged(BRect, color_space)
|
||||
{
|
||||
@@ -346,12 +355,13 @@ BackgroundImage::ScreenChanged(BRect, color_space)
|
||||
(viewBounds.Width() - bitmapBounds.Width()) / 2,
|
||||
(viewBounds.Height() - bitmapBounds.Height()) / 2);
|
||||
|
||||
fView->SetViewBitmap(fShowingBitmap->fBitmap, bitmapBounds, destinationBitmapBounds,
|
||||
B_FOLLOW_NONE, 0);
|
||||
fView->SetViewBitmap(fShowingBitmap->fBitmap, bitmapBounds,
|
||||
destinationBitmapBounds, B_FOLLOW_NONE, 0);
|
||||
fView->Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BackgroundImage*
|
||||
BackgroundImage::Refresh(BackgroundImage* oldBackgroundImage,
|
||||
const BNode* fromNode, bool desktop, BPoseView* poseView)
|
||||
@@ -367,4 +377,3 @@ BackgroundImage::Refresh(BackgroundImage* oldBackgroundImage,
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -77,8 +77,8 @@ public:
|
||||
class BackgroundImageInfo {
|
||||
// element of the per-workspace list
|
||||
public:
|
||||
BackgroundImageInfo(uint32 workspace, BBitmap* bitmap, Mode mode, BPoint offset,
|
||||
bool textWidgetOutline);
|
||||
BackgroundImageInfo(uint32 workspace, BBitmap* bitmap, Mode mode,
|
||||
BPoint offset, bool textWidgetOutline);
|
||||
~BackgroundImageInfo();
|
||||
|
||||
uint32 fWorkspace;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -151,8 +153,8 @@ ActivateWindowFilter(BMessage*, BHandler** target, BMessageFilter*)
|
||||
{
|
||||
BView* view = dynamic_cast<BView*>(*target);
|
||||
|
||||
// activate the window if no PoseView or DraggableContainerIcon had been pressed
|
||||
// (those will activate the window themselves, if necessary)
|
||||
// activate the window if no PoseView or DraggableContainerIcon had been
|
||||
// pressed (those will activate the window themselves, if necessary)
|
||||
if (view
|
||||
&& !dynamic_cast<BPoseView*>(view)
|
||||
&& !dynamic_cast<DraggableContainerIcon*>(view)
|
||||
@@ -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();
|
||||
|
||||
@@ -372,7 +377,8 @@ DraggableContainerIcon::MouseDown(BPoint point)
|
||||
if (IconCache::sIconCache->IconHitTest(point, window->TargetModel(),
|
||||
kNormalIcon, B_MINI_ICON)) {
|
||||
// The click hit the icon, initiate a drag
|
||||
fDragButton = buttons & (B_PRIMARY_MOUSE_BUTTON | B_SECONDARY_MOUSE_BUTTON);
|
||||
fDragButton = buttons
|
||||
& (B_PRIMARY_MOUSE_BUTTON | B_SECONDARY_MOUSE_BUTTON);
|
||||
fDragStarted = false;
|
||||
fClickPoint = point;
|
||||
} else
|
||||
@@ -413,10 +419,11 @@ DraggableContainerIcon::MouseMoved(BPoint point, uint32 /*transit*/,
|
||||
|
||||
font_height fontHeight;
|
||||
font.GetHeight(&fontHeight);
|
||||
float height = fontHeight.ascent + fontHeight.descent + fontHeight.leading + 2
|
||||
+ Bounds().Height() + 8;
|
||||
float height = fontHeight.ascent + fontHeight.descent + fontHeight.leading
|
||||
+ 2 + Bounds().Height() + 8;
|
||||
|
||||
BRect rect(0, 0, max_c(Bounds().Width(), font.StringWidth(model->Name()) + 4), height);
|
||||
BRect rect(0, 0, max_c(Bounds().Width(),
|
||||
font.StringWidth(model->Name()) + 4), height);
|
||||
BBitmap* dragBitmap = new BBitmap(rect, B_RGBA32, true);
|
||||
|
||||
dragBitmap->Lock();
|
||||
@@ -432,7 +439,8 @@ DraggableContainerIcon::MouseMoved(BPoint point, uint32 /*transit*/,
|
||||
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
|
||||
@@ -446,8 +454,10 @@ DraggableContainerIcon::MouseMoved(BPoint point, uint32 /*transit*/,
|
||||
view->TruncateString(&nameString, B_TRUNCATE_END, rect.Width() - 5);
|
||||
|
||||
// Draw the label
|
||||
float leftText = (view->StringWidth(nameString.String()) - Bounds().Width()) / 2;
|
||||
view->MovePenTo(BPoint(hIconOffset - leftText + 2, Bounds().Height() + (fontHeight.ascent + 2)));
|
||||
float leftText = (view->StringWidth(nameString.String())
|
||||
- Bounds().Width()) / 2;
|
||||
view->MovePenTo(BPoint(hIconOffset - leftText + 2, Bounds().Height()
|
||||
+ (fontHeight.ascent + 2)));
|
||||
view->DrawString(nameString.String());
|
||||
|
||||
view->Sync();
|
||||
@@ -465,8 +475,8 @@ DraggableContainerIcon::MouseMoved(BPoint point, uint32 /*transit*/,
|
||||
|
||||
if (button & B_PRIMARY_MOUSE_BUTTON) {
|
||||
// add an action specifier to the message, so that it is not copied
|
||||
message.AddInt32("be:actions",
|
||||
(modifiers() & B_OPTION_KEY) != 0 ? B_COPY_TARGET : B_MOVE_TARGET);
|
||||
message.AddInt32("be:actions", (modifiers() & B_OPTION_KEY) != 0
|
||||
? B_COPY_TARGET : B_MOVE_TARGET);
|
||||
}
|
||||
|
||||
fDragStarted = true;
|
||||
@@ -782,14 +792,16 @@ BContainerWindow::CreatePoseView(Model* model)
|
||||
&& !fPoseView->IsFilePanel()) {
|
||||
BRect rect(Bounds());
|
||||
rect.top = 0;
|
||||
// The KeyMenuBar isn't attached yet, otherwise we'd use that to get the offset.
|
||||
// The KeyMenuBar isn't attached yet, otherwise we'd use that
|
||||
// to get the offset.
|
||||
rect.bottom = BNavigator::CalcNavigatorHeight();
|
||||
fNavigator = new BNavigator(model, rect);
|
||||
if (!settings.ShowNavigator())
|
||||
fNavigator->Hide();
|
||||
AddChild(fNavigator);
|
||||
}
|
||||
SetPathWatchingEnabled(settings.ShowNavigator() || settings.ShowFullPathInTitleBar());
|
||||
SetPathWatchingEnabled(settings.ShowNavigator()
|
||||
|| settings.ShowFullPathInTitleBar());
|
||||
}
|
||||
|
||||
|
||||
@@ -886,8 +898,8 @@ BContainerWindow::RepopulateMenus()
|
||||
int32 selectCount = PoseView()->SelectionList()->CountItems();
|
||||
|
||||
SetupOpenWithMenu(fFileMenu);
|
||||
SetupMoveCopyMenus(selectCount
|
||||
? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL,
|
||||
SetupMoveCopyMenus(selectCount ? PoseView()->SelectionList()->
|
||||
FirstItem()->TargetModel()->EntryRef() : NULL,
|
||||
fFileMenu);
|
||||
}
|
||||
|
||||
@@ -920,7 +932,8 @@ BContainerWindow::Init(const BMessage* message)
|
||||
|
||||
if (ShouldAddMenus()) {
|
||||
// add menu bar, menus and resize poseview to fit
|
||||
fMenuBar = new BMenuBar(BRect(0, 0, Bounds().Width() + 1, 1), "MenuBar");
|
||||
fMenuBar = new BMenuBar(BRect(0, 0, Bounds().Width() + 1, 1),
|
||||
"MenuBar");
|
||||
fMenuBar->SetBorder(B_BORDER_FRAME);
|
||||
AddMenus();
|
||||
AddChild(fMenuBar);
|
||||
@@ -937,8 +950,10 @@ BContainerWindow::Init(const BMessage* message)
|
||||
fPoseView->MoveTo(BPoint(0, navigatorDelta + y_delta));
|
||||
fPoseView->ResizeBy(0, -(y_delta));
|
||||
if (fPoseView->VScrollBar()) {
|
||||
fPoseView->VScrollBar()->MoveBy(0, KeyMenuBar()->Bounds().Height());
|
||||
fPoseView->VScrollBar()->ResizeBy(0, -(KeyMenuBar()->Bounds().Height()));
|
||||
fPoseView->VScrollBar()->MoveBy(0,
|
||||
KeyMenuBar()->Bounds().Height());
|
||||
fPoseView->VScrollBar()->ResizeBy(0,
|
||||
-(KeyMenuBar()->Bounds().Height()));
|
||||
}
|
||||
|
||||
// add folder icon to menu bar
|
||||
@@ -946,23 +961,27 @@ 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 {
|
||||
// add equivalents of the menu shortcuts to the menuless desktop window
|
||||
// add equivalents of the menu shortcuts to the menuless
|
||||
// desktop window
|
||||
AddShortcuts();
|
||||
}
|
||||
|
||||
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 +990,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 +1029,8 @@ BContainerWindow::Init(const BMessage* message)
|
||||
void
|
||||
BContainerWindow::RestoreState()
|
||||
{
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000, kContainerWindowHeightLimit, 10000);
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000,
|
||||
kContainerWindowHeightLimit, 10000);
|
||||
|
||||
UpdateTitle();
|
||||
|
||||
@@ -1022,7 +1045,8 @@ BContainerWindow::RestoreState()
|
||||
void
|
||||
BContainerWindow::RestoreState(const BMessage &message)
|
||||
{
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000, kContainerWindowHeightLimit, 10000);
|
||||
SetSizeLimits(kContainerWidthMinLimit, 10000,
|
||||
kContainerWindowHeightLimit, 10000);
|
||||
|
||||
UpdateTitle();
|
||||
|
||||
@@ -1057,7 +1081,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 +1100,8 @@ BContainerWindow::UpdateTitle()
|
||||
SetTitle(TargetModel()->Name());
|
||||
|
||||
if (Navigator())
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(), kActionUpdatePath);
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(),
|
||||
kActionUpdatePath);
|
||||
}
|
||||
|
||||
|
||||
@@ -1121,7 +1147,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 +1181,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 +1276,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;
|
||||
@@ -1285,7 +1315,8 @@ BContainerWindow::SetLayoutState(BNode* node, const BMessage* message)
|
||||
return result;
|
||||
}
|
||||
|
||||
if (node->WriteAttr(name, type, 0, buffer, (size_t)size) != size) {
|
||||
if (node->WriteAttr(name, type, 0, buffer,
|
||||
(size_t)size) != size) {
|
||||
PRINT(("error writing %s \n", name));
|
||||
return result;
|
||||
}
|
||||
@@ -1350,7 +1381,8 @@ BContainerWindow::ResizeToFit()
|
||||
BRect screenFrame(screen.Frame());
|
||||
|
||||
screenFrame.InsetBy(5, 5);
|
||||
screenFrame.top += 15; // keeps title bar of window visible
|
||||
screenFrame.top += 15;
|
||||
// keeps title bar of window visible
|
||||
|
||||
BRect frame(Frame());
|
||||
|
||||
@@ -1471,12 +1503,13 @@ BContainerWindow::MessageReceived(BMessage* message)
|
||||
break;
|
||||
|
||||
PoseView()->MoveSelectionInto(&model, this, false, false,
|
||||
message->what == kCreateLink, message->what == kCreateRelativeLink);
|
||||
} else {
|
||||
message->what == kCreateLink,
|
||||
message->what == kCreateRelativeLink);
|
||||
} else if (!TargetModel()->IsQuery()) {
|
||||
// no destination specified, create link in same dir as item
|
||||
if (!TargetModel()->IsQuery())
|
||||
PoseView()->MoveSelectionInto(TargetModel(), this, false, false,
|
||||
message->what == kCreateLink, message->what == kCreateRelativeLink);
|
||||
PoseView()->MoveSelectionInto(TargetModel(), this, false, false,
|
||||
message->what == kCreateLink,
|
||||
message->what == kCreateRelativeLink);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1535,13 +1568,17 @@ BContainerWindow::MessageReceived(BMessage* message)
|
||||
// 'action' at all if he can't find it??
|
||||
action = kActionSet;
|
||||
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(), action);
|
||||
Navigator()->UpdateLocation(PoseView()->TargetModel(),
|
||||
action);
|
||||
}
|
||||
|
||||
TrackerSettings settings;
|
||||
if (settings.ShowNavigator() || settings.ShowFullPathInTitleBar())
|
||||
if (settings.ShowNavigator()
|
||||
|| settings.ShowFullPathInTitleBar()) {
|
||||
SetPathWatchingEnabled(true);
|
||||
SetSingleWindowBrowseShortcuts(settings.SingleWindowBrowse());
|
||||
}
|
||||
SetSingleWindowBrowseShortcuts(
|
||||
settings.SingleWindowBrowse());
|
||||
|
||||
// Update draggable folder icon
|
||||
BView* view = FindView("MenuBar");
|
||||
@@ -1562,26 +1599,23 @@ BContainerWindow::MessageReceived(BMessage* message)
|
||||
|
||||
case B_REFS_RECEIVED:
|
||||
if (Dragging()) {
|
||||
//
|
||||
// ref in this message is the target,
|
||||
// the end point of the drag
|
||||
//
|
||||
// ref in this message is the target,
|
||||
// the end point of the drag
|
||||
|
||||
entry_ref ref;
|
||||
if (message->FindRef("refs", &ref) == B_OK) {
|
||||
|
||||
//printf("BContainerWindow::MessageReceived - refs received\n");
|
||||
fWaitingForRefs = false;
|
||||
BEntry entry(&ref, true);
|
||||
//
|
||||
// don't copy to printers dir
|
||||
// don't copy to printers dir
|
||||
if (!FSIsPrintersDir(&entry)) {
|
||||
if (entry.InitCheck() == B_OK && entry.IsDirectory()) {
|
||||
if (entry.InitCheck() == B_OK
|
||||
&& entry.IsDirectory()) {
|
||||
Model targetModel(&entry, true, false);
|
||||
BPoint dropPoint;
|
||||
uint32 buttons;
|
||||
PoseView()->GetMouse(&dropPoint, &buttons, true);
|
||||
PoseView()->HandleDropCommon(fDragMessage, &targetModel, NULL,
|
||||
PoseView(), dropPoint);
|
||||
PoseView()->HandleDropCommon(fDragMessage,
|
||||
&targetModel, NULL, PoseView(), dropPoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1592,15 +1626,21 @@ BContainerWindow::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) {
|
||||
TrackerSettings settings;
|
||||
switch (observerWhat) {
|
||||
case kWindowsShowFullPathChanged:
|
||||
UpdateTitle();
|
||||
if (!IsPathWatchingEnabled() && settings.ShowFullPathInTitleBar())
|
||||
if (!IsPathWatchingEnabled()
|
||||
&& settings.ShowFullPathInTitleBar()) {
|
||||
SetPathWatchingEnabled(true);
|
||||
if (IsPathWatchingEnabled() && !(settings.ShowNavigator() || settings.ShowFullPathInTitleBar()))
|
||||
}
|
||||
if (IsPathWatchingEnabled()
|
||||
&& !(settings.ShowNavigator()
|
||||
|| settings.ShowFullPathInTitleBar())) {
|
||||
SetPathWatchingEnabled(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case kSingleWindowBrowseChanged:
|
||||
@@ -1611,35 +1651,47 @@ BContainerWindow::MessageReceived(BMessage* message)
|
||||
&& !PoseView()->IsDesktopWindow()) {
|
||||
BRect rect(Bounds());
|
||||
rect.top = KeyMenuBar()->Bounds().Height() + 1;
|
||||
rect.bottom = rect.top + BNavigator::CalcNavigatorHeight();
|
||||
rect.bottom = rect.top
|
||||
+ BNavigator::CalcNavigatorHeight();
|
||||
fNavigator = new BNavigator(TargetModel(), rect);
|
||||
fNavigator->Hide();
|
||||
AddChild(fNavigator);
|
||||
SetPathWatchingEnabled(settings.ShowNavigator() || settings.ShowFullPathInTitleBar());
|
||||
SetPathWatchingEnabled(settings.ShowNavigator()
|
||||
|| settings.ShowFullPathInTitleBar());
|
||||
}
|
||||
SetSingleWindowBrowseShortcuts(settings.SingleWindowBrowse());
|
||||
SetSingleWindowBrowseShortcuts(
|
||||
settings.SingleWindowBrowse());
|
||||
break;
|
||||
|
||||
case kShowNavigatorChanged:
|
||||
ShowNavigator(settings.ShowNavigator());
|
||||
if (!IsPathWatchingEnabled() && settings.ShowNavigator())
|
||||
if (!IsPathWatchingEnabled()
|
||||
&& settings.ShowNavigator()) {
|
||||
SetPathWatchingEnabled(true);
|
||||
if (IsPathWatchingEnabled() && !(settings.ShowNavigator() || settings.ShowFullPathInTitleBar()))
|
||||
}
|
||||
if (IsPathWatchingEnabled()
|
||||
&& !(settings.ShowNavigator()
|
||||
|| settings.ShowFullPathInTitleBar())) {
|
||||
SetPathWatchingEnabled(false);
|
||||
SetSingleWindowBrowseShortcuts(settings.SingleWindowBrowse());
|
||||
}
|
||||
SetSingleWindowBrowseShortcuts(
|
||||
settings.SingleWindowBrowse());
|
||||
break;
|
||||
|
||||
case kDontMoveFilesToTrashChanged:
|
||||
{
|
||||
bool dontMoveToTrash = settings.DontMoveFilesToTrash();
|
||||
bool dontMoveToTrash
|
||||
= settings.DontMoveFilesToTrash();
|
||||
|
||||
BMenuItem* item = fFileContextMenu->FindItem(kMoveToTrash);
|
||||
if (item) {
|
||||
BMenuItem* item
|
||||
= fFileContextMenu->FindItem(kMoveToTrash);
|
||||
if (item != NULL) {
|
||||
item->SetLabel(dontMoveToTrash
|
||||
? B_TRANSLATE("Delete")
|
||||
: B_TRANSLATE("Move to Trash"));
|
||||
}
|
||||
// Deskbar doesn't have a menu bar, so check if there is fMenuBar
|
||||
// Deskbar doesn't have a menu bar, so check if
|
||||
// there is fMenuBar
|
||||
if (fMenuBar && fFileMenu) {
|
||||
item = fFileMenu->FindItem(kMoveToTrash);
|
||||
if (item) {
|
||||
@@ -1945,6 +1997,20 @@ BContainerWindow::AddWindowMenu(BMenu* menu)
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
message->AddInt32("size", 96);
|
||||
item = new BMenuItem(B_TRANSLATE("96 x 96"), message);
|
||||
item->SetMarked(PoseView()->IconSizeInt() == 96);
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
message->AddInt32("size", 128);
|
||||
item = new BMenuItem(B_TRANSLATE("128 x 128"), message);
|
||||
item->SetMarked(PoseView()->IconSizeInt() == 128);
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
iconSizeMenu->AddSeparatorItem();
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
@@ -1990,13 +2056,13 @@ BContainerWindow::AddWindowMenu(BMenu* menu)
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Select all"), new BMessage(B_SELECT_ALL),
|
||||
'A');
|
||||
item = new BMenuItem(B_TRANSLATE("Select all"),
|
||||
new BMessage(B_SELECT_ALL), 'A');
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Invert selection"),
|
||||
new BMessage(kInvertSelection), 'S');
|
||||
new BMessage(kInvertSelection), 'S');
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
@@ -2007,8 +2073,8 @@ BContainerWindow::AddWindowMenu(BMenu* menu)
|
||||
menu->AddItem(item);
|
||||
}
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Close"), new BMessage(B_QUIT_REQUESTED),
|
||||
'W');
|
||||
item = new BMenuItem(B_TRANSLATE("Close"),
|
||||
new BMessage(B_QUIT_REQUESTED), 'W');
|
||||
item->SetTarget(this);
|
||||
menu->AddItem(item);
|
||||
|
||||
@@ -2034,26 +2100,42 @@ BContainerWindow::AddShortcuts()
|
||||
ASSERT(!PoseView()->IsFilePanel());
|
||||
ASSERT(!TargetModel()->IsQuery());
|
||||
|
||||
AddShortcut('X', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kCutMoreSelectionToClipboard), this);
|
||||
AddShortcut('C', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kCopyMoreSelectionToClipboard), this);
|
||||
AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton), PoseView());
|
||||
AddShortcut('N', B_COMMAND_KEY, new BMessage(kNewFolder), PoseView());
|
||||
AddShortcut('O', B_COMMAND_KEY, new BMessage(kOpenSelection), PoseView());
|
||||
AddShortcut('I', B_COMMAND_KEY, new BMessage(kGetInfo), PoseView());
|
||||
AddShortcut('E', B_COMMAND_KEY, new BMessage(kEditItem), PoseView());
|
||||
AddShortcut('D', B_COMMAND_KEY, new BMessage(kDuplicateSelection), PoseView());
|
||||
AddShortcut('T', B_COMMAND_KEY, new BMessage(kMoveToTrash), PoseView());
|
||||
AddShortcut('K', B_COMMAND_KEY, new BMessage(kCleanup), PoseView());
|
||||
AddShortcut('A', B_COMMAND_KEY, new BMessage(B_SELECT_ALL), PoseView());
|
||||
AddShortcut('S', B_COMMAND_KEY, new BMessage(kInvertSelection), PoseView());
|
||||
AddShortcut('A', B_COMMAND_KEY | B_SHIFT_KEY, new BMessage(kShowSelectionWindow), PoseView());
|
||||
AddShortcut('G', B_COMMAND_KEY, new BMessage(kEditQuery), PoseView());
|
||||
AddShortcut('X', B_COMMAND_KEY | B_SHIFT_KEY,
|
||||
new BMessage(kCutMoreSelectionToClipboard), this);
|
||||
AddShortcut('C', B_COMMAND_KEY | B_SHIFT_KEY,
|
||||
new BMessage(kCopyMoreSelectionToClipboard), this);
|
||||
AddShortcut('F', B_COMMAND_KEY,
|
||||
new BMessage(kFindButton), PoseView());
|
||||
AddShortcut('N', B_COMMAND_KEY,
|
||||
new BMessage(kNewFolder), PoseView());
|
||||
AddShortcut('O', B_COMMAND_KEY,
|
||||
new BMessage(kOpenSelection), PoseView());
|
||||
AddShortcut('I', B_COMMAND_KEY,
|
||||
new BMessage(kGetInfo), PoseView());
|
||||
AddShortcut('E', B_COMMAND_KEY,
|
||||
new BMessage(kEditItem), PoseView());
|
||||
AddShortcut('D', B_COMMAND_KEY,
|
||||
new BMessage(kDuplicateSelection), PoseView());
|
||||
AddShortcut('T', B_COMMAND_KEY,
|
||||
new BMessage(kMoveToTrash), PoseView());
|
||||
AddShortcut('K', B_COMMAND_KEY,
|
||||
new BMessage(kCleanup), PoseView());
|
||||
AddShortcut('A', B_COMMAND_KEY,
|
||||
new BMessage(B_SELECT_ALL), PoseView());
|
||||
AddShortcut('S', B_COMMAND_KEY,
|
||||
new BMessage(kInvertSelection), PoseView());
|
||||
AddShortcut('A', B_COMMAND_KEY | B_SHIFT_KEY,
|
||||
new BMessage(kShowSelectionWindow), PoseView());
|
||||
AddShortcut('G', B_COMMAND_KEY,
|
||||
new BMessage(kEditQuery), PoseView());
|
||||
// it is ok to add a global Edit query shortcut here, PoseView will
|
||||
// filter out cases where selected pose is not a query
|
||||
AddShortcut('U', B_COMMAND_KEY, new BMessage(kUnmountVolume), PoseView());
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY, new BMessage(kOpenParentDir), PoseView());
|
||||
AddShortcut('O', B_COMMAND_KEY | B_CONTROL_KEY, new BMessage(kOpenSelectionWith),
|
||||
PoseView());
|
||||
AddShortcut('U', B_COMMAND_KEY,
|
||||
new BMessage(kUnmountVolume), PoseView());
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY,
|
||||
new BMessage(kOpenParentDir), PoseView());
|
||||
AddShortcut('O', B_COMMAND_KEY | B_CONTROL_KEY,
|
||||
new BMessage(kOpenSelectionWith), PoseView());
|
||||
}
|
||||
|
||||
|
||||
@@ -2073,7 +2155,8 @@ BContainerWindow::MenusBeginning()
|
||||
|
||||
SetupOpenWithMenu(fFileMenu);
|
||||
SetupMoveCopyMenus(selectCount
|
||||
? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL, fFileMenu);
|
||||
? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef()
|
||||
: NULL, fFileMenu);
|
||||
|
||||
UpdateMenu(fMenuBar, kMenuBarContext);
|
||||
|
||||
@@ -2445,11 +2528,13 @@ BContainerWindow::SetupMoveCopyMenus(const entry_ref* item_ref, BMenu* parent)
|
||||
// add all mounted volumes (except the one this item lives on)
|
||||
if (modifierKeys & B_SHIFT_KEY) {
|
||||
fCreateLinkItem->SetMessage(new BMessage(kCreateRelativeLink));
|
||||
PopulateMoveCopyNavMenu(dynamic_cast<BNavMenu*>(fCreateLinkItem->Submenu()),
|
||||
PopulateMoveCopyNavMenu(dynamic_cast<BNavMenu*>
|
||||
(fCreateLinkItem->Submenu()),
|
||||
kCreateRelativeLink, item_ref, false);
|
||||
} else {
|
||||
fCreateLinkItem->SetMessage(new BMessage(kCreateLink));
|
||||
PopulateMoveCopyNavMenu(dynamic_cast<BNavMenu*>(fCreateLinkItem->Submenu()),
|
||||
PopulateMoveCopyNavMenu(dynamic_cast<BNavMenu*>
|
||||
(fCreateLinkItem->Submenu()),
|
||||
kCreateLink, item_ref, false);
|
||||
}
|
||||
|
||||
@@ -2547,7 +2632,8 @@ BContainerWindow::ShowContextMenu(BPoint loc, const entry_ref* ref, BView*)
|
||||
// see the notes in SlowContextPopup::AttachedToWindow
|
||||
|
||||
if (!FSIsPrintersDir(&entry) && !fDragContextMenu->IsShowing()) {
|
||||
// printf("ShowContextMenu - target is %s %i\n", ref->name, IsShowing(ref));
|
||||
//printf("ShowContextMenu - target is %s %i\n",
|
||||
// ref->name, IsShowing(ref));
|
||||
fDragContextMenu->ClearMenu();
|
||||
|
||||
// in case the ref is a symlink, resolve it
|
||||
@@ -2567,7 +2653,8 @@ BContainerWindow::ShowContextMenu(BPoint loc, const entry_ref* ref, BView*)
|
||||
if (poseView) {
|
||||
BMessenger target(poseView);
|
||||
fDragContextMenu->InitTrackingHook(
|
||||
&BPoseView::MenuTrackingHook, &target, fDragMessage);
|
||||
&BPoseView::MenuTrackingHook, &target,
|
||||
fDragMessage);
|
||||
}
|
||||
|
||||
// this is now asynchronous so that we don't
|
||||
@@ -2857,7 +2944,8 @@ BContainerWindow::EachAddon(BPath &path, bool (*eachAddon)(const Model*,
|
||||
else
|
||||
delete resolved;
|
||||
}
|
||||
if (model->InitCheck() != B_OK || !model->ResolveIfLink()->IsExecutable()) {
|
||||
if (model->InitCheck() != B_OK
|
||||
|| !model->ResolveIfLink()->IsExecutable()) {
|
||||
delete model;
|
||||
continue;
|
||||
}
|
||||
@@ -2884,7 +2972,8 @@ BContainerWindow::EachAddon(BPath &path, bool (*eachAddon)(const Model*,
|
||||
|
||||
// check all supported types if it has some set
|
||||
if (!secondary) {
|
||||
for (int32 i = mimeTypes.CountItems(); !primary && i-- > 0;) {
|
||||
for (int32 i = mimeTypes.CountItems();
|
||||
!primary && i-- > 0;) {
|
||||
BString* type = mimeTypes.ItemAt(i);
|
||||
if (info.IsSupportedType(type->String())) {
|
||||
BMimeType mimeType(type->String());
|
||||
@@ -3025,7 +3114,8 @@ BContainerWindow::UpdateMenu(BMenu* menu, UpdateMenuContext context)
|
||||
|
||||
Model* selectedModel = NULL;
|
||||
if (selectCount == 1)
|
||||
selectedModel = PoseView()->SelectionList()->FirstItem()->TargetModel();
|
||||
selectedModel = PoseView()->SelectionList()->FirstItem()->
|
||||
TargetModel();
|
||||
|
||||
if (context == kMenuBarContext || context == kPosePopUpContext) {
|
||||
SetUpEditQueryItem(menu);
|
||||
@@ -3098,8 +3188,8 @@ BContainerWindow::UpdateMenu(BMenu* menu, UpdateMenuContext context)
|
||||
|
||||
BMenuItem* item = menu->FindItem(B_TRANSLATE("New"));
|
||||
if (item) {
|
||||
TemplatesMenu* templateMenu = dynamic_cast<TemplatesMenu*>(
|
||||
item->Submenu());
|
||||
TemplatesMenu* templateMenu = dynamic_cast<TemplatesMenu*>
|
||||
(item->Submenu());
|
||||
if (templateMenu)
|
||||
templateMenu->UpdateMenuState();
|
||||
}
|
||||
@@ -3140,8 +3230,8 @@ BContainerWindow::LoadAddOn(BMessage* message)
|
||||
|
||||
refs->AddMessenger("TrackerViewToken", BMessenger(PoseView()));
|
||||
|
||||
LaunchInNewThread("Add-on", B_NORMAL_PRIORITY, &AddOnThread, refs, addonRef,
|
||||
*TargetModel()->EntryRef());
|
||||
LaunchInNewThread("Add-on", B_NORMAL_PRIORITY, &AddOnThread, refs,
|
||||
addonRef, *TargetModel()->EntryRef());
|
||||
}
|
||||
|
||||
|
||||
@@ -3155,11 +3245,14 @@ BContainerWindow::_UpdateSelectionMIMEInfo()
|
||||
if (!mimeType.Length() || mimeType.ICompare(B_FILE_MIMETYPE) == 0) {
|
||||
pose->TargetModel()->Mimeset(true);
|
||||
if (pose->TargetModel()->IsSymLink()) {
|
||||
Model* resolved = new Model(pose->TargetModel()->EntryRef(), true, true);
|
||||
Model* resolved = new Model(pose->TargetModel()->EntryRef(),
|
||||
true, true);
|
||||
if (resolved->InitCheck() == B_OK) {
|
||||
mimeType.SetTo(resolved->MimeType());
|
||||
if (!mimeType.Length() || mimeType.ICompare(B_FILE_MIMETYPE) == 0)
|
||||
if (!mimeType.Length()
|
||||
|| mimeType.ICompare(B_FILE_MIMETYPE) == 0) {
|
||||
resolved->Mimeset(true);
|
||||
}
|
||||
}
|
||||
delete resolved;
|
||||
}
|
||||
@@ -3222,8 +3315,8 @@ BContainerWindow::NewAttributeMenu(BMenu* menu)
|
||||
kAttrRealName, B_STRING_TYPE, 145, B_ALIGN_LEFT, true, true));
|
||||
}
|
||||
|
||||
menu->AddItem(NewAttributeMenuItem (B_TRANSLATE("Size"), kAttrStatSize, B_OFF_T_TYPE,
|
||||
80, B_ALIGN_RIGHT, false, true));
|
||||
menu->AddItem(NewAttributeMenuItem (B_TRANSLATE("Size"), kAttrStatSize,
|
||||
B_OFF_T_TYPE, 80, B_ALIGN_RIGHT, false, true));
|
||||
|
||||
menu->AddItem(NewAttributeMenuItem(B_TRANSLATE("Modified"),
|
||||
kAttrStatModified, B_TIME_TYPE, 150, B_ALIGN_LEFT, false, true));
|
||||
@@ -3236,7 +3329,8 @@ BContainerWindow::NewAttributeMenu(BMenu* menu)
|
||||
|
||||
if (IsTrash() || InTrash()) {
|
||||
menu->AddItem(NewAttributeMenuItem(B_TRANSLATE("Original name"),
|
||||
kAttrOriginalPath, B_STRING_TYPE, 225, B_ALIGN_LEFT, false, false));
|
||||
kAttrOriginalPath, B_STRING_TYPE, 225, B_ALIGN_LEFT, false,
|
||||
false));
|
||||
} else {
|
||||
menu->AddItem(NewAttributeMenuItem(B_TRANSLATE("Location"), kAttrPath,
|
||||
B_STRING_TYPE, 225, B_ALIGN_LEFT, false, false));
|
||||
@@ -3325,9 +3419,10 @@ BContainerWindow::MarkArrangeByMenu(BMenu* menu)
|
||||
BMenuItem* item = menu->ItemAt(index);
|
||||
if (item->Message()) {
|
||||
uint32 attrHash;
|
||||
if (item->Message()->FindInt32("attr_hash", (int32*)&attrHash) == B_OK)
|
||||
if (item->Message()->FindInt32("attr_hash",
|
||||
(int32*)&attrHash) == B_OK) {
|
||||
item->SetMarked(PoseView()->PrimarySort() == attrHash);
|
||||
else if (item->Command() == kArrangeReverseOrder)
|
||||
} else if (item->Command() == kArrangeReverseOrder)
|
||||
item->SetMarked(PoseView()->ReverseSort());
|
||||
}
|
||||
}
|
||||
@@ -3650,7 +3745,8 @@ BContainerWindow::SetUpDefaultState()
|
||||
BDirectory desktop;
|
||||
FSGetDeskDir(&desktop);
|
||||
|
||||
// try copying state from our parent directory, unless it is the desktop folder
|
||||
// try copying state from our parent directory, unless it is the
|
||||
// desktop folder
|
||||
BEntry entry(TargetModel()->EntryRef());
|
||||
BDirectory parent;
|
||||
if (entry.GetParent(&parent) == B_OK && parent != desktop) {
|
||||
@@ -3670,8 +3766,8 @@ BContainerWindow::SetUpDefaultState()
|
||||
// tracker settings folder for what our state should be
|
||||
// For simplicity we are not picking up the most recent
|
||||
// changes that didn't get committed if home is still open in
|
||||
// a window, that's probably not a problem; would be OK if state got committed
|
||||
// after every change
|
||||
// a window, that's probably not a problem; would be OK if state
|
||||
// got committed after every change
|
||||
&& !DefaultStateSourceNode(kDefaultFolderTemplate, &defaultingNode, true))
|
||||
return;
|
||||
|
||||
@@ -3693,7 +3789,8 @@ BContainerWindow::SetUpDefaultState()
|
||||
|
||||
StaggerOneParams params;
|
||||
params.rectFromParent = shouldStagger;
|
||||
SelectiveAttributeTransformer frameOffsetter(kAttrWindowFrame, OffsetFrameOne, ¶ms);
|
||||
SelectiveAttributeTransformer frameOffsetter(kAttrWindowFrame,
|
||||
OffsetFrameOne, ¶ms);
|
||||
SelectiveAttributeTransformer scrollOriginCleaner(kAttrViewState,
|
||||
ClearViewOriginOne, ¶ms);
|
||||
|
||||
@@ -3725,7 +3822,8 @@ BContainerWindow::RestoreWindowState(AttributeStreamNode* node)
|
||||
}
|
||||
|
||||
BRect frame(Frame());
|
||||
if (node->Read(rectAttributeName, 0, B_RECT_TYPE, sizeof(BRect), &frame) == sizeof(BRect)) {
|
||||
if (node->Read(rectAttributeName, 0, B_RECT_TYPE, sizeof(BRect), &frame)
|
||||
== sizeof(BRect)) {
|
||||
MoveTo(frame.LeftTop());
|
||||
ResizeTo(frame.Width(), frame.Height());
|
||||
} else
|
||||
@@ -3735,7 +3833,8 @@ BContainerWindow::RestoreWindowState(AttributeStreamNode* node)
|
||||
|
||||
uint32 workspace;
|
||||
if ((fContainerWindowFlags & kRestoreWorkspace)
|
||||
&& node->Read(workspaceAttributeName, 0, B_INT32_TYPE, sizeof(uint32), &workspace) == sizeof(uint32))
|
||||
&& node->Read(workspaceAttributeName, 0, B_INT32_TYPE, sizeof(uint32),
|
||||
&workspace) == sizeof(uint32))
|
||||
SetWorkspaces(workspace);
|
||||
|
||||
if (fContainerWindowFlags & kIsHidden)
|
||||
@@ -3747,7 +3846,8 @@ BContainerWindow::RestoreWindowState(AttributeStreamNode* node)
|
||||
if (size > 0) {
|
||||
char buffer[size];
|
||||
if ((fContainerWindowFlags & kRestoreDecor)
|
||||
&& node->Read(kAttrWindowDecor, 0, B_RAW_TYPE, size, buffer) == size) {
|
||||
&& node->Read(kAttrWindowDecor, 0, B_RAW_TYPE, size, buffer)
|
||||
== size) {
|
||||
BMessage decorSettings;
|
||||
if (decorSettings.Unflatten(buffer) == B_OK)
|
||||
SetDecoratorSettings(decorSettings);
|
||||
@@ -3783,8 +3883,10 @@ BContainerWindow::RestoreWindowState(const BMessage &message)
|
||||
|
||||
uint32 workspace;
|
||||
if ((fContainerWindowFlags & kRestoreWorkspace)
|
||||
&& message.FindInt32(workspaceAttributeName, (int32*)&workspace) == B_OK)
|
||||
&& message.FindInt32(workspaceAttributeName,
|
||||
(int32*)&workspace) == B_OK) {
|
||||
SetWorkspaces(workspace);
|
||||
}
|
||||
|
||||
if (fContainerWindowFlags & kIsHidden)
|
||||
Minimize(true);
|
||||
@@ -3869,14 +3971,17 @@ BContainerWindow::DragStart(const BMessage* dragMessage)
|
||||
if (dragMessage == NULL)
|
||||
return B_ERROR;
|
||||
|
||||
// if already dragging, or
|
||||
// if all the refs match
|
||||
if (Dragging() && SpringLoadedFolderCompareMessages(dragMessage, fDragMessage))
|
||||
// if already dragging, or
|
||||
// if all the refs match
|
||||
if (Dragging()
|
||||
&& SpringLoadedFolderCompareMessages(dragMessage, fDragMessage)) {
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
// cache the current drag message
|
||||
// build a list of the mimetypes in the message
|
||||
SpringLoadedFolderCacheDragData(dragMessage, &fDragMessage, &fCachedTypesList);
|
||||
// cache the current drag message
|
||||
// build a list of the mimetypes in the message
|
||||
SpringLoadedFolderCacheDragData(dragMessage, &fDragMessage,
|
||||
&fCachedTypesList);
|
||||
|
||||
fWaitingForRefs = true;
|
||||
|
||||
@@ -4015,7 +4120,8 @@ BContainerWindow::SetSingleWindowBrowseShortcuts(bool enabled)
|
||||
new BMessage(kOpenSelection), PoseView());
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY,
|
||||
new BMessage(kOpenParentDir), PoseView());
|
||||
// We change the meaning from kNavigatorCommandUp to kOpenParentDir.
|
||||
// We change the meaning from kNavigatorCommandUp
|
||||
// to kOpenParentDir.
|
||||
AddShortcut(B_UP_ARROW, B_COMMAND_KEY | B_OPTION_KEY,
|
||||
new BMessage(kOpenParentDir), PoseView());
|
||||
// command + option results in closing the parent window
|
||||
@@ -4099,7 +4205,8 @@ BContainerWindow::PopulateArrangeByMenu(BMenu* menu)
|
||||
menu->AddSeparatorItem();
|
||||
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Clean up"), new BMessage(kCleanup), 'K');
|
||||
item = new BMenuItem(B_TRANSLATE("Clean up"), new BMessage(kCleanup),
|
||||
'K');
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
}
|
||||
@@ -4108,7 +4215,8 @@ BContainerWindow::PopulateArrangeByMenu(BMenu* menu)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
WindowStateNodeOpener::WindowStateNodeOpener(BContainerWindow* window, bool forWriting)
|
||||
WindowStateNodeOpener::WindowStateNodeOpener(BContainerWindow* window,
|
||||
bool forWriting)
|
||||
: fModelOpener(NULL),
|
||||
fNode(NULL),
|
||||
fStreamNode(NULL)
|
||||
@@ -4120,9 +4228,12 @@ WindowStateNodeOpener::WindowStateNodeOpener(BContainerWindow* window, bool forW
|
||||
fStreamNode = new AttributeStreamFileNode(fNode);
|
||||
}
|
||||
} else if (window->TargetModel()){
|
||||
fModelOpener = new ModelNodeLazyOpener(window->TargetModel(), forWriting, false);
|
||||
if (fModelOpener->IsOpen(forWriting))
|
||||
fStreamNode = new AttributeStreamFileNode(fModelOpener->TargetModel()->Node());
|
||||
fModelOpener = new ModelNodeLazyOpener(window->TargetModel(),
|
||||
forWriting, false);
|
||||
if (fModelOpener->IsOpen(forWriting)) {
|
||||
fStreamNode = new AttributeStreamFileNode(
|
||||
fModelOpener->TargetModel()->Node());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,8 @@ class BContainerWindow : public BWindow {
|
||||
uint32 containerWindowFlags,
|
||||
window_look look = B_DOCUMENT_WINDOW_LOOK,
|
||||
window_feel feel = B_NORMAL_WINDOW_FEEL,
|
||||
uint32 flags = B_WILL_ACCEPT_FIRST_CLICK | B_NO_WORKSPACE_ACTIVATION,
|
||||
uint32 flags = B_WILL_ACCEPT_FIRST_CLICK
|
||||
| B_NO_WORKSPACE_ACTIVATION,
|
||||
uint32 workspace = B_CURRENT_WORKSPACE);
|
||||
|
||||
virtual ~BContainerWindow();
|
||||
@@ -152,7 +153,8 @@ class BContainerWindow : public BWindow {
|
||||
void MarkAttributeMenu();
|
||||
void MarkArrangeByMenu(BMenu*);
|
||||
BMenuItem* NewAttributeMenuItem(const char* label, const char* name,
|
||||
int32 type, float width, int32 align, bool editable, bool statField);
|
||||
int32 type, float width, int32 align, bool editable,
|
||||
bool statField);
|
||||
BMenuItem* NewAttributeMenuItem(const char* label, const char* name,
|
||||
int32 type, const char* displayAs, float width, int32 align,
|
||||
bool editable, bool statField);
|
||||
@@ -163,7 +165,8 @@ class BContainerWindow : public BWindow {
|
||||
PiggybackTaskLoop* DelayedTaskLoop();
|
||||
// use for RunLater queueing
|
||||
void PulseTaskLoop();
|
||||
// called by some view that has pulse, either BackgroundView or BPoseView
|
||||
// called by some view that has pulse, either BackgroundView
|
||||
// or BPoseView
|
||||
|
||||
static bool DefaultStateSourceNode(const char* name, BNode* result,
|
||||
bool createNew = false, bool createFolder = true);
|
||||
@@ -205,7 +208,8 @@ class BContainerWindow : public BWindow {
|
||||
|
||||
virtual void AddMenus();
|
||||
virtual void AddShortcuts();
|
||||
// add equivalents of the menu shortcuts to the menuless desktop window
|
||||
// add equivalents of the menu shortcuts to the menuless
|
||||
// desktop window
|
||||
virtual void AddFileMenu(BMenu* menu);
|
||||
virtual void AddWindowMenu(BMenu* menu);
|
||||
|
||||
@@ -227,7 +231,8 @@ class BContainerWindow : public BWindow {
|
||||
virtual void SetCloseItem(BMenu*);
|
||||
virtual void SetupNavigationMenu(const entry_ref*, BMenu*);
|
||||
virtual void SetupMoveCopyMenus(const entry_ref*, BMenu*);
|
||||
virtual void PopulateMoveCopyNavMenu(BNavMenu*, uint32, const entry_ref*, bool);
|
||||
virtual void PopulateMoveCopyNavMenu(BNavMenu*, uint32,
|
||||
const entry_ref*, bool);
|
||||
|
||||
virtual void SetupOpenWithMenu(BMenu*);
|
||||
virtual void SetUpEditQueryItem(BMenu*);
|
||||
@@ -250,7 +255,8 @@ class BContainerWindow : public BWindow {
|
||||
BHandler* ResolveSpecifier(BMessage*, int32, BMessage*, int32,
|
||||
const char*);
|
||||
|
||||
bool EachAddon(BPath &path, bool(*)(const Model*, const char*, uint32, bool, void*),
|
||||
bool EachAddon(BPath &path,
|
||||
bool (*)(const Model*, const char*, uint32, bool, void*),
|
||||
BObjectList<Model>*, void*, BObjectList<BString> &);
|
||||
void LoadAddOn(BMessage*);
|
||||
|
||||
@@ -313,8 +319,8 @@ class WindowStateNodeOpener {
|
||||
// this class manages opening and closing the proper node for
|
||||
// state restoring / saving; the constructor knows how to decide whether
|
||||
// to use a special directory for root, etc.
|
||||
// setter calls used when no attributes can be read from a node and defaults
|
||||
// are to be substituted
|
||||
// setter calls used when no attributes can be read from a node and
|
||||
// defaults are to be substituted
|
||||
public:
|
||||
WindowStateNodeOpener(BContainerWindow* window, bool forWriting);
|
||||
virtual ~WindowStateNodeOpener();
|
||||
@@ -428,7 +434,7 @@ BContainerWindow::IsPathWatchingEnabled() const
|
||||
return fIsWatchingPath;
|
||||
}
|
||||
|
||||
filter_result ActivateWindowFilter(BMessage* message, BHandler**target,
|
||||
filter_result ActivateWindowFilter(BMessage* message, BHandler** target,
|
||||
BMessageFilter* messageFilter);
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
@@ -242,7 +242,8 @@ BCountView::Draw(BRect updateRect)
|
||||
|
||||
if (IsTypingAhead()) {
|
||||
// use a muted gray for the typeahead
|
||||
SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_4_TINT));
|
||||
SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
|
||||
B_DARKEN_4_TINT));
|
||||
} else
|
||||
SetHighColor(0, 0, 0);
|
||||
|
||||
@@ -263,7 +264,8 @@ BCountView::Draw(BRect updateRect)
|
||||
bounds.top--;
|
||||
|
||||
AddLine(bounds.LeftTop(), bounds.RightTop(), shadow);
|
||||
AddLine(BPoint(bounds.right, bounds.top + 2), bounds.RightBottom(), lightShadow);
|
||||
AddLine(BPoint(bounds.right, bounds.top + 2), bounds.RightBottom(),
|
||||
lightShadow);
|
||||
AddLine(bounds.LeftBottom(), bounds.RightBottom(), lightShadow);
|
||||
}
|
||||
|
||||
@@ -282,8 +284,10 @@ BCountView::Draw(BRect updateRect)
|
||||
|
||||
barberPoleRect.InsetBy(1, 1);
|
||||
|
||||
BRect destRect(fBarberPoleMap ? fBarberPoleMap->Bounds() : BRect(0, 0, 0, 0));
|
||||
destRect.OffsetTo(barberPoleRect.LeftTop() - BPoint(0, fLastBarberPoleOffset));
|
||||
BRect destRect(fBarberPoleMap
|
||||
? fBarberPoleMap->Bounds() : BRect(0, 0, 0, 0));
|
||||
destRect.OffsetTo(barberPoleRect.LeftTop()
|
||||
- BPoint(0, fLastBarberPoleOffset));
|
||||
fLastBarberPoleOffset -= 1;
|
||||
if (fLastBarberPoleOffset < 0)
|
||||
fLastBarberPoleOffset = 5;
|
||||
|
||||
@@ -84,7 +84,8 @@ struct AddOneShortcutParams {
|
||||
};
|
||||
|
||||
static bool
|
||||
AddOneShortcut(const Model* model, const char*, uint32 shortcut, bool /*primary*/, void* context)
|
||||
AddOneShortcut(const Model* model, const char*, uint32 shortcut,
|
||||
bool /*primary*/, void* context)
|
||||
{
|
||||
if (!shortcut)
|
||||
// no shortcut, bail
|
||||
@@ -151,11 +152,10 @@ BDeskWindow::~BDeskWindow()
|
||||
void
|
||||
BDeskWindow::Init(const BMessage*)
|
||||
{
|
||||
//
|
||||
// Set the size of the screen before calling the container window's
|
||||
// Init() because it will add volume poses to this window and
|
||||
// they will be clipped otherwise
|
||||
//
|
||||
// Set the size of the screen before calling the container window's
|
||||
// Init() because it will add volume poses to this window and
|
||||
// they will be clipped otherwise
|
||||
|
||||
BScreen screen(this);
|
||||
fOldFrame = screen.Frame();
|
||||
|
||||
@@ -313,6 +313,20 @@ BDeskWindow::AddWindowContextMenus(BMenu* menu)
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
message->AddInt32("size", 96);
|
||||
item = new BMenuItem(B_TRANSLATE("96 x 96"), message);
|
||||
item->SetMarked(PoseView()->IconSizeInt() == 96);
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
message->AddInt32("size", 128);
|
||||
item = new BMenuItem(B_TRANSLATE("128 x 128"), message);
|
||||
item->SetMarked(PoseView()->IconSizeInt() == 128);
|
||||
item->SetTarget(PoseView());
|
||||
iconSizeMenu->AddItem(item);
|
||||
|
||||
iconSizeMenu->AddSeparatorItem();
|
||||
|
||||
message = new BMessage(kIconMode);
|
||||
@@ -347,8 +361,8 @@ BDeskWindow::AddWindowContextMenus(BMenu* menu)
|
||||
menu->AddItem(pasteItem);
|
||||
menu->AddSeparatorItem();
|
||||
#endif
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Clean up"), new BMessage(kCleanup),
|
||||
'K'));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Clean up"),
|
||||
new BMessage(kCleanup), 'K'));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Select"B_UTF8_ELLIPSIS),
|
||||
new BMessage(kShowSelectionWindow), 'A', B_SHIFT_KEY));
|
||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Select all"),
|
||||
@@ -470,4 +484,3 @@ BDeskWindow::MessageReceived(BMessage* message)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -86,9 +86,10 @@ private:
|
||||
BRect fOldFrame;
|
||||
|
||||
// in the desktop window addon shortcuts have to be added by AddShortcut
|
||||
// and we don't always get the MenusBeginning call to check for new addons/update the
|
||||
// shortcuts -- instead we need to node monitor the addon directory and keep
|
||||
// a dirty flag that triggers shortcut re-installing
|
||||
// and we don't always get the MenusBeginning call to check for new
|
||||
// addons/update the shortcuts -- instead we need to node monitor the
|
||||
// addon directory and keep a dirty flag that triggers shortcut
|
||||
// reinstallation
|
||||
bool fShouldUpdateAddonShortcuts;
|
||||
std::set<uint32> fCurrentAddonShortcuts;
|
||||
// keeps track of which shortcuts are installed for Tracker addons
|
||||
|
||||
@@ -79,19 +79,20 @@ DesktopPoseView::InitDesktopDirentIterator(BPoseView* nodeMonitoringTarget,
|
||||
|
||||
ASSERT(!sourceModel.IsQuery());
|
||||
ASSERT(sourceModel.Node());
|
||||
BDirectory* sourceDirectory = dynamic_cast<BDirectory*>(sourceModel.Node());
|
||||
BDirectory* sourceDirectory
|
||||
= dynamic_cast<BDirectory*>(sourceModel.Node());
|
||||
|
||||
ASSERT(sourceDirectory);
|
||||
|
||||
// build an iterator list, start with boot
|
||||
EntryListBase* perDesktopIterator = new CachedDirectoryEntryList(
|
||||
*sourceDirectory);
|
||||
EntryListBase* perDesktopIterator
|
||||
= new CachedDirectoryEntryList(*sourceDirectory);
|
||||
|
||||
result->AddItem(perDesktopIterator);
|
||||
if (nodeMonitoringTarget) {
|
||||
TTracker::WatchNode(sourceModel.NodeRef(),
|
||||
B_WATCH_DIRECTORY | B_WATCH_NAME | B_WATCH_STAT | B_WATCH_ATTR,
|
||||
nodeMonitoringTarget);
|
||||
B_WATCH_DIRECTORY | B_WATCH_NAME | B_WATCH_STAT | B_WATCH_ATTR,
|
||||
nodeMonitoringTarget);
|
||||
}
|
||||
|
||||
if (result->Rewind() != B_OK) {
|
||||
@@ -131,7 +132,8 @@ DesktopPoseView::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);
|
||||
}
|
||||
@@ -161,8 +163,8 @@ DesktopPoseView::AddPosesCompleted()
|
||||
bool
|
||||
DesktopPoseView::Represents(const node_ref* ref) const
|
||||
{
|
||||
// When the Tracker is set up to integrate non-boot beos volumes,
|
||||
// it represents the home/Desktop folders of all beos volumes
|
||||
// When the Tracker is set up to integrate non-boot beos volumes,
|
||||
// it represents the home/Desktop folders of all beos volumes
|
||||
|
||||
return _inherited::Represents(ref);
|
||||
}
|
||||
@@ -227,7 +229,8 @@ DesktopPoseView::AdaptToVolumeChange(BMessage* message)
|
||||
|
||||
message->FindBool("ShowDisksIcon", &showDisksIcon);
|
||||
message->FindBool("MountVolumesOntoDesktop", &mountVolumesOnDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop", &mountSharedVolumesOntoDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop",
|
||||
&mountSharedVolumesOntoDesktop);
|
||||
|
||||
BEntry entry("/");
|
||||
Model model(&entry);
|
||||
@@ -241,7 +244,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 +256,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());
|
||||
}
|
||||
@@ -268,7 +273,8 @@ DesktopPoseView::AdaptToDesktopIntegrationChange(BMessage* message)
|
||||
bool mountSharedVolumesOntoDesktop = true;
|
||||
|
||||
message->FindBool("MountVolumesOntoDesktop", &mountVolumesOnDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop", &mountSharedVolumesOntoDesktop);
|
||||
message->FindBool("MountSharedVolumesOntoDesktop",
|
||||
&mountSharedVolumesOntoDesktop);
|
||||
|
||||
ShowVolumes(false, mountSharedVolumesOntoDesktop);
|
||||
ShowVolumes(mountVolumesOnDesktop, mountSharedVolumesOntoDesktop);
|
||||
|
||||
@@ -109,10 +109,13 @@ BDirMenu::Populate(const BEntry* startEntry, BWindow* originatingWindow,
|
||||
if (!includeStartEntry) {
|
||||
BDirectory parent;
|
||||
BDirectory dir(&entry);
|
||||
// if we're at the root directory skip "mnt" and go straight to "/"
|
||||
if (!showDesktop && dir.InitCheck() == B_OK && dir.IsRootDirectory())
|
||||
|
||||
if (!showDesktop && dir.InitCheck() == B_OK
|
||||
&& dir.IsRootDirectory()) {
|
||||
// if we're at the root directory skip "mnt" and
|
||||
// go straight to "/"
|
||||
parent.SetTo("/");
|
||||
else
|
||||
} else
|
||||
entry.GetParent(&parent);
|
||||
|
||||
parent.GetEntry(&entry);
|
||||
@@ -137,10 +140,11 @@ BDirMenu::Populate(const BEntry* startEntry, BWindow* originatingWindow,
|
||||
|
||||
bool hitRoot = false;
|
||||
|
||||
// if we're at the root directory skip "mnt" and go straight to "/"
|
||||
BDirectory dir(&entry);
|
||||
if (!showDesktop && dir.InitCheck() == B_OK
|
||||
&& dir.IsRootDirectory()) {
|
||||
// if we're at the root directory skip "mnt" and
|
||||
// go straight to "/"
|
||||
hitRoot = true;
|
||||
parent.SetTo("/");
|
||||
}
|
||||
@@ -161,7 +165,7 @@ BDirMenu::Populate(const BEntry* startEntry, BWindow* originatingWindow,
|
||||
if (result == kReadAttrFailed || !info.fInvisible
|
||||
|| (showDesktop && desktopEntry == entry)) {
|
||||
AddItemToDirMenu(&entry, originatingWindow, reverse,
|
||||
addShortcuts, navMenuEntries);
|
||||
addShortcuts, navMenuEntries);
|
||||
}
|
||||
|
||||
if (hitRoot) {
|
||||
@@ -213,12 +217,12 @@ BDirMenu::AddItemToDirMenu(const BEntry* entry, BWindow* originatingWindow,
|
||||
BContainerWindow* window = originatingWindow ?
|
||||
dynamic_cast<BContainerWindow*>(originatingWindow) : 0;
|
||||
if (window)
|
||||
message->AddData("nodeRefsToClose", B_RAW_TYPE, window->TargetModel()->NodeRef(),
|
||||
sizeof (node_ref));
|
||||
message->AddData("nodeRefsToClose", B_RAW_TYPE,
|
||||
window->TargetModel()->NodeRef(), sizeof (node_ref));
|
||||
ModelMenuItem* item;
|
||||
if (navMenuEntries) {
|
||||
BNavMenu* subMenu = new BNavMenu(model.Name(), B_REFS_RECEIVED, fTarget,
|
||||
window);
|
||||
BNavMenu* subMenu = new BNavMenu(model.Name(), B_REFS_RECEIVED,
|
||||
fTarget, window);
|
||||
entry_ref ref;
|
||||
entry->GetRef(&ref);
|
||||
subMenu->SetNavDir(&ref);
|
||||
@@ -244,7 +248,8 @@ BDirMenu::AddItemToDirMenu(const BEntry* entry, BWindow* originatingWindow,
|
||||
item->SetTarget(fTarget);
|
||||
|
||||
if (fMenuBar) {
|
||||
ModelMenuItem* menu = dynamic_cast<ModelMenuItem*>(fMenuBar->ItemAt(0));
|
||||
ModelMenuItem* menu
|
||||
= dynamic_cast<ModelMenuItem*>(fMenuBar->ItemAt(0));
|
||||
if (menu) {
|
||||
ThrowOnError(menu->SetEntry(entry));
|
||||
item->SetMarked(true);
|
||||
|
||||
@@ -50,8 +50,9 @@ public:
|
||||
virtual ~BDirMenu();
|
||||
|
||||
void Populate(const BEntry* startDir, BWindow* originatingWindow,
|
||||
bool includeStartDir = false, bool select = false, bool reverse = false,
|
||||
bool addShortcuts = false, bool navMenuEntries = false);
|
||||
bool includeStartDir = false, bool select = false,
|
||||
bool reverse = false, bool addShortcuts = false,
|
||||
bool navMenuEntries = false);
|
||||
void AddItemToDirMenu(const BEntry*, BWindow* originatingWindow,
|
||||
bool atEnd, bool addShortcuts, bool navMenuEntries = false);
|
||||
void AddDisksIconToMenu(bool reverse = false);
|
||||
|
||||
@@ -131,8 +131,8 @@ EntryListBase::Next(dirent* ent)
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
CachedEntryIterator::CachedEntryIterator(BEntryList* iterator, int32 numEntries,
|
||||
bool sortInodes)
|
||||
CachedEntryIterator::CachedEntryIterator(BEntryList* iterator,
|
||||
int32 numEntries, bool sortInodes)
|
||||
:
|
||||
fIterator(iterator),
|
||||
fEntryRefBuffer(NULL),
|
||||
@@ -265,7 +265,8 @@ CachedEntryIterator::GetNextDirents(struct dirent* ent, size_t size,
|
||||
bufferRemain -= currentDirentSize;
|
||||
ASSERT(bufferRemain >= 0);
|
||||
|
||||
if ((size_t)bufferRemain < (sizeof(dirent) + B_FILE_NAME_LENGTH)) {
|
||||
if ((size_t)bufferRemain
|
||||
< (sizeof(dirent) + B_FILE_NAME_LENGTH)) {
|
||||
// cant fit a big entryRef in the buffer, just bail
|
||||
// and start from scratch
|
||||
break;
|
||||
|
||||
@@ -102,8 +102,8 @@ public:
|
||||
//
|
||||
// each chunk of iterators in the cache are then returned in an order,
|
||||
// sorted by their i-node number -- this turns out to give quite a bit
|
||||
// better performance over just using the order in which they show up using
|
||||
// the default BEntryList iterator subclass
|
||||
// better performance over just using the order in which they show up
|
||||
// using the default BEntryList iterator subclass
|
||||
|
||||
CachedEntryIterator(BEntryList* iterator, int32 numEntries,
|
||||
bool sortInodes = false);
|
||||
|
||||
@@ -48,7 +48,8 @@ static void MakeNodeFromName(node_ref* node, char* name);
|
||||
static inline void MakeRefName(char* refName, const node_ref* node);
|
||||
static inline void MakeModeName(char* modeName, const node_ref* node);
|
||||
static inline void MakeModeNameFromRefName(char* modeName, char* refName);
|
||||
static inline bool CompareModeAndRefName(const char* modeName, const char* refName);
|
||||
static inline bool CompareModeAndRefName(const char* modeName,
|
||||
const char* refName);
|
||||
|
||||
/*
|
||||
static bool
|
||||
@@ -130,8 +131,10 @@ FSClipboardHasRefs()
|
||||
uint32 type;
|
||||
int32 count;
|
||||
if (clip->GetInfo(B_REF_TYPE, 0, &refName, &type, &count) == B_OK
|
||||
&& clip->GetInfo(B_INT32_TYPE, 0, &modeName, &type, &count) == B_OK)
|
||||
&& clip->GetInfo(B_INT32_TYPE, 0, &modeName, &type, &count)
|
||||
== B_OK) {
|
||||
result = CompareModeAndRefName(modeName, refName);
|
||||
}
|
||||
}
|
||||
be_clipboard->Unlock();
|
||||
}
|
||||
@@ -145,8 +148,8 @@ FSClipboardStartWatch(BMessenger target)
|
||||
if (dynamic_cast<TTracker*>(be_app) != NULL)
|
||||
((TTracker*)be_app)->ClipboardRefsWatcher()->AddToNotifyList(target);
|
||||
else {
|
||||
// this code is used by external apps using objects using FSClipboard functions
|
||||
// i.e: applications using FilePanel
|
||||
// this code is used by external apps using objects using FSClipboard
|
||||
// functions, i.e. applications using FilePanel
|
||||
BMessenger messenger(kTrackerSignature);
|
||||
if (messenger.IsValid()) {
|
||||
BMessage message(kStartWatchClipboardRefs);
|
||||
@@ -163,8 +166,8 @@ FSClipboardStopWatch(BMessenger target)
|
||||
if (dynamic_cast<TTracker*>(be_app) != NULL)
|
||||
((TTracker*)be_app)->ClipboardRefsWatcher()->AddToNotifyList(target);
|
||||
else {
|
||||
// this code is used by external apps using objects using FSClipboard functions
|
||||
// i.e: applications using FilePanel
|
||||
// this code is used by external apps using objects using FSClipboard
|
||||
// functions, i.e. applications using FilePanel
|
||||
BMessenger messenger(kTrackerSignature);
|
||||
if (messenger.IsValid()) {
|
||||
BMessage message(kStopWatchClipboardRefs);
|
||||
@@ -195,8 +198,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();
|
||||
@@ -333,7 +336,8 @@ FSClipboardRemovePoses(const node_ref* directory, PoseList* list)
|
||||
MakeRefName(refName, &clipNode.node);
|
||||
MakeModeName(modeName);
|
||||
|
||||
if (clip->RemoveName(refName) == B_OK && clip->RemoveName(modeName)) {
|
||||
if (clip->RemoveName(refName) == B_OK
|
||||
&& clip->RemoveName(modeName)) {
|
||||
updateMessage.AddData("tcnode", T_CLIPBOARD_NODE, &clipNode,
|
||||
sizeof(TClipboardNodeRef), true, listCount);
|
||||
refsRemoved++;
|
||||
@@ -353,7 +357,6 @@ FSClipboardRemovePoses(const node_ref* directory, PoseList* list)
|
||||
/** Pastes entries from the clipboard to the target model's directory.
|
||||
* Updates moveModes and notifies listeners if necessary.
|
||||
*/
|
||||
|
||||
bool
|
||||
FSClipboardPaste(Model* model, uint32 linksMode)
|
||||
{
|
||||
@@ -409,13 +412,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 +441,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 +456,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 +477,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 +506,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)
|
||||
@@ -583,7 +591,8 @@ FSClipboardRemove(Model* model)
|
||||
report->AddInt32("device", ref->device);
|
||||
report->AddInt64("directory", ref->directory);
|
||||
report->AddBool("clearClipboard", false);
|
||||
report->AddData("tcnode", T_CLIPBOARD_NODE, &tcnode, sizeof(tcnode), true);
|
||||
report->AddData("tcnode", T_CLIPBOARD_NODE, &tcnode, sizeof(tcnode),
|
||||
true);
|
||||
messenger.SendMessage(report);
|
||||
delete report;
|
||||
}
|
||||
@@ -619,7 +628,8 @@ BClipboardRefsWatcher::AddToNotifyList(BMessenger target)
|
||||
BMessenger* messenger;
|
||||
bool found = false;
|
||||
|
||||
for (int32 index = 0;(messenger = fNotifyList.ItemAt(index)) != NULL; index++) {
|
||||
for (int32 index = 0; (messenger = fNotifyList.ItemAt(index)) != NULL;
|
||||
index++) {
|
||||
if (*messenger == target) {
|
||||
found = true;
|
||||
break;
|
||||
@@ -639,7 +649,8 @@ BClipboardRefsWatcher::RemoveFromNotifyList(BMessenger target)
|
||||
if (Lock()) {
|
||||
BMessenger* messenger;
|
||||
|
||||
for (int32 index = 0;(messenger = fNotifyList.ItemAt(index)) != NULL; index++) {
|
||||
for (int32 index = 0; (messenger = fNotifyList.ItemAt(index)) != NULL;
|
||||
index++) {
|
||||
if (*messenger == target) {
|
||||
delete fNotifyList.RemoveItemAt(index);
|
||||
break;
|
||||
@@ -761,7 +772,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);
|
||||
@@ -796,7 +808,8 @@ BClipboardRefsWatcher::UpdatePoseViews(BMessage* reportMessage)
|
||||
int32 index = 0;
|
||||
TClipboardNodeRef* tcnode = NULL;
|
||||
ssize_t size;
|
||||
while (reportMessage->FindData("tcnode", T_CLIPBOARD_NODE, index, (const void**)&tcnode, &size) == B_OK) {
|
||||
while (reportMessage->FindData("tcnode", T_CLIPBOARD_NODE, index,
|
||||
(const void**)&tcnode, &size) == B_OK) {
|
||||
if (tcnode->moveMode == kDelete) {
|
||||
watch_node(&tcnode->node, B_STOP_WATCHING, this);
|
||||
} else {
|
||||
|
||||
@@ -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),
|
||||
@@ -236,8 +239,8 @@ UndoItemCopy::Undo()
|
||||
status_t
|
||||
UndoItemCopy::Redo()
|
||||
{
|
||||
FSMoveToFolder(new BObjectList<entry_ref>(fSourceList), new BEntry(&fTargetRef),
|
||||
FSUndoMoveMode(fMoveMode), NULL);
|
||||
FSMoveToFolder(new BObjectList<entry_ref>(fSourceList),
|
||||
new BEntry(&fTargetRef), FSUndoMoveMode(fMoveMode), NULL);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -384,7 +388,8 @@ UndoItemRename::Redo()
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
UndoItemRenameVolume::UndoItemRenameVolume(BVolume &volume, const char* newName)
|
||||
UndoItemRenameVolume::UndoItemRenameVolume(BVolume &volume,
|
||||
const char* newName)
|
||||
:
|
||||
fVolume(volume),
|
||||
fNewName(newName)
|
||||
|
||||
@@ -124,9 +124,10 @@ status_t MoveItem(BEntry* entry, BDirectory* destDir, BPoint* loc,
|
||||
ConflictCheckResult PreFlightNameCheck(BObjectList<entry_ref>* srcList,
|
||||
const BDirectory* destDir, int32* collisionCount, uint32 moveMode);
|
||||
status_t CheckName(uint32 moveMode, const BEntry* srcEntry,
|
||||
const BDirectory* destDir, bool multipleCollisions, ConflictCheckResult &);
|
||||
void CopyAttributes(CopyLoopControl* control, BNode* srcNode, BNode* destNode, void* buffer,
|
||||
size_t bufsize);
|
||||
const BDirectory* destDir, bool multipleCollisions,
|
||||
ConflictCheckResult &);
|
||||
void CopyAttributes(CopyLoopControl* control, BNode* srcNode,
|
||||
BNode* destNode, void* buffer, size_t bufsize);
|
||||
void CopyPoseLocation(BNode* src, BNode* dest);
|
||||
bool DirectoryMatchesOrContains(const BEntry*, directory_which);
|
||||
bool DirectoryMatchesOrContains(const BEntry*, const char* additionalPath,
|
||||
@@ -177,11 +178,13 @@ static const char* kFileDeleteErrorString =
|
||||
|
||||
static const char* kReplaceManyStr =
|
||||
B_TRANSLATE_MARK("Some items already exist in this folder with "
|
||||
"the same names as the items you are %verb.\n \nWould you like to replace "
|
||||
"them with the ones you are %verb or be prompted for each one?");
|
||||
"the same names as the items you are %verb.\n \nWould you like to "
|
||||
"replace them with the ones you are %verb or be prompted for each "
|
||||
"one?");
|
||||
|
||||
static const char* kFindAlternativeStr =
|
||||
B_TRANSLATE_MARK("Would you like to find some other suitable application?");
|
||||
B_TRANSLATE_MARK("Would you like to find some other suitable "
|
||||
"application?");
|
||||
|
||||
static const char* kFindApplicationStr =
|
||||
B_TRANSLATE_MARK("Would you like to find a suitable application "
|
||||
@@ -635,21 +638,21 @@ ConfirmChangeIfWellKnownDirectory(const BEntry* entry,
|
||||
if (DirectoryMatchesOrContains(entry, B_SYSTEM_DIRECTORY)) {
|
||||
warning.SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the system folder or its "
|
||||
"contents, you won't be able to boot %osName!\n\nAre you sure you "
|
||||
"want to do this?\n\nTo %toDoAction the system folder or its "
|
||||
"contents, you won't be able to boot %osName!\n\nAre you sure "
|
||||
"you want to do this?\n\nTo %toDoAction the system folder or its "
|
||||
"contents anyway, hold down the Shift key and click "
|
||||
"\"%toConfirmAction\"."));
|
||||
} else if (DirectoryMatches(entry, B_COMMON_DIRECTORY)) {
|
||||
warning.SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the common folder, %osName "
|
||||
"may not behave properly!\n\nAre you sure you want to do this?\n\n"
|
||||
"To %toDoAction the common folder anyway, hold down the "
|
||||
"may not behave properly!\n\nAre you sure you want to do this?"
|
||||
"\n\nTo %toDoAction the common folder anyway, hold down the "
|
||||
"Shift key and click \"%toConfirmAction\"."));
|
||||
} else if (DirectoryMatches(entry, B_USER_DIRECTORY)) {
|
||||
warning .SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the home folder, %osName "
|
||||
"may not behave properly!\n\nAre you sure you want to do this?\n\n"
|
||||
"To %toDoAction the home folder anyway, hold down the "
|
||||
"may not behave properly!\n\nAre you sure you want to do this?"
|
||||
"\n\nTo %toDoAction the home folder anyway, hold down the "
|
||||
"Shift key and click \"%toConfirmAction\"."));
|
||||
} else if (DirectoryMatchesOrContains(entry, B_USER_CONFIG_DIRECTORY)
|
||||
|| DirectoryMatchesOrContains(entry, B_COMMON_SETTINGS_DIRECTORY)) {
|
||||
@@ -660,21 +663,21 @@ ConfirmChangeIfWellKnownDirectory(const BEntry* entry,
|
||||
B_COMMON_SETTINGS_DIRECTORY)) {
|
||||
warning.SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the mime settings, "
|
||||
"%osName may not behave properly!\n\nAre you sure you want to "
|
||||
"do this?"));
|
||||
"%osName may not behave properly!\n\nAre you sure you want "
|
||||
"to do this?"));
|
||||
requireOverride = false;
|
||||
} else if (DirectoryMatches(entry, B_USER_CONFIG_DIRECTORY)) {
|
||||
warning.SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the config folder, %osName "
|
||||
"may not behave properly!\n\nAre you sure you want to do "
|
||||
"this?"));
|
||||
B_TRANSLATE("If you %ifYouDoAction the config folder, "
|
||||
"%osName may not behave properly!\n\nAre you sure you want "
|
||||
"to do this?"));
|
||||
requireOverride = false;
|
||||
} else if (DirectoryMatches(entry, B_USER_SETTINGS_DIRECTORY)
|
||||
|| DirectoryMatches(entry, B_COMMON_SETTINGS_DIRECTORY)) {
|
||||
warning.SetTo(
|
||||
B_TRANSLATE("If you %ifYouDoAction the settings folder, "
|
||||
"%osName may not behave properly!\n\nAre you sure you want to "
|
||||
"do this?"));
|
||||
"%osName may not behave properly!\n\nAre you sure you want "
|
||||
"to do this?"));
|
||||
requireOverride = false;
|
||||
}
|
||||
}
|
||||
@@ -752,11 +755,13 @@ InitCopy(CopyLoopControl* loopControl, uint32 moveMode,
|
||||
"directory."));
|
||||
} else {
|
||||
errorStr.SetTo(
|
||||
B_TRANSLATE("You cannot copy or move the root directory."));
|
||||
B_TRANSLATE("You cannot copy or move the root "
|
||||
"directory."));
|
||||
}
|
||||
|
||||
BAlert* alert = new BAlert("", errorStr.String(),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
return B_ERROR;
|
||||
@@ -783,10 +788,12 @@ InitCopy(CopyLoopControl* loopControl, uint32 moveMode,
|
||||
*preflightResult = kPrompt;
|
||||
*collisionCount = 0;
|
||||
|
||||
*preflightResult = PreFlightNameCheck(srcList, destDir, collisionCount,
|
||||
moveMode);
|
||||
if (*preflightResult == kCanceled) // user canceled
|
||||
*preflightResult = PreFlightNameCheck(srcList, destDir,
|
||||
collisionCount, moveMode);
|
||||
if (*preflightResult == kCanceled) {
|
||||
// user canceled
|
||||
return B_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
// set up the status display
|
||||
@@ -802,7 +809,8 @@ InitCopy(CopyLoopControl* loopControl, uint32 moveMode,
|
||||
off_t totalSize = 0;
|
||||
if (needSizeCalculation) {
|
||||
if (CalcItemsAndSize(loopControl, srcList,
|
||||
dstVol->BlockSize(), &totalItems, &totalSize) != B_OK) {
|
||||
dstVol->BlockSize(), &totalItems, &totalSize)
|
||||
!= B_OK) {
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
@@ -997,7 +1005,8 @@ MoveTask(BObjectList<entry_ref>* srcList, BEntry* destEntry, BList* pointList,
|
||||
|
||||
result = MoveEntryToTrash(&sourceEntry, loc, undo);
|
||||
if (result != B_OK) {
|
||||
BString error(B_TRANSLATE("Error moving \"%name\" to Trash. (%error)"));
|
||||
BString error(B_TRANSLATE("Error moving \"%name\" to Trash. "
|
||||
"(%error)"));
|
||||
error.ReplaceFirst("%name", srcRef->name);
|
||||
error.ReplaceFirst("%error", strerror(result));
|
||||
BAlert* alert = new BAlert("", error.String(),
|
||||
@@ -1011,8 +1020,8 @@ MoveTask(BObjectList<entry_ref>* srcList, BEntry* destEntry, BList* pointList,
|
||||
}
|
||||
|
||||
// resolve name collisions and hierarchy problems
|
||||
if (CheckName(moveMode, &sourceEntry, &destDir, collisionCount > 1,
|
||||
conflictCheckResult) != B_OK) {
|
||||
if (CheckName(moveMode, &sourceEntry, &destDir,
|
||||
collisionCount > 1, conflictCheckResult) != B_OK) {
|
||||
// we will skip the current item, because we got a conflict
|
||||
// and were asked to or because there was some conflict
|
||||
|
||||
@@ -1160,8 +1169,9 @@ CopyFile(BEntry* srcFile, StatStruct* srcStat, BDirectory* destDir,
|
||||
throw (status_t)err;
|
||||
|
||||
if (err != B_OK) {
|
||||
if (!loopControl->FileError(B_TRANSLATE_NOCOLLECT(kFileErrorString),
|
||||
destName, err, true)) {
|
||||
if (!loopControl->FileError(
|
||||
B_TRANSLATE_NOCOLLECT(kFileErrorString), destName, err,
|
||||
true)) {
|
||||
throw (status_t)err;
|
||||
} else {
|
||||
// user selected continue in spite of error, update status bar
|
||||
@@ -1176,7 +1186,8 @@ CopyFile(BEntry* srcFile, StatStruct* srcStat, BDirectory* destDir,
|
||||
static bool
|
||||
CreateFileSystemCompatibleName(const BDirectory* destDir, char* destName)
|
||||
{
|
||||
// Is it a FAT32 file system? (this is the only one we currently now about)
|
||||
// Is it a FAT32 file system?
|
||||
// (this is the only one we currently know about)
|
||||
|
||||
BEntry target;
|
||||
destDir->GetEntry(&target);
|
||||
@@ -1412,8 +1423,9 @@ CopyAttributes(CopyLoopControl* control, BNode* srcNode, BNode* destNode,
|
||||
|
||||
|
||||
static void
|
||||
CopyFolder(BEntry* srcEntry, BDirectory* destDir, CopyLoopControl* loopControl,
|
||||
BPoint* loc, bool makeOriginalName, Undo &undo, bool removeSource = false)
|
||||
CopyFolder(BEntry* srcEntry, BDirectory* destDir,
|
||||
CopyLoopControl* loopControl, BPoint* loc, bool makeOriginalName,
|
||||
Undo &undo, bool removeSource = false)
|
||||
{
|
||||
BDirectory newDir;
|
||||
BEntry entry;
|
||||
@@ -1669,7 +1681,8 @@ MoveItem(BEntry* entry, BDirectory* destDir, BPoint* loc, uint32 moveMode,
|
||||
// else source and target are in the same dir
|
||||
|
||||
source.Append(path.Leaf());
|
||||
err = destDir->CreateSymLink(name, source.String(), &link);
|
||||
err = destDir->CreateSymLink(name, source.String(),
|
||||
&link);
|
||||
|
||||
chdir(oldwd);
|
||||
// change working dir back to original
|
||||
@@ -1871,7 +1884,8 @@ MoveEntryToTrash(BEntry* entry, BPoint* loc, Undo &undo)
|
||||
if (volume == boot) {
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
volume.GetName(name);
|
||||
BString buffer(B_TRANSLATE("Cannot unmount the boot volume \"%name\"."));
|
||||
BString buffer(
|
||||
B_TRANSLATE("Cannot unmount the boot volume \"%name\"."));
|
||||
buffer.ReplaceFirst("%name", name);
|
||||
BAlert* alert = new BAlert("", buffer.String(),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
@@ -1898,7 +1912,7 @@ MoveEntryToTrash(BEntry* entry, BPoint* loc, Undo &undo)
|
||||
if (dir == trash_dir || dir.Contains(&trashEntry)) {
|
||||
(new BAlert("",
|
||||
B_TRANSLATE("You cannot put the Trash, home or Desktop "
|
||||
"directory into the trash."),
|
||||
"directory into the trash."),
|
||||
B_TRANSLATE("OK"),
|
||||
0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT))->Go();
|
||||
|
||||
@@ -2060,7 +2074,8 @@ CheckName(uint32 moveMode, const BEntry* sourceEntry,
|
||||
&& moveMode != kCreateRelativeLink) {
|
||||
(new BAlert("",
|
||||
B_TRANSLATE("You can't move or copy the trash."),
|
||||
B_TRANSLATE("OK"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT))->Go();
|
||||
B_TRANSLATE("OK"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT))->Go();
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
@@ -2092,7 +2107,8 @@ CheckName(uint32 moveMode, const BEntry* sourceEntry,
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure user isn't trying to replace a file with folder or vice versa.
|
||||
// ensure that the user isn't trying to replace a file with folder
|
||||
// or vice-versa
|
||||
if (moveMode != kCreateLink
|
||||
&& moveMode != kCreateRelativeLink
|
||||
&& destIsDir != sourceIsDirectory) {
|
||||
@@ -2107,7 +2123,6 @@ CheckName(uint32 moveMode, const BEntry* sourceEntry,
|
||||
|
||||
if (replaceAll != kReplaceAll) {
|
||||
// prompt user to determine whether to replace or not
|
||||
|
||||
BString replaceMsg;
|
||||
|
||||
if (moveMode == kCreateLink || moveMode == kCreateRelativeLink) {
|
||||
@@ -2176,7 +2191,8 @@ CheckName(uint32 moveMode, const BEntry* sourceEntry,
|
||||
return B_OK;
|
||||
|
||||
if (err != B_OK) {
|
||||
BString error(B_TRANSLATE("There was a problem trying to replace \"%name\". The item might be open or busy."));
|
||||
BString error(B_TRANSLATE("There was a problem trying to replace "
|
||||
"\"%name\". The item might be open or busy."));
|
||||
error.ReplaceFirst("%name", name);;
|
||||
BAlert* alert = new BAlert("", error.String(),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
@@ -2381,8 +2397,9 @@ FSRecursiveCalcSize(BInfoWindow* window, CopyLoopControl* loopControl,
|
||||
|
||||
|
||||
status_t
|
||||
CalcItemsAndSize(CopyLoopControl* loopControl, BObjectList<entry_ref>* refList,
|
||||
ssize_t blockSize, int32* totalCount, off_t* totalSize)
|
||||
CalcItemsAndSize(CopyLoopControl* loopControl,
|
||||
BObjectList<entry_ref>* refList, ssize_t blockSize, int32* totalCount,
|
||||
off_t* totalSize)
|
||||
{
|
||||
int32 fileCount = 0;
|
||||
int32 dirCount = 0;
|
||||
@@ -2488,8 +2505,8 @@ FSGetTrashDir(BDirectory* trashDir, dev_t dev)
|
||||
if (data != NULL)
|
||||
trashDir->WriteAttr(kAttrMiniIcon, 'MICN', 0, data, size);
|
||||
|
||||
data = GetTrackerResources()->LoadResource(B_VECTOR_ICON_TYPE, R_TrashIcon,
|
||||
&size);
|
||||
data = GetTrackerResources()->LoadResource(B_VECTOR_ICON_TYPE,
|
||||
R_TrashIcon, &size);
|
||||
if (data != NULL)
|
||||
trashDir->WriteAttr(kAttrIcon, B_VECTOR_ICON_TYPE, 0, data, size);
|
||||
|
||||
@@ -3228,14 +3245,15 @@ _TrackerLaunchAppWithDocuments(const entry_ref* appRef, const BMessage* refs,
|
||||
if (refs && openWithOK && error != B_SHUTTING_DOWN) {
|
||||
alertString << B_TRANSLATE_NOCOLLECT(kFindAlternativeStr);
|
||||
BAlert* alert = new BAlert("", alertString.String(),
|
||||
B_TRANSLATE("Cancel"), B_TRANSLATE("Find"), 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), B_TRANSLATE("Find"), 0,
|
||||
B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
if (alert->Go() == 1)
|
||||
error = TrackerOpenWith(refs);
|
||||
} else {
|
||||
BAlert* alert = new BAlert("", alertString.String(),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
}
|
||||
@@ -3389,8 +3407,8 @@ _TrackerLaunchDocuments(const entry_ref* /*doNotUse*/, const BMessage* refs,
|
||||
} else {
|
||||
BEntry appEntry(&app, true);
|
||||
for (int32 index = 0;;) {
|
||||
// remove the app itself from the refs received so we don't try
|
||||
// to open ourselves
|
||||
// remove the app itself from the refs received so we don't
|
||||
// try to open ourselves
|
||||
entry_ref ref;
|
||||
if (copyOfRefs.FindRef("refs", index, &ref) != B_OK)
|
||||
break;
|
||||
@@ -3483,15 +3501,18 @@ _TrackerLaunchDocuments(const entry_ref* /*doNotUse*/, const BMessage* refs,
|
||||
&& LoaderErrorDetails(&app, loaderErrorString) == B_OK) {
|
||||
if (openedDocuments) {
|
||||
alertString.SetTo(B_TRANSLATE("Could not open \"%document\" "
|
||||
"with application \"%app\" (Missing symbol: %symbol). \n"));
|
||||
"with application \"%app\" (Missing symbol: %symbol). "
|
||||
"\n"));
|
||||
alertString.ReplaceFirst("%document", documentRef.name);
|
||||
alertString.ReplaceFirst("%app", app.name);
|
||||
alertString.ReplaceFirst("%symbol", loaderErrorString.String());
|
||||
alertString.ReplaceFirst("%symbol",
|
||||
loaderErrorString.String());
|
||||
} else {
|
||||
alertString.SetTo(B_TRANSLATE("Could not open \"%document\" "
|
||||
"(Missing symbol: %symbol). \n"));
|
||||
alertString.ReplaceFirst("%document", documentRef.name);
|
||||
alertString.ReplaceFirst("%symbol", loaderErrorString.String());
|
||||
alertString.ReplaceFirst("%symbol",
|
||||
loaderErrorString.String());
|
||||
}
|
||||
alternative = B_TRANSLATE_NOCOLLECT(kFindAlternativeStr);
|
||||
} else if (error == B_MISSING_LIBRARY
|
||||
@@ -3502,12 +3523,14 @@ _TrackerLaunchDocuments(const entry_ref* /*doNotUse*/, const BMessage* refs,
|
||||
"\n"));
|
||||
alertString.ReplaceFirst("%document", documentRef.name);
|
||||
alertString.ReplaceFirst("%app", app.name);
|
||||
alertString.ReplaceFirst("%library", loaderErrorString.String());
|
||||
alertString.ReplaceFirst("%library",
|
||||
loaderErrorString.String());
|
||||
} else {
|
||||
alertString.SetTo(B_TRANSLATE("Could not open \"%document\" "
|
||||
"(Missing libraries: %library). \n"));
|
||||
alertString.ReplaceFirst("%document", documentRef.name);
|
||||
alertString.ReplaceFirst("%library", loaderErrorString.String());
|
||||
alertString.ReplaceFirst("%library",
|
||||
loaderErrorString.String());
|
||||
}
|
||||
alternative = B_TRANSLATE_NOCOLLECT(kFindAlternativeStr);
|
||||
} else {
|
||||
@@ -3525,14 +3548,15 @@ _TrackerLaunchDocuments(const entry_ref* /*doNotUse*/, const BMessage* refs,
|
||||
ASSERT(alternative);
|
||||
alertString << alternative;
|
||||
BAlert* alert = new BAlert("", alertString.String(),
|
||||
B_TRANSLATE("Cancel"), B_TRANSLATE("Find"), 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), B_TRANSLATE("Find"), 0,
|
||||
B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
if (alert->Go() == 1)
|
||||
error = TrackerOpenWith(refs);
|
||||
} else {
|
||||
BAlert* alert = new BAlert("", alertString.String(),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
}
|
||||
@@ -3841,8 +3865,6 @@ WellKnowEntryList::WellKnowEntryList()
|
||||
AddOne((directory_which)B_USER_QUERIES_DIRECTORY, B_USER_DIRECTORY,
|
||||
"queries", "queries");
|
||||
|
||||
|
||||
|
||||
AddOne(B_COMMON_DEVELOP_DIRECTORY, "develop");
|
||||
AddOne((directory_which)B_USER_DESKBAR_DEVELOP_DIRECTORY,
|
||||
B_USER_DESKBAR_DIRECTORY, "Development", "develop");
|
||||
|
||||
+45
-36
@@ -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;
|
||||
@@ -87,7 +87,7 @@ public:
|
||||
kReplace, // remove entry before copying new one
|
||||
kMerge // for folders: leave existing folder, update
|
||||
// contents leaving nonconflicting items
|
||||
// for files: save original attributes on file.
|
||||
// for files: save original attributes on file
|
||||
};
|
||||
|
||||
//! Override to always overwrite, never overwrite, let user decide,
|
||||
@@ -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;
|
||||
|
||||
@@ -111,7 +111,8 @@ enum recent_type {
|
||||
|
||||
class RecentsMenu : public BNavMenu {
|
||||
public:
|
||||
RecentsMenu(const char* name,int32 which,uint32 what,BHandler* target);
|
||||
RecentsMenu(const char* name, int32 which, uint32 what,
|
||||
BHandler* target);
|
||||
|
||||
void DetachedFromWindow();
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -166,7 +167,8 @@ public:
|
||||
void SetIsDesktop(bool);
|
||||
|
||||
protected:
|
||||
// don't do any volume watching and memtamime watching in file panels for now
|
||||
// don't do any volume watching and memtamime watching in file panels
|
||||
// for now
|
||||
virtual void StartWatching();
|
||||
virtual void StopWatching();
|
||||
|
||||
|
||||
@@ -56,30 +56,41 @@ FilePermissionsView::FilePermissionsView(BRect rect, Model* model)
|
||||
fModel(model)
|
||||
{
|
||||
// Constants for the column labels: "User", "Group" and "Other".
|
||||
const float kColumnLabelMiddle = 77, kColumnLabelTop = 6, kColumnLabelSpacing = 37,
|
||||
kColumnLabelBottom = 20, kColumnLabelWidth = 35, kAttribFontHeight = 10;
|
||||
const float kColumnLabelMiddle = 77, kColumnLabelTop = 6,
|
||||
kColumnLabelSpacing = 37, kColumnLabelBottom = 20,
|
||||
kColumnLabelWidth = 35, kAttribFontHeight = 10;
|
||||
|
||||
BStringView* strView;
|
||||
|
||||
strView = new BStringView(BRect(kColumnLabelMiddle - kColumnLabelWidth / 2,
|
||||
kColumnLabelTop, kColumnLabelMiddle + kColumnLabelWidth / 2, kColumnLabelBottom),
|
||||
strView = new BStringView(
|
||||
BRect(kColumnLabelMiddle - kColumnLabelWidth / 2,
|
||||
kColumnLabelTop,
|
||||
kColumnLabelMiddle + kColumnLabelWidth / 2,
|
||||
kColumnLabelBottom),
|
||||
"", B_TRANSLATE("Owner"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_CENTER);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
|
||||
strView = new BStringView(BRect(kColumnLabelMiddle - kColumnLabelWidth / 2
|
||||
+ kColumnLabelSpacing, kColumnLabelTop,
|
||||
kColumnLabelMiddle + kColumnLabelWidth / 2 + kColumnLabelSpacing,
|
||||
kColumnLabelBottom), "", B_TRANSLATE("Group"));
|
||||
strView = new BStringView(
|
||||
BRect(kColumnLabelMiddle - kColumnLabelWidth / 2
|
||||
+ kColumnLabelSpacing,
|
||||
kColumnLabelTop,
|
||||
kColumnLabelMiddle + kColumnLabelWidth / 2 + kColumnLabelSpacing,
|
||||
kColumnLabelBottom),
|
||||
"", B_TRANSLATE("Group"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_CENTER);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
|
||||
strView = new BStringView(BRect(kColumnLabelMiddle - kColumnLabelWidth / 2
|
||||
+ 2 * kColumnLabelSpacing, kColumnLabelTop,
|
||||
kColumnLabelMiddle + kColumnLabelWidth / 2 + 2 * kColumnLabelSpacing,
|
||||
kColumnLabelBottom), "", B_TRANSLATE("Other"));
|
||||
strView = new BStringView(
|
||||
BRect(kColumnLabelMiddle - kColumnLabelWidth / 2
|
||||
+ 2 * kColumnLabelSpacing,
|
||||
kColumnLabelTop,
|
||||
kColumnLabelMiddle + kColumnLabelWidth / 2
|
||||
+ 2 * kColumnLabelSpacing,
|
||||
kColumnLabelBottom),
|
||||
"", B_TRANSLATE("Other"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_CENTER);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
@@ -89,53 +100,69 @@ FilePermissionsView::FilePermissionsView(BRect rect, Model* model)
|
||||
kRowLabelVerticalSpacing = 18, kRowLabelRight = kColumnLabelMiddle
|
||||
- kColumnLabelWidth / 2 - 5, kRowLabelHeight = 14;
|
||||
|
||||
strView = new BStringView(BRect(kRowLabelLeft, kRowLabelTop, kRowLabelRight,
|
||||
kRowLabelTop + kRowLabelHeight),
|
||||
strView = new BStringView(BRect(kRowLabelLeft, kRowLabelTop,
|
||||
kRowLabelRight, kRowLabelTop + kRowLabelHeight),
|
||||
"", B_TRANSLATE("Read"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_RIGHT);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
|
||||
strView = new BStringView(BRect(kRowLabelLeft, kRowLabelTop
|
||||
+ kRowLabelVerticalSpacing, kRowLabelRight, kRowLabelTop
|
||||
+ kRowLabelVerticalSpacing + kRowLabelHeight),
|
||||
+ kRowLabelVerticalSpacing, kRowLabelRight, kRowLabelTop
|
||||
+ kRowLabelVerticalSpacing + kRowLabelHeight),
|
||||
"", B_TRANSLATE("Write"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_RIGHT);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
|
||||
strView = new BStringView(BRect(kRowLabelLeft, kRowLabelTop
|
||||
+ 2 * kRowLabelVerticalSpacing, kRowLabelRight, kRowLabelTop
|
||||
+ 2 * kRowLabelVerticalSpacing + kRowLabelHeight),
|
||||
+ 2 * kRowLabelVerticalSpacing, kRowLabelRight, kRowLabelTop
|
||||
+ 2 * kRowLabelVerticalSpacing + kRowLabelHeight),
|
||||
"", B_TRANSLATE("Execute"));
|
||||
AddChild(strView);
|
||||
strView->SetAlignment(B_ALIGN_RIGHT);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
|
||||
// Constants for the 3x3 check box array.
|
||||
const float kLeftMargin = kRowLabelRight + 15, kTopMargin = kRowLabelTop - 2,
|
||||
kHorizontalSpacing = kColumnLabelSpacing, kVerticalSpacing = kRowLabelVerticalSpacing,
|
||||
const float kLeftMargin = kRowLabelRight + 15,
|
||||
kTopMargin = kRowLabelTop - 2,
|
||||
kHorizontalSpacing = kColumnLabelSpacing,
|
||||
kVerticalSpacing = kRowLabelVerticalSpacing,
|
||||
kCheckBoxWidth = 18, kCheckBoxHeight = 18;
|
||||
|
||||
FocusCheckBox** checkBoxArray[3][3] = {
|
||||
{ &fReadUserCheckBox, &fReadGroupCheckBox, &fReadOtherCheckBox },
|
||||
{ &fWriteUserCheckBox, &fWriteGroupCheckBox, &fWriteOtherCheckBox },
|
||||
{ &fExecuteUserCheckBox, &fExecuteGroupCheckBox, &fExecuteOtherCheckBox }};
|
||||
{
|
||||
&fReadUserCheckBox,
|
||||
&fReadGroupCheckBox,
|
||||
&fReadOtherCheckBox
|
||||
},
|
||||
{
|
||||
&fWriteUserCheckBox,
|
||||
&fWriteGroupCheckBox,
|
||||
&fWriteOtherCheckBox
|
||||
},
|
||||
{
|
||||
&fExecuteUserCheckBox,
|
||||
&fExecuteGroupCheckBox,
|
||||
&fExecuteOtherCheckBox
|
||||
}
|
||||
};
|
||||
|
||||
for (int32 x = 0; x < 3; x++) {
|
||||
for (int32 y = 0; y < 3; y++) {
|
||||
*checkBoxArray[y][x] =
|
||||
new FocusCheckBox(BRect(kLeftMargin + kHorizontalSpacing * x,
|
||||
kTopMargin + kVerticalSpacing * y,
|
||||
kLeftMargin + kHorizontalSpacing * x + kCheckBoxWidth,
|
||||
kTopMargin + kVerticalSpacing * y + kCheckBoxHeight),
|
||||
"", "", new BMessage(kPermissionsChanged));
|
||||
kTopMargin + kVerticalSpacing * y,
|
||||
kLeftMargin + kHorizontalSpacing * x + kCheckBoxWidth,
|
||||
kTopMargin + kVerticalSpacing * y + kCheckBoxHeight),
|
||||
"", "", new BMessage(kPermissionsChanged));
|
||||
AddChild(*checkBoxArray[y][x]);
|
||||
}
|
||||
}
|
||||
|
||||
const float kTextControlLeft = 170, kTextControlRight = 270,
|
||||
kTextControlTop = kColumnLabelTop, kTextControlHeight = 14, kTextControlSpacing = 16;
|
||||
kTextControlTop = kColumnLabelTop, kTextControlHeight = 14,
|
||||
kTextControlSpacing = 16;
|
||||
|
||||
strView = new BStringView(BRect(kTextControlLeft, kTextControlTop,
|
||||
kTextControlRight, kTextControlTop + kTextControlHeight), "",
|
||||
@@ -144,25 +171,30 @@ FilePermissionsView::FilePermissionsView(BRect rect, Model* model)
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
AddChild(strView);
|
||||
|
||||
fOwnerTextControl = new BTextControl(BRect(kTextControlLeft, kTextControlTop - 2
|
||||
+ kTextControlSpacing, kTextControlRight, kTextControlTop + kTextControlHeight - 2
|
||||
+ kTextControlSpacing), "", "", "", new BMessage(kNewOwnerEntered));
|
||||
fOwnerTextControl = new BTextControl(
|
||||
BRect(kTextControlLeft,
|
||||
kTextControlTop - 2 + kTextControlSpacing,
|
||||
kTextControlRight,
|
||||
kTextControlTop + kTextControlHeight - 2 + kTextControlSpacing),
|
||||
"", "", "", new BMessage(kNewOwnerEntered));
|
||||
fOwnerTextControl->SetDivider(0);
|
||||
AddChild(fOwnerTextControl);
|
||||
|
||||
strView = new BStringView(BRect(kTextControlLeft,
|
||||
kTextControlTop + 5 + 2 * kTextControlSpacing,
|
||||
kTextControlRight,
|
||||
kTextControlTop + 2 + 2 * kTextControlSpacing + kTextControlHeight),
|
||||
kTextControlTop + 5 + 2 * kTextControlSpacing,
|
||||
kTextControlRight,
|
||||
kTextControlTop + 2 + 2 * kTextControlSpacing
|
||||
+ kTextControlHeight),
|
||||
"", B_TRANSLATE("Group"));
|
||||
strView->SetAlignment(B_ALIGN_CENTER);
|
||||
strView->SetFontSize(kAttribFontHeight);
|
||||
AddChild(strView);
|
||||
|
||||
fGroupTextControl = new BTextControl(BRect(kTextControlLeft, kTextControlTop
|
||||
+ 3 * kTextControlSpacing, kTextControlRight, kTextControlTop
|
||||
+ 3 * kTextControlSpacing + kTextControlHeight), "", "", "",
|
||||
new BMessage(kNewGroupEntered));
|
||||
fGroupTextControl = new BTextControl(BRect(kTextControlLeft,
|
||||
kTextControlTop + 3 * kTextControlSpacing,
|
||||
kTextControlRight,
|
||||
kTextControlTop + 3 * kTextControlSpacing + kTextControlHeight),
|
||||
"", "", "", new BMessage(kNewGroupEntered));
|
||||
fGroupTextControl->SetDivider(0);
|
||||
AddChild(fGroupTextControl);
|
||||
|
||||
@@ -277,7 +309,8 @@ FilePermissionsView::MessageReceived(BMessage* message)
|
||||
case kPermissionsChanged:
|
||||
if (fModel != NULL) {
|
||||
mode_t newPermissions = 0;
|
||||
newPermissions = (mode_t)((fReadUserCheckBox->Value() ? S_IRUSR : 0)
|
||||
newPermissions
|
||||
= (mode_t)((fReadUserCheckBox->Value() ? S_IRUSR : 0)
|
||||
| (fReadGroupCheckBox->Value() ? S_IRGRP : 0)
|
||||
| (fReadOtherCheckBox->Value() ? S_IROTH : 0)
|
||||
|
||||
|
||||
+377
-307
File diff suppressed because it is too large
Load Diff
@@ -129,8 +129,8 @@ class FindWindow : public BWindow {
|
||||
{ return fFile; }
|
||||
|
||||
const char* QueryName() const;
|
||||
// reads in the query name from either a saved name in a template or
|
||||
// form a saved query name
|
||||
// reads in the query name from either a saved name in a template
|
||||
// or form a saved query name
|
||||
|
||||
static bool IsQueryTemplate(BNode* file);
|
||||
|
||||
@@ -140,7 +140,8 @@ class FindWindow : public BWindow {
|
||||
private:
|
||||
static BFile* TryOpening(const entry_ref* ref);
|
||||
static void GetDefaultQuery(BEntry &entry);
|
||||
// when opening an empty panel, use the default query to set the panel up
|
||||
// when opening an empty panel, use the default query to set the
|
||||
// panel up
|
||||
void SaveQueryAttributes(BNode* file, bool templateQuery);
|
||||
|
||||
void Find();
|
||||
@@ -242,10 +243,12 @@ class FindPanel : public BView {
|
||||
void RemoveByAttributeItems();
|
||||
void RemoveAttrViewItems();
|
||||
void ShowOrHideMimeTypeMenu();
|
||||
// MimeTypeWindow is only shown in kByNameItem and kByAttributeItem modes
|
||||
// MimeTypeWindow is only shown in kByNameItem and
|
||||
// kByAttributeItem modes
|
||||
|
||||
void ShowOrHideMoreOptions(bool show);
|
||||
// fMode gets set by this and the call relies on it being up-to-date
|
||||
// fMode gets set by this and the call relies on it being
|
||||
// up-to-date
|
||||
static int32 InitialAttrCount(const BNode*);
|
||||
void FillCurrentQueryName(BTextControl*, FindWindow*);
|
||||
void AddByNameOrFormulaItems();
|
||||
@@ -348,7 +351,8 @@ class DeleteTransientQueriesTask {
|
||||
|
||||
class RecentFindItemsMenu : public BMenu {
|
||||
public:
|
||||
RecentFindItemsMenu(const char* title, const BMessenger* target, uint32 what);
|
||||
RecentFindItemsMenu(const char* title, const BMessenger* target,
|
||||
uint32 what);
|
||||
|
||||
protected:
|
||||
virtual void AttachedToWindow();
|
||||
@@ -362,8 +366,9 @@ class RecentFindItemsMenu : public BMenu {
|
||||
class DraggableQueryIcon : public DraggableIcon {
|
||||
// query/query template drag&drop helper
|
||||
public:
|
||||
DraggableQueryIcon(BRect frame, const char* name, const BMessage* message,
|
||||
BMessenger target, uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||
DraggableQueryIcon(BRect frame, const char* name,
|
||||
const BMessage* message, BMessenger target,
|
||||
uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||
uint32 flags = B_WILL_DRAW);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -252,9 +252,11 @@ private:
|
||||
|
||||
|
||||
template <class Result, class Param1, class Param2, class Param3>
|
||||
class ThreeParamFunctionObjectWithResult : public FunctionObjectWithResult<Result> {
|
||||
class ThreeParamFunctionObjectWithResult : public
|
||||
FunctionObjectWithResult<Result> {
|
||||
public:
|
||||
ThreeParamFunctionObjectWithResult(Result (*callThis)(Param1, Param2, Param3),
|
||||
ThreeParamFunctionObjectWithResult(
|
||||
Result (*callThis)(Param1, Param2, Param3),
|
||||
Param1 p1, Param2 p2, Param3 p3)
|
||||
: function(callThis),
|
||||
p1(p1),
|
||||
@@ -300,10 +302,13 @@ private:
|
||||
};
|
||||
|
||||
|
||||
template <class Result, class Param1, class Param2, class Param3, class Param4>
|
||||
class FourParamFunctionObjectWithResult : public FunctionObjectWithResult<Result> {
|
||||
template <class Result, class Param1, class Param2, class Param3,
|
||||
class Param4>
|
||||
class FourParamFunctionObjectWithResult : public
|
||||
FunctionObjectWithResult<Result> {
|
||||
public:
|
||||
FourParamFunctionObjectWithResult(Result (*callThis)(Param1, Param2, Param3, Param4),
|
||||
FourParamFunctionObjectWithResult(
|
||||
Result (*callThis)(Param1, Param2, Param3, Param4),
|
||||
Param1 p1, Param2 p2, Param3 p3, Param4 p4)
|
||||
: function(callThis),
|
||||
p1(p1),
|
||||
@@ -369,7 +374,8 @@ private:
|
||||
|
||||
|
||||
template<class T, class R>
|
||||
class PlainMemberFunctionObjectWithResult : public FunctionObjectWithResult<R> {
|
||||
class PlainMemberFunctionObjectWithResult : public
|
||||
FunctionObjectWithResult<R> {
|
||||
public:
|
||||
PlainMemberFunctionObjectWithResult(R (T::*function)(), T* onThis)
|
||||
: function(function),
|
||||
@@ -390,7 +396,8 @@ private:
|
||||
template<class T, class Param1>
|
||||
class SingleParamMemberFunctionObject : public FunctionObject {
|
||||
public:
|
||||
SingleParamMemberFunctionObject(void (T::*function)(Param1), T* onThis, Param1 p1)
|
||||
SingleParamMemberFunctionObject(void (T::*function)(Param1),
|
||||
T* onThis, Param1 p1)
|
||||
: function(function),
|
||||
target(onThis),
|
||||
p1(p1)
|
||||
@@ -410,8 +417,8 @@ private:
|
||||
template<class T, class Param1, class Param2>
|
||||
class TwoParamMemberFunctionObject : public FunctionObject {
|
||||
public:
|
||||
TwoParamMemberFunctionObject(void (T::*function)(Param1, Param2), T* onThis,
|
||||
Param1 p1, Param2 p2)
|
||||
TwoParamMemberFunctionObject(void (T::*function)(Param1, Param2),
|
||||
T* onThis, Param1 p1, Param2 p2)
|
||||
: function(function),
|
||||
target(onThis),
|
||||
p1(p1),
|
||||
@@ -432,10 +439,11 @@ protected:
|
||||
|
||||
|
||||
template<class T, class R, class Param1>
|
||||
class SingleParamMemberFunctionObjectWithResult : public FunctionObjectWithResult<R> {
|
||||
class SingleParamMemberFunctionObjectWithResult : public
|
||||
FunctionObjectWithResult<R> {
|
||||
public:
|
||||
SingleParamMemberFunctionObjectWithResult(R (T::*function)(Param1), T* onThis,
|
||||
Param1 p1)
|
||||
SingleParamMemberFunctionObjectWithResult(R (T::*function)(Param1),
|
||||
T* onThis, Param1 p1)
|
||||
: function(function),
|
||||
target(onThis),
|
||||
p1(p1)
|
||||
@@ -443,7 +451,8 @@ public:
|
||||
}
|
||||
|
||||
virtual void operator()()
|
||||
{ FunctionObjectWithResult<R>::result = (target->*function)(p1.Pass()); }
|
||||
{ FunctionObjectWithResult<R>::result
|
||||
= (target->*function)(p1.Pass()); }
|
||||
|
||||
protected:
|
||||
R (T::*function)(Param1);
|
||||
@@ -453,10 +462,11 @@ protected:
|
||||
|
||||
|
||||
template<class T, class R, class Param1, class Param2>
|
||||
class TwoParamMemberFunctionObjectWithResult : public FunctionObjectWithResult<R> {
|
||||
class TwoParamMemberFunctionObjectWithResult : public
|
||||
FunctionObjectWithResult<R> {
|
||||
public:
|
||||
TwoParamMemberFunctionObjectWithResult(R (T::*function)(Param1, Param2), T* onThis,
|
||||
Param1 p1, Param2 p2)
|
||||
TwoParamMemberFunctionObjectWithResult(R (T::*function)(Param1, Param2),
|
||||
T* onThis, Param1 p1, Param2 p2)
|
||||
: function(function),
|
||||
target(onThis),
|
||||
p1(p1),
|
||||
@@ -505,7 +515,8 @@ ThreeParamFunctionObject<Param1, Param2, Param3>*
|
||||
NewFunctionObject(void (*function)(Param1, Param2, Param3),
|
||||
Param1 p1, Param2 p2, Param3 p3)
|
||||
{
|
||||
return new ThreeParamFunctionObject<Param1, Param2, Param3>(function, p1, p2, p3);
|
||||
return new ThreeParamFunctionObject<Param1, Param2, Param3>
|
||||
(function, p1, p2, p3);
|
||||
}
|
||||
|
||||
|
||||
@@ -521,7 +532,8 @@ template<class T, class Param1>
|
||||
SingleParamMemberFunctionObject<T, Param1>*
|
||||
NewMemberFunctionObject(void (T::*function)(Param1), T* onThis, Param1 p1)
|
||||
{
|
||||
return new SingleParamMemberFunctionObject<T, Param1>(function, onThis, p1);
|
||||
return new SingleParamMemberFunctionObject<T, Param1>
|
||||
(function, onThis, p1);
|
||||
}
|
||||
|
||||
|
||||
@@ -530,8 +542,8 @@ TwoParamMemberFunctionObject<T, Param1, Param2>*
|
||||
NewMemberFunctionObject(void (T::*function)(Param1, Param2), T* onThis,
|
||||
Param1 p1, Param2 p2)
|
||||
{
|
||||
return new TwoParamMemberFunctionObject<T, Param1, Param2>(function, onThis,
|
||||
p1, p2);
|
||||
return new TwoParamMemberFunctionObject<T, Param1, Param2>
|
||||
(function, onThis, p1, p2);
|
||||
}
|
||||
|
||||
|
||||
@@ -550,7 +562,8 @@ PlainLockingMemberFunctionObject<HandlerOrSubclass>*
|
||||
NewLockingMemberFunctionObject(void (HandlerOrSubclass::*function)(),
|
||||
HandlerOrSubclass* onThis)
|
||||
{
|
||||
return new PlainLockingMemberFunctionObject<HandlerOrSubclass>(function, onThis);
|
||||
return new PlainLockingMemberFunctionObject<HandlerOrSubclass>
|
||||
(function, onThis);
|
||||
}
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,8 @@ class TGroupedMenu : public BMenu {
|
||||
|
||||
private:
|
||||
friend class TMenuItemGroup;
|
||||
void AddGroupItem(TMenuItemGroup* group, BMenuItem* item, int32 atIndex);
|
||||
void AddGroupItem(TMenuItemGroup* group, BMenuItem* item,
|
||||
int32 atIndex);
|
||||
void RemoveGroupItem(TMenuItemGroup* group, BMenuItem* item);
|
||||
|
||||
private:
|
||||
|
||||
+117
-77
@@ -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,
|
||||
@@ -127,7 +128,8 @@ public:
|
||||
~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);
|
||||
|
||||
@@ -52,11 +52,12 @@ const bigtime_t kSynchMenuInvokeTimeout = 5000000;
|
||||
class IconMenuItem : public PositionPassingMenuItem {
|
||||
public:
|
||||
IconMenuItem(const char* label, BMessage* message, BBitmap* icon);
|
||||
IconMenuItem(const char* label, BMessage* message, const char* iconType,
|
||||
icon_size which);
|
||||
IconMenuItem(const char* label, BMessage* message,
|
||||
const char* iconType, icon_size which);
|
||||
IconMenuItem(const char* label, BMessage* message,
|
||||
const BNodeInfo* nodeInfo, icon_size which);
|
||||
IconMenuItem(BMenu*, BMessage*, const char* iconType, icon_size which);
|
||||
IconMenuItem(BMenu*, BMessage*, const char* iconType,
|
||||
icon_size which);
|
||||
virtual ~IconMenuItem();
|
||||
|
||||
virtual void GetContentSize(float* width, float* height);
|
||||
@@ -72,9 +73,11 @@ class IconMenuItem : public PositionPassingMenuItem {
|
||||
|
||||
class ModelMenuItem : public BMenuItem {
|
||||
public:
|
||||
ModelMenuItem(const Model*, const char* title, BMessage*, char shortcut = '\0',
|
||||
uint32 modifiers = 0, bool drawText = true, bool extraPad = false);
|
||||
ModelMenuItem(const Model*, BMenu*, bool drawText = true, bool extraPad = false);
|
||||
ModelMenuItem(const Model*, const char* title, BMessage*,
|
||||
char shortcut = '\0', uint32 modifiers = 0,
|
||||
bool drawText = true, bool extraPad = false);
|
||||
ModelMenuItem(const Model*, BMenu*, bool drawText = true,
|
||||
bool extraPad = false);
|
||||
virtual ~ModelMenuItem();
|
||||
|
||||
virtual status_t SetEntry(const BEntry*);
|
||||
|
||||
+166
-92
@@ -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)
|
||||
{
|
||||
|
||||
@@ -55,7 +55,8 @@ class AttributeView;
|
||||
|
||||
class BInfoWindow : public BWindow {
|
||||
public:
|
||||
BInfoWindow(Model*, int32 groupIndex, LockingList<BWindow>* list = NULL);
|
||||
BInfoWindow(Model*, int32 groupIndex,
|
||||
LockingList<BWindow>* list = NULL);
|
||||
~BInfoWindow();
|
||||
|
||||
virtual bool IsShowing(const node_ref*) const;
|
||||
@@ -64,7 +65,8 @@ class BInfoWindow : public BWindow {
|
||||
bool StopCalc();
|
||||
void OpenFilePanel(const entry_ref*);
|
||||
|
||||
static void GetSizeString(BString &result, off_t size, int32 fileCount);
|
||||
static void GetSizeString(BString &result, off_t size,
|
||||
int32 fileCount);
|
||||
|
||||
protected:
|
||||
virtual void Quit();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
+52
-36
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+22
-16
@@ -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;
|
||||
|
||||
@@ -102,7 +102,8 @@ 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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+57
-34
@@ -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;
|
||||
|
||||
+22
-15
@@ -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;
|
||||
@@ -2151,6 +2171,12 @@ BPoseView::MessageReceived(BMessage* message)
|
||||
case 64:
|
||||
fViewState->SetIconSize(48);
|
||||
break;
|
||||
case 96:
|
||||
fViewState->SetIconSize(64);
|
||||
break;
|
||||
case 128:
|
||||
fViewState->SetIconSize(96);
|
||||
break;
|
||||
}
|
||||
} else if (scale == 1 && (int32)IconSizeInt() != 128) {
|
||||
switch ((int32)IconSizeInt()) {
|
||||
@@ -2163,11 +2189,17 @@ BPoseView::MessageReceived(BMessage* message)
|
||||
case 48:
|
||||
fViewState->SetIconSize(64);
|
||||
break;
|
||||
case 64:
|
||||
fViewState->SetIconSize(96);
|
||||
break;
|
||||
case 96:
|
||||
fViewState->SetIconSize(128);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int32 iconSize = fViewState->LastIconSize();
|
||||
if (iconSize < 32 || iconSize > 64) {
|
||||
if (iconSize < 32 || iconSize > 128) {
|
||||
// uninitialized last icon size?
|
||||
iconSize = 32;
|
||||
}
|
||||
@@ -6881,8 +6913,7 @@ BPoseView::MouseDown(BPoint where)
|
||||
uint32 buttons = (uint32)window->CurrentMessage()->FindInt32("buttons");
|
||||
uint32 modifs = modifiers();
|
||||
|
||||
if (buttons == B_SECONDARY_MOUSE_BUTTON)
|
||||
fTrackRightMouseUp = true;
|
||||
fTrackRightMouseUp = (buttons == B_SECONDARY_MOUSE_BUTTON);
|
||||
|
||||
bool extendSelection = (modifs & B_COMMAND_KEY) && fMultipleSelection;
|
||||
|
||||
@@ -6893,7 +6924,7 @@ BPoseView::MouseDown(BPoint where)
|
||||
if (pose) {
|
||||
AddRemoveSelectionRange(where, extendSelection, pose);
|
||||
|
||||
if (!extendSelection && WasDoubleClick(pose, where)) {
|
||||
if (!extendSelection && !fTrackRightMouseUp && WasDoubleClick(pose, where)) {
|
||||
// special handling for Path field double-clicks
|
||||
if (!WasClickInPath(pose, index, where))
|
||||
OpenSelection(pose, &index);
|
||||
|
||||
+156
-73
@@ -104,7 +104,8 @@ const uint32 kCheckTypeahead = 'Tcty';
|
||||
|
||||
class BPoseView : public BView {
|
||||
public:
|
||||
BPoseView(Model*, BRect, uint32 viewMode, uint32 resizeMask = B_FOLLOW_ALL);
|
||||
BPoseView(Model*, BRect, uint32 viewMode,
|
||||
uint32 resizeMask = B_FOLLOW_ALL);
|
||||
virtual ~BPoseView();
|
||||
|
||||
// setup, teardown
|
||||
@@ -113,8 +114,8 @@ class BPoseView : public BView {
|
||||
void InitCommon();
|
||||
virtual void DetachedFromWindow();
|
||||
|
||||
// Returns true if for instance, node ref is a remote desktop directory and
|
||||
// this is a desktop pose view.
|
||||
// Returns true if for instance, node ref is a remote desktop
|
||||
// directory and this is a desktop pose view.
|
||||
virtual bool Represents(const node_ref*) const;
|
||||
virtual bool Represents(const entry_ref*) const;
|
||||
|
||||
@@ -151,9 +152,9 @@ class BPoseView : public BView {
|
||||
virtual void SwitchDir(const entry_ref*,
|
||||
AttributeStreamNode* node = NULL);
|
||||
|
||||
// in the rare cases where a pose view needs to be explicitly refreshed
|
||||
// (for instance in a query window with a dynamic date query), this is
|
||||
// used
|
||||
// in the rare cases where a pose view needs to be explicitly
|
||||
// refreshed (for instance in a query window with a dynamic
|
||||
// date query), this is used
|
||||
virtual void Refresh();
|
||||
|
||||
// callbacks
|
||||
@@ -228,7 +229,8 @@ class BPoseView : public BView {
|
||||
icon_size IconSize() const;
|
||||
|
||||
BRect Extent() const;
|
||||
void GetLayoutInfo(uint32 viewMode, BPoint* grid, BPoint* offset) const;
|
||||
void GetLayoutInfo(uint32 viewMode, BPoint* grid,
|
||||
BPoint* offset) const;
|
||||
|
||||
int32 CountItems() const;
|
||||
void UpdateCount();
|
||||
@@ -250,8 +252,8 @@ class BPoseView : public BView {
|
||||
BPoint ResizeColumn(BColumn*, float, float* lastLineDrawPos = NULL,
|
||||
void (*drawLineFunc)(BPoseView*, BPoint, BPoint) = 0,
|
||||
void (*undrawLineFunc)(BPoseView*, BPoint, BPoint) = 0);
|
||||
// returns the bottom right of the last pose drawn or bottom right of
|
||||
// bounds
|
||||
// returns the bottom right of the last pose drawn or
|
||||
// the bottom right of bounds
|
||||
|
||||
BColumn* ColumnAt(int32 index) const;
|
||||
BColumn* ColumnFor(uint32 attribute_hash) const;
|
||||
@@ -265,14 +267,16 @@ class BPoseView : public BView {
|
||||
BPose* PoseAtIndex(int32 index) const;
|
||||
|
||||
BPose* FindPose(BPoint where, int32* index = NULL) const;
|
||||
// return pose at location h, v (search list starting from bottom so
|
||||
// drawing and hit detection reflect the same pose ordering)
|
||||
// return pose at location h, v (search list starting from
|
||||
// bottom so drawing and hit detection reflect the same pose
|
||||
// ordering)
|
||||
BPose* FindPose(const Model*, int32* index = NULL) const;
|
||||
BPose* FindPose(const node_ref*, int32* index = NULL) const;
|
||||
BPose* FindPose(const entry_ref*, int32* index = NULL) const;
|
||||
BPose* FindPose(const entry_ref*, int32 specifierForm, int32* index) const;
|
||||
// special form of FindPose used for scripting, <specifierForm> may
|
||||
// ask for previous or next pose
|
||||
BPose* FindPose(const entry_ref*, int32 specifierForm,
|
||||
int32* index) const;
|
||||
// special form of FindPose used for scripting,
|
||||
// <specifierForm> may ask for previous or next pose
|
||||
BPose* DeepFindPose(const node_ref* node, int32* index = NULL) const;
|
||||
// same as FindPose, node can be a target of the actual
|
||||
// pose if the pose is a symlink
|
||||
@@ -284,17 +288,22 @@ class BPoseView : public BView {
|
||||
void UnmountSelectedVolumes();
|
||||
virtual void OpenParent();
|
||||
|
||||
virtual void OpenSelection(BPose* clicked_pose = NULL, int32* index = NULL);
|
||||
void OpenSelectionUsing(BPose* clicked_pose = NULL, int32* index = NULL);
|
||||
virtual void OpenSelection(BPose* clicked_pose = NULL,
|
||||
int32* index = NULL);
|
||||
void OpenSelectionUsing(BPose* clicked_pose = NULL,
|
||||
int32* index = NULL);
|
||||
// launches the open with window
|
||||
virtual void MoveSelectionTo(BPoint, BPoint, BContainerWindow*);
|
||||
void DuplicateSelection(BPoint* dropStart = NULL, BPoint* dropEnd = NULL);
|
||||
void DuplicateSelection(BPoint* dropStart = NULL,
|
||||
BPoint* dropEnd = NULL);
|
||||
|
||||
// Move to trash calls try to select the next pose in the view when they
|
||||
// are dones
|
||||
// Move to trash calls try to select the next pose in the view
|
||||
// when they are dones
|
||||
virtual void MoveSelectionToTrash(bool selectNext = true);
|
||||
virtual void DeleteSelection(bool selectNext = true, bool askUser = true);
|
||||
virtual void MoveEntryToTrash(const entry_ref*, bool selectNext = true);
|
||||
virtual void DeleteSelection(bool selectNext = true,
|
||||
bool askUser = true);
|
||||
virtual void MoveEntryToTrash(const entry_ref*,
|
||||
bool selectNext = true);
|
||||
|
||||
void RestoreSelectionFromTrash(bool selectNext = true);
|
||||
|
||||
@@ -306,7 +315,8 @@ class BPoseView : public BView {
|
||||
void ShowSelectionWindow();
|
||||
void ClearSelection();
|
||||
void ShowSelection(bool);
|
||||
void AddRemovePoseFromSelection(BPose* pose, int32 index, bool select);
|
||||
void AddRemovePoseFromSelection(BPose* pose, int32 index,
|
||||
bool select);
|
||||
|
||||
BLooper* SelectionHandler();
|
||||
void SetSelectionHandler(BLooper*);
|
||||
@@ -339,7 +349,8 @@ class BPoseView : public BView {
|
||||
inline bool HasPosesInClipboard();
|
||||
inline void SetHasPosesInClipboard(bool hasPoses);
|
||||
void SetPosesClipboardMode(uint32 clipboardMode);
|
||||
void UpdatePosesClipboardModeFromClipboard(BMessage* clipboardReport = NULL);
|
||||
void UpdatePosesClipboardModeFromClipboard(
|
||||
BMessage* clipboardReport = NULL);
|
||||
|
||||
// filtering
|
||||
void SetRefFilter(BRefFilter*);
|
||||
@@ -353,21 +364,25 @@ class BPoseView : public BView {
|
||||
|
||||
// drag&drop handling
|
||||
virtual bool HandleMessageDropped(BMessage*);
|
||||
static bool HandleDropCommon(BMessage* dragMessage, Model* target, BPose*,
|
||||
BView* view, BPoint dropPt);
|
||||
static bool HandleDropCommon(BMessage* dragMessage, Model* target,
|
||||
BPose*, BView* view, BPoint dropPt);
|
||||
// used by pose views and info windows
|
||||
static bool CanHandleDragSelection(const Model* target,
|
||||
const BMessage* dragMessage, bool ignoreTypes);
|
||||
virtual void DragSelectedPoses(const BPose* clickedPose, BPoint);
|
||||
|
||||
void MoveSelectionInto(Model* destFolder, BContainerWindow* srcWindow,
|
||||
bool forceCopy, bool forceMove = false, bool createLink = false, bool relativeLink = false);
|
||||
static void MoveSelectionInto(Model* destFolder, BContainerWindow* srcWindow,
|
||||
BContainerWindow* destWindow, uint32 buttons, BPoint loc,
|
||||
bool forceCopy, bool forceMove = false, bool createLink = false, bool relativeLink = false,
|
||||
BPoint clickPt = BPoint(0, 0), bool pinToGrid = false);
|
||||
bool forceCopy, bool forceMove = false, bool createLink = false,
|
||||
bool relativeLink = false);
|
||||
static void MoveSelectionInto(Model* destFolder,
|
||||
BContainerWindow* srcWindow, BContainerWindow* destWindow,
|
||||
uint32 buttons, BPoint loc, bool forceCopy,
|
||||
bool forceMove = false, bool createLink = false,
|
||||
bool relativeLink = false, BPoint clickPt = BPoint(0, 0),
|
||||
bool pinToGrid = false);
|
||||
|
||||
bool UpdateDropTarget(BPoint, const BMessage*, bool trackingContextMenu);
|
||||
bool UpdateDropTarget(BPoint, const BMessage*,
|
||||
bool trackingContextMenu);
|
||||
// return true if drop target changed
|
||||
void HiliteDropTarget(bool hiliteState);
|
||||
|
||||
@@ -390,7 +405,8 @@ class BPoseView : public BView {
|
||||
// easy to have the right StringWidth picked up by
|
||||
// template instantiation, as used by WidgetAttributeText
|
||||
|
||||
// show/hide barberpole while a background task is filling up the view, etc.
|
||||
// show/hide barberpole while a background task is filling
|
||||
// up the view, etc.
|
||||
void ShowBarberPole();
|
||||
void HideBarberPole();
|
||||
|
||||
@@ -423,7 +439,8 @@ class BPoseView : public BView {
|
||||
// create a new folder, optionally specify a location
|
||||
|
||||
void NewFileFromTemplate(const BMessage*);
|
||||
// create a new file based on a template, optionally specify a location
|
||||
// create a new file based on a template, optionally specify
|
||||
// a location
|
||||
|
||||
void ShowContextMenu(BPoint);
|
||||
|
||||
@@ -434,7 +451,8 @@ class BPoseView : public BView {
|
||||
bool GetProperty(BMessage*, int32, const char*, BMessage*);
|
||||
bool CreateProperty(BMessage* message, BMessage* specifier, int32,
|
||||
const char*, BMessage* reply);
|
||||
bool ExecuteProperty(BMessage* specifier, int32, const char*, BMessage* reply);
|
||||
bool ExecuteProperty(BMessage* specifier, int32, const char*,
|
||||
BMessage* reply);
|
||||
bool CountProperty(BMessage*, int32, const char*, BMessage*);
|
||||
bool DeleteProperty(BMessage*, int32, const char*, BMessage*);
|
||||
|
||||
@@ -448,16 +466,18 @@ class BPoseView : public BView {
|
||||
void _CheckPoseSortOrder(PoseList* list, BPose*, int32 index);
|
||||
|
||||
// pose creation
|
||||
BPose* EntryCreated(const node_ref*, const node_ref*, const char*, int32* index = 0);
|
||||
BPose* EntryCreated(const node_ref*, const node_ref*, const char*,
|
||||
int32* index = 0);
|
||||
|
||||
void AddPoseToList(PoseList* list, bool visibleList, bool insertionSort,
|
||||
BPose* pose, BRect&viewBounds, float&listViewScrollBy,
|
||||
bool forceDraw, int32* indexPtr = NULL);
|
||||
void AddPoseToList(PoseList* list, bool visibleList,
|
||||
bool insertionSort, BPose* pose, BRect&viewBounds,
|
||||
float& listViewScrollBy, bool forceDraw, int32* indexPtr = NULL);
|
||||
BPose* CreatePose(Model*, PoseInfo*, bool insertionSort = true,
|
||||
int32* index = 0, BRect* boundsPtr = 0, bool forceDraw = true);
|
||||
virtual void CreatePoses(Model**models, PoseInfo* poseInfoArray, int32 count,
|
||||
BPose**resultingPoses, bool insertionSort = true, int32* lastPoseIndexPtr = 0,
|
||||
BRect* boundsPtr = 0, bool forceDraw = false);
|
||||
virtual void CreatePoses(Model**models, PoseInfo* poseInfoArray,
|
||||
int32 count, BPose** resultingPoses, bool insertionSort = true,
|
||||
int32* lastPoseIndexPtr = 0, BRect* boundsPtr = 0,
|
||||
bool forceDraw = false);
|
||||
virtual bool ShouldShowPose(const Model*, const PoseInfo*);
|
||||
// filter, subclasses override to control which poses show up
|
||||
// subclasses should always call inherited
|
||||
@@ -468,28 +488,29 @@ class BPoseView : public BView {
|
||||
virtual bool AddPosesThreadValid(const entry_ref*) const;
|
||||
// verifies whether or not the current set of AddPoses threads
|
||||
// are valid and allowed to be adding poses -- returns false
|
||||
// in the case where the directory has been switched while populating
|
||||
// the view
|
||||
// in the case where the directory has been switched while
|
||||
// populating the view
|
||||
|
||||
virtual void AddPoses(Model* model = NULL);
|
||||
// if <model> is zero, PoseView has other means of iterating through all
|
||||
// the entries thaat it adds
|
||||
// if <model> is zero, PoseView has other means of iterating
|
||||
// through all the entries thaat it adds
|
||||
|
||||
virtual void AddRootPoses(bool watchIndividually, bool mountShared);
|
||||
// watchIndividually is used when placing a volume pose onto the Desktop
|
||||
// where unlike in the Root window it will not be watched by the folder
|
||||
// representing root. If set, each volume will therefore be watched
|
||||
// individually
|
||||
// watchIndividually is used when placing a volume pose onto
|
||||
// the Desktop where unlike in the Root window it will not be
|
||||
// watched by the folder representing root. If set, each volume
|
||||
// will therefore be watched individually
|
||||
virtual void RemoveRootPoses();
|
||||
virtual void AddTrashPoses();
|
||||
|
||||
virtual bool DeletePose(const node_ref*, BPose* pose = NULL, int32 index = 0);
|
||||
virtual void DeleteSymLinkPoseTarget(const node_ref* itemNode, BPose* pose,
|
||||
int32 index);
|
||||
virtual bool DeletePose(const node_ref*, BPose* pose = NULL,
|
||||
int32 index = 0);
|
||||
virtual void DeleteSymLinkPoseTarget(const node_ref* itemNode,
|
||||
BPose* pose, int32 index);
|
||||
// the pose itself wasn't deleted but it's target node was - the
|
||||
// pose must be a symlink
|
||||
static void PoseHandleDeviceUnmounted(BPose* pose, Model* model, int32 index,
|
||||
BPoseView* poseView, dev_t device);
|
||||
static void PoseHandleDeviceUnmounted(BPose* pose, Model* model,
|
||||
int32 index, BPoseView* poseView, dev_t device);
|
||||
static void RemoveNonBootDesktopModels(BPose*, Model* model, int32,
|
||||
BPoseView* poseView, dev_t);
|
||||
|
||||
@@ -497,7 +518,8 @@ class BPoseView : public BView {
|
||||
void CheckAutoPlacedPoses();
|
||||
// find poses that need placing and place them in a new spot
|
||||
void PlacePose(BPose*, BRect&);
|
||||
// find a new place for a pose, starting at fHintLocation and place it
|
||||
// find a new place for a pose, starting at fHintLocation
|
||||
// and place it
|
||||
bool IsValidLocation(const BPose* pose);
|
||||
bool IsValidLocation(const BRect& rect);
|
||||
status_t GetDeskbarFrame(BRect* frame);
|
||||
@@ -539,14 +561,15 @@ class BPoseView : public BView {
|
||||
virtual void StopWatching();
|
||||
|
||||
status_t WatchNewNode(const node_ref* item);
|
||||
// the above would ideally be the only call of these three and it would
|
||||
// be a virtual, overriding the specific watch mask in query pose view, etc.
|
||||
// however we need to call WatchNewNode from inside AddPosesTask while
|
||||
// the window is unlocked - we have to use the static and a cached
|
||||
// messenger and masks.
|
||||
// the above would ideally be the only call of these three and
|
||||
// it would be a virtual, overriding the specific watch mask in
|
||||
// query pose view, etc. however we need to call WatchNewNode
|
||||
// from inside AddPosesTask while the window is unlocked - we
|
||||
// have to use the static and a cached messenger and masks.
|
||||
static status_t WatchNewNode(const node_ref*, uint32, BMessenger);
|
||||
virtual uint32 WatchNewNodeMask();
|
||||
// override to change different watch modes for query pose view, etc.
|
||||
// override to change different watch modes for query pose
|
||||
// view, etc.
|
||||
|
||||
// drag&drop handling
|
||||
static bool EachItemInDraggedSelection(const BMessage* message,
|
||||
@@ -556,21 +579,25 @@ class BPoseView : public BView {
|
||||
// window of the current drag message; locks the window
|
||||
// add const version
|
||||
BRect GetDragRect(int32 clickedPoseIndex);
|
||||
BBitmap* MakeDragBitmap(BRect dragRect, BPoint clickedPoint, int32 clickedPoseIndex, BPoint&offset);
|
||||
static bool FindDragNDropAction(const BMessage* dragMessage, bool&canCopy,
|
||||
bool&canMove, bool&canLink, bool&canErase);
|
||||
BBitmap* MakeDragBitmap(BRect dragRect, BPoint clickedPoint,
|
||||
int32 clickedPoseIndex, BPoint&offset);
|
||||
static bool FindDragNDropAction(const BMessage* dragMessage,
|
||||
bool&canCopy, bool&canMove, bool&canLink, bool&canErase);
|
||||
|
||||
static bool CanTrashForeignDrag(const Model*);
|
||||
static bool CanCopyOrMoveForeignDrag(const Model*, const BMessage*);
|
||||
static bool DragSelectionContains(const BPose* target, const BMessage* dragMessage);
|
||||
static bool DragSelectionContains(const BPose* target,
|
||||
const BMessage* dragMessage);
|
||||
static status_t CreateClippingFile(BPoseView* poseView, BFile&result,
|
||||
char* resultingName, BDirectory* dir, BMessage* message, const char* fallbackName,
|
||||
bool setLocation = false, BPoint dropPoint = BPoint(0, 0));
|
||||
char* resultingName, BDirectory* dir, BMessage* message,
|
||||
const char* fallbackName, bool setLocation = false,
|
||||
BPoint dropPoint = BPoint(0, 0));
|
||||
|
||||
// opening files, lanunching
|
||||
void OpenSelectionCommon(BPose*, int32*, bool);
|
||||
// used by OpenSelection and OpenSelectionUsing
|
||||
static void LaunchAppWithSelection(Model*, const BMessage*, bool checkTypes = true);
|
||||
static void LaunchAppWithSelection(Model*, const BMessage*,
|
||||
bool checkTypes = true);
|
||||
|
||||
// node monitoring calls
|
||||
virtual bool EntryMoved(const BMessage*);
|
||||
@@ -585,7 +612,8 @@ class BPoseView : public BView {
|
||||
// selection
|
||||
void SelectPosesListMode(BRect, BList**);
|
||||
void SelectPosesIconMode(BRect, BList**);
|
||||
void AddRemoveSelectionRange(BPoint where, bool extendSelection, BPose*);
|
||||
void AddRemoveSelectionRange(BPoint where, bool extendSelection,
|
||||
BPose*);
|
||||
|
||||
void _BeginSelectionRect(const BPoint& point, bool extendSelection);
|
||||
void _UpdateSelectionRect(const BPoint& point);
|
||||
@@ -637,10 +665,11 @@ class BPoseView : public BView {
|
||||
PoseList* CurrentPoseList() const;
|
||||
|
||||
// misc
|
||||
BList* GetDropPointList(BPoint dropPoint, BPoint startPoint, const PoseList*,
|
||||
bool sourceInListMode, bool dropOnGrid) const;
|
||||
BList* GetDropPointList(BPoint dropPoint, BPoint startPoint,
|
||||
const PoseList*, bool sourceInListMode, bool dropOnGrid) const;
|
||||
void SendSelectionAsRefs(uint32 what, bool onlyQueries = false);
|
||||
void MoveListToTrash(BObjectList<entry_ref>*, bool selectNext, bool deleteDirectly);
|
||||
void MoveListToTrash(BObjectList<entry_ref>*, bool selectNext,
|
||||
bool deleteDirectly);
|
||||
void Delete(BObjectList<entry_ref>*, bool selectNext, bool askUser);
|
||||
void Delete(const entry_ref&ref, bool selectNext, bool askUser);
|
||||
void RestoreItemsFromTrash(BObjectList<entry_ref>*, bool selectNext);
|
||||
@@ -779,226 +808,265 @@ class TPoseViewFilter : public BMessageFilter {
|
||||
|
||||
|
||||
extern bool
|
||||
ClearViewOriginOne(const char* name, uint32 type, off_t size, void* data, void* params);
|
||||
ClearViewOriginOne(const char* name, uint32 type, off_t size, void* data,
|
||||
void* params);
|
||||
|
||||
|
||||
// inlines follow
|
||||
|
||||
|
||||
inline BContainerWindow*
|
||||
BPoseView::ContainerWindow() const
|
||||
{
|
||||
return dynamic_cast<BContainerWindow*>(Window());
|
||||
}
|
||||
|
||||
|
||||
inline Model*
|
||||
BPoseView::TargetModel() const
|
||||
{
|
||||
return fModel;
|
||||
}
|
||||
|
||||
|
||||
inline float
|
||||
BPoseView::ListElemHeight() const
|
||||
{
|
||||
return fListElemHeight;
|
||||
}
|
||||
|
||||
|
||||
inline float
|
||||
BPoseView::IconPoseHeight() const
|
||||
{
|
||||
return fIconPoseHeight;
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::IconSizeInt() const
|
||||
{
|
||||
return fViewState->IconSize();
|
||||
}
|
||||
|
||||
|
||||
inline icon_size
|
||||
BPoseView::IconSize() const
|
||||
{
|
||||
return (icon_size)fViewState->IconSize();
|
||||
}
|
||||
|
||||
|
||||
inline PoseList*
|
||||
BPoseView::SelectionList() const
|
||||
{
|
||||
return fSelectionList;
|
||||
}
|
||||
|
||||
|
||||
inline BObjectList<BString>*
|
||||
BPoseView::MimeTypesInSelection()
|
||||
{
|
||||
return&fMimeTypesInSelectionCache;
|
||||
}
|
||||
|
||||
|
||||
inline BHScrollBar*
|
||||
BPoseView::HScrollBar() const
|
||||
{
|
||||
return fHScrollBar;
|
||||
}
|
||||
|
||||
|
||||
inline BScrollBar*
|
||||
BPoseView::VScrollBar() const
|
||||
{
|
||||
return fVScrollBar;
|
||||
}
|
||||
|
||||
|
||||
inline BCountView*
|
||||
BPoseView::CountView() const
|
||||
{
|
||||
return fCountView;
|
||||
}
|
||||
|
||||
|
||||
inline bool
|
||||
BPoseView::StateNeedsSaving()
|
||||
{
|
||||
return fStateNeedsSaving || fViewState->StateNeedsSaving();
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::ViewMode() const
|
||||
{
|
||||
return fViewState->ViewMode();
|
||||
}
|
||||
|
||||
|
||||
inline font_height
|
||||
BPoseView::FontInfo() const
|
||||
{
|
||||
return sFontInfo;
|
||||
}
|
||||
|
||||
|
||||
inline float
|
||||
BPoseView::FontHeight() const
|
||||
{
|
||||
return sFontHeight;
|
||||
}
|
||||
|
||||
|
||||
inline BPose*
|
||||
BPoseView::ActivePose() const
|
||||
{
|
||||
return fActivePose;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::DisableSaveLocation()
|
||||
{
|
||||
fSavePoseLocations = false;
|
||||
}
|
||||
|
||||
|
||||
inline bool
|
||||
BPoseView::IsFilePanel() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
inline bool
|
||||
BPoseView::IsDesktopWindow() const
|
||||
{
|
||||
return fIsDesktopWindow;
|
||||
}
|
||||
|
||||
|
||||
inline bool
|
||||
BPoseView::IsDesktopView() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::PrimarySort() const
|
||||
{
|
||||
return fViewState->PrimarySort();
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::PrimarySortType() const
|
||||
{
|
||||
return fViewState->PrimarySortType();
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::SecondarySort() const
|
||||
{
|
||||
return fViewState->SecondarySort();
|
||||
}
|
||||
|
||||
|
||||
inline uint32
|
||||
BPoseView::SecondarySortType() const
|
||||
{
|
||||
return fViewState->SecondarySortType();
|
||||
}
|
||||
|
||||
|
||||
inline bool
|
||||
BPoseView::ReverseSort() const
|
||||
{
|
||||
return fViewState->ReverseSort();
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetShowHideSelection(bool on)
|
||||
{
|
||||
fShowHideSelection = on;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetIconMapping(bool on)
|
||||
{
|
||||
fOkToMapIcons = on;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::AddToExtent(const BRect&rect)
|
||||
{
|
||||
fExtent = fExtent | rect;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::ClearExtent()
|
||||
{
|
||||
fExtent.Set(LONG_MAX, LONG_MAX, LONG_MIN, LONG_MIN);
|
||||
}
|
||||
|
||||
|
||||
inline int32
|
||||
BPoseView::CountColumns() const
|
||||
{
|
||||
return fColumnList->CountItems();
|
||||
}
|
||||
|
||||
|
||||
inline int32
|
||||
BPoseView::IndexOfColumn(const BColumn* column) const
|
||||
{
|
||||
return fColumnList->IndexOf(const_cast<BColumn*>(column));
|
||||
}
|
||||
|
||||
|
||||
inline int32
|
||||
BPoseView::IndexOfPose(const BPose* pose) const
|
||||
{
|
||||
return CurrentPoseList()->IndexOf(pose);
|
||||
}
|
||||
|
||||
|
||||
inline BPose*
|
||||
BPoseView::PoseAtIndex(int32 index) const
|
||||
{
|
||||
return CurrentPoseList()->ItemAt(index);
|
||||
}
|
||||
|
||||
|
||||
inline BColumn*
|
||||
BPoseView::ColumnAt(int32 index) const
|
||||
{
|
||||
return fColumnList->ItemAt(index);
|
||||
}
|
||||
|
||||
|
||||
inline BColumn*
|
||||
BPoseView::FirstColumn() const
|
||||
{
|
||||
return fColumnList->FirstItem();
|
||||
}
|
||||
|
||||
|
||||
inline BColumn*
|
||||
BPoseView::LastColumn() const
|
||||
{
|
||||
return fColumnList->LastItem();
|
||||
}
|
||||
|
||||
|
||||
inline int32
|
||||
BPoseView::CountItems() const
|
||||
{
|
||||
@@ -1012,90 +1080,105 @@ BPoseView::SetMultipleSelection(bool state)
|
||||
fMultipleSelection = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetSelectionChangedHook(bool state)
|
||||
{
|
||||
fSelectionChangedHook = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetAutoScroll(bool state)
|
||||
{
|
||||
fShouldAutoScroll = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetPoseEditing(bool state)
|
||||
{
|
||||
fAllowPoseEditing = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetDragEnabled(bool state)
|
||||
{
|
||||
fDragEnabled = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetDropEnabled(bool state)
|
||||
{
|
||||
fDropEnabled = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetSelectionRectEnabled(bool state)
|
||||
{
|
||||
fSelectionRectEnabled = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetAlwaysAutoPlace(bool state)
|
||||
{
|
||||
fAlwaysAutoPlace = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetEnsurePosesVisible(bool state)
|
||||
{
|
||||
fEnsurePosesVisible = state;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetSelectionHandler(BLooper* looper)
|
||||
{
|
||||
fSelectionHandler = looper;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BPoseView::SetRefFilter(BRefFilter* filter)
|
||||
{
|
||||
fRefFilter = filter;
|
||||
}
|
||||
|
||||
|
||||
inline BRefFilter*
|
||||
BPoseView::RefFilter() const
|
||||
{
|
||||
return fRefFilter;
|
||||
}
|
||||
|
||||
|
||||
inline void
|
||||
BHScrollBar::SetTitleView(BView* view)
|
||||
{
|
||||
fTitleView = view;
|
||||
}
|
||||
|
||||
|
||||
inline BPose*
|
||||
BPoseView::FindPose(const Model* model, int32* index) const
|
||||
{
|
||||
return CurrentPoseList()->FindPose(model, index);
|
||||
}
|
||||
|
||||
|
||||
inline BPose*
|
||||
BPoseView::FindPose(const node_ref* node, int32* index) const
|
||||
{
|
||||
return CurrentPoseList()->FindPose(node, index);
|
||||
}
|
||||
|
||||
|
||||
inline BPose*
|
||||
BPoseView::FindPose(const entry_ref* entry, int32* index) const
|
||||
{
|
||||
|
||||
@@ -63,12 +63,12 @@ All rights reserved.
|
||||
// and previous/next specifiers the current PoseView sort order is used.
|
||||
// If PoseView is not in list view mode, the order in which poses are indexed
|
||||
// is arbitrary.
|
||||
// Both of these specifiers, but indices more so, are likely to be accurate only
|
||||
// till a next change to the PoseView (a change may be adding, removing a pose, changing
|
||||
// an attribute or stat resulting in a sort ordering change, changing the sort ordering
|
||||
// rule. When getting a selected item, there is no guarantee that the item will still
|
||||
// be selected after the operation. The client must be able to deal with these
|
||||
// inaccuracies.
|
||||
// Both of these specifiers, but indices more so, are likely to be accurate
|
||||
// only untill a next change to the PoseView (a change may be adding,
|
||||
// removing a pose, changing an attribute or stat resulting in a sort ordering
|
||||
// change, changing the sort ordering rule. When getting a selected item,
|
||||
// there is no guarantee that the item will still be selected after the
|
||||
// operation. The client must be able to deal with these inaccuracies.
|
||||
// Specifying an index/entry_ref that no longer exists will be handled well.
|
||||
|
||||
#if 0
|
||||
@@ -128,7 +128,8 @@ const property_info kPosesPropertyList[] = {
|
||||
},
|
||||
{ kPropertyEntry,
|
||||
{ B_GET_PROPERTY },
|
||||
{ B_DIRECT_SPECIFIER, B_INDEX_SPECIFIER, kPreviousSpecifier, kNextSpecifier },
|
||||
{ B_DIRECT_SPECIFIER, B_INDEX_SPECIFIER, kPreviousSpecifier,
|
||||
kNextSpecifier },
|
||||
"get Entry [next|previous|index] # returns specified entries",
|
||||
0,
|
||||
{ B_REF_TYPE },
|
||||
@@ -156,7 +157,8 @@ const property_info kPosesPropertyList[] = {
|
||||
{ kPropertySelection,
|
||||
{ B_SET_PROPERTY },
|
||||
{ B_DIRECT_SPECIFIER, kPreviousSpecifier, kNextSpecifier },
|
||||
"set Selection of ... to {next|previous|entry} # selects specified entries",
|
||||
"set Selection of ... to {next|previous|entry} # selects specified "
|
||||
"entries",
|
||||
0,
|
||||
{},
|
||||
{},
|
||||
@@ -191,7 +193,7 @@ const property_info kPosesPropertyList[] = {
|
||||
{},
|
||||
{}
|
||||
},
|
||||
{NULL,
|
||||
{ NULL,
|
||||
{},
|
||||
{},
|
||||
NULL, 0,
|
||||
@@ -209,7 +211,8 @@ BPoseView::GetSupportedSuites(BMessage* _SCRIPTING_ONLY(data))
|
||||
{
|
||||
#if _SUPPORTS_FEATURE_SCRIPTING
|
||||
data->AddString("suites", kPosesSuites);
|
||||
BPropertyInfo propertyInfo(const_cast<property_info*>(kPosesPropertyList));
|
||||
BPropertyInfo propertyInfo(
|
||||
const_cast<property_info*>(kPosesPropertyList));
|
||||
data->AddFlat("messages", &propertyInfo);
|
||||
|
||||
return _inherited::GetSupportedSuites(data);
|
||||
@@ -249,7 +252,8 @@ BPoseView::HandleScriptingMessage(BMessage* _SCRIPTING_ONLY(message))
|
||||
|
||||
switch (message->what) {
|
||||
case B_CREATE_PROPERTY:
|
||||
handled = CreateProperty(message, &specifier, form, property, &reply);
|
||||
handled = CreateProperty(message, &specifier, form, property,
|
||||
&reply);
|
||||
break;
|
||||
|
||||
case B_GET_PROPERTY:
|
||||
@@ -257,7 +261,8 @@ BPoseView::HandleScriptingMessage(BMessage* _SCRIPTING_ONLY(message))
|
||||
break;
|
||||
|
||||
case B_SET_PROPERTY:
|
||||
handled = SetProperty(message, &specifier, form, property, &reply);
|
||||
handled = SetProperty(message, &specifier, form, property,
|
||||
&reply);
|
||||
break;
|
||||
|
||||
case B_COUNT_PROPERTIES:
|
||||
@@ -302,7 +307,6 @@ BPoseView::ExecuteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
for (int32 index = 0; specifier->FindRef("refs", index, &ref)
|
||||
== B_OK; index++)
|
||||
launchMessage.AddRef("refs", &ref);
|
||||
|
||||
} else if (form == (int32)B_INDEX_SPECIFIER) {
|
||||
// move all poses specified by index to Trash
|
||||
int32 specifyingIndex;
|
||||
@@ -323,7 +327,8 @@ BPoseView::ExecuteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
if (error == B_OK) {
|
||||
// add a messenger to the launch message that will be used to
|
||||
// dispatch scripting calls from apps to the PoseView
|
||||
launchMessage.AddMessenger("TrackerViewToken", BMessenger(this, 0, 0));
|
||||
launchMessage.AddMessenger("TrackerViewToken",
|
||||
BMessenger(this, 0, 0));
|
||||
if (fSelectionHandler)
|
||||
fSelectionHandler->PostMessage(&launchMessage);
|
||||
}
|
||||
@@ -413,8 +418,8 @@ BPoseView::DeleteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
bool handled = false;
|
||||
|
||||
if (strcmp(property, kPropertySelection) == 0) {
|
||||
// deleting on a selection is handled as removing a part of the selection
|
||||
// not to be confused with deleting a selected item
|
||||
// deleting on a selection is handled as removing a part of the
|
||||
// selection not to be confused with deleting a selected item
|
||||
|
||||
if (form == (int32)B_ENTRY_SPECIFIER) {
|
||||
entry_ref ref;
|
||||
@@ -469,8 +474,8 @@ BPoseView::DeleteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
} else if (form == (int32)B_INDEX_SPECIFIER) {
|
||||
// move all poses specified by index to Trash
|
||||
int32 specifyingIndex;
|
||||
for (int32 index = 0; specifier->FindInt32("index", index, &specifyingIndex)
|
||||
== B_OK; index++) {
|
||||
for (int32 index = 0; specifier->FindInt32("index", index,
|
||||
&specifyingIndex) == B_OK; index++) {
|
||||
BPose* pose = PoseAtIndex(specifyingIndex);
|
||||
|
||||
if (!pose) {
|
||||
@@ -478,7 +483,8 @@ BPoseView::DeleteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
break;
|
||||
}
|
||||
|
||||
entryList->AddItem(new entry_ref(*pose->TargetModel()->EntryRef()));
|
||||
entryList->AddItem(
|
||||
new entry_ref(*pose->TargetModel()->EntryRef()));
|
||||
}
|
||||
} else
|
||||
return false;
|
||||
@@ -486,8 +492,8 @@ BPoseView::DeleteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
if (error == B_OK) {
|
||||
TrackerSettings settings;
|
||||
if (!settings.DontMoveFilesToTrash()) {
|
||||
// move the list we build into trash, don't make the trashing task
|
||||
// select the next item
|
||||
// move the list we build into trash, don't make the
|
||||
// trashing task select the next item
|
||||
MoveListToTrash(entryList, false, false);
|
||||
} else
|
||||
Delete(entryList, false, settings.AskBeforeDeleteFile());
|
||||
@@ -507,12 +513,13 @@ BPoseView::DeleteProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
|
||||
|
||||
bool
|
||||
BPoseView::CountProperty(BMessage*, int32, const char* _SCRIPTING_ONLY(property),
|
||||
BPoseView::CountProperty(BMessage*, int32,
|
||||
const char* _SCRIPTING_ONLY(property),
|
||||
BMessage* _SCRIPTING_ONLY(reply))
|
||||
{
|
||||
#if _SUPPORTS_FEATURE_SCRIPTING
|
||||
bool handled = false;
|
||||
// PRINT(("BPoseView::CountProperty, %s\n", property));
|
||||
//PRINT(("BPoseView::CountProperty, %s\n", property));
|
||||
|
||||
// just return the respecitve counts
|
||||
if (strcmp(property, kPropertySelection) == 0) {
|
||||
@@ -583,7 +590,8 @@ BPoseView::GetProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
}
|
||||
|
||||
if (pose->IsSelected()) {
|
||||
reply->AddRef("result", pose->TargetModel()->EntryRef());
|
||||
reply->AddRef("result",
|
||||
pose->TargetModel()->EntryRef());
|
||||
reply->AddInt32("index", IndexOfPose(pose));
|
||||
break;
|
||||
}
|
||||
@@ -599,8 +607,10 @@ BPoseView::GetProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
case B_DIRECT_SPECIFIER:
|
||||
{
|
||||
// return all entries of all poses in PoseView
|
||||
for (int32 index = 0; index < count; index++)
|
||||
reply->AddRef("result", PoseAtIndex(index)->TargetModel()->EntryRef());
|
||||
for (int32 index = 0; index < count; index++) {
|
||||
reply->AddRef("result",
|
||||
PoseAtIndex(index)->TargetModel()->EntryRef());
|
||||
}
|
||||
|
||||
handled = true;
|
||||
break;
|
||||
@@ -618,7 +628,8 @@ BPoseView::GetProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
handled = true;
|
||||
break;
|
||||
}
|
||||
reply->AddRef("result", PoseAtIndex(index)->TargetModel()->EntryRef());
|
||||
reply->AddRef("result",
|
||||
PoseAtIndex(index)->TargetModel()->EntryRef());
|
||||
|
||||
handled = true;
|
||||
break;
|
||||
@@ -627,7 +638,8 @@ BPoseView::GetProperty(BMessage* _SCRIPTING_ONLY(specifier),
|
||||
case kPreviousSpecifier:
|
||||
case kNextSpecifier:
|
||||
{
|
||||
// return entry and index of pose before or after specified pose
|
||||
// return entry and index of pose before or after
|
||||
// specified pose
|
||||
entry_ref ref;
|
||||
if (specifier->FindRef("data", &ref) != B_OK)
|
||||
break;
|
||||
@@ -711,8 +723,8 @@ BPoseView::SetProperty(BMessage* _SCRIPTING_ONLY(message), BMessage*,
|
||||
}
|
||||
|
||||
if (clearSelection) {
|
||||
// first selected item must call SelectPose so the selection
|
||||
// gets cleared first
|
||||
// first selected item must call SelectPose so the
|
||||
// selection gets cleared first
|
||||
SelectPose(pose, poseIndex);
|
||||
clearSelection = false;
|
||||
} else
|
||||
@@ -741,11 +753,13 @@ BPoseView::ResolveSpecifier(BMessage* _SCRIPTING_ONLY(message),
|
||||
int32 _SCRIPTING_ONLY(form), const char* _SCRIPTING_ONLY(property))
|
||||
{
|
||||
#if _SUPPORTS_FEATURE_SCRIPTING
|
||||
BPropertyInfo propertyInfo(const_cast<property_info*>(kPosesPropertyList));
|
||||
BPropertyInfo propertyInfo(
|
||||
const_cast<property_info*>(kPosesPropertyList));
|
||||
|
||||
int32 result = propertyInfo.FindMatch(message, index, specifier, form, property);
|
||||
int32 result = propertyInfo.FindMatch(message, index, specifier, form,
|
||||
property);
|
||||
if (result < 0) {
|
||||
// PRINT(("FindMatch result %d \n"));
|
||||
//PRINT(("FindMatch result %d \n"));
|
||||
return _inherited::ResolveSpecifier(message, index, specifier,
|
||||
form, property);
|
||||
}
|
||||
|
||||
@@ -46,12 +46,15 @@ const uint32 kSaveButton = 'Tsav';
|
||||
const uint32 kShowSplash = 'Spls';
|
||||
|
||||
const uint32 kStartWatchClipboardRefs = 'TCbw';
|
||||
// StartWatching() clipboard changes. Changes will be sent to given BMessenger "target"
|
||||
// StartWatching() clipboard changes. Changes will be sent to given
|
||||
// BMessenger "target"
|
||||
const uint32 kStopWatchClipboardRefs = 'TCfw';
|
||||
// StopWatching() given BMessenger "target"
|
||||
const uint32 kFSClipboardChanges = 'TCch';
|
||||
// Used by FSClipboard functions which change refs in clipboard and are used outside Tracker (like BFilePanel called in another app)
|
||||
// Contains movemodes named as in FSClipboard operations and in Clipboard (look into FSClipboard files)
|
||||
// Used by FSClipboard functions which change refs in clipboard and are
|
||||
// used outside Tracker (like BFilePanel called in another app)
|
||||
// Contains movemodes named as in FSClipboard operations and in Clipboard
|
||||
// (look into FSClipboard files)
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
|
||||
@@ -101,8 +101,8 @@ BQueryContainerWindow::AddWindowMenu(BMenu* menu)
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Select all"), new BMessage(B_SELECT_ALL),
|
||||
'A');
|
||||
item = new BMenuItem(B_TRANSLATE("Select all"),
|
||||
new BMessage(B_SELECT_ALL), 'A');
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
@@ -111,8 +111,8 @@ BQueryContainerWindow::AddWindowMenu(BMenu* menu)
|
||||
item->SetTarget(PoseView());
|
||||
menu->AddItem(item);
|
||||
|
||||
item = new BMenuItem(B_TRANSLATE("Close"), new BMessage(B_QUIT_REQUESTED),
|
||||
'W');
|
||||
item = new BMenuItem(B_TRANSLATE("Close"),
|
||||
new BMessage(B_QUIT_REQUESTED), 'W');
|
||||
item->SetTarget(this);
|
||||
menu->AddItem(item);
|
||||
}
|
||||
@@ -161,9 +161,11 @@ BQueryContainerWindow::SetUpDefaultState()
|
||||
|
||||
defaultStatePath += sanitizedType;
|
||||
|
||||
PRINT(("looking for default query state at %s\n", defaultStatePath.String()));
|
||||
PRINT(("looking for default query state at %s\n",
|
||||
defaultStatePath.String()));
|
||||
|
||||
if (!DefaultStateSourceNode(defaultStatePath.String(), &defaultingNode, false)) {
|
||||
if (!DefaultStateSourceNode(defaultStatePath.String(), &defaultingNode,
|
||||
false)) {
|
||||
TRACE();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -261,7 +261,8 @@ BQueryPoseView::InitDirentIterator(const entry_ref* ref)
|
||||
oldPoseList->AddList(fPoseList);
|
||||
}
|
||||
|
||||
fQueryListContainer = new QueryEntryListCollection(&sourceModel, this, oldPoseList);
|
||||
fQueryListContainer = new QueryEntryListCollection(&sourceModel, this,
|
||||
oldPoseList);
|
||||
fCreateOldPoseList = false;
|
||||
|
||||
if (fQueryListContainer->InitCheck() != B_OK) {
|
||||
@@ -298,8 +299,8 @@ BQueryPoseView::InitDirentIterator(const entry_ref* ref)
|
||||
timeData.tm_min = 0;
|
||||
nextHour = mktime(&timeData);
|
||||
|
||||
PRINT(("%ld minutes, %ld seconds till next hour\n", (nextHour - now) / 60,
|
||||
(nextHour - now) % 60));
|
||||
PRINT(("%ld minutes, %ld seconds till next hour\n",
|
||||
(nextHour - now) / 60, (nextHour - now) % 60));
|
||||
|
||||
time_t nextMinute = now + 60;
|
||||
// move ahead by a minute
|
||||
@@ -342,7 +343,8 @@ BQueryPoseView::InitDirentIterator(const entry_ref* ref)
|
||||
TTracker* tracker = dynamic_cast<TTracker*>(be_app);
|
||||
ASSERT(tracker);
|
||||
tracker->MainTaskLoop()->RunLater(
|
||||
NewLockingMemberFunctionObject(&BQueryPoseView::Refresh, this), delta);
|
||||
NewLockingMemberFunctionObject(&BQueryPoseView::Refresh, this),
|
||||
delta);
|
||||
}
|
||||
|
||||
return fQueryListContainer->Clone();
|
||||
@@ -365,14 +367,19 @@ BQueryPoseView::SearchForType() const
|
||||
attr_info attrInfo;
|
||||
|
||||
// read the type of files we are looking for
|
||||
status_t status = TargetModel()->Node()->GetAttrInfo(kAttrQueryInitialMime, &attrInfo);
|
||||
if (status == B_OK)
|
||||
TargetModel()->Node()->ReadAttrString(kAttrQueryInitialMime, &buffer);
|
||||
status_t status
|
||||
= TargetModel()->Node()->GetAttrInfo(kAttrQueryInitialMime,
|
||||
&attrInfo);
|
||||
if (status == B_OK) {
|
||||
TargetModel()->Node()->ReadAttrString(kAttrQueryInitialMime,
|
||||
&buffer);
|
||||
}
|
||||
|
||||
if (buffer.Length()) {
|
||||
TTracker* tracker = dynamic_cast<TTracker*>(be_app);
|
||||
if (tracker) {
|
||||
const ShortMimeInfo* info = tracker->MimeTypes()->FindMimeType(buffer.String());
|
||||
const ShortMimeInfo* info
|
||||
= tracker->MimeTypes()->FindMimeType(buffer.String());
|
||||
if (info)
|
||||
fSearchForMimeType = info->InternalName();
|
||||
}
|
||||
@@ -401,8 +408,8 @@ BQueryPoseView::ActiveOnDevice(dev_t device) const
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* target,
|
||||
PoseList* oldPoseList)
|
||||
QueryEntryListCollection::QueryEntryListCollection(Model* model,
|
||||
BHandler* target, PoseList* oldPoseList)
|
||||
: fQueryListRep(new QueryListRep(new BObjectList<BQuery>(5, true)))
|
||||
{
|
||||
Rewind();
|
||||
@@ -421,7 +428,8 @@ QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* targe
|
||||
|
||||
BString buffer;
|
||||
if (model->Node()->ReadAttr(kAttrQueryString, B_STRING_TYPE, 0,
|
||||
buffer.LockBuffer((int32)info.size), (size_t)info.size) != info.size) {
|
||||
buffer.LockBuffer((int32)info.size),
|
||||
(size_t)info.size) != info.size) {
|
||||
fStatus = B_ERROR;
|
||||
return;
|
||||
}
|
||||
@@ -430,9 +438,10 @@ QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* targe
|
||||
|
||||
// read the extra options
|
||||
MoreOptionsStruct saveMoreOptions;
|
||||
if (ReadAttr(model->Node(), kAttrQueryMoreOptions, kAttrQueryMoreOptionsForeign,
|
||||
B_RAW_TYPE, 0, &saveMoreOptions, sizeof(MoreOptionsStruct),
|
||||
&MoreOptionsStruct::EndianSwap) != kReadAttrFailed) {
|
||||
if (ReadAttr(model->Node(), kAttrQueryMoreOptions,
|
||||
kAttrQueryMoreOptionsForeign, B_RAW_TYPE, 0, &saveMoreOptions,
|
||||
sizeof(MoreOptionsStruct),
|
||||
&MoreOptionsStruct::EndianSwap) != kReadAttrFailed) {
|
||||
fQueryListRep->fShowResultsFromTrash = saveMoreOptions.searchTrash;
|
||||
}
|
||||
|
||||
@@ -445,7 +454,8 @@ QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* targe
|
||||
fQueryListRep->fRefreshEveryMinute = false;
|
||||
|
||||
if (model->Node()->ReadAttr(kAttrDynamicDateQuery, B_BOOL_TYPE, 0,
|
||||
&fQueryListRep->fDynamicDateQuery, sizeof(bool)) != sizeof(bool)) {
|
||||
&fQueryListRep->fDynamicDateQuery,
|
||||
sizeof(bool)) != sizeof(bool)) {
|
||||
fQueryListRep->fDynamicDateQuery = false;
|
||||
}
|
||||
|
||||
@@ -473,15 +483,16 @@ QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* targe
|
||||
char* buffer = NULL;
|
||||
|
||||
if ((buffer = (char*)malloc((size_t)info.size)) != NULL
|
||||
&& model->Node()->ReadAttr(kAttrQueryVolume, B_MESSAGE_TYPE, 0, buffer,
|
||||
(size_t)info.size) == info.size) {
|
||||
&& model->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
|
||||
// match a volume with the info embedded in
|
||||
// the message
|
||||
result = MatchArchivedVolume(&volume, &message, index);
|
||||
if (result == B_OK) {
|
||||
// start the query on this volume
|
||||
@@ -492,8 +503,8 @@ QueryEntryListCollection::QueryEntryListCollection(Model* model, BHandler* targe
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -594,8 +605,9 @@ QueryEntryListCollection::GetNextEntry(BEntry* entry, bool traverse)
|
||||
for (int32 count = fQueryListRep->fQueryList->CountItems();
|
||||
fQueryListRep->fQueryListIndex < count;
|
||||
fQueryListRep->fQueryListIndex++) {
|
||||
result = fQueryListRep->fQueryList->ItemAt(fQueryListRep->fQueryListIndex)
|
||||
->GetNextEntry(entry, traverse);
|
||||
result = fQueryListRep->fQueryList->
|
||||
ItemAt(fQueryListRep->fQueryListIndex)
|
||||
->GetNextEntry(entry, traverse);
|
||||
if (result == B_OK)
|
||||
break;
|
||||
}
|
||||
@@ -613,8 +625,9 @@ QueryEntryListCollection::GetNextDirents(struct dirent* buffer, size_t length,
|
||||
fQueryListRep->fQueryListIndex < queryCount;
|
||||
fQueryListRep->fQueryListIndex++) {
|
||||
|
||||
result = fQueryListRep->fQueryList->ItemAt(fQueryListRep->fQueryListIndex)
|
||||
->GetNextDirents(buffer, length, count);
|
||||
result = fQueryListRep->fQueryList->
|
||||
ItemAt(fQueryListRep->fQueryListIndex)->GetNextDirents(buffer,
|
||||
length, count);
|
||||
if (result > 0)
|
||||
break;
|
||||
}
|
||||
@@ -631,8 +644,8 @@ QueryEntryListCollection::GetNextRef(entry_ref* ref)
|
||||
fQueryListRep->fQueryListIndex < count;
|
||||
fQueryListRep->fQueryListIndex++) {
|
||||
|
||||
result = fQueryListRep->fQueryList->ItemAt(fQueryListRep->fQueryListIndex)
|
||||
->GetNextRef(ref);
|
||||
result = fQueryListRep->fQueryList->
|
||||
ItemAt(fQueryListRep->fQueryListIndex)->GetNextRef(ref);
|
||||
if (result == B_OK)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -137,11 +137,13 @@ class QueryEntryListCollection : public EntryListBase {
|
||||
|
||||
PoseList* fOldPoseList;
|
||||
// when doing a Refresh, this list is used to detect poses that
|
||||
// are no longer a part of a fDynamicDateQuery and need to be removed
|
||||
// are no longer a part of a fDynamicDateQuery and need to be
|
||||
// removed
|
||||
};
|
||||
|
||||
public:
|
||||
QueryEntryListCollection(Model*, BHandler* = NULL, PoseList* oldPoseList = NULL);
|
||||
QueryEntryListCollection(Model*, BHandler* = NULL,
|
||||
PoseList* oldPoseList = NULL);
|
||||
virtual ~QueryEntryListCollection();
|
||||
|
||||
QueryEntryListCollection* Clone();
|
||||
|
||||
@@ -363,7 +363,8 @@ BRecentFilesList::BRecentFilesList(int32 maxItems, bool navMenuFolders,
|
||||
|
||||
|
||||
BRecentFilesList::BRecentFilesList(int32 maxItems, bool navMenuFolders,
|
||||
const char* ofTypeList[], int32 ofTypeListCount, const char* openedByAppSig)
|
||||
const char* ofTypeList[], int32 ofTypeListCount,
|
||||
const char* openedByAppSig)
|
||||
:
|
||||
BRecentItemsList(maxItems, navMenuFolders),
|
||||
fType(NULL),
|
||||
@@ -415,15 +416,17 @@ BRecentFilesList::NewFileListMenu(const char* title,
|
||||
const char* openedByAppSig)
|
||||
{
|
||||
return new RecentFilesMenu(title, openFileMessage,
|
||||
openFolderMessage, target, maxItems, navMenuFolders, ofType, openedByAppSig);
|
||||
openFolderMessage, target, maxItems, navMenuFolders, ofType,
|
||||
openedByAppSig);
|
||||
}
|
||||
|
||||
|
||||
BMenu*
|
||||
BRecentFilesList::NewFileListMenu(const char* title,
|
||||
BMessage* openFileMessage, BMessage* openFolderMessage,
|
||||
BHandler* target, int32 maxItems, bool navMenuFolders, const char* ofTypeList[],
|
||||
int32 ofTypeListCount, const char* openedByAppSig)
|
||||
BHandler* target, int32 maxItems, bool navMenuFolders,
|
||||
const char* ofTypeList[], int32 ofTypeListCount,
|
||||
const char* openedByAppSig)
|
||||
{
|
||||
return new RecentFilesMenu(title, openFileMessage,
|
||||
openFolderMessage, target, maxItems, navMenuFolders, ofTypeList,
|
||||
|
||||
@@ -63,12 +63,12 @@ public:
|
||||
virtual BMenuItem* GetNextMenuItem(const BMessage* fileOpenMessage = NULL,
|
||||
const BMessage* containerOpenMessage = NULL,
|
||||
BHandler* target = NULL, entry_ref* currentItemRef = NULL);
|
||||
// if <fileOpenMessage> specified, the item for a file gets a copy with
|
||||
// the item ref attached as "refs", otherwise a default B_REFS_RECEIVED
|
||||
// message message gets attached
|
||||
// if <containerOpenMessage> specified, the item for a folder, volume or query
|
||||
// gets a copy with the item ref attached as "refs", otherwise a default
|
||||
// if <fileOpenMessage> specified, the item for a file gets a copy
|
||||
// with the item ref attached as "refs", otherwise a default
|
||||
// B_REFS_RECEIVED message message gets attached
|
||||
// if <containerOpenMessage> specified, the item for a folder, volume
|
||||
// or query gets a copy with the item ref attached as "refs",
|
||||
// otherwise a default B_REFS_RECEIVED message message gets attached
|
||||
// if <currentItemRef> gets passed, the caller gets to look at the
|
||||
// entry_ref corresponding to the item
|
||||
|
||||
@@ -101,8 +101,9 @@ public:
|
||||
// use one of the two constructors to set up next item iteration
|
||||
BRecentFilesList(int32 maxItems = 10, bool navMenuFolders = false,
|
||||
const char* ofType = NULL, const char* openedByAppSig = NULL);
|
||||
BRecentFilesList(int32 maxItems, bool navMenuFolders, const char* ofTypeList[],
|
||||
int32 ofTypeListCount, const char* openedByAppSig = NULL);
|
||||
BRecentFilesList(int32 maxItems, bool navMenuFolders,
|
||||
const char* ofTypeList[], int32 ofTypeListCount,
|
||||
const char* openedByAppSig = NULL);
|
||||
virtual ~BRecentFilesList();
|
||||
|
||||
// use one of the two NewFileListMenu calls to get an entire menu
|
||||
|
||||
+64
-52
@@ -90,9 +90,9 @@ const uint8 kRegExpMagic = 0234;
|
||||
// of lines that cannot possibly match. The regmust tests are costly enough
|
||||
// that Compile() supplies a regmust only if the r.e. contains something
|
||||
// potentially expensive (at present, the only such thing detected is * or +
|
||||
// at the start of the r.e., which can involve a lot of backup). Regmlen is
|
||||
// supplied because the test in RunMatcher() needs it and Compile() is computing
|
||||
// it anyway.
|
||||
// at the start of the r.e., which can involve a lot of backup). Regmlen is
|
||||
// supplied because the test in RunMatcher() needs it and Compile() is
|
||||
// computing it anyway.
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -100,15 +100,16 @@ const uint8 kRegExpMagic = 0234;
|
||||
// of a nondeterministic finite-state machine (aka syntax charts or
|
||||
// "railroad normal form" in parsing technology). Each node is an opcode
|
||||
// plus a "next" pointer, possibly plus an operand. "Next" pointers of
|
||||
// all nodes except kRegExpBranch implement concatenation; a "next" pointer with
|
||||
// a kRegExpBranch on both ends of it is connecting two alternatives. (Here we
|
||||
// have one of the subtle syntax dependencies: an individual kRegExpBranch (as
|
||||
// opposed to a collection of them) is never concatenated with anything
|
||||
// because of operator precedence.) The operand of some types of node is
|
||||
// a literal string; for others, it is a node leading into a sub-FSM. In
|
||||
// particular, the operand of a kRegExpBranch node is the first node of the branch.
|
||||
// (NB this is* not* a tree structure: the tail of the branch connects
|
||||
// to the thing following the set of kRegExpBranches.) The opcodes are:
|
||||
// all nodes except kRegExpBranch implement concatenation; a "next" pointer
|
||||
// with a kRegExpBranch on both ends of it is connecting two alternatives.
|
||||
// (Here we have one of the subtle syntax dependencies: an individual
|
||||
// kRegExpBranch (as opposed to a collection of them) is never concatenated
|
||||
// with anything because of operator precedence.) The operand of some types
|
||||
// of node is a literal string; for others, it is a node leading into a
|
||||
// sub-FSM. In particular, the operand of a kRegExpBranch node is the first
|
||||
// node of the branch. (NB this is* not* a tree structure: the tail of the
|
||||
// branch connects to the thing following the set of kRegExpBranches).
|
||||
// The opcodes are:
|
||||
//
|
||||
|
||||
// definition number opnd? meaning
|
||||
@@ -133,21 +134,21 @@ enum {
|
||||
//
|
||||
// Opcode notes:
|
||||
//
|
||||
// kRegExpBranch The set of branches constituting a single choice are hooked
|
||||
// together with their "next" pointers, since precedence prevents
|
||||
// kRegExpBranch The set of branches constituting a single choice are
|
||||
// hooked together with their "next" pointers, since precedence prevents
|
||||
// anything being concatenated to any individual branch. The
|
||||
// "next" pointer of the last kRegExpBranch in a choice points to the
|
||||
// thing following the whole choice. This is also where the
|
||||
// final "next" pointer of each individual branch points; each
|
||||
// branch starts with the operand node of a kRegExpBranch node.
|
||||
//
|
||||
// kRegExpBack Normal "next" pointers all implicitly point forward; kRegExpBack
|
||||
// exists to make loop structures possible.
|
||||
// kRegExpBack Normal "next" pointers all implicitly point forward;
|
||||
// kRegExpBack exists to make loop structures possible.
|
||||
//
|
||||
// kRegExpStar,kRegExpPlus '?', and complex '*' and '+', are implemented as circular
|
||||
// kRegExpBranch structures using kRegExpBack. Simple cases (one character
|
||||
// per match) are implemented with kRegExpStar and kRegExpPlus for speed
|
||||
// and to minimize recursive plunges.
|
||||
// kRegExpStar,kRegExpPlus '?', and complex '*' and '+', are implemented as
|
||||
// circular kRegExpBranch structures using kRegExpBack. Simple cases
|
||||
// (one character per match) are implemented with kRegExpStar and
|
||||
// kRegExpPlus for speed and to minimize recursive plunges.
|
||||
//
|
||||
// kRegExpOpen,kRegExpClose ...are numbered at compile time.
|
||||
//
|
||||
@@ -164,7 +165,8 @@ enum {
|
||||
//
|
||||
|
||||
const char* kMeta = "^$.[()|?+*\\";
|
||||
const int32 kMaxSize = 32767L; // Probably could be 65535L.
|
||||
const int32 kMaxSize = 32767L;
|
||||
// Probably could be 65535L.
|
||||
|
||||
// Flags to be passed up and down:
|
||||
enum {
|
||||
@@ -360,7 +362,8 @@ RegExp::Compile(const char* exp)
|
||||
longest = NULL;
|
||||
len = 0;
|
||||
for (; scan != NULL; scan = Next((char*)scan))
|
||||
if (*scan == kRegExpExactly && (int32)strlen(Operand(scan)) >= len) {
|
||||
if (*scan == kRegExpExactly
|
||||
&& (int32)strlen(Operand(scan)) >= len) {
|
||||
longest = Operand(scan);
|
||||
len = (int32)strlen(Operand(scan));
|
||||
}
|
||||
@@ -520,10 +523,10 @@ RegExp::Branch(int32* flagp)
|
||||
// - Piece - something followed by possible [*+?]
|
||||
//
|
||||
// Note that the branching code sequences used for ? and the general cases
|
||||
// of * and + are somewhat optimized: they use the same kRegExpNothing node as
|
||||
// both the endmarker for their branch list and the body of the last branch.
|
||||
// It might seem that this node could be dispensed with entirely, but the
|
||||
// endmarker role is not redundant.
|
||||
// of * and + are somewhat optimized: they use the same kRegExpNothing node
|
||||
// as both the endmarker for their branch list and the body of the last
|
||||
// branch. It might seem that this node could be dispensed with entirely,
|
||||
// but the endmarker role is not redundant.
|
||||
//
|
||||
char*
|
||||
RegExp::Piece(int32* flagp)
|
||||
@@ -623,12 +626,14 @@ RegExp::Atom(int32* flagp)
|
||||
ret = Node(kRegExpAnyOf);
|
||||
if (*fInputScanPointer == ']' || *fInputScanPointer == '-')
|
||||
Char(*fInputScanPointer++);
|
||||
while (*fInputScanPointer != '\0' && *fInputScanPointer != ']') {
|
||||
while (*fInputScanPointer != '\0'
|
||||
&& *fInputScanPointer != ']') {
|
||||
if (*fInputScanPointer == '-') {
|
||||
fInputScanPointer++;
|
||||
if (*fInputScanPointer == ']' || *fInputScanPointer == '\0')
|
||||
if (*fInputScanPointer == ']'
|
||||
|| *fInputScanPointer == '\0') {
|
||||
Char('-');
|
||||
else {
|
||||
} else {
|
||||
cclass = UCharAt(fInputScanPointer - 2) + 1;
|
||||
classend = UCharAt(fInputScanPointer);
|
||||
if (cclass > classend + 1) {
|
||||
@@ -678,30 +683,34 @@ RegExp::Atom(int32* flagp)
|
||||
*flagp |= kHasWidth|kSimple;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
int32 len;
|
||||
char ender;
|
||||
{
|
||||
int32 len;
|
||||
char ender;
|
||||
|
||||
fInputScanPointer--;
|
||||
len = (int32)strcspn(fInputScanPointer, kMeta);
|
||||
if (len <= 0) {
|
||||
SetError(REGEXP_INTERNAL_ERROR);
|
||||
return NULL;
|
||||
}
|
||||
ender = *(fInputScanPointer + len);
|
||||
if (len > 1 && IsMult(ender))
|
||||
len--; // Back off clear of ?+* operand.
|
||||
*flagp |= kHasWidth;
|
||||
if (len == 1)
|
||||
*flagp |= kSimple;
|
||||
ret = Node(kRegExpExactly);
|
||||
while (len > 0) {
|
||||
Char(*fInputScanPointer++);
|
||||
len--;
|
||||
}
|
||||
Char('\0');
|
||||
fInputScanPointer--;
|
||||
len = (int32)strcspn(fInputScanPointer, kMeta);
|
||||
if (len <= 0) {
|
||||
SetError(REGEXP_INTERNAL_ERROR);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ender = *(fInputScanPointer + len);
|
||||
if (len > 1 && IsMult(ender))
|
||||
len--; // Back off clear of ?+* operand.
|
||||
|
||||
*flagp |= kHasWidth;
|
||||
if (len == 1)
|
||||
*flagp |= kSimple;
|
||||
|
||||
ret = Node(kRegExpExactly);
|
||||
while (len > 0) {
|
||||
Char(*fInputScanPointer++);
|
||||
len--;
|
||||
}
|
||||
|
||||
Char('\0');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -964,8 +973,10 @@ RegExp::Match(const char* prog) const
|
||||
return 0;
|
||||
|
||||
uint32 len = strlen(opnd);
|
||||
if (len > 1 && strncmp(opnd, fStringInputPointer, len) != 0)
|
||||
if (len > 1
|
||||
&& strncmp(opnd, fStringInputPointer, len) != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
fStringInputPointer += len;
|
||||
}
|
||||
@@ -1255,7 +1266,8 @@ RegExp::Dump()
|
||||
else
|
||||
printf("(%ld)", (s - fRegExp->program) + (next - s));
|
||||
s += 3;
|
||||
if (op == kRegExpAnyOf || op == kRegExpAnyBut || op == kRegExpExactly) {
|
||||
if (op == kRegExpAnyOf || op == kRegExpAnyBut
|
||||
|| op == kRegExpExactly) {
|
||||
// Literal string, where present.
|
||||
while (*s != '\0') {
|
||||
putchar(*s);
|
||||
|
||||
@@ -63,14 +63,16 @@ SelectionWindow::SelectionWindow(BContainerWindow* window)
|
||||
fParentWindow(window)
|
||||
{
|
||||
if (window->Feel() & kPrivateDesktopWindowFeel) {
|
||||
// The window will not show up if we have B_FLOATING_SUBSET_WINDOW_FEEL
|
||||
// and use it with the desktop window since it's never in front.
|
||||
// The window will not show up if we have
|
||||
// B_FLOATING_SUBSET_WINDOW_FEEL and use it with the desktop window
|
||||
// since it's never in front.
|
||||
SetFeel(B_NORMAL_WINDOW_FEEL);
|
||||
}
|
||||
|
||||
AddToSubset(fParentWindow);
|
||||
|
||||
BView* backgroundView = new BView(Bounds(), "bgView", B_FOLLOW_ALL, B_WILL_DRAW);
|
||||
BView* backgroundView = new BView(Bounds(), "bgView", B_FOLLOW_ALL,
|
||||
B_WILL_DRAW);
|
||||
backgroundView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
AddChild(backgroundView);
|
||||
|
||||
@@ -88,24 +90,25 @@ SelectionWindow::SelectionWindow(BContainerWindow* window)
|
||||
// Set wildcard matching to default.
|
||||
|
||||
// Set up the menu field
|
||||
fMatchingTypeMenuField = new BMenuField(BRect(7, 6, Bounds().right - 5, 0),
|
||||
NULL, B_TRANSLATE("Name"), menu);
|
||||
fMatchingTypeMenuField = new BMenuField(BRect(7, 6,
|
||||
Bounds().right - 5, 0), NULL, B_TRANSLATE("Name"), menu);
|
||||
backgroundView->AddChild(fMatchingTypeMenuField);
|
||||
fMatchingTypeMenuField->SetDivider(fMatchingTypeMenuField->StringWidth(
|
||||
B_TRANSLATE("Name")) + 8);
|
||||
fMatchingTypeMenuField->ResizeToPreferred();
|
||||
|
||||
// Set up the expression text control
|
||||
fExpressionTextControl = new BTextControl(BRect(7, fMatchingTypeMenuField->
|
||||
Bounds().bottom + 11, Bounds().right - 6, 0), NULL, NULL, NULL, NULL,
|
||||
B_FOLLOW_LEFT_RIGHT);
|
||||
fExpressionTextControl = new BTextControl(BRect(7,
|
||||
fMatchingTypeMenuField->Bounds().bottom + 11,
|
||||
Bounds().right - 6, 0),
|
||||
NULL, NULL, NULL, NULL, B_FOLLOW_LEFT_RIGHT);
|
||||
backgroundView->AddChild(fExpressionTextControl);
|
||||
fExpressionTextControl->ResizeToPreferred();
|
||||
fExpressionTextControl->MakeFocus(true);
|
||||
|
||||
// Set up the Invert checkbox
|
||||
fInverseCheckBox = new BCheckBox(
|
||||
BRect(7, fExpressionTextControl->Frame().bottom + 6, 6, 6), NULL,
|
||||
BRect(7, fExpressionTextControl->Frame().bottom + 6, 6, 6), NULL,
|
||||
B_TRANSLATE("Invert"), NULL);
|
||||
backgroundView->AddChild(fInverseCheckBox);
|
||||
fInverseCheckBox->ResizeToPreferred();
|
||||
@@ -113,15 +116,16 @@ SelectionWindow::SelectionWindow(BContainerWindow* window)
|
||||
// Set up the Ignore Case checkbox
|
||||
fIgnoreCaseCheckBox = new BCheckBox(
|
||||
BRect(fInverseCheckBox->Frame().right + 10,
|
||||
fInverseCheckBox->Frame().top, 6, 6), NULL, B_TRANSLATE("Ignore case"),
|
||||
NULL);
|
||||
fInverseCheckBox->Frame().top, 6, 6),
|
||||
NULL, B_TRANSLATE("Ignore case"), NULL);
|
||||
fIgnoreCaseCheckBox->SetValue(1);
|
||||
backgroundView->AddChild(fIgnoreCaseCheckBox);
|
||||
fIgnoreCaseCheckBox->ResizeToPreferred();
|
||||
|
||||
// Set up the Select button
|
||||
fSelectButton = new BButton(BRect(0, 0, 5, 5), NULL, B_TRANSLATE("Select"),
|
||||
new BMessage(kSelectButtonPressed), B_FOLLOW_RIGHT);
|
||||
fSelectButton = new BButton(BRect(0, 0, 5, 5), NULL,
|
||||
B_TRANSLATE("Select"), new BMessage(kSelectButtonPressed),
|
||||
B_FOLLOW_RIGHT);
|
||||
|
||||
backgroundView->AddChild(fSelectButton);
|
||||
fSelectButton->ResizeToPreferred();
|
||||
@@ -138,16 +142,19 @@ SelectionWindow::SelectionWindow(BContainerWindow* window)
|
||||
// Center the checkboxes vertically to the button
|
||||
float topMiddleButton =
|
||||
(fSelectButton->Bounds().Height() / 2 -
|
||||
(fh.ascent + fh.descent + fh.leading + 4) / 2) + fSelectButton->Frame().top;
|
||||
(fh.ascent + fh.descent + fh.leading + 4) / 2)
|
||||
+ fSelectButton->Frame().top;
|
||||
fInverseCheckBox->MoveTo(fInverseCheckBox->Frame().left, topMiddleButton);
|
||||
fIgnoreCaseCheckBox->MoveTo(fIgnoreCaseCheckBox->Frame().left,
|
||||
topMiddleButton);
|
||||
|
||||
float bottomMinWidth = 32 + fSelectButton->Bounds().Width() +
|
||||
fInverseCheckBox->Bounds().Width() + fIgnoreCaseCheckBox->Bounds().Width();
|
||||
float bottomMinWidth = 32 + fSelectButton->Bounds().Width()
|
||||
+ fInverseCheckBox->Bounds().Width()
|
||||
+ fIgnoreCaseCheckBox->Bounds().Width();
|
||||
float topMinWidth = be_plain_font->StringWidth(
|
||||
B_TRANSLATE("Name matches wildcard expression:###"));
|
||||
float minWidth = bottomMinWidth > topMinWidth ? bottomMinWidth : topMinWidth;
|
||||
float minWidth = bottomMinWidth > topMinWidth
|
||||
? bottomMinWidth : topMinWidth;
|
||||
|
||||
class EscapeFilter : public BMessageFilter {
|
||||
public:
|
||||
@@ -240,7 +247,8 @@ SelectionWindow::MoveCloseToMouse()
|
||||
|
||||
// ... unless that's outside of the current screen size:
|
||||
BScreen screen;
|
||||
windowPosition.x = MAX(20, MIN(screen.Frame().right - 20 - Frame().Width(),
|
||||
windowPosition.x
|
||||
= MAX(20, MIN(screen.Frame().right - 20 - Frame().Width(),
|
||||
windowPosition.x));
|
||||
windowPosition.y = MAX(20,
|
||||
MIN(screen.Frame().bottom - 20 - Frame().Height(), windowPosition.y));
|
||||
|
||||
@@ -46,8 +46,9 @@ Settings* settings = NULL;
|
||||
|
||||
// generic setting handler classes
|
||||
|
||||
StringValueSetting::StringValueSetting(const char* name, const char* defaultValue,
|
||||
const char* valueExpectedErrorString, const char* wrongValueErrorString)
|
||||
StringValueSetting::StringValueSetting(const char* name,
|
||||
const char* defaultValue, const char* valueExpectedErrorString,
|
||||
const char* wrongValueErrorString)
|
||||
: SettingsArgvDispatcher(name),
|
||||
fDefaultValue(defaultValue),
|
||||
fValueExpectedErrorString(valueExpectedErrorString),
|
||||
@@ -240,9 +241,9 @@ ScalarValueSetting::NeedsSaving() const
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
HexScalarValueSetting::HexScalarValueSetting(const char* name, int32 defaultValue,
|
||||
const char* valueExpectedErrorString, const char* wrongValueErrorString,
|
||||
int32 min, int32 max)
|
||||
HexScalarValueSetting::HexScalarValueSetting(const char* name,
|
||||
int32 defaultValue, const char* valueExpectedErrorString,
|
||||
const char* wrongValueErrorString, int32 min, int32 max)
|
||||
: ScalarValueSetting(name, defaultValue, valueExpectedErrorString,
|
||||
wrongValueErrorString, min, max)
|
||||
{
|
||||
|
||||
@@ -85,8 +85,9 @@ class ScalarValueSetting : public SettingsArgvDispatcher {
|
||||
// simple int32 setting
|
||||
public:
|
||||
ScalarValueSetting(const char* name, int32 defaultValue,
|
||||
const char* valueExpectedErrorString, const char* wrongValueErrorString,
|
||||
int32 min = LONG_MIN, int32 max = LONG_MAX);
|
||||
const char* valueExpectedErrorString,
|
||||
const char* wrongValueErrorString, int32 min = LONG_MIN,
|
||||
int32 max = LONG_MAX);
|
||||
|
||||
void ValueChanged(int32 newValue);
|
||||
int32 Value() const;
|
||||
@@ -110,8 +111,9 @@ class HexScalarValueSetting : public ScalarValueSetting {
|
||||
// hexadecimal int32 setting
|
||||
public:
|
||||
HexScalarValueSetting(const char* name, int32 defaultValue,
|
||||
const char* valueExpectedErrorString, const char* wrongValueErrorString,
|
||||
int32 min = LONG_MIN, int32 max = LONG_MAX);
|
||||
const char* valueExpectedErrorString,
|
||||
const char* wrongValueErrorString, int32 min = LONG_MIN,
|
||||
int32 max = LONG_MAX);
|
||||
|
||||
void GetValueAsString(char* buffer) const;
|
||||
|
||||
|
||||
@@ -188,7 +188,8 @@ ArgvParser::EachArgvPrivate(const char* name, ArgvHandler argvHandlerFunc,
|
||||
// handle new line
|
||||
fEatComment = false;
|
||||
if (!fSawBackslash && (fInDoubleQuote || fInSingleQuote)) {
|
||||
printf("File %s ; Line %ld # unterminated quote\n", name, fLineNo);
|
||||
printf("File %s ; Line %ld # unterminated quote\n", name,
|
||||
fLineNo);
|
||||
result = B_ERROR;
|
||||
break;
|
||||
}
|
||||
@@ -211,7 +212,8 @@ ArgvParser::EachArgvPrivate(const char* name, ArgvHandler argvHandlerFunc,
|
||||
if (!fSawBackslash) {
|
||||
if (!fInDoubleQuote && !fInSingleQuote) {
|
||||
if (ch == ';') {
|
||||
// semicolon is a command separator, pass on the whole argv
|
||||
// semicolon is a command separator, pass on
|
||||
// the whole argv
|
||||
result = SendArgv(argvHandlerFunc, passThru);
|
||||
if (result != B_OK)
|
||||
break;
|
||||
@@ -259,7 +261,8 @@ SettingsArgvDispatcher::SettingsArgvDispatcher(const char* name)
|
||||
|
||||
|
||||
void
|
||||
SettingsArgvDispatcher::SaveSettings(Settings* settings, bool onlyIfNonDefault)
|
||||
SettingsArgvDispatcher::SaveSettings(Settings* settings,
|
||||
bool onlyIfNonDefault)
|
||||
{
|
||||
if (!onlyIfNonDefault || NeedsSaving()) {
|
||||
settings->Write("%s ", Name());
|
||||
@@ -270,8 +273,8 @@ SettingsArgvDispatcher::SaveSettings(Settings* settings, bool onlyIfNonDefault)
|
||||
|
||||
|
||||
bool
|
||||
SettingsArgvDispatcher::HandleRectValue(BRect &result, const char* const* argv,
|
||||
bool printError)
|
||||
SettingsArgvDispatcher::HandleRectValue(BRect &result,
|
||||
const char* const* argv, bool printError)
|
||||
{
|
||||
if (!*argv) {
|
||||
if (printError)
|
||||
|
||||
@@ -50,7 +50,8 @@ namespace BPrivate {
|
||||
|
||||
class Settings;
|
||||
|
||||
typedef const char* (*ArgvHandler)(int argc, const char* const *argv, void* params);
|
||||
typedef const char* (*ArgvHandler)(int argc, const char* const *argv,
|
||||
void* params);
|
||||
// return 0 or error string if parsing failed
|
||||
|
||||
const int32 kBufferSize = 1024;
|
||||
@@ -117,7 +118,8 @@ public:
|
||||
// return a pointer to an error message or null if parsed OK
|
||||
|
||||
// some handy reader/writer calls
|
||||
bool HandleRectValue(BRect&, const char* const *argv, bool printError = true);
|
||||
bool HandleRectValue(BRect&, const char* const *argv,
|
||||
bool printError = true);
|
||||
void WriteRectValue(Settings*, BRect);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -59,11 +59,14 @@ static const float kIndentSpacing = 12.0f;
|
||||
|
||||
//TODO: defaults should be set in one place only (TrackerSettings.cpp) while
|
||||
// being accessible from here.
|
||||
// What about adding DefaultValue(), IsDefault() etc... methods to xxxValueSetting ?
|
||||
// What about adding DefaultValue(), IsDefault() etc... methods to
|
||||
// xxxValueSetting ?
|
||||
static const uint8 kSpaceBarAlpha = 192;
|
||||
static const rgb_color kDefaultUsedSpaceColor = {0, 203, 0, kSpaceBarAlpha};
|
||||
static const rgb_color kDefaultFreeSpaceColor = {255, 255, 255, kSpaceBarAlpha};
|
||||
static const rgb_color kDefaultWarningSpaceColor = {203, 0, 0, kSpaceBarAlpha};
|
||||
static const rgb_color kDefaultFreeSpaceColor
|
||||
= {255, 255, 255, kSpaceBarAlpha};
|
||||
static const rgb_color kDefaultWarningSpaceColor
|
||||
= {203, 0, 0, kSpaceBarAlpha};
|
||||
|
||||
|
||||
static void
|
||||
@@ -370,10 +373,13 @@ DesktopSettingsView::ShowCurrentSettings()
|
||||
TrackerSettings settings;
|
||||
|
||||
fShowDisksIconRadioButton->SetValue(settings.ShowDisksIcon());
|
||||
fMountVolumesOntoDesktopRadioButton->SetValue(settings.MountVolumesOntoDesktop());
|
||||
fMountVolumesOntoDesktopRadioButton->SetValue(
|
||||
settings.MountVolumesOntoDesktop());
|
||||
|
||||
fMountSharedVolumesOntoDesktopCheckBox->SetValue(settings.MountSharedVolumesOntoDesktop());
|
||||
fMountSharedVolumesOntoDesktopCheckBox->SetEnabled(settings.MountVolumesOntoDesktop());
|
||||
fMountSharedVolumesOntoDesktopCheckBox->SetValue(
|
||||
settings.MountSharedVolumesOntoDesktop());
|
||||
fMountSharedVolumesOntoDesktopCheckBox->SetEnabled(
|
||||
settings.MountVolumesOntoDesktop());
|
||||
}
|
||||
|
||||
|
||||
@@ -476,19 +482,22 @@ WindowsSettingsView::MessageReceived(BMessage* message)
|
||||
|
||||
switch (message->what) {
|
||||
case kWindowsShowFullPathChanged:
|
||||
settings.SetShowFullPathInTitleBar(fShowFullPathInTitleBarCheckBox->Value() == 1);
|
||||
settings.SetShowFullPathInTitleBar(
|
||||
fShowFullPathInTitleBarCheckBox->Value() == 1);
|
||||
tracker->SendNotices(kWindowsShowFullPathChanged);
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
break;
|
||||
|
||||
case kSingleWindowBrowseChanged:
|
||||
settings.SetSingleWindowBrowse(fSingleWindowBrowseCheckBox->Value() == 1);
|
||||
settings.SetSingleWindowBrowse(
|
||||
fSingleWindowBrowseCheckBox->Value() == 1);
|
||||
if (fSingleWindowBrowseCheckBox->Value() == 0) {
|
||||
fShowNavigatorCheckBox->SetEnabled(false);
|
||||
settings.SetShowNavigator(0);
|
||||
} else {
|
||||
fShowNavigatorCheckBox->SetEnabled(true);
|
||||
settings.SetShowNavigator(fShowNavigatorCheckBox->Value() != 0);
|
||||
settings.SetShowNavigator(
|
||||
fShowNavigatorCheckBox->Value() != 0);
|
||||
}
|
||||
tracker->SendNotices(kShowNavigatorChanged);
|
||||
tracker->SendNotices(kSingleWindowBrowseChanged);
|
||||
@@ -516,10 +525,12 @@ WindowsSettingsView::MessageReceived(BMessage* message)
|
||||
|
||||
case kSortFolderNamesFirstChanged:
|
||||
{
|
||||
settings.SetSortFolderNamesFirst(fSortFolderNamesFirstCheckBox->Value() == 1);
|
||||
settings.SetSortFolderNamesFirst(
|
||||
fSortFolderNamesFirstCheckBox->Value() == 1);
|
||||
|
||||
// Make the notification message and send it to the tracker:
|
||||
send_bool_notices(kSortFolderNamesFirstChanged, "SortFolderNamesFirst",
|
||||
send_bool_notices(kSortFolderNamesFirstChanged,
|
||||
"SortFolderNamesFirst",
|
||||
fSortFolderNamesFirstCheckBox->Value() == 1);
|
||||
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
@@ -528,8 +539,10 @@ WindowsSettingsView::MessageReceived(BMessage* message)
|
||||
|
||||
case kTypeAheadFilteringChanged:
|
||||
{
|
||||
settings.SetTypeAheadFiltering(fTypeAheadFilteringCheckBox->Value() == 1);
|
||||
send_bool_notices(kTypeAheadFilteringChanged, "TypeAheadFiltering",
|
||||
settings.SetTypeAheadFiltering(
|
||||
fTypeAheadFilteringCheckBox->Value() == 1);
|
||||
send_bool_notices(kTypeAheadFilteringChanged,
|
||||
"TypeAheadFiltering",
|
||||
fTypeAheadFilteringCheckBox->Value() == 1);
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
break;
|
||||
@@ -653,7 +666,8 @@ WindowsSettingsView::ShowCurrentSettings()
|
||||
{
|
||||
TrackerSettings settings;
|
||||
|
||||
fShowFullPathInTitleBarCheckBox->SetValue(settings.ShowFullPathInTitleBar());
|
||||
fShowFullPathInTitleBarCheckBox->SetValue(
|
||||
settings.ShowFullPathInTitleBar());
|
||||
fSingleWindowBrowseCheckBox->SetValue(settings.SingleWindowBrowse());
|
||||
fShowNavigatorCheckBox->SetEnabled(settings.SingleWindowBrowse());
|
||||
fShowNavigatorCheckBox->SetValue(settings.ShowNavigator());
|
||||
@@ -722,9 +736,10 @@ SpaceBarSettingsView::SpaceBarSettingsView()
|
||||
BBox* box = new BBox("box");
|
||||
box->SetLabel(fColorPicker = new BMenuField("menu", NULL, menu));
|
||||
|
||||
fColorControl = new BColorControl(BPoint(8, fColorPicker->Bounds().Height()
|
||||
+ 8 + kItemExtraSpacing),
|
||||
B_CELLS_16x16, 1, "SpaceColorControl", new BMessage(kSpaceBarColorChanged));
|
||||
fColorControl = new BColorControl(BPoint(8,
|
||||
fColorPicker->Bounds().Height() + 8 + kItemExtraSpacing),
|
||||
B_CELLS_16x16, 1, "SpaceColorControl",
|
||||
new BMessage(kSpaceBarColorChanged));
|
||||
fColorControl->SetValue(TrackerSettings().UsedSpaceColor());
|
||||
box->AddChild(fColorControl);
|
||||
|
||||
@@ -767,7 +782,8 @@ SpaceBarSettingsView::MessageReceived(BMessage* message)
|
||||
switch (message->what) {
|
||||
case kUpdateVolumeSpaceBar:
|
||||
{
|
||||
settings.SetShowVolumeSpaceBar(fSpaceBarShowCheckBox->Value() == 1);
|
||||
settings.SetShowVolumeSpaceBar(
|
||||
fSpaceBarShowCheckBox->Value() == 1);
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
tracker->PostMessage(kShowVolumeSpaceBar);
|
||||
break;
|
||||
@@ -794,7 +810,8 @@ SpaceBarSettingsView::MessageReceived(BMessage* message)
|
||||
{
|
||||
rgb_color color = fColorControl->ValueAsColor();
|
||||
color.alpha = kSpaceBarAlpha;
|
||||
//alpha is ignored by BColorControl but is checked in equalities
|
||||
// alpha is ignored by BColorControl but is checked
|
||||
// in equalities
|
||||
|
||||
switch (fCurrentColor) {
|
||||
case 0:
|
||||
@@ -870,7 +887,8 @@ SpaceBarSettingsView::Revert()
|
||||
|
||||
if (settings.ShowVolumeSpaceBar() != fSpaceBarShow) {
|
||||
settings.SetShowVolumeSpaceBar(fSpaceBarShow);
|
||||
send_bool_notices(kShowVolumeSpaceBar, "ShowVolumeSpaceBar", fSpaceBarShow);
|
||||
send_bool_notices(kShowVolumeSpaceBar, "ShowVolumeSpaceBar",
|
||||
fSpaceBarShow);
|
||||
}
|
||||
|
||||
if (settings.UsedSpaceColor() != fUsedSpaceColor
|
||||
@@ -978,14 +996,16 @@ TrashSettingsView::MessageReceived(BMessage* message)
|
||||
|
||||
switch (message->what) {
|
||||
case kDontMoveFilesToTrashChanged:
|
||||
settings.SetDontMoveFilesToTrash(fDontMoveFilesToTrashCheckBox->Value() == 1);
|
||||
settings.SetDontMoveFilesToTrash(
|
||||
fDontMoveFilesToTrashCheckBox->Value() == 1);
|
||||
|
||||
tracker->SendNotices(kDontMoveFilesToTrashChanged);
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
break;
|
||||
|
||||
case kAskBeforeDeleteFileChanged:
|
||||
settings.SetAskBeforeDeleteFile(fAskBeforeDeleteFileCheckBox->Value() == 1);
|
||||
settings.SetAskBeforeDeleteFile(
|
||||
fAskBeforeDeleteFileCheckBox->Value() == 1);
|
||||
|
||||
tracker->SendNotices(kAskBeforeDeleteFileChanged);
|
||||
Window()->PostMessage(kSettingsContentsModified);
|
||||
@@ -1069,7 +1089,9 @@ TrashSettingsView::RecordRevertSettings()
|
||||
bool
|
||||
TrashSettingsView::IsRevertable() const
|
||||
{
|
||||
return fDontMoveFilesToTrash != (fDontMoveFilesToTrashCheckBox->Value() > 0)
|
||||
|| fAskBeforeDeleteFile != (fAskBeforeDeleteFileCheckBox->Value() > 0);
|
||||
return fDontMoveFilesToTrash
|
||||
!= (fDontMoveFilesToTrashCheckBox->Value() > 0)
|
||||
|| fAskBeforeDeleteFile
|
||||
!= (fAskBeforeDeleteFileCheckBox->Value() > 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -90,26 +90,26 @@ BSlowContextMenu::~BSlowContextMenu()
|
||||
void
|
||||
BSlowContextMenu::AttachedToWindow()
|
||||
{
|
||||
// showing flag is set immediately as
|
||||
// it may take a while to build the menu's
|
||||
// contents.
|
||||
// showing flag is set immediately as
|
||||
// it may take a while to build the menu's
|
||||
// contents.
|
||||
//
|
||||
// it should get set only once when Go is called
|
||||
// and will get reset in DetachedFromWindow
|
||||
// it should get set only once when Go is called
|
||||
// and will get reset in DetachedFromWindow
|
||||
//
|
||||
// this flag is used in ContainerWindow::ShowContextMenu
|
||||
// to determine whether we should show this menu, and
|
||||
// the only reason we need to do this is because this
|
||||
// menu is spawned ::Go as an asynchronous menu, which
|
||||
// is done because we will deadlock if the target's
|
||||
// window is open... so there
|
||||
// this flag is used in ContainerWindow::ShowContextMenu
|
||||
// to determine whether we should show this menu, and
|
||||
// the only reason we need to do this is because this
|
||||
// menu is spawned ::Go as an asynchronous menu, which
|
||||
// is done because we will deadlock if the target's
|
||||
// window is open... so there
|
||||
fIsShowing = true;
|
||||
|
||||
BPopUpMenu::AttachedToWindow();
|
||||
|
||||
SpringLoadedFolderSetMenuStates(this, fTypesList);
|
||||
|
||||
// allow an opportunity to reset the target for each of the items
|
||||
// allow an opportunity to reset the target for each of the items
|
||||
SetTargetForItems(Target());
|
||||
}
|
||||
|
||||
@@ -117,14 +117,14 @@ BSlowContextMenu::AttachedToWindow()
|
||||
void
|
||||
BSlowContextMenu::DetachedFromWindow()
|
||||
{
|
||||
// see note above in AttachedToWindow
|
||||
// see note above in AttachedToWindow
|
||||
fIsShowing = false;
|
||||
// does this need to set this to null?
|
||||
// the parent, handling dnd should set this
|
||||
// appropriately
|
||||
// does this need to set this to null?
|
||||
// the parent, handling dnd should set this
|
||||
// appropriately
|
||||
//
|
||||
// if this changes, BeMenu and RecentsMenu
|
||||
// in Deskbar should also change
|
||||
// if this changes, BeMenu and RecentsMenu
|
||||
// in Deskbar should also change
|
||||
fTypesList = NULL;
|
||||
}
|
||||
|
||||
@@ -462,8 +462,8 @@ BSlowContextMenu::BuildVolumeMenu()
|
||||
fMessenger, fParentWindow, fTypesList);
|
||||
|
||||
menu->SetNavDir(model->EntryRef());
|
||||
menu->InitTrackingHook(fTrackingHook.fTrackingHook, &(fTrackingHook.fTarget),
|
||||
fTrackingHook.fDragMessage);
|
||||
menu->InitTrackingHook(fTrackingHook.fTrackingHook,
|
||||
&(fTrackingHook.fTarget), fTrackingHook.fDragMessage);
|
||||
|
||||
ASSERT(menu->Name());
|
||||
|
||||
@@ -519,8 +519,8 @@ BSlowContextMenu::SetTarget(const BMessenger &target)
|
||||
|
||||
|
||||
TrackingHookData*
|
||||
BSlowContextMenu::InitTrackingHook(bool (*hook)(BMenu*, void*), const BMessenger* target,
|
||||
const BMessage* dragMessage)
|
||||
BSlowContextMenu::InitTrackingHook(bool (*hook)(BMenu*, void*),
|
||||
const BMessenger* target, const BMessage* dragMessage)
|
||||
{
|
||||
fTrackingHook.fTrackingHook = hook;
|
||||
if (target)
|
||||
@@ -532,7 +532,8 @@ BSlowContextMenu::InitTrackingHook(bool (*hook)(BMenu*, void*), const BMessenger
|
||||
|
||||
|
||||
void
|
||||
BSlowContextMenu::SetTrackingHookDeep(BMenu* menu, bool (*func)(BMenu*, void*), void* state)
|
||||
BSlowContextMenu::SetTrackingHookDeep(BMenu* menu,
|
||||
bool (*func)(BMenu*, void*), void* state)
|
||||
{
|
||||
menu->SetTrackingHook(func, state);
|
||||
int32 count = menu->CountItems();
|
||||
|
||||
@@ -63,8 +63,9 @@ public:
|
||||
void SetTypesList(const BObjectList<BString>* list);
|
||||
const BObjectList<BString>* TypesList() const;
|
||||
|
||||
static ModelMenuItem* NewModelItem(Model*, const BMessage*, const BMessenger&,
|
||||
bool suppressFolderHierarchy = false, BContainerWindow* = NULL,
|
||||
static ModelMenuItem* NewModelItem(Model*, const BMessage*,
|
||||
const BMessenger&, bool suppressFolderHierarchy = false,
|
||||
BContainerWindow* = NULL,
|
||||
const BObjectList<BString>* typeslist = NULL,
|
||||
TrackingHookData* hook = NULL);
|
||||
|
||||
|
||||
@@ -66,7 +66,8 @@ class BSlowMenu : public BMenu {
|
||||
|
||||
protected:
|
||||
virtual bool AddDynamicItem(add_state state);
|
||||
// this is the callback from BMenu, you shouldn't need to override this
|
||||
// this is the callback from BMenu, you shouldn't need to
|
||||
// override this
|
||||
|
||||
bool fMenuBuilt;
|
||||
};
|
||||
|
||||
@@ -315,8 +315,8 @@ BStatusWindow::RemoveStatusItem(thread_id thread)
|
||||
}
|
||||
|
||||
if (winner != NULL) {
|
||||
// The height by which the other views will have to be moved (in pixel
|
||||
// count).
|
||||
// The height by which the other views will have to be moved
|
||||
// (in pixel count).
|
||||
float height = winner->Bounds().Height() + 1;
|
||||
fViewList.RemoveItem(winner);
|
||||
winner->RemoveSelf();
|
||||
@@ -460,7 +460,8 @@ BStatusView::BStatusView(BRect bounds, thread_id thread, StatusWindowState type)
|
||||
break;
|
||||
|
||||
case kCreateLinkState:
|
||||
caption = B_TRANSLATE("Preparing to create links" B_UTF8_ELLIPSIS);
|
||||
caption = B_TRANSLATE("Preparing to create links"
|
||||
B_UTF8_ELLIPSIS);
|
||||
id = R_MoveStatusBitmap;
|
||||
break;
|
||||
|
||||
@@ -470,16 +471,19 @@ BStatusView::BStatusView(BRect bounds, thread_id thread, StatusWindowState type)
|
||||
break;
|
||||
|
||||
case kVolumeState:
|
||||
caption = B_TRANSLATE("Searching for disks to mount" B_UTF8_ELLIPSIS);
|
||||
caption = B_TRANSLATE("Searching for disks to mount"
|
||||
B_UTF8_ELLIPSIS);
|
||||
break;
|
||||
|
||||
case kDeleteState:
|
||||
caption = B_TRANSLATE("Preparing to delete items" B_UTF8_ELLIPSIS);
|
||||
caption = B_TRANSLATE("Preparing to delete items"
|
||||
B_UTF8_ELLIPSIS);
|
||||
id = R_TrashStatusBitmap;
|
||||
break;
|
||||
|
||||
case kRestoreFromTrashState:
|
||||
caption = B_TRANSLATE("Preparing to restore items" B_UTF8_ELLIPSIS);
|
||||
caption = B_TRANSLATE("Preparing to restore items"
|
||||
B_UTF8_ELLIPSIS);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -506,8 +510,10 @@ BStatusView::BStatusView(BRect bounds, thread_id thread, StatusWindowState type)
|
||||
+ fh.descent + f.top);
|
||||
}
|
||||
|
||||
if (id != 0)
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, id, &fBitmap);
|
||||
if (id != 0) {
|
||||
GetTrackerResources()->GetBitmapResource(B_MESSAGE_TYPE, id,
|
||||
&fBitmap);
|
||||
}
|
||||
|
||||
rect = Bounds();
|
||||
rect.left = rect.right - buttonWidth * 2 - 7;
|
||||
@@ -550,8 +556,8 @@ BStatusView::Init()
|
||||
fLastSpeedReferenceSize = 0;
|
||||
fEstimatedFinishReferenceSize = 0;
|
||||
|
||||
fProcessStartTime = fLastSpeedReferenceTime = fEstimatedFinishReferenceTime
|
||||
= system_time();
|
||||
fProcessStartTime = fLastSpeedReferenceTime
|
||||
= fEstimatedFinishReferenceTime = system_time();
|
||||
}
|
||||
|
||||
|
||||
@@ -580,11 +586,12 @@ BStatusView::InitStatus(int32 totalItems, off_t totalSize,
|
||||
|
||||
switch (fType) {
|
||||
case kCopyState:
|
||||
fStatusBar->Reset(B_TRANSLATE("Copying: "), buffer.String());
|
||||
fStatusBar->Reset(B_TRANSLATE("Copying: "), buffer.String());
|
||||
break;
|
||||
|
||||
case kCreateLinkState:
|
||||
fStatusBar->Reset(B_TRANSLATE("Creating links: "), buffer.String());
|
||||
fStatusBar->Reset(B_TRANSLATE("Creating links: "),
|
||||
buffer.String());
|
||||
break;
|
||||
|
||||
case kMoveState:
|
||||
@@ -592,7 +599,8 @@ BStatusView::InitStatus(int32 totalItems, off_t totalSize,
|
||||
break;
|
||||
|
||||
case kTrashState:
|
||||
fStatusBar->Reset(B_TRANSLATE("Emptying Trash" B_UTF8_ELLIPSIS " "),
|
||||
fStatusBar->Reset(
|
||||
B_TRANSLATE("Emptying Trash" B_UTF8_ELLIPSIS " "),
|
||||
buffer.String());
|
||||
break;
|
||||
|
||||
@@ -619,7 +627,8 @@ BStatusView::Draw(BRect updateRect)
|
||||
{
|
||||
if (fBitmap) {
|
||||
BPoint location;
|
||||
location.x = (fStatusBar->Frame().left - fBitmap->Bounds().Width()) / 2;
|
||||
location.x = (fStatusBar->Frame().left
|
||||
- fBitmap->Bounds().Width()) / 2;
|
||||
location.y = (Bounds().Height()- fBitmap->Bounds().Height()) / 2;
|
||||
DrawBitmap(fBitmap, location);
|
||||
}
|
||||
@@ -695,7 +704,8 @@ BStatusView::_DestinationString(float* _width)
|
||||
|
||||
|
||||
BString
|
||||
BStatusView::_StatusString(float availableSpace, float fontSize, float* _width)
|
||||
BStatusView::_StatusString(float availableSpace, float fontSize,
|
||||
float* _width)
|
||||
{
|
||||
BFont font;
|
||||
GetFont(&font);
|
||||
@@ -970,4 +980,3 @@ BStatusView::SetWasCanceled()
|
||||
{
|
||||
fWasCanceled = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,8 @@ DelayedTask::~DelayedTask()
|
||||
{
|
||||
}
|
||||
|
||||
OneShotDelayedTask::OneShotDelayedTask(FunctionObject* functor, bigtime_t delay)
|
||||
OneShotDelayedTask::OneShotDelayedTask(FunctionObject* functor,
|
||||
bigtime_t delay)
|
||||
: DelayedTask(delay),
|
||||
fFunctor(functor)
|
||||
{
|
||||
@@ -293,8 +294,9 @@ TaskLoop::RunWhenIdle(FunctionObjectWithResult<bool>* functor,
|
||||
class AccumulatedOneShotDelayedTask : public OneShotDelayedTask {
|
||||
// supports accumulating functors
|
||||
public:
|
||||
AccumulatedOneShotDelayedTask(AccumulatingFunctionObject* functor, bigtime_t delay,
|
||||
bigtime_t maxAccumulatingTime = 0, int32 maxAccumulateCount = 0)
|
||||
AccumulatedOneShotDelayedTask(AccumulatingFunctionObject* functor,
|
||||
bigtime_t delay, bigtime_t maxAccumulatingTime = 0,
|
||||
int32 maxAccumulateCount = 0)
|
||||
: OneShotDelayedTask(functor, delay),
|
||||
maxAccumulateCount(maxAccumulateCount),
|
||||
accumulateCount(1),
|
||||
@@ -308,19 +310,24 @@ public:
|
||||
// don't accumulate if too may accumulated already
|
||||
return false;
|
||||
|
||||
if (maxAccumulatingTime && system_time() > initialTime + maxAccumulatingTime)
|
||||
if (maxAccumulatingTime && system_time() > initialTime
|
||||
+ maxAccumulatingTime) {
|
||||
// don't accumulate if too late past initial task
|
||||
return false;
|
||||
}
|
||||
|
||||
return static_cast<AccumulatingFunctionObject*>(fFunctor)->CanAccumulate(accumulateThis);
|
||||
return static_cast<AccumulatingFunctionObject*>(fFunctor)->
|
||||
CanAccumulate(accumulateThis);
|
||||
}
|
||||
|
||||
virtual void Accumulate(AccumulatingFunctionObject* accumulateThis, bigtime_t delay)
|
||||
virtual void Accumulate(AccumulatingFunctionObject* accumulateThis,
|
||||
bigtime_t delay)
|
||||
{
|
||||
fRunAfter = system_time() + delay;
|
||||
// reset fRunAfter
|
||||
accumulateCount++;
|
||||
static_cast<AccumulatingFunctionObject*>(fFunctor)->Accumulate(accumulateThis);
|
||||
static_cast<AccumulatingFunctionObject*>(fFunctor)->
|
||||
Accumulate(accumulateThis);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -331,8 +338,8 @@ private:
|
||||
};
|
||||
|
||||
void
|
||||
TaskLoop::AccumulatedRunLater(AccumulatingFunctionObject* functor, bigtime_t delay,
|
||||
bigtime_t maxAccumulatingTime, int32 maxAccumulateCount)
|
||||
TaskLoop::AccumulatedRunLater(AccumulatingFunctionObject* functor,
|
||||
bigtime_t delay, bigtime_t maxAccumulatingTime, int32 maxAccumulateCount)
|
||||
{
|
||||
AutoLock<BLocker> autoLock(&fLock);
|
||||
if (!autoLock.IsLocked()) {
|
||||
@@ -351,8 +358,8 @@ TaskLoop::AccumulatedRunLater(AccumulatingFunctionObject* functor, bigtime_t del
|
||||
return;
|
||||
}
|
||||
}
|
||||
RunLater(new AccumulatedOneShotDelayedTask(functor, delay, maxAccumulatingTime,
|
||||
maxAccumulateCount));
|
||||
RunLater(new AccumulatedOneShotDelayedTask(functor, delay,
|
||||
maxAccumulatingTime, maxAccumulateCount));
|
||||
}
|
||||
|
||||
|
||||
@@ -479,8 +486,8 @@ StandAloneTaskLoop::StartPulsingIfNeeded()
|
||||
ASSERT(fLock.IsLocked());
|
||||
if (fScanThread < 0) {
|
||||
// no loop thread yet, spawn one
|
||||
fScanThread = spawn_thread(StandAloneTaskLoop::RunBinder, "TrackerTaskLoop",
|
||||
B_LOW_PRIORITY, this);
|
||||
fScanThread = spawn_thread(StandAloneTaskLoop::RunBinder,
|
||||
"TrackerTaskLoop", B_LOW_PRIORITY, this);
|
||||
resume_thread(fScanThread);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,8 +35,8 @@ All rights reserved.
|
||||
#define __TASK_LOOP__
|
||||
|
||||
|
||||
// Delayed Tasks, Periodic Delayed Tasks, Periodic Delayed Tasks with timeout,
|
||||
// Run when idle tasks, accumulating delayed tasks
|
||||
// Delayed Tasks, Periodic Delayed Tasks, Periodic Delayed Tasks with timeout,
|
||||
// Run when idle tasks, accumulating delayed tasks
|
||||
|
||||
|
||||
#include <Locker.h>
|
||||
@@ -47,7 +47,6 @@ All rights reserved.
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// Task flavors
|
||||
|
||||
class DelayedTask {
|
||||
@@ -110,8 +109,8 @@ protected:
|
||||
// until functor returns true
|
||||
class RunWhenIdleTask : public PeriodicDelayedTask {
|
||||
public:
|
||||
RunWhenIdleTask(FunctionObjectWithResult<bool>* functor, bigtime_t initialDelay,
|
||||
bigtime_t idleFor, bigtime_t heartBeat);
|
||||
RunWhenIdleTask(FunctionObjectWithResult<bool>* functor,
|
||||
bigtime_t initialDelay, bigtime_t idleFor, bigtime_t heartBeat);
|
||||
virtual ~RunWhenIdleTask();
|
||||
|
||||
virtual bool RunIfNeeded(bigtime_t currentTime);
|
||||
@@ -256,7 +255,6 @@ DelayedTask::RunAfterTime() const
|
||||
return fRunAfter;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
using namespace BPrivate;
|
||||
|
||||
@@ -168,7 +168,8 @@ TemplatesMenu::BuildMenu(bool addItems)
|
||||
BMessage* message = new BMessage(kNewEntryFromTemplate);
|
||||
message->AddRef("refs_template", &ref);
|
||||
message->AddString("name", fileName);
|
||||
AddItem(new IconMenuItem(fileName, message, &nodeInfo, B_MINI_ICON));
|
||||
AddItem(new IconMenuItem(fileName, message, &nodeInfo,
|
||||
B_MINI_ICON));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,8 @@ IconSpewer::DrawSomeNew()
|
||||
}
|
||||
|
||||
if (numDrawn) {
|
||||
sprintf(buffer, "average draw time %Ld us per icon", watch.ElapsedTime() / numDrawn);
|
||||
sprintf(buffer, "average draw time %Ld us per icon",
|
||||
watch.ElapsedTime() / numDrawn);
|
||||
view->DrawString(buffer, BPoint(20, bounds.bottom - 30));
|
||||
}
|
||||
|
||||
@@ -204,8 +205,9 @@ IconSpewer::DrawSomeNew()
|
||||
if (model.IsDirectory())
|
||||
entry.GetPath(¤tPath);
|
||||
|
||||
IconCache::sIconCache->Draw(&model, view, BPoint(column * (kIconSize + 2),
|
||||
row * (kIconSize + 2)), kNormalIcon, kIconSize, true);
|
||||
IconCache::sIconCache->Draw(&model, view,
|
||||
BPoint(column * (kIconSize + 2), row * (kIconSize + 2)),
|
||||
kNormalIcon, kIconSize, true);
|
||||
target->Unlock();
|
||||
numDrawn++;
|
||||
}
|
||||
@@ -239,7 +241,8 @@ IconSpewer::DrawSomeOld()
|
||||
view->DrawString(buffer, BPoint(20, bounds.bottom - 20));
|
||||
}
|
||||
if (numDrawn) {
|
||||
sprintf(buffer, "average draw time %Ld us per icon", watch.ElapsedTime() / numDrawn);
|
||||
sprintf(buffer, "average draw time %Ld us per icon",
|
||||
watch.ElapsedTime() / numDrawn);
|
||||
view->DrawString(buffer, BPoint(20, bounds.bottom - 30));
|
||||
}
|
||||
sprintf(buffer, "directory: %s", currentPath.Path());
|
||||
@@ -259,7 +262,8 @@ IconSpewer::DrawSomeOld()
|
||||
entry.GetPath(¤tPath);
|
||||
|
||||
BIconCache::LockIconCache();
|
||||
BIconCache* iconCache = BIconCache::GetIconCache(&model, kIconSize);
|
||||
BIconCache* iconCache
|
||||
= BIconCache::GetIconCache(&model, kIconSize);
|
||||
iconCache->Draw(view, BPoint(column * (kIconSize + 2),
|
||||
row * (kIconSize + 2)), B_NORMAL_ICON, kIconSize, true);
|
||||
BIconCache::UnlockIconCache();
|
||||
@@ -310,8 +314,8 @@ IconSpewer::NextRef()
|
||||
|
||||
|
||||
IconTestWindow::IconTestWindow()
|
||||
: BWindow(BRect(100, 100, 500, 600), "icon cache test", B_TITLED_WINDOW_LOOK,
|
||||
B_NORMAL_WINDOW_FEEL, 0),
|
||||
: BWindow(BRect(100, 100, 500, 600), "icon cache test",
|
||||
B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, 0),
|
||||
iconSpewer(modifiers() == 0)
|
||||
{
|
||||
iconSpewer.SetTarget(this);
|
||||
|
||||
@@ -91,7 +91,8 @@ BTextWidget::Compare(const BTextWidget& with, BPoseView* view) const
|
||||
const char*
|
||||
BTextWidget::Text(const BPoseView* view) const
|
||||
{
|
||||
StringAttributeText* textAttribute = dynamic_cast<StringAttributeText*>(fText);
|
||||
StringAttributeText* textAttribute
|
||||
= dynamic_cast<StringAttributeText*>(fText);
|
||||
if (textAttribute == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -146,7 +147,8 @@ BTextWidget::CalcRectCommon(BPoint poseLoc, const BColumn* column,
|
||||
break;
|
||||
|
||||
case B_ALIGN_CENTER:
|
||||
result.left = poseLoc.x + (column->Width() / 2) - (textWidth / 2);
|
||||
result.left = poseLoc.x + (column->Width() / 2)
|
||||
- (textWidth / 2);
|
||||
if (result.left < 0)
|
||||
result.left = 0;
|
||||
result.right = result.left + textWidth + 1;
|
||||
@@ -277,8 +279,8 @@ TextViewFilter(BMessage* message, BHandler**, BMessageFilter* filter)
|
||||
if (message->FindInt8("byte", (int8*)&key) != B_OK)
|
||||
return B_DISPATCH_MESSAGE;
|
||||
|
||||
BPoseView* poseView = dynamic_cast<BContainerWindow*>(filter->Looper())->
|
||||
PoseView();
|
||||
BPoseView* poseView = dynamic_cast<BContainerWindow*>(
|
||||
filter->Looper())->PoseView();
|
||||
|
||||
if (key == B_RETURN || key == B_ESCAPE) {
|
||||
poseView->CommitActivePose(key == B_RETURN);
|
||||
@@ -302,7 +304,8 @@ TextViewFilter(BMessage* message, BHandler**, BMessageFilter* filter)
|
||||
// find the text editing view
|
||||
BView* scrollView = poseView->FindView("BorderView");
|
||||
if (scrollView != NULL) {
|
||||
BTextView* textView = dynamic_cast<BTextView*>(scrollView->FindView("WidgetTextView"));
|
||||
BTextView* textView = dynamic_cast<BTextView*>(
|
||||
scrollView->FindView("WidgetTextView"));
|
||||
if (textView != NULL) {
|
||||
BRect rect = scrollView->Frame();
|
||||
|
||||
@@ -343,8 +346,8 @@ BTextWidget::StartEdit(BRect bounds, BPoseView* view, BPose* pose)
|
||||
|
||||
BFont font;
|
||||
view->GetFont(&font);
|
||||
BTextView* textView = new BTextView(rect, "WidgetTextView", textRect, &font, 0,
|
||||
B_FOLLOW_ALL, B_WILL_DRAW);
|
||||
BTextView* textView = new BTextView(rect, "WidgetTextView", textRect,
|
||||
&font, 0, B_FOLLOW_ALL, B_WILL_DRAW);
|
||||
|
||||
textView->SetWordWrap(false);
|
||||
DisallowMetaKeys(textView);
|
||||
@@ -375,8 +378,8 @@ BTextWidget::StartEdit(BRect bounds, BPoseView* view, BPose* pose)
|
||||
textView->MoveTo(rect.LeftTop());
|
||||
textView->ResizeTo(rect.Width(), rect.Height());
|
||||
|
||||
BScrollView* scrollView = new BScrollView("BorderView", textView, 0, 0, false,
|
||||
false, B_PLAIN_BORDER);
|
||||
BScrollView* scrollView = new BScrollView("BorderView", textView, 0, 0,
|
||||
false, false, B_PLAIN_BORDER);
|
||||
view->AddChild(scrollView);
|
||||
|
||||
// configure text view
|
||||
@@ -406,9 +409,10 @@ BTextWidget::StartEdit(BRect bounds, BPoseView* view, BPose* pose)
|
||||
|
||||
ASSERT(view->Window()); // how can I not have a Window here???
|
||||
|
||||
if (view->Window())
|
||||
if (view->Window()) {
|
||||
// force immediate redraw so TextView appears instantly
|
||||
view->Window()->UpdateIfNeeded();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -422,7 +426,8 @@ BTextWidget::StopEdit(bool saveChanges, BPoint poseLoc, BPoseView* view,
|
||||
if (!scrollView)
|
||||
return;
|
||||
|
||||
BTextView* textView = dynamic_cast<BTextView*>(scrollView->FindView("WidgetTextView"));
|
||||
BTextView* textView = dynamic_cast<BTextView*>(
|
||||
scrollView->FindView("WidgetTextView"));
|
||||
ASSERT(textView);
|
||||
if (!textView)
|
||||
return;
|
||||
@@ -454,8 +459,8 @@ BTextWidget::StopEdit(bool saveChanges, BPoint poseLoc, BPoseView* view,
|
||||
|
||||
|
||||
void
|
||||
BTextWidget::CheckAndUpdate(BPoint loc, const BColumn* column, BPoseView* view,
|
||||
bool visible)
|
||||
BTextWidget::CheckAndUpdate(BPoint loc, const BColumn* column,
|
||||
BPoseView* view, bool visible)
|
||||
{
|
||||
BRect oldRect;
|
||||
if (view->ViewMode() != kListMode)
|
||||
@@ -474,7 +479,8 @@ BTextWidget::CheckAndUpdate(BPoint loc, const BColumn* column, BPoseView* view,
|
||||
void
|
||||
BTextWidget::SelectAll(BPoseView* view)
|
||||
{
|
||||
BTextView* text = dynamic_cast<BTextView*>(view->FindView("WidgetTextView"));
|
||||
BTextView* text = dynamic_cast<BTextView*>(
|
||||
view->FindView("WidgetTextView"));
|
||||
if (text)
|
||||
text->SelectAll();
|
||||
}
|
||||
@@ -482,7 +488,8 @@ BTextWidget::SelectAll(BPoseView* view)
|
||||
|
||||
void
|
||||
BTextWidget::Draw(BRect eraseRect, BRect textRect, float, BPoseView* view,
|
||||
BView* drawView, bool selected, uint32 clipboardMode, BPoint offset, bool direct)
|
||||
BView* drawView, bool selected, uint32 clipboardMode, BPoint offset,
|
||||
bool direct)
|
||||
{
|
||||
textRect.OffsetBy(offset);
|
||||
|
||||
|
||||
@@ -52,7 +52,8 @@ public:
|
||||
void Draw(BRect widgetRect, BRect widgetTextRect, float width, BPoseView*,
|
||||
bool selected, uint32 clipboardMode);
|
||||
void Draw(BRect widgetRect, BRect widgetTextRect, float width, BPoseView*,
|
||||
BView* drawView, bool selected, uint32 clipboardMode, BPoint offset, bool direct);
|
||||
BView* drawView, bool selected, uint32 clipboardMode, BPoint offset,
|
||||
bool direct);
|
||||
// second call is used for offscreen drawing, where PoseView
|
||||
// and current drawing view are different
|
||||
|
||||
@@ -72,7 +73,8 @@ public:
|
||||
// we can invalidate properly
|
||||
|
||||
void StartEdit(BRect bounds, BPoseView*, BPose*);
|
||||
void StopEdit(bool saveChanges, BPoint loc, BPoseView*, BPose*, int32 index);
|
||||
void StopEdit(bool saveChanges, BPoint loc, BPoseView*, BPose*,
|
||||
int32 index);
|
||||
|
||||
void SelectAll(BPoseView* view);
|
||||
void CheckAndUpdate(BPoint, const BColumn*, BPoseView*, bool visible);
|
||||
|
||||
@@ -103,7 +103,8 @@ Thread::Run()
|
||||
|
||||
|
||||
void
|
||||
ThreadSequence::Launch(BObjectList<FunctionObject>* list, bool async, int32 priority)
|
||||
ThreadSequence::Launch(BObjectList<FunctionObject>* list, bool async,
|
||||
int32 priority)
|
||||
{
|
||||
if (!async) {
|
||||
// if not async, don't even create a thread, just do it right away
|
||||
@@ -113,7 +114,8 @@ ThreadSequence::Launch(BObjectList<FunctionObject>* list, bool async, int32 prio
|
||||
}
|
||||
|
||||
|
||||
ThreadSequence::ThreadSequence(BObjectList<FunctionObject>* list, int32 priority)
|
||||
ThreadSequence::ThreadSequence(BObjectList<FunctionObject>* list,
|
||||
int32 priority)
|
||||
: SimpleThread(priority),
|
||||
fFunctorList(list)
|
||||
{
|
||||
|
||||
@@ -95,9 +95,11 @@ private:
|
||||
|
||||
// would use SingleParamFunctionObjectWithResult, except mwcc won't handle this
|
||||
template <class Param1>
|
||||
class SingleParamFunctionObjectWorkaround : public FunctionObjectWithResult<status_t> {
|
||||
class SingleParamFunctionObjectWorkaround : public
|
||||
FunctionObjectWithResult<status_t> {
|
||||
public:
|
||||
SingleParamFunctionObjectWorkaround(status_t (*function)(Param1), Param1 param1)
|
||||
SingleParamFunctionObjectWorkaround(
|
||||
status_t (*function)(Param1), Param1 param1)
|
||||
: fFunction(function),
|
||||
fParam1(param1)
|
||||
{
|
||||
@@ -115,7 +117,8 @@ private:
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class SimpleMemberFunctionObjectWorkaround : public FunctionObjectWithResult<status_t> {
|
||||
class SimpleMemberFunctionObjectWorkaround : public
|
||||
FunctionObjectWithResult<status_t> {
|
||||
public:
|
||||
SimpleMemberFunctionObjectWorkaround(status_t (T::*function)(), T* onThis)
|
||||
: fFunction(function),
|
||||
@@ -135,7 +138,8 @@ private:
|
||||
|
||||
|
||||
template <class Param1, class Param2>
|
||||
class TwoParamFunctionObjectWorkaround : public FunctionObjectWithResult<status_t> {
|
||||
class TwoParamFunctionObjectWorkaround : public
|
||||
FunctionObjectWithResult<status_t> {
|
||||
public:
|
||||
TwoParamFunctionObjectWorkaround(status_t (*callThis)(Param1, Param2),
|
||||
Param1 param1, Param2 param2)
|
||||
@@ -158,9 +162,11 @@ private:
|
||||
|
||||
|
||||
template <class Param1, class Param2, class Param3>
|
||||
class ThreeParamFunctionObjectWorkaround : public FunctionObjectWithResult<status_t> {
|
||||
class ThreeParamFunctionObjectWorkaround : public
|
||||
FunctionObjectWithResult<status_t> {
|
||||
public:
|
||||
ThreeParamFunctionObjectWorkaround(status_t (*callThis)(Param1, Param2, Param3),
|
||||
ThreeParamFunctionObjectWorkaround(
|
||||
status_t (*callThis)(Param1, Param2, Param3),
|
||||
Param1 param1, Param2 param2, Param3 param3)
|
||||
: function(callThis),
|
||||
fParam1(param1),
|
||||
@@ -183,9 +189,11 @@ private:
|
||||
|
||||
|
||||
template <class Param1, class Param2, class Param3, class Param4>
|
||||
class FourParamFunctionObjectWorkaround : public FunctionObjectWithResult<status_t> {
|
||||
class FourParamFunctionObjectWorkaround : public
|
||||
FunctionObjectWithResult<status_t> {
|
||||
public:
|
||||
FourParamFunctionObjectWorkaround(status_t (*callThis)(Param1, Param2, Param3, Param4),
|
||||
FourParamFunctionObjectWorkaround(
|
||||
status_t (*callThis)(Param1, Param2, Param3, Param4),
|
||||
Param1 param1, Param2 param2, Param3 param3, Param4 param4)
|
||||
: function(callThis),
|
||||
fParam1(param1),
|
||||
@@ -267,7 +275,8 @@ template<class View>
|
||||
class MouseDownThread {
|
||||
public:
|
||||
static void TrackMouse(View* view, void (View::*)(BPoint),
|
||||
void (View::*)(BPoint, uint32) = 0, bigtime_t pressingPeriod = 100000);
|
||||
void (View::*)(BPoint, uint32) = 0,
|
||||
bigtime_t pressingPeriod = 100000);
|
||||
|
||||
protected:
|
||||
MouseDownThread(View* view, void (View::*)(BPoint),
|
||||
|
||||
@@ -109,7 +109,8 @@ BTitleView::BTitleView(BRect frame, BPoseView* view)
|
||||
fPreviouslyClickedColumnTitle(0),
|
||||
fTrackingState(NULL)
|
||||
{
|
||||
sTitleBackground = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 0.88f); // 216 -> 220
|
||||
sTitleBackground = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 0.88f);
|
||||
// 216 -> 220
|
||||
sDarkTitleBackground = tint_color(sTitleBackground, B_DARKEN_1_TINT);
|
||||
sShineColor = tint_color(sTitleBackground, B_LIGHTEN_MAX_TINT);
|
||||
sLightShadowColor = tint_color(sTitleBackground, B_DARKEN_2_TINT);
|
||||
@@ -210,9 +211,8 @@ BTitleView::Draw(BRect /*updateRect*/, bool useOffscreen, bool updateOnly,
|
||||
ASSERT(sOffscreen);
|
||||
BRect frame(bounds);
|
||||
frame.right += frame.left;
|
||||
// this is kind of messy way of avoiding being clipped by the ammount the
|
||||
// title is scrolled to the left
|
||||
// ToDo: fix this
|
||||
// ToDo: this is kind of messy way of avoiding being clipped
|
||||
// by the amount the title is scrolled to the left
|
||||
view = sOffscreen->BeginUsing(frame);
|
||||
view->SetOrigin(-bounds.left, 0);
|
||||
view->SetLowColor(LowColor());
|
||||
@@ -238,10 +238,12 @@ BTitleView::Draw(BRect /*updateRect*/, bool useOffscreen, bool updateOnly,
|
||||
|
||||
view->BeginLineArray(4);
|
||||
view->AddLine(bounds.LeftTop(), bounds.RightTop(), sShadowColor);
|
||||
view->AddLine(bounds.LeftBottom(), bounds.RightBottom(), sShadowColor);
|
||||
view->AddLine(bounds.LeftBottom(), bounds.RightBottom(),
|
||||
sShadowColor);
|
||||
// draw lighter gray and white inset lines
|
||||
bounds.InsetBy(0, 1);
|
||||
view->AddLine(bounds.LeftBottom(), bounds.RightBottom(), sLightShadowColor);
|
||||
view->AddLine(bounds.LeftBottom(), bounds.RightBottom(),
|
||||
sLightShadowColor);
|
||||
view->AddLine(bounds.LeftTop(), bounds.RightTop(), sShineColor);
|
||||
view->EndLineArray();
|
||||
}
|
||||
@@ -263,7 +265,8 @@ BTitleView::Draw(BRect /*updateRect*/, bool useOffscreen, bool updateOnly,
|
||||
bounds = Bounds();
|
||||
minx--;
|
||||
view->SetHighColor(sLightShadowColor);
|
||||
view->StrokeLine(BPoint(minx, bounds.top), BPoint(minx, bounds.bottom - 1));
|
||||
view->StrokeLine(BPoint(minx, bounds.top),
|
||||
BPoint(minx, bounds.bottom - 1));
|
||||
} else {
|
||||
// first and last shades before and after first column
|
||||
maxx++;
|
||||
@@ -277,8 +280,10 @@ BTitleView::Draw(BRect /*updateRect*/, bool useOffscreen, bool updateOnly,
|
||||
}
|
||||
|
||||
#if !(APP_SERVER_CLEARS_BACKGROUND)
|
||||
FillRect(BRect(bounds.left, bounds.top + 1, minx - 1, bounds.bottom - 1), B_SOLID_LOW);
|
||||
FillRect(BRect(maxx + 1, bounds.top + 1, bounds.right, bounds.bottom - 1), B_SOLID_LOW);
|
||||
FillRect(BRect(bounds.left, bounds.top + 1, minx - 1, bounds.bottom - 1),
|
||||
B_SOLID_LOW);
|
||||
FillRect(BRect(maxx + 1, bounds.top + 1, bounds.right, bounds.bottom - 1),
|
||||
B_SOLID_LOW);
|
||||
#endif
|
||||
|
||||
if (useOffscreen) {
|
||||
@@ -334,8 +339,10 @@ BTitleView::MouseDown(BPoint where)
|
||||
bool force = static_cast<bool>(buttons & B_TERTIARY_MOUSE_BUTTON);
|
||||
if (force || buttons & B_PRIMARY_MOUSE_BUTTON) {
|
||||
if (force || fPreviouslyClickedColumnTitle != 0) {
|
||||
if (force || system_time() - fPreviousLeftClickTime < doubleClickSpeed) {
|
||||
if (fPoseView->ResizeColumnToWidest(resizedTitle->Column())) {
|
||||
if (force || system_time() - fPreviousLeftClickTime
|
||||
< doubleClickSpeed) {
|
||||
if (fPoseView->
|
||||
ResizeColumnToWidest(resizedTitle->Column())) {
|
||||
Invalidate();
|
||||
return;
|
||||
}
|
||||
@@ -347,7 +354,8 @@ BTitleView::MouseDown(BPoint where)
|
||||
} else if (!title)
|
||||
return;
|
||||
|
||||
SetMouseEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS);
|
||||
SetMouseEventMask(B_POINTER_EVENTS,
|
||||
B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS);
|
||||
|
||||
// track the mouse
|
||||
if (resizedTitle) {
|
||||
@@ -467,7 +475,8 @@ BColumnTitle::InColumnResizeArea(BPoint where) const
|
||||
BRect
|
||||
BColumnTitle::Bounds() const
|
||||
{
|
||||
BRect bounds(fColumn->Offset() - kTitleColumnLeftExtraMargin, 0, 0, kTitleViewHeight);
|
||||
BRect bounds(fColumn->Offset() - kTitleColumnLeftExtraMargin, 0, 0,
|
||||
kTitleViewHeight);
|
||||
bounds.right = bounds.left + fColumn->Width() + kTitleColumnExtraMargin;
|
||||
|
||||
return bounds;
|
||||
@@ -512,7 +521,8 @@ BColumnTitle::Draw(BView* view, bool pressed)
|
||||
break;
|
||||
|
||||
case B_ALIGN_RIGHT:
|
||||
loc.x = bounds.right - resultingWidth - kTitleColumnRightExtraMargin;
|
||||
loc.x = bounds.right - resultingWidth
|
||||
- kTitleColumnRightExtraMargin;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -520,8 +530,10 @@ BColumnTitle::Draw(BView* view, bool pressed)
|
||||
view->DrawString(titleString.String(), loc);
|
||||
|
||||
// show sort columns
|
||||
bool secondary = (fColumn->AttrHash() == fParent->PoseView()->SecondarySort());
|
||||
if (secondary || (fColumn->AttrHash() == fParent->PoseView()->PrimarySort())) {
|
||||
bool secondary
|
||||
= (fColumn->AttrHash() == fParent->PoseView()->SecondarySort());
|
||||
if (secondary
|
||||
|| (fColumn->AttrHash() == fParent->PoseView()->PrimarySort())) {
|
||||
|
||||
BPoint center(loc.x - 6, roundf((bounds.top + bounds.bottom) / 2.0));
|
||||
BPoint triangle[3];
|
||||
@@ -539,10 +551,12 @@ BColumnTitle::Draw(BView* view, bool pressed)
|
||||
view->SetFlags(flags | B_SUBPIXEL_PRECISE);
|
||||
|
||||
if (secondary) {
|
||||
view->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 1.3));
|
||||
view->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
|
||||
1.3));
|
||||
view->FillTriangle(triangle[0], triangle[1], triangle[2]);
|
||||
} else {
|
||||
view->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 1.6));
|
||||
view->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
|
||||
1.6));
|
||||
view->FillTriangle(triangle[0], triangle[1], triangle[2]);
|
||||
}
|
||||
|
||||
@@ -626,7 +640,8 @@ ColumnResizeState::ColumnResizeState(BTitleView* view, BColumnTitle* title,
|
||||
BPoint where, bigtime_t pastClickTime)
|
||||
: ColumnTrackState(view, title, where, pastClickTime),
|
||||
fLastLineDrawPos(-1),
|
||||
fInitialTrackOffset((title->fColumn->Offset() + title->fColumn->Width()) - where.x)
|
||||
fInitialTrackOffset((title->fColumn->Offset() + title->fColumn->Width())
|
||||
- where.x)
|
||||
{
|
||||
DrawLine();
|
||||
}
|
||||
@@ -635,7 +650,8 @@ ColumnResizeState::ColumnResizeState(BTitleView* view, BColumnTitle* title,
|
||||
bool
|
||||
ColumnResizeState::ValueChanged(BPoint where)
|
||||
{
|
||||
float newWidth = where.x + fInitialTrackOffset - fTitle->fColumn->Offset();
|
||||
float newWidth = where.x + fInitialTrackOffset
|
||||
- fTitle->fColumn->Offset();
|
||||
if (newWidth < kMinColumnWidth)
|
||||
newWidth = kMinColumnWidth;
|
||||
|
||||
@@ -646,7 +662,8 @@ ColumnResizeState::ValueChanged(BPoint where)
|
||||
void
|
||||
ColumnResizeState::Moved(BPoint where, uint32)
|
||||
{
|
||||
float newWidth = where.x + fInitialTrackOffset - fTitle->fColumn->Offset();
|
||||
float newWidth = where.x + fInitialTrackOffset
|
||||
- fTitle->fColumn->Offset();
|
||||
if (newWidth < kMinColumnWidth)
|
||||
newWidth = kMinColumnWidth;
|
||||
|
||||
@@ -692,7 +709,8 @@ ColumnResizeState::DrawLine()
|
||||
fLastLineDrawPos = poseViewBounds.left;
|
||||
|
||||
// draw the line in the new location
|
||||
_DrawLine(poseView, poseViewBounds.LeftTop(), poseViewBounds.LeftBottom());
|
||||
_DrawLine(poseView, poseViewBounds.LeftTop(),
|
||||
poseViewBounds.LeftBottom());
|
||||
}
|
||||
|
||||
|
||||
@@ -740,7 +758,8 @@ ColumnDragState::Moved(BPoint where, uint32)
|
||||
? fTitleView->FindColumnTitle(where) : 0;
|
||||
BRect titleBoundsWithMargin(titleBounds);
|
||||
titleBoundsWithMargin.InsetBy(0, -kRemoveTitleMargin);
|
||||
bool inMarginRect = overTitleView || titleBoundsWithMargin.Contains(where);
|
||||
bool inMarginRect = overTitleView
|
||||
|| titleBoundsWithMargin.Contains(where);
|
||||
|
||||
bool drawOutline = false;
|
||||
bool undrawOutline = false;
|
||||
@@ -773,7 +792,8 @@ ColumnDragState::Moved(BPoint where, uint32)
|
||||
fColumnArchive.Seek(0, SEEK_SET);
|
||||
fTitle->Column()->ArchiveToStream(&fColumnArchive);
|
||||
fInitialMouseTrackOffset -= fTitle->Bounds().left;
|
||||
if (fTitleView->PoseView()->RemoveColumn(fTitle->Column(), false)) {
|
||||
if (fTitleView->PoseView()->RemoveColumn(fTitle->Column(),
|
||||
false)) {
|
||||
fTitle = 0;
|
||||
fTitleView->BeginRectTracking(rect);
|
||||
fTrackingRemovedColumn = true;
|
||||
@@ -783,8 +803,10 @@ ColumnDragState::Moved(BPoint where, uint32)
|
||||
// over a different column
|
||||
&& (overTitle->Bounds().left >= fTitle->Bounds().right
|
||||
// over the one to the right
|
||||
|| where.x < overTitle->Bounds().left + fTitle->Bounds().Width())){
|
||||
// over the one to the left, far enough to not snap right back
|
||||
|| where.x < overTitle->Bounds().left
|
||||
+ fTitle->Bounds().Width())) {
|
||||
// over the one to the left, far enough to not snap
|
||||
// right back
|
||||
|
||||
BColumn* column = fTitle->Column();
|
||||
fInitialMouseTrackOffset -= fTitle->Bounds().left;
|
||||
@@ -873,7 +895,8 @@ ColumnDragState::DrawOutline(float pos)
|
||||
{
|
||||
BRect outline(fTitle->Bounds());
|
||||
outline.OffsetBy(pos, 0);
|
||||
fTitleView->Draw(fTitleView->Bounds(), true, false, fTitle, _DrawOutline, outline);
|
||||
fTitleView->Draw(fTitleView->Bounds(), true, false, fTitle, _DrawOutline,
|
||||
outline);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+112
-83
@@ -160,8 +160,8 @@ InitIconPreloader()
|
||||
if (IconCache::sIconCache != NULL)
|
||||
return;
|
||||
|
||||
// only start the node preloader if its Tracker or the Deskbar itself - don't
|
||||
// start it for file panels
|
||||
// only start the node preloader if its Tracker or the Deskbar itself,
|
||||
// don't start it for file panels
|
||||
|
||||
bool preload = dynamic_cast<TTracker*>(be_app) != NULL;
|
||||
if (!preload) {
|
||||
@@ -171,8 +171,11 @@ InitIconPreloader()
|
||||
&& !strcmp(info.signature, kDeskbarSignature))
|
||||
preload = true;
|
||||
}
|
||||
if (preload)
|
||||
gPreloader = NodePreloader::InstallNodePreloader("NodePreloader", be_app);
|
||||
|
||||
if (preload) {
|
||||
gPreloader = NodePreloader::InstallNodePreloader("NodePreloader",
|
||||
be_app);
|
||||
}
|
||||
|
||||
IconCache::sIconCache = new IconCache();
|
||||
|
||||
@@ -245,7 +248,8 @@ TTracker::TTracker()
|
||||
SetMallocLeakChecking(true);
|
||||
#endif
|
||||
|
||||
//This is how often it should update the free space bar on the volume icons
|
||||
// This is how often it should update the free space bar on the
|
||||
// volume icons
|
||||
SetPulseRate(1000000);
|
||||
|
||||
gLaunchLooper = new LaunchLooper();
|
||||
@@ -302,25 +306,33 @@ TTracker::QuitRequested()
|
||||
BEntry entry;
|
||||
BPath path;
|
||||
const entry_ref* ref = window->TargetModel()->EntryRef();
|
||||
if (entry.SetTo(ref) == B_OK && entry.GetPath(&path) == B_OK) {
|
||||
int8 flags = window->IsMinimized() ? kOpenWindowMinimized : kOpenWindowNoFlags;
|
||||
uint32 deviceFlags = GetVolumeFlags(window->TargetModel());
|
||||
if (entry.SetTo(ref) == B_OK
|
||||
&& entry.GetPath(&path) == B_OK) {
|
||||
int8 flags = window->IsMinimized()
|
||||
? kOpenWindowMinimized : kOpenWindowNoFlags;
|
||||
uint32 deviceFlags
|
||||
= GetVolumeFlags(window->TargetModel());
|
||||
|
||||
// save state for every window which is
|
||||
// a) already open on another workspace
|
||||
// b) on a volume not capable of writing attributes
|
||||
if (window != FindContainerWindow(ref)
|
||||
|| (deviceFlags & (B_FS_HAS_ATTR | B_FS_IS_READONLY)) != B_FS_HAS_ATTR) {
|
||||
|| (deviceFlags
|
||||
& (B_FS_HAS_ATTR | B_FS_IS_READONLY))
|
||||
!= B_FS_HAS_ATTR) {
|
||||
BMessage stateMessage;
|
||||
window->SaveState(stateMessage);
|
||||
window->SetSaveStateEnabled(false);
|
||||
// This is to prevent its state to be saved to the node when closed.
|
||||
// This is to prevent its state to be saved
|
||||
// to the node when closed.
|
||||
message.AddMessage("window state", &stateMessage);
|
||||
flags |= kOpenWindowHasState;
|
||||
}
|
||||
const char* target;
|
||||
bool pathAlreadyExists = false;
|
||||
for (int32 index = 0;message.FindString("paths", index, &target) == B_OK;index++) {
|
||||
for (int32 index = 0;
|
||||
message.FindString("paths", index, &target)
|
||||
== B_OK; index++) {
|
||||
if (!strcmp(target,path.Path())) {
|
||||
pathAlreadyExists = true;
|
||||
break;
|
||||
@@ -345,7 +357,8 @@ TTracker::QuitRequested()
|
||||
size_t size = (size_t)message.FlattenedSize();
|
||||
char* buffer = new char[size];
|
||||
message.Flatten(buffer, (ssize_t)size);
|
||||
deskDir.WriteAttr(kAttrOpenWindows, B_MESSAGE_TYPE, 0, buffer, size);
|
||||
deskDir.WriteAttr(kAttrOpenWindows, B_MESSAGE_TYPE, 0, buffer,
|
||||
size);
|
||||
delete [] buffer;
|
||||
} else
|
||||
deskDir.RemoveAttr(kAttrOpenWindows);
|
||||
@@ -446,8 +459,8 @@ TTracker::MessageReceived(BMessage* message)
|
||||
// Someone (probably the deskbar) has requested a list of
|
||||
// mountable volumes.
|
||||
BMessage reply;
|
||||
AutoMounterLoop()->EachMountableItemAndFloppy(&AddMountableItemToMessage,
|
||||
&reply);
|
||||
AutoMounterLoop()->EachMountableItemAndFloppy(
|
||||
&AddMountableItemToMessage, &reply);
|
||||
message->SendReply(&reply);
|
||||
break;
|
||||
}
|
||||
@@ -550,7 +563,8 @@ TTracker::SetDefaultPrinter(const BMessage* message)
|
||||
if (count <= 0)
|
||||
return;
|
||||
|
||||
// will make the first item the default printer, disregards any other files
|
||||
// will make the first item the default printer, disregards any
|
||||
// other files
|
||||
entry_ref ref;
|
||||
ASSERT(message->FindRef("refs", 0, &ref) == B_OK);
|
||||
if (message->FindRef("refs", 0, &ref) != B_OK)
|
||||
@@ -610,10 +624,12 @@ TTracker::MoveRefsToTrash(const BMessage* message)
|
||||
|
||||
|
||||
template <class T, class FT>
|
||||
class EntryAndNodeDoSoonWithMessageFunctor : public FunctionObjectWithResult<bool> {
|
||||
class EntryAndNodeDoSoonWithMessageFunctor : public
|
||||
FunctionObjectWithResult<bool> {
|
||||
public:
|
||||
EntryAndNodeDoSoonWithMessageFunctor(FT func, T* target, const entry_ref* child,
|
||||
const node_ref* parent, const BMessage* message)
|
||||
EntryAndNodeDoSoonWithMessageFunctor(FT func, T* target,
|
||||
const entry_ref* child, const node_ref* parent,
|
||||
const BMessage* message)
|
||||
: fFunc(func),
|
||||
fTarget(target),
|
||||
fNode(*parent),
|
||||
@@ -625,8 +641,10 @@ public:
|
||||
}
|
||||
|
||||
virtual ~EntryAndNodeDoSoonWithMessageFunctor() {}
|
||||
virtual void operator()()
|
||||
{ result = (fTarget->*fFunc)(&fEntry, &fNode, fSendMessage ? &fMessage : NULL); }
|
||||
virtual void operator()() {
|
||||
result = (fTarget->*fFunc)(&fEntry, &fNode,
|
||||
fSendMessage ? &fMessage : NULL);
|
||||
}
|
||||
|
||||
protected:
|
||||
FT fFunc;
|
||||
@@ -651,8 +669,8 @@ TTracker::LaunchAndCloseParentIfOK(const entry_ref* launchThis,
|
||||
// synchronous launch, we are already in our own thread
|
||||
if (TrackerLaunch(&refsReceived, false) == B_OK) {
|
||||
// if launched fine, close parent window in a bit
|
||||
fTaskLoop->RunLater(NewMemberFunctionObject(&TTracker::CloseParent, this, *closeThis),
|
||||
1000000);
|
||||
fTaskLoop->RunLater(NewMemberFunctionObject(&TTracker::CloseParent,
|
||||
this, *closeThis), 1000000);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -674,15 +692,18 @@ TTracker::OpenRef(const entry_ref* ref, const node_ref* nodeToClose,
|
||||
model = new Model(ref, false);
|
||||
if (model->IsSymLink() && !model->LinkTo()) {
|
||||
model->GetPreferredAppForBrokenSymLink(brokenLinkPreferredApp);
|
||||
if (brokenLinkPreferredApp.Length() && brokenLinkPreferredApp != kTrackerSignature)
|
||||
if (brokenLinkPreferredApp.Length()
|
||||
&& brokenLinkPreferredApp != kTrackerSignature) {
|
||||
brokenLinkWithSpecificHandler = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!brokenLinkWithSpecificHandler) {
|
||||
delete model;
|
||||
BAlert* alert = new BAlert("",
|
||||
B_TRANSLATE("There was an error resolving the link."),
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
|
||||
B_TRANSLATE("Cancel"), 0, 0, B_WIDTH_AS_USUAL,
|
||||
B_WARNING_ALERT);
|
||||
alert->SetShortcut(0, B_ESCAPE);
|
||||
alert->Go();
|
||||
return result;
|
||||
@@ -715,7 +736,8 @@ TTracker::OpenRef(const entry_ref* ref, const node_ref* nodeToClose,
|
||||
|
||||
if (openAsContainer || selector == kRunOpenWithWindow) {
|
||||
// special case opening plain folders, queries or using open with
|
||||
OpenContainerWindow(model, 0, selector, kRestoreDecor); // window adopts model
|
||||
OpenContainerWindow(model, 0, selector, kRestoreDecor);
|
||||
// window adopts model
|
||||
if (nodeToClose)
|
||||
CloseParentWaitingForChildSoon(ref, nodeToClose);
|
||||
} else if (model->IsQueryTemplate()) {
|
||||
@@ -742,8 +764,9 @@ TTracker::OpenRef(const entry_ref* ref, const node_ref* nodeToClose,
|
||||
}
|
||||
refsReceived.AddRef("refs", ref);
|
||||
if (brokenLinkWithSpecificHandler)
|
||||
// This cruft is to support a hacky workaround for double-clicking
|
||||
// broken refs for cifs; should get fixed in R5
|
||||
// This cruft is to support a hacky workaround for
|
||||
// double-clicking broken refs for cifs; should get fixed
|
||||
// in R5
|
||||
LaunchBrokenLink(brokenLinkPreferredApp.String(), &refsReceived);
|
||||
else
|
||||
TrackerLaunch(&refsReceived, true);
|
||||
@@ -778,60 +801,62 @@ TTracker::RefsReceived(BMessage* message)
|
||||
break;
|
||||
|
||||
case kOpenWith:
|
||||
{
|
||||
// Open With resulted in passing refs and a handler,
|
||||
// open the files with the handling app
|
||||
message->RemoveName("handler");
|
||||
|
||||
// have to find out if handling app is the Tracker
|
||||
// if it is, just pass it to the active Tracker,
|
||||
// no matter which Tracker was chosen to handle the refs
|
||||
char signature[B_MIME_TYPE_LENGTH];
|
||||
signature[0] = '\0';
|
||||
{
|
||||
// Open With resulted in passing refs and a handler, open the files
|
||||
// with the handling app
|
||||
message->RemoveName("handler");
|
||||
|
||||
// have to find out if handling app is the Tracker
|
||||
// if it is, just pass it to the active Tracker, no matter which Tracker
|
||||
// was chosen to handle the refs
|
||||
char signature[B_MIME_TYPE_LENGTH];
|
||||
signature[0] = '\0';
|
||||
{
|
||||
BFile handlingNode(&handlingApp, O_RDONLY);
|
||||
BAppFileInfo appInfo(&handlingNode);
|
||||
appInfo.GetSignature(signature);
|
||||
}
|
||||
|
||||
if (strcasecmp(signature, kTrackerSignature) != 0) {
|
||||
// handling app not Tracker, pass entries to the apps RefsReceived
|
||||
TrackerLaunch(&handlingApp, message, true);
|
||||
break;
|
||||
}
|
||||
// fall thru, opening refs by the Tracker, as if they were double clicked
|
||||
BFile handlingNode(&handlingApp, O_RDONLY);
|
||||
BAppFileInfo appInfo(&handlingNode);
|
||||
appInfo.GetSignature(signature);
|
||||
}
|
||||
|
||||
case kOpen:
|
||||
{
|
||||
// copy over "Poses" messenger so that refs received recipients know
|
||||
// where the open came from
|
||||
BMessage* bundleThis = NULL;
|
||||
BMessenger messenger;
|
||||
if (message->FindMessenger("TrackerViewToken", &messenger) == B_OK) {
|
||||
bundleThis = new BMessage();
|
||||
bundleThis->AddMessenger("TrackerViewToken", messenger);
|
||||
}
|
||||
|
||||
for (int32 index = 0; index < count; index++) {
|
||||
entry_ref ref;
|
||||
message->FindRef("refs", index, &ref);
|
||||
|
||||
const node_ref* nodeToClose = NULL;
|
||||
const node_ref* nodeToSelect = NULL;
|
||||
ssize_t numBytes;
|
||||
|
||||
message->FindData("nodeRefsToClose", B_RAW_TYPE, index,
|
||||
(const void**)&nodeToClose, &numBytes);
|
||||
message->FindData("nodeRefToSelect", B_RAW_TYPE, index,
|
||||
(const void**)&nodeToSelect, &numBytes);
|
||||
|
||||
OpenRef(&ref, nodeToClose, nodeToSelect, selector, bundleThis);
|
||||
}
|
||||
|
||||
delete bundleThis;
|
||||
if (strcasecmp(signature, kTrackerSignature) != 0) {
|
||||
// handling app not Tracker, pass entries to the apps
|
||||
// RefsReceived
|
||||
TrackerLaunch(&handlingApp, message, true);
|
||||
break;
|
||||
}
|
||||
} // fall thru, opening refs by the Tracker as if they were
|
||||
// double-clicked
|
||||
case kOpen:
|
||||
{
|
||||
// copy over "Poses" messenger so that refs received
|
||||
// recipients know where the open came from
|
||||
BMessage* bundleThis = NULL;
|
||||
BMessenger messenger;
|
||||
if (message->FindMessenger("TrackerViewToken", &messenger)
|
||||
== B_OK) {
|
||||
bundleThis = new BMessage();
|
||||
bundleThis->AddMessenger("TrackerViewToken", messenger);
|
||||
}
|
||||
|
||||
for (int32 index = 0; index < count; index++) {
|
||||
entry_ref ref;
|
||||
message->FindRef("refs", index, &ref);
|
||||
|
||||
const node_ref* nodeToClose = NULL;
|
||||
const node_ref* nodeToSelect = NULL;
|
||||
ssize_t numBytes;
|
||||
|
||||
message->FindData("nodeRefsToClose", B_RAW_TYPE, index,
|
||||
(const void**)&nodeToClose, &numBytes);
|
||||
message->FindData("nodeRefToSelect", B_RAW_TYPE, index,
|
||||
(const void**)&nodeToSelect, &numBytes);
|
||||
|
||||
OpenRef(&ref, nodeToClose, nodeToSelect, selector,
|
||||
bundleThis);
|
||||
}
|
||||
|
||||
delete bundleThis;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1104,8 +1129,8 @@ TTracker::QueryActiveForDevice(dev_t device)
|
||||
void
|
||||
TTracker::CloseActiveQueryWindows(dev_t device)
|
||||
{
|
||||
// used when trying to unmount a volume - an active query would prevent that from
|
||||
// happening
|
||||
// used when trying to unmount a volume - an active query would prevent
|
||||
// that from happening
|
||||
bool closed = false;
|
||||
AutoLock<WindowList> lock(fWindowList);
|
||||
for (int32 index = fWindowList.CountItems(); index >= 0; index--) {
|
||||
@@ -1136,7 +1161,8 @@ TTracker::SaveAllPoseLocations()
|
||||
int32 numWindows = fWindowList.CountItems();
|
||||
for (int32 windowIndex = 0; windowIndex < numWindows; windowIndex++) {
|
||||
BContainerWindow* window
|
||||
= dynamic_cast<BContainerWindow*>(fWindowList.ItemAt(windowIndex));
|
||||
= dynamic_cast<BContainerWindow*>
|
||||
(fWindowList.ItemAt(windowIndex));
|
||||
|
||||
if (window) {
|
||||
AutoLock<BWindow> lock(window);
|
||||
@@ -1281,9 +1307,10 @@ TTracker::_OpenPreviouslyOpenedWindows(const char* pathFilter)
|
||||
BMessage state;
|
||||
bool restoreStateFromMessage = false;
|
||||
if ((flags & kOpenWindowHasState) != 0
|
||||
&& message.FindMessage("window state", stateMessageCounter++,
|
||||
&state) == B_OK)
|
||||
&& message.FindMessage("window state",
|
||||
stateMessageCounter++, &state) == B_OK) {
|
||||
restoreStateFromMessage = true;
|
||||
}
|
||||
|
||||
if (restoreStateFromMessage) {
|
||||
OpenContainerWindow(model, 0, kOpen, kRestoreWorkspace
|
||||
@@ -1356,7 +1383,8 @@ TTracker::ReadyToRun()
|
||||
message.AddInt32("opcode", B_ENTRY_CREATED);
|
||||
message.AddInt32("device", model.NodeRef()->device);
|
||||
message.AddInt64("node", model.NodeRef()->node);
|
||||
message.AddInt64("directory", model.EntryRef()->directory);
|
||||
message.AddInt64("directory",
|
||||
model.EntryRef()->directory);
|
||||
message.AddString("name", model.EntryRef()->name);
|
||||
deskWindow->PostMessage(&message, deskWindow->PoseView());
|
||||
}
|
||||
@@ -1426,9 +1454,10 @@ TTracker::CloseParentWaitingForChild(const entry_ref* child,
|
||||
AutoLock<WindowList> lock(&fWindowList);
|
||||
|
||||
BContainerWindow* parentWindow = FindContainerWindow(parent);
|
||||
if (!parentWindow)
|
||||
if (!parentWindow) {
|
||||
// parent window already closed, give up
|
||||
return true;
|
||||
}
|
||||
|
||||
// If child is a symbolic link, dereference it, so that
|
||||
// FindContainerWindow will succeed.
|
||||
|
||||
+14
-10
@@ -137,8 +137,10 @@ class TTracker : public BApplication {
|
||||
|
||||
void ShowSettingsWindow();
|
||||
|
||||
BContainerWindow* FindContainerWindow(const node_ref*, int32 number = 0) const;
|
||||
BContainerWindow* FindContainerWindow(const entry_ref*, int32 number = 0) const;
|
||||
BContainerWindow* FindContainerWindow(const node_ref*,
|
||||
int32 number = 0) const;
|
||||
BContainerWindow* FindContainerWindow(const entry_ref*,
|
||||
int32 number = 0) const;
|
||||
BContainerWindow* FindParentContainerWindow(const entry_ref*) const;
|
||||
// right now works just on plain windows, not on query windows
|
||||
|
||||
@@ -176,12 +178,12 @@ class TTracker : public BApplication {
|
||||
bool InstallMimeIfNeeded(const char* type, int32 bitsID,
|
||||
const char* shortDescription, const char* longDescription,
|
||||
const char* preferredAppSignature, uint32 forceMask = 0);
|
||||
// used by InitMimeTypes - checks if a metamime of a given <type> is
|
||||
// installed and if it has all the specified attributes; if not, the
|
||||
// whole mime type is installed and all attributes are set; nulls can
|
||||
// be passed for attributes that don't matter; returns true if anything
|
||||
// had to be changed
|
||||
// <forceMask> can be used to forcibly set a metamime attribute, even if it exists
|
||||
// used by InitMimeTypes - checks if a metamime of a given <type>
|
||||
// is installed and if it has all the specified attributes;
|
||||
// if not, the whole mime type is installed and all attributes
|
||||
// are set; nulls can be passed for attributes that don't matter;
|
||||
// returns true if anything had to be changed <forceMask> can be
|
||||
// used to forcibly set a metamime attribute, even if it exists
|
||||
|
||||
void InstallDefaultTemplates();
|
||||
void InstallTemporaryBackgroundImages();
|
||||
@@ -196,7 +198,8 @@ class TTracker : public BApplication {
|
||||
void MoveRefsToTrash(const BMessage*);
|
||||
void OpenContainerWindow(Model*, BMessage* refsList = NULL,
|
||||
OpenSelector openSelector = kOpen, uint32 openFlags = 0,
|
||||
bool checkAlreadyOpen = true, const BMessage* stateMessage = NULL);
|
||||
bool checkAlreadyOpen = true,
|
||||
const BMessage* stateMessage = NULL);
|
||||
// pass either a Model or a list of entries to open
|
||||
void _OpenPreviouslyOpenedWindows(const char* pathFilter = NULL);
|
||||
|
||||
@@ -208,7 +211,8 @@ class TTracker : public BApplication {
|
||||
BDeskWindow* GetDeskWindow() const;
|
||||
|
||||
status_t OpenRef(const entry_ref*, const node_ref* nodeToClose = NULL,
|
||||
const node_ref* nodeToSelect = NULL, OpenSelector selector = kOpen,
|
||||
const node_ref* nodeToSelect = NULL,
|
||||
OpenSelector selector = kOpen,
|
||||
const BMessage* messageToBundle = NULL);
|
||||
|
||||
MimeTypeList* fMimeTypeList;
|
||||
|
||||
@@ -94,15 +94,16 @@ const char* kPeopleSignature = "application/x-vnd.Be-PEPL";
|
||||
// the following templates are in big endian and we rely on the Tracker
|
||||
// translation support to swap them on little endian machines
|
||||
//
|
||||
// in case there is an attribute (B_RECT_TYPE) that gets swapped by the media (unzip,
|
||||
// file system endianness swapping, etc., the correct endianness for the
|
||||
// correct machine has to be used here
|
||||
// in case there is an attribute (B_RECT_TYPE) that gets swapped by the media
|
||||
// (unzip, file system endianness swapping, etc., the correct endianness for
|
||||
// the correct machine has to be used here
|
||||
|
||||
const BRect kDefaultFrame(40, 40, 695, 350);
|
||||
const int32 kDefaultQueryTemplateCount = 3;
|
||||
|
||||
const AttributeTemplate kDefaultQueryTemplate[] =
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_octet-stream */
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
|
||||
application_octet-stream */
|
||||
{
|
||||
{
|
||||
// default frame
|
||||
@@ -117,8 +118,8 @@ const AttributeTemplate kDefaultQueryTemplate[] =
|
||||
B_RAW_TYPE,
|
||||
49,
|
||||
"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
|
||||
"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000\000"
|
||||
"\000\000\000\000\000\000"
|
||||
"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000"
|
||||
"\000\000\000\000\000\000\000"
|
||||
},
|
||||
{
|
||||
// attr: _trk/columns
|
||||
@@ -138,7 +139,8 @@ const AttributeTemplate kDefaultQueryTemplate[] =
|
||||
};
|
||||
|
||||
const AttributeTemplate kBookmarkQueryTemplate[] =
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_x-vnd.Be-bookmark */
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
|
||||
application_x-vnd.Be-bookmark */
|
||||
{
|
||||
{
|
||||
// default frame
|
||||
@@ -163,16 +165,17 @@ const AttributeTemplate kBookmarkQueryTemplate[] =
|
||||
163,
|
||||
"O\362VR\000\000\000\025\000\000\000\005Title\000B \000\000C+\000\000"
|
||||
"\000\000\000\000\000\000\000\012META:title\000w\373\175RCSTR\000\001"
|
||||
"O\362VR\000\000\000\025\000\000\000\003URL\000Cb\000\000C\217\200\000"
|
||||
"\000\000\000\000\000\000\000\010META:url\000\343[TRCSTR\000\001O\362"
|
||||
"VR\000\000\000\025\000\000\000\010Keywords\000D\004\000\000C\002\000"
|
||||
"\000\000\000\000\000\000\000\000\011META:keyw\000\333\363\334RCSTR"
|
||||
"\000\001"
|
||||
"O\362VR\000\000\000\025\000\000\000\003URL\000Cb\000\000C\217\200"
|
||||
"\000\000\000\000\000\000\000\000\010META:url\000\343[TRCSTR\000\001O"
|
||||
"\362VR\000\000\000\025\000\000\000\010Keywords\000D\004\000\000C\002"
|
||||
"\000\000\000\000\000\000\000\000\000\011META:keyw\000\333\363\334"
|
||||
"RCSTR\000\001"
|
||||
}
|
||||
};
|
||||
|
||||
const AttributeTemplate kPersonQueryTemplate[] =
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_x-vnd.Be-bookmark */
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
|
||||
application_x-vnd.Be-bookmark */
|
||||
{
|
||||
{
|
||||
// default frame
|
||||
@@ -187,8 +190,8 @@ const AttributeTemplate kPersonQueryTemplate[] =
|
||||
B_RAW_TYPE,
|
||||
49,
|
||||
"o^\365R\000\000\000\012Tlst\000\000\000\000\000\000\000\000\000\000"
|
||||
"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000\000"
|
||||
"\000\000\000\000\000\000"
|
||||
"\000\000\000\000\000\000\000\000\000\000\357\323\335RCSTR\000\000"
|
||||
"\000\000\000\000\000\000\000"
|
||||
},
|
||||
{
|
||||
// attr: _trk/columns
|
||||
@@ -201,14 +204,15 @@ const AttributeTemplate kPersonQueryTemplate[] =
|
||||
"\000B\264\000\000\000\000\000\000\000\000\000\013META:wphone\000C_"
|
||||
"uRCSTR\000\001O\362VR\000\000\000\025\000\000\000\006E-mail\000C\211"
|
||||
"\200\000B\272\000\000\000\000\000\000\000\000\000\012META:email\000"
|
||||
"sW\337RCSTR\000\001O\362VR\000\000\000\025\000\000\000\007Company\000"
|
||||
"C\277\200\000B\360\000\000\000\000\000\000\000\000\000\014META:com"
|
||||
"pany\000CS\174RCSTR\000\001"
|
||||
"sW\337RCSTR\000\001O\362VR\000\000\000\025\000\000\000\007Company"
|
||||
"\000C\277\200\000B\360\000\000\000\000\000\000\000\000\000\014"
|
||||
"META:company\000CS\174RCSTR\000\001"
|
||||
},
|
||||
};
|
||||
|
||||
const AttributeTemplate kEmailQueryTemplate[] =
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/text_x-email */
|
||||
/* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
|
||||
text_x-email */
|
||||
{
|
||||
{
|
||||
// default frame
|
||||
@@ -231,15 +235,15 @@ const AttributeTemplate kEmailQueryTemplate[] =
|
||||
kAttrColumns_be,
|
||||
B_RAW_TYPE,
|
||||
222,
|
||||
"O\362VR\000\000\000\025\000\000\000\007Subject\000B \000\000B\334\000"
|
||||
"\000\000\000\000\000\000\000\000\014MAIL:subject\000\343\173\337RC"
|
||||
"STR\000\000O\362VR\000\000\000\025\000\000\000\004From\000C%\000\000"
|
||||
"C\031\000\000\000\000\000\000\000\000\000\011MAIL:from\000\317s_RC"
|
||||
"STR\000\000O\362VR\000\000\000\025\000\000\000\004When\000C\246\200"
|
||||
"\000B\360\000\000\000\000\000\000\000\000\000\011MAIL:when\000\366"
|
||||
"_\377ETIME\000\000O\362VR\000\000\000\025\000\000\000\006Status\000"
|
||||
"C\352\000\000BH\000\000\000\000\000\001\000\000\000\013MAIL:status"
|
||||
"\000G\363\134RCSTR\000\001"
|
||||
"O\362VR\000\000\000\025\000\000\000\007Subject\000B \000\000B\334"
|
||||
"\000\000\000\000\000\000\000\000\000\014MAIL:subject\000\343\173\337"
|
||||
"RCSTR\000\000O\362VR\000\000\000\025\000\000\000\004From\000C%\000"
|
||||
"\000C\031\000\000\000\000\000\000\000\000\000\011MAIL:from\000\317"
|
||||
"s_RCSTR\000\000O\362VR\000\000\000\025\000\000\000\004When\000C\246"
|
||||
"\200\000B\360\000\000\000\000\000\000\000\000\000\011MAIL:when\000"
|
||||
"\366_\377ETIME\000\000O\362VR\000\000\000\025\000\000\000\006Status"
|
||||
"\000C\352\000\000BH\000\000\000\000\000\001\000\000\000\013"
|
||||
"MAIL:status\000G\363\134RCSTR\000\001"
|
||||
},
|
||||
};
|
||||
|
||||
@@ -289,8 +293,10 @@ ExtraAttributeLazyInstaller::AddExtraAttribute(const char* publicName,
|
||||
{
|
||||
for (int32 index = 0; ; index++) {
|
||||
const char* oldPublicName;
|
||||
if (fExtraAttrs.FindString("attr:public_name", index, &oldPublicName) != B_OK)
|
||||
if (fExtraAttrs.FindString("attr:public_name", index, &oldPublicName)
|
||||
!= B_OK) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcmp(oldPublicName, publicName) == 0)
|
||||
// already got this extra atribute, no work left
|
||||
@@ -360,7 +366,8 @@ TTracker::InstallMimeIfNeeded(const char* type, int32 bitsID,
|
||||
// be passed for attributes that don't matter; returns true if anything
|
||||
// had to be changed
|
||||
|
||||
BBitmap vectorIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK, B_RGBA32);
|
||||
BBitmap vectorIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK,
|
||||
B_RGBA32);
|
||||
BBitmap largeIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK, B_CMAP8);
|
||||
BBitmap miniIcon(BRect(0, 0, 15, 15), B_BITMAP_NO_SERVER_LINK, B_CMAP8);
|
||||
char tmp[B_MIME_TYPE_LENGTH];
|
||||
@@ -447,12 +454,12 @@ TTracker::InitMimeTypes()
|
||||
// install a couple of extra fields for bookmark
|
||||
|
||||
ExtraAttributeLazyInstaller installer(B_BOOKMARK_MIMETYPE);
|
||||
installer.AddExtraAttribute("URL", "META:url", B_STRING_TYPE, true, true,
|
||||
170, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Keywords", "META:keyw", B_STRING_TYPE, true, true,
|
||||
130, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Title", "META:title", B_STRING_TYPE, true, true,
|
||||
130, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("URL", "META:url", B_STRING_TYPE,
|
||||
true, true, 170, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Keywords", "META:keyw", B_STRING_TYPE,
|
||||
true, true, 130, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Title", "META:title", B_STRING_TYPE,
|
||||
true, true, 130, B_ALIGN_LEFT, false);
|
||||
}
|
||||
|
||||
InstallMimeIfNeeded(B_PERSON_MIMETYPE, R_PersonIcon,
|
||||
@@ -460,34 +467,34 @@ TTracker::InitMimeTypes()
|
||||
|
||||
{
|
||||
ExtraAttributeLazyInstaller installer(B_PERSON_MIMETYPE);
|
||||
installer.AddExtraAttribute("Contact name", kAttrName, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Company", kAttrCompany, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Address", kAttrAddress, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("City", kAttrCity, B_STRING_TYPE, true, true,
|
||||
90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("State", kAttrState, B_STRING_TYPE, true, true,
|
||||
50, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Zip", kAttrZip, B_STRING_TYPE, true, true,
|
||||
50, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Country", kAttrCountry, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("E-mail", kAttrEmail, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Home phone", kAttrHomePhone, B_STRING_TYPE, true, true,
|
||||
90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Work phone", kAttrWorkPhone, B_STRING_TYPE, true, true,
|
||||
90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Fax", kAttrFax, B_STRING_TYPE, true, true,
|
||||
90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("URL", kAttrURL, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Group", kAttrGroup, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Nickname", kAttrNickname, B_STRING_TYPE, true, true,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Contact name", kAttrName, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Company", kAttrCompany, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Address", kAttrAddress, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("City", kAttrCity, B_STRING_TYPE,
|
||||
true, true, 90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("State", kAttrState, B_STRING_TYPE,
|
||||
true, true, 50, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Zip", kAttrZip, B_STRING_TYPE,
|
||||
true, true, 50, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Country", kAttrCountry, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("E-mail", kAttrEmail, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Home phone", kAttrHomePhone,
|
||||
B_STRING_TYPE, true, true, 90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Work phone", kAttrWorkPhone,
|
||||
B_STRING_TYPE, true, true, 90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Fax", kAttrFax, B_STRING_TYPE,
|
||||
true, true, 90, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("URL", kAttrURL, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Group", kAttrGroup, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Nickname", kAttrNickname, B_STRING_TYPE,
|
||||
true, true, 120, B_ALIGN_LEFT, false);
|
||||
}
|
||||
|
||||
InstallMimeIfNeeded(B_PRINTER_SPOOL_MIMETYPE, R_SpoolFileIcon,
|
||||
@@ -496,43 +503,49 @@ TTracker::InitMimeTypes()
|
||||
{
|
||||
#if B_BEOS_VERSION_DANO
|
||||
ExtraAttributeLazyInstaller installer(B_PRINTER_SPOOL_MIMETYPE);
|
||||
installer.AddExtraAttribute("Status", PSRV_SPOOL_ATTR_STATUS, B_STRING_TYPE, true, false,
|
||||
60, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Page count", PSRV_SPOOL_ATTR_PAGECOUNT, B_INT32_TYPE, true, false,
|
||||
40, B_ALIGN_RIGHT, false);
|
||||
installer.AddExtraAttribute("Description", PSRV_SPOOL_ATTR_DESCRIPTION, B_STRING_TYPE, true, true,
|
||||
100, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Printer name", PSRV_SPOOL_ATTR_PRINTER, B_STRING_TYPE, true, false,
|
||||
80, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Job creator type", PSRV_SPOOL_ATTR_MIMETYPE, B_ASCII_TYPE, true, false,
|
||||
60, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Status", PSRV_SPOOL_ATTR_STATUS,
|
||||
B_STRING_TYPE, true, false, 60, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Page count", PSRV_SPOOL_ATTR_PAGECOUNT,
|
||||
B_INT32_TYPE, true, false, 40, B_ALIGN_RIGHT, false);
|
||||
installer.AddExtraAttribute("Description",
|
||||
PSRV_SPOOL_ATTR_DESCRIPTION, B_STRING_TYPE, true, true, 100,
|
||||
B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Printer name", PSRV_SPOOL_ATTR_PRINTER,
|
||||
B_STRING_TYPE, true, false, 80, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Job creator type",
|
||||
PSRV_SPOOL_ATTR_MIMETYPE, B_ASCII_TYPE, true, false, 60,
|
||||
B_ALIGN_LEFT, false);
|
||||
#else
|
||||
ExtraAttributeLazyInstaller installer(B_PRINTER_SPOOL_MIMETYPE);
|
||||
installer.AddExtraAttribute("Page count", "_spool/Page Count", B_INT32_TYPE, true, false,
|
||||
40, B_ALIGN_RIGHT, false);
|
||||
installer.AddExtraAttribute("Description", "_spool/Description", B_ASCII_TYPE, true, true,
|
||||
100, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Printer name", "_spool/Printer", B_ASCII_TYPE, true, false,
|
||||
80, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Job creator type", "_spool/MimeType", B_ASCII_TYPE, true, false,
|
||||
60, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Page count", "_spool/Page Count",
|
||||
B_INT32_TYPE, true, false, 40, B_ALIGN_RIGHT, false);
|
||||
installer.AddExtraAttribute("Description", "_spool/Description",
|
||||
B_ASCII_TYPE, true, true, 100, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Printer name", "_spool/Printer",
|
||||
B_ASCII_TYPE, true, false, 80, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Job creator type", "_spool/MimeType",
|
||||
B_ASCII_TYPE, true, false, 60, B_ALIGN_LEFT, false);
|
||||
#endif
|
||||
}
|
||||
|
||||
InstallMimeIfNeeded(B_PRINTER_MIMETYPE, R_GenericPrinterIcon,
|
||||
"Printer", "Printer queue.", kTrackerSignature /*application/x-vnd.Be-PRNT*/);
|
||||
"Printer", "Printer queue.", kTrackerSignature);
|
||||
// application/x-vnd.Be-PRNT
|
||||
// for now set tracker as a default handler for the printer because we
|
||||
// just want to open it as a folder
|
||||
#if B_BEOS_VERSION_DANO
|
||||
{
|
||||
ExtraAttributeLazyInstaller installer(B_PRINTER_MIMETYPE);
|
||||
installer.AddExtraAttribute("Driver", PSRV_PRINTER_ATTR_DRV_NAME, B_STRING_TYPE, true, false,
|
||||
120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Transport", PSRV_PRINTER_ATTR_TRANSPORT, B_STRING_TYPE, true, false,
|
||||
installer.AddExtraAttribute("Driver", PSRV_PRINTER_ATTR_DRV_NAME,
|
||||
B_STRING_TYPE, true, false, 120, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Transport",
|
||||
PSRV_PRINTER_ATTR_TRANSPORT, B_STRING_TYPE, true, false,
|
||||
60, B_ALIGN_RIGHT, false);
|
||||
installer.AddExtraAttribute("Connection", PSRV_PRINTER_ATTR_CNX, B_STRING_TYPE, true, false,
|
||||
installer.AddExtraAttribute("Connection",
|
||||
PSRV_PRINTER_ATTR_CNX, B_STRING_TYPE, true, false,
|
||||
40, B_ALIGN_LEFT, false);
|
||||
installer.AddExtraAttribute("Description", PSRV_PRINTER_ATTR_COMMENTS, B_STRING_TYPE, true, true,
|
||||
installer.AddExtraAttribute("Description",
|
||||
PSRV_PRINTER_ATTR_COMMENTS, B_STRING_TYPE, true, true,
|
||||
140, B_ALIGN_LEFT, false);
|
||||
}
|
||||
#endif
|
||||
@@ -570,36 +583,48 @@ TTracker::InstallDefaultTemplates()
|
||||
BString query(kQueryTemplates);
|
||||
query += "/application_octet-stream";
|
||||
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, false)) {
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, true)) {
|
||||
AttributeStreamFileNode fileNode(&node);
|
||||
AttributeStreamTemplateNode tmp(kDefaultQueryTemplate, 3);
|
||||
fileNode << tmp;
|
||||
}
|
||||
}
|
||||
|
||||
(query = kQueryTemplates) += "/application_x-vnd.Be-bookmark";
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, false)) {
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, true)) {
|
||||
AttributeStreamFileNode fileNode(&node);
|
||||
AttributeStreamTemplateNode tmp(kBookmarkQueryTemplate, 3);
|
||||
fileNode << tmp;
|
||||
}
|
||||
}
|
||||
|
||||
(query = kQueryTemplates) += "/application_x-person";
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, false)) {
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, true)) {
|
||||
AttributeStreamFileNode fileNode(&node);
|
||||
AttributeStreamTemplateNode tmp(kPersonQueryTemplate, 3);
|
||||
fileNode << tmp;
|
||||
}
|
||||
}
|
||||
|
||||
(query = kQueryTemplates) += "/text_x-email";
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
|
||||
if (!BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, false)) {
|
||||
if (BContainerWindow::DefaultStateSourceNode(query.String(),
|
||||
&node, true)) {
|
||||
AttributeStreamFileNode fileNode(&node);
|
||||
AttributeStreamTemplateNode tmp(kEmailQueryTemplate, 3);
|
||||
fileNode << tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -612,8 +637,8 @@ TTracker::InstallTemporaryBackgroundImages()
|
||||
status_t status = find_directory(B_SYSTEM_DATA_DIRECTORY, &path);
|
||||
if (status < B_OK) {
|
||||
// TODO: this error shouldn't be shown to the regular user
|
||||
BString errorMessage(B_TRANSLATE("At %func \nfind_directory() failed. "
|
||||
"\nReason: %error"));
|
||||
BString errorMessage(B_TRANSLATE("At %func \nfind_directory() "
|
||||
"failed. \nReason: %error"));
|
||||
errorMessage.ReplaceFirst("%func", __PRETTY_FUNCTION__);
|
||||
errorMessage.ReplaceFirst("%error", strerror(status));
|
||||
(new BAlert("AlertError", errorMessage.String(), B_TRANSLATE("OK"),
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user