/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fenix IST 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
package pt.ist.fenix.ui.renderers;
import java.util.Collection;
import java.util.HashSet;
import org.fenixedu.academic.domain.organizationalStructure.Unit;
import pt.ist.fenix.domain.UnitFile;
import pt.ist.fenix.domain.UnitFileTag;
import pt.ist.fenixWebFramework.renderers.components.HtmlLink;
public class AdvancedTagCloudSearchRenderer extends TagCloudRenderer {
private String selectedTags;
private String parameter;
private String selectedTagClass;
private String nearByTagClass;
private Collection<UnitFileTag> tags;
public String getNearByTagClass() {
return nearByTagClass;
}
public void setNearByTagClass(String nearByTagClass) {
this.nearByTagClass = nearByTagClass;
}
public String getSelectedTagClass() {
return selectedTagClass;
}
public void setSelectedTagClass(String selectedTagClass) {
this.selectedTagClass = selectedTagClass;
}
public String getParameter() {
return parameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
public String getSelectedTags() {
return selectedTags;
}
public void setSelectedTags(String selectedTags) {
this.selectedTags = selectedTags;
}
@Override
public String getExtraTagClasses(UnitFileTag tag) {
if (isSelected(tag)) {
return getSelectedTagClass();
}
if (isNeighbour(tag)) {
return getNearByTagClass();
}
return super.getExtraTagClasses(tag);
}
@Override
protected void addExtraParameters(HtmlLink link, UnitFileTag tag) {
if (isSelected(tag)) {
link.setParameter(getParameter(), removeSelectedTag(tag.getName()));
} else {
link.setParameter(getParameter(), (selectedTags.length() > 0) ? selectedTags + " " + tag.getName() : tag.getName());
}
}
private String removeSelectedTag(String name) {
String[] tags = selectedTags.split("\\p{Space}+");
String newSelectedTags = "";
for (int i = tags.length - 1; i >= 0; i--) {
if (!tags[i].equals(name)) {
newSelectedTags += tags[i];
if (i > 0) {
newSelectedTags += " ";
}
}
}
return newSelectedTags.trim();
}
private boolean isSelected(UnitFileTag tag) {
String selectedTags = getSelectedTags();
if (selectedTags == null) {
return false;
}
int j = 0;
String[] tags = selectedTags.split("\\p{Space}+");
for (String tag2 : tags) {
if (tag2.equals(tag.getName())) {
j++;
}
}
return j == 1;
}
private boolean isNeighbour(UnitFileTag tag) {
if (selectedTags.length() == 0) {
return false;
}
for (UnitFile file : tag.getTaggedFilesSet()) {
if (file.hasUnitFileTags(materializeSelected(tag.getUnit()))) {
return true;
}
}
return false;
}
private Collection<UnitFileTag> materializeSelected(Unit unit) {
if (tags == null) {
String tagArray[] = selectedTags.split("\\p{Space}+");
this.tags = new HashSet<UnitFileTag>();
for (String element : tagArray) {
UnitFileTag tag = UnitFileTag.getUnitFileTag(unit, element);
if (tag != null) {
this.tags.add(tag);
}
}
}
return tags;
}
}