blob: e31eac9cae44313f17c463eff3288997cf124bbd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.maven.graph;
import org.netbeans.modules.java.graph.DependencyGraphScene;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidArtifactRTException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.dependency.tree.DependencyNode;
import org.netbeans.api.annotations.common.StaticResource;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.ui.OpenProjects;
import org.netbeans.core.spi.multiview.CloseOperationState;
import org.netbeans.core.spi.multiview.MultiViewElement;
import org.netbeans.core.spi.multiview.MultiViewElementCallback;
import org.netbeans.modules.maven.api.Constants;
import org.netbeans.modules.maven.api.NbMavenProject;
import static org.netbeans.modules.maven.graph.Bundle.*;
import org.netbeans.modules.maven.indexer.api.ui.ArtifactViewer;
import org.netbeans.modules.maven.indexer.spi.ui.ArtifactViewerFactory;
import org.netbeans.modules.maven.model.Utilities;
import org.netbeans.modules.maven.model.pom.POMModel;
import org.netbeans.modules.maven.spi.IconResources;
import org.openide.awt.Mnemonics;
import org.openide.filesystems.FileObject;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.util.NbBundle.Messages;
import org.openide.util.RequestProcessor;
import org.openide.util.WeakListeners;
import org.openide.util.lookup.ProxyLookup;
import org.openide.windows.TopComponent;
/**
* component showing graph of dependencies for project.
* @author Milos Kleint
*/
public class DependencyGraphTopComponent extends TopComponent implements LookupListener, MultiViewElement {
private static final @StaticResource String ZOOM_IN_ICON = "org/netbeans/modules/maven/graph/zoomin.gif";
private static final @StaticResource String ZOOM_OUT_ICON = "org/netbeans/modules/maven/graph/zoomout.gif";
private static final int COMPLEXITY_LIMIT = 30; //number of dependencies that are safe to show immediately
// public static final String ATTRIBUTE_DEPENDENCIES_LAYOUT = "MavenProjectDependenciesLayout"; //NOI18N
private static final Logger LOG = Logger.getLogger(DependencyGraphTopComponent.class.getName());
private static final RequestProcessor RP = new RequestProcessor(DependencyGraphTopComponent.class);
private boolean everDisplayed;
private boolean needsRefresh;
private final RequestProcessor.Task task_reload = RP.create(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Iterator<? extends MavenProject> it2 = result2.allInstances().iterator();
final MavenProject prj = it2.hasNext() ? it2.next() : null;
if (prj != null && NbMavenProject.isErrorPlaceholder(prj)) {
setPaneText(Err_CannotLoad(), false);
return;
}
if (prj != null) {
if (isVisible() || prj.getArtifacts().size() < COMPLEXITY_LIMIT) {
btnGraphActionPerformed(null);
return;
} else {
needsRefresh = true;
}
}
}
});
}
});
private final Map<Artifact, Icon> projectIcons;
@MultiViewElement.Registration(
displayName="#TAB_Graph",
iconBase=IconResources.ICON_DEPENDENCY_JAR,
persistenceType=TopComponent.PERSISTENCE_NEVER,
preferredID=ArtifactViewer.HINT_GRAPH,
mimeType=Constants.POM_MIME_TYPE,
position=100
)
@Messages("TAB_Graph=Graph")
public static MultiViewElement forPOM(final Lookup editor) {
class L extends ProxyLookup implements PropertyChangeListener {
Project p;
L() {
FileObject pom = editor.lookup(FileObject.class);
if (pom != null) {
p = FileOwnerQuery.getOwner(pom);
if (p != null) {
NbMavenProject nbmp = p.getLookup().lookup(NbMavenProject.class);
if (nbmp != null) {
nbmp.addPropertyChangeListener(WeakListeners.propertyChange(this, nbmp));
reset();
} else {
LOG.log(Level.WARNING, "not a Maven project: {0}", p);
}
} else {
LOG.log(Level.WARNING, "no owner of {0}", pom);
}
} else {
LOG.log(Level.WARNING, "no FileObject in {0}", editor);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (NbMavenProject.PROP_PROJECT.equals(evt.getPropertyName())) {
reset();
}
}
private void reset() {
ArtifactViewerFactory avf = Lookup.getDefault().lookup(ArtifactViewerFactory.class);
if (avf != null) {
Lookup l = null;
try {
l = avf.createLookup(p);
} catch (InvalidArtifactRTException e) {
// issue #258898
LOG.log(Level.WARNING, "problems while creating lookup for {" + p + "} : " + e.getMessage(), e);
}
if (l != null) {
setLookups(l);
} else {
LOG.log(Level.WARNING, "no artifact lookup for {0}", p);
}
} else {
LOG.warning("no ArtifactViewerFactory found");
}
}
}
return new DependencyGraphTopComponent(new L());
}
// private Project project;
private Lookup.Result<org.apache.maven.shared.dependency.tree.DependencyNode> result;
private Lookup.Result<MavenProject> result2;
private Lookup.Result<POMModel> result3;
private DependencyGraphScene<MavenDependencyNode> scene;
private MultiViewElementCallback callback;
final JScrollPane pane = new JScrollPane();
private Timer timer = new Timer(500, new ActionListener() {
@Override public void actionPerformed(ActionEvent arg0) {
checkFindValue();
}
});
private JToolBar toolbar;
@Messages({
"LBL_Scope_All=All",
"LBL_Scope_Compile=Compile",
"LBL_Scope_Runtime=Runtime",
"LBL_Scope_Test=Test"
})
public DependencyGraphTopComponent(Lookup lookup) {
if (LOG.isLoggable(Level.FINE)) {
LOG.log(Level.FINE, hashCode() + " created: " + lookup, new Exception());
}
projectIcons = getIconsForOpenProjects();
associateLookup(lookup);
initComponents();
// project = proj;
//sldDepth.getLabelTable().put(0, new JLabel(LBL_All())); LBL_All=All
timer.setDelay(500);
timer.setRepeats(false);
txtFind.getDocument().addDocumentListener(new DocumentListener() {
@Override public void insertUpdate(DocumentEvent arg0) {
timer.restart();
}
@Override public void removeUpdate(DocumentEvent arg0) {
timer.restart();
}
@Override public void changedUpdate(DocumentEvent arg0) {
timer.restart();
}
});
comScopes.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
int scopesSize = ((List<?>) value).size();
String msg;
if (scopesSize == 0) {
msg = LBL_Scope_All();
} else if (scopesSize == 2) {
msg = LBL_Scope_Compile();
} else if (scopesSize == 3) {
msg = LBL_Scope_Runtime();
} else {
msg = LBL_Scope_Test();
}
return super.getListCellRendererComponent(list, msg, index, isSelected, cellHasFocus);
}
});
DefaultComboBoxModel<List<String>> mdl = new DefaultComboBoxModel<>();
mdl.addElement(Arrays.asList(new String[0]));
mdl.addElement(Arrays.asList(new String[] {
Artifact.SCOPE_PROVIDED,
Artifact.SCOPE_COMPILE
}));
mdl.addElement(Arrays.asList(new String[] {
Artifact.SCOPE_PROVIDED,
Artifact.SCOPE_COMPILE,
Artifact.SCOPE_RUNTIME
}));
mdl.addElement(Arrays.asList(new String[] {
Artifact.SCOPE_PROVIDED,
Artifact.SCOPE_COMPILE,
Artifact.SCOPE_RUNTIME,
Artifact.SCOPE_TEST
}));
comScopes.setModel(mdl);
comScopes.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
if (scene != null) {
@SuppressWarnings("unchecked")
List<String> selected = (List<String>) comScopes.getSelectedItem();
ScopesVisitor vis = new ScopesVisitor(scene, selected);
vis.accept(scene.getRootGraphNode().getImpl());
scene.validate();
scene.repaint();
revalidate();
repaint();
}
}
});
if( "Aqua".equals(UIManager.getLookAndFeel().getID()) ) { //NOI18N
setBackground(UIManager.getColor("NbExplorerView.background")); //NOI18N
}
}
private void checkFindValue() {
String val = txtFind.getText().trim();
if ("".equals(val)) { //NOI18N
val = null;
}
scene.setSearchString(val);
}
@Override
public int getPersistenceType() {
return TopComponent.PERSISTENCE_NEVER;
}
@Override public void componentOpened() {
super.componentOpened();
pane.setWheelScrollingEnabled(true);
add(pane, BorderLayout.CENTER);
result = getLookup().lookupResult(org.apache.maven.shared.dependency.tree.DependencyNode.class);
result.addLookupListener(this);
result2 = getLookup().lookupResult(MavenProject.class);
result2.addLookupListener(this);
result3 = getLookup().lookupResult(POMModel.class);
result3.addLookupListener(this);
waitForApproval();
}
@Override
public void componentActivated() {
super.componentActivated();
if(needsRefresh) {
needsRefresh = false;
btnGraphActionPerformed(null);
}
}
@Override
public void componentClosed() {
super.componentClosed();
}
@Override
public void componentDeactivated() {
super.componentDeactivated();
}
@Override
public void componentHidden() {
super.componentHidden();
}
@Override
public void componentShowing() {
super.componentShowing();
}
/** 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() {
jPanel1 = new javax.swing.JPanel();
jToolBar1 = new javax.swing.JToolBar();
btnGraph = new javax.swing.JButton();
btnBigger = new javax.swing.JButton();
btnSmaller = new javax.swing.JButton();
lblFind = new javax.swing.JLabel();
txtFind = new javax.swing.JTextField();
lblPath = new javax.swing.JLabel();
maxPathSpinner = new javax.swing.JSpinner();
lblScopes = new javax.swing.JLabel();
comScopes = new javax.swing.JComboBox();
setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
jToolBar1.setFloatable(false);
jToolBar1.setRollover(true);
org.openide.awt.Mnemonics.setLocalizedText(btnGraph, org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.btnGraph.text")); // NOI18N
btnGraph.setFocusable(false);
btnGraph.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnGraph.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnGraph.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnGraphActionPerformed(evt);
}
});
jToolBar1.add(btnGraph);
btnBigger.setIcon(ImageUtilities.loadImageIcon(ZOOM_IN_ICON, true));
btnBigger.setFocusable(false);
btnBigger.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnBigger.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnBigger.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnBiggerActionPerformed(evt);
}
});
jToolBar1.add(btnBigger);
btnSmaller.setIcon(ImageUtilities.loadImageIcon(ZOOM_OUT_ICON, true));
btnSmaller.setFocusable(false);
btnSmaller.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnSmaller.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnSmaller.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSmallerActionPerformed(evt);
}
});
jToolBar1.add(btnSmaller);
org.openide.awt.Mnemonics.setLocalizedText(lblFind, org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.lblFind.text")); // NOI18N
jToolBar1.add(lblFind);
txtFind.setMaximumSize(new java.awt.Dimension(200, 22));
txtFind.setMinimumSize(new java.awt.Dimension(50, 19));
txtFind.setPreferredSize(new java.awt.Dimension(150, 22));
txtFind.setFont(new Font("Arial", java.awt.Font.PLAIN, 11));
jToolBar1.add(txtFind);
jPanel1.add(jToolBar1);
lblPath.setLabelFor(maxPathSpinner);
org.openide.awt.Mnemonics.setLocalizedText(lblPath, org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.lblPath.text")); // NOI18N
lblPath.setToolTipText(org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.maxPathSpinner.toolTipText")); // NOI18N
jPanel1.add(lblPath);
maxPathSpinner.setModel(new javax.swing.SpinnerNumberModel(1, 1, 5, 1));
maxPathSpinner.setToolTipText(org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.maxPathSpinner.toolTipText")); // NOI18N
maxPathSpinner.setRequestFocusEnabled(false);
maxPathSpinner.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
maxPathSpinnerStateChanged(evt);
}
});
jPanel1.add(maxPathSpinner);
org.openide.awt.Mnemonics.setLocalizedText(lblScopes, org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.lblScopes.text")); // NOI18N
jPanel1.add(lblScopes);
jPanel1.add(comScopes);
add(jPanel1, java.awt.BorderLayout.NORTH);
}// </editor-fold>//GEN-END:initComponents
private void btnSmallerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSmallerActionPerformed
scene.setMyZoomFactor(scene.getZoomFactor() * 0.8);
scene.validate();
scene.repaint();
if (!pane.getHorizontalScrollBar().isVisible() &&
!pane.getVerticalScrollBar().isVisible()) {
revalidate();
repaint();
}
}//GEN-LAST:event_btnSmallerActionPerformed
private void btnBiggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBiggerActionPerformed
scene.setMyZoomFactor(scene.getZoomFactor() * 1.2);
scene.validate();
scene.repaint();
if (pane.getHorizontalScrollBar().isVisible() ||
pane.getVerticalScrollBar().isVisible()) {
revalidate();
repaint();
}
}//GEN-LAST:event_btnBiggerActionPerformed
private void maxPathSpinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_maxPathSpinnerStateChanged
scene.highlightDepth(getSelectedDepth());
}//GEN-LAST:event_maxPathSpinnerStateChanged
private void btnGraphActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGraphActionPerformed
btnGraph.setEnabled(false);
createScene();
}//GEN-LAST:event_btnGraphActionPerformed
private int getSelectedDepth() {
return ((SpinnerNumberModel)maxPathSpinner.getModel()).getNumber().intValue();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnBigger;
private javax.swing.JButton btnGraph;
private javax.swing.JButton btnSmaller;
private javax.swing.JComboBox comScopes;
private javax.swing.JPanel jPanel1;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JLabel lblFind;
private javax.swing.JLabel lblPath;
private javax.swing.JLabel lblScopes;
private javax.swing.JSpinner maxPathSpinner;
private javax.swing.JTextField txtFind;
// End of variables declaration//GEN-END:variables
private boolean expectingChanges;
void saveChanges(POMModel model) throws IOException {
LOG.log(Level.FINE, "{0} saveChanges...", hashCode());
assert !expectingChanges;
expectingChanges = true;
try {
Utilities.saveChanges(model);
} finally {
expectingChanges = false;
LOG.log(Level.FINE, "{0} saveChanges...done", hashCode());
}
}
@Override
public void resultChanged(LookupEvent ev) {
if (expectingChanges) {
LOG.log(Level.FINE, "{0} expecting change", hashCode());
return;
}
LOG.log(Level.FINE, hashCode() + " not expecting change", new Exception());
task_reload.schedule(200); // aggregate the events, multiple will be often coming close one by another..
}
JScrollPane getScrollPane () {
return pane;
}
@Messages({
"LBL_waiting_for_approval_first_time=Click Show Graph to compute and display dependencies.",
"LBL_waiting_for_approval_dirty=Model has changed. Click Show Graph to refresh."
})
private void waitForApproval() {
setPaneText(everDisplayed ? LBL_waiting_for_approval_dirty() : LBL_waiting_for_approval_first_time(), false);
btnGraph.setEnabled(true);
maxPathSpinner.setEnabled(false);
maxPathSpinner.setVisible(false);
lblPath.setVisible(false);
txtFind.setEnabled(false);
btnBigger.setEnabled(false);
btnSmaller.setEnabled(false);
comScopes.setEnabled(false);
}
@Messages({
"Err_CannotLoad=Cannot display Artifact's dependency tree.",
"LBL_Loading=Loading and constructing graph (this may take a while)."
})
private void createScene() {
Iterator<? extends org.apache.maven.shared.dependency.tree.DependencyNode> it1 = result.allInstances().iterator();
Iterator<? extends MavenProject> it2 = result2.allInstances().iterator();
Iterator<? extends POMModel> it3 = result3.allInstances().iterator();
final MavenProject prj = it2.hasNext() ? it2.next() : null;
if (prj != null && NbMavenProject.isErrorPlaceholder(prj)) {
setPaneText(Err_CannotLoad(), false);
return;
}
Optional.ofNullable(scene)
.ifPresent((s) -> s.resetHighlight());
everDisplayed = true;
setPaneText(LBL_Loading(), true);
final Project nbProj = getLookup().lookup(Project.class);
if (prj != null && it1.hasNext()) {
final MavenDependencyNode root = new MavenDependencyNode(it1.next());
final POMModel model = it3.hasNext() ? it3.next() : null;
RP.post(new Runnable() {
@Override public void run() {
DependencyGraphScene.VersionProvider<MavenDependencyNode> versionProvider = new DependencyGraphScene.VersionProvider<MavenDependencyNode>() {
@Override
public String getVersion(MavenDependencyNode dependencyNode) {
return dependencyNode.getVersion();
}
@Override
public int compareVersions(MavenDependencyNode dependencyNode1, MavenDependencyNode dependencyNode2) {
return dependencyNode1.compareVersions(dependencyNode2);
}
@Override
public boolean isOmmitedForConflict(MavenDependencyNode dependencyNode) {
return dependencyNode.getState() == DependencyNode.OMITTED_FOR_CONFLICT;
}
@Override
public boolean isIncluded(MavenDependencyNode dependencyNode) {
return dependencyNode.getState() == DependencyNode.INCLUDED;
}
};
DependencyGraphScene.PaintingProvider<MavenDependencyNode> pp = new DependencyGraphScene.PaintingProvider<MavenDependencyNode>() {
@Override
public Icon getIcon(MavenDependencyNode node) {
return DependencyGraphTopComponent.this.getIcon(node);
}
@Override
public boolean isVisible(MavenDependencyNode node) {
return true;
}
@Override
public boolean isVisible(MavenDependencyNode source, MavenDependencyNode target) {
return true;
}
@Override
public Color getColor(MavenDependencyNode node) {
return node.getScopeColor();
}
@Override
public Stroke getStroke(MavenDependencyNode source, MavenDependencyNode target) {
return null;
}
};
GraphConstructor constr = new GraphConstructor(prj);
constr.accept(root);
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
final DependencyGraphScene<MavenDependencyNode> scene2 = new DependencyGraphScene<>(
new MavenActionsProvider(DependencyGraphTopComponent.this, nbProj, model),
DependencyGraphTopComponent.this::getSelectedDepth,
versionProvider,
pp);
constr.updateScene(scene2);
scene = scene2;
JComponent sceneView = scene.getView();
if (sceneView == null) {
sceneView = scene.createView();
// vlv: print
sceneView.putClientProperty("print.printable", true); // NOI18N
}
pane.setViewportView(sceneView);
scene.setSurroundingScrollPane(pane);
scene.initialLayout();
scene.setSelectedObjects(Collections.singleton(scene.getRootGraphNode()));
txtFind.setEnabled(true);
btnBigger.setEnabled(true);
btnSmaller.setEnabled(true);
comScopes.setEnabled(true);
if (scene.getMaxNodeDepth() > 1) {
lblPath.setVisible(true);
((SpinnerNumberModel)maxPathSpinner.getModel()).
setMaximum(Integer.valueOf(scene.getMaxNodeDepth()));
maxPathSpinner.setEnabled(true);
maxPathSpinner.setVisible(true);
}
scene.highlightDepth(getSelectedDepth());
}
});
}
});
} else {
LOG.log(Level.WARNING, "{0} missing DependencyNode and/or Project", hashCode());
}
}
@Override
public JComponent getVisualRepresentation() {
jPanel1.removeAll();
jToolBar1.removeAll();
return this;
}
public static class EditorToolbar extends org.openide.awt.Toolbar {
public EditorToolbar() {
Border b = UIManager.getBorder("Nb.Editor.Toolbar.border"); //NOI18N
setBorder(b);
if( "Aqua".equals(UIManager.getLookAndFeel().getID()) ) { //NOI18N
setBackground(UIManager.getColor("NbExplorerView.background")); //NOI18N
}
}
@Override
public String getUIClassID() {
if( UIManager.get("Nb.Toolbar.ui") != null ) { //NOI18N
return "Nb.Toolbar.ui"; //NOI18N
}
return super.getUIClassID();
}
@Override
public String getName() {
return "editorToolbar"; //NOI18N
}
}
@Override
public JComponent getToolbarRepresentation() {
if (toolbar == null) {
toolbar = new EditorToolbar();
toolbar.setFloatable(false);
toolbar.setRollover(true);
// Action[] a = new Action[1];
// Action[] actions = getLookup().lookup(a.getClass());
// for (Action act : actions) {
// JButton btn = new JButton();
// Actions.connect(btn, act);
// toolbar.add(btn);
// }
toolbar.addSeparator();
Dimension space = new Dimension(3, 0);
toolbar.add(btnGraph);
toolbar.addSeparator(space);
toolbar.add(btnBigger);
toolbar.addSeparator(space);
toolbar.add(btnSmaller);
toolbar.addSeparator(space);
toolbar.add(lblFind);
toolbar.add(txtFind);
toolbar.addSeparator(space);
toolbar.add(lblPath);
toolbar.add(maxPathSpinner);
toolbar.addSeparator(space);
toolbar.add(lblScopes);
toolbar.add(comScopes);
}
return toolbar;
}
@Override public void setMultiViewCallback(MultiViewElementCallback callback) {
this.callback = callback;
}
@Override public CloseOperationState canCloseElement() {
return CloseOperationState.STATE_OK;
}
private void setPaneText(String text, boolean progress) {
JComponent vView;
if (progress) {
JPanel panel = new JPanel();
JProgressBar pb = new JProgressBar();
JLabel lbl = new JLabel();
panel.setLayout(new java.awt.GridBagLayout());
panel.setOpaque(false);
pb.setIndeterminate(true);
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
panel.add(pb, gridBagConstraints);
Mnemonics.setLocalizedText(lbl, text);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
panel.add(lbl, gridBagConstraints);
vView = panel;
} else {
JLabel lbl = new JLabel(text);
lbl.setHorizontalAlignment(JLabel.CENTER);
lbl.setVerticalAlignment(JLabel.CENTER);
vView = lbl;
}
pane.setViewportView(vView);
}
public Icon getIcon(MavenDependencyNode n) {
return projectIcons.get(n.getArtifact());
}
/**
* @return map of maven artifact mapped to project icon
*/
private Map<Artifact, Icon> getIconsForOpenProjects() {
Map<Artifact, Icon> result = new HashMap<Artifact, Icon>();
//NOTE: surely not the best way to get the project icon
Project[] openProjects = OpenProjects.getDefault().getOpenProjects();
for (Project project : openProjects) {
NbMavenProject mavenProject = project.getLookup().lookup(NbMavenProject.class);
if (null != mavenProject) {
Artifact artifact = mavenProject.getMavenProject().getArtifact();
//get icon from opened project
Icon icon = ProjectUtils.getInformation(project).getIcon();
if (null != icon) {
result.put(artifact, icon);
}
}
}
return result;
}
}