package gitj.ui; import java.awt.BorderLayout; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import git.Commit; import git.Diff; import git.Repository; import gitj.LanguageScanner; import gitj.Main; import gitj.ui.components.DiffHolderPanel; import gitj.ui.components.DiffPanel; import gitj.ui.components.ICommitClickListener; import gitj.ui.components.IDiffSelectionListener; import gitj.ui.components.JFileListEntry; import gitj.ui.components.LanguageBar; import gitj.utils.GitIconUtils; @SuppressWarnings("serial") public class MainPanel extends AbstractPanel { private JFrame parent; private JSplitPane splitPaneMain; private JSplitPane splitPaneLow; private CommitListPanel jcommitPane; private DiffHolderPanel diffHolderPanel; private JScrollPane scrollPaneDiffs; private PanelSummary panelSummary; private LanguageBar langBar; private JPanel panelList; /** * Repository tab * * @param repository * @throws Exception */ public MainPanel(JFrame parent, Repository repository) throws Exception { super(repository); this.parent = parent; setBorder(new EmptyBorder(0, 0, 0, 0)); setLayout(new BorderLayout(0, 0)); splitPaneMain = new JSplitPane(); splitPaneMain.setResizeWeight(0.5); splitPaneMain.setOrientation(JSplitPane.VERTICAL_SPLIT); add(splitPaneMain, BorderLayout.CENTER); langBar = new LanguageBar(); add(langBar, BorderLayout.NORTH); jcommitPane = new CommitListPanel(repository); jcommitPane.addListener(new CommitClickListener()); splitPaneMain.setLeftComponent(jcommitPane); splitPaneLow = new JSplitPane(); splitPaneLow.setResizeWeight(0.5); splitPaneMain.setRightComponent(splitPaneLow); diffHolderPanel = new DiffHolderPanel(); scrollPaneDiffs = new JScrollPane(); scrollPaneDiffs.getVerticalScrollBar().setUnitIncrement(10); scrollPaneDiffs.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPaneDiffs.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPaneDiffs.setViewportView(diffHolderPanel); splitPaneLow.setRightComponent(scrollPaneDiffs); panelSummary = new PanelSummary(); splitPaneLow.setLeftComponent(panelSummary); panelSummary.addListener(new DiffSelectionListener()); reloadLangBar(); } public void reloadDividers() { splitPaneMain.setDividerLocation(splitPaneMain.getSize().height / 2); splitPaneLow.setDividerLocation(splitPaneLow.getSize().width / 2); panelSummary.reloadDividers(); } /** * Clears everything visible and reloads commit panel * * @throws Exception */ @Override public void reload() throws Exception { clear(); reloadCommits(); reloadUncommited(); reloadDividers(); reloadLangBar(); } public void reloadLangBar() { new Thread(new Runnable() { @Override public void run() { try { langBar.setLanguages(new LanguageScanner(repo).scan(false)); langBar.repaint(); } catch (Exception e) { e.printStackTrace(); Main.displayError(e); } } }).start(); } /** * Reloads commit list * * @throws Exception */ public void reloadCommits() throws Exception { jcommitPane.clear(); jcommitPane.reload(); reloadDividers(); } /** * Reloads staged and unstaged files * * @throws Exception */ public void reloadUncommited() throws Exception { if (panelList instanceof PanelUncommited) { PanelUncommited panel = (PanelUncommited) panelList; panel.reload(); reloadDividers(); } } /** * Clears Diff and Commit panels */ public void clear() { diffHolderPanel.clear(); panelSummary.clear(); } /** * Loads diffs (On click on commit) * * @param diffs * Diffs to load * @param allDiffs * All diffs for current commit * @param reloadDiffList * if we should clear and fill the JList containing the diffs * with data from diffs list */ public void loadDiffs(Commit c, final List<Diff> diffs, List<Diff> allDiffs, boolean reloadDiffList) { if (allDiffs != null) { splitPaneLow.setLeftComponent(panelSummary); panelList = panelSummary; } else if (!(panelList instanceof PanelUncommited)){ PanelUncommited pu = new PanelUncommited(this, repo); pu.addListener(new DiffSelectionListener()); try { pu.reload(); } catch (Exception e) { e.printStackTrace(); } splitPaneLow.setLeftComponent(pu); panelList = pu; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { diffHolderPanel.clear(); diffHolderPanel.revalidate(); for (Diff diff : diffs) { diffHolderPanel.addDiffPanel(new DiffPanel(diff)); } diffHolderPanel.revalidate(); } }); if (reloadDiffList) { panelSummary.reload(c); for (Diff diff : allDiffs) { panelSummary.getListModel().addElement(new JFileListEntry(diff.getLocalPath(), new ImageIcon(GitIconUtils.getIconFromDiffType(diff.getType())))); } } reloadDividers(); } /** * Loads stage and unstaging panel * * @throws Exception */ public void loadUncommited() throws Exception { List<Diff> diffs = repo.getUncommitedDiffs(); loadDiffs(null, diffs, null, false); } public JFrame getParentFrame() { return this.parent; } public CommitListPanel getCommitPanel() { return this.jcommitPane; } public class CommitClickListener implements ICommitClickListener { @Override public void onClick(Commit c) { try { if (c == null && repo.hasUnstagedFiles()) { loadUncommited(); } else if (c != null) { List<Diff> d = c.getDiffs(false); loadDiffs(c, d, d, true); } } catch (Exception ex) { ex.printStackTrace(); Main.displayError(ex); } } } public class DiffSelectionListener implements IDiffSelectionListener { @Override public void onSelect(Commit c, List<Diff> d, List<Diff> all) { try { loadDiffs(c, d, all, false); } catch (Exception ex) { ex.printStackTrace(); Main.displayError(ex); } } } public JPanel getListPanel() { return panelList; } }