[Dengues]自定义一个ToolTip,在你的View上显示提示信息。

在自定义的一个Control上面显示一个ToolTip,它能显示节点的详细信息,如下图Dengues的实现:


它的实现代码在:
  1  /**
  2   * [email protected] class global comment. Detailled comment <br/>
  3   * 
  4   * $Id: Dengues.epf [email protected] 2008-4-29 qiang.zhang $
  5   * 
  6    */
  7  public   class  WarehouseNodeToolTip  extends  ToolTip {
  8 
  9       private   final   static   int  X_SHIFT;
 10 
 11       static  {
 12           if  ( " gtk " .equals(SWT.getPlatform())  ||   " carbon " .equals(SWT.getPlatform())) {
 13              X_SHIFT  =   - 26 ;
 14          }  else  {
 15              X_SHIFT  =   - 23 ;
 16          }
 17      }
 18 
 19       private   final   static   int  Y_SHIFT  =   1 ;
 20 
 21       private  IWarehouseNode node;
 22 
 23       private   final  Control control;
 24 
 25       /**
 26       * [email protected] WarehouseNodeToolTip constructor comment.
 27       * 
 28       *  @param  control
 29        */
 30       public  WarehouseNodeToolTip(Control control) {
 31           super (control);
 32          setShift( new  Point( 1 1 ));
 33           this .control  =  control;
 34      }
 35 
 36       /*
 37       * (non-Javadoc)
 38       * 
 39       * @see org.eclipse.jface.window.ToolTip#createToolTipContentArea(org.eclipse.swt.widgets.Event,
 40       * org.eclipse.swt.widgets.Composite)
 41        */
 42      @Override
 43       protected  Composite createToolTipContentArea(Event event, Composite parent) {
 44          Composite composite  =  createToolTipContentAreaComposite(parent);
 45          addIconAndLabel(composite, WarehouseLabelUtil.getNodeIcon(node), node.getLabel());
 46          IWarehouseObject object  =  node.getObject();
 47           if  (object  !=   null ) {
 48              Object data2  =  object.getData();
 49               if  (data2  instanceof  Storage) {
 50                  addIconAndLabel(composite,  null , ((Storage) data2).getComment());
 51              }
 52          }
 53           return  composite;
 54      }
 55 
 56       /**
 57       * [email protected] Comment method "addIconAndLabel".
 58       * 
 59       *  @param  parent
 60       *  @param  composite
 61        */
 62       private   void  addIconAndLabel(Composite composite, Image image, String label) {
 63          Label imageLabel  =   new  Label(composite, SWT.NONE);
 64          imageLabel.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
 65          imageLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
 66          imageLabel.setLayoutData( new  GridData(GridData.HORIZONTAL_ALIGN_BEGINNING  |  GridData.VERTICAL_ALIGN_BEGINNING));
 67          imageLabel.setImage(image);
 68 
 69          Label textLabel  =   new  Label(composite, SWT.NONE);
 70          textLabel.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
 71          textLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
 72          textLabel.setLayoutData( new  GridData(GridData.FILL_HORIZONTAL  |  GridData.VERTICAL_ALIGN_CENTER));
 73          textLabel.setText(removeTrailingNewline(DenguesTextUtil.getNotNullString(label)));
 74      }
 75 
 76       /**
 77       * [email protected] Comment method "removeTrailingNewline".
 78       * 
 79       *  @param  text
 80       *  @return
 81        */
 82       private  String removeTrailingNewline(String text) {
 83           if  (text.endsWith( " \n " )) {
 84               return  text.substring( 0 , text.length()  -   1 );
 85          }
 86           return  text;
 87      }
 88 
 89       /*
 90       * (non-Javadoc)
 91       * 
 92       * @see org.eclipse.jface.window.ToolTip#getLocation(org.eclipse.swt.graphics.Point, org.eclipse.swt.widgets.Event)
 93        */
 94      @Override
 95       public  Point getLocation(Point tipSize, Event event) {
 96          Widget widget  =  getTipWidget(event);
 97           if  (widget  !=   null ) {
 98              Rectangle bounds  =  getBounds(widget);
 99               if  (bounds  !=   null ) {
100                   return  control.toDisplay(bounds.x  +  X_SHIFT, bounds.y  +  bounds.height  +  Y_SHIFT);
101              }
102          }
103           return   super .getLocation(tipSize, event);
104      }
105 
106       /*
107       * (non-Javadoc)
108       * 
109       * @see org.eclipse.jface.window.ToolTip#shouldCreateToolTip(org.eclipse.swt.widgets.Event)
110        */
111      @Override
112       protected   boolean  shouldCreateToolTip(Event event) {
113          node  =   null ;
114           if  ( super .shouldCreateToolTip(event)) {
115              Widget tipWidget  =  getTipWidget(event);
116               if  (tipWidget  !=   null ) {
117                  Rectangle bounds  =  getBounds(tipWidget);
118                   if  (bounds  !=   null   &&  control.getBounds().contains(bounds.x, bounds.y)) {
119                      node  =  getWarehouseNode(tipWidget);
120                  }
121              }
122          }
123           if  (node  ==   null ) {
124              hide();
125               return   false ;
126          }  else  {
127               return   true ;
128          }
129      }
130 
131       /**
132       * [email protected] Comment method "getWarehouseNode".
133       * 
134       *  @param  tipWidget
135       *  @return
136        */
137       private  IWarehouseNode getWarehouseNode(Widget hoverObject) {
138           if  (hoverObject  instanceof  Widget) {
139              Object data  =  (hoverObject).getData();
140               if  (data  !=   null ) {
141                   if  (data  instanceof  IWarehouseNode) {
142                       return  (IWarehouseNode) data;
143                  }
144              }
145          }
146 
147           return   null ;
148      }
149 
150       private  Rectangle getBounds(Widget widget) {
151           if  (widget  instanceof  ToolItem) {
152              ToolItem w  =  (ToolItem) widget;
153               return  w.getBounds();
154          }
155           if  (widget  instanceof  TableItem) {
156              TableItem w  =  (TableItem) widget;
157               return  w.getBounds();
158          }
159           if  (widget  instanceof  TreeItem) {
160              TreeItem w  =  (TreeItem) widget;
161               return  w.getBounds();
162          }
163           return   null ;
164      }
165 
166       private  Widget getTipWidget(Event event) {
167          Point widgetPosition  =   new  Point(event.x, event.y);
168          Widget widget  =  event.widget;
169           if  (widget  instanceof  ToolBar) {
170              ToolBar w  =  (ToolBar) widget;
171               return  w.getItem(widgetPosition);
172          }
173           if  (widget  instanceof  Table) {
174              Table w  =  (Table) widget;
175               return  w.getItem(widgetPosition);
176          }
177           if  (widget  instanceof  Tree) {
178              Tree w  =  (Tree) widget;
179               return  w.getItem(widgetPosition);
180          }
181 
182           return  widget;
183      }
184 
185       /**
186       * [email protected] Comment method "createToolTipContentAreaComposite".
187       * 
188       *  @param  parent
189       *  @return
190        */
191       private  Composite createToolTipContentAreaComposite(Composite parent) {
192          Composite composite  =   new  Composite(parent, SWT.NONE);
193          GridLayout gridLayout  =   new  GridLayout();
194          gridLayout.numColumns  =   2 ;
195          gridLayout.marginWidth  =   5 ;
196          gridLayout.marginHeight  =   2 ;
197          composite.setLayout(gridLayout);
198          composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
199           return  composite;
200      }
201  }
202 
还有在org.dengues.warehouse.viewers.WarehouseView的初始化函数中实现:
 1  public   void  createPartControl(Composite parent) {
 2          viewer  =   new  WarehouseTreeViewer(parent, SWT.MULTI  |  SWT.H_SCROLL  |  SWT.V_SCROLL  |  SWT.BORDER);
 3          WarehouseViewProvider denguesViewProvider  =   new  WarehouseViewProvider( this );
 4          viewer.setContentProvider(denguesViewProvider);
 5          viewer.setLabelProvider(denguesViewProvider);
 6          viewer.setSorter( new  WarehouseViewNameSorter());
 7          IViewSite viewSite  =  getViewSite();
 8          viewer.setInput(viewSite);
 9          getSite().setSelectionProvider(viewer);
10 
11          makeActions();
12          hookContextMenu();
13          contributeToActionBars();
14          WarehouseViewFactory.initDragAndDrop(viewer);
15          hookDoubleClickAction();
16          nodeToolTip  =   new  WarehouseNodeToolTip(viewer.getControl());//新建一个Tooltip
17          setPartName(Messages.getString( " WarehouseView.Title.Name " ));  // $NON-NLS-1$
18      }
19 
并添加两个Listener:
 1  viewer.getTree().addFocusListener( new  FocusAdapter() {
 2 
 3              @Override
 4               public   void  focusLost(FocusEvent e) {
 5                  nodeToolTip.hide();
 6              }
 7          });
 8 
 9          viewer.getTree().addKeyListener( new  KeyListener() {
10 
11               public   void  keyPressed(KeyEvent e) {
12                   if  (e.keyCode  ==  SWT.ESC) {
13                      nodeToolTip.hide();
14                  }
15              }
16 
17               public   void  keyReleased(KeyEvent e) {
18              }
19 
20          });
这样就可以了。



Dengues论坛(http://groups.google.com/group/dengues/),一个很好的Eclipse开发者乐园.

你可能感兴趣的:([Dengues]自定义一个ToolTip,在你的View上显示提示信息。)