package com.niklim.clicktrace.dialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.ButtonGroup; import javax.swing.table.DefaultTableModel; import com.google.inject.Inject; import com.google.inject.Singleton; import com.niklim.clicktrace.controller.ActiveSession; import com.niklim.clicktrace.controller.MainController; import com.niklim.clicktrace.model.ScreenShot; import com.niklim.clicktrace.service.SearchService; import com.niklim.clicktrace.service.SearchService.SearchResult; import com.niklim.clicktrace.view.TextComponentHistory; @Singleton public class SearchDialog extends AbstractDialog<SearchView> { @Inject private SearchService searchService; @Inject private MainController controller; @Inject private ActiveSession activeSession; private TextComponentHistory history; private String[] resultTableColumns = new String[] { "Label", "Filename", "Session", "Phrase" }; @Inject public void init() { history = new TextComponentHistory(view.searchQuery); createActionListeners(); postInit(); } private void createActionListeners() { final ButtonGroup searchType = new ButtonGroup(); searchType.add(view.allSessionsRadio); searchType.add(view.activeSessionRadio); searchType.setSelected(view.allSessionsRadio.getModel(), true); view.resultTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { view.dialog.setVisible(false); SearchService.SearchResult result = (SearchService.SearchResult) view.resultTable.getModel() .getValueAt(view.resultTable.getSelectedRow(), 0); openResult(result); } } }); view.resultTable.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { view.dialog.setVisible(false); ScreenShot selectedShot = (ScreenShot) view.resultTable.getModel().getValueAt( view.resultTable.getSelectedRow(), 0); controller.openSessionOnScreenShot(selectedShot); } } }); view.searchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { search(view.searchQuery.getText(), searchType.isSelected(view.allSessionsRadio.getModel()), view.matchCase.isSelected()); } }); view.searchQuery.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent event) { if (event.getKeyChar() == '\n') { search(view.searchQuery.getText(), searchType.isSelected(view.allSessionsRadio.getModel()), view.matchCase.isSelected()); } } }); view.searchQuery.addKeyListener(new TextComponentHistory.DefaultKeyAdapter(history)); } private void openResult(SearchResult result) { if (result instanceof SearchService.ShotSearchResult) { SearchService.ShotSearchResult r = (SearchService.ShotSearchResult) result; controller.openSessionOnScreenShot(r.shot); } else if (result instanceof SearchService.SessionSearchResult) { SearchService.SessionSearchResult r = (SearchService.SessionSearchResult) result; controller.showSession(r.session); } } public void open() { initModel(); center(); view.dialog.setVisible(true); } private void initModel() { if (activeSession.isSessionLoaded()) { view.activeSessionRadio.setEnabled(true); } else { view.activeSessionRadio.setEnabled(false); view.allSessionsRadio.setSelected(true); } if (view.resultTable.getModel().getRowCount() == 0) { view.resultTable.setModel(new DefaultTableModel()); } history.reset(view.searchQuery.getText()); } @SuppressWarnings("serial") public void search(String query, boolean allSessions, boolean matchCase) { List<SearchService.SearchResult> shots = searchService.search(query, allSessions, matchCase); DefaultTableModel dataModel = new DefaultTableModel(resultTableColumns, shots.size()) { @Override public boolean isCellEditable(int row, int column) { // all cells not editable return false; } }; view.resultTable.setModel(dataModel); int i = 0; for (SearchService.SearchResult result : shots) { view.resultTable.getModel().setValueAt(result, i, 0); if (result instanceof SearchService.ShotSearchResult) { SearchService.ShotSearchResult r = (SearchService.ShotSearchResult) result; view.resultTable.getModel().setValueAt(r.shot.getFilename(), i, 1); view.resultTable.getModel().setValueAt(r.shot.getSession().getName(), i, 2); } else if (result instanceof SearchService.SessionSearchResult) { view.resultTable.getModel().setValueAt("-", i, 1); view.resultTable.getModel().setValueAt("-", i, 2); } view.resultTable.getModel().setValueAt(result.highlight, i, 3); i++; } } @Override protected void okAction() { } @Override protected SearchView createView() { return new SearchView(); } @Override protected void createControlListeners() { } }