// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2007 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: FeedsInMultipleGuidesReport.java,v 1.6 2008/04/01 12:51:27 spyromus Exp $
//
package com.salas.bb.reports;
import com.salas.bb.domain.GuidesSet;
import com.salas.bb.domain.IFeed;
import com.salas.bb.domain.IGuide;
import com.salas.bb.reports.actions.DeleteFeed;
import com.salas.bb.search.ResultItemType;
import com.salas.bb.utils.i18n.Strings;
import com.salas.bb.utils.uif.BBFormBuilder;
import com.salas.bb.utils.uif.LinkLabel;
import com.salas.bb.utils.uif.UifUtilities;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
/**
* Reports feeds that are in multiple guides.
*/
class FeedsInMultipleGuidesReport extends AbstractTableReport
{
private List<IFeed> data;
/**
* Returns the name of the report.
*
* @return name.
*/
public String getReportName()
{
return Strings.message("report.feeds.in.multiple.guides");
}
/**
* Initializes data for the view.
*
* @param provider report data provider.
*/
protected void doInitializeData(IReportDataProvider provider)
{
// Find all feeds of a sort
data = new LinkedList<IFeed>();
GuidesSet set = provider.getGuidesSet();
List<IFeed> feeds = set.getFeeds();
for (IFeed feed : feeds)
{
if (feed.getParentGuides().length > 1) data.add(feed);
}
// Sort them
Collections.sort(data, new Comparator<IFeed>()
{
/**
* Compares two feeds by the number of parent guides they have.
*
* @param f1 feed 1.
* @param f2 feed 2.
*
* @return comparison result.
*/
public int compare(IFeed f1, IFeed f2)
{
return ((Integer)f2.getParentGuides().length).compareTo(f1.getParentGuides().length);
}
});
}
/**
* Creates a table for stats display.
*
* @param table table component to initialize.
* @param max maximum number of rows.
*
* @return table.
*/
protected JPanel createDataTable(JPanel table, int max)
{
BBFormBuilder builder = new BBFormBuilder("16px, 4dlu, 16px, 4dlu, 50dlu:grow, 2dlu, center:p", table);
builder.setDefaultDialogBorder();
// Output header
builder.append(UifUtilities.boldFont(new JLabel(Strings.message("report.feed"))), 5);
builder.append(UifUtilities.boldFont(new JLabel(Strings.message("report.guide"))));
// Output data
int i = 0;
for (IFeed feed : data)
{
if (i++ == max) break;
IGuide[] guides = feed.getParentGuides();
builder.append(new JLabel(ResultItemType.FEED.getIcon()));
builder.nextColumn(2);
builder.append(createFeedLabel(feed));
builder.append(new JLabel(Integer.toString(guides.length)));
builder.setLeadingColumnOffset(2);
for (IGuide guide : guides)
{
builder.append(new JLabel(ResultItemType.GUIDE.getIcon()));
builder.append(createGuideLabel(guide, feed), 1);
builder.nextColumn(2);
}
builder.setLeadingColumnOffset(0);
builder.appendUnrelatedComponentsGapRow(2);
}
return builder.getPanel();
}
/**
* Creates a guide label.
*
* @param guide guide.
* @param feed feed.
*
* @return label.
*/
private Component createGuideLabel(final IGuide guide, final IFeed feed)
{
LinkLabel label = LinkLabel.create(guide.getTitle(), new GuideClickAction(guide, guide.getID()));
label.addMouseListener(new GuidePopupAdapter(guide, -1)
{
@Override
protected Map<String, Action> getActions()
{
Map<String, Action> actions = super.getActions();
actions.remove(ACTION_DELETE);
actions.put(ACTION_DELETE, new DeleteFeed(feed, guide));
return actions;
}
});
return label;
}
}