Tracker: Some cleanups to menu management.
* Get rid of GetNumberOfVolumes(), keep track of volume items count instead. * Get rid of ClearMenu(), use BMenu::RemoveItems() instead.
This commit is contained in:
@@ -215,26 +215,6 @@ MoreOptionsStruct::QueryTemporary(const BNode* node)
|
|||||||
// #pragma mark - FindWindow
|
// #pragma mark - FindWindow
|
||||||
|
|
||||||
|
|
||||||
int32
|
|
||||||
GetNumberOfVolumes()
|
|
||||||
{
|
|
||||||
static int32 numberOfVolumes = -1;
|
|
||||||
if (numberOfVolumes >= 0)
|
|
||||||
return numberOfVolumes;
|
|
||||||
|
|
||||||
int32 count = 0;
|
|
||||||
BVolumeRoster volumeRoster;
|
|
||||||
BVolume volume;
|
|
||||||
while (volumeRoster.GetNextVolume(&volume) == B_OK) {
|
|
||||||
if (volume.IsPersistent() && volume.KnowsQuery() && volume.KnowsAttr())
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
|
|
||||||
numberOfVolumes = count;
|
|
||||||
return numberOfVolumes;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FindWindow::FindWindow(const entry_ref* newRef, bool editIfTemplateOnly)
|
FindWindow::FindWindow(const entry_ref* newRef, bool editIfTemplateOnly)
|
||||||
:
|
:
|
||||||
BWindow(BRect(), B_TRANSLATE("Find"), B_TITLED_WINDOW,
|
BWindow(BRect(), B_TRANSLATE("Find"), B_TITLED_WINDOW,
|
||||||
@@ -375,17 +355,6 @@ FindWindow::UpdateFileReferences(const entry_ref* ref)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ClearMenu(BMenu* menu)
|
|
||||||
{
|
|
||||||
int32 count = menu->CountItems();
|
|
||||||
for (int32 i = 0; i < count; i++) {
|
|
||||||
BMenuItem* item = menu->RemoveItem(static_cast<int32>(0));
|
|
||||||
delete item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
FindWindow::DeleteQueryOrTemplate(BEntry* entry)
|
FindWindow::DeleteQueryOrTemplate(BEntry* entry)
|
||||||
{
|
{
|
||||||
@@ -425,7 +394,8 @@ CheckForDuplicates(BObjectList<entry_ref>* list, entry_ref* ref)
|
|||||||
void
|
void
|
||||||
FindWindow::PopulateTemplatesMenu()
|
FindWindow::PopulateTemplatesMenu()
|
||||||
{
|
{
|
||||||
ClearMenu(fTemplatesMenu);
|
fTemplatesMenu->RemoveItems(0, fTemplatesMenu->CountItems(), true);
|
||||||
|
|
||||||
BObjectList<entry_ref> templates(10, true);
|
BObjectList<entry_ref> templates(10, true);
|
||||||
BVolumeRoster roster;
|
BVolumeRoster roster;
|
||||||
BVolume volume;
|
BVolume volume;
|
||||||
@@ -627,25 +597,6 @@ FindWindow::SaveQueryAttributes(BNode* file, bool queryTemplate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
MarkVolumeAccordingToDirectoryFilter(BMenu* menu, entry_ref* ref)
|
|
||||||
{
|
|
||||||
int32 startingIndex = 2;
|
|
||||||
int32 endingIndex = 2 + GetNumberOfVolumes();
|
|
||||||
for (int32 index = startingIndex; index < endingIndex; ++index) {
|
|
||||||
BMenuItem* item = menu->ItemAt(index);
|
|
||||||
if (item->IsMarked())
|
|
||||||
continue;
|
|
||||||
BMessage* message = item->Message();
|
|
||||||
dev_t device;
|
|
||||||
if (message->FindInt32("device", &device) != B_OK)
|
|
||||||
continue;
|
|
||||||
if (device == ref->device)
|
|
||||||
item->SetMarked(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
FindWindow::SaveQueryAsAttributes(BNode* file, BEntry* entry, bool queryTemplate,
|
FindWindow::SaveQueryAsAttributes(BNode* file, BEntry* entry, bool queryTemplate,
|
||||||
const BMessage* oldAttributes, const BPoint* oldLocation, bool temporary)
|
const BMessage* oldAttributes, const BPoint* oldLocation, bool temporary)
|
||||||
@@ -678,18 +629,30 @@ FindWindow::SaveQueryAsAttributes(BNode* file, BEntry* entry, bool queryTemplate
|
|||||||
|
|
||||||
fBackground->SaveDirectoryFiltersToFile(file);
|
fBackground->SaveDirectoryFiltersToFile(file);
|
||||||
|
|
||||||
BMenu* volMenu = fBackground->VolMenu();
|
int32 firstVolumeItem, volumeItemsCount;
|
||||||
|
BMenu* volMenu = fBackground->VolMenu(&firstVolumeItem, &volumeItemsCount);
|
||||||
ASSERT(volMenu != NULL);
|
ASSERT(volMenu != NULL);
|
||||||
|
|
||||||
int32 numberOfDirectoryFilters = fBackground->fDirectoryFilters.CountItems();
|
int32 numberOfDirectoryFilters = fBackground->fDirectoryFilters.CountItems();
|
||||||
for (int32 i = 0; i < numberOfDirectoryFilters; ++i)
|
for (int32 i = 0; i < numberOfDirectoryFilters; ++i) {
|
||||||
MarkVolumeAccordingToDirectoryFilter(volMenu, fBackground->fDirectoryFilters.ItemAt(i));
|
const entry_ref* ref = fBackground->fDirectoryFilters.ItemAt(i);
|
||||||
|
for (int32 j = 0; j < volumeItemsCount; j++) {
|
||||||
|
BMenuItem* item = volMenu->ItemAt(firstVolumeItem + j);
|
||||||
|
if (item->IsMarked())
|
||||||
|
continue;
|
||||||
|
BMessage* message = item->Message();
|
||||||
|
dev_t device;
|
||||||
|
if (message->FindInt32("device", &device) != B_OK)
|
||||||
|
continue;
|
||||||
|
if (device == ref->device)
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool addAllVolumes = volMenu->ItemAt(0)->IsMarked();
|
bool addAllVolumes = volMenu->ItemAt(0)->IsMarked();
|
||||||
int32 numberOfVolumes = GetNumberOfVolumes();
|
|
||||||
BMessage messageContainingVolumeInfo;
|
BMessage messageContainingVolumeInfo;
|
||||||
for (int32 i = 2; i < numberOfVolumes + 2; ++i) {
|
for (int32 i = 0; i < volumeItemsCount; i++) {
|
||||||
BMenuItem* volumeMenuItem = volMenu->ItemAt(i);
|
BMenuItem* volumeMenuItem = volMenu->ItemAt(firstVolumeItem + i);
|
||||||
BMessage* messageOfVolumeMenuItem = volumeMenuItem->Message();
|
BMessage* messageOfVolumeMenuItem = volumeMenuItem->Message();
|
||||||
dev_t device;
|
dev_t device;
|
||||||
if (messageOfVolumeMenuItem->FindInt32("device", &device) != B_OK)
|
if (messageOfVolumeMenuItem->FindInt32("device", &device) != B_OK)
|
||||||
@@ -959,13 +922,11 @@ FindWindow::MessageReceived(BMessage* message)
|
|||||||
// something reasonable happens
|
// something reasonable happens
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Refresh Template Menu
|
|
||||||
ClearMenu(fTemplatesMenu);
|
|
||||||
PopulateTemplatesMenu();
|
|
||||||
|
|
||||||
fSaveQueryOrTemplateItem->SetEnabled(true);
|
PopulateTemplatesMenu();
|
||||||
break;
|
fSaveQueryOrTemplateItem->SetEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case kSwitchToQueryTemplate:
|
case kSwitchToQueryTemplate:
|
||||||
{
|
{
|
||||||
@@ -1071,7 +1032,7 @@ FindPanel::FindPanel(BFile* node, FindWindow* parent, bool fromTemplate, bool ed
|
|||||||
"The disks/folders that are searched. Similar to TextSearch's 'Set target'."),
|
"The disks/folders that are searched. Similar to TextSearch's 'Set target'."),
|
||||||
fVolMenu);
|
fVolMenu);
|
||||||
fVolumeField->SetDivider(fVolumeField->StringWidth(fVolumeField->Label()) + 8);
|
fVolumeField->SetDivider(fVolumeField->StringWidth(fVolumeField->Label()) + 8);
|
||||||
AddVolumes(fVolMenu);
|
AddVolumes();
|
||||||
fVolMenu->AddSeparatorItem();
|
fVolMenu->AddSeparatorItem();
|
||||||
if (fDirectoryFilters.CountItems() > 0)
|
if (fDirectoryFilters.CountItems() > 0)
|
||||||
fVolMenu->AddSeparatorItem();
|
fVolMenu->AddSeparatorItem();
|
||||||
@@ -1491,15 +1452,13 @@ void
|
|||||||
FindPanel::ShowVolumeMenuLabel()
|
FindPanel::ShowVolumeMenuLabel()
|
||||||
{
|
{
|
||||||
// find out if more than one items are marked
|
// find out if more than one items are marked
|
||||||
int32 totalVolumes = GetNumberOfVolumes();
|
|
||||||
int32 selectedVolumesCount = 0;
|
int32 selectedVolumesCount = 0;
|
||||||
|
|
||||||
BMenuItem* lastSelectedVolumeItem = NULL;
|
BMenuItem* lastSelectedVolumeItem = NULL;
|
||||||
|
for (int32 i = 0; i < fVolumeItemsCount; ++i) {
|
||||||
for (int32 i = 2; i < totalVolumes + 2; ++i) {
|
BMenuItem* volumeItem = fVolMenu->ItemAt(fFirstVolumeItem + i);
|
||||||
BMenuItem* volumeItem = fVolMenu->ItemAt(i);
|
|
||||||
if (volumeItem->IsMarked()) {
|
if (volumeItem->IsMarked()) {
|
||||||
++selectedVolumesCount;
|
selectedVolumesCount++;
|
||||||
lastSelectedVolumeItem = volumeItem;
|
lastSelectedVolumeItem = volumeItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1508,7 +1467,7 @@ FindPanel::ShowVolumeMenuLabel()
|
|||||||
PopUpMenuSetTitle(fVolMenu, B_TRANSLATE_COMMENT(kMultipleSelections, kMultiSelectComment));
|
PopUpMenuSetTitle(fVolMenu, B_TRANSLATE_COMMENT(kMultipleSelections, kMultiSelectComment));
|
||||||
} else if (fDirectoryFilters.CountItems() == 1) {
|
} else if (fDirectoryFilters.CountItems() == 1) {
|
||||||
PopUpMenuSetTitle(fVolMenu, fDirectoryFilters.ItemAt(0)->name);
|
PopUpMenuSetTitle(fVolMenu, fDirectoryFilters.ItemAt(0)->name);
|
||||||
} else if (selectedVolumesCount == 0 || selectedVolumesCount == totalVolumes) {
|
} else if (selectedVolumesCount == 0 || selectedVolumesCount == fVolumeItemsCount) {
|
||||||
fVolMenu->ItemAt(0)->SetMarked(true);
|
fVolMenu->ItemAt(0)->SetMarked(true);
|
||||||
PopUpMenuSetTitle(fVolMenu, fVolMenu->ItemAt(0)->Label());
|
PopUpMenuSetTitle(fVolMenu, fVolMenu->ItemAt(0)->Label());
|
||||||
} else if (selectedVolumesCount == 1) {
|
} else if (selectedVolumesCount == 1) {
|
||||||
@@ -1572,10 +1531,8 @@ FindPanel::Draw(BRect)
|
|||||||
void
|
void
|
||||||
FindPanel::UnmarkDisks()
|
FindPanel::UnmarkDisks()
|
||||||
{
|
{
|
||||||
int32 startingIndex = 2;
|
for (int32 i = 0; i < fVolumeItemsCount; ++i)
|
||||||
int32 endingIndex = 2 + GetNumberOfVolumes();
|
fVolMenu->ItemAt(fFirstVolumeItem + i)->SetMarked(false);
|
||||||
for (int32 i = startingIndex; i < endingIndex; ++i)
|
|
||||||
fVolMenu->ItemAt(i)->SetMarked(false);
|
|
||||||
|
|
||||||
fVolMenu->ItemAt(0)->SetMarked(false);
|
fVolMenu->ItemAt(0)->SetMarked(false);
|
||||||
}
|
}
|
||||||
@@ -1640,7 +1597,7 @@ FindPanel::MessageReceived(BMessage* message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32 count = fVolMenu->CountItems();
|
int32 count = fVolMenu->CountItems();
|
||||||
int32 startingIndex = 3 + GetNumberOfVolumes();
|
int32 startingIndex = 3 + fVolumeItemsCount;
|
||||||
int32 endingIndex = count - 2;
|
int32 endingIndex = count - 2;
|
||||||
for (int32 i = startingIndex; i < endingIndex; ++i) {
|
for (int32 i = startingIndex; i < endingIndex; ++i) {
|
||||||
BMenuItem* menuItem = fVolMenu->ItemAt(i);
|
BMenuItem* menuItem = fVolMenu->ItemAt(i);
|
||||||
@@ -1648,6 +1605,7 @@ FindPanel::MessageReceived(BMessage* message)
|
|||||||
entry_ref ref;
|
entry_ref ref;
|
||||||
if (!message || message->FindRef("refs", &ref) != B_OK)
|
if (!message || message->FindRef("refs", &ref) != B_OK)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
RemoveDirectoryFilter(&ref);
|
RemoveDirectoryFilter(&ref);
|
||||||
menuItem->SetMarked(false);
|
menuItem->SetMarked(false);
|
||||||
}
|
}
|
||||||
@@ -2313,8 +2271,8 @@ FindPanel::SetCurrentMimeType(const char* label)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static void
|
||||||
void AddSubtype(BString& text, const BMimeType& type)
|
AddSubtype(BString& text, const BMimeType& type)
|
||||||
{
|
{
|
||||||
text.Append(" (");
|
text.Append(" (");
|
||||||
text.Append(strchr(type.Type(), '/') + 1);
|
text.Append(strchr(type.Type(), '/') + 1);
|
||||||
@@ -2448,15 +2406,18 @@ FindPanel::AddMimeTypesToMenu()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
FindPanel::AddVolumes(BMenu* menu)
|
FindPanel::AddVolumes()
|
||||||
{
|
{
|
||||||
// ToDo: add calls to this to rebuild the menu when a volume gets mounted
|
// ToDo: add calls to this to rebuild the menu when a volume gets mounted
|
||||||
|
|
||||||
BMessage* message = new BMessage(kVolumeItem);
|
BMessage* message = new BMessage(kVolumeItem);
|
||||||
message->AddInt32("device", -1);
|
message->AddInt32("device", -1);
|
||||||
menu->AddItem(new BMenuItem(B_TRANSLATE("All disks"), message));
|
fVolMenu->AddItem(new BMenuItem(B_TRANSLATE("All disks"), message));
|
||||||
menu->AddSeparatorItem();
|
fVolMenu->AddSeparatorItem();
|
||||||
PopUpMenuSetTitle(menu, B_TRANSLATE("All disks"));
|
PopUpMenuSetTitle(fVolMenu, B_TRANSLATE("All disks"));
|
||||||
|
|
||||||
|
fFirstVolumeItem = fVolMenu->CountItems();
|
||||||
|
fVolumeItemsCount = 0;
|
||||||
|
|
||||||
BVolumeRoster roster;
|
BVolumeRoster roster;
|
||||||
BVolume volume;
|
BVolume volume;
|
||||||
@@ -2476,14 +2437,26 @@ FindPanel::AddVolumes(BMenu* menu)
|
|||||||
|
|
||||||
message = new BMessage(kVolumeItem);
|
message = new BMessage(kVolumeItem);
|
||||||
message->AddInt32("device", volume.Device());
|
message->AddInt32("device", volume.Device());
|
||||||
menu->AddItem(new ModelMenuItem(&model, model.Name(), message));
|
fVolMenu->AddItem(new ModelMenuItem(&model, model.Name(), message));
|
||||||
|
fVolumeItemsCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu->ItemAt(0))
|
if (fVolMenu->ItemAt(0))
|
||||||
menu->ItemAt(0)->SetMarked(true);
|
fVolMenu->ItemAt(0)->SetMarked(true);
|
||||||
|
|
||||||
menu->SetTargetForItems(this);
|
fVolMenu->SetTargetForItems(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BPopUpMenu*
|
||||||
|
FindPanel::VolMenu(int32* firstVolumeItem, int32* volumeItemsCount) const
|
||||||
|
{
|
||||||
|
if (firstVolumeItem != NULL)
|
||||||
|
*firstVolumeItem = fFirstVolumeItem;
|
||||||
|
if (volumeItemsCount != NULL)
|
||||||
|
*volumeItemsCount = fVolumeItemsCount;
|
||||||
|
return fVolMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2972,9 +2945,9 @@ FindPanel::RestoreWindowState(const BNode* node)
|
|||||||
|
|
||||||
LoadDirectoryFiltersFromFile(node);
|
LoadDirectoryFiltersFromFile(node);
|
||||||
// mark or unmark "All disks"
|
// mark or unmark "All disks"
|
||||||
if (selectedVolumes == GetNumberOfVolumes()) {
|
if (selectedVolumes == fVolumeItemsCount) {
|
||||||
fVolMenu->ItemAt(0)->SetMarked(true);
|
fVolMenu->ItemAt(0)->SetMarked(true);
|
||||||
for (int32 i = 0; i < GetNumberOfVolumes() + 2; ++i)
|
for (int32 i = 0; i < fVolumeItemsCount + 2; ++i)
|
||||||
fVolMenu->ItemAt(i)->SetMarked(false);
|
fVolMenu->ItemAt(i)->SetMarked(false);
|
||||||
}
|
}
|
||||||
ShowVolumeMenuLabel();
|
ShowVolumeMenuLabel();
|
||||||
|
|||||||
@@ -222,7 +222,8 @@ public:
|
|||||||
status_t SetCurrentMimeType(BMenuItem* item);
|
status_t SetCurrentMimeType(BMenuItem* item);
|
||||||
status_t SetCurrentMimeType(const char* label);
|
status_t SetCurrentMimeType(const char* label);
|
||||||
|
|
||||||
BPopUpMenu* VolMenu() const { return fVolMenu; }
|
BPopUpMenu* VolMenu(int32* firstVolumeItem = NULL,
|
||||||
|
int32* volumeItemsCount = NULL) const;
|
||||||
uint32 Mode() const { return fMode; }
|
uint32 Mode() const { return fMode; }
|
||||||
|
|
||||||
static uint32 InitialMode(const BNode* entry);
|
static uint32 InitialMode(const BNode* entry);
|
||||||
@@ -249,12 +250,10 @@ public:
|
|||||||
void LoadDirectoryFiltersFromFile(const BNode*);
|
void LoadDirectoryFiltersFromFile(const BNode*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// populates the type menu
|
|
||||||
void AddMimeTypesToMenu();
|
void AddMimeTypesToMenu();
|
||||||
static bool AddOneMimeTypeToMenu(const ShortMimeInfo*, void* castToMenu);
|
static bool AddOneMimeTypeToMenu(const ShortMimeInfo*, void* castToMenu);
|
||||||
|
|
||||||
// populates the volume menu
|
void AddVolumes();
|
||||||
void AddVolumes(BMenu*);
|
|
||||||
|
|
||||||
void ShowVolumeMenuLabel();
|
void ShowVolumeMenuLabel();
|
||||||
|
|
||||||
@@ -320,6 +319,7 @@ private:
|
|||||||
BPopUpMenu* fSearchModeMenu;
|
BPopUpMenu* fSearchModeMenu;
|
||||||
BMenuField* fSearchModeField;
|
BMenuField* fSearchModeField;
|
||||||
BPopUpMenu* fVolMenu;
|
BPopUpMenu* fVolMenu;
|
||||||
|
int32 fFirstVolumeItem, fVolumeItemsCount;
|
||||||
BMenuField* fVolumeField;
|
BMenuField* fVolumeField;
|
||||||
BPopUpMenu* fRecentQueries;
|
BPopUpMenu* fRecentQueries;
|
||||||
BBox* fMoreOptions;
|
BBox* fMoreOptions;
|
||||||
|
|||||||
Reference in New Issue
Block a user