| 1 19 20 package org.objectweb.jac.aspects.gui; 21 22 import java.util.Arrays ; 23 import java.util.Collection ; 24 import java.util.Iterator ; 25 import java.util.List ; 26 import java.util.Map ; 27 import java.util.Vector ; 28 import org.apache.log4j.Logger; 29 import org.objectweb.jac.aspects.integrity.RoleWrapper; 30 import org.objectweb.jac.aspects.session.SessionAC; 31 import org.objectweb.jac.core.Collaboration; 32 import org.objectweb.jac.core.Interaction; 33 import org.objectweb.jac.core.ObjectRepository; 34 import org.objectweb.jac.core.Wrappee; 35 import org.objectweb.jac.core.Wrapping; 36 import org.objectweb.jac.core.rtti.AbstractMethodItem; 37 import org.objectweb.jac.core.rtti.ClassItem; 38 import org.objectweb.jac.core.rtti.ClassRepository; 39 import org.objectweb.jac.core.rtti.CollectionItem; 40 import org.objectweb.jac.core.rtti.FieldItem; 41 import org.objectweb.jac.core.rtti.MemberItem; 42 import org.objectweb.jac.core.rtti.MethodItem; 43 import org.objectweb.jac.core.rtti.NamingConventions; 44 import org.objectweb.jac.core.rtti.RttiAC; 45 import org.objectweb.jac.util.ExtArrays; 46 import org.objectweb.jac.util.Strings; 47 48 53 54 public class EventHandler implements FieldUpdate { 55 static Logger logger = Logger.getLogger("gui.events"); 56 static Logger loggerDnd = Logger.getLogger("gui.dnd"); 57 static Logger loggerAssoc = Logger.getLogger("associations"); 58 59 static EventHandler singleton = new EventHandler(); 60 61 public static EventHandler get() { 62 return singleton; 63 } 64 65 73 74 public void onSelection( 75 DisplayContext context, 76 MemberItem container, 77 Object selectedObject, 78 FieldItem field, 79 Object extraOption) 80 { 81 onSelection( 82 context, 83 container, 84 selectedObject, 85 field, 86 extraOption, 87 false); 88 } 89 90 98 99 public void onView( 100 DisplayContext context, 101 MemberItem container, 102 Object selectedObject, 103 FieldItem field, 104 Object extraOption) 105 { 106 onSelection( 107 context, 108 container, 109 selectedObject, 110 field, 111 extraOption, 112 true); 113 } 114 115 129 public void onSelection( 130 DisplayContext context, 131 MemberItem container, 132 Object selectedObject, 133 FieldItem field, 134 Object extraOption, 135 boolean forceView) 136 { 137 logger.debug("onSelection(" 138 + (container != null ? container.getLongName() : "null") + "," 139 + Strings.hex(selectedObject) 140 + ",field="+ (field != null ? field.getLongName() : "null") 141 + ",force=" + forceView + ")"); 142 CustomizedDisplay display = context.getDisplay(); 143 ViewFactory factory = display.getFactory(); 144 CustomizedView customizedView = context.getCustomizedView(); 145 146 Collaboration.get().addAttribute(GuiAC.DISPLAY_CONTEXT, context); 147 148 if (container instanceof CollectionItem) { 150 if (GuiAC.isChoiceView((CollectionItem) container) 151 && !GuiAC.isExternalChoiceView((CollectionItem) container)) { 152 display.refresh(); 153 return; 154 } 155 } 156 157 MethodItem handler = null; 158 FieldItem targetField = null; 159 if (container != null) { 160 handler = GuiAC.getSelectionHandler(container); 161 targetField = 162 (FieldItem) container.getAttribute(GuiAC.SELECTION_TARGET); 163 } 164 165 if (customizedView == null && handler == null && targetField == null) { 166 if (forceView) { 167 logger.debug("showing in dialog mode " + "(customizedView==null)"); 168 display.show(selectedObject); 169 } else { 170 logger.debug("onSelection aborted " + "(customizedView==null)"); 171 display.refresh(); 172 } 173 return; 174 } 175 176 if (handler != null) { 177 try { 178 logger.debug("invoking selectionHandler " + handler); 179 Object result = 180 handler.invokeStatic( 181 new Object [] { context, container, selectedObject }); 182 if (handler.getType() != void.class && result != null) { 183 if (handler.getType() == HandlerResult.class) { 184 handleResult(context,(HandlerResult)result); 185 } else { 186 onSelection(context, null, result, null, null); 187 } 188 } 189 } catch (Exception e) { 190 logger.error( 191 "gui: invocation of event handler " + handler 192 + " for onSelection failed with " + e); 193 e.printStackTrace(); 194 } 195 } 196 197 if (targetField != null) { 198 selectedObject = targetField.getThroughAccessor(selectedObject); 199 logger.debug("selected target -> " + selectedObject); 200 } 201 202 if (customizedView == null) 203 return; 204 CustomizedGUI customized = customizedView.getCustomizedGUI(); 205 List targets = customized.getFieldTargets(container); 206 logger.debug("targets=" + targets); 207 208 if (targets != null) { 209 Iterator it = targets.iterator(); 210 while (it.hasNext()) { 211 Target target = (Target) it.next(); 213 logger.debug("target.path = " + target.panePath); 214 224 225 String paneId = target.panePath; 226 CompositeView targetView = 227 (CompositeView) customizedView.getView(paneId); 228 229 if (selectedObject != null) { 230 231 Collaboration.get().addAttribute( 232 GuiAC.SMALL_VIEW, 233 container.getAttribute(GuiAC.SMALL_TARGET_CONTAINER)); 234 try { 235 View view = 237 invalidatePane( 238 factory, 239 context, 240 targetView, 241 target.viewType, 242 target.viewParams, 243 selectedObject, 244 extraOption); 245 246 if (field != null && view != null) 247 setFocus(view, field, extraOption); 248 249 } finally { 250 Collaboration.get().removeAttribute(GuiAC.SMALL_VIEW); 251 } 252 } 253 maybeInvalidatePane(factory, context, customizedView, paneId); 255 } 256 display.refresh(); 257 } else if (forceView) { 258 if (container != null 259 && container.getAttribute(GuiAC.NEW_WINDOW) != null) { 260 display.openView(selectedObject); 261 } else { 262 display.show(selectedObject); 263 } 264 } 265 266 } 267 268 public void handleResult(DisplayContext context, HandlerResult hres) { 269 CustomizedView customizedView = context.getCustomizedView(); 270 CustomizedDisplay display = context.getDisplay(); 271 DisplayContext newContext = 272 new DisplayContext( 273 display, 274 hres.target != null 275 ? hres.target 276 : customizedView); 277 if (hres.target != null) 278 customizedView = hres.target; 279 onSelection( 280 newContext, 281 (CollectionItem) hres.container, 282 hres.object, 283 hres.field, 284 hres.extraOption); 285 } 286 287 292 public void maybeInvalidatePane( 293 ViewFactory factory, 294 DisplayContext context, 295 CustomizedView customizedView, 296 String selectedPaneID) 297 { 298 CustomizedGUI customized = customizedView.getCustomizedGUI(); 299 String invalidPaneID = customized.getInvalidPane(selectedPaneID); 300 logger.debug("invalidPane " + selectedPaneID + " -> " + invalidPaneID); 301 if (invalidPaneID != null) { 302 invalidatePane( 303 factory, 304 context, 305 (CompositeView) customizedView.getView(invalidPaneID), 306 "Empty", 307 ExtArrays.emptyStringArray, 308 null, 309 null); 310 } 311 } 312 313 322 public void setFocus(View top, FieldItem field, Object option) { 323 logger.debug("setFocus " + top + "," + field.getLongName() + "," + option); 324 if (top instanceof CompositeView) { 325 Iterator it = ((CompositeView) top).getViews().iterator(); 326 while (it.hasNext()) { 327 View view = (View) it.next(); 328 if (view instanceof TabsView) { 329 String [] categories = GuiAC.getCategories(field); 330 if (categories != null && categories.length > 0) { 331 ((TabsView) view).select(categories[0]); 332 setFocus( 333 ((CompositeView) view).getView(categories[0]), 334 field, 335 option); 336 } 337 } else { 338 setFocus(view, field, option); 339 } 340 } 341 } else if (top instanceof FieldEditor) { 342 FieldEditor editor = (FieldEditor) top; 343 if (editor.getField().equals(field)) { 344 editor.getContext().getCustomizedView().requestFocus(); 345 editor.onSetFocus(option); 346 } 347 } 348 } 349 350 354 386 387 393 View invalidatePane( 394 ViewFactory factory, 395 DisplayContext context, 396 CompositeView panel, 397 String viewType, 398 String [] viewParams, 399 Object selectedObject, 400 Object extraInfo) 401 { 402 logger.debug("invalidatePane("+panel+"," 403 +viewType+Arrays.asList(viewParams)+ ","+selectedObject+")"); 404 Collection comps = panel.getViews(); 405 View view = null; 406 Object [] parameters; 408 if (selectedObject != null) { 409 parameters = ExtArrays.add(selectedObject, viewParams); 410 } else { 411 parameters = viewParams; 412 } 413 if (!panel.containsView(viewType, parameters)) { 414 logger.debug("new view " + viewType + ", extraInfo=" + extraInfo); 415 view = 416 factory.createView( 417 "target[?]", 418 viewType, 419 parameters, 420 context); 421 if (extraInfo instanceof CollectionPosition && 422 GuiAC.hasSetNavBar( 423 context.getCustomizedView().getCustomizedGUI(), 424 ((CollectionPosition)extraInfo).getCollection())) 425 { 426 view.setParentView( 427 view = 428 factory.createView( 429 "collectionItemView", 430 "CollectionItemView", 431 new Object [] { 432 view, 433 extraInfo, 434 viewType, 435 viewParams, 436 null }, 437 context)); 438 } 439 logger.debug("new view CREATED"); 440 panel.addView(view, GuiAC.toString(selectedObject)); 441 442 } else { 443 Iterator i = comps.iterator(); 444 while (i.hasNext()) { 445 view = (View) i.next(); 446 if (view.equalsView(viewType,parameters)) { 447 return view; 448 } 449 } 450 return null; 451 } 452 453 return view; 454 } 455 456 459 public static void initAutocreatedObject( 460 Object created, 461 Object substance, 462 FieldItem role) 463 { 464 FieldItem oppositeRole = 465 (FieldItem) role.getAttribute(RttiAC.OPPOSITE_ROLE); 466 logger.debug("oppositeRole = " + oppositeRole); 467 if (oppositeRole != null) { 468 RoleWrapper.disableRoleUpdate(oppositeRole); 469 try { 470 if (oppositeRole instanceof CollectionItem) { 471 ((CollectionItem) oppositeRole).addThroughAdder( 472 created, 473 substance); 474 } else { 475 oppositeRole.setThroughWriter(created, substance); 476 } 477 } catch (Exception e) { 478 logger.error( 479 "initAutocreatedObject(created=" + created 480 + ",substance=" + substance 481 + "role=" + role 482 + "): " + e); 483 } finally { 484 RoleWrapper.enableRoleUpdate(oppositeRole); 485 } 486 } 487 } 488 489 497 public void onNodeSelection( 498 DisplayContext context, 499 AbstractNode node, 500 boolean forceView) 501 { 502 logger.debug("onNodeSelection " + node); 503 AbstractNode parentNode = (AbstractNode) node.getParent(); 504 if (parentNode != null) { 505 onNodeSelection(context, parentNode, false); 507 } 508 if (node instanceof ObjectNode) { 509 onSelection( 510 context, 511 ((ObjectNode) node).getRelation(), 512 node.getUserObject(), 513 null, 514 null, 515 forceView); 516 } else if (node instanceof RootNode) { 517 onSelection( 518 context, 519 null, 520 node.getUserObject(), 521 null, 522 null, 523 forceView); 524 } 525 } 526 527 536 public void onInvokeDirect( 537 DisplayContext context, 538 Object substance, 539 AbstractMethodItem method, 540 Object [] parameters) 541 { 542 Collaboration.get().addAttribute(GuiAC.DISPLAY_CONTEXT, context); 543 method.invoke(substance, parameters); 544 } 545 546 556 public InvokeThread onInvoke( 557 DisplayContext context, 558 InvokeEvent invoke) 559 { 560 return onInvoke(context, invoke, null, null); 561 } 562 563 575 public InvokeThread onInvoke( 576 DisplayContext context, 577 InvokeEvent invoke, 578 String [] attrNames, 579 Object [] attrValues) 580 { 581 return onInvoke(context, invoke, true, attrNames, attrValues); 582 } 583 584 598 public InvokeThread onInvoke( 599 DisplayContext context, 600 InvokeEvent invoke, 601 boolean askFormParameters, 602 String [] attrNames, 603 Object [] attrValues) 604 { 605 logger.debug("onInvoke(" + context + "," + invoke + ")"); 606 CustomizedDisplay display = context.getDisplay(); 607 if (attrNames == null) 608 attrNames = ExtArrays.emptyStringArray; 609 if (attrValues == null) 610 attrValues = ExtArrays.emptyStringArray; 611 Class [] parameterTypes = invoke.getMethod().getParameterTypes(); 612 int parametersLeft = parameterTypes.length; 613 Object [] parameters = invoke.getParameters(); 614 if (parameters == null) { 615 parameters = new Object [parameterTypes.length]; 616 } else if (parameters.length < parameterTypes.length) { 617 parametersLeft -= parameters.length; 620 Object [] tmp = new Object [parameterTypes.length]; 621 System.arraycopy( 622 parameters, 623 0, 624 tmp, 625 parameterTypes.length - parameters.length, 626 parameters.length); 627 parameters = tmp; 628 } 629 if (parameters.length > 0 630 && parameterTypes[0] == DisplayContext.class) { 631 parametersLeft--; 632 parameters[0] = context; 633 } 634 invoke.setParameters(parameters); 635 Object sid = Collaboration.get().getAttribute(SessionAC.SESSION_ID); 637 if (parametersLeft == 0) { 638 logger.debug("Invoking " + invoke); 639 String [] names = new String [2 + attrNames.length]; 640 Object [] values = new Object [2 + attrNames.length]; 641 names[0] = GuiAC.DISPLAY_CONTEXT; 642 values[0] = context; 643 names[1] = SessionAC.SESSION_ID; 644 values[1] = sid; 645 System.arraycopy(attrNames, 0, names, 2, attrNames.length); 646 System.arraycopy(attrValues, 0, values, 2, attrNames.length); 647 return 648 InvokeThread.run( 649 invoke, 650 null, 651 null, 652 names, 653 values); 654 } else { 655 logger.debug("Invoking " + invoke + 657 " (ask for parameters is on, " 658 + parametersLeft + " parameters left)"); 659 660 String [] names = new String [4 + attrNames.length]; 661 Object [] values = new Object [4 + attrNames.length]; 662 names[0] = GuiAC.DISPLAY_CONTEXT; 663 values[0] = context; 664 names[1] = SessionAC.SESSION_ID; 665 values[1] = sid; 666 names[2] = GuiAC.ASK_FOR_PARAMETERS; 667 names[3] = GuiAC.INVOKED_METHOD; 668 if (ExtArrays.indexOf(parameters, null) != -1 && askFormParameters) { 670 values[2] = invoke.getMethod().getConcreteMethod(); 671 values[3] = invoke.getMethod(); 672 } 673 674 System.arraycopy(attrNames, 0, names, 4, attrNames.length); 675 System.arraycopy(attrValues, 0, values, 4, attrNames.length); 676 return 677 InvokeThread.run( 678 invoke, 679 null, 680 null, 681 names, 682 values); 683 } 684 } 685 686 692 public Object onInvokeSynchronous( 693 DisplayContext context, 694 InvokeEvent invoke) 695 { 696 logger.debug("onInvokeSynchronous(" + context + "," + invoke + ")"); 697 CustomizedDisplay display = context.getDisplay(); 698 Class [] parameterTypes = invoke.getMethod().getParameterTypes(); 699 int parametersLeft = parameterTypes.length; 700 Object [] parameters = invoke.getParameters(); 701 if (parameters == null) { 702 parameters = new Object [parameterTypes.length]; 703 } else if (parameters.length < parameterTypes.length) { 704 parametersLeft -= parameters.length; 707 Object [] tmp = new Object [parameterTypes.length]; 708 System.arraycopy( 709 parameters, 710 0, 711 tmp, 712 parameterTypes.length - parameters.length, 713 parameters.length); 714 parameters = tmp; 715 } 716 if (parameters.length > 0 717 && parameterTypes[0] == DisplayContext.class) { 718 parametersLeft--; 719 parameters[0] = context; 720 } 721 722 String [] names; 723 Object [] values; 724 725 Object sid = Collaboration.get().getAttribute(SessionAC.SESSION_ID); 727 if (parametersLeft == 0) { 728 logger.debug("Invoking " + invoke); 729 names = 730 new String [] { GuiAC.DISPLAY_CONTEXT, SessionAC.SESSION_ID }; 731 values = new Object [] { context, sid }; 732 } else { 733 logger.debug("Invoking " + invoke 735 + " (ask for parameters is on, " 736 + parametersLeft + " parameters left)"); 737 names = 738 new String [] { 739 GuiAC.DISPLAY_CONTEXT, 740 SessionAC.SESSION_ID, 741 GuiAC.ASK_FOR_PARAMETERS }; 742 values = new Object [] { context, sid, invoke.getMethod() }; 743 } 744 745 invoke.setParameters(parameters); 746 InvokeThread thread = 747 new InvokeThread( 748 invoke, 749 null, 750 null, 751 names, 752 values); 753 thread.start(); 754 return thread.getReturnValue(); 755 } 7
|