import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.util.ProgressWindow;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkHtmlRenderer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBLoadingPanel;
import com.intellij.ui.components.JBTextField;
+import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.DateFormatUtil;
import com.intellij.util.ui.AsyncProcessIcon;
import com.intellij.vcs.log.ui.VcsLogColorManager;
import com.intellij.vcs.log.ui.render.RefPainter;
import com.intellij.vcs.log.ui.tables.GraphTableModel;
-import net.miginfocom.swing.MigLayout;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@NotNull private final VcsLogGraphTable myGraphTable;
@NotNull private final RefsPanel myRefsPanel;
- @NotNull private final DataPanel myDataPanel;
+ @NotNull private final DataPanel myHashAuthorPanel;
+ @NotNull private final DataPanel myMessageDataPanel;
@NotNull private final ContainingBranchesPanel myContainingBranchesPanel;
@NotNull private final MessagePanel myMessagePanel;
@NotNull private final JBLoadingPanel myLoadingPanel;
DetailsPanel(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogGraphTable graphTable, @NotNull VcsLogColorManager colorManager,
@NotNull VisiblePack initialDataPack) {
- super(new CardLayout());
myLogDataHolder = logDataHolder;
myGraphTable = graphTable;
myDataPack = initialDataPack;
myRefsPanel = new RefsPanel(colorManager);
- myDataPanel = new DataPanel(logDataHolder.getProject());
- myContainingBranchesPanel = new ContainingBranchesPanel();
- myMessagePanel = new MessagePanel();
+ myHashAuthorPanel = new DataPanel(logDataHolder.getProject(), false) {
+ @Override
+ public Dimension getPreferredSize() {
+ return super.getPreferredSize();
+ }
+ };
final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane();
- JPanel content = new JPanel(new MigLayout("flowy, ins 0, fill, hidemode 3")) {
+ myMessageDataPanel = new DataPanel(logDataHolder.getProject(), true) {
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
return size;
}
};
- content.setOpaque(false);
- scrollPane.setViewportView(content);
- content.add(myRefsPanel, "shrinky, pushx, growx");
- content.add(myDataPanel, "growy, push");
- content.add(myContainingBranchesPanel, "shrinky, pushx, growx");
- content.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+ scrollPane.setViewportView(myMessageDataPanel);
+ scrollPane.setBorder(UIUtil.makeChameleonBorder(scrollPane.getBorder(), new Condition<JScrollBar>() {
+ @Override
+ public boolean value(JScrollBar bar) {
+ return bar != null && bar.isVisible();
+ }
+ }, scrollPane.getVerticalScrollBar()));
- myLoadingPanel = new JBLoadingPanel(new BorderLayout(), logDataHolder, ProgressWindow.DEFAULT_PROGRESS_DIALOG_POSTPONE_TIME_MILLIS);
- myLoadingPanel.add(scrollPane);
+ myContainingBranchesPanel = new ContainingBranchesPanel();
+ myMessagePanel = new MessagePanel();
+ myLoadingPanel = new JBLoadingPanel(new BorderLayout(), logDataHolder, ProgressWindow.DEFAULT_PROGRESS_DIALOG_POSTPONE_TIME_MILLIS);
+ JPanel header = new NonOpaquePanel(new BorderLayout());
+ header.add(myRefsPanel, BorderLayout.NORTH);
+ header.add(myHashAuthorPanel, BorderLayout.SOUTH);
+ myLoadingPanel.add(header, BorderLayout.NORTH);
+ myLoadingPanel.add(scrollPane, BorderLayout.CENTER);
+ myLoadingPanel.add(myContainingBranchesPanel, BorderLayout.SOUTH);
+ myLoadingPanel.setBackground(UIUtil.getTableBackground());
+
+ setLayout(new CardLayout());
add(myLoadingPanel, STANDARD_LAYER);
add(myMessagePanel, MESSAGE_LAYER);
+ setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
setBackground(UIUtil.getTableBackground());
showMessage("No commits selected");
}
}
if (commitData instanceof LoadingDetails) {
myLoadingPanel.startLoading();
- myDataPanel.setData(null);
+ myHashAuthorPanel.setData(null);
+ myMessageDataPanel.setData(null);
myRefsPanel.setRefs(Collections.<VcsRef>emptyList());
}
else {
myLoadingPanel.stopLoading();
- myDataPanel.setData(commitData);
+ myHashAuthorPanel.setData(commitData);
+ myMessageDataPanel.setData(commitData);
myRefsPanel.setRefs(sortRefs(hash, commitData.getRoot()));
}
private static class DataPanel extends JEditorPane {
@NotNull private final Project myProject;
+ private final boolean myMessageMode;
- DataPanel(@NotNull Project project) {
+ DataPanel(@NotNull Project project, boolean messageMode) {
super(UIUtil.HTML_MIME, "");
+ myMessageMode = messageMode;
setEditable(false);
myProject = project;
addHyperlinkListener(BrowserHyperlinkListener.INSTANCE);
setText("");
}
else {
- String body = getHashText(commit) + "<br/>" + getAuthorText(commit) + "<p>" + getMessageText(commit) + "</p>";
+ String body;
+ if (myMessageMode) {
+ body = getMessageText(commit);
+ } else {
+ body = commit.getId().asString() + "<br/>" + getAuthorText(commit);
+ }
setText("<html><head>" + UIUtil.getCssFontDeclaration(UIUtil.getLabelFont()) + "</head><body>" + body + "</body></html>");
setCaretPosition(0);
}
+ revalidate();
+ repaint();
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ Dimension size = super.getPreferredSize();
+ int h = getFontMetrics(getFont()).getHeight();
+ size.height = Math.max(size.height, myMessageMode ? 5 * h : 2 * h);
+ return size;
}
private String getMessageText(VcsFullCommitDetails commit) {
IssueLinkHtmlRenderer.formatTextWithLinks(myProject, description);
}
- private static String getHashText(VcsFullCommitDetails commit) {
- return commit.getId().asString();
- }
-
private static String getAuthorText(VcsFullCommitDetails commit) {
String authorText = commit.getAuthor().getName() + " at " + DateFormatUtil.formatDateTime(commit.getAuthorTime());
if (!commit.getAuthor().equals(commit.getCommitter())) {
private static class ContainingBranchesPanel extends JPanel {
- private final JComponent myLoadingIcon;
+ private final JComponent myLoadingComponent;
private final JTextField myBranchesList;
ContainingBranchesPanel() {
return UIUtil.getLabelFont().deriveFont(Font.ITALIC);
}
};
- myLoadingIcon = new AsyncProcessIcon("Loading...");
+ myLoadingComponent = new NonOpaquePanel(new BorderLayout());
+ myLoadingComponent.add(new AsyncProcessIcon("Loading..."), BorderLayout.WEST);
+ myLoadingComponent.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
myBranchesList = new JBTextField("");
myBranchesList.setEditable(false);
myBranchesList.setBorder(IdeBorderFactory.createEmptyBorder()); // setting border to null may mean "use default border" while setting empty border means we do not want a border
}
setOpaque(false);
- setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
- add(label);
- add(myLoadingIcon);
- add(myBranchesList);
- add(Box.createHorizontalGlue());
+ setLayout(new BorderLayout());
+ add(label, BorderLayout.WEST);
+ add(Box.createHorizontalGlue(), BorderLayout.EAST);
}
void setBranches(@Nullable List<String> branches) {
if (branches == null) {
- myLoadingIcon.setVisible(true);
- myBranchesList.setVisible(false);
+ remove(myBranchesList);
+ add(myLoadingComponent, BorderLayout.CENTER);
}
else {
- myLoadingIcon.setVisible(false);
- myBranchesList.setVisible(true);
- myBranchesList.setText(getContainedBranchesText(branches));
+ remove(myLoadingComponent);
+ myBranchesList.setText(StringUtil.join(branches, ", "));
+ add(myBranchesList, BorderLayout.CENTER);
}
+ revalidate();
+ repaint();
}
-
- @NotNull
- private static String getContainedBranchesText(@NotNull List<String> branches) {
- return StringUtil.join(branches, ", ");
- }
-
}
private static class RefsPanel extends JPanel {
}
}
- private static class MessagePanel extends JPanel {
+ private static class MessagePanel extends NonOpaquePanel {
private final JLabel myLabel;