[haiku-commits] r39086 - haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker

  • From: alex@xxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 23 Oct 2010 22:14:02 +0200 (CEST)

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 {


Other related posts:

  • » [haiku-commits] r39086 - haiku/branches/developer/aldeck/tracker_layout/src/kits/tracker - alex