private int calculateMaxRootWidth() {
   int width = 0;
   for (VirtualFile file : myLogDataHolder.getRoots()) {
     Font tableFont = UIManager.getFont("Table.font");
     width = Math.max(getFontMetrics(tableFont).stringWidth(file.getName() + "  "), width);
   }
   return width;
 }
  public VcsLogClassicFilterUi(
      @NotNull VcsLogUiImpl ui,
      @NotNull VcsLogDataHolder logDataHolder,
      @NotNull VcsLogUiProperties uiProperties,
      @NotNull DataPack initialDataPack) {
    myUi = ui;

    myTextFilter =
        new SearchTextFieldWithStoredHistory("Vcs.Log.Text.Filter.History") {
          @Override
          protected void onFieldCleared() {
            applyFilters();
          }
        };
    myTextFilter
        .getTextEditor()
        .addActionListener(
            new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                applyFilters();
                myTextFilter.addCurrentTextToHistory();
              }
            });

    myBranchFilterComponent = new BranchFilterPopupComponent(this, initialDataPack, uiProperties);
    myUserFilterComponent = new UserFilterPopupComponent(this, logDataHolder, uiProperties);
    myDateFilterComponent = new DateFilterPopupComponent(this);
    myStructureFilterComponent = new StructureFilterPopupComponent(this, logDataHolder.getRoots());

    myActionGroup = new DefaultActionGroup();
    myActionGroup.add(new TextFilterComponent(myTextFilter));
    myActionGroup.add(new FilterActionComponent(myBranchFilterComponent));
    myActionGroup.add(new FilterActionComponent(myUserFilterComponent));
    myActionGroup.add(new FilterActionComponent(myDateFilterComponent));
    myActionGroup.add(new FilterActionComponent(myStructureFilterComponent));
  }