From ee9be7f8d6dbaa05ae994d09e13f8158a040dd31 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 20 Oct 2016 14:43:17 +0300 Subject: [PATCH] svn: Refactored "IntersectingLocalChangesPanel" - code simplified --- .../IntersectingLocalChangesPanel.java | 158 ++++++++---------- 1 file changed, 73 insertions(+), 85 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/IntersectingLocalChangesPanel.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/IntersectingLocalChangesPanel.java index e04f1b8edca7..81bfb5050550 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/IntersectingLocalChangesPanel.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/IntersectingLocalChangesPanel.java @@ -15,9 +15,10 @@ */ package org.jetbrains.idea.svn.dialogs; +import com.intellij.ide.DataManager; import com.intellij.ide.actions.EditSourceAction; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.CommonShortcuts; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.openapi.util.BooleanGetter; @@ -25,122 +26,109 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.ui.ChangesBrowserNode; import com.intellij.openapi.vcs.changes.ui.ChangesBrowserNodeRenderer; import com.intellij.openapi.vcs.changes.ui.TreeModelBuilder; -import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; -import com.intellij.pom.Navigatable; +import com.intellij.ui.TreeUIHelper; +import com.intellij.ui.components.JBLabel; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; -import com.intellij.ui.content.ContentManager; -import com.intellij.util.ContentsUtil; -import com.intellij.util.EditSourceOnDoubleClickHandler; -import com.intellij.util.EditSourceOnEnterKeyHandler; +import com.intellij.ui.treeStructure.SimpleTree; +import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; +import com.intellij.util.ui.components.BorderLayoutPanel; +import org.jetbrains.annotations.NotNull; import javax.swing.*; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; -import java.util.ArrayList; import java.util.List; +import java.util.Objects; + +import static com.intellij.openapi.vcs.changes.ChangesUtil.getNavigatableArray; +import static com.intellij.util.ContentsUtil.addContent; +import static com.intellij.util.containers.UtilKt.stream; public class IntersectingLocalChangesPanel { - private final JPanel myPanel; - private final String myText; - private final List myFilesToShow; - private final Project myProject; - private JTree myJTree; - public IntersectingLocalChangesPanel(final Project project, final List filesToShow, String text) { + @NotNull private final BorderLayoutPanel myPanel; + @NotNull private final List myFiles; + @NotNull private final Project myProject; + + public IntersectingLocalChangesPanel(@NotNull Project project, @NotNull List files, @NotNull String text) { myProject = project; - myText = text; - myPanel = new MyPanel(new BorderLayout()); - myFilesToShow = filesToShow; - initUI(); + myFiles = files; + myPanel = createPanel(createLabel(text), createTree()); } - private class MyPanel extends JPanel implements TypeSafeDataProvider { - private MyPanel(LayoutManager layout) { - super(layout); - } + @NotNull + private BorderLayoutPanel createPanel(@NotNull JLabel label, @NotNull JTree tree) { + BorderLayoutPanel panel = JBUI.Panels.simplePanel(); - public void calcData(DataKey key, DataSink sink) { - if (CommonDataKeys.NAVIGATABLE_ARRAY.equals(key)) { - final TreePath[] treePaths = myJTree.getSelectionModel().getSelectionPaths(); - final List navigatables = new ArrayList<>(treePaths.length); - for (TreePath treePath : treePaths) { - final List filePaths = ((ChangesBrowserNode)treePath.getLastPathComponent()).getAllFilePathsUnder(); - for (FilePath filePath : filePaths) { - if (filePath.getVirtualFile() != null) { - navigatables.add(new OpenFileDescriptor(myProject, filePath.getVirtualFile())); - } - } - } - sink.put(key, navigatables.toArray(new Navigatable[navigatables.size()])); + panel.setBackground(UIUtil.getTextFieldBackground()); + panel.addToTop(label).addToCenter(tree); + new EditSourceAction().registerCustomShortcutSet(CommonShortcuts.getEditSource(), panel); + + DataManager.registerDataProvider(panel, dataId -> { + if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) { + return getNavigatableArray(myProject, stream(tree.getSelectionPaths()) + .map(TreePath::getLastPathComponent) + .map(node -> (ChangesBrowserNode)node) + .flatMap(ChangesBrowserNode::getFilePathsUnderStream) + .map(FilePath::getVirtualFile) + .filter(Objects::nonNull) + .distinct()); } - } + + return null; + }); + + return panel; } - public JPanel getPanel() { - return myPanel; + @NotNull + private SimpleTree createTree() { + SimpleTree tree = new SimpleTree(new TreeModelBuilder(myProject, true).buildModelFromFilePaths(myFiles)) { + @Override + protected void configureUiHelper(@NotNull TreeUIHelper helper) { + super.configureUiHelper(helper); + helper.installEditSourceOnDoubleClick(this); + helper.installEditSourceOnEnterKeyHandler(this); + } + }; + tree.setRootVisible(false); + tree.setShowsRootHandles(false); + tree.setCellRenderer(new ChangesBrowserNodeRenderer(myProject, BooleanGetter.TRUE, false)); + + return tree; } - private void initUI() { - final DefaultMutableTreeNode root = new DefaultMutableTreeNode(); - - myJTree = new JTree(root); - myJTree.setRootVisible(false); - myJTree.setShowsRootHandles(false); - myJTree.setCellRenderer(new ChangesBrowserNodeRenderer(myProject, BooleanGetter.TRUE, false)); - - TreeModelBuilder builder = new TreeModelBuilder(myProject, true); - final DefaultTreeModel treeModel = builder.buildModelFromFilePaths(myFilesToShow); - myJTree.setModel(treeModel); - - myJTree.expandPath(new TreePath(root.getPath())); - - final JLabel label = new JLabel(myText) { + @NotNull + private static JBLabel createLabel(@NotNull String text) { + JBLabel label = new JBLabel(text) { @Override public Dimension getPreferredSize() { - final Dimension superValue = super.getPreferredSize(); - return new Dimension((int) superValue.getWidth(), (int) (superValue.getHeight() * 1.7)); + Dimension size = super.getPreferredSize(); + return new Dimension(size.width, (int)(size.height * 1.7)); } }; label.setUI(new MultiLineLabelUI()); label.setBackground(UIUtil.getTextFieldBackground()); - label.setVerticalTextPosition(JLabel.TOP); - myPanel.setBackground(UIUtil.getTextFieldBackground()); - myPanel.add(label, BorderLayout.NORTH); - myPanel.add(myJTree, BorderLayout.CENTER); + label.setVerticalTextPosition(SwingConstants.TOP); - EditSourceOnDoubleClickHandler.install(myJTree); - EditSourceOnEnterKeyHandler.install(myJTree); - - final EditSourceAction editSourceAction = new EditSourceAction(); - editSourceAction.registerCustomShortcutSet(CommonShortcuts.getEditSource(), myPanel); + return label; } - private Component getPrefferedFocusComponent() { - return myJTree; - } - - public static void showInVersionControlToolWindow(final Project project, final String title, final List filesToShow, - final String prompt) { - final IntersectingLocalChangesPanel component = new IntersectingLocalChangesPanel(project, filesToShow, prompt); - + @SuppressWarnings("SameParameterValue") + public static void showInVersionControlToolWindow(@NotNull Project project, + @NotNull String title, + @NotNull List files, + @NotNull String prompt) { + IntersectingLocalChangesPanel intersectingPanel = new IntersectingLocalChangesPanel(project, files, prompt); + Content content = ContentFactory.SERVICE.getInstance().createContent(intersectingPanel.myPanel, title, true); ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.VCS); - final ContentManager contentManager = toolWindow.getContentManager(); - - Content content = ContentFactory - .SERVICE.getInstance().createContent(component.getPanel(), title, true); - ContentsUtil.addContent(contentManager, content, true); - toolWindow.activate(new Runnable() { - public void run() { - IdeFocusManager.getInstance(project).requestFocus(component.getPrefferedFocusComponent(), true); - } - }); + addContent(toolWindow.getContentManager(), content, true); + toolWindow.activate(null); } }