package com.griddynamics.jagger.webclient.client.components; import com.google.gwt.event.dom.client.*; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.*; import com.griddynamics.jagger.dbapi.dto.PlotIntegratedDto; import com.griddynamics.jagger.dbapi.dto.PlotSingleDto; import com.griddynamics.jagger.webclient.client.resources.JaggerResources; import com.sencha.gxt.dnd.core.client.*; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; import com.sencha.gxt.widget.core.client.menu.Item; import com.sencha.gxt.widget.core.client.menu.Menu; import com.sencha.gxt.widget.core.client.menu.MenuItem; import java.util.List; /** * Draggable container that holds plot representation */ public class PlotContainer extends VerticalLayoutContainer { private PlotRepresentation plotRepresentation; private PlotSaver plotSaver; private PlotsPanel plotsPanel; private TextBox plotHeader; private HorizontalPanel dragPanel; private final int DRAG_PANEL_HEIGHT = 20; public int getDragPanelHeight() { return DRAG_PANEL_HEIGHT; } public PlotContainer(String id, String plotHeader, PlotRepresentation chart, PlotSaver plotSaver) { super(); this.getElement().setId(id); this.plotRepresentation = chart; this.plotSaver = plotSaver; this.plotHeader = new TextBox(); this.plotHeader.setText(plotHeader); initContainer(); setStyleName(JaggerResources.INSTANCE.css().padding2px()); } private void initDragAndDropBehavior() { DropTarget target = new DropTarget(this) { @Override protected void onDragDrop(DndDropEvent event) { super.onDragDrop(event); PlotContainer incoming = (PlotContainer) event.getData(); PlotContainer current = (PlotContainer) component; swap(incoming, current); } }; target.setFeedback(DND.Feedback.BOTH); new DragSource(dragPanel) { @Override protected void onDragStart(DndDragStartEvent event) { super.onDragStart(event); // by default drag is allowed event.setData(dragPanel.getParent()); } }; } // swap data of containers private void swap(PlotContainer c1, PlotContainer c2) { String id1 = c1.getElement().getId(); String id2 = c2.getElement().getId(); String header1 = c1.getPlotHeaderText(); String header2 = c2.getPlotHeaderText(); PlotRepresentation ch1 = c1.getPlotRepresentation(); PlotRepresentation ch2 = c2.getPlotRepresentation(); c1.getElement().setId(id2); c2.getElement().setId(id1); c1.setPlotRepresentation(ch2); c2.setPlotRepresentation(ch1); c1.setPlotHeaderText(header2); c2.setPlotHeaderText(header1); } private void initContainer() { this.setWidth("100%"); dragPanel = new HorizontalPanel(); dragPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); dragPanel.addStyleName(JaggerResources.INSTANCE.css().dragLabel()); dragPanel.addStyleName(JaggerResources.INSTANCE.css().draggable()); dragPanel.setHeight(DRAG_PANEL_HEIGHT + "px"); dragPanel.add(plotHeader); plotHeader.setEnabled(false); plotHeader.setStyleName(JaggerResources.INSTANCE.css().plotHeader()); plotHeader.addStyleName(JaggerResources.INSTANCE.css().draggable()); // select all text in plot header on double click dragPanel.addDomHandler(new DoubleClickHandler() { @Override public void onDoubleClick(DoubleClickEvent event) { plotHeader.selectAll(); } }, DoubleClickEvent.getType()); // menu creation final Menu settingsMenu = generateMenu(); final Image settingsImageButton = new Image(JaggerResources.INSTANCE.getGearImage().getSafeUri()); settingsImageButton.addStyleName(JaggerResources.INSTANCE.css().pointer()); settingsImageButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { settingsMenu.show(settingsImageButton); } }); settingsImageButton.addMouseOverHandler(new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { settingsImageButton.setUrl(JaggerResources.INSTANCE.getGearBlueImage().getSafeUri()); } }); settingsImageButton.addMouseOutHandler(new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { settingsImageButton.setUrl(JaggerResources.INSTANCE.getGearImage().getSafeUri()); } }); final Image closeImageButton = new Image(JaggerResources.INSTANCE.getCrossImage().getSafeUri()); closeImageButton.addStyleName(JaggerResources.INSTANCE.css().pointer()); closeImageButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { plotsPanel.deselectMetricNode(PlotContainer.this.getPlotRepresentation().getMetricNode()); } }); closeImageButton.addMouseOverHandler(new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { closeImageButton.setUrl(JaggerResources.INSTANCE.getCrossBlueImage().getSafeUri()); } }); closeImageButton.addMouseOutHandler(new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { closeImageButton.setUrl(JaggerResources.INSTANCE.getCrossImage().getSafeUri()); } }); dragPanel.add(settingsImageButton); dragPanel.setCellWidth(settingsImageButton, "20px"); // simple div in html SimplePanel separator = new SimplePanel(); dragPanel.add(separator); dragPanel.setCellWidth(separator, "15px"); dragPanel.add(closeImageButton); dragPanel.setCellWidth(closeImageButton, "20px"); add(dragPanel); add(plotRepresentation); initDragAndDropBehavior(); } private Menu generateMenu() { Menu settingsMenu = new Menu(); settingsMenu.addStyleName(JaggerResources.INSTANCE.css().plotSettingsMenu()); settingsMenu.add(createDownloadPngMenuItem()); settingsMenu.add(createDownloadCsvMenuItem()); return settingsMenu; } private MenuItem createDownloadCsvMenuItem() { MenuItem menuItem = new MenuItem("Download as .cvs"); menuItem.addSelectionHandler(new SelectionHandler<Item>() { @Override public void onSelection(SelectionEvent<Item> event) { LegendTree legendTree = plotRepresentation.getLegendTree(); PlotIntegratedDto pid = plotRepresentation.getPlotIntegratedDto(); List<PlotSingleDto> checkedLines = legendTree.getListOfSelectedLines(); FileDownLoader.downloadPlotInCsv(checkedLines, pid.getPlotHeader(), pid.getXAxisLabel()); } }); menuItem.setIcon(JaggerResources.INSTANCE.getDownloadImage()); return menuItem; } private MenuItem createDownloadPngMenuItem() { MenuItem menuItem = new MenuItem("Download as .png"); if (plotSaver == null) { menuItem.setEnabled(false); } else { menuItem.addSelectionHandler(new SelectionHandler<Item>() { @Override public void onSelection(SelectionEvent<Item> event) { plotSaver.saveAsPng( plotRepresentation.getSimplePlot(), getPlotHeaderText(), plotRepresentation.getxLabel().getText()); } }); } menuItem.setIcon(JaggerResources.INSTANCE.getDownloadImage()); return menuItem; } public void setPlotRepresentation(PlotRepresentation plotRepresentation) { remove(this.plotRepresentation); this.plotRepresentation = plotRepresentation; add(this.plotRepresentation); } public PlotRepresentation getPlotRepresentation() { return plotRepresentation; } private String getPlotHeaderText() { return this.plotHeader.getText(); } private void setPlotHeaderText(String headerText) { this.plotHeader.setText(headerText); } public void setPlotsPanel(PlotsPanel plotsPanel) { this.plotsPanel = plotsPanel; } @Override public void setHeight(String height) { super.setHeight("100%"); plotRepresentation.setHeight("100%"); plotRepresentation.getSimplePlot().setHeight(height); plotRepresentation.onResize(); } }