How to align image to center of table cell (SWT Table)

后端 未结 4 1941
既然无缘
既然无缘 2020-12-11 05:22

I develop Eclipse RCP application and got a problem with a Table. We have some data in database in boolean format and users wants to see that field using

4条回答
  •  不知归路
    2020-12-11 06:10

    Sorceror's solution came in handy. I've adapted it to a custom IStyledLabelProvider to be used within a DelegatingStyledCellLabelProvider:

    public class MutedLabelProvider extends LabelProvider implements IStyledLabelProvider {
    
      public MutedLabelProvider(Tree containerTree, int columnIndex) {
        registerIconListener(containerTree, columnIndex);
      }
    
      @Override
      public StyledString getStyledText(Object element) {
        return new StyledString();
      }
    
      private void registerIconListener(Tree containerTree, int columnIndex) {
        containerTree.addListener(SWT.PaintItem, new Listener() {
          @Override
          public void handleEvent(Event event) {
            if (event.index == columnIndex) {
              TreeItem treeItem = (TreeItem) event.item;
              Object data = treeItem.getData();
              Image tmpImage = getImageFromData(data);
              if (tmpImage != null) {
                int tmpWidth = 0;
                int tmpHeight = 0;
                int tmpX = 0;
                int tmpY = 0;
                tmpWidth = containerTree.getColumn(event.index).getWidth();
                tmpHeight = treeItem.getBounds().height;
                tmpX = tmpImage.getBounds().width;
                tmpX = (tmpWidth / 2 - tmpX / 2);
                tmpY = tmpImage.getBounds().height;
                tmpY = (tmpHeight / 2 - tmpY / 2);
                if (tmpX <= 0) tmpX = event.x;
                else tmpX += event.x;
                if (tmpY <= 0) tmpY = event.y;
                else tmpY += event.y;
                event.gc.drawImage(tmpImage, tmpX, tmpY);
              }
            }
          }
        });
      }
    
      private Image getImageFromData(Object element) {
        if (element != null && element instanceof IMarker) {
          IMarker marker = (IMarker) element;
          boolean isItTrue = marker.getAttribute("MyBooleanAttr", false);
          if (isItTrue) {
            // TODO return here the image you want for true state
            return JFaceResources.getImageRegistry().get("MyImageForTrue");
          } else {
            // TODO return here the image you want for false state
            // Alternatively, you can return null for no image
            return null;
          }
        } else {
          return null;
        }
      }
    
    }
    

    Note that I'm using IMarker as data for elements, and a TreeViewer (so I'm receiving TreeItems), but your data might differ, and your viewer might be a TableViewer; you just have to make your own adjustments.

提交回复
热议问题