/* * RHQ Management Platform * Copyright 2011, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.admin.templates; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import com.google.gwt.user.client.Timer; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.layout.Layout; import com.smartgwt.client.widgets.tree.TreeGrid; import com.smartgwt.client.widgets.tree.TreeGridField; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite; import org.rhq.coregui.client.IconEnum; import org.rhq.coregui.client.LinkManager; import org.rhq.coregui.client.PermissionsLoadedListener; import org.rhq.coregui.client.PermissionsLoader; import org.rhq.coregui.client.ViewPath; import org.rhq.coregui.client.alert.definitions.TemplateAlertDefinitionsView; import org.rhq.coregui.client.components.TitleBar; import org.rhq.coregui.client.components.view.ViewName; import org.rhq.coregui.client.util.Log; import org.rhq.coregui.client.util.enhanced.EnhancedVLayout; /** * @author Jay Shaughnessy */ public class AlertDefinitionTemplateTypeView extends ResourceTypeTreeView { public static final ViewName VIEW_ID = new ViewName("AlertDefTemplates", MSG.view_adminConfig_alertDefTemplates(), IconEnum.ALERT_FLAG_BLUE); public static final String VIEW_PATH = ResourceTypeTreeView.VIEW_PATH + VIEW_ID; public static final String ATTR_ENABLED_TEMPLATES = "enabledTemplates"; public static final String ATTR_DISABLED_TEMPLATES = "disabledTemplates"; private Layout canvas; public AlertDefinitionTemplateTypeView() { super(); } @Override protected String getEditLink(String typeId) { if (null == typeId) { return LinkManager.getAdminTemplatesLink(VIEW_ID.getName()); } return LinkManager.getAdminTemplatesEditLink(VIEW_ID.getName(), Integer.valueOf(typeId)); } @Override protected TitleBar getTitleBar() { return new TitleBar(MSG.view_adminConfig_alertDefTemplates(), VIEW_ID.getIcon().getIcon24x24Path()); } @Override protected Collection<ListGridField> getAdditionalListGridFields(boolean isTreeGrid) { List<ListGridField> fields = new ArrayList<ListGridField>(2); ListGridField enabledTemplatesField = (isTreeGrid) // ? new TreeGridField(ATTR_ENABLED_TEMPLATES, MSG.view_adminTemplates_enabledTemplates()) : new ListGridField(ATTR_ENABLED_TEMPLATES, MSG.view_adminTemplates_enabledTemplates()); enabledTemplatesField.setWidth("150"); enabledTemplatesField.setAlign(Alignment.CENTER); enabledTemplatesField.setPrompt(MSG.view_adminTemplates_prompt_enabledAlertTemplates()); fields.add(enabledTemplatesField); ListGridField disabledTemplatesField = (isTreeGrid) // ? new TreeGridField(ATTR_DISABLED_TEMPLATES, MSG.view_adminTemplates_disabledTemplates()) : new ListGridField(ATTR_DISABLED_TEMPLATES, MSG.view_adminTemplates_disabledTemplates()); disabledTemplatesField.setWidth("150"); disabledTemplatesField.setAlign(Alignment.CENTER); disabledTemplatesField.setPrompt(MSG.view_adminTemplates_prompt_disabledAlertTemplates()); fields.add(disabledTemplatesField); return fields; } @Override protected void editTemplates(final ResourceType type, final ViewPath viewPath) { new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() { public void onPermissionsLoaded(Set<Permission> permissions) { final Layout alertCanvas = getCanvas(); final TemplateAlertDefinitionsView defsView = new TemplateAlertDefinitionsView(type, permissions); renderTemplateAlertView(alertCanvas, defsView, viewPath); } }); } private void renderTemplateAlertView(final Layout defsHolderLayout, final TemplateAlertDefinitionsView defsView, final ViewPath viewPath) { // Don't show our back button if we are going to a template details pane which has its own back button, in // which case viewPath.viewsLeft() would return 1. boolean showBackButton = (viewPath.viewsLeft() == 0); prepareSubCanvas(defsHolderLayout, defsView, showBackButton); new Timer() { final long startTime = System.currentTimeMillis(); public void run() { if (defsView.isInitialized()) { defsView.renderView(viewPath.next()); switchToCanvas(AlertDefinitionTemplateTypeView.this, defsHolderLayout); } else { long elapsedMillis = System.currentTimeMillis() - startTime; if (elapsedMillis < 10000) { schedule(100); // Reschedule the timer. } else { Log.error("Initialization of " + defsView.getClass().getName() + " timed out."); // Make a last-ditch attempt to call renderView() even though the view may not be initialized. defsView.renderView(viewPath.next()); switchToCanvas(AlertDefinitionTemplateTypeView.this, defsHolderLayout); } } } }.run(); // fire the timer immediately } private Layout getCanvas() { if (null == this.canvas) { EnhancedVLayout layout = new EnhancedVLayout(); layout.setHeight100(); layout.setWidth100(); layout.setMargin(5); this.canvas = layout; } return this.canvas; } @Override protected ResourceTypeTreeNodeBuilder getNodeBuilderInstance(ListGrid platformsList, ListGrid platformServicesList, TreeGrid serversTreeGrid) { return new NodeBuilder(platformsList, platformServicesList, serversTreeGrid); } public static class NodeBuilder extends ResourceTypeTreeNodeBuilder { public NodeBuilder(ListGrid platformsList, ListGrid platformServicesList, TreeGrid serversTreeGrid) { super(platformsList, platformServicesList, serversTreeGrid); } @Override ResourceTypeListGridRecord getGridRecordInstance(ResourceTypeTemplateCountComposite composite) { return new GridRecord(composite); } public static class GridRecord extends ResourceTypeListGridRecord { public GridRecord(ResourceTypeTemplateCountComposite composite) { super(composite); setAttribute(ATTR_ENABLED_TEMPLATES, composite.getEnabledAlertCount()); setAttribute(ATTR_DISABLED_TEMPLATES, composite.getDisabledAlertCount()); } } @Override ResourceTypeTreeNode getTreeNodeInstance(ResourceTypeTemplateCountComposite composite, String plugin) { return new TreeNode(composite, plugin); } public static class TreeNode extends ResourceTypeTreeNode { public TreeNode(ResourceTypeTemplateCountComposite composite, String plugin) { super(composite, plugin); setAttribute(ATTR_ENABLED_TEMPLATES, composite.getEnabledAlertCount()); setAttribute(ATTR_DISABLED_TEMPLATES, composite.getDisabledAlertCount()); } @Override public ResourceTypeTreeNode copy() { ResourceTypeTreeNode dup = super.copy(); dup.setAttribute(ATTR_ENABLED_TEMPLATES, this.getAttributeAsLong(ATTR_ENABLED_TEMPLATES)); dup.setAttribute(ATTR_DISABLED_TEMPLATES, this.getAttributeAsLong(ATTR_DISABLED_TEMPLATES)); return dup; } } } }