// This file is part of AceWiki.
// Copyright 2008-2013, AceWiki developers.
//
// AceWiki 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.
//
// AceWiki 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 AceWiki. If
// not, see http://www.gnu.org/licenses/.
package ch.uzh.ifi.attempto.acewiki.gui;
import java.util.List;
import nextapp.echo.app.Column;
import nextapp.echo.app.Font;
import nextapp.echo.app.Insets;
import ch.uzh.ifi.attempto.acewiki.Task;
import ch.uzh.ifi.attempto.acewiki.Wiki;
import ch.uzh.ifi.attempto.acewiki.core.AnswerElement;
import ch.uzh.ifi.attempto.acewiki.core.CachingReasoner;
import ch.uzh.ifi.attempto.acewiki.core.Question;
import ch.uzh.ifi.attempto.base.TextContainer;
import ch.uzh.ifi.attempto.echocomp.SolidLabel;
import ch.uzh.ifi.attempto.echocomp.VSpace;
/**
* This class shows a list of ontology elements as the answer for a given question. If the answer
* has to be recalculated, this recalculation is done asynchronously.
*
* @author Tobias Kuhn
*/
class AnswerList extends Column {
private static final long serialVersionUID = -2489300900348078442L;
private Wiki wiki;
private Question question;
private RecalcIcon recalcIcon;
/**
* Creates a new answer list for a given question.
*
* @param wiki The wiki object.
* @param question The question for which the answers should be shown.
* @param recalcIcon The recalculation icon.
*/
public AnswerList(Wiki wiki, Question question, RecalcIcon recalcIcon) {
this.wiki = wiki;
this.question = question;
this.recalcIcon = recalcIcon;
setInsets(new Insets(20, 0, 0, 0));
updateAnswers();
}
/**
* Recalculates the answers and updates the answer list.
*/
public void updateAnswers() {
removeAll();
final CachingReasoner cr = wiki.getOntology().getReasoner();
Column cachedAnswerCol = new Column();
List<AnswerElement> cachedAnswer = cr.getCachedAnswer(question);
addAnswerToColumn(cachedAnswer, cachedAnswerCol);
add(cachedAnswerCol);
if (cachedAnswer == null || !cr.isCachedAnswerUpToDate(question)) {
// Answer is not cached or not up-to-date: recalculation
recalcIcon.setVisible(true);
wiki.enqueueWeakAsyncTask(new Task() {
private Column column;
public void run() {
column = new Column();
addAnswerToColumn(cr.getAnswer(question), column);
}
public void updateGUI() {
removeAll();
add(column);
recalcIcon.setVisible(false);
}
});
}
}
/**
* This method adds the graphical components for the given answer to the given column.
*
* @param answer The answer as a list of ontology elements.
* @param column The column to which the answer should be added.
*/
private void addAnswerToColumn(List<AnswerElement> answer, Column column) {
if (answer == null) {
// The answer is still being calculated, or an error occurred
column.add(new SolidLabel("...", Font.ITALIC, 10));
} else if (answer.size() > 0) {
String lang = wiki.getLanguage();
// Non-empty answer
for (AnswerElement ae : answer) {
TextContainer tc = ae.getAnswerText(lang);
column.add(new ListItem(new TextRow(tc.getTextElements(), wiki)));
}
} else {
// Empty answer
column.add(new SolidLabel(wiki.getGUIText("acewiki_answer_empty"), Font.ITALIC, 10));
}
column.add(new VSpace(4));
}
}