/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package org.visualvm.samples.filtersortsample; import com.sun.tools.visualvm.core.datasource.DataSource; import com.sun.tools.visualvm.core.datasource.descriptor.DataSourceDescriptor; import com.sun.tools.visualvm.core.datasource.descriptor.DataSourceDescriptorFactory; import com.sun.tools.visualvm.core.ui.actions.DataSourceAction; import com.sun.tools.visualvm.core.ui.actions.SingleDataSourceAction; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; /** * * @author Jiri Sedlacek */ public class Controller { private static Controller instance; private ShowHideDSAction showHideDSAction; private boolean dataSourcesHidden; private SortDSAction sortDSAction; private boolean currentSortOrder; public static synchronized Controller instance() { if (instance == null) instance = new Controller(); return instance; } public static DataSourceAction showHideDSAction() { return instance().showHideAction(); } public static DataSourceAction sortDSAction() { return instance().sortAction(); } private synchronized DataSourceAction showHideAction() { if (showHideDSAction == null) showHideDSAction = new ShowHideDSAction(); return showHideDSAction; } private synchronized DataSourceAction sortAction() { if (sortDSAction == null) sortDSAction = new SortDSAction(); return sortDSAction; } private static void filterDataSources(boolean visible) { Set<DataSource> dataSources = DataSource.ROOT.getRepository().getDataSources(); for (DataSource dataSource : dataSources) if (!(dataSource instanceof FilterSortRootNode)) dataSource.setVisible(visible); } private static void sortDataSources(final boolean sortOrder) { Set<DataSource> dataSources = FilterSortRootNode.sharedInstance().getRepository().getDataSources(); List<FilterSortNode.FilterSortDescriptorProvider.FilterSortDescriptor> descriptors = new ArrayList(dataSources.size()); for (DataSource dataSource : dataSources) descriptors.add((FilterSortNode.FilterSortDescriptorProvider.FilterSortDescriptor)DataSourceDescriptorFactory.getDescriptor(dataSource)); Collections.sort(descriptors, new Comparator<DataSourceDescriptor>() { public int compare(DataSourceDescriptor dsd1, DataSourceDescriptor dsd2) { String name1 = dsd1.getName(); Integer int1 = Integer.decode(name1.substring(name1.lastIndexOf("@") + 1)); String name2 = dsd2.getName(); Integer int2 = Integer.decode(name2.substring(name1.lastIndexOf("@") + 1)); return sortOrder ? int2.compareTo(int1) : int1.compareTo(int2); } }); for (int i = 0; i < descriptors.size(); i++) descriptors.get(i).changePreferredPosition(i); } private class ShowHideDSAction extends SingleDataSourceAction<FilterSortRootNode> { protected void actionPerformed(FilterSortRootNode arg0, ActionEvent arg1) { filterDataSources(dataSourcesHidden); dataSourcesHidden = !dataSourcesHidden; updateName(); } protected boolean isEnabled(FilterSortRootNode arg0) { return true; } private void updateName() { putValue(NAME, dataSourcesHidden ? "Reset Filter" : "Filter Out DataSources"); } ShowHideDSAction() { super(FilterSortRootNode.class); updateName(); } } private class SortDSAction extends SingleDataSourceAction<FilterSortRootNode> { protected void actionPerformed(FilterSortRootNode arg0, ActionEvent arg1) { sortDataSources(currentSortOrder); currentSortOrder = !currentSortOrder; updateName(); } protected boolean isEnabled(FilterSortRootNode arg0) { return true; } private void updateName() { putValue(NAME, currentSortOrder ? "Sort Descending" : "Sort Ascending"); } SortDSAction() { super(FilterSortRootNode.class); updateName(); } } }