blob: ad43e6f89498accbeceb2d51b528e8fe98bffd3d [file] [log] [blame]
/*
* Copyright (c) 2008, 2016, 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.
*
* 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.hotspot.igv.coordinator;
import com.sun.hotspot.igv.connection.Server;
import com.sun.hotspot.igv.coordinator.actions.*;
import com.sun.hotspot.igv.data.GraphDocument;
import com.sun.hotspot.igv.data.Group;
import com.sun.hotspot.igv.data.services.GroupCallback;
import java.awt.BorderLayout;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import org.openide.ErrorManager;
import org.openide.actions.GarbageCollectAction;
import org.openide.awt.Toolbar;
import org.openide.awt.ToolbarPool;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
import org.openide.explorer.view.BeanTreeView;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.util.NbBundle;
import org.openide.util.actions.NodeAction;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
/**
*
* @author Thomas Wuerthinger
*/
public final class OutlineTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
public static OutlineTopComponent instance;
public static final String PREFERRED_ID = "OutlineTopComponent";
private ExplorerManager manager;
private GraphDocument document;
private FolderNode root;
private Server server;
private Server binaryServer;
private OutlineTopComponent() {
initComponents();
setName(NbBundle.getMessage(OutlineTopComponent.class, "CTL_OutlineTopComponent"));
setToolTipText(NbBundle.getMessage(OutlineTopComponent.class, "HINT_OutlineTopComponent"));
document = new GraphDocument();
initListView();
initToolbar();
initReceivers();
}
private void initListView() {
manager = new ExplorerManager();
root = new FolderNode(document);
manager.setRootContext(root);
((BeanTreeView) this.treeView).setRootVisible(false);
associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
}
private void initToolbar() {
Toolbar toolbar = new Toolbar();
Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
toolbar.setBorder(b);
this.add(toolbar, BorderLayout.NORTH);
toolbar.add(ImportAction.get(ImportAction.class));
toolbar.add(((NodeAction) SaveAsAction.get(SaveAsAction.class)).createContextAwareInstance(this.getLookup()));
toolbar.add(SaveAllAction.get(SaveAllAction.class));
toolbar.add(((NodeAction) RemoveAction.get(RemoveAction.class)).createContextAwareInstance(this.getLookup()));
toolbar.add(RemoveAllAction.get(RemoveAllAction.class));
toolbar.add(GarbageCollectAction.get(GarbageCollectAction.class).getToolbarPresenter());
for (Toolbar tb : ToolbarPool.getDefault().getToolbars()) {
tb.setVisible(false);
}
}
private void initReceivers() {
final GroupCallback callback = new GroupCallback() {
@Override
public void started(Group g) {
synchronized(OutlineTopComponent.this) {
getDocument().addElement(g);
}
}
};
server = new Server(getDocument(), callback, false);
binaryServer = new Server(getDocument(), callback, true);
}
public void clear() {
document.clear();
root = new FolderNode(document);
manager.setRootContext(root);
}
@Override
public ExplorerManager getExplorerManager() {
return manager;
}
public GraphDocument getDocument() {
return document;
}
/**
* Gets default instance. Do not use directly: reserved for *.settings files only,
* i.e. deserialization routines; otherwise you could get a non-deserialized instance.
* To obtain the singleton instance, use {@link findInstance}.
*/
public static synchronized OutlineTopComponent getDefault() {
if (instance == null) {
instance = new OutlineTopComponent();
}
return instance;
}
/**
* Obtain the OutlineTopComponent instance. Never call {@link #getDefault} directly!
*/
public static synchronized OutlineTopComponent findInstance() {
TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
if (win == null) {
ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Outline component. It will not be located properly in the window system.");
return getDefault();
}
if (win instanceof OutlineTopComponent) {
return (OutlineTopComponent) win;
}
ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
return getDefault();
}
@Override
public int getPersistenceType() {
return TopComponent.PERSISTENCE_ALWAYS;
}
@Override
public void componentOpened() {
this.requestActive();
}
@Override
public void componentClosed() {
}
@Override
protected String preferredID() {
return PREFERRED_ID;
}
@Override
public void requestActive() {
super.requestActive();
treeView.requestFocus();
}
@Override
public boolean requestFocus(boolean temporary) {
treeView.requestFocus();
return super.requestFocus(temporary);
}
@Override
protected boolean requestFocusInWindow(boolean temporary) {
treeView.requestFocus();
return super.requestFocusInWindow(temporary);
}
@Override
public void resultChanged(LookupEvent lookupEvent) {
}
@Override
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
// Not called when user starts application for the first time
super.readExternal(objectInput);
((BeanTreeView) this.treeView).setRootVisible(false);
}
@Override
public void writeExternal(ObjectOutput objectOutput) throws IOException {
super.writeExternal(objectOutput);
}
static final class ResolvableHelper implements Serializable {
private static final long serialVersionUID = 1L;
public Object readResolve() {
return OutlineTopComponent.getDefault();
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
treeView = new BeanTreeView();
setLayout(new java.awt.BorderLayout());
add(treeView, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane treeView;
// End of variables declaration//GEN-END:variables
}