/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2014 University of Dundee. All rights reserved.
*
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.dataBrowser.util;
import java.awt.Rectangle;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.openmicroscopy.shoola.agents.dataBrowser.view.QuickSearch;
import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent;
import org.openmicroscopy.shoola.agents.util.tagging.util.TagCellRenderer;
import org.openmicroscopy.shoola.agents.util.tagging.util.TagItem;
import org.openmicroscopy.shoola.env.data.util.FilterContext;
import org.openmicroscopy.shoola.util.ui.HistoryDialog;
import org.openmicroscopy.shoola.util.ui.search.SearchObject;
import org.openmicroscopy.shoola.util.ui.search.SearchUtil;
import omero.gateway.model.DataObject;
import omero.gateway.model.TagAnnotationData;
/**
* Filtering the data displaying the browser.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* @since OME3.0
*/
public class QuickFiltering
extends QuickSearch
implements PropertyChangeListener
{
/** Bound property indicating to load the tags. */
public static final String TAG_LOADING_PROPERTY = "tagLoading";
/** Bound property indicating to filter the data. */
public static final String FILTER_DATA_PROPERTY = "filterData";
/** Bound property indicating to filter the data. */
public static final String FILTER_TAGS_PROPERTY = "filterTags";
/** Bound property indicating to display all nodes. */
public static final String DISPLAY_ALL_NODES_PROPERTY = "displayAllNodes";
/** The collection of tags if any. */
private Collection tags;
/** The dialog displaying the existing tags. */
private HistoryDialog tagsDialog;
/** Loads or displays the existing tags. */
private void handleTagInsert()
{
if (tags == null) {
firePropertyChange(TAG_LOADING_PROPERTY, Boolean.valueOf(false),
Boolean.valueOf(true));
return;
}
codeCompletion();
if (tagsDialog == null) return;
String name = getSearchValue();
List<String> l = SearchUtil.splitTerms(name,
SearchUtil.COMMA_SEPARATOR);
if (l.size() > 0) {
if (tagsDialog.setSelectedTextValue(l.get(l.size()-1).trim())) {
Rectangle r = getSelectionArea().getBounds();
tagsDialog.setFocusable(false);
tagsDialog.show(getSelectionArea(), 0, r.height);
//setFocusOnArea();
} else tagsDialog.setVisible(false);
}
}
/** Initializes the {@link HistoryDialog} used for code completion. */
private void codeCompletion()
{
if (tagsDialog != null) return;
Rectangle r = getSelectionArea().getBounds();
Object[] data = null;
if (tags != null && tags.size() > 0) {
data = new Object[tags.size()];
Iterator j = tags.iterator();
DataObject object;
TagItem item;
int i = 0;
while (j.hasNext()) {
object = (DataObject) j.next();
item = new TagItem(object);
data[i] = item;
i++;
}
long id = MetadataViewerAgent.getUserDetails().getId();
tagsDialog = new HistoryDialog(data, r.width);
tagsDialog.setListCellRenderer(new TagCellRenderer(id));
tagsDialog.addPropertyChangeListener(
HistoryDialog.SELECTION_PROPERTY, this);
}
}
/**
* Creates a new instance.
*
* @param text The default context.
* */
public QuickFiltering(String text)
{
setSingleSelection(true);
setDefaultSearchContext(text);
setSearchEnabled(false);
addPropertyChangeListener(this);
}
/**
* Sets the collection of existing tags.
*
* @param tags The value to set.
*/
public void setTags(Collection tags)
{
if (tags == null) return;
this.tags = tags;
}
/**
* Returns the collection of tags.
*
* @return See above.
*/
public Collection getTags() { return tags; }
/**
* Sets the selected tags.
*
* @param tags The tags to filter by.
*/
public void setSelectedTags(Collection tags)
{
clear();
if (tags == null || tags.size() == 0) {
firePropertyChange(DISPLAY_ALL_NODES_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
return;
}
List<String> list = new ArrayList<String>();
Iterator i = tags.iterator();
TagAnnotationData tag;
while (i.hasNext()) {
tag = (TagAnnotationData) i.next();
list.add(tag.getTagValue());
}
setSearchValue(list, false);
FilterContext context = new FilterContext();
List<String> l = SearchUtil.splitTerms(getSearchValue(),
SearchUtil.COMMA_SEPARATOR);
if (l != null && l.size() > 0) {
context.addAnnotationType(TagAnnotationData.class, l);
firePropertyChange(FILTER_TAGS_PROPERTY, null, context);
}
}
/**
* Overridden to load the tags if the {@link QuickSearch#TAGS} is selected.
* @see QuickSearch#handleTextInsert()
*/
protected void handleTextInsert()
{
SearchObject node = getSelectedNode();
if (node == null) return;
switch (node.getIndex()) {
case QuickSearch.TAGS:
handleTagInsert();
break;
}
}
/**
* Overridden to load the tags if the {@link QuickSearch#TAGS} is selected.
* @see QuickSearch#handleKeyEnter()
*/
protected void handleKeyEnter()
{
SearchObject node = getSelectedNode();
if (node == null) return;
switch (node.getIndex()) {
case QuickSearch.TAGS:
if (tagsDialog != null && tagsDialog.isVisible()) {
Object item = tagsDialog.getSelectedTextValue();
if (!(item instanceof TagItem)) return;
DataObject ho = ((TagItem) item).getDataObject();
if (ho instanceof TagAnnotationData) {
String v = ((TagAnnotationData) ho).getTagValue();
setSearchValue(v, true);
FilterContext context = new FilterContext();
List<String> l = SearchUtil.splitTerms(getSearchValue(),
SearchUtil.COMMA_SEPARATOR);
if (l != null && l.size() > 0) {
context.addAnnotationType(TagAnnotationData.class,
l);
firePropertyChange(FILTER_TAGS_PROPERTY, null,
context);
}
}
} else {
onNodeSelection();
}
break;
case QuickSearch.FULL_TEXT:
case QuickSearch.COMMENTS:
onNodeSelection();
}
}
/**
* Reacts to the property fired by the <code>SearchContextMenu</code>
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt)
{
super.propertyChange(evt);
String name = evt.getPropertyName();
if (HistoryDialog.SELECTION_PROPERTY.equals(name)) {
Object item = evt.getNewValue();
if (!(item instanceof TagItem)) return;
DataObject ho = ((TagItem) item).getDataObject();
if (ho instanceof TagAnnotationData) {
String v = ((TagAnnotationData) ho).getTagValue();
setSearchValue(v, true);
FilterContext context = new FilterContext();
List<String> l = SearchUtil.splitTerms(getSearchValue(),
SearchUtil.COMMA_SEPARATOR);
if (l != null && l.size() > 0) {
context.addAnnotationType(TagAnnotationData.class, l);
firePropertyChange(FILTER_TAGS_PROPERTY, null, context);
}
}
} else if (VK_UP_SEARCH_PROPERTY.equals(name)) {
if (tagsDialog != null && tagsDialog.isVisible())
tagsDialog.setSelectedIndex(false);
} else if (VK_DOWN_SEARCH_PROPERTY.equals(name)) {
if (tagsDialog != null && tagsDialog.isVisible())
tagsDialog.setSelectedIndex(true);
} else if (QUICK_SEARCH_PROPERTY.equals(name)) {
if (tagsDialog != null && tagsDialog.isVisible()) {
/*
Object item = tagsDialog.getSelectedTextValue();
if (!(item instanceof TagItem)) return;
DataObject ho = ((TagItem) item).getDataObject();
if (ho instanceof TagAnnotationData) {
String v = ((TagAnnotationData) ho).getTagValue();
setSearchValue(v, false);
FilterContext context = new FilterContext();
List<String> l = SearchUtil.splitTerms(getSearchValue(),
SearchUtil.COMMA_SEPARATOR);
if (l != null && l.size() > 0) {
context.addAnnotationType(TagAnnotationData.class, l);
firePropertyChange(FILTER_TAGS_PROPERTY, null, context);
}
}
*/
} else
firePropertyChange(FILTER_DATA_PROPERTY, evt.getOldValue(),
evt.getNewValue());
}
}
}