1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/*
* Copyright (C) 2013 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authored by Pawel Stolowski <pawel.stolowski@canonical.com>
*
*/
namespace Unity.HomeScope {
public enum SearchQueryChange
{
NOT_CHANGED,
NEW_QUERY,
CANNED_QUERY,
APPENDS_TO_PREVIOUS_QUERY,
REMOVES_FROM_PREVIOUS_QUERY
}
public class SearchQueryState
{
private HashTable<string, string> previous_query = new HashTable<string, string> (str_hash, str_equal);
private HashTable<string, bool> canned_query = new HashTable<string, bool> (str_hash, str_equal);
public void remove (string home_channel_id)
{
previous_query.remove (home_channel_id);
}
public bool has_channel (string home_channel_id)
{
return previous_query.contains (home_channel_id);
}
public void set_canned_query (string channel_id)
{
canned_query[channel_id] = true;
}
/**
* Compare search string with previous string for given home channel. Store new search string.
*/
public SearchQueryChange search_query_changed (string channel_id, string search_string)
{
var query = search_string.strip ();
var changed = SearchQueryChange.NEW_QUERY;
if (canned_query.contains(channel_id))
{
changed = SearchQueryChange.CANNED_QUERY;
canned_query.remove (channel_id);
}
else
{
if (previous_query.contains (channel_id))
{
var prev = previous_query[channel_id];
if (query == "" && prev != "") // there was a query previously, but user removed all characters in new one
{
changed = SearchQueryChange.NEW_QUERY;
}
else
{
if (prev == query)
changed = SearchQueryChange.NOT_CHANGED;
else if (prev == "")
changed = SearchQueryChange.NEW_QUERY;
else if (query.has_prefix (prev))
changed = SearchQueryChange.APPENDS_TO_PREVIOUS_QUERY;
else if (prev.has_prefix (query))
changed = SearchQueryChange.REMOVES_FROM_PREVIOUS_QUERY;
}
}
}
previous_query[channel_id] = query;
debug ("search_query_changed for channel %s: %s", channel_id, changed.to_string ());
return changed;
}
}
}
|