    001    // This file is part of the Attempto Java Packages.
    002    // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
    003    //
    004    // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
    005    // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
    006    // either version 3 of the License, or (at your option) any later version.
    007    //
    008    // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
    009    // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
    010    // PURPOSE. See the GNU Lesser General Public License for more details.
    011    //
    012    // You should have received a copy of the GNU Lesser General Public License along with the Attempto
    013    // Java Packages. If not, see http://www.gnu.org/licenses/.
    014
    015    package ch.uzh.ifi.attempto.acewiki.gui.page;
    016
    017    import java.util.ArrayList;
    018    import java.util.Collections;
    019    import java.util.List;
    020
    021    import nextapp.echo2.app.Column;
    022    import nextapp.echo2.app.Component;
    023    import nextapp.echo2.app.Extent;
    024    import nextapp.echo2.app.Font;
    025    import nextapp.echo2.app.Insets;
    026    import nextapp.echo2.app.ResourceImageReference;
    027    import nextapp.echo2.app.Row;
    028    import nextapp.echo2.app.event.ActionEvent;
    029    import nextapp.echo2.app.event.ActionListener;
    030    import ch.uzh.ifi.attempto.acewiki.core.ontology.Concept;
    031    import ch.uzh.ifi.attempto.acewiki.core.ontology.Individual;
    032    import ch.uzh.ifi.attempto.acewiki.core.ontology.Sentence;
    033    import ch.uzh.ifi.attempto.acewiki.gui.IndexBar;
    034    import ch.uzh.ifi.attempto.acewiki.gui.TextRow;
    035    import ch.uzh.ifi.attempto.acewiki.gui.Title;
    036    import ch.uzh.ifi.attempto.echocomp.DelayedComponent;
    037    import ch.uzh.ifi.attempto.echocomp.Label;
    038    import ch.uzh.ifi.attempto.echocomp.SolidLabel;
    039    import ch.uzh.ifi.attempto.echocomp.VSpace;
    040
    041    /**
    042     * This class represents a page that shows all individuals that belong to a certain concept.
    043     *
    044     * @author Tobias Kuhn
    045     */
    046    public class IndividualsPage extends WikiPage implements ActionListener {
    047
    048            private static final long serialVersionUID = 4273564259160715684L;
    049
    050            private static final int pageSize = 20;
    051
    052            private ConceptPage page;
    053            private Column individualsColumn = new Column();
    054            private int chosenPage = 0;
    055
    056            /**
    057             * Creates a new individuals page.
    058             *
    059             * @param page The main page that contains the article.
    060             */
    061            public IndividualsPage(ConceptPage page) {
    062                    super(page.getWiki(), new Title(page.getOntologyElement().getHeadword(), "- Individuals"));
    063                    this.page = page;
    064
    065                    addTab("Article", this);
    066                    addTab("Noun", this);
    067                    addTab("References", this);
    068                    addSelectedTab("Individuals");
    069                    addTab("Hierarchy", this);
    070
    071                    add(new VSpace(18));
    072
    073                    add(individualsColumn);
    074            }
    075
    076            protected void doUpdate() {
    077                    getTitle().setText(page.getOntologyElement().getHeadword());
    078                    individualsColumn.removeAll();
    079
    080                    Column waitComp = new Column();
    081                    waitComp.setInsets(new Insets(10, 0, 0, 0));
    082                    waitComp.add(new Label(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/wait.gif")));
    083
    084                    if (((Concept) page.getOntologyElement()).areIndividualsCached()) {
    085                            individualsColumn.add(new IndividualsComponent());
    086                    } else {
    087                            individualsColumn.add(new DelayedComponent(waitComp) {
    088
    089                                    private static final long serialVersionUID = -992569061632136205L;
    090
    091                                    public Component initComponent() {
    092                                            return new IndividualsComponent();
    093                                    }
    094
    095                            });
    096                    }
    097            }
    098
    099            public void actionPerformed(ActionEvent e) {
    100                    if ("Article".equals(e.getActionCommand())) {
    101                            log("page", "pressed: article");
    102                            getWiki().showPage(page);
    103                    } else if ("Noun".equals(e.getActionCommand())) {
    104                            log("page", "pressed: word");
    105                            getWiki().showPage(new WordPage(page));
    106                    } else if ("References".equals(e.getActionCommand())) {
    107                            log("page", "pressed: references");
    108                            getWiki().showPage(new ReferencesPage(page));
    109                    } else if ("Hierarchy".equals(e.getActionCommand())) {
    110                            log("page", "pressed: hierarchy");
    111                            getWiki().showPage(new HierarchyPage(page));
    112                    }
    113            }
    114
    115            public boolean equals(Object obj) {
    116                    if (obj instanceof IndividualsPage) {
    117                            return page.equals(((IndividualsPage) obj).page);
    118                    }
    119                    return false;
    120            }
    121
    122            public boolean isExpired() {
    123                    return page.isExpired();
    124            }
    125
    126            public String toString() {
    127                    return "-IND- " + page.getOntologyElement().getWord();
    128            }
    129
    130
    131            private class IndividualsComponent extends Column implements ActionListener {
    132
    133                    private static final long serialVersionUID = -2897618204616741456L;
    134
    135                    private Column sentencesColumn = new Column();
    136                    private IndexBar indexBar;
    137                    private ArrayList<Sentence> sentences;
    138
    139
    140                    public IndividualsComponent() {
    141                            indexBar = new IndexBar("Page:", 0, this);
    142                            add(indexBar);
    143
    144                            sentencesColumn.setInsets(new Insets(10, 2, 5, 20));
    145                            sentencesColumn.setCellSpacing(new Extent(2));
    146                            add(sentencesColumn);
    147
    148                            Concept concept = (Concept) page.getOntologyElement();
    149                            List<Individual> individuals = concept.getIndividuals();
    150                            sentences = new ArrayList<Sentence>();
    151                            Collections.sort(individuals);
    152                            for (Individual ind : individuals) {
    153                                    sentences.add(new Sentence(ind.getWord() + " is a " + concept.getWord() + ".", concept.getOntology()));
    154                            }
    155                            if (sentences.size() == 0) {
    156                                    indexBar.setVisible(false);
    157                                    sentencesColumn.add(new SolidLabel("(no individual found)", Font.ITALIC, 10));
    158                            } else {
    159                                    int i = ((sentences.size()-1) / pageSize) + 1;
    160                                    if (chosenPage > i) chosenPage = 0;
    161                                    indexBar.setNumbers(i);
    162                                    indexBar.setActiveButton(chosenPage);
    163                                    updatePage();
    164                            }
    165                    }
    166
    167                    private void updatePage() {
    168                            sentencesColumn.removeAll();
    169
    170                            indexBar.setVisible(sentences.size() > pageSize);
    171
    172                            int max = sentences.size();
    173                            if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
    174
    175                            for (int i = chosenPage * pageSize; i < max; i++) {
    176                                    Row r = new Row();
    177                                    r.add(new TextRow(sentences.get(i), IndividualsPage.this));
    178                                    sentencesColumn.add(r);
    179                            }
    180                    }
    181
    182                    public void actionPerformed(ActionEvent e) {
    183                            if (e.getSource() == indexBar) {
    184                                    chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
    185                                    log("page", "pressed: page " + (chosenPage+1));
    186                                    updatePage();
    187                            }
    188                    }
    189
    190            }
    191
    192    }