16c3234baSStephan Aßmus/*
26c3234baSStephan Aßmus * Copyright (c) 1998-2007 Matthijs Hollemans
390ce3113SAugustin Cavalier * All rights reserved. Distributed under the terms of the MIT License.
46c3234baSStephan Aßmus */
56c3234baSStephan Aßmus
66c3234baSStephan Aßmus#include "GrepListView.h"
76c3234baSStephan Aßmus
86c3234baSStephan Aßmus#include <Path.h>
96c3234baSStephan Aßmus
106c3234baSStephan AßmusResultItem::ResultItem(const entry_ref& ref)
116c3234baSStephan Aßmus	: BStringItem("", 0, false),
126c3234baSStephan Aßmus	  ref(ref)
136c3234baSStephan Aßmus{
146c3234baSStephan Aßmus	BEntry entry(&ref);
156c3234baSStephan Aßmus	BPath path(&entry);
16696f4254SAugustin Cavalier	SetText(path.Path());
176c3234baSStephan Aßmus}
186c3234baSStephan Aßmus
196c3234baSStephan Aßmus
206c3234baSStephan AßmusGrepListView::GrepListView()
211b1789a7SAugustin Cavalier	: BOutlineListView("SearchResults",
221b1789a7SAugustin Cavalier		B_MULTIPLE_SELECTION_LIST,
236c3234baSStephan Aßmus		B_WILL_DRAW | B_NAVIGABLE)
246c3234baSStephan Aßmus{
256c3234baSStephan Aßmus}
26962a6c67SStephan Aßmus
27962a6c67SStephan Aßmus
28962a6c67SStephan AßmusResultItem*
29962a6c67SStephan AßmusGrepListView::FindItem(const entry_ref& ref, int32* _index) const
30962a6c67SStephan Aßmus{
31962a6c67SStephan Aßmus	int32 count = FullListCountItems();
32962a6c67SStephan Aßmus	for (int32 i = 0; i < count; i++) {
33962a6c67SStephan Aßmus		ResultItem* item = dynamic_cast<ResultItem*>(FullListItemAt(i));
34962a6c67SStephan Aßmus		if (item == NULL)
35962a6c67SStephan Aßmus			continue;
36962a6c67SStephan Aßmus		if (item->ref == ref) {
37962a6c67SStephan Aßmus			*_index = i;
38962a6c67SStephan Aßmus			return item;
39962a6c67SStephan Aßmus		}
40962a6c67SStephan Aßmus	}
41962a6c67SStephan Aßmus	*_index = -1;
42962a6c67SStephan Aßmus	return NULL;
43962a6c67SStephan Aßmus}
44f0d8b55fSStephan Aßmus
45f0d8b55fSStephan Aßmus
46f0d8b55fSStephan AßmusResultItem*
47f0d8b55fSStephan AßmusGrepListView::RemoveResults(const entry_ref& ref, bool completeItem)
48f0d8b55fSStephan Aßmus{
49f0d8b55fSStephan Aßmus	int32 index;
50f0d8b55fSStephan Aßmus	ResultItem* item = FindItem(ref, &index);
51f0d8b55fSStephan Aßmus	if (item == NULL)
52f0d8b55fSStephan Aßmus		return NULL;
53f0d8b55fSStephan Aßmus
54f0d8b55fSStephan Aßmus	// remove all the sub items
55f0d8b55fSStephan Aßmus	while (true) {
56f0d8b55fSStephan Aßmus		BListItem* subItem = FullListItemAt(index + 1);
57f0d8b55fSStephan Aßmus		if (subItem && subItem->OutlineLevel() > 0)
58f0d8b55fSStephan Aßmus			delete RemoveItem(index + 1);
59f0d8b55fSStephan Aßmus		else
60f0d8b55fSStephan Aßmus			break;
61f0d8b55fSStephan Aßmus	}
62f0d8b55fSStephan Aßmus
63f0d8b55fSStephan Aßmus	if (completeItem) {
64f0d8b55fSStephan Aßmus		// remove file item itself
65f0d8b55fSStephan Aßmus		delete RemoveItem(index);
66f0d8b55fSStephan Aßmus		item = NULL;
67f0d8b55fSStephan Aßmus	}
68f0d8b55fSStephan Aßmus
69f0d8b55fSStephan Aßmus	return item;
70f0d8b55fSStephan Aßmus}
71f0d8b55fSStephan Aßmus