package com.link_intersystems.gitdirstat.ui; import java.awt.Component; import java.awt.Dimension; import java.awt.Window; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import javax.swing.DefaultListCellRenderer; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import com.link_intersystems.gitdirstat.domain.GitRepositoryAccess; import com.link_intersystems.gitdirstat.domain.IndexFilter; import com.link_intersystems.gitdirstat.domain.PathDeletionIndexFilter; import com.link_intersystems.gitdirstat.domain.TreeObject; import com.link_intersystems.swing.ActionInputSource; import com.link_intersystems.swing.SelectionModel; import com.link_intersystems.swing.SelectionModelBasedListModel; public class RemovePathsActionInput implements ActionInputSource<IndexFilter> { private GitRepositoryModel gitRepositoryModel; private UIContext uiContext; public RemovePathsActionInput(GitRepositoryModel gitRepositoryModel, UIContext uiContext, GitRepositoryAccess gitRepositoryAccess) { this.uiContext = uiContext; this.gitRepositoryModel = gitRepositoryModel; } @Override public IndexFilter getActionInput(ActionEvent e) { IndexFilter pathFilter = null; PathModel pathModel = gitRepositoryModel.getPathModel(); SelectionModel<TreeObject> selectionModel = pathModel .getSelectionModel(); SelectionModelBasedListModel selectionModelBasedListModel = new SelectionModelBasedListModel(); selectionModelBasedListModel.setSelectionModel(selectionModel); List<Object> dialogContent = new ArrayList<Object>(); JList selectedPathList = new JList(selectionModelBasedListModel); selectedPathList.setCellRenderer(new TreeObjectPathnameListRenderer()); JScrollPane selectedPathScrollPane = new JScrollPane(selectedPathList); selectedPathScrollPane.setPreferredSize(calculatePreferredSize( selectedPathList, selectionModel, selectedPathScrollPane)); dialogContent.add("You have selected the following paths for removal"); dialogContent.add(selectedPathScrollPane); dialogContent.add("Removed paths can not be recovered anymore"); dialogContent.add("Do you want to remove the selected paths now?"); Window mainFrame = this.uiContext.getMainFrame(); Object[] content = (Object[]) dialogContent .toArray(new Object[dialogContent.size()]); int showOptionDialog = JOptionPane.showConfirmDialog(mainFrame, content, "Rewrite Git History", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (showOptionDialog == JOptionPane.YES_OPTION) { pathFilter = createPathFilter(); } return pathFilter; } private Dimension calculatePreferredSize(JList list, SelectionModel<TreeObject> selectionModel, JScrollPane selectedPathScrollPane) { ListCellRenderer cellRenderer = list.getCellRenderer(); JScrollBar horizontalScrollBar = selectedPathScrollPane .getHorizontalScrollBar(); Dimension hScrollBarPreferredSize = horizontalScrollBar .getPreferredSize(); int maxWidth = 480; int maxHeight = 160; int preferredWidth = 0; int preferredHeight = hScrollBarPreferredSize.height; List<TreeObject> selection = selectionModel.getSelection(); for (int i = 0; i < selection.size(); i++) { TreeObject treeObject = selection.get(i); Component rendererComponent = cellRenderer .getListCellRendererComponent(list, treeObject, i, false, false); Dimension preferredSize = rendererComponent.getPreferredSize(); preferredWidth = Math.max(preferredWidth, (int) preferredSize.getWidth()); preferredWidth = Math.min(preferredWidth, maxWidth); preferredHeight = Math.max(preferredHeight, preferredHeight + (int) preferredSize.getHeight()); preferredHeight = Math.min(preferredHeight, maxHeight); } return new Dimension(preferredWidth, preferredHeight); } private IndexFilter createPathFilter() { List<TreeObject> selectedTreeObjects = gitRepositoryModel .getPathModel().getSelectionModel().getSelection(); final Collection<String> selectedPaths = new HashSet<String>(); for (TreeObject treeObject : selectedTreeObjects) { List<TreeObject> fileList = treeObject.toFileList(); for (TreeObject file : fileList) { selectedPaths.add(file.getRootRelativePath().getPathname()); } } IndexFilter pathFilter = new PathDeletionIndexFilter(selectedPaths); return pathFilter; } private static class TreeObjectPathnameListRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 4377056356154468058L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { TreeObject treeObject = (TreeObject) value; String pathname = treeObject.getRootRelativePath().getPathname(); return super.getListCellRendererComponent(list, pathname, index, isSelected, cellHasFocus); } } }