#ifndef _TEXT_WIDGET_ATTRIBUTE_H
#define _TEXT_WIDGET_ATTRIBUTE_H
#include <DateFormat.h>
#include <String.h>
#include "TrackerSettings.h"
namespace BPrivate {
class Model;
class BPoseView;
class BColumn;
const uint32 kSizeType = 'kszt';
class WidgetAttributeText {
public:
WidgetAttributeText(const Model*, const BColumn*);
virtual ~WidgetAttributeText();
virtual bool CheckAttributeChanged() = 0;
bool CheckViewChanged(const BPoseView*);
virtual bool CheckSettingsChanged();
const char* FittingText(const BPoseView*);
virtual int Compare(WidgetAttributeText&, BPoseView* view) = 0;
static WidgetAttributeText* NewWidgetText(const Model*,
const BColumn*, const BPoseView*);
float Width(const BPoseView*);
float CurrentWidth() const;
virtual void SetupEditing(BTextView*);
virtual bool CommitEditedText(BTextView*) = 0;
virtual float PreferredWidth(const BPoseView*) const = 0;
static status_t AttrAsString(const Model* model, BString* result,
const char* attrName, int32 attrType, float width,
BView* view, int64* value = 0);
Model* TargetModel() const;
virtual bool IsEditable() const;
void SetDirty(bool);
protected:
static float TruncString(BString* result, const char* src,
int32 length, const BPoseView*, float width,
uint32 truncMode = B_TRUNCATE_MIDDLE);
static float TruncTime(BString* result, int64 src,
const BPoseView* view, float width);
static float TruncFileSize(BString* result, int64 src,
const BPoseView* view, float width);
virtual void FitValue(BString* result, const BPoseView*) = 0;
mutable Model* fModel;
const BColumn* fColumn;
float fOldWidth;
float fTruncatedWidth;
bool fDirty;
bool fValueIsDefined;
BString fText;
};
inline Model*
WidgetAttributeText::TargetModel() const
{
return fModel;
}
class StringAttributeText : public WidgetAttributeText {
public:
StringAttributeText(const Model*, const BColumn*);
virtual const char* ValueAsText(const BPoseView* view);
virtual bool CheckAttributeChanged();
virtual float PreferredWidth(const BPoseView*) const;
virtual bool CommitEditedText(BTextView*);
protected:
virtual bool CommitEditedTextFlavor(BTextView*) { return false; }
virtual void FitValue(BString* result, const BPoseView*);
virtual void ReadValue(BString* result) = 0;
virtual int Compare(WidgetAttributeText &, BPoseView* view);
BString fFullValueText;
bool fValueDirty;
};
class ScalarAttributeText : public WidgetAttributeText {
public:
ScalarAttributeText(const Model*, const BColumn*);
int64 Value();
virtual bool CheckAttributeChanged();
virtual float PreferredWidth(const BPoseView*) const;
virtual bool CommitEditedText(BTextView*) { return false; }
protected:
virtual int64 ReadValue() = 0;
virtual int Compare(WidgetAttributeText&, BPoseView* view);
int64 fValue;
bool fValueDirty;
};
union GenericValueStruct {
time_t time_tt;
off_t off_tt;
bool boolt;
int8 int8t;
uint8 uint8t;
int16 int16t;
int16 uint16t;
int32 int32t;
int32 uint32t;
int64 int64t;
int64 uint64t;
float floatt;
double doublet;
};
class GenericAttributeText : public StringAttributeText {
public:
GenericAttributeText(const Model* model, const BColumn* column);
virtual bool CheckAttributeChanged();
virtual float PreferredWidth(const BPoseView* view) const;
virtual int Compare(WidgetAttributeText& other, BPoseView* view);
virtual void SetupEditing(BTextView* view);
virtual bool CommitEditedText(BTextView* view);
virtual const char* ValueAsText(const BPoseView* view);
protected:
virtual bool CommitEditedTextFlavor(BTextView* view);
virtual void FitValue(BString* result, const BPoseView* view);
virtual void ReadValue(BString* result);
protected:
GenericValueStruct fValue;
};
class DurationAttributeText : public GenericAttributeText {
public:
DurationAttributeText(const Model* model, const BColumn* column);
private:
virtual void FitValue(BString* result, const BPoseView* view);
};
class CheckboxAttributeText : public GenericAttributeText {
public:
CheckboxAttributeText(const Model* model, const BColumn* column);
virtual void SetupEditing(BTextView* view);
private:
virtual void FitValue(BString* result, const BPoseView* view);
private:
BString fOnChar;
BString fOffChar;
};
class RatingAttributeText : public GenericAttributeText {
public:
RatingAttributeText(const Model* model, const BColumn* column);
virtual void SetupEditing(BTextView* view);
private:
virtual void FitValue(BString* result, const BPoseView* view);
private:
int32 fCount;
int32 fMax;
};
class TimeAttributeText : public ScalarAttributeText {
public:
TimeAttributeText(const Model*, const BColumn*);
protected:
virtual float PreferredWidth(const BPoseView*) const;
virtual void FitValue(BString* ratingString, const BPoseView* view);
virtual bool CheckSettingsChanged();
TrackerSettings fSettings;
bool fLastClockIs24;
DateOrder fLastDateOrder;
FormatSeparator fLastTimeFormatSeparator;
};
class PathAttributeText : public StringAttributeText {
public:
PathAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
class OriginalPathAttributeText : public StringAttributeText {
public:
OriginalPathAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
class KindAttributeText : public StringAttributeText {
public:
KindAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
class NameAttributeText : public StringAttributeText {
public:
NameAttributeText(const Model*, const BColumn*);
virtual void SetupEditing(BTextView*);
virtual void FitValue(BString* result, const BPoseView*);
virtual bool IsEditable() const;
static void SetSortFolderNamesFirst(bool);
protected:
virtual bool CommitEditedTextFlavor(BTextView*);
virtual int Compare(WidgetAttributeText&, BPoseView* view);
virtual void ReadValue(BString* result);
static bool sSortFolderNamesFirst;
};
class RealNameAttributeText : public NameAttributeText {
public:
RealNameAttributeText(const Model*, const BColumn*);
virtual void SetupEditing(BTextView*);
virtual void FitValue(BString* result, const BPoseView*);
static void SetSortFolderNamesFirst(bool);
protected:
virtual int Compare(WidgetAttributeText&, BPoseView* view);
virtual void ReadValue(BString* result);
static bool sSortFolderNamesFirst;
};
#ifdef OWNER_GROUP_ATTRIBUTES
class OwnerAttributeText : public StringAttributeText {
public:
OwnerAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
class GroupAttributeText : public StringAttributeText {
public:
GroupAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
#endif
class ModeAttributeText : public StringAttributeText {
public:
ModeAttributeText(const Model*, const BColumn*);
protected:
virtual void ReadValue(BString* result);
};
const int64 kUnknownSize = -1;
class SizeAttributeText : public ScalarAttributeText {
public:
SizeAttributeText(const Model*, const BColumn*);
protected:
virtual void FitValue(BString* result, const BPoseView*);
virtual int64 ReadValue();
virtual float PreferredWidth(const BPoseView*) const;
};
class CreationTimeAttributeText : public TimeAttributeText {
public:
CreationTimeAttributeText(const Model*, const BColumn*);
protected:
virtual int64 ReadValue();
};
class ModificationTimeAttributeText : public TimeAttributeText {
public:
ModificationTimeAttributeText(const Model*, const BColumn*);
protected:
virtual int64 ReadValue();
};
class OpenWithRelationAttributeText : public ScalarAttributeText {
public:
OpenWithRelationAttributeText(const Model*, const BColumn*,
const BPoseView*);
protected:
virtual void FitValue(BString* result, const BPoseView*);
virtual int64 ReadValue();
virtual float PreferredWidth(const BPoseView*) const;
const BPoseView* fPoseView;
BString fRelationText;
};
class VersionAttributeText : public StringAttributeText {
public:
VersionAttributeText(const Model*, const BColumn*, bool appVersion);
protected:
virtual void ReadValue(BString* result);
private:
bool fAppVersion;
};
class AppShortVersionAttributeText : public VersionAttributeText {
public:
AppShortVersionAttributeText(const Model* model,
const BColumn* column)
:
VersionAttributeText(model, column, true)
{
}
};
class SystemShortVersionAttributeText : public VersionAttributeText {
public:
SystemShortVersionAttributeText(const Model* model,
const BColumn* column)
:
VersionAttributeText(model, column, false)
{
}
};
}
extern status_t TimeFormat(BString &string, int32 index,
FormatSeparator format, DateOrder order, bool clockIs24Hour);
using namespace BPrivate;
#endif