/* * 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.drift; import java.util.ArrayList; import java.util.Date; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.DoubleClickEvent; import com.smartgwt.client.widgets.events.DoubleClickHandler; import com.smartgwt.client.widgets.grid.HoverCustomizer; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler; import com.smartgwt.client.widgets.grid.events.SelectionEvent; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.criteria.GenericDriftCriteria; import org.rhq.core.domain.drift.DriftChangeSet; import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.ImageManager; import org.rhq.coregui.client.LinkManager; import org.rhq.coregui.client.components.carousel.CarouselMember; import org.rhq.coregui.client.components.table.TimestampCellFormatter; import org.rhq.coregui.client.inventory.resource.AncestryUtil; /** * @author Jay Shaughnessy */ @SuppressWarnings("unchecked") public class DriftCarouselMemberView extends DriftHistoryView implements CarouselMember { private DriftChangeSet changeSet; private Criteria carouselCriteria; private ArrayList<DriftSelectionListener> driftSelectionListeners = new ArrayList<DriftSelectionListener>(); public static DriftCarouselMemberView get(ResourceComposite composite, DriftChangeSet driftChangeSet, Criteria initialCriteria) { EntityContext context = EntityContext.forResource(composite.getResource().getId()); boolean hasWriteAccess = composite.getResourcePermission().isDrift(); return new DriftCarouselMemberView(context, driftChangeSet, hasWriteAccess, initialCriteria); } public DriftCarouselMemberView(EntityContext context, DriftChangeSet driftChangeSet, boolean hasWriteAccess, Criteria initialCriteria) { super(null, context, hasWriteAccess, initialCriteria); this.carouselCriteria = initialCriteria; this.changeSet = driftChangeSet; ((DriftCarouselDataSource) getDataSource()).setChangeSetId(this.changeSet.getId()); // no need to refresh the drift instances, they are fixed. setShowFooterRefresh(false); //setWidth("500px"); } @Override public DriftDataSource getDataSource() { if (null == dataSource) { dataSource = new DriftCarouselDataSource(getContext()); } return dataSource; } @Override protected void configureTable() { super.configureTable(); setListGridDoubleClickHandler(new DoubleClickHandler() { @Override public void onDoubleClick(DoubleClickEvent event) { ListGrid listGrid = (ListGrid) event.getSource(); ListGridRecord[] selectedRows = listGrid.getSelectedRecords(); if (selectedRows != null && selectedRows.length == 1) { ListGridRecord record = selectedRows[0]; Integer resourceId = record.getAttributeAsInt(AncestryUtil.RESOURCE_ID); Integer driftDefId = record.getAttributeAsInt(DriftDataSource.ATTR_CHANGESET_DEF_ID); String driftId = getId(record); String url = LinkManager.getDriftCarouselDriftLink(resourceId, driftDefId, driftId); CoreGUI.goToView(url); } } }); getListGrid().addSelectionChangedHandler(new SelectionChangedHandler() { public void onSelectionChanged(SelectionEvent event) { Record record = event.getRecord(); boolean isSelected = event.getState(); for (DriftSelectionListener listener : driftSelectionListeners) { listener.onDriftSelection(record, isSelected); } } }); } public interface DriftSelectionListener { void onDriftSelection(Record record, boolean isSelected); } public void addDriftSelectionListener(DriftSelectionListener listener) { this.driftSelectionListeners.add(listener); } @Override protected void configureTableFilters() { // filter settings come from the Carousel view and are applied to all Drift views } @Override protected Criteria getCurrentCriteria() { return carouselCriteria; } @Override public void refresh(Criteria carouselCriteria) { this.carouselCriteria = carouselCriteria; super.refresh(); } public void updateTitleCanvas(String titleString) { int resourceId = getContext().getResourceId(); String imageHtml = Canvas.imgHTML(ImageManager.getViewIcon()); String link = LinkManager.getDriftCarouselSnapshotLink(resourceId, changeSet.getDriftDefinitionId(), changeSet.getVersion()); StringBuilder sb = new StringBuilder(); sb.append("<a href=\"").append(link).append("\">"); sb.append(imageHtml); sb.append("</a>"); sb.append("<span class=\"HeaderLabel\">"); sb.append(MSG.view_drift_table_snapshot()); sb.append(" "); sb.append(changeSet.getVersion()); sb.append("</span>"); sb.append("<br/>"); sb.append(TimestampCellFormatter.DATE_TIME_FORMAT_MEDIUM.format(new Date(this.changeSet.getCtime()))); Canvas titleCanvas = getTitleCanvas(); titleCanvas.setWidth100(); titleCanvas.setHeight(35); titleCanvas.setContents(sb.toString()); titleCanvas.setPadding(4); titleCanvas.markForRedraw(); } public static class DriftCarouselDataSource extends DriftDataSource { private String changeSetId; /** * Note, the changeSetId must be set prior to any fetches. * @param context */ DriftCarouselDataSource(EntityContext context) { super(context); } protected String getChangeSetId() { return changeSetId; } protected void setChangeSetId(String changeSetId) { this.changeSetId = changeSetId; } @Override protected GenericDriftCriteria getFetchCriteria(DSRequest request) { // Call super to get standard drift criteria that has been set GenericDriftCriteria criteria = super.getFetchCriteria(request); if (null == criteria) { criteria = new GenericDriftCriteria(); } // Always restrict to the relevant change set criteria.addFilterChangeSetId(changeSetId); return criteria; } /** * The view that contains the list grid which will display this datasource's data will call this * method to get the field information which is used to control the display of the data. * * @return list grid fields used to display the datasource data */ @Override public ArrayList<ListGridField> getListGridFields() { ArrayList<ListGridField> fields = new ArrayList<ListGridField>(7); ListGridField categoryField = new ListGridField(ATTR_CATEGORY, MSG.common_title_category()); categoryField.setType(ListGridFieldType.IMAGE); categoryField.setAlign(Alignment.CENTER); categoryField.setShowHover(true); categoryField.setHoverCustomizer(new HoverCustomizer() { @Override public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) { String cat = record.getAttribute(ATTR_CATEGORY); if (CATEGORY_ICON_ADD.equals(cat)) { return MSG.view_drift_category_fileAdded(); } else if (CATEGORY_ICON_CHANGE.equals(cat)) { return MSG.view_drift_category_fileChanged(); } else if (CATEGORY_ICON_REMOVE.equals(cat)) { return MSG.view_drift_category_fileRemoved(); } else if (CATEGORY_ICON_NEW.equals(cat)) { return MSG.view_drift_category_fileNew(); } else { return ""; // will never get here } } }); fields.add(categoryField); ListGridField pathField = new ListGridField(ATTR_PATH, MSG.common_title_path()); fields.add(pathField); categoryField.setWidth(80); pathField.setWidth("*"); return fields; } } }