package gitj.ui; import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import git.Commit; import git.Diff; import gitj.ui.components.IDiffSelectionListener; import gitj.ui.components.JFileList; import gitj.ui.components.JFileListEntry; import gitj.utils.MenuItemUtils; @SuppressWarnings("serial") public class PanelSummary extends JPanel { private Commit commit; private JSplitPane splitPane; private JTextPane textPane; private JFileList list; private DefaultListModel<JFileListEntry> model; private JPopupMenu popupMenu; private List<IDiffSelectionListener> listeners = new ArrayList<IDiffSelectionListener>(); public PanelSummary() { setLayout(new BorderLayout(0, 0)); splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); splitPane.setResizeWeight(0.5); add(splitPane); textPane = new JTextPane(); textPane.setContentType("text/html"); textPane.setEditable(false); JScrollPane scrollTextPane = new JScrollPane(); scrollTextPane.setBorder(null); scrollTextPane.setViewportView(textPane); splitPane.setLeftComponent(scrollTextPane); model = new DefaultListModel<JFileListEntry>(); list = new JFileList(); list.setModel(model); list.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (!lsm.isSelectionEmpty() && !e.getValueIsAdjusting()) { int min = lsm.getMinSelectionIndex(); int max = lsm.getMaxSelectionIndex(); List<Diff> diffs = new ArrayList<Diff>(); List<Diff> allDiffs = commit.getDiffs(false); for (int i = min; i <= max; i++) { if (lsm.isSelectedIndex(i)) { JFileListEntry entry = model.get(i); for (Diff d : allDiffs) { if (d.getLocalPath().equals(entry.getText())) { diffs.add(d); } } } } for (IDiffSelectionListener l : listeners) { l.onSelect(commit, diffs, allDiffs); } } } }); JScrollPane scrollList = new JScrollPane(); scrollList.getVerticalScrollBar().setUnitIncrement(10); scrollList.setBorder(null); scrollList.setViewportView(list); splitPane.setRightComponent(scrollList); popupMenu = new JPopupMenu(); popupMenu.addPopupMenuListener(new PopupMenuListener() { public void popupMenuCanceled(PopupMenuEvent arg0) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) { popupMenu.removeAll(); } public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) { Object value = list.getSelectedValue(); JMenuItem item = MenuItemUtils.getOpenSelectedVersion(commit, value == null ? "" : list.getSelectedValue().getText()); item.setEnabled(value != null); popupMenu.add(item); } }); MenuItemUtils.addPopup(list, popupMenu); } public void addListener(IDiffSelectionListener l) { listeners.add(l); } public void removeListener(IDiffSelectionListener l) { listeners.remove(l); } public void reload(Commit c) { this.commit = c; model.clear(); StringBuilder sb = new StringBuilder(); sb.append("<html>"); sb.append("<b>Commit:</b> " + c.getHash() + " [" + c.getDisplayHash() + "]<br>"); sb.append("<b>Author:</b> " + c.getDisplayAuthor().replace(">", ">").replace("<", "<") + "<br>"); sb.append("<b>When:</b> " + c.getWhen() + "<br>"); sb.append("<br>"); sb.append(c.getComment()); sb.append("</html>"); textPane.setText(sb.toString()); } public DefaultListModel<JFileListEntry> getListModel() { return model; } public void clear() { model.clear(); textPane.setText(""); } public void reloadDividers() { splitPane.setDividerLocation(splitPane.getSize().height / 2); } }