/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.desktop.ranking;
import java.awt.Component;
import org.gephi.ranking.api.TransformerUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import org.gephi.ranking.api.RankingUIModel;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
/**
*
* @author Mathieu Bastian
*/
public class RankingToolbar extends JToolBar {
private RankingUIModel model;
public RankingToolbar(RankingUIModel model) {
this.model = model;
initComponents();
initTransformersUI();
model.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("nodeTransformer")
|| evt.getPropertyName().equals("edgeTransformer")
|| evt.getPropertyName().equals("ranking")) {
refreshModel();
}
}
});
refreshModel();
}
private void refreshModel() {
boolean nodeSelected = model.getRanking() == RankingUIModel.NODE_RANKING;
boolean edgeSelected = !nodeSelected;
elementGroup.setSelected(nodeSelected ? nodeButton.getModel() : edgeButton.getModel(), true);
nodeTransformerGroup.clearSelection();
edgeTransformerGroup.clearSelection();
if (model.getNodeTransformer() == null) {
TransformerUI[] allTrans = Lookup.getDefault().lookupAll(TransformerUI.class).toArray(new TransformerUI[0]);
for(int i=0;i<allTrans.length;i++) {
TransformerUI t = allTrans[i];
if (t.isNodeTransformer()) {
model.setNodeTransformer(t.getTransformerClass());
break;
}
}
}
if (model.getEdgeTransformer() == null) {
TransformerUI[] allTrans = Lookup.getDefault().lookupAll(TransformerUI.class).toArray(new TransformerUI[0]);
for(int i=0;i<allTrans.length;i++) {
TransformerUI t = allTrans[i];
if (t.isEdgeTransformer()) {
model.setEdgeTransformer(t.getTransformerClass());
break;
}
}
}
for (Enumeration<AbstractButton> btns = nodeTransformerGroup.getElements(); btns.hasMoreElements();) {
AbstractButton btn = btns.nextElement();
btn.setVisible(nodeSelected);
if (model.getNodeTransformer() != null && btn.getName().equals(model.getNodeTransformer().getSimpleName())) {
nodeTransformerGroup.setSelected(btn.getModel(), true);
}
}
for (Enumeration<AbstractButton> btns = edgeTransformerGroup.getElements(); btns.hasMoreElements();) {
AbstractButton btn = btns.nextElement();
btn.setVisible(edgeSelected);
if (model.getEdgeTransformer() != null && btn.getName().equals(model.getEdgeTransformer().getSimpleName())) {
edgeTransformerGroup.setSelected(btn.getModel(), true);
}
}
}
private void initTransformersUI() {
nodeTransformerGroup = new ButtonGroup();
edgeTransformerGroup = new ButtonGroup();
List<TransformerUI> nodeTrans = new ArrayList<TransformerUI>();
List<TransformerUI> edgeTrans = new ArrayList<TransformerUI>();
TransformerUI[] allTrans = Lookup.getDefault().lookupAll(TransformerUI.class).toArray(new TransformerUI[0]);
for (TransformerUI t : allTrans) {
if (t.isNodeTransformer()) {
nodeTrans.add(t);
}
if (t.isEdgeTransformer()) {
edgeTrans.add(t);
}
}
for (final TransformerUI t : nodeTrans) {
JToggleButton btn = new JToggleButton(t.getIcon());
btn.setToolTipText(t.getName());
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.setNodeTransformer(t.getTransformerClass());
}
});
btn.setName(t.getTransformerClass().getSimpleName());
btn.setFocusPainted(false);
nodeTransformerGroup.add(btn);
add(btn);
}
for (final TransformerUI t : edgeTrans) {
JToggleButton btn = new JToggleButton(t.getIcon());
btn.setToolTipText(t.getName());
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.setEdgeTransformer(t.getTransformerClass());
}
});
btn.setName(t.getTransformerClass().getSimpleName());
btn.setFocusPainted(false);
edgeTransformerGroup.add(btn);
add(btn);
}
}
private void initComponents() {
elementGroup = new javax.swing.ButtonGroup();
nodeButton = new javax.swing.JToggleButton();
edgeButton = new javax.swing.JToggleButton();
nodeButton.setFocusPainted(false);
edgeButton.setFocusPainted(false);
box = new javax.swing.JLabel();
setFloatable(false);
setRollover(true);
Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
setBorder(b);
elementGroup.add(nodeButton);
nodeButton.setText(NbBundle.getMessage(RankingToolbar.class, "RankingToolbar.nodes.label"));
nodeButton.setEnabled(false);
add(nodeButton);
elementGroup.add(edgeButton);
edgeButton.setText(NbBundle.getMessage(RankingToolbar.class, "RankingToolbar.edges.label"));
edgeButton.setEnabled(false);
add(edgeButton);
addSeparator();
box.setMaximumSize(new java.awt.Dimension(32767, 32767));
add(box);
nodeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.setRanking(RankingUIModel.NODE_RANKING);
}
});
edgeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
model.setRanking(RankingUIModel.EDGE_RANKING);
}
});
}
@Override
public void setEnabled(final boolean enabled) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for (Component c : getComponents()) {
c.setEnabled(enabled);
}
}
});
}
private javax.swing.JLabel box;
private javax.swing.JToggleButton edgeButton;
private javax.swing.ButtonGroup elementGroup;
private javax.swing.ButtonGroup nodeTransformerGroup;
private javax.swing.ButtonGroup edgeTransformerGroup;
private javax.swing.JToggleButton nodeButton;
}