KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > wsdl > ui > view > grapheditor > widget > MessageWidget


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 /*
20  * MessageWidget.java
21  *
22  * Created on August 16, 2006, 11:06 PM
23  *
24  * To change this template, choose Tools | Template Manager
25  * and open the template in the editor.
26  */

27
28 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget;
29
30 import java.awt.BasicStroke JavaDoc;
31 import java.awt.Color JavaDoc;
32 import java.awt.Dimension JavaDoc;
33 import java.awt.Graphics2D JavaDoc;
34 import java.awt.Image JavaDoc;
35 import java.awt.Insets JavaDoc;
36 import java.awt.Paint JavaDoc;
37 import java.awt.Point JavaDoc;
38 import java.awt.Rectangle JavaDoc;
39 import java.awt.RenderingHints JavaDoc;
40 import java.awt.Shape JavaDoc;
41 import java.awt.Stroke JavaDoc;
42 import java.awt.datatransfer.DataFlavor JavaDoc;
43 import java.awt.datatransfer.Transferable JavaDoc;
44 import java.awt.event.ActionEvent JavaDoc;
45 import java.awt.event.ActionListener JavaDoc;
46 import java.awt.geom.Rectangle2D JavaDoc;
47 import java.awt.geom.RoundRectangle2D JavaDoc;
48 import java.util.Collection JavaDoc;
49 import java.util.EnumSet JavaDoc;
50 import java.util.List JavaDoc;
51
52 import javax.swing.JTextField JavaDoc;
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 JavaDoc, 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 JavaDoc 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")); // NOI18N
118
addPartButton.setActionListener(this);
119         removePartButton = new ButtonWidget(scene, NbBundle.getMessage(
120                 MessageWidget.class,
121                 "LBL_MessageWidget_RemovePart")); // NOI18N
122
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 JavaDoc
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 JavaDoc 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 JavaDoc scenePoint) {
253         Point JavaDoc 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 JavaDoc partPoint = partWidget.convertSceneToLocal(scenePoint);
270                 Rectangle JavaDoc 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 JavaDoc point = partHitPointWidget.convertSceneToLocal(scenePoint);
285                 Rectangle JavaDoc 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 JavaDoc 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 JavaDoc<Part> parts = getWSDLComponent().getParts();
327         if (parts == null) return false;
328         return !parts.isEmpty();
329     }
330     
331     
332     private String JavaDoc getPartCount(Message message) {
333         Collection JavaDoc<Part> parts = message.getParts();
334         int count = (parts == null) ? 0 : parts.size();
335         return (count == 1) ? "(1 part)" : ("(" + count + " parts)"); // NOI18N
336
}
337
338     private void showHitPoint(Point JavaDoc scenePoint, Object JavaDoc 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 JavaDoc name = message.getName();
387         
388         if (name == null) {
389             name = NbBundle.getMessage(MessageWidget.class, "LBL_Undefined"); // NOI18N
390
} else if (name.trim().equals("")) { // NOI18N
391
name = NbBundle.getMessage(MessageWidget.class, "LBL_Empty"); // NOI18N
392
}
393         
394         ImageLabelWidget result = new ImageLabelWidget(scene, IMAGE, name,
395                 getPartCount(message));
396         result.getActions().addAction(ActionFactory
397                 .createInplaceEditorAction((InplaceEditorProvider<JTextField JavaDoc>)
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 JavaDoc 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"))); // NOI18N
433
result.addChild(createPartsTableHeaderCell(scene, NbBundle.getMessage(
434                 MessageWidget.class,
435                 "LBL_MessageWidget_PartElementOrType"))); // NOI18N
436
result.setLayout(PartWidget.ROW_LAYOUT);
437         return result;
438     }
439
440     private Widget createPartsTable(Scene scene, Message message) {
441         List JavaDoc<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 JavaDoc createSelectionShape() {
481         Rectangle JavaDoc rect = getBounds();
482         return new Rectangle2D.Double JavaDoc(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 JavaDoc scenePoint, WidgetAction.WidgetDropTargetDragEvent event) {
499         if (isCollapsed()) return false;
500         
501         try {
502             Transferable JavaDoc t = event.getTransferable();
503             if (t != null) {
504                 for (DataFlavor JavaDoc flavor : t.getTransferDataFlavors()) {
505                     Class JavaDoc 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 JavaDoc ex) {
519             //do nothing
520
}
521         
522         return false;
523     }
524
525     public boolean drop(Point JavaDoc 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 JavaDoc 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 JavaDoc(0xF2B6AF), new Color JavaDoc(0xFDECE2));
599
600     private static final Border BUTTONS_BORDER = new FilledBorder(
601             new Insets JavaDoc(1, 0, 0, 0), new Insets JavaDoc(4, 8, 4, 8),
602             new Color JavaDoc(0x95301F), Color.WHITE);
603     
604     
605     private static final Border MAIN_BORDER = new FilledBorder(1, 1, 0, 0,
606             new Color JavaDoc(0x95301F), Color.WHITE);
607
608     private static final Border TABLE_BORDER = new FilledBorder(
609             new Insets JavaDoc(1, 0, 0, 0), new Insets JavaDoc(0, 0, 0, 0),
610             new Color JavaDoc(0x95301F), new Color JavaDoc(0x999999));
611
612     private static final Image JavaDoc IMAGE = Utilities.loadImage
613             ("org/netbeans/modules/xml/wsdl/ui/view/resources/message.png"); // NOI18N
614

615     public static final Border HEADER_CELL_BORDER = new FilledBorder(0, 0, 1, 8, null,
616             new Color JavaDoc(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 JavaDoc partBounds = partWidget
633                 .convertLocalToScene(partWidget.getBounds());
634         Rectangle JavaDoc typeChooserBounds = typeChooserWidget
635                 .convertLocalToScene(typeChooserWidget.getBounds());
636         Rectangle JavaDoc 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 JavaDoc g2 = getGraphics();
647         Paint JavaDoc oldPaint = g2.getPaint();
648         Stroke JavaDoc oldStroke = g2.getStroke();
649         Object JavaDoc oldStrokeControl = g2.getRenderingHint(RenderingHints
650                 .KEY_STROKE_CONTROL);
651         
652         g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
653                 RenderingHints.VALUE_STROKE_PURE);
654         
655         Shape JavaDoc s = new RoundRectangle2D.Float JavaDoc(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 JavaDoc(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 JavaDoc getInsets() {
683             return new Insets JavaDoc(3, 2, 2, 2);
684         }
685
686         
687         public void paint(Graphics2D JavaDoc g2, Rectangle JavaDoc rectangle) {
688             Paint JavaDoc oldPaint = g2.getPaint();
689             Stroke JavaDoc oldStroke = g2.getStroke();
690             
691             Object JavaDoc oldStrokeControl = g2.getRenderingHint(
692                     RenderingHints.KEY_STROKE_CONTROL);
693             
694             g2.setPaint(Color.WHITE);
695             g2.fill(rectangle);
696             
697             g2.setPaint(new Color JavaDoc(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 JavaDoc(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 JavaDoc>,
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 JavaDoc getText(Widget widget) {
742             Message message = getMessage(widget);
743             String JavaDoc name = (message != null) ? message.getName() : null;
744             return (name != null) ? name : ""; // NOI18N
745
}
746
747         
748         public void setText(Widget widget, String JavaDoc text) {
749             Message message = getMessage(widget);
750             if (message != null) {
751                 // try rename silent and locally
752
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 JavaDoc component)
778         {
779             editorProvider.notifyOpened(controller, widget, component);
780             
781             double k = widget.getScene().getZoomFactor();
782             
783             Dimension JavaDoc minimumSize = component.getMinimumSize();
784             
785             if (minimumSize == null) {
786                 minimumSize = new Dimension JavaDoc(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 JavaDoc component,
800                 boolean commit)
801         {
802             editorProvider.notifyClosing(controller, widget, component, commit);
803         }
804
805         
806         public JTextField JavaDoc createEditorComponent(
807                 InplaceEditorProvider.EditorController controller,
808                 Widget widget)
809         {
810             return editorProvider.createEditorComponent(controller, widget);
811         }
812         
813
814         public Rectangle JavaDoc getInitialEditorComponentBounds(
815                 InplaceEditorProvider.EditorController controller,
816                 Widget widget,
817                 JTextField JavaDoc component,
818                 Rectangle JavaDoc bounds)
819         {
820             double k = widget.getScene().getZoomFactor();
821             
822             Widget parent = widget.getParentWidget();
823             
824             Rectangle JavaDoc widgetBounds = widget.convertLocalToScene(widget.getBounds());
825             Rectangle JavaDoc parentBounds = parent.convertLocalToScene(parent.getBounds());
826             Insets JavaDoc 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 JavaDoc 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 JavaDoc(x, y, w, h);
849         }
850
851         
852         public EnumSet JavaDoc<InplaceEditorProvider.ExpansionDirection>
853                 getExpansionDirections(
854                         InplaceEditorProvider.EditorController controller,
855                         Widget widget,
856                         JTextField JavaDoc 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