• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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