modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java | 78 ++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java | 11 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java | 42 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 209 +++++----- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java | 10 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 35 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeDatasource.java | 43 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 119 ++--- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java | 51 ++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TreeUtility.java | 29 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java | 3 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableTabSet.java | 40 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java | 3 18 files changed, 453 insertions(+), 243 deletions(-)
New commits: commit d00a7dd10a914fc0b1359e9e4da04a802629b941 Author: Ian Springer ian.springer@redhat.com Date: Thu Sep 9 19:30:38 2010 -0400
fix various bugs in Resource tab navigation; fix bug that was causing Schedules subtabs to fail to render; start coding a debug utility for dumping the entire GWT widget tree to stdout; fix conditional rendering of certain subtabs
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml index f26acb7..aa2b040 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml @@ -41,7 +41,7 @@ <!-- <set-property name="user.agent" value="safari"/> -->
<!-- Firefox 3 --> - <!--<set-property name="user.agent" value="gecko1_8"/>--> + <set-property name="user.agent" value="gecko1_8"/>
<entry-point class='org.rhq.enterprise.gui.coregui.client.CoreGUI'/> diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java index 9b35895..12c624c 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java @@ -57,6 +57,7 @@ import org.rhq.enterprise.gui.coregui.client.menu.MenuBarView; import org.rhq.enterprise.gui.coregui.client.report.ReportTopView; import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView; import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler; +import org.rhq.enterprise.gui.coregui.client.util.WidgetUtility; import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter; import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
@@ -321,6 +322,10 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> { return userPreferences; }
+ public static void printWidgetTree() { + WidgetUtility.printWidgetTree(coreGUI.rootCanvas); + } + public static void setSessionSubject(Subject subject) { // TODO this breaks because of reattach rules, bizarrely even in queries. gonna switch out to non-subject include apis // Create a minimized session object for validation on requests diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java index 7aa6dff..b714a33 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java @@ -18,6 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.client.components;
+import com.smartgwt.client.Version; import com.smartgwt.client.types.Overflow; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.Button; @@ -44,7 +45,7 @@ public class AboutModalWindow extends Window { public AboutModalWindow() { setTitle(MESSAGES.about_title(PRODUCT_INFO.getFullName())); setWidth(300); - setHeight(255); + setHeight(290); setOverflow(Overflow.VISIBLE); setShowMinimizeButton(false); setIsModal(true); @@ -72,7 +73,9 @@ public class AboutModalWindow extends Window { "<span class="DisplayLabel">" + MESSAGES.about_version() + " " + PRODUCT_INFO.getVersion() + "</span><br/>\n" + "<span class="DisplayLabel">" + MESSAGES.about_buildNumber() + " " + PRODUCT_INFO.getBuildNumber() - + "</span>\n" + + + "</span><p/>\n" + + "<span class="DisplayLabel">SmartGWT version: " + Version.getVersion() + " (built " + Version.getBuildDate() + ")" + + "</span><br/>\n" + "<p><a href="http://jboss.org/%5C" title="JBoss " + MESSAGES.about_homepage() + "">\n" + " <img height="55" alt="" + MESSAGES.about_jbossByRedHat() + "" src="/images/jboss_logo.png">\n" + "</a></p>\n" + diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java index e6be4f8..1739a35 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java @@ -53,4 +53,8 @@ public class SubTab { this.canvas = canvas; }
+ @Override + public String toString() { + return "SubTab[title=" + this.title + ", locatorId=" + this.locatorId + "]"; + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java index 512540e..4b387eb 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java @@ -18,10 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.client.components.tab;
-import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Set; +import java.util.*;
import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerRegistration; @@ -33,6 +30,7 @@ import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.toolbar.ToolStrip;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableButton; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -40,16 +38,15 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; * @author Greg Hinkle */ public class SubTabLayout extends LocatableVLayout { - private ToolStrip buttonBar;
- private LinkedHashMap<String, SubTab> subtabs = new LinkedHashMap<String, SubTab>(); - private HashMap<String, Button> subTabButtons = new HashMap<String, Button>(); + private Map<String, SubTab> subtabs = new LinkedHashMap<String, SubTab>(); + private Map<String, Button> subTabButtons = new HashMap<String, Button>(); private Set<String> disabledSubTabs = new HashSet<String>();
- SubTab currentlyDisplayed; - String currentlySelected; - int currentIndex = 0; + private SubTab currentlyDisplayed; + private String currentlySelected; + private int currentIndex;
public SubTabLayout(String locatorId) { super(locatorId); @@ -128,10 +125,10 @@ public class SubTabLayout extends LocatableVLayout { selectTabByLocatorId(currentlySelected); }
- public void enableSubTab(String title) { - disabledSubTabs.remove(title); - if (subTabButtons.containsKey(title)) { - subTabButtons.get(title).enable(); + public void enableSubTab(String locatorId) { + disabledSubTabs.remove(locatorId); + if (subTabButtons.containsKey(locatorId)) { + subTabButtons.get(locatorId).enable(); markForRedraw(); } } @@ -172,14 +169,16 @@ public class SubTabLayout extends LocatableVLayout { Canvas canvas = subTab.getCanvas(); if (canvas != null) { if (hasMember(canvas)) { - canvas.show(); + if (!canvas.isVisible()) { + canvas.show(); + } } else { if (!canvas.isCreated()) { canvas.setOverflow(Overflow.SCROLL); } - addMember(canvas); - markForRedraw(); + addMember(canvas); } + markForRedraw(); currentlyDisplayed = subTab; } } @@ -205,22 +204,33 @@ public class SubTabLayout extends LocatableVLayout { return subtabs.get(currentlySelected).getTitle(); }
+ public SubTab getDefaultSubTab() { + return subtabs.values().iterator().next(); + } + public boolean selectTabByLocatorId(String locatorId) { boolean foundTab = false; - currentlySelected = locatorId; + this.currentlySelected = locatorId; int i = 0; - for (String sub : subtabs.keySet()) { - if (sub.equals(locatorId)) { - currentIndex = i; + for (String subtabLocatorId : this.subtabs.keySet()) { + if (subtabLocatorId.equals(locatorId)) { + SubTab subtab = this.subtabs.get(subtabLocatorId); + if (this.disabledSubTabs.contains(subtabLocatorId)) { + // Nice try - user tried to select a disabled tab, probably by going directly to a bookmark URL. + CoreGUI.getErrorHandler().handleError("Cannot select disabled subtab '" + subtab.getTitle() + "'."); + break; + } + this.currentIndex = i; foundTab = true; break; } i++; }
- if (isDrawn()) { - ((Button) buttonBar.getMember(currentIndex)).select(); - draw(subtabs.get(locatorId)); + if (foundTab && isDrawn()) { + Button button = (Button) this.buttonBar.getMember(this.currentIndex); + button.select(); + draw(this.subtabs.get(locatorId)); }
return foundTab; @@ -229,25 +239,35 @@ public class SubTabLayout extends LocatableVLayout { public boolean selectTab(String title) { boolean foundTab = false; int i = 0; - for (String sub : subtabs.keySet()) { - SubTab subtab = subtabs.get(sub); + for (String subtabLocatorId : this.subtabs.keySet()) { + SubTab subtab = this.subtabs.get(subtabLocatorId); if (subtab.getTitle().equals(title)) { + if (this.disabledSubTabs.contains(subtab.getLocatorId())) { + // Nice try - user tried to select a disabled tab, probably by going directly to a bookmark URL. + CoreGUI.getErrorHandler().handleError("Cannot select disabled subtab '" + title + "'."); + break; + } this.currentlySelected = subtab.getLocatorId(); - currentIndex = i; + this.currentIndex = i; foundTab = true; break; } i++; }
- if (isDrawn()) { - ((Button) buttonBar.getMember(currentIndex)).select(); + if (foundTab && isDrawn()) { + Button button = (Button) buttonBar.getMember(currentIndex); + button.select(); draw(subtabs.get(currentlySelected)); }
return foundTab; }
+ public SubTab getCurrentSubTab() { + return this.subtabs.get(this.currentlySelected); + } + // ------- Event support ------- // Done with a separate handler manager from parent class on purpose (compatibility issue)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java index c78db8a..845128f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java @@ -26,7 +26,6 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTab; * @author Greg Hinkle */ public class TwoLevelTab extends LocatableTab { - private SubTabLayout layout;
public TwoLevelTab(String locatorId, String title, String icon) { @@ -45,11 +44,11 @@ public class TwoLevelTab extends LocatableTab { } }
- public void setSubTabEnabled(String tab, boolean enabled) { + public void setSubTabEnabled(String locatorId, boolean enabled) { if (enabled) { - layout.enableSubTab(tab); + layout.enableSubTab(locatorId); } else { - layout.disableSubTab(tab); + layout.disableSubTab(locatorId); } }
@@ -62,4 +61,8 @@ public class TwoLevelTab extends LocatableTab { return layout; }
+ @Override + public String toString() { + return "TwoLevelTab[title=" + getTitle() + ", locatorId=" + getLocatorId() + "]"; + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java index de4a27c..7215baa 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java @@ -27,6 +27,8 @@ import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTabSet;
/** + * A tab set where each {@link TwoLevelTab tab} has one or more {@link SubTab subtab}s. + * * @author Greg Hinkle */ public class TwoLevelTabSet extends LocatableTabSet implements TabSelectedHandler, TwoLevelTabSelectedHandler { @@ -37,16 +39,27 @@ public class TwoLevelTabSet extends LocatableTabSet implements TabSelectedHandle
public void setTabs(TwoLevelTab... tabs) { super.setTabs(tabs); - for (TwoLevelTab tab : tabs) { - + for (TwoLevelTab tab : tabs) { tab.getLayout().addTwoLevelTabSelectedHandler(this); - updateTab(tab, tab.getPane()); }
addTabSelectedHandler(this); }
+ public TwoLevelTab[] getTabs() { + Tab[] tabs = super.getTabs(); + TwoLevelTab[] twoLevelTabs = new TwoLevelTab[tabs.length]; + for (int i = 0, tabsLength = tabs.length; i < tabsLength; i++) { + Tab tab = tabs[i]; + if (!(tab instanceof TwoLevelTab)) { + throw new IllegalStateException("TwoLevelTabSet contains a Tab that is not a TwoLevelTab."); + } + twoLevelTabs[i] = (TwoLevelTab) tab; + } + return twoLevelTabs; + } + // ------- Event support ------- // Done with a separate handler manager from parent class on purpose (compatibility issue)
@@ -57,9 +70,8 @@ public class TwoLevelTabSet extends LocatableTabSet implements TabSelectedHandle }
public void onTabSelected(TabSelectedEvent tabSelectedEvent) { - + System.out.println("TwoLevelTabSet.onTabSelected(): " + tabSelectedEvent.getTab().getTitle()); TwoLevelTab tab = (TwoLevelTab) getSelectedTab(); - TwoLevelTabSelectedEvent event = new TwoLevelTabSelectedEvent(tab.getTitle(), tab.getLayout().getCurrentTitle(), tabSelectedEvent.getTabNum(), tab.getLayout().getCurrentIndex(), tab .getLayout().getCurrentCanvas()); @@ -67,19 +79,19 @@ public class TwoLevelTabSet extends LocatableTabSet implements TabSelectedHandle }
public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) { + System.out.println("TwoLevelTabSet.onTwoLevelTabSelected(): " + tabSelectedEvent.getId() + "/" + + tabSelectedEvent.getSubTabId()); tabSelectedEvent.setTabNum(getSelectedTabNumber()); - tabSelectedEvent.setId(getSelectedTab().getTitle()); - + Tab tab = getSelectedTab(); + tabSelectedEvent.setId(tab.getTitle()); m.fireEvent(tabSelectedEvent); }
- public Tab getTabByTitle(String title) { - Tab[] tabs = getTabs(); - for (Tab tab : tabs) { - if (tab.getTitle().equals(title)) { - return tab; - } - } - return null; + public TwoLevelTab getTabByTitle(String title) { + return (TwoLevelTab) super.getTabByTitle(title); + } + + public TwoLevelTab getTabByLocatorId(String locatorId) { + return (TwoLevelTab) super.getTabByLocatorId(locatorId); } } 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 abae48f..f30ab10 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 @@ -53,6 +53,7 @@ import com.smartgwt.client.widgets.layout.LayoutSpacer; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.toolbar.ToolStrip;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton; @@ -208,136 +209,140 @@ public class Table extends LocatableHLayout {
@Override protected void onDraw() { - super.onDraw(); + try { + super.onDraw();
- for (Canvas child : contents.getMembers()) { - contents.removeChild(child); - } - - // Title - title = new HTMLFlow(); - setTableTitle(tableTitle); - - if (showHeader) { - titleLayout = new HLayout(); - titleLayout.setAutoHeight(); - titleLayout.setAlign(VerticalAlignment.BOTTOM); - } + for (Canvas child : contents.getMembers()) { + contents.removeChild(child); + }
- // Add components to the view - if (showHeader) { - contents.addMember(titleLayout, 0); - } + // Title + title = new HTMLFlow(); + setTableTitle(tableTitle);
- if (filterForm.hasContent()) { - contents.addMember(filterForm); - } + if (showHeader) { + titleLayout = new HLayout(); + titleLayout.setAutoHeight(); + titleLayout.setAlign(VerticalAlignment.BOTTOM); + }
- contents.addMember(listGrid); + // Add components to the view + if (showHeader) { + contents.addMember(titleLayout, 0); + }
- // Footer - footer = new ToolStrip(); - footer.setPadding(5); - footer.setWidth100(); - footer.setMembersMargin(15); - contents.addMember(footer); - - // The ListGrid has been created and configured - // Now give subclasses a chance to configure the table - configureTable(); - - tableInfo = new Label("Total: " + listGrid.getTotalRows()); - - // NOTE: It is essential that we wait to hide any excluded fields until after super.onDraw() is called, since - // super.onDraw() is what actually adds the fields to the ListGrid (based on what fields are defined in - // the underlying datasource). - if (this.excludedFieldNames != null) { - for (String excludedFieldName : excludedFieldNames) { - this.listGrid.hideField(excludedFieldName); + if (filterForm.hasContent()) { + contents.addMember(filterForm); } - }
- tableInfo.setWrap(false); + contents.addMember(listGrid);
- if (showHeader) { + // Footer + footer = new ToolStrip(); + footer.setPadding(5); + footer.setWidth100(); + footer.setMembersMargin(15); + contents.addMember(footer);
- for (String headerIcon : headerIcons) { - Img img = new Img(headerIcon, 24, 24); - img.setPadding(4); - titleLayout.addMember(img); - } + // The ListGrid has been created and configured + // Now give subclasses a chance to configure the table + configureTable();
- titleLayout.addMember(title); + tableInfo = new Label("Total: " + listGrid.getTotalRows());
- if (titleComponent != null) { - titleLayout.addMember(new LayoutSpacer()); - titleLayout.addMember(titleComponent); + // NOTE: It is essential that we wait to hide any excluded fields until after super.onDraw() is called, since + // super.onDraw() is what actually adds the fields to the ListGrid (based on what fields are defined in + // the underlying datasource). + if (this.excludedFieldNames != null) { + for (String excludedFieldName : excludedFieldNames) { + this.listGrid.hideField(excludedFieldName); + } }
- } + tableInfo.setWrap(false);
- if (showFooter) { + if (showHeader) {
- footer.removeMembers(footer.getMembers()); + for (String headerIcon : headerIcons) { + Img img = new Img(headerIcon, 24, 24); + img.setPadding(4); + titleLayout.addMember(img); + }
- for (final TableActionInfo tableAction : tableActions) { - IButton button = new LocatableIButton(tableAction.getLocatorId(), tableAction.getTitle()); - button.setDisabled(true); - button.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent clickEvent) { - if (tableAction.confirmMessage != null) { + titleLayout.addMember(title);
- String message = tableAction.confirmMessage.replaceAll("\#", String.valueOf(listGrid - .getSelection().length)); + if (titleComponent != null) { + titleLayout.addMember(new LayoutSpacer()); + titleLayout.addMember(titleComponent); + }
- SC.ask(message, new BooleanCallback() { - public void execute(Boolean confirmed) { - if (confirmed) { - tableAction.action.executeAction(listGrid.getSelection()); - } - } - }); - } else { - tableAction.action.executeAction(listGrid.getSelection()); - } - } - }); - tableAction.actionButton = button; - footer.addMember(button); }
- for (Canvas extraWidgetCanvas : extraWidgets) { - footer.addMember(extraWidgetCanvas); - } + if (showFooter) {
- footer.addMember(new LayoutSpacer()); + footer.removeMembers(footer.getMembers());
- IButton refreshButton = new LocatableIButton(extendLocatorId("Refresh"), "Refresh"); - refreshButton.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent clickEvent) { - listGrid.invalidateCache(); - } - }); - footer.addMember(refreshButton); + for (final TableActionInfo tableAction : tableActions) { + IButton button = new LocatableIButton(tableAction.getLocatorId(), tableAction.getTitle()); + button.setDisabled(true); + button.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + if (tableAction.confirmMessage != null) {
- footer.addMember(tableInfo); + String message = tableAction.confirmMessage.replaceAll("\#", String.valueOf(listGrid + .getSelection().length));
- // Manages enable/disable buttons for the grid - listGrid.addSelectionChangedHandler(new SelectionChangedHandler() { - public void onSelectionChanged(SelectionEvent selectionEvent) { - refreshTableInfo(); + SC.ask(message, new BooleanCallback() { + public void execute(Boolean confirmed) { + if (confirmed) { + tableAction.action.executeAction(listGrid.getSelection()); + } + } + }); + } else { + tableAction.action.executeAction(listGrid.getSelection()); + } + } + }); + tableAction.actionButton = button; + footer.addMember(button); } - });
- listGrid.addDataArrivedHandler(new DataArrivedHandler() { - public void onDataArrived(DataArrivedEvent dataArrivedEvent) { - refreshTableInfo(); - fieldSizes.clear(); + for (Canvas extraWidgetCanvas : extraWidgets) { + footer.addMember(extraWidgetCanvas); } - });
- // ensure buttons are initially set correctly - refreshTableInfo(); + footer.addMember(new LayoutSpacer()); + + IButton refreshButton = new LocatableIButton(extendLocatorId("Refresh"), "Refresh"); + refreshButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + listGrid.invalidateCache(); + } + }); + footer.addMember(refreshButton); + + footer.addMember(tableInfo); + + // Manages enable/disable buttons for the grid + listGrid.addSelectionChangedHandler(new SelectionChangedHandler() { + public void onSelectionChanged(SelectionEvent selectionEvent) { + refreshTableInfo(); + } + }); + + listGrid.addDataArrivedHandler(new DataArrivedHandler() { + public void onDataArrived(DataArrivedEvent dataArrivedEvent) { + refreshTableInfo(); + fieldSizes.clear(); + } + }); + + // Ensure buttons are initially set correctly. + refreshTableInfo(); + } + } catch (Exception e) { + CoreGUI.getErrorHandler().handleError("Failed to draw Table [" + this + "].", e); } }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java index 1cf02e7..78fe1d3 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java @@ -96,9 +96,13 @@ public class UpdateCollectionIntervalWidget extends LocatableHLayout implements
@Override public void refresh(ListGrid listGrid) { - int count = listGrid.getSelection().length; - Long interval = getInterval(); - this.setButton.setDisabled(count == 0 || interval == null); + if (isDrawn()) { + int count = listGrid.getSelection().length; + Long interval = getInterval(); + this.setButton.setDisabled(count == 0 || interval == null); + } else { + markForRedraw(); + } }
private Long getInterval() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java index 59997b4..7a2064f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java @@ -29,6 +29,8 @@ import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.criteria.ResourceGroupCriteria; +import org.rhq.core.domain.measurement.DataType; +import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.ResourceTypeFacet; import org.rhq.core.domain.resource.composite.ResourcePermission; @@ -242,7 +244,7 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar topTabSet.enableTab(inventoryTab);
// Inventory>Connection Settings subtab is only enabled for compat groups that define conn props. - inventoryTab.setSubTabEnabled("Connection Settings", groupCategory == GroupCategory.COMPATIBLE + inventoryTab.setSubTabEnabled(this.inventoryConn.getLocatorId(), groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION));
// Monitoring and Alerts tabs are always enabled for compatible groups and always disabled for mixed groups. @@ -276,8 +278,9 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar topTabSet.disableTab(eventsTab); }
- // only enable "Call Time" sub-tab for those that implement it - monitoringTab.setSubTabEnabled("Call Time", facets.contains(ResourceTypeFacet.CALL_TIME)); + // only enable "Call Time" and "Traits" subtabs for groups that implement them. + monitoringTab.setSubTabEnabled(monitorTraits.getLocatorId(), hasTraits(this.groupComposite)); + monitoringTab.setSubTabEnabled(monitorCallTime.getLocatorId(), facets.contains(ResourceTypeFacet.CALL_TIME)); }
public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) { @@ -300,7 +303,6 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar
viewPath.next();
- tabName = (!viewPath.isEnd()) ? viewPath.getCurrent().getPath() : null; // e.g. "Inventory" subTabName = (viewPath.viewsLeft() >= 1) ? viewPath.getNext().getPath() : null; // e.g. "Overview"
@@ -319,7 +321,6 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar public void loadSelectedGroup(int groupId, final ViewPath viewPath) { this.groupId = groupId;
- ResourceGroupCriteria criteria = new ResourceGroupCriteria(); criteria.addFilterId(groupId); criteria.addFilterVisible(null); @@ -349,7 +350,9 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar ResourceType groupType = group.getResourceType(); ResourceTypeRepository.Cache.getInstance().getResourceTypes( groupType.getId(), - EnumSet.of(ResourceTypeRepository.MetadataType.content, ResourceTypeRepository.MetadataType.operations, + EnumSet.of(ResourceTypeRepository.MetadataType.content, + ResourceTypeRepository.MetadataType.operations, + ResourceTypeRepository.MetadataType.measurements, ResourceTypeRepository.MetadataType.events, ResourceTypeRepository.MetadataType.resourceConfigurationDefinition), new ResourceTypeRepository.TypeLoadedCallback() { @@ -377,16 +380,16 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar if (tabName == null) { tabName = DEFAULT_TAB_NAME; } - TwoLevelTab tab = (TwoLevelTab) this.topTabSet.getTabByTitle(tabName); + TwoLevelTab tab = this.topTabSet.getTabByTitle(tabName); if (tab == null) { CoreGUI.getErrorHandler().handleError("Invalid tab name: " + tabName); // TODO: Should we fire a history event here to redirect to a valid bookmark? - tab = (TwoLevelTab) this.topTabSet.getTabByTitle(DEFAULT_TAB_NAME); + tab = this.topTabSet.getTabByTitle(DEFAULT_TAB_NAME); } this.topTabSet.selectTab(tab); if (subtabName != null) { if (!tab.getLayout().selectTab(subtabName)) { - CoreGUI.getErrorHandler().handleError("Invalid subtab name: " + subtabName); + CoreGUI.getErrorHandler().handleError("Invalid subtab name: " + subtabName); // TODO: Should we fire a history event here to redirect to a valid bookmark? return; } else { @@ -398,4 +401,18 @@ public class ResourceGroupDetailView extends LocatableVLayout implements Bookmar } }
+ + private static boolean hasTraits(ResourceGroupComposite groupComposite) { + ResourceType type = groupComposite.getResourceGroup().getResourceType(); + if (type != null) { + Set<MeasurementDefinition> metricDefs = type.getMetricDefinitions(); + for (MeasurementDefinition metricDef : metricDefs) { + if (metricDef.getDataType() == DataType.TRAIT) { + return true; + } + } + } + return false; + } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeDatasource.java index 51b48eb..76b7b76 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeDatasource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeDatasource.java @@ -261,11 +261,24 @@ public class ResourceGroupTreeDatasource extends DataSource { setAttribute("parentId", parentId); setAttribute("name", category.getDisplayName()); } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("CategoryTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } }
public static class TypeTreeNode extends TreeNode { - private TypeTreeNode(String parentId, String parentResourceId, String type) { setID(parentId + "_" + type); setParentID(parentId); @@ -276,10 +289,22 @@ public class ResourceGroupTreeDatasource extends DataSource { setAttribute("name", type); }
+ @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("TypeTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } }
public static class ResourceTreeNode extends TreeNode { - private Resource resource;
private ResourceTreeNode(Resource resource) { @@ -325,5 +350,19 @@ public class ResourceGroupTreeDatasource extends DataSource { public String getParentId() { return getAttribute("parentId"); } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("ResourceTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } } } \ No newline at end of file diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java index e43ccef..dc2b363 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java @@ -28,6 +28,8 @@ import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.criteria.ResourceCriteria; +import org.rhq.core.domain.measurement.DataType; +import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.ResourceTypeFacet; @@ -65,11 +67,9 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; * Right panel of the Resource view. * * @author Greg Hinkle + * @author Ian Springer */ public class ResourceDetailView extends LocatableVLayout implements BookmarkableView, TwoLevelTabSelectedHandler { - - private static final String DEFAULT_TAB_NAME = "Summary"; - private int resourceId;
private ResourceComposite resourceComposite; @@ -202,7 +202,7 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable final Resource resource = this.resourceComposite.getResource(); this.titleBar.setResource(resource);
- for (Tab top : topTabSet.getTabs()) { + for (Tab top : this.topTabSet.getTabs()) { ((TwoLevelTab) top).getLayout().destroyViews(); }
@@ -210,9 +210,6 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable this.summaryDashboard.setCanvas(new DashboardView(this.resourceComposite)); this.summaryTimeline.setCanvas(new FullHTMLPane("/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId())); - summaryTab.updateSubTab(this.summaryOverview); - summaryTab.updateSubTab(this.summaryDashboard); - summaryTab.updateSubTab(this.summaryTimeline);
this.monitorGraphs.setCanvas(new GraphListView(this.monitoringTab.extendLocatorId("GraphListView"), resource)); this.monitorTables.setCanvas(new FullHTMLPane("/rhq/common/monitor/tables-plain.xhtml?id=" + resource.getId())); @@ -222,17 +219,9 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable this.monitorSched.setCanvas(new SchedulesView(monitoringTab.extendLocatorId("SchedulesView"), resource.getId())); this.monitorCallTime.setCanvas(new FullHTMLPane("/rhq/resource/monitor/response-plain.xhtml?id=" + resource.getId())); - monitoringTab.updateSubTab(this.monitorGraphs); - monitoringTab.updateSubTab(this.monitorTables); - monitoringTab.updateSubTab(this.monitorTraits); - monitoringTab.updateSubTab(this.monitorAvail); - monitoringTab.updateSubTab(this.monitorSched); - monitoringTab.updateSubTab(this.monitorCallTime);
this.inventoryChildren.setCanvas(ResourceSearchView.getChildrenOf(resource.getId())); this.inventoryConn.setCanvas(new PluginConfigurationEditView(this.extendLocatorId("PluginConfig"), resource)); - inventoryTab.updateSubTab(this.inventoryChildren); - inventoryTab.updateSubTab(this.inventoryConn);
// comment out GWT-based operation history until... // 1) user can delete history if they possess the appropriate permissions @@ -244,33 +233,24 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable resourceComposite)); this.opSched.setCanvas(new FullHTMLPane("/rhq/resource/operation/resourceOperationSchedules-plain.xhtml?id=" + resource.getId())); - operationsTab.updateSubTab(this.opHistory); - operationsTab.updateSubTab(this.opSched);
// comment out GWT-based alert definitions/history views until... // 1) new workflow is implement for alert definition creation, with particular attention to interaction model for alert notifications // 2) user can delete/ack/purgeAll alerts if they possess the appropriate permissions // 3) user can enable/disable/delete alert definitions if they possess the appropriate permissions - // 4) user can search alert history by: date alert was fired, alert priority, or alert definition - //alertsTab.updateSubTab("History", new ResourceAlertHistoryView(resource.getId())); + // 4) user can search alert history by: date alert was fired, alert priority, or alert definition this.alertHistory.setCanvas(new FullHTMLPane("/rhq/resource/alert/listAlertHistory-plain.xhtml?id=" + resource.getId())); this.alertDef.setCanvas(new ResourceAlertDefinitionsView(alertsTab.extendLocatorId("Def"), resource)); this.alertDelete.setCanvas(new FullHTMLPane("/rhq/resource/alert/listAlertDefinitions-plain.xhtml?id=" + resource.getId())); - alertsTab.updateSubTab(this.alertHistory); - alertsTab.updateSubTab(this.alertDef); - alertsTab.updateSubTab(this.alertDelete);
this.configCurrent .setCanvas(new ResourceConfigurationEditView(this.extendLocatorId("ResourceConfig"), resource)); this.configHistory.setCanvas(ConfigurationHistoryView.getHistoryOf(configurationTab.extendLocatorId("Hist"), resource.getId())); - configurationTab.updateSubTab(this.configCurrent); - configurationTab.updateSubTab(this.configHistory);
this.eventHistory.setCanvas(EventCompositeHistoryView.get(resourceComposite)); - eventsTab.updateSubTab(this.eventHistory);
this.contentDeployed .setCanvas(new FullHTMLPane("/rhq/resource/content/view-plain.xhtml?id=" + resource.getId())); @@ -279,26 +259,21 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable + resource.getId())); this.contentHistory.setCanvas(new FullHTMLPane("/rhq/resource/content/history-plain.xhtml?id=" + resource.getId())); - contentTab.updateSubTab(contentDeployed); - contentTab.updateSubTab(contentNew); - contentTab.updateSubTab(contentSubscrip); - contentTab.updateSubTab(contentHistory); - - // topTabSet.setSelectedTab(selectedTab);
- completeTabUpdate(); + updateTabEnablement(); }
- private void completeTabUpdate() { + private void updateTabEnablement() {
ResourcePermission permissions = this.resourceComposite.getResourcePermission(); Set<ResourceTypeFacet> facets = this.resourceComposite.getResourceFacets().getFacets();
// Summary, Monitoring, Inventory, and Alerts tabs are always enabled.
- monitoringTab.setSubTabEnabled("Call Time", facets.contains(ResourceTypeFacet.CALL_TIME)); + monitoringTab.setSubTabEnabled(monitorTraits.getLocatorId(), hasTraits(this.resourceComposite)); + monitoringTab.setSubTabEnabled(monitorCallTime.getLocatorId(), facets.contains(ResourceTypeFacet.CALL_TIME));
- inventoryTab.setSubTabEnabled("Connection Settings", facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION)); + inventoryTab.setSubTabEnabled(inventoryConn.getLocatorId(), facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION));
if (facets.contains(ResourceTypeFacet.OPERATION)) { topTabSet.enableTab(operationsTab); @@ -323,26 +298,26 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable } else { topTabSet.disableTab(contentTab); } - - if (topTabSet.getSelectedTab().getDisabled()) { - topTabSet.selectTab(0); - } - - topTabSet.markForRedraw(); }
public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) { + //CoreGUI.printWidgetTree(); + if (this.resourceComposite == null) { // History.fireCurrentHistoryState(); } else { // Switch tabs directly, rather than letting the history framework do it, to avoid redrawing the outer views. // selectTab(tabSelectedEvent.getId(), tabSelectedEvent.getSubTabId()); - String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId(); String path = "Resource/" + resourceId + tabPath;
- // But still add an item to the history, specifying false to tell it not to fire an event. - History.newItem(path, true); + // If the tab that was selected is not already the current history item, the user clicked on the tab, rather + // than going directly to the tab's URL. In this case, fire a history event to go to the tab and make it the + // current history item. + if (!History.getToken().equals(path)) { + System.out.println("Firing History event [" + path + "]..."); + History.newItem(path, true); + } } }
@@ -402,7 +377,9 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable final Resource resource = resourceComposite.getResource(); ResourceTypeRepository.Cache.getInstance().getResourceTypes( resource.getResourceType().getId(), - EnumSet.of(ResourceTypeRepository.MetadataType.content, ResourceTypeRepository.MetadataType.operations, + EnumSet.of(ResourceTypeRepository.MetadataType.content, + ResourceTypeRepository.MetadataType.operations, + ResourceTypeRepository.MetadataType.measurements, ResourceTypeRepository.MetadataType.events, ResourceTypeRepository.MetadataType.resourceConfigurationDefinition), new ResourceTypeRepository.TypeLoadedCallback() { @@ -411,34 +388,52 @@ public class ResourceDetailView extends LocatableVLayout implements Bookmarkable ResourceDetailView.this.resourceComposite = resourceComposite; updateDetailViews(resourceComposite); selectTab(tabName, subTabName, viewPath); - } }); }
public void selectTab(String tabName, String subtabName, ViewPath viewPath) { - if (tabName == null) { - tabName = DEFAULT_TAB_NAME; - } - TwoLevelTab tab = (TwoLevelTab) this.topTabSet.getTabByTitle(tabName); - if (tab == null) { - CoreGUI.getErrorHandler().handleError("Invalid tab name: " + tabName); - // TODO: Should we fire a history event here to redirect to a valid bookmark? - tab = (TwoLevelTab) this.topTabSet.getTabByTitle(DEFAULT_TAB_NAME); - } - this.topTabSet.selectTab(tab); - if (subtabName != null) { - if (!tab.getLayout().selectTab(subtabName)) { - CoreGUI.getErrorHandler().handleError("Invalid subtab name: " + subtabName); + try { + TwoLevelTab tab = this.topTabSet.getTabByTitle(tabName); + if (tab == null || tab.getDisabled()) { + CoreGUI.getErrorHandler().handleError("Invalid tab name: " + tabName); // TODO: Should we fire a history event here to redirect to a valid bookmark? - return; - } else { - Canvas subView = tab.getLayout().getCurrentCanvas(); + Tab defaultTab = this.topTabSet.getTab(0); + tab = (TwoLevelTab) defaultTab; + } + SubTab subTab = null; + if (subtabName != null) { + if (!tab.getLayout().selectTab(subtabName)) { + CoreGUI.getErrorHandler().handleError("Invalid subtab name: " + subtabName); + // TODO: Should we fire a history event here to redirect to a valid bookmark? + SubTab defaultSubtab = tab.getLayout().getDefaultSubTab(); + tab.getLayout().selectTab(defaultSubtab.getTitle()); + } + subTab = tab.getLayout().getCurrentSubTab(); + } + this.topTabSet.selectTab(tab); + if (subTab != null) { + tab.updateSubTab(subTab); + Canvas subView = subTab.getCanvas(); if (subView instanceof BookmarkableView) { ((BookmarkableView) subView).renderView(viewPath); } } + tab.getLayout().markForRedraw(); + this.topTabSet.markForRedraw(); + } catch (Exception e) { + System.err.println("Failed to select tab " + tabName + "/" + subtabName + ": " + e); } }
+ private static boolean hasTraits(ResourceComposite resourceComposite) { + ResourceType type = resourceComposite.getResource().getResourceType(); + Set<MeasurementDefinition> metricDefs = type.getMetricDefinitions(); + for (MeasurementDefinition metricDef : metricDefs) { + if (metricDef.getDataType() == DataType.TRAIT) { + return true; + } + } + return false; + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java index ecb4806..fe4fdc2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java @@ -55,10 +55,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTyp * @author Greg Hinkle */ public class ResourceTreeDatasource extends DataSource { - - private boolean initialized = false; - int rootId; - List<Resource> initialData; + private List<Resource> initialData;
private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
@@ -69,8 +66,6 @@ public class ResourceTreeDatasource extends DataSource {
this.initialData = initialData;
- this.rootId = rootId; - DataSourceField idDataField = new DataSourceTextField("id", "ID"); idDataField.setPrimaryKey(true);
@@ -240,7 +235,6 @@ public class ResourceTreeDatasource extends DataSource { }
return built.toArray(new TreeNode[built.size()]); - }
private static boolean sameTypes(ResourceTreeNode[] nodes) { @@ -263,10 +257,23 @@ public class ResourceTreeDatasource extends DataSource { setAttribute("parentId", parentId); setAttribute("name", category.getDisplayName()); } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("CategoryTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } }
public static class TypeTreeNode extends TreeNode { - private TypeTreeNode(String parentId, String parentResourceId, String type) { setID(parentId + "_" + type); setParentID(parentId); @@ -277,10 +284,22 @@ public class ResourceTreeDatasource extends DataSource { setAttribute("name", type); }
+ @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("TypeTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } }
public static class ResourceTreeNode extends TreeNode { - private Resource resource;
private ResourceTreeNode(Resource resource) { @@ -327,5 +346,19 @@ public class ResourceTreeDatasource extends DataSource { public String getParentId() { return getAttribute("parentId"); } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("ResourceTreeNode["); + String id = getAttribute("id"); + buffer.append("id=").append(id); + String parentId = getAttribute("parentId"); + buffer.append(", parentId=").append(parentId); + String name = getAttribute("name"); + buffer.append(", name=").append(name); + buffer.append("]"); + return buffer.toString(); + } } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java index e73c7ef..8566975 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java @@ -73,6 +73,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectLi import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.create.OperationCreateWizard; import org.rhq.enterprise.gui.coregui.client.inventory.resource.factory.ResourceFactoryCreateWizard; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; +import org.rhq.enterprise.gui.coregui.client.util.TreeUtility; import org.rhq.enterprise.gui.coregui.client.util.message.Message; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -520,6 +521,8 @@ public class ResourceTreeView extends LocatableVLayout { } });
+ TreeUtility.printTree(treeGrid.getTree()); + TreeNode selectedNode = treeGrid.getTree().findById(String.valueOf(selectedResourceId)); // System.out.println("Trying to preopen: " + selectedNode); if (selectedNode != null) { @@ -550,6 +553,8 @@ public class ResourceTreeView extends LocatableVLayout { new ResourceTypeRepository.ResourceTypeLoadedCallback() { public void onResourceTypeLoaded(List<Resource> result) {
+ TreeUtility.printTree(treeGrid.getTree()); + treeGrid.getTree().linkNodes(ResourceTreeDatasource.build(result));
TreeNode selectedNode = treeGrid.getTree().findById( diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TreeUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TreeUtility.java new file mode 100644 index 0000000..8199c50 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TreeUtility.java @@ -0,0 +1,29 @@ +package org.rhq.enterprise.gui.coregui.client.util; + +import com.smartgwt.client.widgets.tree.Tree; +import com.smartgwt.client.widgets.tree.TreeNode; + +/** + * @author Ian Springer + */ +public class TreeUtility { + public static void printTree(Tree tree) { + TreeNode rootNode = tree.getRoot(); + printTreeNode(tree, rootNode); + } + + private static void printTreeNode(Tree tree, TreeNode node) { + int level = tree.getLevel(node); + for (int i = 0; i < level; i++) { + System.out.print(' '); + } + System.out.println("* " + node); + TreeNode[] childNodes = tree.getChildren(node); + for (TreeNode childNode : childNodes) { + printTreeNode(tree, childNode); + } + } + + private TreeUtility() { + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java index 5b3e09e..8fb1e41 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java @@ -3,7 +3,7 @@ package org.rhq.enterprise.gui.coregui.client.util.selenium; import com.smartgwt.client.widgets.layout.HLayout;
/** - * Wrapper for com.smartgwt.client.widgets.layout.HLayout that sets the ID for use with selenium scLocators. + * Wrapper for a SmartGWT {@link HLayout} that sets the ID for use with Selenium scLocators. * * @author Jay Shaughnessy */ @@ -46,5 +46,4 @@ public class LocatableHLayout extends HLayout implements Locatable { public String extendLocatorId(String extension) { return this.locatorId + "_" + extension; } - } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableTabSet.java index 4ba995c..0dda6bf 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableTabSet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableTabSet.java @@ -18,6 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.client.util.selenium;
+import com.smartgwt.client.widgets.tab.Tab; import com.smartgwt.client.widgets.tab.TabSet;
/** @@ -41,10 +42,28 @@ public class LocatableTabSet extends TabSet { SeleniumUtility.setID(this, locatorId); }
+ public void setTabs(LocatableTab... tabs) { + super.setTabs(tabs); + } + + public LocatableTab[] getTabs() { + Tab[] tabs = super.getTabs(); + LocatableTab[] locatableTabs = new LocatableTab[tabs.length]; + for (int i = 0, tabsLength = tabs.length; i < tabsLength; i++) { + Tab tab = tabs[i]; + if (!(tab instanceof LocatableTab)) { + throw new IllegalStateException("LocatableTabSet contains a Tab that is not a LocatableTab."); + } + locatableTabs[i] = (LocatableTab) tab; + } + return locatableTabs; + } + /** * Returns the locatorId. This can be useful for constructing more granular locatorIds. For example, if * the widget contains sub-widgets. Note, this is the raw locatorId for the widget, to get the fully - * formed ID, typically ofthe form "simpleClassname_locatorId" Call {@link getID()}. + * formed ID, typically of the form "simpleClassname_locatorId", call + * {@link com.smartgwt.client.widgets.Canvas#getID()}. * * @return the locatorId */ @@ -67,4 +86,23 @@ public class LocatableTabSet extends TabSet { return this.locatorId + "_" + extension; }
+ public LocatableTab getTabByTitle(String title) { + LocatableTab[] tabs = getTabs(); + for (LocatableTab tab : tabs) { + if (tab.getTitle().equals(title)) { + return tab; + } + } + return null; + } + + public LocatableTab getTabByLocatorId(String locatorId) { + LocatableTab[] tabs = getTabs(); + for (LocatableTab tab : tabs) { + if (tab.getLocatorId().equals(locatorId)) { + return tab; + } + } + return null; + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java index 0a9b00e..61991c4 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java @@ -3,7 +3,7 @@ package org.rhq.enterprise.gui.coregui.client.util.selenium; import com.smartgwt.client.widgets.layout.VLayout;
/** - * Wrapper for com.smartgwt.client.widgets.layout.VLayout that sets the ID for use with selenium scLocators. + * Wrapper for a SmartGWT {@link VLayout} that sets the ID for use with Selenium scLocators. * * @author Jay Shaughnessy */ @@ -50,5 +50,4 @@ public class LocatableVLayout extends VLayout implements Locatable { public void destroyMembers() { SeleniumUtility.destroyMembers(this); } - }