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)では、期待どおりに動作するはずです。 –

関連する問題