1 19 20 28 29 package org.netbeans.modules.xml.schema.abe; 30 31 import java.awt.BorderLayout ; 32 import java.awt.Color ; 33 import java.awt.Component ; 34 import java.awt.Font ; 35 import java.awt.Graphics ; 36 import java.awt.Graphics2D ; 37 import java.awt.Point ; 38 import java.awt.Rectangle ; 39 import java.awt.event.ActionEvent ; 40 import java.awt.event.ActionListener ; 41 import java.awt.event.KeyEvent ; 42 import java.awt.event.KeyListener ; 43 import java.awt.event.MouseAdapter ; 44 import java.awt.event.MouseEvent ; 45 import java.beans.PropertyChangeEvent ; 46 import java.beans.PropertyChangeListener ; 47 import java.util.List ; 48 import javax.swing.Box ; 49 import javax.swing.JComboBox ; 50 import javax.swing.JLabel ; 51 import javax.swing.JPanel ; 52 import javax.swing.SpringLayout ; 53 import javax.swing.SwingUtilities ; 54 import javax.swing.border.EmptyBorder ; 55 import javax.swing.border.LineBorder ; 56 import org.netbeans.modules.xml.axi.AXIComponent; 57 import org.netbeans.modules.xml.axi.AXIModel; 58 import org.netbeans.modules.xml.axi.Compositor; 59 import org.netbeans.modules.xml.axi.Compositor.CompositorType; 60 import org.netbeans.modules.xml.axi.ContentModel; 61 import org.netbeans.modules.xml.axi.Element; 62 import org.netbeans.modules.xml.schema.abe.nodes.ABEAbstractNode; 63 import org.netbeans.modules.xml.schema.abe.nodes.CompositorNode; 64 import org.netbeans.modules.xml.schema.abe.palette.DnDHelper; 65 import org.openide.nodes.Node; 66 import org.openide.util.NbBundle; 67 68 72 public class CompositorPanel extends ElementsContainerPanel{ 73 private static final long serialVersionUID = 7526472295622776147L; 74 75 CompositorType compositorType; 76 ExpandCollapseButton expandButton; 77 78 InplaceEditableLabel compositorTypeLabel; 79 JPanel compositorTypePanel; 80 JLabel contentModelInfoLabel; 81 private ABEAbstractNode compositorNode; 82 83 private JLabel itemCountLabel; 84 private static final int BORDER_THICKNESS = 2; 85 private static final EmptyBorder emptyBorder = new EmptyBorder (BORDER_THICKNESS, BORDER_THICKNESS, 86 BORDER_THICKNESS, BORDER_THICKNESS); 87 88 public CompositorPanel(InstanceUIContext context, Compositor compositor, 89 Component parentPanel) { 90 super(context, compositor, parentPanel, true); 91 setBorder(emptyBorder); 92 setDrawAnnotation(false); 94 initMouseListener(); 95 initKeyListener(); 96 makeNBNode(); 97 addSelectionListener(); 98 99 compositor.addPropertyChangeListener(new PropertyChangeListener () { 100 public void propertyChange(PropertyChangeEvent evt) { 101 SwingUtilities.invokeLater(new Runnable () { 102 public void run() { 103 verifyChildrenWithModel(); 104 } 105 }); 106 } 107 }); 108 } 109 110 111 protected void initMouseListener(){ 112 addMouseListener(new MouseAdapter () { 113 public void mouseReleased(MouseEvent e) { 114 mouseClickedActionHandler(e, true); 115 } 116 public void mouseClicked(MouseEvent e){ 117 mouseClickedActionHandler(e, false); 118 } 119 120 public void mousePressed(MouseEvent e) { 121 mouseClickedActionHandler(e, true); 122 } 123 }); 124 } 125 126 127 protected void mouseClickedActionHandler(MouseEvent e, boolean handelPopupOnly){ 128 if(e.getClickCount() == 1){ 129 if(e.isPopupTrigger()){ 130 context.getMultiComponentActionManager().showPopupMenu(e, this); 131 return; 132 } 133 if(handelPopupOnly) 134 return; 135 if(e.isControlDown()) 137 context.getComponentSelectionManager().addToSelectedComponents(this); 138 else 139 context.getComponentSelectionManager().setSelectedComponent(this); 140 } 141 } 142 143 protected void initKeyListener(){ 144 addKeyListener(new KeyListener () { 145 public void keyPressed(KeyEvent e) { 146 if( e.getKeyCode() == e.VK_F2 ){ 147 compositorTypeLabel.showEditor(); 148 } 149 if(context.getFocusTraversalManager().isFocusChangeEvent(e)) 150 context.getFocusTraversalManager().handleEvent(e, CompositorPanel.this); 151 } 152 public void keyReleased(KeyEvent e) { 153 } 154 public void keyTyped(KeyEvent e) { 155 if(e.getKeyChar() == e.VK_SPACE){ 156 compositorTypeLabel.showEditor(); 157 158 } 159 } 160 }); 161 } 162 163 164 SpringLayout compositorTypePanelLayout; 165 public void addHeaderPanel(){ 166 AutoSizingPanel rbp = new AutoSizingPanel(context); 167 rbp.setHorizontalScaling(true); 168 rbp.setOpaque(false); 169 compositorTypePanel = rbp; 170 compositorTypePanelLayout = new SpringLayout (); 172 compositorTypePanel.setLayout(compositorTypePanelLayout); 173 compositorTypeLabel = new InplaceEditableLabel(getCompositorTypeString()); 174 compositorTypeLabel.setForeground(InstanceDesignConstants.COMPOSITOR_TYPE_LABEL_COLOR); 175 176 if(getAXIParent().isReadOnly()){ 177 compositorTypeLabel.setToolTipText(NbBundle.getMessage(CompositorPanel.class, 179 "TTP_COMPOSITOR_READONLY", getCompositorType().getName())); 180 } 181 182 if( !(parentPanel instanceof ElementPanel)) { 184 setPanelIndendation(0); 186 } 187 188 Component hgap = Box.createHorizontalStrut(getPanelIndendation()); 189 compositorTypePanel.add(hgap); 190 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, hgap, 0, 191 SpringLayout.WEST, compositorTypePanel); 192 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, hgap, 0, 193 SpringLayout.NORTH, compositorTypePanel); 194 195 compositorTypePanel.add(compositorTypeLabel); 196 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, compositorTypeLabel, 0, 197 SpringLayout.EAST, hgap); 198 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, compositorTypeLabel, 0, 199 SpringLayout.NORTH, compositorTypePanel); 200 201 202 203 hgap = Box.createHorizontalStrut(10); 204 compositorTypePanel.add(hgap); 205 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, hgap, 0, 206 SpringLayout.EAST, compositorTypeLabel); 207 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, hgap, 0, 208 SpringLayout.NORTH, compositorTypePanel); 209 210 CompositorPropertiesPanel cpp = new CompositorPropertiesPanel(getCompositor(), context); 211 compositorTypePanel.add(cpp); 212 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, cpp, 0, 213 SpringLayout.EAST, hgap); 214 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, cpp, 0, 215 SpringLayout.NORTH, compositorTypePanel); 216 217 cpp.addMouseListener(new MouseAdapter (){ 219 public void mouseClicked(MouseEvent e) { 220 CompositorPanel.this.dispatchEvent(e); 221 } 222 223 public void mouseReleased(MouseEvent e) { 224 CompositorPanel.this.dispatchEvent(e); 225 } 226 227 public void mousePressed(MouseEvent e) { 228 CompositorPanel.this.dispatchEvent(e); 229 } 230 231 }); 232 233 compositorTypePanel.addMouseListener(new MouseAdapter (){ 234 public void mouseClicked(MouseEvent e) { 235 CompositorPanel.this.dispatchEvent(e); 236 } 237 238 public void mouseReleased(MouseEvent e) { 239 CompositorPanel.this.dispatchEvent(e); 240 } 241 242 public void mousePressed(MouseEvent e) { 243 CompositorPanel.this.dispatchEvent(e); 244 } 245 246 }); 247 248 249 hgap = Box.createHorizontalStrut(10); 250 compositorTypePanel.add(hgap); 251 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, hgap, 0, 252 SpringLayout.EAST, cpp); 253 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, hgap, 0, 254 SpringLayout.NORTH, compositorTypePanel); 255 256 itemCountLabel = new JLabel (); 258 itemCountLabel.setForeground(Color.GRAY.brighter()); 259 refreshItemCount(); 260 compositorTypePanel.add(itemCountLabel); 261 compositorTypePanelLayout.putConstraint(SpringLayout.WEST, itemCountLabel, 0, 262 SpringLayout.EAST, hgap); 263 compositorTypePanelLayout.putConstraint(SpringLayout.NORTH, itemCountLabel, 0, 264 SpringLayout.NORTH, compositorTypePanel); 265 266 267 268 add(compositorTypePanel, BorderLayout.NORTH); 269 270 compositorTypeLabel.addMouseListener(new MouseAdapter (){ 272 public void mouseClicked(MouseEvent e) { 273 CompositorPanel.this.dispatchEvent(e); 274 } 275 276 public void mouseReleased(MouseEvent e) { 277 CompositorPanel.this.dispatchEvent(e); 278 } 279 280 public void mousePressed(MouseEvent e) { 281 CompositorPanel.this.dispatchEvent(e); 282 } 283 284 }); 285 286 initCompositorTypeEditListener(); 287 } 288 289 290 protected void initCompositorTypeEditListener(){ 291 compositorTypeLabel.addPropertyChangeListener(new PropertyChangeListener () { 292 public void propertyChange(PropertyChangeEvent evt) { 293 if(evt.getPropertyName().equals(InplaceEditableLabel.PROPERTY_MODE_CHANGE)){ 294 if(evt.getNewValue() == InplaceEditableLabel.Mode.EDIT){ 295 CompositorType options[] = filterAllIfNeeded(getCompositor()); 298 final JComboBox field = new JComboBox (options); 299 field.setSelectedItem(getCompositorType()); 300 field.addActionListener(new ActionListener (){ 301 public void actionPerformed(ActionEvent e) { 302 CompositorType newType = (CompositorType) field.getSelectedItem(); 303 compositorTypeLabel.hideEditor(); 305 setCompositorTypeInModel(newType); 306 307 if(getParentContainerPanel() instanceof ElementPanel){ 308 ((ElementPanel)getParentContainerPanel()).expandChild(); 310 } 311 } 312 }); 313 if(getAXIParent().isReadOnly()){ 314 String str = NbBundle.getMessage(CompositorPanel.class, 315 "MSG_READONLY_COMPOSITORTYPE_EDIT", getCompositorType().getName()); 316 compositorTypeLabel.setEditInfoText(str, context); 317 }else{ 318 compositorTypeLabel.setInlineEditorComponent(field); 319 } 320 } 321 } 322 } 323 }); 324 } 325 326 327 void initButton(){ 328 expandButton.addActionListener(new ActionListener () { 329 public void actionPerformed(ActionEvent e) { 330 handleExpandOrCollapse(); 331 } 332 }); 333 } 334 335 void handleExpandOrCollapse(){ 336 if(!expandButton.isExpanded()){ 337 expandChild(); 339 }else{ 340 collapseChild(); 342 } 343 } 344 345 void expandChild(){ 346 if(childrenPanel != null){ 347 childrenPanel.setVisible(true); 349 revalidate(); 350 repaint(); 351 }else{ 352 } 354 } 355 356 void collapseChild(){ 357 if(childrenPanel != null){ 358 childrenPanel.setVisible(false); 360 revalidate(); 361 repaint(); 362 } 363 } 364 365 void refreshItemCount(){ 366 int size = getAXIChildren().size(); 368 String item = NbBundle.getMessage(ContainerPanel.class, "LBL_ITEM_STRING"); 369 String items = NbBundle.getMessage(ContainerPanel.class, "LBL_ITEMS_STRING"); 370 String itemStr = size == 1 ? item : items; 371 itemCountLabel.setText("["+size+ " "+itemStr+"] "); 372 } 373 374 public void _paintComponent(Graphics g){ 375 Graphics2D g2d = (Graphics2D ) g; 376 super.setAnnotationString(getCompositorType().toString()); 377 Rectangle rect = this.getBounds(); 378 int x = rect.x + this.getWidth() + 2; 379 int y = rect.y - 10; 380 Point pt = new Point (x, y); 381 super.setStartDrawPoint(pt); 382 super.paintComponent(g2d); 383 } 384 385 386 public CompositorType getCompositorType(){ 387 AXIComponent parent = getAXIParent(); 388 if( parent instanceof Compositor) 389 return ((Compositor)parent).getType(); 390 391 return null; 392 } 393 394 public String getCompositorTypeString(){ 395 StringBuffer str = new StringBuffer (getCompositorType().getName()); 396 while(str.length() < 8) 397 str.append(" "); 398 return str.toString(); 399 } 400 401 public void setCompositorTypeInModel(CompositorType ctype){ 402 ((Compositor) getAXIParent()).setType(ctype); 403 } 404 405 private Compositor getCompositor() { 406 return (Compositor) getAXIParent(); 407 } 408 409 public List <? extends AXIComponent> getAXIChildren() { 410 return getAXIParent().getChildren(); 411 } 412 413 414 public void removeElement(Element element) { 415 super.removeElement(element); 416 refreshItemCount(); 417 } 418 419 public void addElement(Element element) { 420 super.addElement(element); 421 refreshItemCount(); 422 } 423 424 425 public void addCompositor(Compositor newCompositor){ 426 int index = getAXIChildren().indexOf(newCompositor); 429 430 if(isAlreadyAdded(newCompositor) != null) 431 return; 432 433 CompositorPanel cp = new CompositorPanel(context, newCompositor, this); 434 addChildAt(cp, index); 435 refreshItemCount(); 436 } 437 438 public void removeChildCompositor(Compositor compositor){ 439 Component rmComp = null; 442 for(Component component: getChildrenList()){ 443 if(component instanceof CompositorPanel){ 444 if( ((CompositorPanel)component).getCompositor() == compositor){ 445 rmComp = component; 446 break; 447 } 448 449 } 450 } 451 if(rmComp != null){ 452 removeComponent(rmComp); 453 } 454 refreshItemCount(); 455 } 456 457 458 private void addNewCompositorAt(TweenerPanel tweener, DnDHelper.PaletteItem compType){ 459 int index = getChildrenList().indexOf(tweener); 460 if(index == -1){ 461 return; 463 } 464 index = index/2; 465 AXIModel model = getAXIParent().getModel(); 466 467 Compositor comp = null; 468 switch(compType){ 469 case SEQUENCE: 470 comp = model.getComponentFactory().createSequence(); 471 break; 472 case CHOICE: 473 comp = model.getComponentFactory().createChoice(); 474 break; 475 case ALL: 476 comp = model.getComponentFactory().createAll(); 477 break; 478 } 479 480 if(comp == null) 481 return; 482 483 model.startTransaction(); 484 try{ 485 getAXIParent().addChildAtIndex(comp, index); 486 }finally{ 487 model.endTransaction(); 488 } 489 } 490 491 protected void setupAXIComponentListener(){ 492 super.setupAXIComponentListener(); 493 getAXIParent().addPropertyChangeListener(new ModelEventMediator(this, getAXIParent()) { 494 public void _propertyChange(PropertyChangeEvent evt) { 495 if(evt.getPropertyName().equals(Compositor.PROP_COMPOSITOR)){ 496 if((evt.getOldValue() == null) && (evt.getNewValue() != null)){ 498 addCompositor((Compositor) evt.getNewValue()); 500 }else if((evt.getNewValue() == null) && (evt.getOldValue() != null)){ 501 removeChildCompositor((Compositor) evt.getOldValue()); 503 } 504 }else if(evt.getPropertyName().equals(Compositor.PROP_TYPE)){ 505 compositorTypeLabel.setText(getCompositorTypeString()); 507 } 508 refreshItemCount(); 509 } 510 }); 511 512 } 513 514 515 public void visit(Compositor compositor) { 516 super.visit(compositor); 517 visitorResult = null; 518 CompositorPanel compPanel = new CompositorPanel(context, 519 compositor, CompositorPanel.this); 520 visitorResult = compPanel; 521 } 522 523 524 public void tweenerDrop(TweenerPanel tweener, DnDHelper.PaletteItem paletteItem) { 525 super.tweenerDrop(tweener, paletteItem); 526 if(DnDHelper.isCompositor(paletteItem) && (paletteItem != paletteItem.ALL) && 527 ((Compositor)getAXIComponent()).getType() != CompositorType.ALL ){ 528 addNewCompositorAt(tweener, paletteItem); 530 } 531 } 532 533 public void tweenerDragEntered(TweenerPanel tweener, DnDHelper.PaletteItem paletteItem) { 534 super.tweenerDragEntered(tweener, paletteItem); 535 if(!tweenerDragAccept(tweener, paletteItem)) 536 return; 537 LineBorder lineBorder = new LineBorder (InstanceDesignConstants.DARK_BLUE, BORDER_THICKNESS, true); 539 this.setBorder(lineBorder); 540 this.repaint(); 541 542 544 ContentModel cm = getCompositor().getContentModel(); 545 if(cm != null){ 546 String type = UIUtilities.getContentModelTypeString(cm.getType()); 547 String locDrpStrType = NbBundle.getMessage(UIUtilities.class, "MSG_DROP_INFO_TYPE"); 548 tweener.setDropInfoText(locDrpStrType+" "+type+" "+cm.getName()); 549 }else{ 550 String locDrpStrLocal = NbBundle.getMessage(UIUtilities.class, "MSG_DROP_INFO_LOCAL"); 551 tweener.setDropInfoText(locDrpStrLocal+getCompositor().getType().getName()); 552 } 553 } 554 555 public boolean tweenerDragAccept(TweenerPanel tweener, DnDHelper.PaletteItem paletteItem) { 556 if(getAXIParent().isReadOnly()){ 557 String str = NbBundle.getMessage(CompositorPanel.class, 558 "MSG_READONLY_COMPOSITOR_DROP", getAXIParent().getContentModel().getName()); 559 UIUtilities.showErrorMessageFor(str, context, tweener); 560 return false; 561 } 562 563 if( (getCompositorType() == CompositorType.ALL) && 564 (paletteItem != DnDHelper.PaletteItem.ELEMENT)){ 565 String str = NbBundle.getMessage(CompositorPanel.class, 566 "MSG_ALL_COMPOSITOR_DROP_REJECT"); 567 UIUtilities.showErrorMessageFor(str, context, tweener); 568 return false; 569 } 570 if( (paletteItem == DnDHelper.PaletteItem.ELEMENT) || 572 ( (DnDHelper.isCompositor(paletteItem)) && (paletteItem != paletteItem.ALL))){ 573 return true; 574 } 575 String str = NbBundle.getMessage(CompositorPanel.class, 576 "MSG_COMPOSITOR_DROP_REJECT"); 577 UIUtilities.showErrorMessageFor(str, context, tweener); 578 return false; 579 } 580 581 public void tweenerDragExited(TweenerPanel tweener) { 582 super.tweenerDragExited(tweener); 583 UIUtilities.hideGlassMessage(); 584 this.setBorder(emptyBorder); 585 this.repaint(); 586 } 587 588 protected void makeNBNode() { 589 compositorNode = new CompositorNode((Compositor) getAXIParent(), context); 590 if(getAXIParent().isReadOnly()) 591 ((ABEAbstractNode)compositorNode).setReadOnly(true); 592 } 593 594 public ABEAbstractNode getNBNode() { 595 return compositorNode; 596 } 597 598 public AXIComponent getAXIComponent() { 599 return getAXIParent(); 600 } 601 602 public void removeCompositor() { 603 if(getAXIComponent() instanceof Compositor){ 604 AXIComponent axiComponent = getAXIComponent(); 605 if(axiComponent.getModel() != null){ 606 context.getAXIModel().startTransaction(); 607 try{ 608 axiComponent.getParent().removeChild(getAXIComponent()); 609 }finally{ 610 context.getAXIModel().endTransaction(); 611 } 612 } 613 } 614 } 615 616 private void addSelectionListener() { 617 addPropertyChangeListener(new PropertyChangeListener (){ 618 public void propertyChange(PropertyChangeEvent evt) { 619 if(evt.getPropertyName().equals(PROP_SELECTED)){ 620 if(((Boolean )evt.getNewValue()).booleanValue()){ 621 compositorTypeLabel.setForeground( 623 InstanceDesignConstants.COMPOSITOR_TYPE_LABEL_SELECTED_COLOR); 624 Font font = compositorTypeLabel.getFont(); 625 font = new Font (font.getName(), Font.BOLD, font.getSize()); 626 compositorTypeLabel.setFont(font); 627 drawBoldString(true); 628 setBorder(new LineBorder (InstanceDesignConstants.XP_ORANGE, BORDER_THICKNESS, true)); 629 }else{ 630 compositorTypeLabel.setForeground( 632 InstanceDesignConstants.COMPOSITOR_TYPE_LABEL_COLOR); 633 Font font = compositorTypeLabel.getFont(); 634 font = new Font (font.getName(), Font.PLAIN, font.getSize()); 635 compositorTypeLabel.setFont(font); 636 drawBoldString(false); 637 setBorder(emptyBorder); 638 } 639 640 } 641 } 642 }); 643 } 644 645 public void showExpandButton(boolean show){ 646 expandButton.setVisible(show); 647 } 648 649 public void accept(UIVisitor visitor) { 650 visitor.visit(this); 651 } 652 653 654 public static CompositorType[] filterAllIfNeeded(Compositor compositor){ 655 if(compositor.getParent() instanceof Compositor){ 656 return new CompositorType[] {CompositorType.SEQUENCE, CompositorType.CHOICE}; 658 } 659 for(AXIComponent child: compositor.getChildren()){ 660 if(child instanceof Compositor){ 661 return new CompositorType[] {CompositorType.SEQUENCE, CompositorType.CHOICE}; 663 } 664 } 665 return CompositorType.values(); 666 667 } 668 } 669 | Popular Tags |