source: vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/components/FacetPanel.java @ 4608

Last change on this file since 4608 was 4608, checked in by Twan Goosen, 10 years ago

detaching from components with multiple models

File size: 6.2 KB
Line 
1/*
2 * Copyright (C) 2014 CLARIN
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17package eu.clarin.cmdi.vlo.wicket.components;
18
19import eu.clarin.cmdi.vlo.pojo.ExpansionState;
20import eu.clarin.cmdi.vlo.pojo.FacetSelection;
21import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;
22import java.util.Collection;
23import java.util.HashSet;
24import org.apache.solr.client.solrj.response.FacetField;
25import org.apache.wicket.AttributeModifier;
26import org.apache.wicket.ajax.AjaxRequestTarget;
27import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
28import org.apache.wicket.markup.html.panel.Panel;
29import org.apache.wicket.model.AbstractReadOnlyModel;
30import org.apache.wicket.model.IModel;
31import org.apache.wicket.model.PropertyModel;
32
33/**
34 * Panel that displays a single facet based on the current query/value
35 * selection. Two children will be generated: a {@link FacetValuesPanel} and a
36 * {@link SelectedFacetPanel}. One of them is set visible (at {@link
37 * #onConfigure()}), depending on whether this facet has selected values.
38 *
39 * @author twagoo
40 */
41public abstract class FacetPanel extends Panel {
42
43    private final IModel<FacetSelection> selectionModel;
44    private final IModel<ExpansionState> expansionStateModel;
45
46    private final SelectedFacetPanel selectedFacetPanel;
47    private final FacetValuesPanel facetValuesPanel;
48
49    public FacetPanel(String id, IModel<FacetSelection> selectionModel, IModel<ExpansionState> expansionState) {
50        super(id, selectionModel);
51        this.selectionModel = selectionModel;
52        this.expansionStateModel = expansionState;
53
54        // panel showing values for selection
55        facetValuesPanel = createFacetValuesPanel("facetValues");
56        add(facetValuesPanel);
57
58        // panel showing current selection, allowing for deselection
59        selectedFacetPanel = createSelectedFacetPanel("facetSelection");
60        add(selectedFacetPanel);
61
62        addExpansionComponents();
63    }
64
65    @Override
66    protected void onConfigure() {
67        super.onConfigure();
68
69        final boolean valuesSelected = !selectionModel.getObject().getFacetValues().isEmpty();
70        facetValuesPanel.setVisible(!valuesSelected);
71        selectedFacetPanel.setVisible(valuesSelected);
72    }
73
74    private FacetValuesPanel createFacetValuesPanel(String id) {
75        return new FacetValuesPanel(id, new PropertyModel<FacetField>(selectionModel, "facetField")) {
76            @Override
77            public void onValuesSelected(String facet, Collection<String> value, AjaxRequestTarget target) {
78                // A value has been selected on this facet's panel, update the model!
79                selectionModel.getObject().getSelection().selectValues(facet, value);
80                // collapse after selection
81                expansionStateModel.setObject(ExpansionState.COLLAPSED);
82                if (target != null) {
83                    // reload entire page for now
84                    selectionChanged(target);
85                }
86            }
87        };
88    }
89
90    private SelectedFacetPanel createSelectedFacetPanel(String id) {
91        return new SelectedFacetPanel(id, selectionModel) {
92            @Override
93            public void onValuesUnselected(String facet, Collection<String> valuesRemoved, AjaxRequestTarget target) {
94                final QueryFacetsSelection selection = selectionModel.getObject().getSelection();
95                // Values have been removed, calculate remainder
96                final Collection<String> currentSelection = selection.getSelectionValues(facet);
97                final Collection<String> newSelection = new HashSet<String>(currentSelection);
98                newSelection.removeAll(valuesRemoved);
99                // Update model
100                selection.selectValues(facet, newSelection);
101                // collapse after removal
102                expansionStateModel.setObject(ExpansionState.COLLAPSED);
103                if (target != null) {
104                    // reload entire page for now
105                    selectionChanged(target);
106                }
107            }
108        };
109    }
110
111    private void addExpansionComponents() {
112
113        // class modifier to apply correct class depending on state
114        add(new AttributeModifier("class", new AbstractReadOnlyModel<String>() {
115
116            @Override
117            public String getObject() {
118                switch (expansionStateModel.getObject()) {
119                    case COLLAPSED:
120                        return "facet collapsedfacet";
121                    case EXPANDED:
122                        return "facet expandedfacet";
123                    default:
124                        return "facet";
125                }
126            }
127        }));
128
129        // add expansion link
130        add(new AjaxFallbackLink("expand") {
131
132            @Override
133            public void onClick(AjaxRequestTarget target) {
134                expansionStateModel.setObject(ExpansionState.EXPANDED);
135                if (target != null) {
136                    target.add(FacetPanel.this);
137                }
138            }
139        });
140
141        // add collapse link
142        add(new AjaxFallbackLink("collapse") {
143
144            @Override
145            public void onClick(AjaxRequestTarget target) {
146                expansionStateModel.setObject(ExpansionState.COLLAPSED);
147                if (target != null) {
148                    target.add(FacetPanel.this);
149                }
150            }
151        });
152        setOutputMarkupId(true);
153    }
154
155    @Override
156    public void detachModels() {
157        // this will detach selection model (passed to super through constructor)
158        super.detachModels();
159        // additional model not known by supertype
160        expansionStateModel.detach();
161    }
162
163    protected abstract void selectionChanged(AjaxRequestTarget target);
164
165}
Note: See TracBrowser for help on using the repository browser.