/*
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.perspective;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.JToggleButton;
import org.gephi.desktop.perspective.spi.Perspective;
import org.gephi.desktop.perspective.spi.PerspectiveMember;
import org.gephi.ui.utils.UIUtils;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
//import org.openide.util.ImageUtilities;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.windows.TopComponentGroup;
@ConvertAsProperties(dtd = "-//org.gephi.desktop.perspective//Banner//EN",
autostore = false)
public final class BannerTopComponent extends TopComponent {
private static BannerTopComponent instance;
/** path to the icon used by the component and its open action */
// static final String ICON_PATH = "SET/PATH/TO/ICON/HERE";
private static final String PREFERRED_ID = "BannerTopComponent";
private String selectedPerspective;
private transient JToggleButton[] buttons;
public BannerTopComponent() {
initComponents();
setName(NbBundle.getMessage(BannerTopComponent.class, "CTL_BannerTopComponent"));
putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_DRAGGING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_MAXIMIZATION_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_SLIDING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_UNDOCKING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_KEEP_PREFERRED_SIZE_WHEN_SLIDED_IN, Boolean.TRUE);
addGroupTabs();
logoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {
try {
java.net.URI uri = new java.net.URI("http://gephi.org");
desktop.browse(uri);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
setPreferredSize(new Dimension(100, 30));
}
@Override
public Dimension getMinimumSize() {
return new Dimension(10, 30);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(32000, 30);
}
private void addGroupTabs() {
final Perspective[] perspectives = Lookup.getDefault().lookupAll(Perspective.class).toArray(new Perspective[0]);
buttons = new JPerspectiveButton[perspectives.length];
int i = 0;
//Add tabs
for (final Perspective perspective : perspectives) {
JPerspectiveButton toggleButton = new JPerspectiveButton(perspective.getDisplayName(), perspective.getIcon());
toggleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Close other perspective
for (Perspective g : perspectives) {
if (g != perspective) {
TopComponentGroup tpg = WindowManager.getDefault().findTopComponentGroup(g.getName());
tpg.close();
}
}
//Open perspective
TopComponentGroup tpg = WindowManager.getDefault().findTopComponentGroup(perspective.getName());
tpg.open();
PerspectiveMember[] members = Lookup.getDefault().lookupAll(PerspectiveMember.class).toArray(new PerspectiveMember[0]);
//Close members
Perspective closingPerspective = getPerspective(selectedPerspective);
for (PerspectiveMember member : members) {
if (member.close(closingPerspective)) {
if (member instanceof TopComponent) {
boolean closed = ((TopComponent) member).close();
//System.out.println("Close "+member+" : "+closed);
}
}
}
//Open members
for (PerspectiveMember member : members) {
if (member.open(perspective)) {
if (member instanceof TopComponent && !((TopComponent) member).isOpened()) {
((TopComponent) member).open();
//System.out.println("Open "+member);
}
}
}
selectedPerspective = perspective.getName();
}
});
perspectivesButtonGroup.add(toggleButton);
buttonsPanel.add(toggleButton);
buttons[i++] = toggleButton;
}
refreshSelectedPerspective();
}
//Not working
/*public void reset() {
refreshSelectedPerspective();
for (final Perspective group : Lookup.getDefault().lookupAll(Perspective.class).toArray(new Perspective[0])) {
TopComponentGroup tpg = WindowManager.getDefault().findTopComponentGroup(group.getName());
if (group.getName().equals(selectedPerspective)) {
tpg.open();
} else {
tpg.close();
}
}
}*/
private void refreshSelectedPerspective() {
Perspective[] perspectives = Lookup.getDefault().lookupAll(Perspective.class).toArray(new Perspective[0]);
if (selectedPerspective == null) {
perspectivesButtonGroup.setSelected(buttons[0].getModel(), true);
selectedPerspective = perspectives[0].getName();
} else {
for (int j = 0; j < perspectives.length; j++) {
String groupName = perspectives[j].getName();
if (selectedPerspective.equals(groupName)) {
perspectivesButtonGroup.setSelected(buttons[j].getModel(), true);
}
}
}
}
private Perspective getPerspective(String name) {
for (Perspective p : Lookup.getDefault().lookupAll(Perspective.class)) {
if (p.getName().equals(name)) {
return p;
}
}
return null;
}
/** 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() {
java.awt.GridBagConstraints gridBagConstraints;
perspectivesButtonGroup = new javax.swing.ButtonGroup();
mainPanel = new javax.swing.JPanel();
logoButton = new javax.swing.JButton();
groupsPanel = new javax.swing.JPanel();
buttonsPanel = new javax.swing.JPanel();
bannerBackground = new javax.swing.JLabel();
setBackground(new java.awt.Color(255, 255, 255));
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setLayout(new java.awt.BorderLayout());
mainPanel.setBackground(new java.awt.Color(255, 255, 255));
mainPanel.setLayout(new java.awt.GridBagLayout());
logoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/perspective/resources/logo_std.png"))); // NOI18N
logoButton.setToolTipText(org.openide.util.NbBundle.getMessage(BannerTopComponent.class, "BannerTopComponent.logoButton.toolTipText")); // NOI18N
logoButton.setBorder(null);
logoButton.setBorderPainted(false);
logoButton.setContentAreaFilled(false);
logoButton.setFocusPainted(false);
logoButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
logoButton.setPressedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/perspective/resources/logo_glow.png"))); // NOI18N
logoButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/perspective/resources/logo_glow.png"))); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
mainPanel.add(logoButton, gridBagConstraints);
groupsPanel.setBackground(new java.awt.Color(255, 255, 255));
groupsPanel.setLayout(new java.awt.GridBagLayout());
buttonsPanel.setBackground(new java.awt.Color(255, 255, 255));
buttonsPanel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
buttonsPanel.setOpaque(false);
buttonsPanel.setPreferredSize(new java.awt.Dimension(10, 25));
buttonsPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
groupsPanel.add(buttonsPanel, gridBagConstraints);
bannerBackground.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/perspective/resources/bannerback.png"))); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
groupsPanel.add(bannerBackground, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
mainPanel.add(groupsPanel, gridBagConstraints);
add(mainPanel, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void logoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_logoButtonActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_logoButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel bannerBackground;
private javax.swing.JPanel buttonsPanel;
private javax.swing.JPanel groupsPanel;
private javax.swing.JButton logoButton;
private javax.swing.JPanel mainPanel;
private javax.swing.ButtonGroup perspectivesButtonGroup;
// End of variables declaration//GEN-END:variables
/**
* 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 BannerTopComponent getDefault() {
if (instance == null) {
instance = new BannerTopComponent();
}
return instance;
}
/**
* Obtain the BannerTopComponent instance. Never call {@link #getDefault} directly!
*/
public static synchronized BannerTopComponent findInstance() {
TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
if (win == null) {
Logger.getLogger(BannerTopComponent.class.getName()).warning(
"Cannot find " + PREFERRED_ID + " component. It will not be located properly in the window system.");
return getDefault();
}
if (win instanceof BannerTopComponent) {
return (BannerTopComponent) win;
}
Logger.getLogger(BannerTopComponent.class.getName()).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() {
// TODO add custom code on component opening
}
@Override
public void componentClosed() {
// TODO add custom code on component closing
}
void writeProperties(java.util.Properties p) {
// better to version settings since initial version as advocated at
// http://wiki.apidesign.org/wiki/PropertyFiles
p.setProperty("version", "1.0");
p.setProperty("selectedGroup", selectedPerspective);
}
Object readProperties(java.util.Properties p) {
if (instance == null) {
instance = this;
}
instance.readPropertiesImpl(p);
return instance;
}
private void readPropertiesImpl(java.util.Properties p) {
String version = p.getProperty("version");
selectedPerspective = p.getProperty("selectedGroup");
refreshSelectedPerspective();
}
@Override
protected String preferredID() {
return PREFERRED_ID;
}
private static class JPerspectiveButton extends JToggleButton {
public JPerspectiveButton(String text, Icon icon) {
setText(text);
setBorder(null);
setBorderPainted(false);
setContentAreaFilled(false);
setFocusPainted(false);
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
if (UIUtils.isWindowsLookAndFeel()) {
setIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/vista-enabled.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setRolloverIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/vista-mousover.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setSelectedIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/vista-selected.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
} else if (UIUtils.isAquaLookAndFeel()) {
setIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/aqua-enabled.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setRolloverIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/aqua-mouseover.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setSelectedIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/aqua-selected.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
} else {
setIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/nimbus-enabled.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setRolloverIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/nimbus-mouseover.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
setSelectedIcon(ImageUtilities.image2Icon(ImageUtilities.mergeImages(ImageUtilities.loadImage("org/gephi/desktop/perspective/resources/nimbus-selected.png"),
ImageUtilities.icon2Image(icon), 6, 3)));
}
}
}
}