#ifndef _POSE_VIEW_H
#define _POSE_VIEW_H
#include "AttributeStream.h"
#include "ContainerWindow.h"
#include "Model.h"
#include "PendingNodeMonitorCache.h"
#include "PoseList.h"
#include "TitleView.h"
#include "Utilities.h"
#include "ViewState.h"
#include <ColorConversion.h>
#include <Directory.h>
#include <FilePanel.h>
#include <HashSet.h>
#include <MessageRunner.h>
#include <String.h>
#include <ScrollBar.h>
#include <View.h>
#include <set>
class BRefFilter;
class BList;
namespace BPrivate {
class BCountView;
class BContainerWindow;
class EntryListBase;
class TScrollBar;
const uint32 kMiniIconMode = 'Tmic';
const uint32 kIconMode = 'Ticn';
const uint32 kListMode = 'Tlst';
const uint32 kCheckTypeahead = 'Tcty';
const uint32 kMsgMouseDragged = 'Mdrg';
const uint32 kMsgMouseLongDown = 'Mold';
class BPoseView : public BView {
public:
BPoseView(Model*, uint32 viewMode);
virtual ~BPoseView();
virtual void Init(AttributeStreamNode*);
virtual void Init(const BMessage&);
void InitCommon();
virtual void AdoptSystemColors();
virtual bool HasSystemColors() const;
virtual bool Represents(const node_ref*) const;
virtual bool Represents(const entry_ref*) const;
BContainerWindow* ContainerWindow() const;
const char* ViewStateAttributeName() const;
const char* ForeignViewStateAttributeName() const;
Model* TargetModel() const;
virtual bool IsFilePanel() const;
virtual bool IsDesktopView() const;
virtual void SaveState(AttributeStreamNode* node);
virtual void RestoreState(AttributeStreamNode*);
virtual void RestoreColumnState(AttributeStreamNode*);
void AddColumnList(BObjectList<BColumn>*list);
virtual void SaveColumnState(AttributeStreamNode*);
virtual void SavePoseLocations(BRect* frameIfDesktop = NULL);
void DisableSaveLocation();
virtual void SaveState(BMessage&) const;
virtual void RestoreState(const BMessage&);
virtual void RestoreColumnState(const BMessage&);
virtual void SaveColumnState(BMessage&) const;
bool StateNeedsSaving();
virtual void SetViewMode(uint32 mode);
uint32 ViewMode() const;
virtual void SwitchDir(const entry_ref*, AttributeStreamNode* node = NULL);
virtual void Refresh();
virtual void AttachedToWindow();
virtual void DetachedFromWindow();
virtual void Draw(BRect update_rect);
virtual void DrawAfterChildren(BRect update_rect);
virtual void KeyDown(const char*, int32);
virtual void MessageReceived(BMessage* message);
virtual void MakeFocus(bool = true);
virtual BSize MinSize();
virtual void MouseMoved(BPoint, uint32, const BMessage*);
virtual void MouseDown(BPoint where);
virtual void MouseUp(BPoint where);
virtual void MouseDragged(const BMessage*);
virtual void MouseLongDown(const BMessage*);
virtual void MouseIdle(const BMessage*);
virtual void Pulse();
virtual void ScrollTo(BPoint);
virtual void WindowActivated(bool active);
void SetMultipleSelection(bool);
void SetDragEnabled(bool);
void SetDropEnabled(bool);
void SetSelectionRectEnabled(bool);
void SetAlwaysAutoPlace(bool);
void SetSelectionChangedHook(bool);
void SetEnsurePosesVisible(bool);
void SetIconMapping(bool);
void SetAutoScroll(bool);
void SetPoseEditing(bool);
void UpdateIcon(BPose* pose);
virtual bool FSNotification(const BMessage*);
virtual void UpdateScrollRange();
virtual void SetScrollBarsTo(BPoint);
virtual void AddScrollBars();
BScrollBar* HScrollBar() const;
BScrollBar* VScrollBar() const ;
BCountView* CountView() const;
BTitleView* TitleView() const;
void DisableScrollBars();
void EnableScrollBars();
virtual void SortPoses();
void SetPrimarySort(uint32 attrHash);
void SetSecondarySort(uint32 attrHash);
void SetReverseSort(bool reverse);
uint32 PrimarySort() const;
uint32 PrimarySortType() const;
uint32 SecondarySort() const;
uint32 SecondarySortType() const;
bool ReverseSort() const;
void CheckPoseSortOrder(BPose*, int32 index);
void CheckPoseVisibility(BRect* = NULL);
font_height FontInfo() const;
float FontHeight() const;
float ListElemHeight() const;
float ListOffset() const;
void SetIconPoseHeight();
float IconPoseHeight() const;
uint32 UnscaledIconSizeInt() const;
uint32 IconSizeInt() const;
BSize IconSize() const;
BRect Extent() const;
BRect ListModeExtent() const;
BRect IconModeExtent() const;
void GetLayoutInfo(uint32 viewMode, BPoint* grid,
BPoint* offset) const;
int32 CountItems() const;
void UpdateCount();
bool WidgetTextOutline() const { return fWidgetTextOutline; };
void SetWidgetTextOutline(bool);
void ScrollView(int32 type);
void ColumnRedraw(BRect updateRect);
bool AddColumn(BColumn*, const BColumn* after = NULL);
bool RemoveColumn(BColumn* column, bool runAlert);
void MoveColumnTo(BColumn* src, BColumn* dest);
bool ResizeColumnToWidest(BColumn* column);
BPoint ResizeColumn(BColumn*, float, float* lastLineDrawPos = NULL,
void (*drawLineFunc)(BPoseView*, BPoint, BPoint) = 0,
void (*undrawLineFunc)(BPoseView*, BPoint, BPoint) = 0);
BColumn* ColumnAt(int32 index) const;
BColumn* ColumnFor(uint32 attribute_hash) const;
BColumn* FirstColumn() const;
BColumn* LastColumn() const;
int32 IndexOfColumn(const BColumn*) const;
int32 CountColumns() const;
float StartOffset() const;
int32 IndexOfPose(const BPose*) const;
BPose* PoseAtIndex(int32 index) const;
BPose* FindPose(BPoint where, int32* index = NULL) const;
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;
BPose* DeepFindPose(const node_ref* node, int32* index = NULL) const;
BPose* FirstVisiblePose(int32* _index = NULL) const;
BPose* LastVisiblePose(int32* _index = NULL) const;
void OpenInfoWindows();
void SetDefaultPrinter();
void IdentifySelection(bool force = false);
bool CanUnmountSelection();
void UnmountSelectedVolumes();
virtual void OpenParent();
virtual bool CanOpenParent();
virtual void OpenSelection(BPose* clicked_pose = NULL,
int32* index = NULL);
void OpenSelectionUsing(BPose* clicked_pose = NULL,
int32* index = NULL);
virtual void MoveSelectionTo(BPoint, BPoint, BContainerWindow*);
void DuplicateSelection(BPoint* dropStart = NULL,
BPoint* dropEnd = NULL);
virtual void MoveSelectionToTrash(bool selectNext = true);
virtual void DeleteSelection(bool selectNext = true, bool confirm = true);
virtual void MoveEntryToTrash(const entry_ref*,
bool selectNext = true);
void RestoreSelectionFromTrash(bool selectNext = true);
PoseList* SelectionList() const;
void SelectAll();
void InvertSelection();
int32 SelectMatchingEntries(const BMessage*);
void ShowSelectionWindow();
void ClearSelection();
void ShowSelection(bool);
void AddRemovePoseFromSelection(BPose* pose, int32 index,
bool select);
int32 CountSelected() const;
bool SelectedVolumeIsReadOnly() const;
bool TargetVolumeIsReadOnly() const;
bool CanEditName() const;
bool CanMoveToTrashOrDuplicate() const;
void SetSelectionHandler(BLooper* looper);
BStringList* MimeTypesInSelection();
void SelectPose(BPose*, int32 index, bool scrollIntoView = true);
void AddPoseToSelection(BPose*, int32 index,
bool scrollIntoView = true);
void RemovePoseFromSelection(BPose*);
void SelectPoseAtLocation(BPoint);
void SelectPoses(int32 start, int32 end);
void MoveOrChangePoseSelection(int32 to);
void ScrollIntoView(BPose* pose, int32 index);
void ScrollIntoView(BRect poseRect);
void SetActivePose(BPose*);
BPose* ActivePose() const;
void CommitActivePose(bool saveChanges = true);
static bool PoseVisible(const Model*, const PoseInfo*);
bool FrameForPose(BPose* targetPose, bool convert, BRect* poseRect);
bool CreateSymlinkPoseTarget(Model* symlink);
void ResetPosePlacementHint();
void PlaceFolder(const entry_ref*, const BMessage*);
inline bool HasPosesInClipboard();
inline void SetHasPosesInClipboard(bool hasPoses);
void SetPosesClipboardMode(uint32 clipboardMode);
void UpdatePosesClipboardModeFromClipboard(
BMessage* clipboardReport = NULL);
void SetRefFilter(BRefFilter*);
BRefFilter* RefFilter() const;
void AddMimeType(const char* mimeType);
const char* MimeTypeAt(int32 index);
int32 CountMimeTypes();
void RefreshMimeTypeList();
virtual bool HandleMessageDropped(BMessage*);
static bool HandleDropCommon(BMessage* dragMessage, Model* target, BPose*, BView* view,
BPoint dropPoint);
static bool CanHandleDragSelection(const Model* target, const BMessage* dragMessage,
bool ignoreTypes);
virtual void DragSelectedPoses(const BPose* pose, BPoint, uint32 buttons);
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 where = B_ORIGIN, bool pinToGrid = false);
bool UpdateDropTarget(BPoint, const BMessage*, bool trackingContextMenu);
void HiliteDropTarget(bool hiliteState);
static bool MenuTrackingHook(BMenu* menu, void* castToThis);
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier,
int32 form, const char* property);
virtual status_t GetSupportedSuites(BMessage*);
float StringWidth(const char*) const;
float StringWidth(const char*, int32) const;
void ShowBarberPole();
void HideBarberPole();
status_t DragStart(const BMessage*);
void DragStop();
inline bool IsDragging() const { return fDragMessage != NULL && fCachedTypesList != NULL; };
inline BMessage* DragMessage() const { return fDragMessage; };
inline bool WaitingForRefs() const { return fWaitingForRefs; };
void SetWaitingForRefs(bool waiting) { fWaitingForRefs = waiting; };
inline BStringList* CachedTypesList() const { return fCachedTypesList; };
inline bool ShowSelectionWhenInactive() const { return fShowSelectionWhenInactive; };
bool IsDrawingSelectionRect() const { return fIsDrawingSelectionRect; };
inline bool IsWatchingDateFormatChange() const { return fIsWatchingDateFormatChange; };
void StartWatchDateFormatChange();
void StopWatchDateFormatChange();
inline bool IsFiltering() const { return IsRefFiltering() || IsTypeAheadFiltering(); };
inline bool IsRefFiltering() const { return fRefFilter != NULL; };
inline bool IsTypeAheadFiltering() const { return fTypeAheadFiltering; };
void UpdateDateColumns(BMessage*);
virtual void AdaptToVolumeChange(BMessage*);
virtual void AdaptToDesktopIntegrationChange(BMessage*);
void SetTextWidgetToCheck(BTextWidget*, BTextWidget* = NULL);
BTextWidget* ActiveTextWidget() { return fActiveTextWidget; };
void SetActiveTextWidget(BTextWidget* w) { fActiveTextWidget = w; };
protected:
virtual void SetupDefaultColumnsIfNeeded();
virtual EntryListBase* InitDirentIterator(const entry_ref*);
virtual void ReturnDirentIterator(EntryListBase* iterator);
void Cleanup(bool doAll = false);
void NewFolder(const BMessage*);
void NewFileFromTemplate(const BMessage*);
void ShowContextMenu(BPoint);
virtual bool HandleScriptingMessage(BMessage* message);
bool SetProperty(BMessage* message, BMessage* specifier, int32 form,
const char* property, BMessage* reply);
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 CountProperty(BMessage*, int32, const char*, BMessage*);
bool DeleteProperty(BMessage*, int32, const char*, BMessage*);
void ClearPoses();
void ReadPoseInfo(Model*, PoseInfo*);
ExtendedPoseInfo* ReadExtendedPoseInfo(Model*);
void _CheckPoseSortOrder(PoseList* list, BPose*, int32 index);
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);
BPose* CreatePose(Model*, PoseInfo*, bool insertionSort = true, int32* index = NULL,
BRect* boundsPointer = NULL, bool forceDraw = true);
virtual void CreatePoses(Model**models, PoseInfo* poseInfoArray, int32 count,
BPose** resultingPoses, bool insertionSort = true, int32* lastPoseIndexPointer = 0,
BRect* boundsPointer = 0, bool forceDraw = false);
void CreateVolumePose(BVolume*);
virtual void CreateRootPose();
virtual void RemoveRootPose();
virtual bool AddPosesThreadValid(const entry_ref*) const;
virtual void AddPoses(Model* model = NULL);
virtual void AddVolumePoses();
virtual void RemoveVolumePoses();
virtual void ToggleDisksVolumes();
virtual bool IsVolumesRoot() const { return IsDesktopView(); };
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);
static void PoseHandleDeviceUnmounted(BPose* pose, Model* model, int32 index,
BPoseView* poseView, dev_t device);
static void RemoveNonBootDesktopModels(BPose*, Model* model, int32, BPoseView*, dev_t);
void CheckAutoPlacedPoses();
void PlacePose(BPose*, BRect&);
bool IsValidLocation(const BPose* pose);
bool IsValidLocation(const BRect& rect);
status_t GetDeskbarFrame(BRect* frame);
bool SlotOccupied(BRect poseRect, BRect viewBounds) const;
void NextSlot(BPose*, BRect&poseRect, BRect viewBounds);
void TrySettingPoseLocation(BNode* node, BPoint point);
BPoint PinToGrid(BPoint, BPoint grid, BPoint offset) const;
Model* FindZombie(const node_ref*, int32* index = 0);
BPose* ConvertZombieToPose(Model* zombie, int32 index);
BRect CalcPoseRect(const BPose*, int32 index, bool firstColumnOnly = false) const;
BRect CalcPoseRectIcon(const BPose*) const;
BRect CalcPoseRectList(const BPose*, int32 index, bool firstColumnOnly = false) const;
void DrawPose(BPose*, int32 index, bool fullDraw = true);
void DrawViewCommon(const BRect&updateRect);
int32 BSearchList(PoseList* poseList, const BPose*, int32* index, int32 oldIndex);
void InsertPoseAfter(BPose* pose, int32* index, int32 orientation, BRect* invalidRect);
void CloseGapInList(BRect* invalidRect);
int32 FirstIndexAtOrBelow(int32 y, bool constrainIndex = true) const;
void AddToVSList(BPose*);
int32 RemoveFromVSList(const BPose*);
BPose* FindNearbyPose(char arrow, int32* index);
BPose* FindBestMatch(int32* index);
BPose* FindNextMatch(int32* index, bool reverse = false);
virtual void StartWatching();
virtual void StopWatching();
status_t WatchNewNode(const node_ref* item);
static status_t WatchNewNode(const node_ref*, uint32, BMessenger);
virtual uint32 WatchNewNodeMask();
static bool EachItemInDraggedSelection(const BMessage* message,
bool (*)(BPose*, BPoseView*, void*), BPoseView* poseView, void* = NULL);
BRect GetDragRect(int32 poseIndex);
BBitmap* MakeDragBitmap(BRect dragRect, BPoint clickedPoint, int32 poseIndex, 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 status_t CreateClippingFile(BPoseView* poseView, BFile&result, char* resultingName,
BDirectory* directory, BMessage* message, const char* fallbackName,
bool setLocation = false, BPoint dropPoint = B_ORIGIN);
void OpenSelectionCommon(BPose*, int32*, bool);
static void LaunchAppWithSelection(Model*, const BMessage*, bool checkTypes = true);
virtual bool EntryMoved(const BMessage*);
virtual bool AttributeChanged(const BMessage*);
virtual bool NoticeMetaMimeChanged(const BMessage*);
virtual void MetaMimeChanged(const char*, const char*);
bool WasDoubleClick(const BPose*, BPoint where);
bool WasClickInPath(const BPose*, int32 index, BPoint where) const;
void SelectPoses(BRect, BList**);
void AddRemoveSelectionRange(BPoint where, bool extendSelection, BPose* pose);
void _BeginSelectionRect(const BPoint& point, bool extendSelection);
void _UpdateSelectionRect(const BPoint& point);
void _EndSelectionRect();
void SynchronousUpdate(BRect, bool clip = false);
void HandleAutoScroll();
bool CheckAutoScroll(BPoint mouseLoc, bool shouldScroll);
void RecalcExtent();
void AddToExtent(const BRect&);
void ClearExtent();
void RemoveFromExtent(const BRect&);
virtual void EditQueries();
void HandleAttrMenuItemSelected(BMessage*);
void TryUpdatingBrokenLinks();
void MapToNewIconMode(BPose*, BPoint oldGrid, BPoint oldOffset);
void ResetOrigin();
void PinPointToValidRange(BPoint&);
void FinishPendingScroll(float&listViewScrollBy, BRect bounds);
static status_t AddPosesTask(void*);
virtual void AddPosesCompleted();
bool IsValidAddPosesThread(thread_id) const;
void EnsurePoseUnselected(BPose* pose);
void RemoveFilteredPose(BPose* pose, int32 index);
void TypeAheadFilteringChanged();
void UpdateAfterFilterChange();
bool FilterPose(BPose* pose);
void StartTypeAheadFiltering();
void StopTypeAheadFiltering();
void ClearTypeAheadFiltering();
void RebuildFilteringPoseList();
PoseList* CurrentPoseList() 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, true>*, bool selectNext,
bool deleteDirectly);
void Delete(BObjectList<entry_ref, true>*, bool selectNext, bool confirm);
void Delete(const entry_ref& ref, bool selectNext, bool confirm);
void RestoreItemsFromTrash(BObjectList<entry_ref, true>*, bool selectNext);
void DoDelete();
void DoMoveToTrash();
void WatchParentOf(const entry_ref*);
void StopWatchingParentsOf(const entry_ref*);
void ExcludeTrashFromSelection();
private:
void DrawOpenAnimation(BRect);
void MoveSelectionOrEntryToTrash(const entry_ref* ref, bool selectNext);
protected:
struct node_ref_key {
node_ref_key() {}
node_ref_key(const node_ref& value) : value(value) {}
uint32 GetHashCode() const
{
return (uint32)value.device ^ (uint32)value.node;
}
node_ref_key operator=(const node_ref_key& other)
{
value = other.value;
return *this;
}
bool operator==(const node_ref_key& other) const
{
return (value == other.value);
}
bool operator!=(const node_ref_key& other) const
{
return (value != other.value);
}
node_ref value;
};
protected:
BViewState* fViewState;
BLooper* fSelectionHandler;
std::set<thread_id> fAddPosesThreads;
PoseList* fPoseList;
PendingNodeMonitorCache pendingNodeMonitorCache;
private:
TScrollBar* fHScrollBar;
BScrollBar* fVScrollBar;
Model* fModel;
BPose* fActivePose;
BRect fExtent;
PoseList* fFilteredPoseList;
PoseList* fVSPoseList;
PoseList* fSelectionList;
HashSet<node_ref_key> fInsertedNodes;
BStringList fMimeTypesInSelectionCache;
BObjectList<Model, true>* fZombieList;
BObjectList<BColumn, true>* fColumnList;
BStringList fMimeTypeList;
BObjectList<Model>* fBrokenLinks;
BCountView* fCountView;
float fListElemHeight;
float fListOffset;
float fIconPoseHeight;
BPose* fDropTarget;
BPose* fAlreadySelectedDropTarget;
BPoint fLastClickPoint;
int32 fLastClickButtons;
const BPose* fLastClickedPose;
BPoint fLastLeftTop;
BRect fLastExtent;
BTitleView* fTitleView;
BRefFilter* fRefFilter;
BPoint fGrid;
BPoint fOffset;
BPoint fHintLocation;
float fAutoScrollInc;
int32 fAutoScrollState;
const BPose* fSelectionPivotPose;
const BPose* fRealPivotPose;
BMessageRunner* fKeyRunner;
BMessage* fDragMessage;
BStringList* fCachedTypesList;
struct SelectionRectInfo {
SelectionRectInfo()
:
isDragging(false),
selection(NULL)
{
}
bool isDragging;
BRect rect;
BRect lastRect;
BPoint startPoint;
BPoint lastPoint;
BList* selection;
};
SelectionRectInfo fSelectionRectInfo;
BObjectList<BString, true> fFilterStrings;
int32 fLastFilterStringCount;
int32 fLastFilterStringLength;
BRect fStartFrame;
static float sFontHeight;
static font_height sFontInfo;
static BString sMatchString;
bigtime_t fLastKeyTime;
bigtime_t fLastDeskbarFrameCheckTime;
BRect fDeskbarFrame;
static OffscreenBitmap* sOffscreen;
BTextWidget* fTextWidgetToCheck;
BTextWidget* fActiveTextWidget;
private:
mutable uint32 fCachedIconSizeFrom;
mutable BSize fCachedIconSize;
typedef BView _inherited;
protected:
bool fStateNeedsSaving : 1;
bool fSavePoseLocations : 1;
bool fMultipleSelection : 1;
bool fDragEnabled : 1;
bool fDropEnabled : 1;
private:
bool fMimeTypeListIsDirty : 1;
bool fWidgetTextOutline : 1;
bool fTrackRightMouseUp : 1;
bool fTrackMouseUp : 1;
bool fSelectionVisible : 1;
bool fSelectionRectEnabled : 1;
bool fAlwaysAutoPlace : 1;
bool fAllowPoseEditing : 1;
bool fSelectionChangedHook : 1;
bool fOkToMapIcons : 1;
bool fEnsurePosesVisible : 1;
bool fShouldAutoScroll : 1;
bool fIsWatchingDateFormatChange : 1;
bool fHasPosesInClipboard : 1;
bool fCursorCheck : 1;
bool fTypeAheadFiltering : 1;
bool fShowSelectionWhenInactive : 1;
bool fIsDrawingSelectionRect : 1;
bool fTransparentSelection : 1;
bool fWaitingForRefs : 1;
};
class TScrollBar : public BScrollBar {
public:
TScrollBar(const char*, BView*, float, float);
void SetTitleView(BView*);
virtual void ValueChanged(float);
private:
BView* fTitleView;
typedef BScrollBar _inherited;
};
class TPoseViewFilter : public BMessageFilter {
public:
TPoseViewFilter(BPoseView* pose);
~TPoseViewFilter();
filter_result Filter(BMessage*, BHandler**);
private:
filter_result ObjectDropFilter(BMessage*, BHandler**);
BPoseView* fPoseView;
};
extern bool
ClearViewOriginOne(const char* name, uint32 type, off_t size, void* data,
void* params);
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::ListOffset() const
{
return fListOffset;
}
inline float
BPoseView::IconPoseHeight() const
{
return fIconPoseHeight;
}
inline uint32
BPoseView::UnscaledIconSizeInt() const
{
return fViewState->IconSize();
}
inline uint32
BPoseView::IconSizeInt() const
{
return IconSize().IntegerWidth() + 1;
}
inline PoseList*
BPoseView::SelectionList() const
{
return fSelectionList;
}
inline int32
BPoseView::CountSelected() const
{
return fSelectionList->CountItems();
}
inline BStringList*
BPoseView::MimeTypesInSelection()
{
return &fMimeTypesInSelectionCache;
}
inline BScrollBar*
BPoseView::HScrollBar() const
{
return fHScrollBar;
}
inline BScrollBar*
BPoseView::VScrollBar() const
{
return fVScrollBar;
}
inline BCountView*
BPoseView::CountView() const
{
return fCountView;
}
inline BTitleView*
BPoseView::TitleView() const
{
return fTitleView;
}
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::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::SetIconMapping(bool on)
{
fOkToMapIcons = on;
}
inline void
BPoseView::AddToExtent(const BRect&rect)
{
fExtent = fExtent | rect;
}
inline void
BPoseView::ClearExtent()
{
fExtent.Set(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN);
}
inline int32
BPoseView::CountColumns() const
{
return fColumnList->CountItems();
}
inline float
BPoseView::StartOffset() const
{
return fListOffset + ListIconSize() + kMiniIconSeparator + 1;
}
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
{
return CurrentPoseList()->CountItems();
}
inline void
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
TScrollBar::SetTitleView(BView* view)
{
fTitleView = view;
}
inline void
BPoseView::SetRefFilter(BRefFilter* filter)
{
fRefFilter = filter;
if (filter != NULL)
RebuildFilteringPoseList();
}
inline BRefFilter*
BPoseView::RefFilter() const
{
return fRefFilter;
}
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
{
return CurrentPoseList()->FindPose(entry, index);
}
inline bool
BPoseView::HasPosesInClipboard()
{
return fHasPosesInClipboard;
}
inline void
BPoseView::SetHasPosesInClipboard(bool hasPoses)
{
fHasPosesInClipboard = hasPoses;
}
inline PoseList*
BPoseView::CurrentPoseList() const
{
if (ViewMode() == kListMode)
return IsFiltering() ? fFilteredPoseList : fPoseList;
else
return fVSPoseList;
}
template<class Param1>
void
EachTextWidget(BPose* pose, BPoseView* poseView,
void (*func)(BTextWidget*, BPose*, BPoseView*, BColumn*, Param1), Param1 p1)
{
for (int32 index = 0; ;index++) {
BColumn* column = poseView->ColumnAt(index);
if (column == NULL)
break;
BTextWidget* widget = pose->WidgetFor(column->AttrHash());
if (widget != NULL)
(func)(widget, pose, poseView, column, p1);
}
}
template<class Param1, class Param2>
void
EachTextWidget(BPose* pose, BPoseView* poseView,
void (*func)(BTextWidget*, BPose*, BPoseView*, BColumn*,
Param1, Param2), Param1 p1, Param2 p2)
{
for (int32 index = 0; ;index++) {
BColumn* column = poseView->ColumnAt(index);
if (column == NULL)
break;
BTextWidget* widget = pose->WidgetFor(column->AttrHash());
if (widget != NULL)
(func)(widget, pose, poseView, column, p1, p2);
}
}
template<class Result, class Param1, class Param2>
Result
WhileEachTextWidget(BPose* pose, BPoseView* poseView,
Result (*func)(BTextWidget*, BPose*, BPoseView*, BColumn*,
Param1, Param2), Param1 p1, Param2 p2)
{
for (int32 index = 0; ;index++) {
BColumn* column = poseView->ColumnAt(index);
if (column == NULL)
break;
BTextWidget* widget = pose->WidgetFor(column->AttrHash());
if (widget != NULL) {
Result result = (func)(widget, pose, poseView, column, p1, p2);
if (result != 0)
return result;
}
}
return 0;
}
}
using namespace BPrivate;
#endif