001 // This file is part of AceWiki. 002 // Copyright 2008-2012, AceWiki developers. 003 // 004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU 005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of 006 // the License, or (at your option) any later version. 007 // 008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 010 // Lesser General Public License for more details. 011 // 012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If 013 // not, see http://www.gnu.org/licenses/. 014 015 package ch.uzh.ifi.attempto.acewiki.gui; 016 017 import java.util.ArrayList; 018 import java.util.List; 019 020 import nextapp.echo.app.Column; 021 import nextapp.echo.app.Extent; 022 import nextapp.echo.app.Font; 023 import nextapp.echo.app.Insets; 024 import nextapp.echo.app.Row; 025 import nextapp.echo.app.event.ActionEvent; 026 import nextapp.echo.app.event.ActionListener; 027 import ch.uzh.ifi.attempto.acewiki.Task; 028 import ch.uzh.ifi.attempto.acewiki.core.CachingReasoner; 029 import ch.uzh.ifi.attempto.acewiki.core.Concept; 030 import ch.uzh.ifi.attempto.acewiki.core.Individual; 031 import ch.uzh.ifi.attempto.acewiki.core.LanguageUtils; 032 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement; 033 import ch.uzh.ifi.attempto.acewiki.core.Sentence; 034 import ch.uzh.ifi.attempto.acewiki.core.StatementFactory; 035 import ch.uzh.ifi.attempto.echocomp.SolidLabel; 036 import ch.uzh.ifi.attempto.echocomp.VSpace; 037 038 /** 039 * This class represents a page that shows to which concepts a certain individual belongs. 040 * Such concept memberships are called "assignments" in AceWiki. 041 * 042 * @author Tobias Kuhn 043 */ 044 public class AssignmentsPage extends WikiPage implements ActionListener { 045 046 private static final long serialVersionUID = -6955789540998283993L; 047 048 private static final int pageSize = 50; 049 050 private IndividualPage page; 051 private Column assignmentsColumn = new Column(); 052 private int chosenPage = 0; 053 private Title title; 054 055 /** 056 * Creates a new assignments page. 057 * 058 * @param page The main page that contains the article. 059 */ 060 public AssignmentsPage(IndividualPage page) { 061 super(page.getWiki()); 062 this.page = page; 063 064 addTab("Article", this); 065 addTab("References", this); 066 addSelectedTab("Assignments"); 067 068 OntologyElement oe = page.getOntologyElement(); 069 title = new Title(getHeading(oe), "- Assignments", oe.getType(), this); 070 add(title); 071 addHorizontalLine(); 072 add(assignmentsColumn); 073 } 074 075 protected void doUpdate() { 076 title.setText(getHeading(page.getOntologyElement())); 077 assignmentsColumn.removeAll(); 078 079 final Column waitComp = new Column(); 080 waitComp.setInsets(new Insets(10, 0, 0, 0)); 081 waitComp.add(new RecalcIcon("This list is being updated.")); 082 083 CachingReasoner cr = getWiki().getOntology().getReasoner(); 084 085 if (cr.areCachedConceptsUpToDate((Individual) page.getOntologyElement())) { 086 assignmentsColumn.add(new VSpace(18)); 087 assignmentsColumn.add(new AssignmentsComponent(true)); 088 } else { 089 assignmentsColumn.add(new VSpace(4)); 090 assignmentsColumn.add(waitComp); 091 assignmentsColumn.add(new AssignmentsComponent(true)); 092 page.getWiki().enqueueWeakAsyncTask(new Task() { 093 094 private AssignmentsComponent delayedComp; 095 096 public void run() { 097 delayedComp = new AssignmentsComponent(false); 098 } 099 100 public void updateGUI() { 101 assignmentsColumn.removeAll(); 102 assignmentsColumn.add(new VSpace(18)); 103 assignmentsColumn.add(delayedComp); 104 } 105 106 }); 107 } 108 } 109 110 public void actionPerformed(ActionEvent e) { 111 if ("Article".equals(e.getActionCommand())) { 112 log("page", "pressed: article"); 113 getWiki().showPage(page); 114 } else if ("References".equals(e.getActionCommand())) { 115 log("page", "pressed: references"); 116 getWiki().showPage(new ReferencesPage(page)); 117 } else if (e.getSource() == title) { 118 getWiki().showEditorWindow(page.getOntologyElement()); 119 } 120 } 121 122 public boolean equals(Object obj) { 123 if (obj instanceof AssignmentsPage) { 124 return page.equals(((AssignmentsPage) obj).page); 125 } 126 return false; 127 } 128 129 public boolean isExpired() { 130 return page.isExpired(); 131 } 132 133 public String toString() { 134 return "-ASS- " + page.getOntologyElement().getWord(); 135 } 136 137 138 private class AssignmentsComponent extends Column implements ActionListener { 139 140 private static final long serialVersionUID = -441448088305771435L; 141 142 private Column sentencesColumn = new Column(); 143 private IndexBar indexBar; 144 private List<Sentence> sentences; 145 146 public AssignmentsComponent(boolean cached) { 147 indexBar = new IndexBar("Page:", 0, this); 148 add(indexBar); 149 150 sentencesColumn.setInsets(new Insets(10, 2, 5, 20)); 151 sentencesColumn.setCellSpacing(new Extent(2)); 152 add(sentencesColumn); 153 154 CachingReasoner cr = getWiki().getOntology().getReasoner(); 155 Individual ind = (Individual) page.getOntologyElement(); 156 List<Concept> concepts; 157 if (cached) { 158 concepts = cr.getCachedConcepts(ind); 159 } else { 160 concepts = cr.getConcepts(ind); 161 } 162 if (concepts != null) { 163 sentences = new ArrayList<Sentence>(); 164 LanguageUtils.sortOntologyElements(concepts); 165 for (Concept c : concepts) { 166 StatementFactory sf = getWiki().getOntology().getStatementFactory(); 167 sentences.add(sf.createAssignmentSentence(ind, c)); 168 } 169 if (sentences.size() == 0) { 170 indexBar.setVisible(false); 171 sentencesColumn.add(new SolidLabel("(no assignment found)", Font.ITALIC, 10)); 172 } else { 173 int i = ((sentences.size()-1) / pageSize) + 1; 174 if (chosenPage > i) chosenPage = 0; 175 indexBar.setNumbers(i); 176 indexBar.setActiveButton(chosenPage); 177 updatePage(); 178 } 179 } else { 180 indexBar.setVisible(false); 181 sentencesColumn.add(new SolidLabel("...", Font.ITALIC, 10)); 182 } 183 } 184 185 private void updatePage() { 186 sentencesColumn.removeAll(); 187 188 indexBar.setVisible(sentences.size() > pageSize); 189 190 int max = sentences.size(); 191 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize; 192 193 for (int i = chosenPage * pageSize; i < max; i++) { 194 Row r = new Row(); 195 r.add(new SentenceComponent(sentences.get(i), AssignmentsPage.this)); 196 sentencesColumn.add(r); 197 } 198 } 199 200 public void actionPerformed(ActionEvent e) { 201 if (e.getSource() == indexBar) { 202 chosenPage = Integer.parseInt(e.getActionCommand()) - 1; 203 log("page", "pressed: page " + (chosenPage+1)); 204 updatePage(); 205 } 206 } 207 208 } 209 210 }