James Moger
2012-10-22 eba89539a29deba954035056437279088c3e047b
src/com/gitblit/client/SearchDialog.java
@@ -16,8 +16,10 @@
package com.gitblit.client;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
@@ -42,8 +44,8 @@
import javax.swing.event.ListSelectionListener;
import com.gitblit.Constants;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.utils.StringUtils;
/**
@@ -57,9 +59,11 @@
   private static final long serialVersionUID = 1L;
   private final boolean isSearch;
   private final GitblitClient gitblit;
   private SyndicatedEntryTableModel tableModel;
   private FeedEntryTableModel tableModel;
   private HeaderPanel header;
@@ -77,21 +81,46 @@
   private JComboBox maxHitsSelector;
   public SearchDialog(GitblitClient gitblit) {
   private int page;
   private JButton prev;
   private JButton next;
   public SearchDialog(GitblitClient gitblit, boolean isSearch) {
      super();
      this.gitblit = gitblit;
      setTitle(Translation.get("gb.search"));
      this.isSearch = isSearch;
      setTitle(Translation.get(isSearch ? "gb.search" : "gb.log"));
      setIconImage(new ImageIcon(getClass().getResource("/gitblt-favicon.png")).getImage());
      initialize();
      setSize(900, 400);
      setSize(900, 550);
   }
   private void initialize() {
      final JButton search = new JButton(Translation.get("gb.search"));
      prev = new JButton("<");
      prev.setToolTipText(Translation.get("gb.pagePrevious"));
      prev.setEnabled(false);
      prev.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            search(--page);
         }
      });
      next = new JButton(">");
      next.setToolTipText(Translation.get("gb.pageNext"));
      next.setEnabled(false);
      next.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            search(++page);
         }
      });
      final JButton search = new JButton(Translation.get(isSearch ? "gb.search" : "gb.refresh"));
      search.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            search();
            search(0);
         }
      });
@@ -125,20 +154,21 @@
      controls.add(viewTree);
      NameRenderer nameRenderer = new NameRenderer();
      tableModel = new SyndicatedEntryTableModel();
      header = new HeaderPanel(Translation.get("gb.search"), "search-icon.png");
      tableModel = new FeedEntryTableModel();
      header = new HeaderPanel(Translation.get(isSearch ? "gb.search" : "gb.log"),
            isSearch ? "search-icon.png" : "commit_changes_16x16.png");
      table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
      String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
      String name = table.getColumnName(FeedEntryTableModel.Columns.Author.ordinal());
      table.setRowHeight(nameRenderer.getFont().getSize() + 8);
      table.getColumn(name).setCellRenderer(nameRenderer);
      name = table.getColumnName(SyndicatedEntryTableModel.Columns.Repository.ordinal());
      name = table.getColumnName(FeedEntryTableModel.Columns.Repository.ordinal());
      table.getColumn(name).setCellRenderer(nameRenderer);
      name = table.getColumnName(SyndicatedEntryTableModel.Columns.Branch.ordinal());
      name = table.getColumnName(FeedEntryTableModel.Columns.Branch.ordinal());
      table.getColumn(name).setCellRenderer(new BranchRenderer());
      name = table.getColumnName(SyndicatedEntryTableModel.Columns.Message.ordinal());
      name = table.getColumnName(FeedEntryTableModel.Columns.Message.ordinal());
      table.getColumn(name).setCellRenderer(new MessageRenderer());
      table.addMouseListener(new MouseAdapter() {
@@ -178,9 +208,16 @@
               selectedBranch = branchSelector.getSelectedItem().toString();
            }
            updateBranches();
            if (selectedBranch != null) {
            if (StringUtils.isEmpty(selectedBranch)) {
               // do not select branch
               branchSelector.setSelectedIndex(-1);
            } else {
               if (branchChoices.getIndexOf(selectedBranch) > -1) {
                  // select branch
                  branchChoices.setSelectedItem(selectedBranch);
               } else {
                  // branch does not exist, do not select branch
                  branchSelector.setSelectedIndex(-1);
               }
            }
         }
@@ -194,26 +231,38 @@
      searchTypeSelector.setSelectedItem(Constants.SearchType.COMMIT);
      maxHitsSelector = new JComboBox(new Integer[] { 25, 50, 75, 100 });
      maxHitsSelector.setSelectedIndex(-1);
      maxHitsSelector.setSelectedIndex(0);
      searchFragment = new JTextField(25);
      searchFragment.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent event) {
            search();
            search(0);
         }
      });
      JPanel northControls = new JPanel(new FlowLayout(FlowLayout.LEFT, Utils.MARGIN, 0));
      northControls.add(new JLabel(Translation.get("gb.repository")));
      northControls.add(repositorySelector);
      northControls.add(new JLabel(Translation.get("gb.branch")));
      northControls.add(branchSelector);
      northControls.add(new JLabel(Translation.get("gb.type")));
      northControls.add(searchTypeSelector);
      northControls.add(new JLabel(Translation.get("gb.maxHits")));
      northControls.add(maxHitsSelector);
      northControls.add(searchFragment);
      northControls.add(search);
      JPanel queryPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, Utils.MARGIN, 0));
      queryPanel.add(new JLabel(Translation.get("gb.repository")));
      queryPanel.add(repositorySelector);
      queryPanel.add(new JLabel(Translation.get("gb.branch")));
      queryPanel.add(branchSelector);
      if (isSearch) {
         queryPanel.add(new JLabel(Translation.get("gb.type")));
         queryPanel.add(searchTypeSelector);
      }
      queryPanel.add(new JLabel(Translation.get("gb.maxHits")));
      queryPanel.add(maxHitsSelector);
      JPanel actionsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, Utils.MARGIN, 0));
      actionsPanel.add(search);
      actionsPanel.add(prev);
      actionsPanel.add(next);
      JPanel northControls = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
      northControls.add(queryPanel, BorderLayout.WEST);
      if (isSearch) {
         northControls.add(searchFragment, BorderLayout.CENTER);
      }
      northControls.add(actionsPanel, BorderLayout.EAST);
      JPanel northPanel = new JPanel(new BorderLayout(0, Utils.MARGIN));
      northPanel.add(header, BorderLayout.NORTH);
@@ -237,12 +286,18 @@
      addWindowListener(new WindowAdapter() {
         @Override
         public void windowOpened(WindowEvent event) {
            searchFragment.requestFocus();
            if (isSearch) {
               searchFragment.requestFocus();
            } else {
               search(0);
            }
         }
         @Override
         public void windowActivated(WindowEvent event) {
            searchFragment.requestFocus();
            if (isSearch) {
               searchFragment.requestFocus();
            }
         }
      });
   }
@@ -263,29 +318,42 @@
      }
   }
   protected void search() {
   protected void search(final int page) {
      this.page = page;
      final String repository = repositorySelector.getSelectedItem().toString();
      final String branch = branchSelector.getSelectedIndex() > -1 ? branchSelector
            .getSelectedItem().toString() : null;
      final Constants.SearchType searchType = (Constants.SearchType) searchTypeSelector
            .getSelectedItem();
      final String fragment = searchFragment.getText();
      final String fragment = isSearch ? searchFragment.getText() : null;
      final int maxEntryCount = maxHitsSelector.getSelectedIndex() > -1 ? ((Integer) maxHitsSelector
            .getSelectedItem()) : -1;
      if (StringUtils.isEmpty(fragment)) {
      if (isSearch && StringUtils.isEmpty(fragment)) {
         return;
      }
      SwingWorker<List<SyndicatedEntryModel>, Void> worker = new SwingWorker<List<SyndicatedEntryModel>, Void>() {
      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      SwingWorker<List<FeedEntryModel>, Void> worker = new SwingWorker<List<FeedEntryModel>, Void>() {
         @Override
         protected List<SyndicatedEntryModel> doInBackground() throws IOException {
            return gitblit.search(repository, branch, fragment, searchType, maxEntryCount);
         protected List<FeedEntryModel> doInBackground() throws IOException {
            if (isSearch) {
               return gitblit.search(repository, branch, fragment, searchType, maxEntryCount,
                     page);
            } else {
               return gitblit.log(repository, branch, maxEntryCount, page);
            }
         }
         @Override
         protected void done() {
            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            try {
               List<SyndicatedEntryModel> results = get();
               updateTable(true, fragment, results);
               List<FeedEntryModel> results = get();
               if (isSearch) {
                  updateTable(true, fragment, results);
               } else {
                  updateTable(true, branch == null ? "" : branch, results);
               }
            } catch (Throwable t) {
               Utils.showException(SearchDialog.this, t);
            }
@@ -294,36 +362,44 @@
      worker.execute();
   }
   protected void updateTable(boolean pack, String fragment, List<SyndicatedEntryModel> entries) {
   protected void updateTable(boolean pack, String text, List<FeedEntryModel> entries) {
      tableModel.entries.clear();
      tableModel.entries.addAll(entries);
      tableModel.fireTableDataChanged();
      setTitle(Translation.get("gb.search") + ": " + fragment + " (" + entries.size() + ")");
      setTitle(Translation.get(isSearch ? "gb.search" : "gb.log")
            + (StringUtils.isEmpty(text) ? "" : (": " + text)) + " (" + entries.size()
            + (page > 0 ? (", pg " + (page + 1)) : "") + ")");
      header.setText(getTitle());
      if (pack) {
         Utils.packColumns(table, Utils.MARGIN);
      }
      table.scrollRectToVisible(new Rectangle(table.getCellRect(0, 0, true)));
      // update pagination buttons
      int maxHits = (Integer) maxHitsSelector.getSelectedItem();
      next.setEnabled(entries.size() == maxHits);
      prev.setEnabled(page > 0);
   }
   protected SyndicatedEntryModel getSelectedSyndicatedEntry() {
   protected FeedEntryModel getSelectedSyndicatedEntry() {
      int viewRow = table.getSelectedRow();
      int modelRow = table.convertRowIndexToModel(viewRow);
      SyndicatedEntryModel entry = tableModel.get(modelRow);
      FeedEntryModel entry = tableModel.get(modelRow);
      return entry;
   }
   protected void viewCommit() {
      SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
      FeedEntryModel entry = getSelectedSyndicatedEntry();
      Utils.browse(entry.link);
   }
   protected void viewCommitDiff() {
      SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
      FeedEntryModel entry = getSelectedSyndicatedEntry();
      Utils.browse(entry.link.replace("/commit/", "/commitdiff/"));
   }
   protected void viewTree() {
      SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
      FeedEntryModel entry = getSelectedSyndicatedEntry();
      Utils.browse(entry.link.replace("/commit/", "/tree/"));
   }
}