package gitj.ui; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import git.Change; import git.Diff; import git.Repository; import gitj.Main; import gitj.ui.components.IDiffSelectionListener; import gitj.ui.components.JFileList; import gitj.ui.components.JFileListEntry; import gitj.utils.DialogUtils; import gitj.utils.GitIconUtils; import gitj.utils.MenuItemUtils; @SuppressWarnings("serial") public class PanelUncommited extends AbstractPanel { private List<IDiffSelectionListener> listeners = new ArrayList<IDiffSelectionListener>(); private AbstractPanel parent; private DefaultListModel<JFileListEntry> unstagedModel; private JFileList unstagedList; private DefaultListModel<JFileListEntry> stagedModel; private JFileList stagedList; public PanelUncommited(AbstractPanel parent, final Repository repo) { super(repo); this.parent = parent; setLayout(new BorderLayout(0, 0)); JSplitPane splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); splitPane.setResizeWeight(0.5); JScrollPane stagedScrollList = new JScrollPane(); stagedScrollList.getVerticalScrollBar().setUnitIncrement(10); stagedScrollList.setBorder(null); stagedModel = new DefaultListModel<JFileListEntry>(); stagedList = new JFileList(); stagedList.setModel(stagedModel); stagedList.addMouseListener(new ClickListener()); stagedScrollList.setViewportView(stagedList); splitPane.setLeftComponent(stagedScrollList); JScrollPane unstagedScrollList = new JScrollPane(); unstagedScrollList.getVerticalScrollBar().setUnitIncrement(10); unstagedScrollList.setBorder(null); unstagedModel = new DefaultListModel<JFileListEntry>(); unstagedList = new JFileList(); unstagedList.setModel(unstagedModel); unstagedList.addMouseListener(new ClickListener()); unstagedScrollList.setViewportView(unstagedList); splitPane.setRightComponent(unstagedScrollList); JPopupMenu menu = new JPopupMenu(); MenuItemUtils.addPopup(unstagedList, menu); JMenuItem btnRemove = new JMenuItem("Remove"); menu.add(btnRemove); btnRemove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<String> list = getSelectedUnstaged(); if (DialogUtils.confirm("Remove", "Are you sure that you want to remove " + list.size() + " files?")) { for (String s : list) { File file = repo.getAbsoluteFile(s); file.delete(); } try { reload(); } catch (Exception e1) { e1.printStackTrace(); Main.displayError(e1); } } } }); add(splitPane); } public void addListener(IDiffSelectionListener l) { listeners.add(l); } public void reload() throws Exception { unstagedModel.clear(); stagedModel.clear(); List<Change> changes = repo.parseStatus(); for (Change change : changes) { DefaultListModel<JFileListEntry> model; if (change.isStaged()) { model = stagedModel; } else { model = unstagedModel; } System.out.println(change.getRepoPath()); model.addElement(new JFileListEntry(change.getRepoPath(), GitIconUtils.getIconFromChangeType(change.getTypes().get(0)))); } } public List<String> getSelectedUnstaged() { List<String> list = new ArrayList<String>(); for (int i = 0; i < unstagedModel.getSize(); i++) { if (unstagedList.isSelectedIndex(i)) { list.add(unstagedModel.get(i).getText()); } } return list; } public List<String> getSelectedStaged() { List<String> list = new ArrayList<String>(); for (int i = 0; i < stagedModel.getSize(); i++) { if (stagedList.isSelectedIndex(i)) { list.add(stagedModel.get(i).getText()); } } for (int i = 0; i < unstagedModel.getSize(); i++) { if (unstagedList.isSelectedIndex(i)) { list.add(unstagedModel.get(i).getText()); } } return list; } public void loadDiff(List<Diff> diffs) { for (IDiffSelectionListener l : listeners) { l.onSelect(null, diffs, null); } } public class ClickListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { JFileList list = (JFileList) e.getSource(); JFileListEntry entry = list.getSelectedValue(); if (entry != null && e.getClickCount() == 2 && entry != null) { try { if (list == stagedList) { repo.unstage(entry.getText()); } else { repo.stage(entry.getText()); } reload(); } catch (Exception ex) { ex.printStackTrace(); Main.displayError(ex); } } else if (entry != null && e.getClickCount() == 1) { List<Diff> diffs = repo.getUncommitedDiffs(); List<Diff> selected = new ArrayList<Diff>(); for (Diff d : diffs) { if (d.getLocalPath().equals(entry.getText())) { selected.add(d); } } loadDiff(selected); } } } }