package org.opennms.features.gwt.ksc.add.client.presenter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.opennms.features.gwt.ksc.add.client.GraphInfo;
import org.opennms.features.gwt.ksc.add.client.KscReport;
import org.opennms.features.gwt.ksc.add.client.rest.DefaultKscReportService;
import org.opennms.features.gwt.ksc.add.client.rest.KscReportService;
import org.opennms.features.gwt.ksc.add.client.view.KscAddGraphView;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodeEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
public class KscAddGraphPresenter implements Presenter, KscAddGraphView.Presenter<KscReport> {
private static final List<KscReport> EMPTY_KSCREPORT_LIST = Collections.unmodifiableList(new ArrayList<KscReport>());
private KscAddGraphView<KscReport> m_view;
private List<KscReport> m_KscReports;
private PopupPanel m_mainPopup;
private final Image m_addImage;
private GraphInfo m_graphInfo;
private final KscReportService m_reportService = new DefaultKscReportService();
public KscAddGraphPresenter(final PopupPanel mainPopup, final KscAddGraphView<KscReport> addGraphView, final List<KscReport> kscReports, final GraphInfo graphInfo) {
m_mainPopup = mainPopup;
m_view = addGraphView;
m_view.setPresenter(this);
m_KscReports = kscReports;
m_graphInfo = graphInfo;
m_addImage = new Image("images/plus.gif");
m_addImage.setAltText("Add this graph to a KSC report.");
m_addImage.setTitle("Add this graph to a KSC report.");
}
private List<KscReport> filterResultsByName(final String searchText) {
final List<KscReport> list = new ArrayList<KscReport>();
for (final KscReport detail : m_KscReports) {
if (detail.getLabel().toLowerCase().contains(searchText.toLowerCase())) {
list.add(detail);
}
}
return list;
}
@Override
public void onKeyCodeEvent(final KeyCodeEvent<?> event, final String searchText) {
final int keyCode = event.getNativeEvent().getKeyCode();
final boolean isKeyUp = event instanceof KeyUpEvent;
final boolean isKeyDown = event instanceof KeyDownEvent;
if (isKeyUp && keyCode == KeyCodes.KEY_ESCAPE) {
GWT.log("escape, hiding results");
m_view.hidePopup();
} else if (isKeyUp && keyCode == KeyCodes.KEY_BACKSPACE && searchText.length() == 0) {
m_view.hidePopup();
m_view.setDataList(EMPTY_KSCREPORT_LIST);
m_view.clearSelection();
} else if (isKeyDown && keyCode == KeyCodes.KEY_ENTER && m_view.getSelectedReport() != null && m_view.getTitle() != null && !m_view.isPopupShowing()) {
onAddButtonClicked();
} else if (isKeyUp) {
if (searchText.length() == 0) {
GWT.log("search text is empty");
m_view.setDataList(EMPTY_KSCREPORT_LIST);
} else {
GWT.log("search text is not empty");
final List<KscReport> results = filterResultsByName(searchText);
if (keyCode == KeyCodes.KEY_ENTER && results.size() == 1) {
m_view.hidePopup();
m_view.select(results.get(0));
} else {
m_view.setDataList(results);
m_view.showPopup();
m_view.clearSelection();
}
}
}
}
@Override
public void onKscReportSelected() {
GWT.log("selected report " + m_view.getSelectedReport().getId());
m_view.hidePopup();
}
@Override
public void onAddButtonClicked() {
final String graphTitle = m_view.getTitle();
final int kscReportId = m_view.getSelectedReport().getId();
final String kscReportName = m_view.getSelectedReport().getLabel();
final String resourceId = m_graphInfo.getResourceId();
final String graphName = m_graphInfo.getReportName();
final String timeSpan = m_graphInfo.getTimespan();
final RequestCallback callback = new RequestCallback() {
@Override
public void onResponseReceived(final Request request, final Response response) {
GWT.log("got response: " + response.getText() + " (" + response.getStatusCode() + ")");
}
@Override
public void onError(final Request request, final Throwable t) {
GWT.log("got error: " + t.getLocalizedMessage());
}
};
GWT.log("adding resource '" + resourceId + "' from graph report '" + graphName + "' to KSC report '" + kscReportName + "' (" + kscReportId + ") with title '" + graphTitle + "' and timespan '" + timeSpan + "'");
m_reportService.addGraphToReport(callback, kscReportId, graphTitle, graphName, resourceId, timeSpan);
m_mainPopup.hide();
}
@Override
public void go(final HasWidgets container) {
m_addImage.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
GWT.log("clicked (showing = " + m_mainPopup.isShowing() + ", visible = " + m_mainPopup.isVisible() + ")");
if (m_mainPopup.isShowing()) {
m_mainPopup.hide();
m_mainPopup.getElement().getStyle().setDisplay(Display.NONE);
} else {
m_mainPopup.getElement().getStyle().setDisplay(Display.BLOCK);
m_mainPopup.showRelativeTo(m_addImage);
}
}
});
m_mainPopup.setVisible(false);
m_mainPopup.getElement().getStyle().setDisplay(Display.NONE);
m_mainPopup.addAutoHidePartner(m_addImage.getElement());
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(final ResizeEvent event) {
final int[] positions = calculateMainPopupPosition();
m_mainPopup.setPopupPosition(positions[0], positions[1]);
}
});
container.clear();
container.add(m_addImage);
container.add(m_mainPopup.asWidget());
}
public native final String getBaseHref() /*-{
try{
return $wnd.getBaseHref();
}catch(err){
return "";
}
}-*/;
private int[] calculateMainPopupPosition() {
final int[] positions = {0, 0};
final int windowWidth = Window.getClientWidth();
final int imageRightEdge = m_addImage.getAbsoluteLeft() + m_addImage.getWidth();
if (imageRightEdge + 300 > windowWidth) {
positions[0] = windowWidth - 320;
} else {
positions[0] = imageRightEdge - 3;
}
if (positions[0] < 0) positions[0] = 0;
positions[1] = m_addImage.getAbsoluteTop() + m_addImage.getHeight() - 1;
return positions;
}
}