modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java | 53 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 10 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java | 44 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java | 568 ++++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java | 8 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java | 5 modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html | 1 modules/enterprise/gui/coregui/src/main/webapp/css/search.css | 10 modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml | 18 12 files changed, 709 insertions(+), 28 deletions(-)
New commits: commit 3c1e2de750953df239f104d08a3f469e08ea0429 Author: Joseph Marques joseph@redhat.com Date: Thu Dec 16 02:12:23 2010 -0500
first stab at integrating new FlexSearchBar into TestSearchBarView
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java new file mode 100644 index 0000000..abc0958 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java @@ -0,0 +1,53 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2010 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.enterprise.gui.coregui.client.components.form; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.form.fields.CanvasItem; + +import org.rhq.core.domain.search.SearchSubsystem; +import org.rhq.enterprise.gui.coregui.client.search.FlexSearchBar; + +/** + * @author Joseph Marques + */ +public class SearchBarItem extends CanvasItem { + + private Canvas canvas = new Canvas(); + private FlexSearchBar searchBar; + + public SearchBarItem(SearchSubsystem subsystem) { + super("Search"); + + searchBar = new FlexSearchBar(); + searchBar.setSearchSubsystem(subsystem); + + searchBar.setHeight("30px"); + canvas.addChild(searchBar); + + setCanvas(canvas); + setHeight(30); + } + + @Override + public Canvas getCanvas() { + return canvas; + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java index 92548b5..a99ff5a 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java @@ -73,6 +73,7 @@ import com.smartgwt.client.widgets.toolbar.ToolStrip;
import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.RefreshableView; +import org.rhq.enterprise.gui.coregui.client.components.form.SearchBarItem; import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; import org.rhq.enterprise.gui.coregui.client.util.message.Message; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout; @@ -476,7 +477,7 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements }
public void refresh() { - if (null != this.listGrid) { + if (null != this.listGrid) { this.listGrid.invalidateCache(); this.listGrid.markForRedraw(); } @@ -681,9 +682,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements recordNames.add(name); }
- Message message = new Message(MSG - .widget_recordEditor_info_recordsDeletedConcise(String.valueOf(deletedRecords.length), - getDataTypeNamePlural()), MSG + Message message = new Message(MSG.widget_recordEditor_info_recordsDeletedConcise(String + .valueOf(deletedRecords.length), getDataTypeNamePlural()), MSG .widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecords.length), getDataTypeNamePlural(), recordNames.toString())); CoreGUI.getMessageCenter().notify(message); @@ -740,6 +740,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements nextFormItem.addKeyPressHandler(this); } else if (nextFormItem instanceof SelectItem) { nextFormItem.addChangedHandler(this); + } else if (nextFormItem instanceof SearchBarItem) { + nextFormItem.addKeyPressHandler(this); } } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java index b372b93..d58197d 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java @@ -6,7 +6,9 @@ import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceD import com.smartgwt.client.widgets.form.fields.TextItem;
import org.rhq.core.domain.resource.ResourceCategory; +import org.rhq.core.domain.search.SearchSubsystem; import org.rhq.enterprise.gui.coregui.client.components.form.EnumSelectItem; +import org.rhq.enterprise.gui.coregui.client.components.form.SearchBarItem; import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
public class TestSearchBarView extends ResourceSearchView { @@ -19,7 +21,8 @@ public class TestSearchBarView extends ResourceSearchView { final TextItem nameFilter = new TextItem(NAME.propertyName(), NAME.title()); final EnumSelectItem categoryFilter = new EnumSelectItem(CATEGORY.propertyName(), CATEGORY.title(), ResourceCategory.class); + final SearchBarItem searchFilter = new SearchBarItem(SearchSubsystem.RESOURCE);
- setFilterFormItems(nameFilter, categoryFilter); + setFilterFormItems(nameFilter, categoryFilter, searchFilter); } } diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html index de84de2..ad2c937 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html +++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html @@ -12,6 +12,7 @@ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="CoreGUI.css"> + <link rel="stylesheet" href="css/search.css">
<style type="text/css"> .menuButton, .menuButtonOver, .menuButtonDown, .menuButtonDisabled, .menuButtonSelected, .menuButtonSelectedDown, .menuButtonSelectedOver, .menuButtonSelectedDisabled { diff --git a/modules/enterprise/gui/coregui/src/main/webapp/css/search.css b/modules/enterprise/gui/coregui/src/main/webapp/css/search.css index 994d28a..cd75fbc 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/css/search.css +++ b/modules/enterprise/gui/coregui/src/main/webapp/css/search.css @@ -30,6 +30,7 @@ div { border-color: white; border-style: none; outline: none; + z-index: 999999; }
.patternNameLabel { @@ -41,6 +42,7 @@ div { border-style: none; font-size: 11px; width: 125px; + z-index: 999999; }
.patternNameField { @@ -52,6 +54,7 @@ div { border-style: dotted; border-width: thin; outline: none; + z-index: 999999; }
@@ -67,6 +70,7 @@ div { background-color: rgb(233, 230, 225); height: 34px; vertical-align: bottom; + z-index: 999999; }
.searchBarBackgroundContainer { @@ -83,12 +87,14 @@ div { padding: 0; width: 785px; height: 20px; + z-index: 999999; }
.searchBarComponentsContainer { width: 100%; margin: 0; padding: 0; + z-index: 999999; }
.searchBarComponentLHS { @@ -122,6 +128,7 @@ div { padding: 0; margin: 0; width: 785px; + z-index: 999999; }
.savedSearchesPanel-row { @@ -184,6 +191,8 @@ div { border-bottom-color: gray; border-right-color: gray; border-width: 1px 1px 1px 1px; + + z-index: 999999; }
.suggestData { @@ -221,6 +230,7 @@ div.rounded { } div.rounded2 { width: 125px; + z-index: 999999; background: rgb(192, 236, 207) url(/coregui/images/search/corner-upper-right-8.png) no-repeat top right; } div.rounded2 div {
commit 193d79cc72bd6ff3f63f9ef2aea818d31bef0cfb Author: Joseph Marques joseph@redhat.com Date: Thu Dec 16 01:45:07 2010 -0500
update SearchBar-related classes to use new AbstractSearchBar super
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java index fd5c55f..188cd89 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java @@ -27,6 +27,7 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Grid;
import org.rhq.core.domain.search.SavedSearch; +import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar; import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
/** @@ -35,7 +36,7 @@ import org.rhq.enterprise.gui.coregui.client.search.SearchBar; public class SavedSearchGrid extends Grid {
private PatternSelectionHandler patternSelectionHandler; - private SearchBar searchBar; + private AbstractSearchBar searchBar;
public interface PatternSelectionHandler { public void handleSelection(int rowIndex, int columnIndex, String patternName); @@ -60,7 +61,7 @@ public class SavedSearchGrid extends Grid { } }
- public SavedSearchGrid(SearchBar searchBar) { + public SavedSearchGrid(AbstractSearchBar searchBar) { super(0, 2); // assume no rows to start, but we'll always have 2 columns
setRowFormatter(new SavedSearchRowFormatter()); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java index 21a4f5f..b6ec717 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java @@ -33,7 +33,7 @@ import org.rhq.core.domain.search.SavedSearch; import org.rhq.enterprise.gui.coregui.client.UserSessionManager; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.gwt.SearchGWTServiceAsync; -import org.rhq.enterprise.gui.coregui.client.search.SearchBar; +import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar;
/** * @author Joseph Marques @@ -43,9 +43,9 @@ public class SavedSearchManager { private final SearchGWTServiceAsync searchService = GWTServiceLookup.getSearchService();
private LinkedHashMap<String, SavedSearch> savedSearches = new LinkedHashMap<String, SavedSearch>(); - private SearchBar searchBar; + private AbstractSearchBar searchBar;
- public SavedSearchManager(SearchBar searchBar) { + public SavedSearchManager(AbstractSearchBar searchBar) { this.searchBar = searchBar; load(); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java index fd3ecc8..f2dab2f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java @@ -64,12 +64,12 @@ import org.rhq.core.domain.search.SearchSuggestion; import org.rhq.core.domain.search.SearchSuggestion.Kind; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.gwt.SearchGWTServiceAsync; -import org.rhq.enterprise.gui.coregui.client.search.SearchBar; +import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar;
public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocusHandlers, HasValue<String>, HasSelectionHandlers<Suggestion> {
- private final SearchBar searchBar; + private final AbstractSearchBar searchBar; private final SearchSuggestOracle oracle;
private int limit = 20; @@ -86,7 +86,7 @@ public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocus private final String STYLE_NAME_TEXT_BOX = "patternField"; private final String STYLE_NAME_POPUP_PANEL = "suggestPanel";
- public SuggestTextBox_v3(SearchBar searchBar, TextBoxBase box) { + public SuggestTextBox_v3(AbstractSearchBar searchBar, TextBoxBase box) { super();
this.searchBar = searchBar; @@ -700,7 +700,7 @@ public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocus SearchSuggestion searchSuggestion = extraSearchSuggestion(suggestion); String currentText = getText().toLowerCase();
- if (searchBar.welcomeMessage.equals(currentText)) { + if (searchBar.getWelcomeMessage().equals(currentText)) { setValue("", true); return; }
commit 1b8b6ec5876fcc1d1b86b2ea29918c9777e60eb8 Author: Joseph Marques joseph@redhat.com Date: Thu Dec 16 01:43:31 2010 -0500
abstract class for SearchBar, so two impls can be supported in parallel
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java new file mode 100644 index 0000000..ac4a874 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java @@ -0,0 +1,44 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2010 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.enterprise.gui.coregui.client.search; + +import com.google.gwt.user.client.ui.Composite; + +import org.rhq.core.domain.search.SearchSubsystem; +import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchManager; + +/** + * Abstract class for SearchBar, so that a separate implementation can be written alongside the original. + * + * @author Joseph Marques + */ +public abstract class AbstractSearchBar extends Composite { + + public abstract SearchSubsystem getSearchSubsystem(); + + public abstract String getWelcomeMessage(); + + public abstract String getSelectedTab(); + + public abstract void activateSavedSearch(String savedSearchName); + + public abstract void onSavedSearchManagerLoaded(); + + public abstract SavedSearchManager getSavedSearchManager(); +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java new file mode 100644 index 0000000..172bd13 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java @@ -0,0 +1,568 @@ +/* + * RHQ Management Platform + * Copyright (C) 2010 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.enterprise.gui.coregui.client.search; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwt.event.dom.client.KeyPressHandler; +import com.google.gwt.event.dom.client.MouseOutEvent; +import com.google.gwt.event.dom.client.MouseOutHandler; +import com.google.gwt.event.dom.client.MouseOverEvent; +import com.google.gwt.event.dom.client.MouseOverHandler; +import com.google.gwt.event.logical.shared.CloseEvent; +import com.google.gwt.event.logical.shared.CloseHandler; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Event.NativePreviewEvent; +import com.google.gwt.user.client.Event.NativePreviewHandler; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.TextBox; + +import org.rhq.core.domain.search.SavedSearch; +import org.rhq.core.domain.search.SearchSubsystem; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.Messages; +import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchGrid; +import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchManager; +import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchGrid.PatternSelectionHandler; +import org.rhq.enterprise.gui.coregui.client.search.suggest.SuggestTextBox_v3; + +/** + * @author Joseph Marques + */ +public class FlexSearchBar extends AbstractSearchBar { + + private static final Messages MSG = CoreGUI.getMessages(); + + public String welcomeMessage; + + public static final String DEFAULT_PATTERN_NAME = MSG.view_searchBar_defaultPattern(); + + private static final String IMAGE_DIR = "/coregui/images/search/"; + + private static final String STAR_OFF_URL = IMAGE_DIR + "star1.png"; + private static final String STAR_ACTIVE_URL = IMAGE_DIR + "star2.png"; + private static final String STAR_ON_URL = IMAGE_DIR + "star3.png"; + + private static final String ARROW_WHITE_URL = IMAGE_DIR + "menu_arrow.png"; + private static final String ARROW_GRAY_URL = IMAGE_DIR + "menu_arrow_down.png"; + + public static final String TRASH = IMAGE_DIR + "trash.png"; + + private final TextBox patternField = new TextBox(); + private final SuggestTextBox_v3 autoCompletePatternField = new SuggestTextBox_v3(this, patternField); + private final TextBox patternNameField = new TextBox(); + private final Label patternNameLabel = new Label(); + + private final Image starImage = new Image(STAR_OFF_URL); + private final Image arrowImage = new Image(ARROW_WHITE_URL); + + private final PopupPanel savedSearchesPanel = new PopupPanel(true); + private final SavedSearchGrid savedSearchesGrid = new SavedSearchGrid(this); + + private String currentSearch = ""; + private long lastNameFieldBlurTime = 0; + + private final SavedSearchManager savedSearchManager; + private SearchSubsystem searchSubsystem; + private String defaultSearchText; + private String defaultSavedSearchPatternId; + + private Element searchButton; + + public void setupButton() { + searchButton = DOM.createButton(); + Event.addNativePreviewHandler(new NativePreviewHandler() { + public void onPreviewNativeEvent(NativePreviewEvent event) { + if (event.getNativeEvent() != null && event.getNativeEvent().getEventTarget() != null) { + + if (event.getNativeEvent().getEventTarget().equals(searchButton) + && event.getTypeInt() == Event.ONMOUSEDOWN) { + prepareSearchExecution(); + } + } + } + }); + } + + HorizontalPanel sbc; + HorizontalPanel sbc_sbbgc; + HorizontalPanel sbc_sbbgc_sbcc; + HorizontalPanel sbc_sbbgc_sbcc_sbclhs_pfc; + HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_aic; + HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_sic; + HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_pnfc; + HorizontalPanel sbc_sbbgc_sbcc_sbcrhs; + HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_pnlc; + HorizontalPanel sbc_sbbc; + HorizontalPanel sbc_pfsc; + HorizontalPanel sbc_ssc; + + public FlexSearchBar() { + Log.info("Loading SearchBar..."); + + // TODO: load default saved search pattern, if used has selected one + // populate default search text + // ensure that search subsystem is selected, probably want to force it to be a ctor argument + + sbc = createHPanel(null, "searchBarContainer", null); + sbc_sbbgc = createHPanel(sbc, "searchBarBackgroundContainer", null); + sbc_sbbgc_sbcc = createHPanel(sbc_sbbgc, "searchBarComponentsContainer", null); + sbc_sbbgc_sbcc_sbclhs_pfc = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentLHS", "patternFieldContainer"); + sbc_sbbgc_sbcc_sbcrhs_aic = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "arrowImageContainer"); + sbc_sbbgc_sbcc_sbcrhs_sic = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "starImageContainer"); + sbc_sbbgc_sbcc_sbcrhs_pnfc = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "starImageContainer"); + sbc_sbbgc_sbcc_sbcrhs = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", null); + sbc_sbbgc_sbcc_sbcrhs_pnlc = createHPanel(sbc_sbbgc_sbcc_sbcrhs, "rounded", "patternNameLabelContainer"); + sbc_sbbc = createHPanel(sbc, "searchBarButtonContainer", "searchButtonContainer"); + sbc_pfsc = createHPanel(sbc, null, "patternFieldSuggestionsContainer"); + sbc_ssc = createHPanel(sbc, null, "savedSearchesContainer"); + initWidget(sbc); + + savedSearchManager = new SavedSearchManager(this); + } + + private Element createDiv(Element parentDiv, String className, String id) { + Element div = DOM.createDiv(); + if (parentDiv != null) { + parentDiv.appendChild(div); + } + if (className != null) { + div.addClassName(className); + } + if (id != null) { + div.setId(id); + } + return div; + } + + private HorizontalPanel createHPanel(Panel parent, String className, String id) { + HorizontalPanel panel = new HorizontalPanel(); + if (parent != null) { + parent.add(panel); + } + if (className != null) { + panel.setStyleName(className); + } + if (id != null) { + panel.getElement().setId(id); + } + return panel; + } + + public void onSavedSearchManagerLoaded() { + /* + RootPanel.get("patternFieldContainer").add(autoCompletePatternField); + RootPanel.get("patternNameFieldContainer").add(patternNameField); + RootPanel.get("patternNameLabelContainer").add(patternNameLabel); + RootPanel.get("starImageContainer").add(starImage); + RootPanel.get("arrowImageContainer").add(arrowImage); + RootPanel.get("savedSearchesContainer").add(savedSearchesPanel); + */ + + sbc_sbbgc_sbcc_sbclhs_pfc.add(autoCompletePatternField); + sbc_sbbgc_sbcc_sbcrhs_pnfc.add(patternNameField); + sbc_sbbgc_sbcc_sbcrhs_pnlc.add(patternNameLabel); + sbc_sbbgc_sbcc_sbcrhs_sic.add(starImage); + sbc_sbbgc_sbcc_sbcrhs_aic.add(arrowImage); + sbc_ssc.add(savedSearchesPanel); + + setupAutoCompletingPatternField(); + setupPatternNameField(); + setupPatternNameLabel(); + setupStarImage(); + setupArrowImage(); + setupSavedSearches(); + + // + if (defaultSearchText != null) { + this.autoCompletePatternField.setText(defaultSearchText); + click(searchButton); // execute the search with this default search expression + } else if (defaultSavedSearchPatternId != null) { + try { + Integer savedSearchId = Integer.valueOf(defaultSavedSearchPatternId); + activateSavedSearch(savedSearchId); + } catch (Exception e) { + this.autoCompletePatternField.setText(MSG.view_searchBar_error_selectSavedSearch()); + click(searchButton); // execute the search, which will help to further highlight the error + } + } + + // presume the enclosing page logic loads results without a button click + } + + public static native String getUserAgent() + /*-{ + return navigator.userAgent.toLowerCase(); + }-*/; + + public SavedSearchManager getSavedSearchManager() { + return savedSearchManager; + } + + public void setSearchSubsystem(SearchSubsystem searchSubsystem) { + this.searchSubsystem = searchSubsystem; + + this.welcomeMessage = MSG.view_searchBar_welcomeMessage(this.searchSubsystem.getName()); + + this.autoCompletePatternField.setText(welcomeMessage); + } + + public SearchSubsystem getSearchSubsystem() { + return searchSubsystem; + } + + public void setDefaultSearchText(String defaultSearchText) { + if (defaultSearchText == null || defaultSearchText.trim().equals("")) { + return; // do nothing + } + + this.defaultSearchText = defaultSearchText; + } + + public String getDefaultSearchText() { + return defaultSearchText; + } + + public void setDefaultSavedSearchPatternId(String defaultSavedSearchPatternId) { + if (defaultSavedSearchPatternId == null || defaultSavedSearchPatternId.trim().equals("")) { + return; // do nothing + } + + this.defaultSavedSearchPatternId = defaultSavedSearchPatternId; + } + + public String getDefaultSavedSearchPatternId() { + return defaultSavedSearchPatternId; + } + + public String getWelcomeMessage() { + return welcomeMessage; + } + + public void prepareSearchExecution() { + String searchTerms = autoCompletePatternField.getText().toLowerCase().trim(); + if (searchTerms.equals(welcomeMessage)) { + autoCompletePatternField.setText(""); + } + } + + private void setupAutoCompletingPatternField() { + autoCompletePatternField.getElement().setId("patternField"); + autoCompletePatternField.setStyleName("patternField"); + + AutoCompletePatternFieldEventHandler handler = new AutoCompletePatternFieldEventHandler(); + autoCompletePatternField.getTextBox().addFocusHandler(handler); + autoCompletePatternField.getTextBox().addBlurHandler(handler); + autoCompletePatternField.addKeyPressHandler(handler); + } + + private void setupPatternNameField() { + patternNameField.setStyleName("patternNameField"); + patternNameField.setVisible(false); + + PatternNameFieldEventHandler handler = new PatternNameFieldEventHandler(); + patternNameField.addKeyPressHandler(handler); + patternNameField.addClickHandler(handler); + patternNameField.addBlurHandler(handler); + } + + private void setupPatternNameLabel() { + patternNameLabel.setStyleName("patternNameLabel"); + patternNameLabel.setVisible(false); + + PatternNameLabelEventHandler handler = new PatternNameLabelEventHandler(); + patternNameLabel.addClickHandler(handler); + } + + private void setupStarImage() { + StarImageEventHandler handler = new StarImageEventHandler(); + starImage.addClickHandler(handler); + starImage.addMouseOverHandler(handler); + starImage.addMouseOutHandler(handler); + } + + private void setupArrowImage() { + ArrowImageEventHandler handler = new ArrowImageEventHandler(); + arrowImage.addClickHandler(handler); + } + + private void setupSavedSearches() { + savedSearchesPanel.add(savedSearchesGrid); + savedSearchesPanel.setStyleName("savedSearchesPanel"); + savedSearchesGrid.addStyleName("savedSearchesPanel"); + + // panel position will be re-calculated on down-arrow click + savedSearchesPanel.show(); + savedSearchesPanel.hide(); + + SavedSearchesEventHandler handler = new SavedSearchesEventHandler(); + savedSearchesPanel.addCloseHandler(handler); + savedSearchesGrid.setPatternSelectionHandler(handler); + } + + private void turnNameFieldIntoLabel() { + String name = patternNameField.getText(); + + if (name.equalsIgnoreCase(DEFAULT_PATTERN_NAME)) { + name = ""; + } + + arrowImage.setVisible(true); + patternNameField.setVisible(false); + + if (name.equals("")) { + savedSearchManager.removePatternByName(currentSearch); + starImage.setUrl(STAR_OFF_URL); + } else { + if (currentSearch.equals("")) { + String pattern = autoCompletePatternField.getText(); + savedSearchManager.updatePatternByName(name, pattern); // create case + } else { + savedSearchManager.renamePattern(currentSearch, name); + } + //savedSearchManager.updatePatternByName(name, pattern); + patternNameLabel.setText(elipse(name)); + patternNameLabel.setVisible(true); + starImage.setUrl(STAR_ON_URL); + } + currentSearch = name; + } + + private void turnNameLabelIntoField() { + String name = currentSearch; + patternNameField.setText(name); + patternNameField.setVisible(true); + patternNameLabel.setVisible(false); + patternNameField.setFocus(true); + } + + private String elipse(String data) { + if (data.length() > 14) { + return data.substring(0, 14) + "..."; + } + return data; + } + + /* + * Event Handlers + */ + class AutoCompletePatternFieldEventHandler implements KeyPressHandler, FocusHandler, BlurHandler { + public void onKeyPress(KeyPressEvent event) { + // hide pattern field/label, turn off star + if (event.getCharCode() == KeyCodes.KEY_ENTER) { + return; + } + + patternNameLabel.setText(""); + patternNameLabel.setVisible(false); + patternNameField.setValue("", true); + patternNameField.setVisible(false); + currentSearch = ""; + starImage.setUrl(STAR_OFF_URL); + + if (event.getCharCode() == KeyCodes.KEY_ESCAPE) { + autoCompletePatternField.hideSuggestionList(); + event.preventDefault(); + event.stopPropagation(); + } + } + + public void onFocus(FocusEvent event) { + // clear default search text if necessary + if (autoCompletePatternField.getText().equals(welcomeMessage)) { + autoCompletePatternField.setValue("", true); + } + autoCompletePatternField.showSuggestionList(); + savedSearchesPanel.hide(); + } + + public void onBlur(BlurEvent event) { + if (autoCompletePatternField.getText().equals("")) { + autoCompletePatternField.setValue(welcomeMessage, true); + } + savedSearchesPanel.hide(); + } + } + + class PatternNameFieldEventHandler implements KeyPressHandler, ClickHandler, BlurHandler { + public void onKeyPress(KeyPressEvent event) { + if (event.getCharCode() == KeyCodes.KEY_ENTER) { + Log.debug("key press pattern name field"); + turnNameFieldIntoLabel(); + } + } + + public void onClick(ClickEvent event) { + if (patternNameField.getText().equals(DEFAULT_PATTERN_NAME)) { + patternNameField.setValue("", false); + } + } + + public void onBlur(BlurEvent event) { + lastNameFieldBlurTime = System.currentTimeMillis(); + turnNameFieldIntoLabel(); + } + } + + class PatternNameLabelEventHandler implements ClickHandler { + public void onClick(ClickEvent event) { + turnNameLabelIntoField(); + } + } + + class StarImageEventHandler implements ClickHandler, MouseOverHandler, MouseOutHandler { + public void onClick(ClickEvent event) { + long diff = System.currentTimeMillis() - lastNameFieldBlurTime; + if (Math.abs(diff) < 750) { + /* + * This event propagation is annoying. If the threshold is set too low, then both + * the name field blur event and this star image click event fire...but the blur + * event fires first, which turns the star white. Then a click on a white star + * triggers edit mode, re-enabling the name field. However, setting the threshold + * too high will prevent the click event from being handled when the user naturally + * wants to click on the star in rapid succession within the threshold time frame. + * It is hoped that 750ms will strike a nice balance, and that most users will never + * experienced any oddities from this trade-off. + */ + return; + } + + if (starImage.getUrl().endsWith(STAR_ACTIVE_URL)) { + patternNameField.setText(DEFAULT_PATTERN_NAME); + patternNameField.setVisible(true); + patternNameField.selectAll(); + patternNameField.setFocus(true); + patternNameLabel.setVisible(false); + } else if (starImage.getUrl().endsWith(STAR_ON_URL)) { + starImage.setUrl(STAR_ACTIVE_URL); + patternNameField.setVisible(false); + patternNameLabel.setVisible(false); + savedSearchManager.removePatternByName(currentSearch); + } + } + + public void onMouseOver(MouseOverEvent event) { + if (starImage.getUrl().endsWith(STAR_OFF_URL)) { + starImage.setUrl(STAR_ACTIVE_URL); + + } + } + + public void onMouseOut(MouseOutEvent event) { + if (starImage.getUrl().endsWith(STAR_ACTIVE_URL) && !patternNameField.isVisible()) { + starImage.setUrl(STAR_OFF_URL); + } + } + } + + class ArrowImageEventHandler implements ClickHandler { + public void onClick(ClickEvent event) { + savedSearchesGrid.updateModel(); + int left = autoCompletePatternField.getAbsoluteLeft(); + int top = autoCompletePatternField.getAbsoluteTop() + autoCompletePatternField.getOffsetHeight(); + savedSearchesPanel.setPopupPosition(left, top + 5); + savedSearchesPanel.show(); + arrowImage.setUrl(ARROW_GRAY_URL); + } + } + + class SavedSearchesEventHandler implements CloseHandler<PopupPanel>, PatternSelectionHandler { + public void onClose(CloseEvent<PopupPanel> event) { + arrowImage.setUrl(ARROW_WHITE_URL); + } + + public void handleSelection(int rowIndex, int columnIndex, String patternName) { + Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + "," + patternName + + ")"); + if (columnIndex == 1) { + savedSearchManager.removePatternByName(patternName); + + if (currentSearch.equals(patternName)) { + currentSearch = ""; + patternNameField.setValue("", true); + patternNameField.setVisible(false); + patternNameLabel.setText(""); + patternNameLabel.setVisible(false); + autoCompletePatternField.setFocus(true); + starImage.setUrl(STAR_OFF_URL); + savedSearchesPanel.hide(); + } + + if (savedSearchManager.getSavedSearchCount() == 0) { + savedSearchesPanel.hide(); + } + + savedSearchesGrid.removeRow(rowIndex); + } else { + activateSavedSearch(patternName); // activating the saved search also clicks the button + } + } + } + + private static native void click(Element button) + /*-{ + button.click(); + }-*/; + + public void activateSavedSearch(Integer savedSearchId) { + SavedSearch savedSearch = savedSearchManager.getSavedSearchById(savedSearchId); + if (savedSearch == null) { + Log.debug("activateSavedSearch: no known saved search with id '" + savedSearchId + "'"); + return; // no saved search existing with the specified id + } + activateSavedSearch(savedSearch); + } + + public void activateSavedSearch(String savedSearchName) { + SavedSearch savedSearch = savedSearchManager.getSavedSearchByName(savedSearchName); + if (savedSearch == null) { + Log.debug("activateSavedSearch: no known saved search with name '" + savedSearchName + "'"); + return; // no saved search existing with the specified name + } + activateSavedSearch(savedSearch); + } + + public void activateSavedSearch(SavedSearch savedSearch) { + currentSearch = ""; + autoCompletePatternField.setValue(savedSearch.getPattern(), true); + patternNameField.setValue(savedSearch.getName(), true); + Log.debug("search results change: [" + savedSearch.getName() + "," + savedSearch.getPattern() + "]"); + turnNameFieldIntoLabel(); + savedSearchesPanel.hide(); + click(searchButton); + } + + public String getSelectedTab() { + return null; + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java index 7d330d1..8be4f47 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java @@ -43,7 +43,6 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootPanel; -import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextBox;
import org.rhq.core.domain.search.SavedSearch; @@ -58,7 +57,7 @@ import org.rhq.enterprise.gui.coregui.client.search.suggest.SuggestTextBox_v3; /** * @author Joseph Marques */ -public class SearchBar extends SimplePanel { +public class SearchBar extends AbstractSearchBar {
private static final Messages MSG = CoreGUI.getMessages();
@@ -118,7 +117,7 @@ public class SearchBar extends SimplePanel { if (event.getNativeEvent() != null && event.getNativeEvent().getEventTarget() != null) {
if (event.getNativeEvent().getEventTarget().equals(searchButton) - && event.getTypeInt() == Event.ONMOUSEDOWN) { + && event.getTypeInt() == Event.ONMOUSEDOWN) { prepareSearchExecution(); } } @@ -473,8 +472,8 @@ public class SearchBar extends SimplePanel { }
public void handleSelection(int rowIndex, int columnIndex, String patternName) { - Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + "," - + patternName + ")"); + Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + "," + patternName + + ")"); if (columnIndex == 1) { savedSearchManager.removePatternByName(patternName);
commit 7a4c71230136a3dc9bba3d367f0079f5f34228c8 Author: Joseph Marques joseph@redhat.com Date: Thu Dec 16 01:33:31 2010 -0500
fix indentation
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml index 99bf2d1..6046ee3 100644 --- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml +++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml @@ -18,15 +18,15 @@ subtab="#{subtab}" id="searchBar"> <div class="searchBarBackgroundContainer"> - <div class="searchBarComponentsContainer"> - <div class="searchBarComponentLHS" id="patternFieldContainer"></div> - - <div class="searchBarComponentRHS" id="arrowImageContainer"></div> - <div class="searchBarComponentRHS" id="starImageContainer"></div> - <div class="searchBarComponentRHS" id="patternNameFieldContainer"></div> - <div class="searchBarComponentRHS"> - <div id="patternNameLabelContainer" class="rounded"></div> - </div> + <div class="searchBarComponentsContainer"> + <div class="searchBarComponentLHS" id="patternFieldContainer"></div> + + <div class="searchBarComponentRHS" id="arrowImageContainer"></div> + <div class="searchBarComponentRHS" id="starImageContainer"></div> + <div class="searchBarComponentRHS" id="patternNameFieldContainer"></div> + <div class="searchBarComponentRHS"> + <div id="patternNameLabelContainer" class="rounded"></div> + </div> </div> </div> <div class="searchBarButtonContainer" id="searchButtonContainer"></div>