2016-10-06 2 views
0

현재 열/행 고정 기능을 사용하여 열/행 머리글을 마우스 오른쪽 단추로 클릭 한 다음 '고정'을 클릭하면 클릭 한 열이 고정됩니다. 및 모든 열은 왼쪽에 있습니다. 문제는 제가 오른쪽으로 스크롤하고 말하기 칼럼 인덱스 20 (실제로는 왼쪽에 인덱스를 숨기는 모든 인덱스)을 클릭하면 해당 인덱스 아래에있는 모든 열이 고정되어 인덱스 0에 다시 스냅되게됩니다. 표시된 것보다 더 많은 열이 고정되어 있기 때문에 스크롤을 허용하지 않습니다. 클릭 한 항목의 왼쪽에 보이는 열만 고정하려면 어떻게합니까? 나는 IFreezeCoordinatesProvider를 찾아 왔고 그걸 가지고 건방진 물건을 만들려고했으나 아무 소용이 없었습니다. 아래는 내 맞춤 구성으로 고정 명령을 포함하는 마우스 오른쪽 버튼 메뉴를 만드는 방법입니다. 어떤 도움이라도 대단히 감사합니다!SWT NatTable의 표시된 열만 고정하는 방법

public class ColumnHeaderRightClickConfiguration extends AbstractUiBindingConfiguration{ 

private final ViewportLayer viewportLayer; 
private final CompositeFreezeLayer freezeLayer; 
private Menu rightClickMenu; 

private int localColumnIndex; 
private int columnIndex; 

private FreezeColumnCommand freezeCommand; 

public ColumnHeaderRightClickConfiguration(final NatTable natTable, ViewportLayer viewportLayer, CompositeFreezeLayer freezeLayer){ 
    this.viewportLayer = viewportLayer; 
    this.freezeLayer = freezeLayer; 
    this.rightClickMenu = createRightClickMenu(natTable).build(); 

    natTable.addDisposeListener(new DisposeListener(){ 
     @Override 
     public void widgetDisposed(DisposeEvent e) { 
      rightClickMenu.dispose(); 
     } 

    }); 
} 

private PopupMenuBuilder createRightClickMenu(NatTable natTable){ 

    Menu menu = new Menu(natTable); 

    MenuItem freezeLeft = new MenuItem(menu, SWT.NONE); 
    freezeLeft.setText("Freeze"); 

    MenuItem unfreeze = new MenuItem(menu, SWT.NONE); 
    unfreeze.setText("Unfreeze"); 
    unfreeze.setEnabled(false); 

    freezeLeft.addSelectionListener(new SelectionListener(){ 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      System.out.println(columnIndex); 
      freezeCommand = new FreezeColumnCommand(freezeLayer, columnIndex-1, true); 
      natTable.doCommand(freezeCommand); 

      freezeLeft.setEnabled(false); 
      unfreeze.setEnabled(true); 
     } 
     @Override 
     public void widgetDefaultSelected(SelectionEvent e){} 
    }); 

    unfreeze.addSelectionListener(new SelectionListener(){ 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      natTable.doCommand(freezeCommand); 

      unfreeze.setEnabled(false); 
      freezeLeft.setEnabled(true); 
     } 
     @Override 
     public void widgetDefaultSelected(SelectionEvent e) {} 
    }); 

    return new PopupMenuBuilder(natTable, menu); 
} 

@Override 
public void configureUiBindings(UiBindingRegistry uiBindingRegistry) { 
    MouseEventMatcher matcher = new MouseEventMatcher(SWT.NONE, GridRegion.COLUMN_HEADER, MouseEventMatcher.RIGHT_BUTTON){ 
     @Override 
     public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels){ 
      if (super.matches(natTable, event, regionLabels)){ 
       localColumnIndex = natTable.getColumnPositionByX(event.x); 
       columnIndex = viewportLayer.localToUnderlyingColumnPosition(localColumnIndex); 
       return true; 
      }else{ 
       return false; 
      } 
     } 
    }; 
    uiBindingRegistry.registerMouseDownBinding(matcher, new ColumnPopupMenuAction(rightClickMenu)); 
} 

}

답변

0

는 지금 FreezeColumnCommand가 요청 된 기능을 지원하지 않습니다. FreezeSelectionCommand만이 뷰포트 외부에 표시되지 않는 왼쪽 열을 이동하여 정지 작업을 수행 할 수 있습니다. 그 이유는 해당 FreezeColumnStrategy이 고정 좌표를 계산할 때 현재 뷰포트 상태를 고려하지 않기 때문입니다. 이것은 NatTable에서 수정해야 할 것이므로 다음을위한 티켓을 만들었습니다. https://bugs.eclipse.org/bugs/show_bug.cgi?id=504489

NatTable에서 고정 될 때까지 FreezeHelper을 직접 사용할 수 있습니다. 이렇게하면 일반적으로 피해야하는 내부 계산 및 코드 동결 처리가 노출되지만 현재로서는 해결 방법이 될 수 있습니다.

