001    /**
002     * Copyright (C) 2007-2008, Jens Lehmann
003     *
004     * This file is part of DL-Learner.
005     * 
006     * DL-Learner is free software; you can redistribute it and/or modify
007     * it under the terms of the GNU General Public License as published by
008     * the Free Software Foundation; either version 3 of the License, or
009     * (at your option) any later version.
010     *
011     * DL-Learner is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014     * GNU General Public License for more details.
015     *
016     * You should have received a copy of the GNU General Public License
017     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
018     *
019     */
020    
021    package org.dllearner.tools.ore;
022    
023    import java.awt.event.ActionEvent;
024    import java.awt.event.ActionListener;
025    import java.awt.event.MouseEvent;
026    import java.awt.event.MouseListener;
027    import java.util.HashSet;
028    import java.util.Set;
029    
030    import javax.swing.DefaultListModel;
031    import javax.swing.JButton;
032    import javax.swing.event.ListSelectionEvent;
033    import javax.swing.event.ListSelectionListener;
034    
035    import org.dllearner.core.owl.Individual;
036    import org.semanticweb.owl.model.OWLOntologyChange;
037    
038    
039    
040    /**
041     * Wizard panel descriptor where it is possible torepair wrong examples.
042     * @author Lorenz Buehmann
043     *
044     */
045    public class RepairPanelDescriptor extends WizardPanelDescriptor implements ActionListener, ListSelectionListener, MouseListener{
046        
047        public static final String IDENTIFIER = "REPAIR_PANEL";
048        public static final String INFORMATION = "In this panel all positive and negative examples, that cause failures are shown in the list above. " 
049                                                                                            + "Select one of them and choose action to solve problem by press one of buttons aside the list.";
050        
051        private RepairPanel repairPanel;
052        private Set<OWLOntologyChange> ontologyChanges;
053        private ORE ore;
054        private OntologyModifier modi;
055       
056        
057        public RepairPanelDescriptor() {
058            
059            repairPanel = new RepairPanel();
060           
061            repairPanel.addActionListeners(this);
062            repairPanel.addSelectionListeners(this);
063            repairPanel.addMouseListeners(this);
064            
065            setPanelDescriptorIdentifier(IDENTIFIER);
066            setPanelComponent(repairPanel);
067            ontologyChanges = new HashSet<OWLOntologyChange>();
068            
069         
070        }
071        
072        @Override
073            public Object getNextPanelDescriptor() {
074            return SavePanelDescriptor.IDENTIFIER;
075        }
076        
077        @Override
078            public Object getBackPanelDescriptor() {
079            return LearningPanelDescriptor.IDENTIFIER;
080        }
081        
082        @Override
083            public void aboutToDisplayPanel() {
084            getWizard().getInformationField().setText(INFORMATION);
085        }
086        
087        /**
088         * Adds the wrong negative and positive examples to the lists.
089         */
090        public void refreshExampleLists(){
091            this.ore = getWizardModel().getOre();
092            repairPanel.setCellRenderers(ore);
093            
094            DefaultListModel negModel = repairPanel.getNegFailureModel();
095            negModel.clear();
096            for(Individual ind : ore.getNewClassDescription().getCoveredNegatives()){
097                    negModel.addElement(ind);
098            }
099            
100            DefaultListModel posModel = repairPanel.getPosFailureModel();
101            posModel.clear();
102            for(Individual ind : ore.getNewClassDescription().getNotCoveredPositives()){
103                    posModel.addElement(ind);
104            }
105            
106            
107        }
108       
109       
110        /**
111         * Method to control actions by button pressed.
112         */
113            public void actionPerformed(ActionEvent event) {
114    //              ore = getWizardModel().getOre();
115            modi = ore.getModifier();       
116                    String actionName = ((JButton) event.getSource()).getName();
117                    String actionType = ((JButton) event.getSource()).getParent().getName();
118                    
119                    if(actionType.equals("negative")){
120                            Individual ind = (Individual) repairPanel.getNegFailureList().getSelectedValue();
121                                    if(actionName.equals("negRepair")){
122                                            RepairDialog negDialog = new RepairDialog(ind, getWizard().getDialog(), ore, "neg");
123                                            int returncode = negDialog.showDialog();
124                                            if(returncode == 2){
125                                                    ontologyChanges.addAll(negDialog.getAllChanges());
126                                            } else if(returncode == 3){
127                                                    ontologyChanges.addAll(negDialog.getAllChanges());
128                                                    repairPanel.getNegFailureModel().removeElement(ind);
129                                            }
130                                    } else if(actionName.equals("negAdd")){
131                                            ontologyChanges.addAll(modi.addClassAssertion(ind, ore.getIgnoredConcept()));
132                                            repairPanel.getNegFailureModel().removeElement(ind);
133                                            
134                                    } else if(actionName.equals("negDelete")){
135                                            ontologyChanges.addAll(modi.deleteIndividual(ind));
136                                            repairPanel.getNegFailureModel().removeElement(ind);
137                                    
138                                    }
139                    } else if(actionType.equals("positive")){
140                            Individual ind = (Individual) repairPanel.getPosFailureList().getSelectedValue();
141                            if(actionName.equals("posRepair")){
142                                    RepairDialog posDialog = new RepairDialog(ind, getWizard().getDialog(), ore, "pos");
143                                    int returncode = posDialog.showDialog();
144                                    if(returncode == 2){
145                                            ontologyChanges.addAll(posDialog.getAllChanges());
146                                    } else if(returncode == 3){
147                                            ontologyChanges.addAll(posDialog.getAllChanges());
148                                            repairPanel.getPosFailureModel().removeElement(ind);
149                                    }
150                            } else if(actionName.equals("posRemove")){
151                                    ontologyChanges.addAll(modi.addClassAssertion(ind, ore.getIgnoredConcept()));
152                                    repairPanel.getPosFailureModel().removeElement(ind);
153                                    
154                            } else if(actionName.equals("posDelete")){
155                                    ontologyChanges.addAll(modi.deleteIndividual(ind));
156                                    repairPanel.getPosFailureModel().removeElement(ind);
157                                    
158                            }
159                    }
160                    
161                    
162            }
163            
164            /**
165             * Method provides repair action by double click on list element.
166             */
167            public void mouseClicked(MouseEvent e) {
168                    
169                    if(e.getClickCount() == 2){
170                            if(e.getSource() == repairPanel.getNegFailureList()){
171                                    Individual ind = (Individual) repairPanel.getNegFailureList().getSelectedValue();
172                                    RepairDialog negDialog = new RepairDialog(ind, getWizard().getDialog(), getWizardModel().getOre(), "neg");
173                                    int returncode = negDialog.showDialog();
174                                    if(returncode == 2){
175                                            ontologyChanges.addAll(negDialog.getAllChanges());
176                                            
177                                    } else if(returncode == 3){
178                                            ontologyChanges.addAll(negDialog.getAllChanges());
179                                            repairPanel.getNegFailureModel().removeElement(ind);
180                                    }
181                            } else if(e.getSource() == repairPanel.getPosFailureList()){
182                                    Individual ind = (Individual) repairPanel.getPosFailureList().getSelectedValue();
183                                    RepairDialog posDialog = new RepairDialog(ind, getWizard().getDialog(), getWizardModel().getOre(), "pos");
184                                    int returncode = posDialog.showDialog();
185                                    if(returncode == 2){
186                                            ontologyChanges.addAll(posDialog.getAllChanges());
187                                            
188                                    } else if(returncode == 3){
189                                            ontologyChanges.addAll(posDialog.getAllChanges());
190                                            repairPanel.getPosFailureModel().removeElement(ind);
191                                    }
192                            }
193                    }
194                    
195            }
196            @Override
197            public void mouseEntered(MouseEvent e) {
198                                    
199            }
200            @Override
201            public void mouseExited(MouseEvent e) {
202                    // TODO Auto-generated method stub
203                    
204            }
205            @Override
206            public void mousePressed(MouseEvent e) {
207                    // TODO Auto-generated method stub
208                    
209            }
210            @Override
211            public void mouseReleased(MouseEvent e) {
212                    // TODO Auto-generated method stub
213                    
214            }
215    
216            /**
217             * Returns all ontology changes been done by repairing ontology.
218             */
219            public Set<OWLOntologyChange> getOntologyChanges() {
220                    return ontologyChanges;
221            }
222    
223            @Override
224            public void valueChanged(ListSelectionEvent arg0) {
225                    // TODO Auto-generated method stub
226                    
227            }
228            
229    }
230    
231