1 19 27 28 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget; 29 30 import java.awt.BasicStroke ; 31 import java.awt.Color ; 32 import java.awt.Dimension ; 33 import java.awt.Graphics2D ; 34 import java.awt.Image ; 35 import java.awt.Insets ; 36 import java.awt.Paint ; 37 import java.awt.Point ; 38 import java.awt.Rectangle ; 39 import java.awt.RenderingHints ; 40 import java.awt.Shape ; 41 import java.awt.Stroke ; 42 import java.awt.datatransfer.DataFlavor ; 43 import java.awt.datatransfer.Transferable ; 44 import java.awt.event.ActionEvent ; 45 import java.awt.event.ActionListener ; 46 import java.awt.geom.Rectangle2D ; 47 import java.awt.geom.RoundRectangle2D ; 48 import java.util.Collection ; 49 import java.util.EnumSet ; 50 import java.util.List ; 51 52 import javax.swing.JTextField ; 53 54 import org.netbeans.api.visual.action.ActionFactory; 55 import org.netbeans.api.visual.action.InplaceEditorProvider; 56 import org.netbeans.api.visual.action.TextFieldInplaceEditor; 57 import org.netbeans.api.visual.action.WidgetAction; 58 import org.netbeans.api.visual.border.Border; 59 import org.netbeans.api.visual.layout.LayoutFactory; 60 import org.netbeans.api.visual.layout.LayoutFactory.SerialAlignment; 61 import org.netbeans.api.visual.model.ObjectState; 62 import org.netbeans.api.visual.widget.LabelWidget; 63 import org.netbeans.api.visual.widget.Scene; 64 import org.netbeans.api.visual.widget.Widget; 65 import org.netbeans.modules.visual.action.TextFieldInplaceEditorProvider; 66 import org.netbeans.modules.xml.refactoring.ui.util.AnalysisUtilities; 67 import org.netbeans.modules.xml.schema.model.GlobalElement; 68 import org.netbeans.modules.xml.schema.model.GlobalType; 69 import org.netbeans.modules.xml.schema.model.SchemaComponent; 70 import org.netbeans.modules.xml.wsdl.model.Message; 71 import org.netbeans.modules.xml.wsdl.model.Part; 72 import org.netbeans.modules.xml.wsdl.model.WSDLComponent; 73 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 74 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.border.FilledBorder; 75 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.border.GradientFillBorder; 76 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.layout.LeftRightLayout; 77 import org.netbeans.modules.xml.xam.AbstractComponent; 78 import org.netbeans.modules.xml.xam.ui.XAMUtils; 79 import org.openide.nodes.Node; 80 import org.openide.util.Lookup; 81 import org.openide.util.NbBundle; 82 import org.openide.util.Utilities; 83 84 85 public class MessageWidget extends AbstractWidget<Message> 86 implements ExpandableWidget, ActionListener , DnDHandler { 87 private static final boolean EXPANDED_DEFAULT = true; 88 private ButtonWidget addPartButton; 89 private ButtonWidget removePartButton; 90 91 private Widget contentWidget; 92 private Widget header; 93 private Widget table; 94 private Widget buttons; 95 96 private PartHitPointWidget partHitPointWidget; 97 private PartHitPointPosition partHitPointPosition; 98 99 private Object draggedObject; 100 101 private ExpanderWidget expanderWidget; 102 103 104 public MessageWidget(Scene scene, Message message, Lookup lookup) { 105 super(scene, message, lookup); 106 107 partHitPointWidget = new PartHitPointWidget(scene); 108 109 boolean expanded = ExpanderWidget.isExpanded(this, EXPANDED_DEFAULT); 110 expanderWidget = new ExpanderWidget(scene, this, expanded); 111 112 contentWidget = new Widget(scene); 113 contentWidget.setLayout(LayoutFactory.createVerticalLayout()); 114 115 addPartButton = new ButtonWidget(scene, NbBundle.getMessage( 116 MessageWidget.class, 117 "LBL_MessageWidget_AddPart")); addPartButton.setActionListener(this); 119 removePartButton = new ButtonWidget(scene, NbBundle.getMessage( 120 MessageWidget.class, 121 "LBL_MessageWidget_RemovePart")); removePartButton.setActionListener(this); 123 removePartButton.setButtonEnabled(false); 124 125 buttons = new Widget(scene); 126 buttons.setBorder(BUTTONS_BORDER); 127 buttons.setLayout(LayoutFactory.createHorizontalLayout( 128 SerialAlignment.LEFT_TOP, 8)); 129 buttons.addChild(addPartButton); 130 buttons.addChild(removePartButton); 131 132 setBorder(MAIN_BORDER); 133 setOpaque(true); 134 setLayout(LayoutFactory.createVerticalLayout()); 135 136 createContent(); 137 if (expanded) { 138 addChild(contentWidget); 139 } 140 getActions().addAction(((PartnerScene) scene).getDnDAction()); 141 } 142 143 144 @Override 145 protected void notifyStateChanged(ObjectState previousState, 146 ObjectState state) 147 { 148 super.notifyStateChanged(previousState, state); 149 150 MessagesWidget messagesWidget = getMessagesWidget(); 151 152 if (messagesWidget != null) { 153 messagesWidget.updateButtonsState(); 154 } 155 } 156 157 158 private MessagesWidget getMessagesWidget() { 159 for (Widget widget = this; widget != null; 160 widget = widget.getParentWidget()) 161 { 162 if (widget instanceof MessagesWidget) { 163 return (MessagesWidget) widget; 164 } 165 } 166 167 return null; 168 } 169 170 171 private void removeContent() { 172 if (table != null) { 173 table.removeChildren(); 174 } 175 176 contentWidget.removeChildren(); 177 178 removeChild(header); 179 } 180 181 182 private void createContent() { 183 header = createHeader(getScene(), getWSDLComponent()); 184 addChild(header); 185 186 table = createPartsTable(getScene(), getWSDLComponent()); 187 if (table != null) { 188 contentWidget.addChild(table); 189 } 190 191 contentWidget.addChild(buttons); 192 193 updateButtonState(); 194 } 195 196 void updateButtonState() { 197 boolean enabled = false; 198 if (table != null && table.getChildren() != null) { 199 for (Widget w : table.getChildren()) { 200 if (w instanceof PartWidget) { 201 enabled |= w.getState().isSelected(); 202 } 203 } 204 } 205 if (enabled != removePartButton.isButtonEnabled()) { 206 removePartButton.setButtonEnabled(enabled); 207 } 208 } 209 210 211 public void actionPerformed(ActionEvent event) { 212 if (event.getSource() == addPartButton) { 213 Message message = getWSDLComponent(); 214 WSDLModel model = message.getModel(); 215 216 try { 217 if (model.startTransaction()) { 218 Part newPart = model.getFactory().createPart(); 219 newPart.setName(MessagesUtils.createNewPartName(message)); 220 newPart.setType(MessagesUtils.getDefaultTypeReference(model)); 221 222 message.addPart(newPart); 223 } 224 } finally { 225 model.endTransaction(); 226 } 227 } else if (event.getSource() == removePartButton) { 228 for (Widget w : table.getChildren()) { 229 if (w instanceof PartWidget) { 230 PartWidget partWidget = (PartWidget) w; 231 if (partWidget.getState().isSelected()) { 232 Message message = getWSDLComponent(); 233 Part part = partWidget.getWSDLComponent(); 234 235 WSDLModel model = message.getModel(); 236 237 try { 238 if (model.startTransaction()) { 239 message.removePart(part); 240 } 241 } finally { 242 model.endTransaction(); 243 } 244 return; 245 } 246 } 247 } 248 } 249 } 250 251 252 private PartHitPointPosition getPartHitPointPosition(Point scenePoint) { 253 Point messagePoint = convertSceneToLocal(scenePoint); 254 255 if (!hasParts()) { 256 return new PartHitPointPosition(0, 0); 257 } 258 259 Widget[] children = table.getChildren().toArray(new Widget[0]); 260 261 int partIndex = 0; 262 boolean hitPointIsAbove = false; 263 264 int partCount = getWSDLComponent().getParts().size(); 265 266 for (Widget widget : children) { 267 if (widget instanceof PartWidget) { 268 PartWidget partWidget = (PartWidget) widget; 269 Point partPoint = partWidget.convertSceneToLocal(scenePoint); 270 Rectangle partBounds = partWidget.getBounds(); 271 272 if (partWidget.isHitAt(partPoint) 273 && (partBounds.getCenterX() < partPoint.x)) 274 { 275 int row = (hitPointIsAbove) ? (partIndex + 1) : partIndex; 276 277 if (row < partCount) { 278 return new PartHitPointPosition(row, 1); 279 } 280 } 281 282 partIndex++; 283 } else if (widget == partHitPointWidget) { 284 Point point = partHitPointWidget.convertSceneToLocal(scenePoint); 285 Rectangle bounds = partHitPointWidget.getBounds(); 286 287 if (partHitPointWidget.isHitAt(point) 288 && (bounds.getCenterX() < point.x) 289 && (partIndex < partCount)) 290 { 291 return new PartHitPointPosition(partIndex, 1); 292 } 293 294 hitPointIsAbove = true; 295 } 296 } 297 298 if (partHitPointWidget.getParentWidget() != null) { 299 if (partHitPointWidget.isHitAt(partHitPointWidget.convertSceneToLocal( 300 scenePoint))) 301 { 302 return partHitPointPosition; 303 } 304 } 305 306 partIndex = 0; 307 308 for (Widget widget : children) { 309 if (widget instanceof PartWidget) { 310 PartWidget partWidget = (PartWidget) widget; 311 Point partPoint = partWidget.convertSceneToLocal(scenePoint); 312 313 if (partPoint.y < partWidget.getBounds().getCenterY()) { 314 return new PartHitPointPosition(partIndex, 0); 315 } 316 317 partIndex++; 318 } 319 } 320 321 return new PartHitPointPosition(partCount, 0); 322 } 323 324 325 private boolean hasParts() { 326 Collection <Part> parts = getWSDLComponent().getParts(); 327 if (parts == null) return false; 328 return !parts.isEmpty(); 329 } 330 331 332 private String getPartCount(Message message) { 333 Collection <Part> parts = message.getParts(); 334 int count = (parts == null) ? 0 : parts.size(); 335 return (count == 1) ? "(1 part)" : ("(" + count + " parts)"); } 337 338 private void showHitPoint(Point scenePoint, Object draggedObject) { 339 this.draggedObject = draggedObject; 340 341 PartHitPointPosition newPosition = getPartHitPointPosition(scenePoint); 342 PartHitPointPosition oldPosition = partHitPointPosition; 343 344 if (table == null) { 345 table = createEmptyTable(getScene()); 346 contentWidget.addChild(0, table); 347 } 348 349 350 if (!newPosition.equals(oldPosition)) { 351 if (newPosition.column == 0) { 352 if (partHitPointWidget.getParentWidget() != null) { 353 table.removeChild(partHitPointWidget); 354 } 355 356 table.addChild(newPosition.row + 1, partHitPointWidget); 357 } else { 358 if (partHitPointWidget.getParentWidget() != null) { 359 table.removeChild(partHitPointWidget); 360 } 361 362 repaint(); 363 } 364 } 365 366 partHitPointPosition = newPosition; 367 } 368 369 370 private void hideHitPoint() { 371 if (partHitPointWidget.getParentWidget() != null) { 372 partHitPointWidget.getParentWidget().removeChild(partHitPointWidget); 373 } 374 375 if (!hasParts() && (table != null)) { 376 if (table.getParentWidget() != null) { 377 table.getParentWidget().removeChild(table); 378 } 379 } 380 381 partHitPointPosition = null; 382 draggedObject = null; 383 } 384 385 private Widget createHeaderLabel(Scene scene, Message message) { 386 String name = message.getName(); 387 388 if (name == null) { 389 name = NbBundle.getMessage(MessageWidget.class, "LBL_Undefined"); } else if (name.trim().equals("")) { name = NbBundle.getMessage(MessageWidget.class, "LBL_Empty"); } 393 394 ImageLabelWidget result = new ImageLabelWidget(scene, IMAGE, name, 395 getPartCount(message)); 396 result.getActions().addAction(ActionFactory 397 .createInplaceEditorAction((InplaceEditorProvider<JTextField >) 398 new MessageNameInplaceEditorProvider())); 399 400 return result; 401 } 402 403 private Widget createHeader(Scene scene, Message message) { 404 Widget result = new HeaderWidget(scene, expanderWidget); 405 406 result.addChild(createHeaderLabel(scene, message)); 407 408 if (expanderWidget.getParentWidget() != null) { 409 expanderWidget.getParentWidget().removeChild(expanderWidget); 410 } 411 412 result.addChild(expanderWidget); 413 result.setLayout(new LeftRightLayout(32)); 414 result.setBorder(HEADER_BORDER); 415 416 return result; 417 } 418 419 private Widget createPartsTableHeaderCell(Scene scene, String text) { 420 LabelWidget result = new LabelWidget(scene, text); 421 result.setBorder(HEADER_CELL_BORDER); 422 result.setFont(scene.getDefaultFont()); 423 result.setAlignment(LabelWidget.Alignment.CENTER); 424 result.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER); 425 return result; 426 } 427 428 private Widget createPartsTableHeader(Scene scene) { 429 Widget result = new Widget(scene); 430 result.addChild(createPartsTableHeaderCell(scene, NbBundle.getMessage( 431 MessageWidget.class, 432 "LBL_MessageWidget_PartName"))); result.addChild(createPartsTableHeaderCell(scene, NbBundle.getMessage( 434 MessageWidget.class, 435 "LBL_MessageWidget_PartElementOrType"))); result.setLayout(PartWidget.ROW_LAYOUT); 437 return result; 438 } 439 440 private Widget createPartsTable(Scene scene, Message message) { 441 List <Part> parts = message.getChildren(Part.class); 442 443 if (parts == null) return null; 444 if (parts.isEmpty()) return null; 445 446 Widget result = createEmptyTable(scene); 447 448 for (Part part : parts) { 449 result.addChild(WidgetFactory.getInstance().createWidget(scene, 450 part, getLookup(), true)); 451 } 452 453 return result; 454 } 455 456 private Widget createEmptyTable(Scene scene) { 457 Widget result = new Widget(scene); 458 result.addChild(createPartsTableHeader(scene)); 459 result.setBorder(TABLE_BORDER); 460 result.setLayout(LayoutFactory.createVerticalLayout(SerialAlignment 461 .JUSTIFY, 0)); 462 return result; 463 } 464 465 466 public void collapseWidget(ExpanderWidget expander) { 467 if (contentWidget.getParentWidget() != null) 468 removeChild(contentWidget); 469 } 470 471 public void expandWidget(ExpanderWidget expander) { 472 if (contentWidget.getParentWidget() == null) 473 addChild(contentWidget); 474 } 475 476 public boolean isCollapsed() { 477 return contentWidget.getParentWidget() == null; 478 } 479 480 protected Shape createSelectionShape() { 481 Rectangle rect = getBounds(); 482 return new Rectangle2D.Double (rect.x + 2, rect.y + 2, rect.width - 4, 483 rect.height - 4); 484 } 485 486 487 public void updateContent() { 488 removeContent(); 489 createContent(); 490 } 491 492 493 public void dragExit() { 494 hideHitPoint(); 495 } 496 497 498 public boolean dragOver(Point scenePoint, WidgetAction.WidgetDropTargetDragEvent event) { 499 if (isCollapsed()) return false; 500 501 try { 502 Transferable t = event.getTransferable(); 503 if (t != null) { 504 for (DataFlavor flavor : t.getTransferDataFlavors()) { 505 Class repClass = flavor.getRepresentationClass(); 506 if (Node.class.isAssignableFrom(repClass)) { 507 SchemaComponent sc = MessagesUtils 508 .extractSchemaComponent((Node) 509 t.getTransferData(flavor)); 510 511 if (sc != null) { 512 showHitPoint(scenePoint, sc); 513 return true; 514 } 515 } 516 } 517 } 518 } catch (Exception ex) { 519 } 521 522 return false; 523 } 524 525 public boolean drop(Point scenePoint, 526 WidgetAction.WidgetDropTargetDropEvent event) 527 { 528 if (isCollapsed()) return false; 529 530 SchemaComponent sc = (SchemaComponent) draggedObject; 531 532 PartHitPointPosition position = partHitPointPosition; 533 534 hideHitPoint(); 535 536 if ((sc == null) || (position == null)) { 537 return false; 538 } 539 540 Message message = getWSDLComponent(); 541 WSDLModel model = message.getModel(); 542 543 if (position.column == 0) { 544 try { 545 if (model.startTransaction()) { 546 Part[] parts = message.getParts().toArray(new Part[0]); 547 548 Part newPart = model.getFactory().createPart(); 549 newPart.setName(MessagesUtils.createNewPartName(message)); 550 if (sc instanceof GlobalType) { 551 newPart.setType(model.getDefinitions().createSchemaReference( 552 (GlobalType) sc, GlobalType.class)); 553 } else { 554 newPart.setElement(model.getDefinitions().createSchemaReference( 555 (GlobalElement) sc, GlobalElement.class)); 556 } 557 558 ((AbstractComponent<WSDLComponent>) message).insertAtIndex(Message.PART_PROPERTY, newPart, position.row); 559 } 560 } finally { 561 model.endTransaction(); 562 } 563 } else { 564 try { 565 if (model.startTransaction()) { 566 Part[] parts = message.getParts().toArray(new Part[0]); 567 Part part = parts[position.row]; 568 569 if (sc instanceof GlobalType) { 570 part.setType(model.getDefinitions().createSchemaReference( 571 (GlobalType) sc, GlobalType.class)); 572 part.setElement(null); 573 } else { 574 part.setElement(model.getDefinitions().createSchemaReference( 575 (GlobalElement) sc, GlobalElement.class)); 576 part.setType(null); 577 } 578 } 579 } finally { 580 model.endTransaction(); 581 } 582 } 583 584 return true; 585 } 586 587 588 public void expandForDragAndDrop() { 589 expanderWidget.setExpanded(true); 590 } 591 592 public Object hashKey() { 593 Message comp = getWSDLComponent(); 594 return comp != null ? comp.getName() : this; 595 } 596 597 private static final Border HEADER_BORDER = new GradientFillBorder(0, 0, 4, 8, 598 null, new Color (0xF2B6AF), new Color (0xFDECE2)); 599 600 private static final Border BUTTONS_BORDER = new FilledBorder( 601 new Insets (1, 0, 0, 0), new Insets (4, 8, 4, 8), 602 new Color (0x95301F), Color.WHITE); 603 604 605 private static final Border MAIN_BORDER = new FilledBorder(1, 1, 0, 0, 606 new Color (0x95301F), Color.WHITE); 607 608 private static final Border TABLE_BORDER = new FilledBorder( 609 new Insets (1, 0, 0, 0), new Insets (0, 0, 0, 0), 610 new Color (0x95301F), new Color (0x999999)); 611 612 private static final Image IMAGE = Utilities.loadImage 613 ("org/netbeans/modules/xml/wsdl/ui/view/resources/message.png"); 615 public static final Border HEADER_CELL_BORDER = new FilledBorder(0, 0, 1, 8, null, 616 new Color (0xEEEEEE)); 617 618 protected void paintChildren() { 619 super.paintChildren(); 620 621 if (partHitPointPosition == null) return; 622 if (partHitPointPosition.column != 1) return; 623 624 int row = partHitPointPosition.row; 625 626 PartWidget partWidget = (PartWidget) table.getChildren().get(row + 1); 627 PartTypeChooserWidget typeChooserWidget = partWidget 628 .getPartChooserWidget(); 629 ButtonWidget buttonWidget = typeChooserWidget 630 .getPartTypeChooserButton(); 631 632 Rectangle partBounds = partWidget 633 .convertLocalToScene(partWidget.getBounds()); 634 Rectangle typeChooserBounds = typeChooserWidget 635 .convertLocalToScene(typeChooserWidget.getBounds()); 636 Rectangle buttonBounds = buttonWidget 637 .convertLocalToScene(buttonWidget.getBounds()); 638 639 int x = convertSceneToLocal(typeChooserBounds.getLocation()).x; 640 int y = convertSceneToLocal(partBounds.getLocation()).y + 1; 641 642 int width = buttonBounds.x - typeChooserBounds.x; 643 int height = partBounds.height - 1; 644 645 646 Graphics2D g2 = getGraphics(); 647 Paint oldPaint = g2.getPaint(); 648 Stroke oldStroke = g2.getStroke(); 649 Object oldStrokeControl = g2.getRenderingHint(RenderingHints 650 .KEY_STROKE_CONTROL); 651 652 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 653 RenderingHints.VALUE_STROKE_PURE); 654 655 Shape s = new RoundRectangle2D.Float (x + 2, y + 2, width - 4, 656 height - 4, 6, 6); 657 g2.setPaint(Color.WHITE); 658 g2.fill(s); 659 660 g2.setStroke(new BasicStroke (2)); 661 g2.setPaint(WidgetConstants.HIT_POINT_BORDER); 662 g2.draw(s); 663 664 g2.setPaint(oldPaint); 665 g2.setStroke(oldStroke); 666 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 667 oldStrokeControl); 668 } 669 670 671 672 private static class PartHitPointWidget extends LabelWidget { 673 public PartHitPointWidget(Scene scene) { 674 super(scene, " "); 675 setBorder(new HitPointBorder()); 676 setFont(scene.getDefaultFont()); 677 } 678 } 679 680 681 private static class HitPointBorder implements Border { 682 public Insets getInsets() { 683 return new Insets (3, 2, 2, 2); 684 } 685 686 687 public void paint(Graphics2D g2, Rectangle rectangle) { 688 Paint oldPaint = g2.getPaint(); 689 Stroke oldStroke = g2.getStroke(); 690 691 Object oldStrokeControl = g2.getRenderingHint( 692 RenderingHints.KEY_STROKE_CONTROL); 693 694 g2.setPaint(Color.WHITE); 695 g2.fill(rectangle); 696 697 g2.setPaint(new Color (0x888888)); 698 g2.fillRect(rectangle.x, rectangle.y, rectangle.width, 1); 699 700 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 701 RenderingHints.VALUE_STROKE_PURE); 702 g2.setPaint(WidgetConstants.HIT_POINT_BORDER); 703 g2.setStroke(new BasicStroke (2)); 704 g2.drawRoundRect(rectangle.x + 2, rectangle.y + 3, 705 rectangle.width - 4, rectangle.height - 5, 6, 6); 706 707 g2.setPaint(oldPaint); 708 g2.setStroke(oldStroke); 709 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 710 oldStrokeControl); 711 } 712 713 714 public boolean isOpaque() { 715 return true; 716 } 717 } 718 719 720 private static class MessageNameInplaceEditorProvider implements 721 InplaceEditorProvider<JTextField >, 722 TextFieldInplaceEditor 723 { 724 private TextFieldInplaceEditorProvider editorProvider; 725 726 public MessageNameInplaceEditorProvider() { 727 this.editorProvider = new TextFieldInplaceEditorProvider(this, 728 EnumSet.of(InplaceEditorProvider.ExpansionDirection.RIGHT)); 729 } 730 731 732 public boolean isEnabled(Widget widget) { 733 Message message = getMessage(widget); 734 if (message != null) { 735 return XAMUtils.isWritable(message.getModel()); 736 } 737 return false; 738 } 739 740 741 public String getText(Widget widget) { 742 Message message = getMessage(widget); 743 String name = (message != null) ? message.getName() : null; 744 return (name != null) ? name : ""; } 746 747 748 public void setText(Widget widget, String text) { 749 Message message = getMessage(widget); 750 if (message != null) { 751 AnalysisUtilities.locallyRenameRefactor(message, text); 753 } 754 } 755 756 757 private Message getMessage(Widget widget) { 758 MessageWidget messageWidget = getMessageWidget(widget); 759 return (messageWidget != null) 760 ? messageWidget.getWSDLComponent() 761 : null; 762 } 763 764 765 private MessageWidget getMessageWidget(Widget widget) { 766 for (Widget w = widget; w != null; w = w.getParentWidget()) { 767 if (w instanceof MessageWidget) { 768 return (MessageWidget) w; 769 } 770 } 771 return null; 772 } 773 774 775 public void notifyOpened( 776 InplaceEditorProvider.EditorController controller, 777 Widget widget, JTextField component) 778 { 779 editorProvider.notifyOpened(controller, widget, component); 780 781 double k = widget.getScene().getZoomFactor(); 782 783 Dimension minimumSize = component.getMinimumSize(); 784 785 if (minimumSize == null) { 786 minimumSize = new Dimension (64, 19); 787 } 788 789 minimumSize.width = (int) Math.ceil(widget.getBounds().getWidth() 790 * k); 791 792 component.setMinimumSize(minimumSize); 793 } 794 795 796 public void notifyClosing( 797 InplaceEditorProvider.EditorController controller, 798 Widget widget, 799 JTextField component, 800 boolean commit) 801 { 802 editorProvider.notifyClosing(controller, widget, component, commit); 803 } 804 805 806 public JTextField createEditorComponent( 807 InplaceEditorProvider.EditorController controller, 808 Widget widget) 809 { 810 return editorProvider.createEditorComponent(controller, widget); 811 } 812 813 814 public Rectangle getInitialEditorComponentBounds( 815 InplaceEditorProvider.EditorController controller, 816 Widget widget, 817 JTextField component, 818 Rectangle bounds) 819 { 820 double k = widget.getScene().getZoomFactor(); 821 822 Widget parent = widget.getParentWidget(); 823 824 Rectangle widgetBounds = widget.convertLocalToScene(widget.getBounds()); 825 Rectangle parentBounds = parent.convertLocalToScene(parent.getBounds()); 826 Insets parentInsets = parent.getBorder().getInsets(); 827 828 int x1 = widgetBounds.x + 24; 829 int y1 = parentBounds.y + 24 + parentInsets.top; 830 831 int x2 = x1 + widgetBounds.width; 832 int y2 = y1 + parentBounds.height 833 - parentInsets.top - parentInsets.bottom; 834 835 int x = (int) Math.floor(k * x1); 836 int y = (int) Math.floor(k * y1); 837 838 int w = (int) Math.ceil(k * x2) - x; 839 int h = (int) Math.ceil(k * y2) - y; 840 841 Dimension preferredSize = component.getPreferredSize(); 842 843 if (preferredSize.height > h) { 844 y -= (preferredSize.height - h) / 2; 845 h = preferredSize.height; 846 } 847 848 return new Rectangle (x, y, w, h); 849 } 850 851 852 public EnumSet <InplaceEditorProvider.ExpansionDirection> 853 getExpansionDirections( 854 InplaceEditorProvider.EditorController controller, 855 Widget widget, 856 JTextField component) 857 { 858 return editorProvider.getExpansionDirections(controller, widget, 859 component); 860 } 861 } 862 863 864 private static class PartHitPointPosition { 865 public final int row; 866 public final int column; 867 868 public PartHitPointPosition(int row, int column) { 869 this.row = row; 870 this.column = column; 871 } 872 873 public boolean equals(PartHitPointPosition position) { 874 if (position == null) return false; 875 return (position.row == row) && (position.column == column); 876 } 877 } 878 } 879 | Popular Tags |