또한 메뉴 구성이 NatTable 가이드 라인을 따르지 않습니다. 당신이 맞지 않는 많은 일들이 있습니다. 자신 만의 메뉴를 만들지 만 PopupMenuBuilder를 사용합니다. 다음은 NatTable 1.4에서 작동하는 코드입니다.

public class ColumnHeaderRightClickConfiguration extends AbstractUiBindingConfiguration { 

    private Menu rightClickMenu; 

    private boolean frozen = false; 

    public ColumnHeaderRightClickConfiguration(
      NatTable natTable, 
      CompositeFreezeLayer compositeFreezeLayer, 
      FreezeLayer freezeLayer, 
      ViewportLayer viewportLayer, 
      SelectionLayer selectionLayer) { 
     this.rightClickMenu = new PopupMenuBuilder(natTable) 
       .withMenuItemProvider("freeze", new IMenuItemProvider() { 

        @Override 
        public void addMenuItem(NatTable natTable, Menu popupMenu) { 
         MenuItem freezeLeft = new MenuItem(popupMenu, SWT.NONE); 
         freezeLeft.setText("Freeze"); 

         freezeLeft.addSelectionListener(new SelectionAdapter() { 
          @Override 
          public void widgetSelected(SelectionEvent event) { 
           int columnPosition = MenuItemProviders.getNatEventData(event).getColumnPosition(); 
           int pos = LayerUtil.convertColumnPosition(natTable, columnPosition, selectionLayer); 
           // this should be the solution 
           // if (compositeFreezeLayer.doCommand(new FreezeColumnCommand(compositeFreezeLayer, pos, true))) { 
           //  ColumnHeaderRightClickConfiguration.this.frozen = true; 
           // } 

           int coordCol = 0; 
           coordCol = viewportLayer.getScrollableLayer() 
             .getColumnPositionByX(viewportLayer.getOrigin().getX()); 
           if (coordCol > 0 
             && coordCol >= pos) { 
            coordCol = pos; 
           } 

           PositionCoordinate topLeftPosition = new PositionCoordinate(freezeLayer, coordCol, -1); 
           PositionCoordinate bottomRightPosition = new PositionCoordinate(freezeLayer, pos, -1); 

           FreezeHelper.freeze(freezeLayer, viewportLayer, topLeftPosition, bottomRightPosition); 
           ColumnHeaderRightClickConfiguration.this.frozen = true; 
          } 
         }); 

        } 
       }) 
       .withMenuItemProvider("unfreeze", new IMenuItemProvider() { 

        @Override 
        public void addMenuItem(NatTable natTable, Menu popupMenu) { 
         MenuItem unfreeze = new MenuItem(popupMenu, SWT.NONE); 
         unfreeze.setText("Unfreeze"); 

         unfreeze.addSelectionListener(new SelectionAdapter() { 
          @Override 
          public void widgetSelected(SelectionEvent event) { 
           natTable.doCommand(new UnFreezeGridCommand()); 
           ColumnHeaderRightClickConfiguration.this.frozen = false; 
          } 
         }); 
        } 
       }) 
       .withEnabledState("freeze", new IMenuItemState() { 

        @Override 
        public boolean isActive(NatEventData natEventData) { 
         return !ColumnHeaderRightClickConfiguration.this.frozen; 
        } 
       }) 
       .withEnabledState("unfreeze", new IMenuItemState() { 

        @Override 
        public boolean isActive(NatEventData natEventData) { 
         return ColumnHeaderRightClickConfiguration.this.frozen; 
        } 
       }) 
       .build(); 

     natTable.addDisposeListener(new DisposeListener() { 
      @Override 
      public void widgetDisposed(DisposeEvent e) { 
       ColumnHeaderRightClickConfiguration.this.rightClickMenu.dispose(); 
      } 

     }); 
    } 

    @Override 
    public void configureUiBindings(UiBindingRegistry uiBindingRegistry) { 
     MouseEventMatcher matcher = new MouseEventMatcher(
       SWT.NONE, 
       GridRegion.COLUMN_HEADER, 
       MouseEventMatcher.RIGHT_BUTTON); 
     uiBindingRegistry.registerMouseDownBinding(
       matcher, 
       new PopupMenuAction(this.rightClickMenu)); 
    } 
} 
+0

감사합니다. 참고로 버그를 발견했을 수도 있습니다. 말하기 색인 150을 클릭하면 오른쪽의 고정되지 않은 뷰포트 부분이 왼쪽에 숨겨진 색인의 양만큼 앞으로 이동합니다 (예 : 145-150이 얼어 붙을 때 볼 수 있다면 145 개의 지수로 점프 할 것입니다. 나는 단지 전화해서 이것을 바로 잡았다 viewportLayer.setOriginX (0); 이전 해결책으로 올바른 해결책을 구현할 때 freeze() 메서드에 해당 줄을 추가해야합니다. – Owen

+0

고마워, 나는 또한 그것을 고쳤다. 최신 SNAPSHOT 빌드 (> = # 563)로 예상대로 작동해야합니다. –