/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** All rights reserved **
** **
** This program and the accompanying materials are made available under **
** the terms of the Eclipse Public License v1.0 which accompanies this **
** distribution, and is available at: **
** http://www.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.ui.internal.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.newsaction.CopyNewsAction;
import org.rssowl.core.internal.newsaction.LabelNewsAction;
import org.rssowl.core.internal.newsaction.MoveNewsAction;
import org.rssowl.core.persist.IBookMark;
import org.rssowl.core.persist.ICategory;
import org.rssowl.core.persist.IFilterAction;
import org.rssowl.core.persist.IFolderChild;
import org.rssowl.core.persist.IModelFactory;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.IPerson;
import org.rssowl.core.persist.ISearch;
import org.rssowl.core.persist.ISearchCondition;
import org.rssowl.core.persist.ISearchField;
import org.rssowl.core.persist.ISearchFilter;
import org.rssowl.core.persist.SearchSpecifier;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.dao.IBookMarkDAO;
import org.rssowl.core.persist.reference.FeedLinkReference;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.dialogs.NewsFilterDialog;
import org.rssowl.ui.internal.dialogs.NewsFiltersListDialog;
import org.rssowl.ui.internal.filter.DownloadAttachmentsNewsAction;
import org.rssowl.ui.internal.util.ModelUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* An action to create a {@link ISearchFilter} from a selected {@link INews} or
* {@link IFolderChild}.
*
* @author bpasero
*/
public class CreateFilterAction implements IObjectActionDelegate {
/** This Actions ID */
public static final String ID = "org.rssowl.ui.CreateFilterAction"; //$NON-NLS-1$
private IStructuredSelection fSelection;
private PresetAction fPresetAction = PresetAction.NONE;
/** A enum of actions to preset when opening the Filter Dialog */
public enum PresetAction {
/** No Preset Action */
NONE,
/** Automate Download */
DOWNLOAD,
/** Automate Label */
LABEL,
/** Automate Move */
MOVE,
/** Automate Copy */
COPY
}
/*
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart) {}
/**
* @param action one of the {@link PresetAction} to preset in the filter
* dialog.
*/
public void setPresetAction(PresetAction action) {
fPresetAction = action;
}
/*
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action) {
Shell shell = OwlUI.getActiveShell();
if (shell != null && !fSelection.isEmpty()) {
ISearch presetSearch = Owl.getModelFactory().createSearch(null);
fillSearchConditions(presetSearch);
presetSearch.setMatchAllConditions(true);
/* Preset with Action if Set */
List<IFilterAction> presetActions = null;
boolean matchAll = false;
switch (fPresetAction) {
case DOWNLOAD:
presetActions = Collections.singletonList(Owl.getModelFactory().createFilterAction(DownloadAttachmentsNewsAction.ID));
matchAll = true;
break;
case LABEL:
presetActions = Collections.singletonList(Owl.getModelFactory().createFilterAction(LabelNewsAction.ID));
break;
case MOVE:
presetActions = Collections.singletonList(Owl.getModelFactory().createFilterAction(MoveNewsAction.ID));
break;
case COPY:
presetActions = Collections.singletonList(Owl.getModelFactory().createFilterAction(CopyNewsAction.ID));
break;
}
/* Use preset Actions in Dialog */
NewsFilterDialog dialog;
if (presetActions != null && !presetActions.isEmpty())
dialog = new NewsFilterDialog(shell, presetSearch, presetActions, matchAll);
/* Preset with Normal Filter */
else
dialog = new NewsFilterDialog(shell, presetSearch);
Collection<ISearchFilter> existingFilters = DynamicDAO.loadAll(ISearchFilter.class);
if (existingFilters != null && !existingFilters.isEmpty())
dialog.setFilterPosition(existingFilters.size());
if (dialog.open() == IDialogConstants.OK_ID) {
NewsFiltersListDialog filterListDialog = NewsFiltersListDialog.getVisibleInstance();
if (filterListDialog == null) {
filterListDialog = new NewsFiltersListDialog(shell);
filterListDialog.setSelection(dialog.getFilter());
filterListDialog.open();
} else {
filterListDialog.refresh();
filterListDialog.setSelection(dialog.getFilter());
filterListDialog.getShell().forceActive();
if (filterListDialog.getShell().getMinimized())
filterListDialog.getShell().setMinimized(false);
}
}
}
}
private void fillSearchConditions(ISearch presetSearch) {
List<?> selection = fSelection.toList();
if (selection.get(0) instanceof INews)
fillSearchConditionsForNews(selection, presetSearch);
else if (selection.get(0) instanceof IFolderChild)
fillSearchConditionsForFolderChild(selection, presetSearch);
}
@SuppressWarnings("unchecked")
private void fillSearchConditionsForFolderChild(List<?> selection, ISearch presetSearch) {
ISearchField locationField = Owl.getModelFactory().createSearchField(INews.LOCATION, INews.class.getName());
Long[][] value = ModelUtils.toPrimitive((List<IFolderChild>) selection);
ISearchCondition condition = Owl.getModelFactory().createSearchCondition(locationField, SearchSpecifier.SCOPE, value);
presetSearch.addSearchCondition(condition);
}
private void fillSearchConditionsForNews(List<?> selection, ISearch presetSearch) {
INews news = (INews) selection.get(0);
IModelFactory factory = Owl.getModelFactory();
/* Location */
{
ISearchField locationField = factory.createSearchField(INews.LOCATION, INews.class.getName());
FeedLinkReference feedReference = news.getFeedReference();
Collection<IBookMark> bookmarks = DynamicDAO.getDAO(IBookMarkDAO.class).loadAll(feedReference);
Long[][] value = ModelUtils.toPrimitive(new ArrayList<IFolderChild>(bookmarks));
ISearchCondition condition = factory.createSearchCondition(locationField, SearchSpecifier.SCOPE, value);
presetSearch.addSearchCondition(condition);
}
/* Category and Author are not used for automated Download */
if (fPresetAction == PresetAction.DOWNLOAD)
return;
/* Category (only first one) */
List<ICategory> categories = news.getCategories();
if (!categories.isEmpty()) {
ICategory category = categories.get(0);
if (StringUtils.isSet(category.getName())) {
ISearchField categoryField = factory.createSearchField(INews.CATEGORIES, INews.class.getName());
ISearchCondition condition = factory.createSearchCondition(categoryField, SearchSpecifier.IS, category.getName());
presetSearch.addSearchCondition(condition);
}
}
/* Author */
IPerson author = news.getAuthor();
if (author != null) {
String value = author.getName();
if (!StringUtils.isSet(value) && author.getEmail() != null)
value = author.getEmail().toString();
if (StringUtils.isSet(value)) {
ISearchField authorField = factory.createSearchField(INews.AUTHOR, INews.class.getName());
ISearchCondition condition = factory.createSearchCondition(authorField, SearchSpecifier.CONTAINS_ALL, value);
presetSearch.addSearchCondition(condition);
}
}
}
/*
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection)
fSelection = (IStructuredSelection) selection;
}
}