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 nextapp.echo.app.Color;
018    import nextapp.echo.app.event.ActionEvent;
019    import ch.uzh.ifi.attempto.acewiki.Task;
020    import ch.uzh.ifi.attempto.acewiki.Wiki;
021    import ch.uzh.ifi.attempto.acewiki.core.AceWikiReasoner;
022    import ch.uzh.ifi.attempto.acewiki.core.Concept;
023    import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
024    
025    /**
026     * This class stands for an article page showing the article of a concept. At the
027     * moment, concepts are represented only by nouns.
028     * 
029     * @author Tobias Kuhn
030     */
031    public class ConceptPage extends ArticlePage {
032            
033            private static final long serialVersionUID = -505381176379658743L;
034    
035            private Concept concept;
036            
037            /**
038             * Creates a new article page for a concept.
039             * 
040             * @param concept The concept.
041             * @param wiki The wiki instance.
042             */
043            protected ConceptPage(Concept concept, Wiki wiki) {
044                    super(wiki, concept);
045                    this.concept = concept;
046                    
047                    addTab("Individuals", this);
048                    addTab("Hierarchy", this);
049            }
050            
051            public OntologyElement getOntologyElement() {
052                    return concept;
053            }
054    
055            public void actionPerformed(ActionEvent e) {
056                    super.actionPerformed(e);
057                    if ("Individuals".equals(e.getActionCommand())) {
058                            getWiki().showPage(new IndividualsPage(this));
059                    } else if ("Hierarchy".equals(e.getActionCommand())) {
060                            getWiki().showPage(new HierarchyPage(this));
061                    }
062            }
063            
064            protected void doUpdate() {
065                    super.doUpdate();
066                    
067                    getTitle().setText(getHeading(concept));
068                    
069                    Thread thread = new Thread() {
070                            public void run() {
071                                    synchronized (getWiki().getApplication()) {
072                                            getWiki().enqueueWeakAsyncTask(new Task() {
073                                                    
074                                                    private boolean satisfiable;
075                                                    
076                                                    public void run() {
077                                                            AceWikiReasoner r = concept.getOntology().getReasoner();
078                                                            satisfiable = r.isSatisfiable(concept);
079                                                    }
080                                                    
081                                                    public void updateGUI() {
082                                                            if (satisfiable) {
083                                                                    getTitle().setColor(Color.BLACK);
084                                                            } else {
085                                                                    getTitle().setColor(new Color(193, 0, 0));
086                                                            }
087                                                    }
088                                                    
089                                            });
090                                            try {
091                                                    sleep(500);
092                                            } catch (InterruptedException ex) {}
093                                    }
094                            }
095                    };
096                    thread.setPriority(Thread.MIN_PRIORITY);
097                    thread.start();
098            }
099    
100    }