
org.tango.pogo.gui.MultiClassesPanel Maven / Gradle / Ivy
The newest version!
//+======================================================================
// $Source: $
//
// Project: Tango
//
// Description: java source code for main swing class.
//
// $Author: verdier $
//
// Copyright (C) : 2004,2005,2006,2007,2008,2009,2009,2010,2011,2012,2013,2014
// European Synchrotron Radiation Facility
// BP 220, Grenoble 38043
// FRANCE
//
// This file is part of Tango.
//
// Tango is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Tango 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 for more details.
//
// You should have received a copy of the GNU General Public License
// along with Tango. If not, see .
//
// $Revision: $
// $Date: $
//
// $HeadURL: $
//
//-======================================================================
package org.tango.pogo.gui;
import org.tango.pogo.pogoDsl.OneClassSimpleDef;
import org.tango.pogo.pogoDsl.PogoMultiClasses;
import fr.esrf.tangoatk.widget.util.ATKGraphicsUtils;
import org.eclipse.emf.common.util.EList;
import org.tango.pogo.gui.packaging.ConfigurePackagingDialog;
import org.tango.pogo.gui.packaging.Packaging;
import org.tango.pogo.gui.tools.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
//=======================================================
/**
* JFrame Class to display info
*
* @author Pascal Verdier
*/
//=======================================================
public class MultiClassesPanel extends JFrame {
private JFrame parent;
static private JFileChooser chooser = null;
static public String homeDir;
private MultiClassesTree tree;
private JScrollPane scrollPane;
private List topButtons = new ArrayList<>();
private static final int TOP_RELOAD = 0;
private static final int TOP_NEW = 1;
private static final int TOP_OPEN = 2;
private static final int TOP_GENE = 3;
private static final PogoFileFilter pogoFilter = new PogoFileFilter("xmi", "Multi Classes");
//=======================================================
/**
* Creates new form MultiClassesPanel
*
* @param parent JFrame parent instance
* @param fileName xmi file to be loaded (if not null).
* @throws PogoException in case of Site Property not found
*/
//=======================================================
public MultiClassesPanel(JFrame parent, String fileName) throws PogoException {
this.parent = parent;
initComponents();
PogoProperty.init(); // Load them
customizeMenus();
initOwnComponents();
checkLoadAtStartup(fileName);
// Set the PogoGUI instance to do not close this when PogoGUI is closed !!!
PogoGUI.multiClassesPanel = this;
packageItem.setVisible(Packaging.isAvailable());
pack();
ATKGraphicsUtils.centerFrameOnScreen(this);
}
//===========================================================
//===========================================================
private void checkLoadAtStartup(String filename) {
try {
if (filename != null && filename.length() > 0)
loadXmiFile(filename);
else {
String xmiFile = Utils.getXmiFile(PogoConst.MultiClasses);
if (xmiFile != null) {
openItemActionPerformed(null);
} else
if (PogoProperty.loadPrevious) {
if (PogoProperty.multiClassProjectHistory.size() > 0)
loadXmiFile(PogoProperty.multiClassProjectHistory.get(0));
}
}
}
catch(PogoException e) {
System.err.println(e.getMessage());
}
}
//=======================================================
//=======================================================
private void initOwnComponents() {
setTitle("Multi TANGO Classes Code Generator - " + Utils.getInstance().getImplementationVersion());
// Build users_tree to display info
scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(350, 450));
getContentPane().add(scrollPane, BorderLayout.CENTER);
// Initialize file chooser
homeDir = System.getenv("SOURCE_PATH");
if (homeDir == null) {
homeDir = System.getProperty("SOURCE_PATH");
if (homeDir == null)
homeDir = new File("").getAbsolutePath();
}
chooser = new JFileChooser(new File(homeDir).getAbsolutePath());
chooser.setFileFilter(pogoFilter);
setIconImage(Utils.getInstance().logoIcon.getImage());
Utils utils = Utils.getInstance();
addTopPanelButton(utils.reloadIcon, "Reload Server");
addTopPanelButton(utils.newIcon, "New Server");
addTopPanelButton(utils.openIcon, "Open Server");
addTopPanelButton(utils.saveIcon, "Generate Server");
}
//=======================================================
//=======================================================
private void addTopPanelButton(ImageIcon icon, String tip) {
JButton btn = new JButton(icon);
btn.setToolTipText(Utils.buildToolTip(tip));
btn.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
btn.addActionListener(this::topButtonActionPerformed);
topPanel.add(btn);
topButtons.add(btn);
}
//=======================================================
//=======================================================
private void customizeMenus() {
fileMenu.setMnemonic('F');
newItem.setMnemonic('N');
newItem.setAccelerator(KeyStroke.getKeyStroke('N', MouseEvent.CTRL_MASK));
openItem.setMnemonic('O');
openItem.setAccelerator(KeyStroke.getKeyStroke('O', MouseEvent.CTRL_MASK));
generateItem.setMnemonic('G');
generateItem.setAccelerator(KeyStroke.getKeyStroke('G', MouseEvent.CTRL_MASK));
exitItem.setMnemonic('E');
exitItem.setAccelerator(KeyStroke.getKeyStroke('Q', MouseEvent.CTRL_MASK));
editMenu.setMnemonic('E');
addItem.setMnemonic('A');
addItem.setAccelerator(KeyStroke.getKeyStroke('A', MouseEvent.CTRL_MASK));
removeItem.setMnemonic('R');
removeItem.setAccelerator(KeyStroke.getKeyStroke(Event.DELETE, 0));
helpMenu.setMnemonic('H');
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyStroke.getKeyStroke('H', MouseEvent.CTRL_MASK));
manageRecentMenu(null);
}
//=======================================================
//=======================================================
private void manageRecentMenu(String new_proj) {
try {
// Check if there is something to manage.
if (new_proj == null && PogoProperty.projectHistory.size() == 0) // No project histo
return;
if (new_proj != null)
PogoProperty.addProject(new_proj, PogoConst.MULTI_CLASS);
// If project history available add it in recent menu
recentMenu.removeAll();
for (String project : PogoProperty.multiClassProjectHistory) {
JMenuItem item = new JMenuItem(project);
item.addActionListener(this::recentItemActionPerformed);
recentMenu.add(item);
}
} catch (Exception e) {
System.err.println("\nWARNING: " + e);
}
}
//=======================================================
/**
* 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.
*/
//=======================================================
// //GEN-BEGIN:initComponents
private void initComponents() {
topPanel = new javax.swing.JPanel();
javax.swing.JMenuBar jMenuBar1 = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
newItem = new javax.swing.JMenuItem();
openItem = new javax.swing.JMenuItem();
recentMenu = new javax.swing.JMenu();
javax.swing.JMenuItem dummyItem = new javax.swing.JMenuItem();
generateItem = new javax.swing.JMenuItem();
packageItem = new javax.swing.JMenuItem();
exitItem = new javax.swing.JMenuItem();
editMenu = new javax.swing.JMenu();
addItem = new javax.swing.JMenuItem();
removeItem = new javax.swing.JMenuItem();
helpMenu = new javax.swing.JMenu();
helpItem = new javax.swing.JMenuItem();
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
topPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
getContentPane().add(topPanel, java.awt.BorderLayout.NORTH);
fileMenu.setText("File");
newItem.setText("New");
newItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newItemActionPerformed(evt);
}
});
fileMenu.add(newItem);
openItem.setText("Open");
openItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openItemActionPerformed(evt);
}
});
fileMenu.add(openItem);
recentMenu.setText("Open Recent");
dummyItem.setText("...");
recentMenu.add(dummyItem);
fileMenu.add(recentMenu);
generateItem.setText("Generate");
generateItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
generateItemActionPerformed(evt);
}
});
fileMenu.add(generateItem);
packageItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK));
packageItem.setText("Export Package");
packageItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
packageItemActionPerformed(evt);
}
});
fileMenu.add(packageItem);
exitItem.setText("Exit");
exitItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exitItemActionPerformed(evt);
}
});
fileMenu.add(exitItem);
jMenuBar1.add(fileMenu);
editMenu.setText("Edit");
editMenu.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
editMenuStateChanged(evt);
}
});
addItem.setText("Add Class");
addItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addItemActionPerformed(evt);
}
});
editMenu.add(addItem);
removeItem.setText("Remove class");
removeItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeItemActionPerformed(evt);
}
});
editMenu.add(removeItem);
jMenuBar1.add(editMenu);
helpMenu.setText("help");
helpItem.setText("On Multi Class Manager");
helpItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpItemActionPerformed(evt);
}
});
helpMenu.add(helpItem);
jMenuBar1.add(helpMenu);
setJMenuBar(jMenuBar1);
pack();
}// //GEN-END:initComponents
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void topButtonActionPerformed(java.awt.event.ActionEvent evt) {
JButton src = (JButton) evt.getSource();
for (int i = 0; i < topButtons.size(); i++)
if (topButtons.get(i) == src)
switch (i) {
case TOP_RELOAD:
if (tree != null)
reloadProject();
break;
case TOP_NEW:
newItemActionPerformed(evt);
break;
case TOP_OPEN:
openItemActionPerformed(evt);
break;
case TOP_GENE:
if (tree != null)
generateItemActionPerformed(evt);
break;
}
}
//=======================================================
//=======================================================
private void reloadProject() {
if (checkModifications() == JOptionPane.OK_OPTION) {
String filename = tree.getServerFileName();
if (filename != null) {
try {
loadXmiFile(filename);
} catch (PogoException e) {
e.popup(this);
}
}
}
}
//=======================================================
//=======================================================
private void recentItemActionPerformed(java.awt.event.ActionEvent evt) {
try {
String proj_name = ((JMenuItem) evt.getSource()).getText();
loadXmiFile(proj_name);
} catch (PogoException e) {
e.popup(this);
}
}
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void openItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openItemActionPerformed
if (chooser == null) {
chooser = new JFileChooser(new File("").getAbsolutePath());
}
int returnValue = chooser.showOpenDialog(this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
if (file != null) {
if (!file.isDirectory()) {
String filename = file.getAbsolutePath();
try {
loadXmiFile(filename);
} catch (PogoException e) {
e.popup(this);
}
}
}
}
}//GEN-LAST:event_openItemActionPerformed
//===============================================================
//===============================================================
public PogoMultiClasses loadXmiFile(String xmiFileName) throws PogoException {
PogoMultiClasses multiClasses = OAWutils.getInstance().loadMultiClassesModel(xmiFileName);
multiClasses.setSourcePath(Utils.getPath(xmiFileName));
buildTree(multiClasses);
manageRecentMenu(xmiFileName);
return multiClasses;
}
//=======================================================
//=======================================================
private void buildTree(PogoMultiClasses multiClasses) {
try {
tree = new MultiClassesTree(this, multiClasses);
scrollPane.setViewportView(tree);
} catch (PogoException e) {
/* Has been canceled */
}
}
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void exitItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitItemActionPerformed
doClose();
}//GEN-LAST:event_exitItemActionPerformed
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
doClose();
}//GEN-LAST:event_exitForm
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void generateItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateItemActionPerformed
generateFiles();
}//GEN-LAST:event_generateItemActionPerformed
//=======================================================
//=======================================================
private int generateFiles() {
if (tree==null)
return JOptionPane.CANCEL_OPTION;
try {
PogoMultiClasses multiClasses = tree.getServer();
if (multiClasses!=null) {
GenerateDialog dialog = new GenerateDialog(this);
if (dialog.showDialog(multiClasses) == JOptionPane.OK_OPTION) {
// Then generate code and save
setCursor(new Cursor(Cursor.WAIT_CURSOR));
String serverPath = dialog.getPath();
multiClasses.setSourcePath(serverPath);
// Set relative path for each class.
EList classes = multiClasses.getClasses();
for (OneClassSimpleDef oneClass : classes) {
String classPath = Utils.getRelativePath(oneClass.getSourcePath(), serverPath);
oneClass.setSourcePath(classPath);
}
multiClasses.setFilestogenerate(dialog.getGenerated());
OAWutils.getInstance().generate(multiClasses);
tree.setModified(false);
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
// Manage recent menu
String projectFile = multiClasses.getSourcePath() +
"/" + multiClasses.getName() + ".multi.xmi";
manageRecentMenu(projectFile);
return JOptionPane.OK_OPTION;
}
}
} catch (PogoException e) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
e.popup(this);
}
return JOptionPane.CANCEL_OPTION;
}
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void newItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newItemActionPerformed
// First time, check if modified
if (tree != null && tree.getModified()) {
if (checkModifications() == JOptionPane.CANCEL_OPTION)
return;
}
ServerDialog dialog = new ServerDialog(this, new TangoServer());
if (dialog.showDialog() == JOptionPane.OK_OPTION) {
tree = new MultiClassesTree(this, dialog.getTangoServer());
tree.setModified(true);
scrollPane.setViewportView(tree);
}
}//GEN-LAST:event_newItemActionPerformed
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void addItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addItemActionPerformed
if (tree.isANodeSelected())
tree.addClass();
}//GEN-LAST:event_addItemActionPerformed
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void removeItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeItemActionPerformed
if (tree.isAClassSelected())
tree.removeClass();
}//GEN-LAST:event_removeItemActionPerformed
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void editMenuStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_editMenuStateChanged
boolean visible = (!editMenu.isSelected());
if (tree != null) {
addItem.setEnabled(tree.isANodeSelected() || visible);
removeItem.setEnabled(tree.isAClassSelected() || visible);
}
}//GEN-LAST:event_editMenuStateChanged
//=======================================================
//=======================================================
@SuppressWarnings({"UnusedDeclaration"})
private void helpItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpItemActionPerformed
JOptionPane.showMessageDialog(this,
" Pogo (Tango Code Generator)\n" +
" This tool is able to generate, update and modify\n" +
" a server project containing several\n" +
" Tango device classes.\n\n" +
"Define a new server (Name, description,...)\n" +
"Then add classes (Highest classes to lowest ones)\n" +
"And finally, generate.\n\n" +
"This tool is available only for C++ classes on Linux." +
"\n\n" +
"http://www.tango-controls.org/ - [email protected]",
"Help Window", JOptionPane.INFORMATION_MESSAGE);
}//GEN-LAST:event_helpItemActionPerformed
//=======================================================
//=======================================================
@SuppressWarnings("UnusedParameters")
private void packageItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_packageItemActionPerformed
PogoMultiClasses multiClasses = tree.getServer();
if (multiClasses == null) // No class defined in tree
return;
new ConfigurePackagingDialog(this, multiClasses, tree.getAuthor()).setVisible(true);
}//GEN-LAST:event_packageItemActionPerformed
//=======================================================
/**
* Manage if modification(s) has been done, and propose to generate them.
*
* @return JOptionPane.OK_OPTION to continue, JOptionPane.CANCEL_OPTION otherwise
*/
//=======================================================
private int checkModifications() {
if (tree.getModified()) {
String name = tree.getName();
Object[] options = {"Generate", "Discard", "Cancel"};
switch (JOptionPane.showOptionDialog(this,
name + " project has not been generated !\n\n",
"Warning",
JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null, options, options[0])) {
case 0: // Generate
return generateFiles();
case 1: // Discard
return JOptionPane.OK_OPTION;
case 2: // Cancel
case -1: // escape
default:
return JOptionPane.CANCEL_OPTION;
}
}
return JOptionPane.OK_OPTION;
}
//=======================================================
//=======================================================
private void doClose() {
if (tree != null && tree.getModified()) {
if (checkModifications() == JOptionPane.CANCEL_OPTION)
return;
}
if (parent.isVisible())
setVisible(false);
else if (tree == null)
System.exit(0);
else if (tree.allEditorsAreClosed())
System.exit(0);
else
setVisible(false);
}
//=======================================================
/**
* @param args the command line arguments
*/
//=======================================================
public static void main(String[] args) {
try {
if (args.length == 0)
new MultiClassesPanel(new JFrame(), null).setVisible(true);
else
new MultiClassesPanel(new JFrame(), args[0]).setVisible(true);
} catch (PogoException e) {
e.popup(new Frame());
}
}
//=======================================================
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem addItem;
private javax.swing.JMenu editMenu;
private javax.swing.JMenuItem exitItem;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenuItem generateItem;
private javax.swing.JMenuItem helpItem;
private javax.swing.JMenu helpMenu;
private javax.swing.JMenuItem newItem;
private javax.swing.JMenuItem openItem;
private javax.swing.JMenuItem packageItem;
private javax.swing.JMenu recentMenu;
private javax.swing.JMenuItem removeItem;
private javax.swing.JPanel topPanel;
// End of variables declaration//GEN-END:variables
//=======================================================
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy