Author: aldeck Date: 2010-10-23 22:14:02 +0200 (Sat, 23 Oct 2010) New Revision: 39086 Changeset: http://dev.haiku-os.org/changeset/39086 Added: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.h Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/ContainerWindow.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.h haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/FilePanelPriv.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Jamfile haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.h haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewController.h haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/TitleView.cpp haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Tracker.cpp Log: * Continue refactoring menu management by introducing a PoseViewListener mechanism. That i will most certainly use for the other controls but only the File menu uses it for now. * Consequently fixed updating bugs of the File menu that wouldn't change depending on the context (root, trash, dir in trash and printers dirs) and selection changes. The new File menu is now fully equipped to work in the root folder thus allowing to get rid of the VolumeWindow BContainerWindow variant (just need to finish the context menu part of VolumeWindow). Depending on where you started navigating in single window mode, Tracker was using either VolumeWindow or the generic BContainerWindow (which wasn't behaving correctly). Temporarily disabled the 'Open With...' submenu as there's a problem that i need to take care of and i want to commit the current working code. * Got rid of fSelectionChangedHook boolean and associated mess, it's useless as there's already an empty impl method in the base class. * Set explicit min width of the title view to 0.0 so that it plays well with layouting and the window's B_AUTO_UPDATE_SIZE_LIMITS. Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/ContainerWindow.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/ContainerWindow.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/ContainerWindow.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -799,13 +799,8 @@ fWindowContextMenu->SetFont(be_plain_font); AddWindowContextMenus(fWindowContextMenu); - // TODO: disabled until menu system rework - /*Controller()->MenuBar()->RemoveItem(Controller()->FileMenu()); - delete Controller()->FileMenu(); - ///Controller()->FileMenu() = new BMenu(B_TRANSLATE("File")); - Controller()->AddFileMenu(Controller()->FileMenu()); - Controller()->MenuBar()->AddItem(Controller()->FileMenu()); - + // TODO: disabled until menu system rework + /* Controller()->MenuBar()->RemoveItem(Controller()->WindowMenu()); delete Controller()->WindowMenu(); //Controller()->WindowMenu() = new BMenu(B_TRANSLATE("Window")); @@ -820,12 +815,13 @@ if (PoseView()->ViewMode() == kListMode) Controller()->ShowAttributeMenu();*/ - int32 selectCount = PoseView()->SelectionList()->CountItems(); + //int32 selectCount = PoseView()->SelectionList()->CountItems(); - SetupOpenWithMenu(Controller()->FileMenu()); - SetupMoveCopyMenus(selectCount - ? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL, - Controller()->FileMenu()); + // TODO review that + //SetupOpenWithMenu(Controller()->FileMenu()); + //SetupMoveCopyMenus(selectCount + // ? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL, + // Controller()->FileMenu()); } @@ -841,10 +837,10 @@ // create controls fPoseView = new BPoseView(fCreationModel, kListMode); fController = new PoseViewController(); - + Controller()->SetPoseView(fPoseView); Controller()->CreateControls(fCreationModel); - + // layout controls BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f) .Add(Controller()->MenuBar()) @@ -860,11 +856,11 @@ .SetInsets(0, 0, B_V_SCROLL_BAR_WIDTH, 0) // give space to the window's resize handle .End(); - + // deal with new unconfigured folders if (NeedsDefaultStateSetup()) SetUpDefaultState(); - + fMoveToItem = new BMenuItem(new BNavMenu(B_TRANSLATE("Move to"), kMoveSelectionTo, this)); fCopyToItem = new BMenuItem(new BNavMenu(B_TRANSLATE("Copy to"), @@ -885,7 +881,7 @@ // check window frame TODO: should be done after/in restorewindowstate Controller()->TitleView()->Reset(); - // TODO find a more elegant way for the titleview to get updates + // TODO just use PoseViewListener if (PoseView()->ViewMode() == kListMode) { Controller()->ShowAttributeMenu(); @@ -899,9 +895,13 @@ Controller()->SetControlVisible(Controller()->Navigator(), settings.ShowNavigator()); } + + // register some poseview listeners + fPoseView->AddListener(dynamic_cast<PoseViewListener*>(Controller()->FileMenu())); + // TODO avoid casting (still testing stuff) Controller()->TitleView()->Reset(); - // TODO look for a more robust way for the titleview to get updates + // TODO make TitleView a poseview listener if (fBackgroundImage && PoseView()->ViewMode() != kListMode) fBackgroundImage->Show(PoseView(), current_workspace()); @@ -1434,7 +1434,7 @@ // Update PoseView PoseView()->SwitchDir(&ref, opener.StreamNode()); - + if (wasInTrash ^ (PoseView()->TargetModel()->IsTrash() || PoseView()->TargetModel()->IsInTrash()) || isRoot != PoseView()->TargetModel()->IsRoot()) @@ -1546,7 +1546,6 @@ break; case kShowNavigatorChanged: - printf("kShowNavigatorChanged\n"); Controller()->SetControlVisible(Controller()->Navigator(), settings.ShowNavigator()); if (!IsPathWatchingEnabled() && settings.ShowNavigator()) @@ -1771,21 +1770,16 @@ // invoked - this would prevent Cut/Copy/Paste from working fPoseView->CommitActivePose(); + // TODO review that // File menu - int32 selectCount = PoseView()->SelectionList()->CountItems(); + //int32 selectCount = PoseView()->SelectionList()->CountItems(); + //SetupOpenWithMenu(Controller()->FileMenu()); + //SetupMoveCopyMenus(selectCount + // ? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL, Controller()->FileMenu()); - SetupOpenWithMenu(Controller()->FileMenu()); - SetupMoveCopyMenus(selectCount - ? PoseView()->SelectionList()->FirstItem()->TargetModel()->EntryRef() : NULL, Controller()->FileMenu()); - UpdateMenu(Controller()->MenuBar(), kMenuBarContext); fController->AttributeMenu()->MimeTypesChanged(); - - if (PoseView()->TargetModel()->IsPrintersDir()) { - EnableNamedMenuItem(Controller()->FileMenu(), B_TRANSLATE("Make active printer"), - selectCount == 1); - } } Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -13,6 +13,8 @@ #include <Catalog.h> #include <Locale.h> #include <MenuItem.h> +#include <Volume.h> +#include <VolumeRoster.h> #include "Attributes.h" #include "Commands.h" @@ -98,95 +100,175 @@ DefaultFileMenu::DefaultFileMenu(PoseViewController* controller) : - BMenu(B_TRANSLATE("File")) + BMenu(B_TRANSLATE("File")), + fController(controller) { - if (!controller->PoseView()->IsFilePanel()) { - AddItem(new BMenuItem(B_TRANSLATE("Find" B_UTF8_ELLIPSIS), + TargetModelChanged(); + SelectionChanged(); +} + + +void +DefaultFileMenu::TargetModelChanged() +{ + Model* model = fController->PoseView()->TargetModel(); + printf("DefaultFileMenu::TargetModelChanged() model = '%s'\n", model->Name()); + + // empty the menu + if (!IsHidden()) + Hide(); + RemoveItems(0, CountItems(), true); + + if (model->IsRoot()) { + AddItem(new BMenuItem(B_TRANSLATE("Find"B_UTF8_ELLIPSIS), new BMessage(kFindButton), 'F')); - } + AddSeparatorItem(); - Model* targetModel = controller->PoseView()->TargetModel(); + AddItem(new BMenuItem(B_TRANSLATE("Open"), + new BMessage(kOpenSelection), 'O')); + AddItem(new BMenuItem(B_TRANSLATE("Get info"), + new BMessage(kGetInfo), 'I')); + AddItem(new BMenuItem(B_TRANSLATE("Edit name"), + new BMessage(kEditItem), 'E')); - if (!targetModel->IsQuery() - && !targetModel->IsTrash() - && !targetModel->IsPrintersDir()) { + BMenuItem* item = new BMenuItem(B_TRANSLATE("Unmount"), + new BMessage(kUnmountVolume), 'U'); + item->SetEnabled(false); + AddItem(item); - if (!controller->PoseView()->IsFilePanel()) { - TemplatesMenu* templateMenu = new TemplatesMenu(controller->PoseView(), - B_TRANSLATE("New")); - AddItem(templateMenu); - templateMenu->SetTargetForItems(controller->PoseView()); - } else { - AddItem(new BMenuItem(B_TRANSLATE("New folder"), - new BMessage(kNewFolder), 'N')); + AddItem(new BMenuItem(B_TRANSLATE("Mount settings" B_UTF8_ELLIPSIS), + new BMessage(kRunAutomounterSettings))); + + AddSeparatorItem(); + AddItem(new BMenu(B_TRANSLATE("Add-ons"))); + SetTargetForItems(fController->PoseView()); + } else { + + if (!fController->PoseView()->IsFilePanel()) { + AddItem(new BMenuItem(B_TRANSLATE("Find" B_UTF8_ELLIPSIS), + new BMessage(kFindButton), 'F')); } - } - AddSeparatorItem(); - AddItem(new BMenuItem(B_TRANSLATE("Open"), - new BMessage(kOpenSelection), 'O')); - AddItem(new BMenuItem(B_TRANSLATE("Get info"), - new BMessage(kGetInfo), 'I')); - AddItem(new BMenuItem(B_TRANSLATE("Edit name"), - new BMessage(kEditItem), 'E')); + if (!model->IsQuery() + && !model->IsTrash() + && !model->IsPrintersDir()) { - if (targetModel->IsTrash() || targetModel->IsInTrash()) { - AddItem(new BMenuItem(B_TRANSLATE("Restore"), - new BMessage(kRestoreFromTrash))); - if (targetModel->IsTrash()) { - // add as first item in menu - AddItem(new BMenuItem(B_TRANSLATE("Empty Trash"), - new BMessage(kEmptyTrash)), 0); + if (!fController->PoseView()->IsFilePanel()) { + TemplatesMenu* templateMenu = new TemplatesMenu(fController->PoseView(), + B_TRANSLATE("New")); + AddItem(templateMenu); + templateMenu->SetTargetForItems(fController->PoseView()); + } else { + AddItem(new BMenuItem(B_TRANSLATE("New folder"), + new BMessage(kNewFolder), 'N')); + } + } + AddSeparatorItem(); + + AddItem(new BMenuItem(B_TRANSLATE("Open"), + new BMessage(kOpenSelection), 'O')); + AddItem(new BMenuItem(B_TRANSLATE("Get info"), + new BMessage(kGetInfo), 'I')); + AddItem(new BMenuItem(B_TRANSLATE("Edit name"), + new BMessage(kEditItem), 'E')); + + if (model->IsTrash() || model->IsInTrash()) { + AddItem(new BMenuItem(B_TRANSLATE("Restore"), + new BMessage(kRestoreFromTrash))); + if (model->IsTrash()) { + // add as first item in menu + AddItem(new BMenuItem(B_TRANSLATE("Empty Trash"), + new BMessage(kEmptyTrash)), 0); + AddItem(new BSeparatorItem(), 1); + } + } else if (model->IsPrintersDir()) { + AddItem(new BMenuItem(B_TRANSLATE("Add printer"B_UTF8_ELLIPSIS), + new BMessage(kAddPrinter), 'N'), 0); AddItem(new BSeparatorItem(), 1); + AddItem(new BMenuItem(B_TRANSLATE("Make active printer"), + new BMessage(kMakeActivePrinter))); + } else { + AddItem(new BMenuItem(B_TRANSLATE("Duplicate"), + new BMessage(kDuplicateSelection), 'D')); + + AddItem(new BMenuItem(TrackerSettings().DontMoveFilesToTrash() + ? B_TRANSLATE("Delete") : B_TRANSLATE("Move to Trash"), + new BMessage(kMoveToTrash), 'T')); + + AddSeparatorItem(); + + // The "Move To", "Copy To", "Create Link" menus are inserted + // at this place, have a look at: + // BContainerWindow::SetupMoveCopyMenus() } - } else if (targetModel->IsPrintersDir()) { - AddItem(new BMenuItem(B_TRANSLATE("Add printer"B_UTF8_ELLIPSIS), - new BMessage(kAddPrinter), 'N'), 0); - AddItem(new BSeparatorItem(), 1); - AddItem(new BMenuItem(B_TRANSLATE("Make active printer"), - new BMessage(kMakeActivePrinter))); - } else { - AddItem(new BMenuItem(B_TRANSLATE("Duplicate"), - new BMessage(kDuplicateSelection), 'D')); - AddItem(new BMenuItem(TrackerSettings().DontMoveFilesToTrash() - ? B_TRANSLATE("Delete") : B_TRANSLATE("Move to Trash"), - new BMessage(kMoveToTrash), 'T')); + BMenuItem *cutItem = NULL, *copyItem = NULL, *pasteItem = NULL; + if (!model->IsPrintersDir()) { + AddSeparatorItem(); - AddSeparatorItem(); + AddItem(cutItem = new BMenuItem(B_TRANSLATE("Cut"), + new BMessage(B_CUT), 'X')); + AddItem(copyItem = new BMenuItem(B_TRANSLATE("Copy"), + new BMessage(B_COPY), 'C')); + AddItem(pasteItem = new BMenuItem(B_TRANSLATE("Paste"), + new BMessage(B_PASTE), 'V')); - // The "Move To", "Copy To", "Create Link" menus are inserted - // at this place, have a look at: - // BContainerWindow::SetupMoveCopyMenus() + AddSeparatorItem(); + + AddItem(new BMenuItem(B_TRANSLATE("Identify"), + new BMessage(kIdentifyEntry))); + BMenu* addOnMenuItem = new BMenu(B_TRANSLATE("Add-ons")); + addOnMenuItem->SetFont(be_plain_font); + AddItem(addOnMenuItem); + } + + SetTargetForItems(fController->PoseView()); + if (cutItem) + cutItem->SetTarget(fController->PoseView()->Window()); + if (copyItem) + copyItem->SetTarget(fController->PoseView()->Window()); + if (pasteItem) + pasteItem->SetTarget(fController->PoseView()->Window()); } +} - BMenuItem *cutItem = NULL, *copyItem = NULL, *pasteItem = NULL; - if (!targetModel->IsPrintersDir()) { - AddSeparatorItem(); - AddItem(cutItem = new BMenuItem(B_TRANSLATE("Cut"), - new BMessage(B_CUT), 'X')); - AddItem(copyItem = new BMenuItem(B_TRANSLATE("Copy"), - new BMessage(B_COPY), 'C')); - AddItem(pasteItem = new BMenuItem(B_TRANSLATE("Paste"), - new BMessage(B_PASTE), 'V')); +void +DefaultFileMenu::SelectionChanged() +{ + printf("DefaultFileMenu::SelectionChanged()\n"); + + PoseList* selection = fController->PoseView()->SelectionList(); + Model* model = fController->PoseView()->TargetModel(); - AddSeparatorItem(); + if (model->IsRoot()) { + BVolume boot; + BVolumeRoster().GetBootVolume(&boot); - AddItem(new BMenuItem(B_TRANSLATE("Identify"), - new BMessage(kIdentifyEntry))); - BMenu* addOnMenuItem = new BMenu(B_TRANSLATE("Add-ons")); - addOnMenuItem->SetFont(be_plain_font); - AddItem(addOnMenuItem); + bool ejectableVolumeSelected = false; + int32 count = selection->CountItems(); + for (int32 index = 0; index < count; index++) { + Model *model = selection->ItemAt(index)->TargetModel(); + if (model->IsVolume()) { + BVolume volume; + volume.SetTo(model->NodeRef()->device); + if (volume != boot) { + ejectableVolumeSelected = true; + break; + } + } + } + + BMenuItem* item = FindItem(kUnmountVolume); + if (item) + item->SetEnabled(ejectableVolumeSelected); + + } else if (model->IsPrintersDir()) { + + BMenuItem* item = FindItem(kMakeActivePrinter); + if (item) + item->SetEnabled(selection->CountItems() == 1); } - - SetTargetForItems(controller->PoseView()); - if (cutItem) - cutItem->SetTarget(controller->PoseView()->Window()); - if (copyItem) - copyItem->SetTarget(controller->PoseView()->Window()); - if (pasteItem) - pasteItem->SetTarget(controller->PoseView()->Window()); } Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.h =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.h 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/DefaultControls.h 2010-10-23 20:14:02 UTC (rev 39086) @@ -12,7 +12,9 @@ #include <Menu.h> #include <PopUpMenu.h> +#include "PoseViewListener.h" + #undef B_TRANSLATE_CONTEXT #define B_TRANSLATE_CONTEXT "libtracker" @@ -22,8 +24,8 @@ namespace BPrivate { - - + +class Model; class PoseViewController; @@ -33,9 +35,14 @@ }; -class DefaultFileMenu : public BMenu { +class DefaultFileMenu : public BMenu, public PoseViewListener { public: DefaultFileMenu(PoseViewController* controller); + virtual void TargetModelChanged(); + virtual void SelectionChanged(); + +protected: + PoseViewController* fController; }; Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/FilePanelPriv.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/FilePanelPriv.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/FilePanelPriv.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -597,7 +597,6 @@ PoseView()->SetDragEnabled(false); PoseView()->SetDropEnabled(false); PoseView()->SetSelectionHandler(this); - PoseView()->SetSelectionChangedHook(true); PoseView()->DisableSaveLocation(); fPoseView->SetRefFilter(filter); if (!fIsSavePanel) @@ -705,7 +704,7 @@ AddCommonShortcuts(); Controller()->TitleView()->Reset(); - // TODO check for a more robust way for the titleview to get updates + // TODO just use PoseViewListener // configure/customize menus FavoritesMenu* favorites = new FavoritesMenu(B_TRANSLATE("Favorites"), Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Jamfile =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Jamfile 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Jamfile 2010-10-23 20:14:02 UTC (rev 39086) @@ -64,6 +64,7 @@ PoseList.cpp PoseView.cpp PoseViewController.cpp + PoseViewListener.cpp PoseViewScripting.cpp QueryContainerWindow.cpp QueryPoseView.cpp @@ -91,7 +92,6 @@ TrashWatcher.cpp Utilities.cpp ViewState.cpp - VolumeWindow.cpp WidgetAttributeText.cpp : be translation $(vector_icon_libs) $(TARGET_LIBSTDC++) $(HAIKU_LOCALE_LIBS) libshared.a @@ -132,7 +132,6 @@ Tracker.cpp TrackerInitialState.cpp TrackerSettingsWindow.cpp - VolumeWindow.cpp WidgetAttributeText.cpp ; Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -224,7 +224,6 @@ fSelectionRectEnabled(true), fAlwaysAutoPlace(false), fAllowPoseEditing(true), - fSelectionChangedHook(false), fSavePoseLocations(true), fShowHideSelection(true), fOkToMapIcons(false), @@ -300,6 +299,20 @@ void +BPoseView::AddListener(PoseViewListener* listener) +{ + fListeners.push_back(listener); +} + + +void +BPoseView::RemoveListener(PoseViewListener* listener) +{ + // TODO +} + + +void BPoseView::_InitCommon() { printf("(%p) BPoseView::_InitCommon() model=%p\n", this, TargetModel()); @@ -3679,8 +3692,7 @@ if (scrollIntoView) ScrollIntoView(poseRect); - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } } @@ -3714,8 +3726,7 @@ } else Invalidate(pose->CalcRect(this)); - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } @@ -5774,8 +5785,7 @@ loc.y += fListElemHeight; } - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } @@ -5824,8 +5834,7 @@ loc.y += fListElemHeight; } - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } @@ -6409,8 +6418,7 @@ window->ShowContextMenu(where, pose ? pose->TargetModel()->EntryRef() : 0, this); - if (fSelectionChangedHook) - window->SelectionChanged(); + _NotifySelectionChanged(); } @@ -6516,8 +6524,7 @@ DragSelectionRect(where, extendSelection); } - if (fSelectionChangedHook) - window->SelectionChanged(); + _NotifySelectionChanged(); } @@ -7298,8 +7305,8 @@ if (fRealPivotPose == pose) fRealPivotPose = NULL; - if (pose->IsSelected() && fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + if (pose->IsSelected()) + _NotifySelectionChanged(); fPoseList->RemoveItemAt(index); @@ -7577,8 +7584,7 @@ ResetPosePlacementHint(); ClearExtent(); - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } @@ -7620,9 +7626,6 @@ viewStateRestored = (fViewState != previousState); } - // Make sure fTitleView is rebuilt, as fColumnList might have changed - Controller()->TitleView()->Reset(); - if (viewStateRestored) { if (ViewMode() == kListMode && oldMode != kListMode) { Controller()->ShowAttributeMenu(); @@ -7669,10 +7672,40 @@ Invalidate(); fLastKeyTime = 0; + + _NotifyTargetModelChanged(); + + // Make sure fTitleView is rebuilt, as fColumnList might have changed + Controller()->TitleView()->Reset(); + // TODO use PoseViewListener } void +BPoseView::_NotifyTargetModelChanged() +{ + ListenerList::iterator it = fListeners.begin(); + for (; it != fListeners.end(); it++) { + if (*it != NULL) + (*it)->TargetModelChanged(); + } +} + + +void +BPoseView::_NotifySelectionChanged() +{ + ContainerWindow()->SelectionChanged(); + + ListenerList::iterator it = fListeners.begin(); + for (; it != fListeners.end(); it++) { + if (*it != NULL) + (*it)->SelectionChanged(); + } +} + + +void BPoseView::Refresh() { BEntry entry; @@ -9372,8 +9405,7 @@ if (pose->IsSelected()) { pose->Select(false); - if (fSelectionChangedHook) - ContainerWindow()->SelectionChanged(); + _NotifySelectionChanged(); } } Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.h =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.h 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseView.h 2010-10-23 20:14:02 UTC (rev 39086) @@ -47,6 +47,7 @@ #include "Model.h" #include "PendingNodeMonitorCache.h" #include "PoseList.h" +#include "PoseViewListener.h" #include "TitleView.h" #include "Utilities.h" #include "ViewState.h" @@ -59,6 +60,7 @@ #include <View.h> #include <hash_set> #include <set> +#include <vector> class BRefFilter; @@ -111,6 +113,10 @@ virtual void Init(const BMessage &); virtual void DetachedFromWindow(); + + // listeners + void AddListener(PoseViewListener*); + void RemoveListener(PoseViewListener*); // TODO unimplemented // Returns true if for instance, node ref is a remote desktop directory and // this is a desktop pose view. @@ -175,7 +181,6 @@ void SetDropEnabled(bool); void SetSelectionRectEnabled(bool); void SetAlwaysAutoPlace(bool); - void SetSelectionChangedHook(bool); void SetShowHideSelection(bool); void SetEnsurePosesVisible(bool); void SetIconMapping(bool); @@ -392,6 +397,9 @@ protected: void _InitCommon(); + + void _NotifyTargetModelChanged(); + void _NotifySelectionChanged(); // view setup virtual void SetUpDefaultColumnsIfNeeded(); @@ -630,6 +638,9 @@ protected: PoseViewController* fController; + typedef std::vector<PoseViewListener*> ListenerList; + ListenerList fListeners; + Model *fModel; BPose *fActivePose; BRect fExtent; @@ -677,7 +688,6 @@ bool fSelectionRectEnabled : 1; bool fAlwaysAutoPlace : 1; bool fAllowPoseEditing : 1; - bool fSelectionChangedHook : 1; // get rid of this bool fSavePoseLocations : 1; bool fShowHideSelection : 1; bool fOkToMapIcons : 1; @@ -942,11 +952,6 @@ fMultipleSelection = state; } -inline void -BPoseView::SetSelectionChangedHook(bool state) -{ - fSelectionChangedHook = state; -} inline void BPoseView::SetAutoScroll(bool state) @@ -1107,6 +1112,8 @@ } // namespace BPrivate + using namespace BPrivate; + #endif /* _POSE_VIEW_H */ Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewController.h =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewController.h 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewController.h 2010-10-23 20:14:02 UTC (rev 39086) @@ -11,7 +11,9 @@ #include <ScrollBar.h> +#include <vector> + class BGridLayout; class BGroupLayout; class BLayoutItem; @@ -30,6 +32,7 @@ class BHScrollBar; class BPoseView; class Model; +class PoseViewListener; class PoseViewController { // TODO: more abstraction @@ -38,12 +41,12 @@ virtual ~PoseViewController(); void SetPoseView(BPoseView* poseView); - + virtual void CreateControls(Model* model); // temporary helper method // model is needed for BNavigator. // TODO: Just get the model out of fPoseView void CreateMenus(); // temporary helper method - + virtual void SetControlVisible(BView* control, bool visible); void ShowAttributeMenu(); void HideAttributeMenu(); @@ -60,11 +63,11 @@ void SlowOperationStarted(); void SlowOperationEnded(); void AddPosesCompleted(); - + BMenuBar* MenuBar() { return fMenuBar; }; - DefaultAttributeMenu* AttributeMenu() { return fAttributesMenu; }; + DefaultAttributeMenu* AttributeMenu() { return fAttributesMenu; }; BMenu* WindowMenu() { return fWindowMenu; }; - BMenu* FileMenu() { return fFileMenu; }; + BMenu* FileMenu() { return fFileMenu; }; BNavigator* Navigator() { return fNavigator; }; BTitleView* TitleView() { return fTitleView; }; BPoseView* PoseView() { return fPoseView; }; Added: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.cpp (rev 0) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -0,0 +1,15 @@ +/* + * Copyright 2010, Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Alexandre Deckner <alex@xxxxxxxxxxxx> + */ + + +#include "PoseViewListener.h" + + +PoseViewListener::~PoseViewListener() +{ +} Added: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.h =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.h (rev 0) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/PoseViewListener.h 2010-10-23 20:14:02 UTC (rev 39086) @@ -0,0 +1,33 @@ +/* + * Copyright 2010, Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Alexandre Deckner <alex@xxxxxxxxxxxx> + */ +#ifndef _POSEVIEW_LISTENER_H +#define _POSEVIEW_LISTENER_H + + +namespace BPrivate { + + +class Model; + + +class PoseViewListener { +public: + virtual ~PoseViewListener(); + + virtual void TargetModelChanged() = 0; + virtual void SelectionChanged() = 0; +}; + + +} // namespace BPrivate + + +using namespace BPrivate; + + +#endif // _POSEVIEW_LISTENER_H Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/TitleView.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/TitleView.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/TitleView.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -108,7 +108,7 @@ fTrackingState(NULL) { SetExplicitMaxSize(BSize(B_SIZE_UNSET, 16)); - SetExplicitMinSize(BSize(B_SIZE_UNSET, 16)); + SetExplicitMinSize(BSize(0, 16)); sTitleBackground = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 0.88f); // 216 -> 220 sDarkTitleBackground = tint_color(sTitleBackground, B_DARKEN_1_TINT); Modified: haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Tracker.cpp =================================================================== --- haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Tracker.cpp 2010-10-23 20:13:39 UTC (rev 39085) +++ haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker/Tracker.cpp 2010-10-23 20:14:02 UTC (rev 39086) @@ -889,8 +889,6 @@ refList = new BMessage(*originalRefsList); } window = new OpenWithContainerWindow(refList, &fWindowList); - } else if (model->IsRoot()) { - window = new BVolumeWindow(model, &fWindowList, openFlags); } else if (model->IsQuery()) { window = new BQueryContainerWindow(model, &fWindowList, openFlags); } else {