/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package scouter.client.xlog.views; import java.util.ArrayList; import java.util.Enumeration; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import scouter.client.model.XLogData; import scouter.client.util.ConsoleProxy; import scouter.client.util.ExUtil; import scouter.client.util.TimeUtil; import scouter.util.LongEnumer; import scouter.util.LongKeyLinkedMap; public class XLogViewMouse implements MouseListener, MouseMoveListener { enum SelectAreaMode { LIST_XLOG, ZOOM_AREA, } public SelectAreaMode mode = null; public int x1 = -1; public int y1 = -1; public int x2 = -1; public int y2 = -1; private Canvas canvas; private LongKeyLinkedMap<XLogData> data; private String objType; XLogViewPainter viewPainter; public XLogViewMouse(LongKeyLinkedMap<XLogData> data, Canvas canvas) { this.data = data; this.canvas = canvas; } public void setPainter(XLogViewPainter viewPainter){ this.viewPainter = viewPainter; } public void setObjType(String objType){ this.objType = objType; } public void mouseDoubleClick(MouseEvent e) { x1 = x2 = y1 = y2 = -1; if (viewPainter.onMouseDoubleClick(e.x, e.y)) { canvas.redraw(); } } public void setNewYValue() { canvas.redraw(); } public void mouseDown(MouseEvent e) { x1 = x2 = y1 = y2 = -1; switch(e.button) { case 1 : if ((e.stateMask & SWT.SHIFT) != 0) { mode = SelectAreaMode.ZOOM_AREA; } else { mode = SelectAreaMode.LIST_XLOG; } break; default : mode = null; break; } if (mode != null) { x1 = e.x; y1 = e.y; if (viewPainter.onMouseClick(x1, y1)) { canvas.redraw(); } } } long last_draw = System.currentTimeMillis(); public String yyyymmdd; public void mouseMove(MouseEvent e) { if (mode != null && x1 >= 0 && y1 >= 0) { x2 = e.x; y2 = e.y; long now = System.currentTimeMillis(); if (now > last_draw + 50) { last_draw = now; canvas.redraw(); } } else { x1 = x2 = y1 = y2 = -1; } }; public void mouseUp(MouseEvent e) { if (mode != null && x1 >= 0 && x2 >= 0 && y1 >= 0 && y2 >= 0) { switch (mode) { case LIST_XLOG: listSelectedXLog(e.display, x1, y1, x2, y2); break; case ZOOM_AREA: zoominArea(e.display, x1, y1, x2, y2); break; } } x1 = x2 = y1 = y2 = -1; canvas.redraw(); mode = null; } public void listSelectedXLog(final Display display, int x1, int y1, int x2, int y2) { int txCnt = 0; ArrayList<XLogData> selectedData = new ArrayList<XLogData>(); Enumeration<XLogData> en = data.values(); while (en.hasMoreElements()) { XLogData item = en.nextElement(); if (inRect(x1, y1, x2, y2, item.x, item.y) && (item.filter_ok)) { txCnt++; if (selectedData.size() < 200) { selectedData.add(item); } } } if (txCnt < 1) { ConsoleProxy.info("[XLog] no xlogs in selected area."); return; } ConsoleProxy.info("[XLog] "+txCnt + " selected."); try { IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); XLogSelectionView view = (XLogSelectionView) win.getActivePage().showView(XLogSelectionView.ID,// objType, IWorkbenchPage.VIEW_ACTIVATE); view.setInput(selectedData, objType, yyyymmdd); } catch (Exception d) { } } public void zoominArea(final Display display, final int x1, final int y1, final int x2, final int y2) { ExUtil.asyncRun(new Runnable() { public void run() { final LongKeyLinkedMap<XLogData> zoomData = new LongKeyLinkedMap<XLogData>(); LongEnumer enumer = data.keys(); double max = 0; double min = Double.MAX_VALUE; while (enumer.hasMoreElements()) { long key = enumer.nextLong(); XLogData item = data.get(key); if (inRect(x1, y1, x2, y2, item.x, item.y) && (item.filter_ok)) { switch(viewPainter.yAxisMode) { case ELAPSED: if (item.p.elapsed / 1000d > max) { max = item.p.elapsed / 1000d; } if (item.p.elapsed / 1000d < min) { min = item.p.elapsed / 1000d; } break; case CPU: if (item.p.cpu > max) { max = item.p.cpu; } if (item.p.cpu < min) { min = item.p.cpu; } break; case SQL_TIME: if (item.p.sqlTime / 1000d > max) { max = item.p.sqlTime / 1000d; } if (item.p.sqlTime / 1000d < min) { min = item.p.sqlTime / 1000d; } break; case SQL_COUNT: if (item.p.sqlCount > max) { max = item.p.sqlCount; } if (item.p.sqlCount < min) { min = item.p.sqlCount; } break; case APICALL_TIME: if (item.p.apicallTime / 1000d > max) { max = item.p.apicallTime / 1000d; } if (item.p.apicallTime / 1000d < min) { min = item.p.apicallTime / 1000d; } break; case APICALL_COUNT: if (item.p.apicallCount > max) { max = item.p.apicallCount; } if (item.p.apicallCount < min) { min = item.p.apicallCount; } break; case HEAP_USED: if (item.p.kbytes > max) { max = item.p.kbytes; } if (item.p.kbytes < min) { min = item.p.kbytes; } break; default: if (item.p.elapsed / 1000d> max) { max = item.p.elapsed / 1000d; } if (item.p.elapsed / 1000d< min) { min = item.p.elapsed / 1000d; } break; } zoomData.put(key, new XLogData(item.p, item.serverId)); } } if (zoomData.isEmpty()) return; final long stime = zoomData.getFirstValue().p.endTime - 500; final long etime = zoomData.getLastValue().p.endTime + 500; final double yMax = max * 1.01; final double yMin = min * 0.99; ExUtil.exec(display, new Runnable() { public void run() { try { ConsoleProxy.info("[XLog] "+ zoomData.size() + " selected."); IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); XLogZoomTimeView view = (XLogZoomTimeView) win.getActivePage().showView(XLogZoomTimeView.ID,// objType+stime+etime+yMax+yMin, IWorkbenchPage.VIEW_ACTIVATE); if (view != null) { view.setInput(stime, etime, yMax, yMin, zoomData, objType, viewPainter.yAxisMode); } } catch (Exception d) { } } }); } }); } public boolean inRect(int x, int y, int tx, int ty, int sx, int sy) { if (x > tx) { int ttx = x; x = tx; tx = ttx; } if (y > ty) { int tty = y; y = ty; ty = tty; } return (x < sx && y < sy && tx > sx && ty > sy); } }