00001 package edu.tum.cs.ias.knowrob.vis.applets;
00002
00003 import java.awt.Color;
00004 import java.awt.Cursor;
00005 import java.awt.event.KeyEvent;
00006 import java.awt.event.MouseEvent;
00007 import java.awt.event.MouseListener;
00008 import java.awt.event.MouseMotionListener;
00009 import java.util.ArrayList;
00010 import java.util.Collections;
00011 import java.util.LinkedHashMap;
00012 import java.util.List;
00013 import java.util.Map;
00014
00015 import javax.vecmath.Vector2f;
00016
00017 import controlP5.ControlEvent;
00018 import controlP5.ControlP5;
00019 import controlP5.Controller;
00020 import controlP5.MultiList;
00021 import controlP5.MultiListButton;
00022 import controlP5.Textfield;
00023 import edu.tum.cs.ias.knowrob.owl.OWLClass;
00024 import edu.tum.cs.ias.knowrob.vis.themes.GreyTheme;
00025
00026 import processing.core.PApplet;
00027
00028
00035 public class OwlClassSelectorApplet extends PApplet implements MouseListener, MouseMotionListener {
00036
00037 private static final long serialVersionUID = 7695328948788620463L;
00038
00039
00043 public ControlP5 controlP5;
00044
00048 MultiList class_listbox ;
00049
00053 private Vector2f draggingStart;
00054
00058 private static final Cursor normalCursor = new Cursor(Cursor.DEFAULT_CURSOR);
00059
00063 private static final Cursor moveCursor = new Cursor(Cursor.MOVE_CURSOR);
00064
00065
00066
00070 private List<OWLClass> owl_classes;
00071
00075 private Map<Float, OWLClass> id2class;
00076
00080 private Map<String, MultiListButton> act2button;
00081
00085 private OWLClass searchResult = null;
00086
00090 private IClassSelectionCallback cb;
00091
00092
00093 private Textfield search;
00094
00095
00099 @Override
00100 public void setup()
00101 {
00102 size(800, 600);
00103
00104 if (this.frame != null)
00105 {
00106 this.frame.setTitle("OWL class selector");
00107 this.frame.setBackground(new Color(10, 10, 10));
00108 }
00109
00110 frameRate(10);
00111
00112 id2class = new LinkedHashMap<Float, OWLClass>();
00113 act2button = new LinkedHashMap<String, MultiListButton>();
00114
00115
00116 }
00117
00118
00122 @Override
00123 public void draw() {
00124
00125 background(50);
00126
00127 if(controlP5!=null) {
00128 synchronized(controlP5) {
00129 controlP5.draw();
00130 }
00131 }
00132 }
00133
00134
00135
00136 public void setBaseClass(String base) {
00137
00138 owl_classes = Collections.synchronizedList(new ArrayList<OWLClass>());
00139
00140 OWLClass basecl = OWLClass.getOWLClass(base);
00141 basecl.readFromProlog();
00142 owl_classes.addAll(basecl.getSubclasses());
00143
00144 initControlP5();
00145
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00163 private OWLClass searchOWLClass(String stringValue, List<OWLClass> owl_classes) {
00164
00165 synchronized (owl_classes) {
00166 for(OWLClass a : owl_classes) {
00167
00168 if(a.getIRI().toLowerCase().contains(stringValue.toLowerCase())) {
00169
00170 showSearchResult(a);
00171 return a;
00172
00173 } else if(a.getLabel().toLowerCase().contains(stringValue.toLowerCase())) {
00174
00175 showSearchResult(a);
00176 class_listbox.update();
00177
00178 return a;
00179
00180 } else if(a.getSubclasses().size()>0){
00181
00182 OWLClass found = searchOWLClass(stringValue, a.getSubclasses());
00183
00184 if(found!=null) {
00185 return found;
00186 }
00187 }
00188 }
00189 }
00190
00191 return null;
00192 }
00193
00194
00195
00196 private void showSearchResult(OWLClass a) {
00197
00198
00199 if(searchResult!=null && act2button.get(searchResult.getIRI())!=null)
00200 act2button.get(searchResult.getIRI()).setColorBackground(80);
00201
00202
00203 OWLClass tmp = a;
00204 while((tmp.getSuperClasses() != null) &&
00205 (!tmp.getSuperClasses().isEmpty()) &&
00206 (act2button.get(tmp.getSuperClasses().firstElement().getIRI()) !=null)) {
00207
00208 act2button.get(tmp.getSuperClasses().firstElement().getIRI()).open();
00209 tmp = tmp.getSuperClasses().firstElement();
00210 }
00211
00212
00213
00214 if(act2button!=null && act2button.get(a.getIRI())!=null)
00215 act2button.get(a.getIRI()).setColorBackground(color(180));
00216 searchResult = a;
00217 class_listbox.update();
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 public void controlEvent(ControlEvent ev) {
00230
00231
00232 if(ev.getController().getName().equals("search")) {
00233
00234 if(searchResult!=null) {
00235 cb.owlClassSelected(searchResult.getIRI());
00236 this.frame.setVisible(false);
00237 } else {
00238 searchOWLClass(ev.getStringValue(), owl_classes);
00239 }
00240 return;
00241 }
00242
00243 if(ev.getController().getName().equals("class list")) {
00244
00245 if(this.cb!=null && id2class!=null) {
00246 cb.owlClassSelected(id2class.get(Float.valueOf(ev.getValue())).getIRI());
00247 this.frame.setVisible(false);
00248
00249 } else {
00250 System.out.println("Selected class " + id2class.get(Float.valueOf(ev.getValue())).getIRI());
00251 }
00252 }
00253 }
00254
00255 public void keyPressed(KeyEvent e) {
00256
00257
00258 if(e.getKeyCode() == KeyEvent.VK_TAB) {
00259 searchOWLClass(((Textfield) search).getText(), owl_classes);
00260 return;
00261 } else {
00262 controlP5.keyHandler.keyEvent(e, controlP5.controlWindow, true);
00263 }
00264 }
00265
00266 @Override
00267 public void mouseDragged(MouseEvent e) {
00268
00269 if (draggingStart != null) {
00270
00271 this.class_listbox.updateLocation(e.getX() - draggingStart.x,
00272 e.getY() - draggingStart.y);
00273
00274 draggingStart.x = e.getX();
00275 draggingStart.y = e.getY();
00276 }
00277
00278
00279
00280 if (e.getButton() == MouseEvent.BUTTON1) {
00281 controlP5.controlWindow.mouseEvent(e);
00282 }
00283 }
00284
00285 @Override
00286 public void mousePressed(MouseEvent e) {
00287
00288 if (e.getButton() == MouseEvent.BUTTON3) {
00289
00290 draggingStart = new Vector2f(e.getX(),e.getY());
00291 setCursor(moveCursor);
00292
00293 } else {
00294 setCursor(normalCursor);
00295 }
00296
00297
00298
00299 if (e.getButton() == MouseEvent.BUTTON1) {
00300 controlP5.controlWindow.mouseEvent(e);
00301 }
00302 }
00303
00304 @Override
00305 public void mouseReleased(MouseEvent e) {
00306 setCursor(normalCursor);
00307 draggingStart = null;
00308
00309
00310
00311 if (e.getButton() == MouseEvent.BUTTON1) {
00312 controlP5.controlWindow.mouseEvent(e);
00313 }
00314 }
00315
00316 public void mouseClicked(MouseEvent e) {
00317
00318
00319
00320 if (e.getButton() == MouseEvent.BUTTON1) {
00321 controlP5.controlWindow.mouseEvent(e);
00322 }
00323 }
00324
00325 public void setClassSelectedCallback(IClassSelectionCallback cb) {
00326 this.cb = cb;
00327 }
00328
00329
00330
00331
00332
00333
00334
00335
00336
00340 private void initControlP5() {
00341
00342 controlP5 = new ControlP5(this);
00343 GreyTheme.applyStyle(controlP5);
00344
00345
00346 synchronized(controlP5) {
00347
00348 search = controlP5.addTextfield("search", 20, 20, 200, 20).setAutoClear(false).setFocus(true);
00349 class_listbox = GreyTheme.applyStyle(controlP5.addMultiList("class list", 20, 60, 80, 17));
00350
00351 float textwidth = textWidth("CheckingWhetherConditionObtains");
00352 class_listbox.setWidth((int)textwidth + 10);
00353
00354 createListButtons(owl_classes, class_listbox, 0, 0);
00355 }
00356 }
00357
00358
00367 private int createListButtons(List<OWLClass> owl_classes, Controller<?> parent, int start_idx, int level) {
00368
00369 int idx = start_idx;
00370 synchronized(owl_classes) {
00371 for(OWLClass act : owl_classes) {
00372
00373 MultiListButton b = null;
00374 if (parent instanceof MultiList) {
00375
00376 b = ((MultiList)parent).add(idx + "_" + act.getIRI(), idx++);
00377 configureButton(b, level, act);
00378
00379 } else if (parent instanceof MultiListButton) {
00380
00381 b = ((MultiListButton)parent).add(idx + "_" + act.getIRI(), idx++);
00382 configureButton(b, level, act);
00383 }
00384
00385 if(act.getSubclasses().size()>0)
00386 idx = createListButtons(act.getSubclasses(), b, idx, level+1);
00387 }
00388 }
00389 return idx;
00390 }
00391
00392
00393
00401 private void configureButton(MultiListButton b, int level, OWLClass act) {
00402
00403 GreyTheme.applyStyle(b);
00404 b.setCaptionLabel(act.getLabel());
00405
00406 if(level>=3)
00407 b.getCaptionLabel().setColor(color(10));
00408
00409 if(act2button==null)
00410 act2button = new LinkedHashMap<String, MultiListButton>();
00411
00412 act2button.put(act.getIRI(), b);
00413
00414 if(id2class==null)
00415 id2class = new LinkedHashMap<Float, OWLClass>();
00416
00417 id2class.put(b.getValue(), act);
00418 }
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 public static void main(String args[]) {
00433 PApplet.main(new String[] { "edu.tum.cs.ias.knowrob.vis.applets.OwlClassSelectorApplet" });
00434 }
00435
00436
00437
00438
00439 }
00440