| | |
| | | import java.awt.BorderLayout;
|
| | | 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;
|
| | |
| | | import javax.swing.event.ListSelectionListener;
|
| | | import javax.swing.table.TableRowSorter;
|
| | |
|
| | | import com.gitblit.models.FeedEntryModel;
|
| | | import com.gitblit.models.FeedModel;
|
| | | import com.gitblit.models.SyndicatedEntryModel;
|
| | | import com.gitblit.utils.StringUtils;
|
| | |
|
| | | /**
|
| | |
| | |
|
| | | private final String ALL = "*";
|
| | |
|
| | | private SyndicatedEntryTableModel tableModel;
|
| | | private FeedEntryTableModel tableModel;
|
| | |
|
| | | private TableRowSorter<SyndicatedEntryTableModel> defaultSorter;
|
| | | private TableRowSorter<FeedEntryTableModel> defaultSorter;
|
| | |
|
| | | private HeaderPanel header;
|
| | |
|
| | |
| | |
|
| | | private JComboBox authorSelector;
|
| | |
|
| | | private int page;
|
| | |
|
| | | private JButton prev;
|
| | |
|
| | | private JButton next;
|
| | |
|
| | | public FeedsPanel(GitblitClient gitblit) {
|
| | | super();
|
| | | this.gitblit = gitblit;
|
| | |
| | | }
|
| | |
|
| | | private void initialize() {
|
| | |
|
| | | prev = new JButton("<");
|
| | | prev.setToolTipText(Translation.get("gb.pagePrevious"));
|
| | | prev.setEnabled(false);
|
| | | prev.addActionListener(new ActionListener() {
|
| | | public void actionPerformed(ActionEvent e) {
|
| | | refreshFeeds(--page);
|
| | | }
|
| | | });
|
| | |
|
| | | next = new JButton(">");
|
| | | next.setToolTipText(Translation.get("gb.pageNext"));
|
| | | next.setEnabled(false);
|
| | | next.addActionListener(new ActionListener() {
|
| | | public void actionPerformed(ActionEvent e) {
|
| | | refreshFeeds(++page);
|
| | | }
|
| | | });
|
| | |
|
| | | JButton refreshFeeds = new JButton(Translation.get("gb.refresh"));
|
| | | refreshFeeds.addActionListener(new ActionListener() {
|
| | | public void actionPerformed(ActionEvent e) {
|
| | | refreshFeeds();
|
| | | refreshFeeds(0);
|
| | | }
|
| | | });
|
| | |
|
| | |
| | | controls.add(viewTree);
|
| | |
|
| | | NameRenderer nameRenderer = new NameRenderer();
|
| | | tableModel = new SyndicatedEntryTableModel();
|
| | | tableModel = new FeedEntryTableModel();
|
| | | header = new HeaderPanel(Translation.get("gb.activity"), "feed_16x16.png");
|
| | | table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
|
| | | defaultSorter = new TableRowSorter<SyndicatedEntryTableModel>(tableModel);
|
| | | String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
|
| | | defaultSorter = new TableRowSorter<FeedEntryTableModel>(tableModel);
|
| | | 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(gitblit));
|
| | |
|
| | | table.addMouseListener(new MouseAdapter() {
|
| | |
| | | northControls.add(repositorySelector);
|
| | | northControls.add(new JLabel(Translation.get("gb.author")));
|
| | | northControls.add(authorSelector);
|
| | | // northControls.add(prev);
|
| | | // northControls.add(next);
|
| | |
|
| | | JPanel northPanel = new JPanel(new BorderLayout(0, Utils.MARGIN));
|
| | | northPanel.add(header, BorderLayout.NORTH);
|
| | |
| | | return Utils.INSETS;
|
| | | }
|
| | |
|
| | | protected void refreshFeeds() {
|
| | | protected void refreshFeeds(final int page) {
|
| | | this.page = page;
|
| | | GitblitWorker worker = new GitblitWorker(FeedsPanel.this, null) {
|
| | | @Override
|
| | | protected Boolean doRequest() throws IOException {
|
| | | gitblit.refreshSubscribedFeeds();
|
| | | gitblit.refreshSubscribedFeeds(page);
|
| | | return true;
|
| | | }
|
| | |
|
| | |
| | | tableModel.entries.addAll(gitblit.getSyndicatedEntries());
|
| | | tableModel.fireTableDataChanged();
|
| | | header.setText(Translation.get("gb.activity") + " ("
|
| | | + gitblit.getSyndicatedEntries().size() + ")");
|
| | | + gitblit.getSyndicatedEntries().size() + (page > 0 ? (", pg " + (page + 1)) : "")
|
| | | + ")");
|
| | | if (pack) {
|
| | | Utils.packColumns(table, Utils.MARGIN);
|
| | | }
|
| | | // determine unique repositories
|
| | | Set<String> uniqueRepositories = new HashSet<String>();
|
| | | for (SyndicatedEntryModel entry : tableModel.entries) {
|
| | | uniqueRepositories.add(entry.repository);
|
| | | table.scrollRectToVisible(new Rectangle(table.getCellRect(0, 0, true)));
|
| | |
|
| | | if (page == 0) {
|
| | | // determine unique repositories
|
| | | Set<String> uniqueRepositories = new HashSet<String>();
|
| | | for (FeedEntryModel entry : tableModel.entries) {
|
| | | uniqueRepositories.add(entry.repository);
|
| | | }
|
| | |
|
| | | // repositories
|
| | | List<String> sortedRespositories = new ArrayList<String>(uniqueRepositories);
|
| | | StringUtils.sortRepositorynames(sortedRespositories);
|
| | | repositoryChoices.removeAllElements();
|
| | | repositoryChoices.addElement(ALL);
|
| | | for (String repo : sortedRespositories) {
|
| | | repositoryChoices.addElement(repo);
|
| | | }
|
| | | }
|
| | |
|
| | | // repositories
|
| | | List<String> sortedRespositories = new ArrayList<String>(uniqueRepositories);
|
| | | StringUtils.sortRepositorynames(sortedRespositories);
|
| | | repositoryChoices.removeAllElements();
|
| | | repositoryChoices.addElement(ALL);
|
| | | for (String repo : sortedRespositories) {
|
| | | repositoryChoices.addElement(repo);
|
| | | }
|
| | | // update pagination buttons
|
| | | next.setEnabled(tableModel.entries.size() > 0);
|
| | | prev.setEnabled(page > 0);
|
| | | }
|
| | |
|
| | | private void updateAuthors() {
|
| | |
| | |
|
| | | // determine unique repositories and authors
|
| | | Set<String> uniqueAuthors = new HashSet<String>();
|
| | | for (SyndicatedEntryModel entry : tableModel.entries) {
|
| | | for (FeedEntryModel entry : tableModel.entries) {
|
| | | if (repository.equals(ALL) || entry.repository.equalsIgnoreCase(repository)) {
|
| | | uniqueAuthors.add(entry.author);
|
| | | }
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | 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/"));
|
| | | }
|
| | |
|
| | |
| | | table.setRowSorter(defaultSorter);
|
| | | return;
|
| | | }
|
| | | final int repositoryIndex = SyndicatedEntryTableModel.Columns.Repository.ordinal();
|
| | | final int authorIndex = SyndicatedEntryTableModel.Columns.Author.ordinal();
|
| | | RowFilter<SyndicatedEntryTableModel, Object> containsFilter;
|
| | | final int repositoryIndex = FeedEntryTableModel.Columns.Repository.ordinal();
|
| | | final int authorIndex = FeedEntryTableModel.Columns.Author.ordinal();
|
| | | RowFilter<FeedEntryTableModel, Object> containsFilter;
|
| | | if (repository.equals(ALL)) {
|
| | | // author filter
|
| | | containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
|
| | | containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
|
| | | public boolean include(
|
| | | Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
|
| | | Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
|
| | | return entry.getStringValue(authorIndex).equalsIgnoreCase(author);
|
| | | }
|
| | | };
|
| | | } else if (author.equals(ALL)) {
|
| | | // repository filter
|
| | | containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
|
| | | containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
|
| | | public boolean include(
|
| | | Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
|
| | | Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
|
| | | return entry.getStringValue(repositoryIndex).equalsIgnoreCase(repository);
|
| | | }
|
| | | };
|
| | | } else {
|
| | | // repository-author filter
|
| | | containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
|
| | | containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
|
| | | public boolean include(
|
| | | Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
|
| | | Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
|
| | | boolean authorMatch = entry.getStringValue(authorIndex)
|
| | | .equalsIgnoreCase(author);
|
| | | boolean repositoryMatch = entry.getStringValue(repositoryIndex)
|
| | |
| | | }
|
| | | };
|
| | | }
|
| | | TableRowSorter<SyndicatedEntryTableModel> sorter = new TableRowSorter<SyndicatedEntryTableModel>(
|
| | | TableRowSorter<FeedEntryTableModel> sorter = new TableRowSorter<FeedEntryTableModel>(
|
| | | tableModel);
|
| | | sorter.setRowFilter(containsFilter);
|
| | | table.setRowSorter(sorter);
|