package com.niklim.clicktrace.dialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JComponent; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; import com.niklim.clicktrace.controller.ActiveSession; import com.niklim.clicktrace.controller.operation.session.RefreshSessionOperation; import com.niklim.clicktrace.model.ScreenShot; import com.niklim.clicktrace.model.dao.SessionPropertiesWriter; import com.niklim.clicktrace.service.SessionManager; import com.niklim.clicktrace.view.OperationsShortcutEnum; @Singleton public class ReorderingDialog extends AbstractDialog<ReorderingView> { @Inject private ActiveSession activeSession; @Inject private RefreshSessionOperation refreshSessionOperation; @Inject private SessionManager sessionManager; @Inject public void init() { initTextWrapping(view.sessionDescription); createListeners(); postInit(); } private void createListeners() { view.table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { refreshDescription(); recalculateNavigationState(); } private void recalculateNavigationState() { int shotsCount = activeSession.getSession().getShots().size(); if (view.table.getSelectionModel().getMaxSelectionIndex() >= shotsCount - 1) { view.next.setEnabled(false); } else if (view.table.getSelectedRowCount() > 0) { view.next.setEnabled(true); } else { view.next.setEnabled(false); } if (view.table.getSelectionModel().getMinSelectionIndex() == 0) { view.prev.setEnabled(false); } else if (view.table.getSelectedRowCount() > 0) { view.prev.setEnabled(true); } else { view.prev.setEnabled(false); } } }); final ActionListener movePrev = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ListSelectionModel selection = view.table.getSelectionModel(); DefaultTableModel model = (DefaultTableModel) view.table.getModel(); model.moveRow(selection.getMinSelectionIndex(), selection.getMaxSelectionIndex(), selection.getMinSelectionIndex() - 1); view.table.setRowSelectionInterval(selection.getMinSelectionIndex() - 1, selection.getMaxSelectionIndex() - 1); } }; view.prev.addActionListener(movePrev); final ActionListener moveNext = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ListSelectionModel selection = view.table.getSelectionModel(); DefaultTableModel model = (DefaultTableModel) view.table.getModel(); model.moveRow(selection.getMinSelectionIndex(), selection.getMaxSelectionIndex(), selection.getMinSelectionIndex() + 1); view.table.setRowSelectionInterval(selection.getMinSelectionIndex() + 1, selection.getMaxSelectionIndex() + 1); } }; view.next.addActionListener(moveNext); view.dialog.getRootPane().registerKeyboardAction( movePrev, KeyStroke.getKeyStroke(OperationsShortcutEnum.SHOT_MOVE_PREV.code, OperationsShortcutEnum.SHOT_MOVE_PREV.modifier), JComponent.WHEN_IN_FOCUSED_WINDOW); view.dialog.getRootPane().registerKeyboardAction( moveNext, KeyStroke.getKeyStroke(OperationsShortcutEnum.SHOT_MOVE_NEXT.code, OperationsShortcutEnum.SHOT_MOVE_NEXT.modifier), JComponent.WHEN_IN_FOCUSED_WINDOW); } private void refreshDescription() { if (view.table.getSelectedRowCount() == 1) { view.sessionDescription.setEnabled(true); int selectedRow = view.table.getSelectedRow(); ScreenShot shot = (ScreenShot) view.table.getModel().getValueAt(selectedRow, 0); if (shot != null) { view.sessionDescription.setText(shot.getDescription()); } } else { view.sessionDescription.setEnabled(false); view.sessionDescription.setText(""); } } public void open() { initModel(); center(); view.dialog.setVisible(true); } private void initModel() { loadShots(); refreshDescription(); } @Override public void okAction() { saveOrdering(); refreshSessionOperation.perform(); close(); } private void saveOrdering() { SessionPropertiesWriter writer = sessionManager.createSessionPropertiesWriter(activeSession.getSession()); List<ScreenShot> shots = Lists.newArrayList(); DefaultTableModel model = (DefaultTableModel) view.table.getModel(); for (int i = 0; i < model.getRowCount(); i++) { shots.add((ScreenShot) model.getValueAt(i, 0)); } writer.saveOrdering(Lists.transform(shots, new Function<ScreenShot, String>() { public String apply(ScreenShot input) { return input.getFilename(); } })); } private void loadShots() { List<ScreenShot> shots = Lists.newArrayList(activeSession.getSession().getShots()); DefaultTableModel dataModel = new DefaultTableModel(new String[] { "Screenshot" }, shots.size()) { @Override public boolean isCellEditable(int row, int column) { // all cells not editable return false; } }; view.table.setModel(dataModel); view.table.getSelectionModel().setSelectionInterval(0, 0); int i = 0; for (ScreenShot shot : shots) { view.table.getModel().setValueAt(shot, i, 0); i++; } } @Override protected ReorderingView createView() { return new ReorderingView(); } }