/******************************************************************************* * Copyright (c) 2017 Rogue Wave Software Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Rogue Wave Software Inc. - initial implementation *******************************************************************************/ package org.eclipse.php.profile.ui.filters; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.php.internal.core.util.preferences.IXMLPreferencesStorable; import org.eclipse.php.profile.ui.ProfilerUIConstants; import org.eclipse.php.profile.ui.views.ExecutionStatisticsSorter; /** * Execution statistics field filter. */ public class ExecutionStatisticsFieldFilter extends ViewerFilter implements IXMLPreferencesStorable { // Descriptors public static final String DESC_HIGHEST = "Highest"; //$NON-NLS-1$ public static final String DESC_LOWEST = "Lowest"; //$NON-NLS-1$ // Fields public static final String FIELD_CALLS_COUNT = "Calls Count"; //$NON-NLS-1$ public static final String FIELD_AVERAGE_OWN_TIME = "Average Own Time"; //$NON-NLS-1$ public static final String FIELD_OWN_TIME = "Own Time"; //$NON-NLS-1$ public static final String FIELD_OTHERS_TIME = "Others Time"; //$NON-NLS-1$ public static final String FIELD_TOTAL_TIME = "Total Time"; //$NON-NLS-1$ private String fDescriptor; private int fNumber; private String fField; private ExecutionStatisticsSorter fSorter; public ExecutionStatisticsFieldFilter() { fSorter = new ExecutionStatisticsSorter(); } public ExecutionStatisticsFieldFilter(String descriptor, int number, String field) { fDescriptor = descriptor; fNumber = number; fField = field; fSorter = new ExecutionStatisticsSorter(); } public String getDescriptor() { return fDescriptor; } public void setDescriptor(String descriptor) { fDescriptor = descriptor; } public int getNumber() { return fNumber; } public void setNumber(int number) { fNumber = number; } public String getField() { return fField; } public void setField(String field) { fField = field; } public Map<String, Object> storeToMap() { Map<String, Object> map = new HashMap<String, Object>(3); map.put("descriptor", fDescriptor); //$NON-NLS-1$ map.put("number", fNumber); //$NON-NLS-1$ map.put("field", fField); //$NON-NLS-1$ return map; } public void restoreFromMap(Map<String, Object> map) { fDescriptor = (String) map.get("descriptor"); //$NON-NLS-1$ fNumber = Integer.parseInt((String) map.get("number")); //$NON-NLS-1$ fField = (String) map.get("field"); //$NON-NLS-1$ } public boolean select(Viewer viewer, Object parentElement, Object element) { return true; } public Object[] filter(Viewer viewer, Object parent, Object[] elements) { if (FIELD_AVERAGE_OWN_TIME.equals(fField)) { fSorter.setColumn(0); } else if (FIELD_CALLS_COUNT.equals(fField)) { fSorter.setColumn(1); } else if (FIELD_OTHERS_TIME.equals(fField)) { fSorter.setColumn(2); } else if (FIELD_OWN_TIME.equals(fField)) { fSorter.setColumn(3); } else if (FIELD_TOTAL_TIME.equals(fField)) { fSorter.setColumn(4); } if (DESC_HIGHEST.equals(fDescriptor)) { fSorter.setOrder(ProfilerUIConstants.SORT_DESCENDING); } else if (DESC_LOWEST.equals(fDescriptor)) { fSorter.setOrder(ProfilerUIConstants.SORT_ASCENDING); } elements = elements.clone(); // we can't modify the elements of the // model. fSorter.sort(viewer, elements); ArrayList<Object> resultElements = new ArrayList<Object>(elements.length); int countElements = 0; for (int i = 0; i < elements.length && countElements < fNumber; ++i) { resultElements.add(elements[i]); if (i > 0 && fSorter.compare(viewer, elements[i - 1], elements[i]) == 0) { continue; } countElements++; } return resultElements.toArray(new Object[resultElements.size()]); } }