Project

General

Profile

Download (5.62 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2019 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.view.search.facet;
10

    
11
import java.util.ArrayList;
12
import java.util.Collections;
13
import java.util.Comparator;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.Map.Entry;
19
import java.util.Set;
20

    
21
import org.eclipse.jface.layout.GridDataFactory;
22
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.events.KeyEvent;
24
import org.eclipse.swt.events.KeyListener;
25
import org.eclipse.swt.events.SelectionEvent;
26
import org.eclipse.swt.events.SelectionListener;
27
import org.eclipse.swt.layout.GridLayout;
28
import org.eclipse.swt.widgets.Composite;
29
import org.eclipse.swt.widgets.Group;
30

    
31
import eu.etaxonomy.taxeditor.model.MessagingUtils;
32

    
33
/**
34
 * @author pplitzner
35
 * @since Jan 22, 2019
36
 *
37
 */
38
public abstract class SearchController<S extends SearchResult<T>, T> implements KeyListener, SelectionListener{
39

    
40
    private SearchComposite composite;
41
    private List<S> searchResults = new ArrayList<>();
42
    private Set<Facet> appliedFacets = new HashSet<>();
43
    private List<CheckBoxSearchResultComposite<T, S>> searchResultComposites = new ArrayList<>();
44

    
45
    public SearchController(SearchComposite composite) {
46
        this.composite = composite;
47
        composite.getTxtSearch().addKeyListener(this);
48
        composite.getBtnSearchButton().addSelectionListener(this);
49
    }
50

    
51
    protected abstract List<S> searchResults(String searchString);
52

    
53
    protected abstract CheckBoxSearchResultComposite<T, S> createResultComposite(S result, Composite parent);
54

    
55
    protected abstract Comparator<S> getResultComparator(String searchString);
56

    
57
    protected abstract List<S> getSelectedResults();
58

    
59
    private void search(String searchString){
60
        searchResults.clear();
61
        searchResultComposites.clear();
62

    
63
        searchResults = searchResults(searchString);
64
        if(searchResults.size()>500){
65
            MessagingUtils.warningDialog("Specify your search", this, "The following search has too many results. Please enter a more specific search query.");
66
            return;
67
        }
68

    
69
        Collections.sort(searchResults, getResultComparator(searchString));
70

    
71
        Set<Facet> facets = createResults(searchResults);
72

    
73
        createFilterButtons(facets);
74

    
75
        composite.refresh();
76
    }
77

    
78
    private void createFilterButtons(Set<Facet> facets) {
79
        Map<String, List<Facet>> categoryToFacetsMap = new HashMap<>();
80
        for (Facet facet : facets) {
81
            List<Facet> categoryFacets = categoryToFacetsMap.get(facet.getCategory());
82
            if(categoryFacets==null){
83
                categoryFacets = new ArrayList<>();
84
            }
85
            categoryFacets.add(facet);
86
            categoryToFacetsMap.put(facet.getCategory(), categoryFacets);
87
        }
88
        for (Entry<String, List<Facet>> entry: categoryToFacetsMap.entrySet()) {
89
            String category = entry.getKey();
90
            // create group
91
            Group group = new Group(composite.getFilterListComposite(), SWT.NONE);
92
            group.setLayout(new GridLayout());
93
            GridDataFactory.fillDefaults().applyTo(group);
94
            group.setText(category!=null?category:"None");
95
            // fill group with facet filters
96
            List<Facet> categoryFacets = entry.getValue();
97
            for (Facet facet : categoryFacets) {
98
                if(facet.getFacet()!=null){
99
                    FilterComposite filterComposite = new FilterComposite(facet, this, group, SWT.NONE);
100
                    appliedFacets.add(facet);
101
                }
102
            }
103
        }
104

    
105
    }
106

    
107
    private Set<Facet> createResults(List<S> results) {
108
        Set<Facet> facets = new HashSet<>();
109
        searchResultComposites.clear();
110
        for (S result : results) {
111
            searchResultComposites.add(createResultComposite(result, composite.getSearchResultComposite()));
112
            facets.addAll(result.getFacets());
113
        }
114
        return facets;
115
    }
116

    
117
    public void applyFilter(FilterComposite filterComposite) {
118

    
119
        composite.clearResults();
120

    
121
        Facet facet = filterComposite.getFacet();
122
        if(filterComposite.isFilterActive()){
123
            appliedFacets.add(facet);
124
        }
125
        else{
126
            appliedFacets.remove(facet);
127
        }
128

    
129
        searchResultComposites.clear();
130
        for (S searchResult : searchResults) {
131
            if(searchResult.hasAnyFacet(appliedFacets)){
132
                searchResultComposites.add(createResultComposite(searchResult, composite.getSearchResultComposite()));
133
            }
134
        }
135

    
136
        composite.refresh();
137
    }
138

    
139
    private void search(){
140
        composite.clear();
141
        search(composite.getTxtSearch().getText());
142
    }
143

    
144
    public List<S> getSelectedSearchResults(){
145
        List<S> selectedSearchResults = new ArrayList<>();
146
        searchResultComposites.stream()
147
        .filter(resultComposite->resultComposite.getBtnCheck().getSelection())
148
        .forEach(selected->selectedSearchResults.add(selected.getResult()));
149
        return selectedSearchResults;
150
    }
151

    
152
    @Override
153
    public void keyPressed(KeyEvent e) {
154
        if(e.keyCode==SWT.CR && e.widget==composite.getTxtSearch()){
155
            search();
156
        }
157
    }
158

    
159
    @Override
160
    public void keyReleased(KeyEvent e) {
161
    }
162

    
163
    @Override
164
    public void widgetSelected(SelectionEvent e) {
165
        if(e.widget==composite.getBtnSearchButton()){
166
            search();
167
        }
168
    }
169

    
170
    @Override
171
    public void widgetDefaultSelected(SelectionEvent e) {
172
    }
173

    
174
}
(5-5/6)