/* * 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 com.sun.tools.visualvm.core.ui.actions; import com.sun.tools.visualvm.core.snapshot.RegisteredSnapshotCategories; import com.sun.tools.visualvm.core.snapshot.SnapshotCategoriesListener; import com.sun.tools.visualvm.core.snapshot.SnapshotCategory; import com.sun.tools.visualvm.uisupport.UISupport; import java.awt.Image; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import javax.swing.plaf.basic.BasicFileChooserUI; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; class LoadSnapshotAction extends AbstractAction { private static final String ICON_PATH = "com/sun/tools/visualvm/core/ui/resources/loadSnapshot.png"; // NOI18N private static final Image ICON = ImageUtilities.loadImage(ICON_PATH); private String lastFile = null; private String lastFilter = null; private static LoadSnapshotAction instance; public static synchronized LoadSnapshotAction instance() { if (instance == null) { instance = new LoadSnapshotAction(); instance.updateEnabled(true); RegisteredSnapshotCategories.sharedInstance().addCategoriesListener(new SnapshotCategoriesListener() { public void categoryRegistered(SnapshotCategory category) { instance.updateEnabled(false); } public void categoryUnregistered(SnapshotCategory category) { instance.updateEnabled(false); } }); } return instance; } public void actionPerformed(ActionEvent e) { List<SnapshotCategory> categories = RegisteredSnapshotCategories.sharedInstance().getOpenSnapshotCategories(); if (categories.isEmpty()) return; // TODO: should display a notification dialog List<FileFilter> fileFilters = new ArrayList(); for (SnapshotCategory category : categories) fileFilters.add(category.getFileFilter()); JFileChooser chooser = new JFileChooser() { public void setSelectedFile(File file) { super.setSelectedFile(file); // safety check if (!(getUI() instanceof BasicFileChooserUI)) { return; } // grab the ui and set the filename BasicFileChooserUI ui = (BasicFileChooserUI) getUI(); ui.setFileName(file == null ? "" : file.getName()); } }; chooser.setDialogTitle(NbBundle.getMessage(LoadSnapshotAction.class, "LBL_Load")); // NOI18N chooser.setAcceptAllFileFilterUsed(false); int filterIndex = 0; for (int i = 0; i < fileFilters.size(); i++) { FileFilter fileFilter = fileFilters.get(i); chooser.addChoosableFileFilter(fileFilter); if (fileFilter.getDescription().equals(lastFilter)) filterIndex = i; } if (lastFile != null) chooser.setSelectedFile(new File(lastFile)); chooser.setFileFilter(fileFilters.get(filterIndex)); if (chooser.showOpenDialog(WindowManager.getDefault().getMainWindow()) == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); if (selectedFile == null || !selectedFile.exists()) { DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message( NbBundle.getMessage(LoadSnapshotAction.class, "MSG_Selected_file_does_not_exist"), // NOI18N NotifyDescriptor.ERROR_MESSAGE)); } else { FileFilter fileFilter = chooser.getFileFilter(); if (fileFilter.accept(selectedFile)) { lastFile = selectedFile.getAbsolutePath(); lastFilter = fileFilter.getDescription(); categories.get(fileFilters.indexOf(fileFilter)).openSnapshot(selectedFile); } else { DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message( NbBundle.getMessage(LoadSnapshotAction.class, "MSG_Selected_file_does_not_match_snapshot_type"), // NOI18N NotifyDescriptor.ERROR_MESSAGE)); } } } } private void updateEnabled(boolean lazily) { final boolean isEnabled = !RegisteredSnapshotCategories.sharedInstance().getOpenSnapshotCategories().isEmpty(); Runnable updater = new Runnable() { public void run() { setEnabled(isEnabled); } }; if (lazily) UISupport.runInEventDispatchThread(updater); else UISupport.runInEventDispatchThreadAndWait(updater); } private LoadSnapshotAction() { putValue(NAME, NbBundle.getMessage(LoadSnapshotAction.class, "LBL_Load1")); // NOI18N putValue(SHORT_DESCRIPTION, NbBundle.getMessage(LoadSnapshotAction.class, "LBL_Load_Snapshot")); // NOI18N putValue(SMALL_ICON, new ImageIcon(ICON)); putValue("iconBase", ICON_PATH); // NOI18N } }