1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package ohos.devtools.views.trace.fragment.ruler; 17 18 import ohos.devtools.views.trace.Sql; 19 import ohos.devtools.views.trace.bean.CpuRateBean; 20 import ohos.devtools.views.trace.component.AnalystPanel; 21 import ohos.devtools.views.trace.listener.IRangeChangeListener; 22 import ohos.devtools.views.trace.util.ColorUtils; 23 import ohos.devtools.views.trace.util.Db; 24 import ohos.devtools.views.trace.util.Utils; 25 26 import javax.swing.JComponent; 27 import javax.swing.SwingUtilities; 28 import java.awt.AlphaComposite; 29 import java.awt.BasicStroke; 30 import java.awt.Color; 31 import java.awt.Graphics2D; 32 import java.awt.event.MouseEvent; 33 import java.util.ArrayList; 34 import java.util.List; 35 import java.util.Map; 36 import java.util.Objects; 37 import java.util.concurrent.CompletableFuture; 38 import java.util.stream.Collectors; 39 40 /** 41 * cpu graphics 42 * 43 * @since 2021/04/22 12:25 44 */ 45 public class CpuFragment extends AbstractFragment { 46 private Map<Integer, List<CpuRateBean>> listMap; 47 private final Color shadowColor = new Color(0x99, 0x99, 0x99, 0xCE); 48 private int leftX; 49 private int rightX; 50 private int selectX; 51 private int selectY; 52 53 /** 54 * scale center x ,centerX is leftX or rightX 55 */ 56 private int centerX; 57 private IRangeChangeListener rangeChangeListener; 58 59 /** 60 * CpuFragment Constructor 61 * 62 * @param root parent 63 * @param listener listener 64 */ CpuFragment(final JComponent root, final IRangeChangeListener listener)65 public CpuFragment(final JComponent root, final IRangeChangeListener listener) { 66 this.setRoot(root); 67 getRect().setBounds(200, 22, root.getWidth() - 200, 72); 68 this.rangeChangeListener = listener; 69 } 70 71 /** 72 * Gets the value of selectX . 73 * 74 * @return the value of int 75 */ getSelectX()76 public int getSelectX() { 77 return selectX; 78 } 79 80 /** 81 * Sets the selectX . 82 * <p>You can use getSelectX() to get the value of selectX</p> 83 * 84 * @param selectX selectX 85 */ setSelectX(final int selectX)86 public void setSelectX(final int selectX) { 87 this.selectX = selectX; 88 } 89 90 /** 91 * Gets the value of selectY . 92 * 93 * @return the value of int 94 */ getSelectY()95 public int getSelectY() { 96 return selectY; 97 } 98 99 /** 100 * Sets the selectY . 101 * <p>You can use getSelectY() to get the value of selectY</p> 102 * 103 * @param selectY selectY 104 */ setSelectY(final int selectY)105 public void setSelectY(final int selectY) { 106 this.selectY = selectY; 107 } 108 109 /** 110 * reload cpu usage data 111 */ reloadData()112 public void reloadData() { 113 CompletableFuture.runAsync(() -> { 114 if (Objects.nonNull(listMap)) { 115 listMap.values().forEach(List::clear); 116 listMap.clear(); 117 } 118 ArrayList<CpuRateBean> cpus = new ArrayList<>() { 119 }; 120 Db.getInstance().query(Sql.SYS_GET_CPU_UTILIZATION_RATE, cpus, 0, AnalystPanel.getDURATION()); 121 listMap = cpus.stream().collect(Collectors.groupingBy(cpuRateBean -> cpuRateBean.getCpu())); 122 SwingUtilities.invokeLater(() -> { 123 repaint(); 124 }); 125 }, Utils.getPool()).whenComplete((unused, throwable) -> { 126 if (Objects.nonNull(throwable)) { 127 throwable.printStackTrace(); 128 } 129 }); 130 } 131 132 /** 133 * listener 134 * 135 * @param listener listener 136 */ setRangeChangeListener(final IRangeChangeListener listener)137 public void setRangeChangeListener(final IRangeChangeListener listener) { 138 this.rangeChangeListener = listener; 139 } 140 141 /** 142 * draw method 143 * 144 * @param graphics graphics 145 */ 146 @Override draw(final Graphics2D graphics)147 public void draw(final Graphics2D graphics) { 148 getRect().width = getRoot().getWidth() - Utils.getX(getRect()); 149 graphics.setColor(Color.white); 150 graphics.fillRect(Utils.getX(getRect()), Utils.getY(getRect()), getRect().width, getRect().height); 151 if (listMap != null && !listMap.isEmpty()) { 152 int height = getRect().height / listMap.size(); 153 double rw = (getRect().width) / 100.00; 154 listMap.forEach((map, beanList) -> { 155 for (CpuRateBean cpuRateBean : beanList) { 156 graphics.setStroke(new BasicStroke(0)); 157 graphics.setComposite( 158 AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) cpuRateBean.getRate())); 159 graphics.setColor(ColorUtils.MD_PALETTE[map]); 160 int side = (int) (Utils.getX(getRect()) + rw * cpuRateBean.getIndex()); 161 graphics.fillRect(side, Utils.getY(getRect()) + map * height, (int) rw + 1, height); 162 graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f)); 163 } 164 }); 165 } 166 if (leftX == rightX && leftX != 0) { 167 rightX = leftX + 1; 168 } 169 if (leftX > 0 && leftX <= Utils.getX(getRect()) + getRect().width) { 170 graphics.setColor(getRoot().getForeground()); 171 graphics.drawLine(leftX, Utils.getY(getRect()), leftX, Utils.getY(getRect()) + getRect().height); 172 graphics.setColor(shadowColor); 173 graphics.fillRect(Utils.getX(getRect()), Utils.getY(getRect()), leftX - Utils.getX(getRect()), 174 getRect().height); 175 graphics.drawRect(Utils.getX(getRect()), Utils.getY(getRect()), leftX - Utils.getX(getRect()), 176 getRect().height); 177 } 178 if (rightX < getRoot().getWidth() && rightX >= Utils.getX(getRect())) { 179 graphics.setColor(getRoot().getForeground()); 180 graphics.drawLine(rightX, Utils.getY(getRect()), rightX, Utils.getY(getRect()) + getRect().height); 181 graphics.setColor(shadowColor); 182 graphics.fillRect(rightX, Utils.getY(getRect()), Utils.getX(getRect()) + getRect().width - rightX, 183 getRect().height); 184 graphics.drawRect(rightX, Utils.getY(getRect()), Utils.getX(getRect()) + getRect().width - rightX, 185 getRect().height); 186 } 187 graphics.setColor(getRoot().getForeground()); 188 graphics.drawRect(leftX, Utils.getY(getRect()), rightX - leftX, getRect().height); 189 } 190 191 /** 192 * mouse dragged listener 193 * 194 * @param event event 195 */ mouseDragged(final MouseEvent event)196 public void mouseDragged(final MouseEvent event) { 197 if (selectY > Utils.getY(getRect()) && selectY < Utils.getY(getRect()) + getRect().height) { 198 if (event.getX() < selectX) { 199 rightX = selectX; 200 leftX = event.getX() <= Utils.getX(getRect()) ? Utils.getX(getRect()) : event.getX(); 201 } else { 202 rightX = event.getX() >= getRoot().getWidth() ? getRoot().getWidth() : event.getX(); 203 leftX = selectX; 204 } 205 if (leftX == rightX) { 206 if (leftX == Utils.getX(getRect())) { 207 rightX = leftX + 2; 208 } 209 if (rightX == getRoot().getWidth()) { 210 leftX = rightX - 2; 211 } 212 } 213 if (rangeChangeListener != null) { 214 if (selectX == leftX) { 215 centerX = leftX; 216 } 217 if (selectX == rightX) { 218 centerX = rightX; 219 } 220 rangeChangeListener.change(leftX, rightX, x2ns(leftX), x2ns(rightX), x2ns(centerX)); 221 } 222 getRoot().repaint(); 223 } 224 } 225 226 /** 227 * change time range 228 * 229 * @param sn startNs 230 * @param en endNs 231 */ setRange(final long sn, final long en)232 public void setRange(final long sn, final long en) { 233 leftX = (int) (sn * getRect().width / AnalystPanel.getDURATION()) + Utils.getX(getRect()); 234 rightX = (int) (en * getRect().width / AnalystPanel.getDURATION()) + Utils.getX(getRect()); 235 repaint(); 236 } 237 } 238