blob: 11d4903fdc77fd095125bf657086473b8200b713 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* 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 com.android.tools.idea.editors.vmtrace.treemodel;
import com.android.tools.perflib.vmtrace.ClockType;
import com.android.tools.perflib.vmtrace.ThreadInfo;
import com.android.tools.perflib.vmtrace.VmTraceData;
import com.intellij.ui.treeStructure.treetable.TreeColumnInfo;
import com.intellij.ui.treeStructure.treetable.TreeTableModel;
import com.intellij.util.ui.ColumnInfo;
import com.intellij.util.ui.SortableColumnModel;
import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
/**
* A {@link TreeTableModel} for viewing method statistics from a VM Trace.
* The root and nodes of the tree model are instances of {@link StatsNode}, so most methods here
* simply delegate to the corresponding method in the {@link StatsNode}.
*/
public class VmStatsTreeTableModel extends AbstractTreeTableModel implements TreeTableModel {
private VmTraceData myVmTraceData;
private StatsNode myRootNode;
private ThreadInfo myThread;
private ClockType myClockType = ClockType.GLOBAL;
private StatsTableColumn mySortByColumn = StatsTableColumn.EXCLUSIVE_TIME;
private boolean mySortAscending = true;
public VmStatsTreeTableModel() {
myRootNode = new NullStatsNode();
}
public void setTraceData(@NotNull VmTraceData traceData, @NotNull ThreadInfo thread) {
myVmTraceData = traceData;
setThread(thread);
}
public void setClockType(ClockType type) {
myClockType = type;
fireTreeStructureChanged();
}
public void setThread(@NotNull ThreadInfo thread) {
myThread = thread;
if (myVmTraceData != null) {
myRootNode = new StatsByThreadNode(myVmTraceData, thread);
} else {
myRootNode = new NullStatsNode();
}
fireTreeStructureChanged();
}
private void fireTreeStructureChanged() {
TreeModelEvent e = new TreeModelEvent(this, new Object[] { myRootNode});
for (TreeModelListener listener: getTreeModelListeners()) {
listener.treeStructureChanged(e);
}
}
@Override
public int getColumnCount() {
return StatsTableColumn.values().length;
}
@Override
public String getColumnName(int column) {
return getStatsTableColumn(column).toString();
}
private StatsTableColumn getStatsTableColumn(int index) {
return StatsTableColumn.fromColumnIndex(index);
}
@Override
public Class getColumnClass(int column) {
return column == 0 ? TreeTableModel.class : String.class;
}
@Nullable
@Override
public Object getValueAt(Object node, int column) {
if (!(node instanceof StatsNode)) {
return "???";
}
return ((StatsNode)node).getValueAt(column, myThread, myVmTraceData, myClockType);
}
@Override
public boolean isCellEditable(Object node, int column) {
return false;
}
@Override
public void setTree(JTree tree) {
}
@Override
public Object getRoot() {
return myRootNode;
}
@Override
public Object getChild(Object parent, int index) {
return ((StatsNode)parent).getChild(index);
}
@Override
public int getChildCount(Object parent) {
return ((StatsNode)parent).getChildCount();
}
@Override
public boolean isLeaf(Object node) {
return ((StatsNode)node).isLeaf();
}
@Override
public int getIndexOfChild(Object parent, Object child) {
return 0;
}
public void sortByColumn(StatsTableColumn column) {
if (column != mySortByColumn) {
mySortByColumn = column;
mySortAscending = true;
} else {
mySortAscending = !mySortAscending;
}
myRootNode.setSortColumn(mySortByColumn, mySortAscending);
fireTreeStructureChanged();
}
}