/* * RHQ Management Platform * Copyright (C) 2005-2012 Red Hat, Inc. * 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 version 2 of the License. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.searchbar; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.RecordClickEvent; import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.criteria.SavedSearchCriteria; import org.rhq.core.domain.search.SavedSearch; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.UserSessionManager; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.util.Log; import org.rhq.coregui.client.util.message.Message; /** * Search Strategy for the Favorite Saved Searches. * If you wish to save your searches for later use this search strategy * will facilitate favorite searches. * * @author Mike Thompson */ public class FavoritesSearchStrategy extends AbstractSearchStrategy { private boolean isSearchInProgress = false; public FavoritesSearchStrategy(EnhancedSearchBar searchBar) { super(searchBar); } @Override public String format(Object value, ListGridRecord record, int rowNum, int colNum) { String name = record.getAttribute(ATTR_NAME); Integer resultCount = record.getAttributeAsInt(ATTR_RESULT_COUNT); String pattern = record.getAttribute(ATTR_PATTERN); String resultAsString = (resultCount != null) ? "(" + String.valueOf(resultCount) + ")" : ""; final String styleStr = "font-family:arial;font-size:11px;white-space:nowrap;overflow:hidden;"; String formatString = "<table>" + "<tr><td ><span style='" + styleStr + "width:170px;color:green;float:left'>" + name + "</span></td>" + "<td align='right'><span style='" + styleStr + "width:50px;float:right;font-weight:bold'>" + resultAsString + "</span></td></tr>" + "<tr><td colSpan=2><span style='" + styleStr + "width:220px;float:left'>" + pattern + "</span></td></tr></table>"; return formatString; } /** * Executed when this field is clicked on. Note that if {@link * com.smartgwt.client.widgets.grid.ListGrid#addRecordClickHandler ListGrid.recordClick} is also defined, it will be fired * for fields that define a recordClick handler if the field-level handler returns true. Call {@link com.smartgwt.client.widgets.grid.events.RecordClickEvent#cancel()} from within {@link com.smartgwt.client.widgets.grid.events.RecordClickHandler#onRecordClick} to prevent the * grid-level handler from firing. * * @param event the event */ @Override public void onRecordClick(RecordClickEvent event) { searchBar.getSaveSearchTextItem().setValue(event.getRecord().getAttribute(ATTR_NAME)); searchBar.getSearchTextItem().setValue(event.getRecord().getAttribute(ATTR_PATTERN)); searchBar.getSearchTextItem().focusInItem(); } @Override public void onRecordDoubleClick(RecordDoubleClickEvent event) { final Record record = event.getRecord(); final String name = record.getAttribute(ATTR_NAME); SC.ask(MSG.view_searchBar_savedSearch_confirmDelete(name), new BooleanCallback() { public void execute(Boolean confirmed) { if (confirmed) { Integer id = record.getAttributeAsInt(ATTR_ID); GWTServiceLookup.getSearchService().deleteSavedSearch(id, new AsyncCallback<Void>() { @Override public void onSuccess(Void result) { Message message = new Message(MSG.view_searchBar_savedSearch_delete(name), Message.Severity.Info); CoreGUI.getMessageCenter().notify(message); populateSavedSearches(); } @Override public void onFailure(Throwable caught) { Message message = new Message(MSG.view_searchBar_savedSearch_failDelete(name), Message.Severity.Error); CoreGUI.getMessageCenter().notify(message); } }); } } }); } @Override public void searchKeyUpHandler(KeyUpEvent keyUpEvent) { // do nothing } @Override public void searchFocusHandler() { populateSavedSearches(); } private void populateSavedSearches() { // avoid concurrent searches if (isSearchInProgress) { return; } Log.debug("Search Saved Searches"); SavedSearchCriteria savedSearchCriteria = new SavedSearchCriteria(); Subject subject = UserSessionManager.getSessionSubject(); savedSearchCriteria.addFilterSubjectId(subject.getId()); savedSearchCriteria.setStrict(true); final long startTime = System.currentTimeMillis(); searchBar.getPickListGrid().setData(new ListGridRecord[] {}); isSearchInProgress = true; searchService.findSavedSearchesByCriteria(savedSearchCriteria, new AsyncCallback<List<SavedSearch>>() { @Override public void onFailure(Throwable caught) { isSearchInProgress = false; CoreGUI.getErrorHandler().handleError(MSG.view_searchBar_savedSearch_failFetch(), caught); } @Override public void onSuccess(List<SavedSearch> result) { try { long fetchTime = System.currentTimeMillis() - startTime; Log.debug(result.size() + " saved searches fetched in: " + fetchTime + "ms"); ListGrid searchBarPickListGrid = searchBar.getPickListGrid(); DataSource ds = searchBarPickListGrid.getDataSource(); if (null == ds) { ds = new DataSource(); ds.setClientOnly(true); DataSourceTextField valueField = new DataSourceTextField(ATTR_ID, "Id"); valueField.setPrimaryKey(true); ds.setFields(valueField); searchBarPickListGrid.setDataSource(ds); } else { ds.invalidateCache(); } for (SavedSearch savedSearch : result) { Log.debug("savedSearch: " + savedSearch.getName()); ListGridRecord record = new ListGridRecord(); record.setAttribute(ATTR_ID, savedSearch.getId()); record.setAttribute(ATTR_KIND, "Saved"); record.setAttribute(ATTR_NAME, savedSearch.getName()); record.setAttribute(ATTR_DESCRIPTION, savedSearch.getDescription()); record.setAttribute(ATTR_PATTERN, savedSearch.getPattern()); if (savedSearch.getResultCount() != null) record.setAttribute(ATTR_RESULT_COUNT, savedSearch.getResultCount()); ds.addData(record); } try { searchBarPickListGrid.setData(new ListGridRecord[] {}); searchBarPickListGrid.fetchData(); } catch (Exception e) { Log.debug("Caught exception on fetchData: " + e); } } finally { isSearchInProgress = false; } } }); } @Override public int getCellHeight() { return 35; } @Override public void searchReturnKeyHandler(KeyUpEvent keyUpEvent) { // do nothing } }