All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tango.pogo.gui.PogoGUI Maven / Gradle / Ivy

//+======================================================================
//
// Project:   Tango
//
// Description:  java source code for main GUI 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.Attribute;
import org.tango.pogo.pogoDsl.ClassIdentification;
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.ActionEvent;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

//=======================================================
/**
 * JFrame Class to manage Tango code generator GUI.
 *
 * @author Pascal Verdier
 */
//=======================================================
public class PogoGUI extends JFrame {
    /**
     * True only if Display is used (false if code generator usage)
     */
    public static boolean useDisplay = false;
    /**
     * A vector to know how many JFrame has been created.
     * And to checked at exit button clicked, to know if at least one is still visible.
     */
    static private List runningApplications = new ArrayList<>();
    /**
     * File Chooser Object used in file menu.
     */
    private static JFileChooser chooser = null;
    static final PogoFileFilter pogoFilter = new PogoFileFilter("xmi", "Tango Classes");
    static String homeDir;

    //  Only for first instance, only when starting up
    private static boolean startup = true;

    /**
     * little buttons with icon on top of JTree.
     */
    private List topButtons = new ArrayList<>();
    private static final int TOP_RELOAD = 0;
    private static final int TOP_NEW_CLASS = 1;
    private static final int TOP_NEW_TEMPL = 2;
    private static final int TOP_OPEN = 3;
    private static final int TOP_GENE = 4;

    private ClassPanels class_panels;
    private JLabel      languageLabel;
    private LanguagePopupMenu   languageMenu;
    private boolean hasInheritance = false;

    public static MultiClassesPanel multiClassesPanel = null;
    //=======================================================
    /**
     * Creates new form PogoGUI
     *
     * @param filename xmi file where device class is defined
     *                 (do not try to load if null).
     * @throws PogoException in case of failure
     */
    //=======================================================
    public PogoGUI(String filename) throws PogoException {
        this();
        checkLoadAtStartup(filename);
    }
    //=======================================================
    /**
     * Creates new form PogoGUI and display DeviceClass object
     *
     * @param deviceClass   DeviceClass object to be edited by Pogo
     * @param forceModified Force the edit/modified value to this boolean value.
     * @throws PogoException in case of failure
     */
    //=======================================================
    public PogoGUI(DeviceClass deviceClass, boolean forceModified) throws PogoException {
        this();

        //	Build users_tree to display info
        class_panels.addPanels(deviceClass);
        tabbedPane.setIconAt(class_panels.size()-1, Utils.getInstance().logoIcon);
        reBuildTabbedPane = false;
        setTitle(applicationTitle(deviceClass));

        //  Not from file but from new class.
        //  So set it as modified.
        class_panels.get(0).getTree().setModified(forceModified);
    }
    //=======================================================
    /**
     * Creates new form PogoGUI and load device class
     *
     * @throws PogoException in case of failure
     */
    //=======================================================
    public PogoGUI() throws PogoException {
        useDisplay = true;
        initComponents();
        PogoProperty.init();
        initOwnComponents();
        manageRecentMenu(null);
        setTitle(applicationTitle(null));

        //  Create a dummy panel for display
        class_panels = new ClassPanels(this);
        ClassPanel cp = new ClassPanel(this);
        class_panels.add(cp);
        tabbedPane.add(cp);

        setIconImage(Utils.getInstance().getIcon("pogo.png").getImage());
        //setIconImage(Utils.getInstance().logoIcon.getImage());
        pack();
        setScreenPosition(this);
        setVisible(true);
        runningApplications.add(this);
    }

    //===========================================================
    //===========================================================
    private String applicationTitle(DeviceClass deviceClass) {
        String  release = Utils.getInstance().getImplementationVersion();
        if (deviceClass!=null)
           return "TANGO Code Generator - " + release + " - " + deviceClass.toString();
        else
           return "TANGO Code Generator - " + release;
    }
    //===========================================================
    //===========================================================
    private void checkLoadAtStartup(String filename) {
        if (filename != null && filename.length() > 0)
            if (filename.endsWith(".xmi"))
                loadDeviceClassFromFile(filename);
            else {
                new PogoException(filename + " is not a xmi file").popup(this);
            }
        else {
            String xmiFile = Utils.getXmiFile(PogoConst.MonoClass);
            if (xmiFile != null) {
                openItemActionPerformed(null);
            } else if (PogoProperty.loadPrevious)
                if (PogoProperty.projectHistory.size() > 0) {
                    String previousFile = PogoProperty.projectHistory.get(0);
                    if (previousFile.endsWith(".xmi"))
                        loadDeviceClassFromFile(previousFile);
                }
        }
        startup = false;
    }
    //===========================================================

    /**
     * Move specified frame to the center of the screen if first instance.
     * Else check position from other instance
     *
     * @param frame frame to set position.
     */
    //===========================================================
    public void setScreenPosition(JFrame frame) {
        Point p = new Point();

        //  If not the first one set position from previous.
        for (int i = runningApplications.size() - 1; i >= 0; i--) {
            JFrame parent = runningApplications.get(i);
            if (parent.isVisible()) {
                p = parent.getLocation();
                p.x += 20;
                p.y += 20;
                frame.setLocation(p);
                return;
            }
        }

        // Else set to the default center
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension scrSize = toolkit.getScreenSize();
        Dimension appSize = frame.getSize();
        p.x = (scrSize.width - appSize.width) / 2;
        p.y = (scrSize.height - appSize.height) / 2;
        frame.setLocation(p);
    }

    //=======================================================
    //=======================================================
    private void manageRecentMenu(String newProject) {
        try {
            //	Check if there is something to manage.
            if (newProject == null && PogoProperty.projectHistory.size() == 0)    //	No project history
                return;

            //	Check if main class or inherited one.
            if (tabbedPane.getSelectedIndex() > 0)
                return;

            if (newProject != null)
                PogoProperty.addProject(newProject, PogoConst.SINGLE_CLASS);

            //	If project history available add it in recent menu
            recentMenu.removeAll();
            for (String project : PogoProperty.projectHistory) {
                JMenuItem item = new JMenuItem(project);
                item.addActionListener(this::recentItemActionPerformed);
                recentMenu.add(item);
            }
        } catch (Exception e) {
            System.err.println("\nWARNING:	" + e);
        }
    }

    //=======================================================
    //=======================================================
    private void initOwnComponents() {
        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

        Utils utils = Utils.getInstance();
        addTopPanelButton(utils.reloadIcon, "Reload Class", false);
        addTopPanelButton(utils.newIcon, "New Tango Class", false);
        addTopPanelButton(utils.newFromTemplateIcon, "New Class from Template", false);
        addTopPanelButton(utils.openIcon, "Open Class", false);
        addTopPanelButton(utils.saveIcon, "Generate Class", false);

        JLabel lbl = new JLabel("      Palette:");
        lbl.setFont(new Font("Dialog", Font.BOLD, 12));
        topPanel.add(lbl);

        addTopPanelButton(utils.classPropertyIcon, "Add Class Property", true);
        addTopPanelButton(utils.devicePropertyIcon, "Add Device Property", true);
        addTopPanelButton(utils.cmdIcon, "Add Command", true);
        addTopPanelButton(utils.scalarIcon, "Add ScalarAttribute", true);
        addTopPanelButton(utils.spectrumIcon, "Add Spectrum Attribute", true);
        addTopPanelButton(utils.imageIcon, "Add ImageAttribute", true);
        addTopPanelButton(utils.forwardedIcon, "Add Forwarded Attribute", true);
        addTopPanelButton(utils.pipeIcon, "Add Pipe", true);
        addTopPanelButton(utils.stateIcon, "Add State", true);

        //  Add a label to display language (and menu to change it)
        lbl = new JLabel("           ");
        topPanel.add(lbl);
        languageLabel = new JLabel("");
        topPanel.add(languageLabel);
        languageMenu = new LanguagePopupMenu(languageLabel);
        languageLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                languageMenu.showMenu(evt);
            }
        });

        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);
        if (!TemplateChooser.templatesAvailable()) {
            newFromTemplateItem.setVisible(false);
            topButtons.get(TOP_NEW_TEMPL).setVisible(false);
        }
    }

    //=======================================================
    //=======================================================
    public void setLanguageLogo(String language) {
        if (language.equalsIgnoreCase("Cpp"))
            languageLabel.setIcon(Utils.getInstance().cppLogo);
        else
        if (language.equalsIgnoreCase("Java"))
            languageLabel.setIcon(Utils.getInstance().javaLogo);
        else
        if (language.equalsIgnoreCase("Python"))
            languageLabel.setIcon(Utils.getInstance().pythonLogo);
        else
        if (language.equalsIgnoreCase("PythonHL"))
            languageLabel.setIcon(Utils.getInstance().pythonHLLogo);
        pack();
    }
    //=======================================================
    //=======================================================
    private void addTopPanelButton(ImageIcon icon, String tip, final boolean isPalette) {
        JButton button = new JButton(icon);
        button.setToolTipText(Utils.buildToolTip(tip));
        button.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        button.addActionListener(evt -> {
            if (isPalette)
                paletteActionPerformed(evt);
            else
                topButtonActionPerformed(evt);
        });
        topPanel.add(button);
        topButtons.add(button);
    }
    //=======================================================
    /**
     * 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() {

        inherPanel = new javax.swing.JPanel();
        tabbedPane = new javax.swing.JTabbedPane();
        topPanel = new javax.swing.JPanel();
        javax.swing.JMenuBar jMenuBar1 = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem newItem = new javax.swing.JMenuItem();
        newFromTemplateItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem openItem = new javax.swing.JMenuItem();
        recentMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem dummyItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem generateItem = new javax.swing.JMenuItem();
        packageItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem reLoadItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem exitItem = new javax.swing.JMenuItem();
        editMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem stateMachineItem = new javax.swing.JMenuItem();
        javax.swing.JSeparator jSeparator1 = new javax.swing.JSeparator();
        deleteItem = new javax.swing.JMenuItem();
        moveUpItem = new javax.swing.JMenuItem();
        moveDownItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem preferencesItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem sitePreferencesItem = new javax.swing.JMenuItem();
        javax.swing.JMenu toolsMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem multiItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem colorItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem releaseItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem aboutItem = new javax.swing.JMenuItem();
        javax.swing.JSeparator jSeparator2 = new javax.swing.JSeparator();
        javax.swing.JMenuItem tangoItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem pogoItem = new javax.swing.JMenuItem();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        getContentPane().setLayout(new java.awt.BorderLayout());

        inherPanel.setLayout(new java.awt.GridBagLayout());
        getContentPane().add(inherPanel, java.awt.BorderLayout.EAST);

        tabbedPane.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tabbedPaneStateChanged(evt);
            }
        });
        getContentPane().add(tabbedPane, java.awt.BorderLayout.CENTER);
        getContentPane().add(topPanel, java.awt.BorderLayout.PAGE_START);

        fileMenu.setMnemonic('F');
        fileMenu.setText("File");
        fileMenu.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                fileMenuStateChanged(evt);
            }
        });

        newItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        newItem.setMnemonic('N');
        newItem.setText("New");
        newItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newItemActionPerformed(evt);
            }
        });
        fileMenu.add(newItem);

        newFromTemplateItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        newFromTemplateItem.setText("New from template");
        newFromTemplateItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newFromTemplateItemActionPerformed(evt);
            }
        });
        fileMenu.add(newFromTemplateItem);

        openItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        openItem.setMnemonic('O');
        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.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_MASK));
        generateItem.setMnemonic('G');
        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);

        reLoadItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0));
        reLoadItem.setText("Re-Load project");
        reLoadItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                reLoadItemActionPerformed(evt);
            }
        });
        fileMenu.add(reLoadItem);

        exitItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
        exitItem.setMnemonic('E');
        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.setMnemonic('E');
        editMenu.setText("Edit");
        editMenu.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                editMenuStateChanged(evt);
            }
        });

        stateMachineItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.CTRL_MASK));
        stateMachineItem.setMnemonic('M');
        stateMachineItem.setText("State Machine");
        stateMachineItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stateMachineItemActionPerformed(evt);
            }
        });
        editMenu.add(stateMachineItem);
        editMenu.add(jSeparator1);

        deleteItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_DELETE, 0));
        deleteItem.setMnemonic('D');
        deleteItem.setText("Delete Selection");
        deleteItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteItemActionPerformed(evt);
            }
        });
        editMenu.add(deleteItem);

        moveUpItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.CTRL_MASK));
        moveUpItem.setMnemonic('U');
        moveUpItem.setText("Move Up");
        moveUpItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                moveUpItemActionPerformed(evt);
            }
        });
        editMenu.add(moveUpItem);

        moveDownItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK));
        moveDownItem.setMnemonic('D');
        moveDownItem.setText("Move Down");
        moveDownItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                moveDownItemActionPerformed(evt);
            }
        });
        editMenu.add(moveDownItem);

        preferencesItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.CTRL_MASK));
        preferencesItem.setMnemonic('P');
        preferencesItem.setText("Preferences");
        preferencesItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                preferencesItemActionPerformed(evt);
            }
        });
        editMenu.add(preferencesItem);

        sitePreferencesItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.ALT_MASK));
        sitePreferencesItem.setText("Site Preferences");
        sitePreferencesItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sitePreferencesItemActionPerformed(evt);
            }
        });
        editMenu.add(sitePreferencesItem);

        jMenuBar1.add(editMenu);

        toolsMenu.setMnemonic('T');
        toolsMenu.setText("Tools");

        multiItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        multiItem.setMnemonic('M');
        multiItem.setText("Multi Cpp Classes Manager");
        multiItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                multiItemActionPerformed(evt);
            }
        });
        toolsMenu.add(multiItem);

        jMenuBar1.add(toolsMenu);

        helpMenu.setMnemonic('H');
        helpMenu.setText("Help");

        colorItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F3, 0));
        colorItem.setText("On Color");
        colorItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                colorItemActionPerformed(evt);
            }
        });
        helpMenu.add(colorItem);

        releaseItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F2, 0));
        releaseItem.setText("Release Notes");
        releaseItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                releaseItemActionPerformed(evt);
            }
        });
        helpMenu.add(releaseItem);

        aboutItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
        aboutItem.setText("About");
        aboutItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                aboutItemActionPerformed(evt);
            }
        });
        helpMenu.add(aboutItem);
        helpMenu.add(jSeparator2);

        tangoItem.setText("Tango Pages");
        tangoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tangoItemActionPerformed(evt);
            }
        });
        helpMenu.add(tangoItem);

        pogoItem.setText("Pogo online documentation");
        pogoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pogoItemActionPerformed(evt);
            }
        });
        helpMenu.add(pogoItem);

        jMenuBar1.add(helpMenu);

        setJMenuBar(jMenuBar1);

        pack();
    }// //GEN-END:initComponents

    //=======================================================
    //=======================================================
    private void recentItemActionPerformed(java.awt.event.ActionEvent evt) {
        String projectName = ((JMenuItem) evt.getSource()).getText();
        loadDeviceClassFromFile(projectName);
    }

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void openItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openItemActionPerformed

        chooser.setFileFilter(pogoFilter);
        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();
            if (file != null) {
                if (!file.isDirectory()) {
                    if (file.toString().endsWith(".xmi")) {
                        homeDir = file.getParentFile().toString();
                        loadDeviceClassFromFile(file.getAbsolutePath());
                    }
                    else {
                        new PogoException(file.toString() + " is not a xmi file").popup(this);
                    }
                }
            }
        }
    }//GEN-LAST:event_openItemActionPerformed

    //=======================================================
    //=======================================================
    private void buildTree(DeviceClass devclass) {
        //	Check if ClassIdentification has already been defined.
        ClassIdentification id = devclass.getPogoDeviceClass().getDescription().getIdentification();

        //  Manage Device ID
        if (id == null && !Utils.isTrue(System.getenv("TEST_MODE"))) {
            Utils.getInstance().stopSplashRefresher();
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            DeviceIdDialog dialog = new DeviceIdDialog(this);
            if (dialog.showDialog() == JOptionPane.OK_OPTION) {
                id = dialog.getInputs();
                devclass.getPogoDeviceClass().getDescription().setIdentification(id);
            } else
                return;        //	No ID definition, do not edit
        }

        reBuildTabbedPane = true;
        tabbedPane.removeAll();

        class_panels.addPanels(devclass);
        tabbedPane.setIconAt(class_panels.size()-1, Utils.getInstance().logoIcon);
        //class_panels.checkWarnings();
        reBuildTabbedPane = false;
    }

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void exitItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitItemActionPerformed

        exitAppli();
    }//GEN-LAST:event_exitItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm

        if (exitAppli() == JOptionPane.CANCEL_OPTION) {
            //  If not exited -> start a thread to set it visible a bit later
            new SetVisibleLater(this).start();
        }
    }//GEN-LAST:event_exitForm
    //=======================================================
    /**
     * 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() {
        for (ClassPanel class_panel : class_panels) {
            if (class_panel.getTree() != null &&
                    class_panel.getTree().getModified()) {
                String name = class_panel.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
                        generateSourceFiles(class_panel.getTree());
                        break;
                    case 1:    // Discard
                        break;
                    case 2:    //	Cancel
                    case -1:   //	escape
                        return JOptionPane.CANCEL_OPTION;
                }
            }
        }
        return JOptionPane.OK_OPTION;
    }

    //=======================================================
    //=======================================================
    private int exitAppli() {
        if (checkModifications() == JOptionPane.OK_OPTION) {

            this.setVisible(false);
            // Check to know if at least one is still visible.
            for (JFrame frame : runningApplications)
                if (frame.isVisible())
                    return JOptionPane.OK_OPTION;
            //  Check if MultiClassesPanel is visible
            if ((multiClassesPanel != null && multiClassesPanel.isVisible()))
                return JOptionPane.OK_OPTION;

            //  No visible found.
            System.exit(0);
        }
        return JOptionPane.CANCEL_OPTION;
    }
    //=======================================================

    /**
     * Returns the main edited class name.
     *
     * @return the edited main class name.
     */
    //=======================================================
    String getMainClassName() {
        return class_panels.getPanelNameAt(0);
    }

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void generateItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateItemActionPerformed

        int idx = tabbedPane.getSelectedIndex();
        ClassTree tree = class_panels.getSelectedTree();
        if (tree == null)    //	No class defined in tree
            return;
        generateSourceFiles(tree);
    }

    //=======================================================
    //=======================================================
    private void checkPogoClassCompatibilityLanguage(DeviceClass deviceClass) throws PogoException {
        EList attributeEList = deviceClass.getPogoDeviceClass().getAttributes();
        if (deviceClass.getPogoDeviceClass().
                getDescription().getLanguage().equalsIgnoreCase(PogoConst.strLang[PogoConst.Cpp]))
            return;
        for (Attribute attribute : attributeEList) {
            //  If spectrum or image and Enum throw exception
            if (!attribute.getAttType().equalsIgnoreCase(PogoConst.AttrTypeArray[PogoConst.SCALAR])) {
                if (attribute.getDataType().toString().contains("Enum")) {
                    throw new PogoException("Enum are supported as SPECTRUM only for C++");
                }
            }
        }
    }
    //=======================================================
    //=======================================================
    @SuppressWarnings("UnusedReturnValue")
    private boolean generateSourceFiles(ClassTree tree) {
        //	First time check output path
        GenerateDialog generateDialog = new GenerateDialog(this);
        DeviceClass deviceClass = tree.getDeviceClass();

        try {
            checkPogoClassCompatibilityLanguage(deviceClass);
        } catch (PogoException e) {
            e.popup(this);
            return false;
        }

        if (generateDialog.showDialog(deviceClass) == JOptionPane.OK_OPTION) {
            //	Then generate code and save
            Cursor cursor = new Cursor(Cursor.WAIT_CURSOR);
            setCursor(cursor);
            try {
                deviceClass = generateDialog.getDevClass();
                Utils.getInstance().startSplashRefresher(
                        "Generate class: " + deviceClass.getPogoDeviceClass().getName());

                deviceClass.generate(tree.getDeletedObjects(), tree.getRenamedObjects());

                Utils.getInstance().stopSplashRefresher();

                //	Update ClassTree object.
                tree.setModified(false);
                tree.setSrcPath(deviceClass.getPogoDeviceClass().getDescription().getSourcePath());

                manageRecentMenu(deviceClass.getProjectFilename());
            } catch (Exception e) {
                Utils.getInstance().stopSplashRefresher();
                cursor = new Cursor(Cursor.DEFAULT_CURSOR);
                setCursor(cursor);
                e.printStackTrace();
                PogoException.popup(this, e);
                return false;
            }
            cursor = new Cursor(Cursor.DEFAULT_CURSOR);
            setCursor(cursor);
            return true;
        } else
            return false;

    }//GEN-LAST:event_generateItemActionPerformed

    //=======================================================
    //=======================================================
    private boolean reBuildTabbedPane = false;

    @SuppressWarnings({"UnusedDeclaration"})
    private void newItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newItemActionPerformed

        //  ToDo add template management
        //  Start class dialog
        ClassDialog dialog = new ClassDialog(this);
        if (dialog.showDialog() != JOptionPane.OK_OPTION)
            return;

        DeviceClass deviceClass = dialog.getInputs();
        if (class_panels.getSelectedTree() != null) {
            try {
                new PogoGUI(deviceClass, true);
                return;
            } catch (Exception e) {
                Utils.getInstance().stopSplashRefresher();
                PogoException.popup(this, e);
            }
        }

        //  Display it in this panel
        reBuildTabbedPane = true;
        tabbedPane.removeAll();

        //	Build users_tree to display info
        class_panels.addPanels(deviceClass);
        tabbedPane.setIconAt(class_panels.size()-1, Utils.getInstance().logoIcon);
        class_panels.checkWarnings();
        reBuildTabbedPane = false;
    }//GEN-LAST:event_newItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void deleteItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteItemActionPerformed

        ClassTree tree = class_panels.getSelectedTree();
        Object selection = tree.getSelectedEditableObject();
        if (selection != null)
            tree.removeSelectedItem();

    }//GEN-LAST:event_deleteItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void moveUpItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveUpItemActionPerformed

        ClassTree tree = class_panels.getSelectedTree();
        Object selection = tree.getSelectedEditableObject();
        if (selection != null)
            tree.moveSelectedItem(true);
    }//GEN-LAST:event_moveUpItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void moveDownItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveDownItemActionPerformed

        ClassTree tree = class_panels.getSelectedTree();
        Object selection = tree.getSelectedEditableObject();
        if (selection != null)
            tree.moveSelectedItem(false);
    }//GEN-LAST:event_moveDownItemActionPerformed

    //=======================================================
    //=======================================================
    private void reloadProject() {

        if (class_panels.getSelectedTree() != null) {
            if (checkModifications() == JOptionPane.OK_OPTION) {
                String filename = class_panels.get(0).getTree().getClassFileName();
                if (filename != null) {
                    //System.out.println("Reload "+filename);
                    loadDeviceClassFromFile(filename, false);
                }
            }
        }
    }

    //=======================================================
    //=======================================================
    @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:
                        reloadProject();
                        break;
                    case TOP_NEW_CLASS:
                        newItemActionPerformed(evt);
                        break;
                    case TOP_NEW_TEMPL:
                        newFromTemplateItemActionPerformed(evt);
                        break;
                    case TOP_OPEN:
                        openItemActionPerformed(evt);
                        break;
                    case TOP_GENE:
                        generateItemActionPerformed(evt);
                        break;
                }
    }

    //=======================================================
    //=======================================================
    private void paletteActionPerformed(java.awt.event.ActionEvent evt) {
        ClassTree tree = class_panels.getSelectedTree();
        if (tree != null) {
            JButton btn = (JButton) evt.getSource();
            String txt = btn.getToolTipText();
            tree.addItem(txt);
        }
    }

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void stateMachineItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stateMachineItemActionPerformed

        ClassTree tree = class_panels.getSelectedTree();
        if (tree != null)
            tree.editStateMachine();

    }//GEN-LAST:event_stateMachineItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void editMenuStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_editMenuStateChanged

        if (class_panels == null)
            return; //  Not yet initialized
        ClassTree tree = class_panels.getSelectedTree();
        boolean visible = tree != null &&
                (!editMenu.isSelected() ||
                        (tree.getSelectedEditableObject() != null));

        deleteItem.setEnabled(visible);
        moveUpItem.setEnabled(visible);
        moveDownItem.setEnabled(visible);

    }//GEN-LAST:event_editMenuStateChanged

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void colorItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_colorItemActionPerformed
        new PopupColorCode(this).setVisible(true);
    }//GEN-LAST:event_colorItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void aboutItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutItemActionPerformed
        JOptionPane.showMessageDialog(this,
                "             Pogo  (Tango Code Generator)\n" +
                        "This programme is able to generate, update and modify\n" +
                        "                 Tango device classes.\n\n" +
                        Utils.getInstance().getImplementationVersion() +
                        "\n\n" +
                        "http://www.tango-controls.org/     -    [email protected]",
                "Help Window", JOptionPane.INFORMATION_MESSAGE);

    }//GEN-LAST:event_aboutItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void tabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabbedPaneStateChanged

        class_panels.updateInheritancePanelForSelection();
    }//GEN-LAST:event_tabbedPaneStateChanged

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void preferencesItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_preferencesItemActionPerformed

        new PreferencesDialog(this).setVisible(true);

    }//GEN-LAST:event_preferencesItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void releaseItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_releaseItemActionPerformed
        new PopupHtml(this).show(ReleaseNotes.htmlString, 550, 400);
    }//GEN-LAST:event_releaseItemActionPerformed
    //=======================================================
    //=======================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void reLoadItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reLoadItemActionPerformed

        reloadProject();
    }//GEN-LAST:event_reLoadItemActionPerformed

    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void tangoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tangoItemActionPerformed
        Utils.showInHtmBrowser(PogoConst.tangoHTTP[PogoConst.TANGO_PAGES]);
    }//GEN-LAST:event_tangoItemActionPerformed

    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void pogoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pogoItemActionPerformed
        Utils.showInHtmBrowser(PogoConst.tangoHTTP[PogoConst.POGO_PAGES]);
    }//GEN-LAST:event_pogoItemActionPerformed

    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void sitePreferencesItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sitePreferencesItemActionPerformed
        new PogoConfiguration(this).showDialog();
    }//GEN-LAST:event_sitePreferencesItemActionPerformed

    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void multiItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_multiItemActionPerformed
        try {
            if (multiClassesPanel == null)
                multiClassesPanel = new MultiClassesPanel(this, null);
            multiClassesPanel.setVisible(true);
        } catch (PogoException e) {
            PogoException.popup(this, e);
        }
    }//GEN-LAST:event_multiItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings("UnusedParameters")
    private void packageItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_packageItemActionPerformed
        ClassTree tree = class_panels.getSelectedTree();
        if (tree == null)    //	No class defined in tree
            return;
        if (tree.getModified()) {
            JOptionPane.showMessageDialog(new JFrame(),
                    "Save your project by generating the xmi file before.",
                    "Message Window",
                    JOptionPane.INFORMATION_MESSAGE);
        }
        DeviceClass deviceClass = tree.getDeviceClass();
        new ConfigurePackagingDialog(this, deviceClass.getPogoDeviceClass()).setVisible(true);
    }//GEN-LAST:event_packageItemActionPerformed

    //=======================================================
    //=======================================================
    @SuppressWarnings("UnusedParameters")
    private void fileMenuStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_fileMenuStateChanged

        //  At creation --> do nothing
        if (class_panels==null)
            return;

        //  Check if Packaging is available (linux and C++)
        boolean b = false;
        if (Packaging.isAvailable()) {
            ClassTree tree = class_panels.getSelectedTree();
            if (tree != null)  {   //	a class is defined in tree
                DeviceClass deviceClass = tree.getDeviceClass();
                String language = deviceClass.getPogoDeviceClass().getDescription().getLanguage();
                b = (language.equals(PogoConst.strLang[PogoConst.Cpp]));
            }
        }
        packageItem.setVisible(b);
    }//GEN-LAST:event_fileMenuStateChanged

    //=======================================================
    //=======================================================
    @SuppressWarnings("UnusedParameters")
    private void newFromTemplateItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newFromTemplateItemActionPerformed
        // TODO add your handling code here:
        try {
            TemplateChooser templateChooser = new TemplateChooser(this);
            if (templateChooser.showDialog() != JOptionPane.OK_OPTION)
                return;
            DeviceClass deviceClass = templateChooser.getDeviceClass();
            if (deviceClass != null) {
                new PogoGUI(deviceClass, true);
            }
        }
        catch (PogoException e) {
            e.popup(this);
        }
    }//GEN-LAST:event_newFromTemplateItemActionPerformed

    //=======================================================
    //=======================================================
    private void loadDeviceClassFromFile(String filename) {
        loadDeviceClassFromFile(filename, true);
    }

    //=======================================================
    //=======================================================
    private void loadDeviceClassFromFile(String filename, boolean checkForNewFrame) {
        Cursor cursor = new Cursor(Cursor.WAIT_CURSOR);
        try {
            //  Get absolute path for file
            File file = new File(filename);
            filename = file.getCanonicalFile().toString();
            manageRecentMenu(filename);
        } catch (IOException e) { /* */ }

        try {
            if (checkForNewFrame) {
                //  If not first one, New Frame
                if (class_panels.getSelectedTree() != null) {
                    new PogoGUI(filename);
                    return;
                }
            }
            //  Else do it
            setCursor(cursor);
            Utils.getInstance().startSplashRefresher(
                    "Loading  " + Utils.getRelativeFilename(filename));

            DeviceClass deviceClass = new DeviceClass(filename);
            Utils.getInstance().startSplashRefresher(
                    "Building  " + Utils.getRelativeFilename(filename));
            buildTree(deviceClass);
            setTitle(applicationTitle(deviceClass));
            cursor = new Cursor(Cursor.DEFAULT_CURSOR);
            setCursor(cursor);
            Utils.getInstance().stopSplashRefresher();
        }
        catch (PogoException e) {
            Utils.getInstance().stopSplashRefresher();

            if (startup)
                System.err.println(e.toString());
            else if (!e.toString().equals("CANCEL")) {
                PogoException.popup(this, e);
                if (class_panels.getPanelNameAt(0) == null && runningApplications.size() > 1)
                    setVisible(false);
            }
        }

        cursor = new Cursor(Cursor.DEFAULT_CURSOR);
        setCursor(cursor);
        class_panels.checkWarnings();

    }

    //=======================================================
    //=======================================================
    boolean itemAlreadyExists(String name, int type) {
        ClassTree tree = class_panels.getSelectedTree();
        return tree.itemAlreadyExists(name, type);
    }

    //=======================================================
    //=======================================================
    ClassPanels getClassPanels() {
        return class_panels;
    }

    //=======================================================
    //=======================================================
    void setTabbedPaneSelection(ClassPanel panel) {
        tabbedPane.setSelectedComponent(panel);
    }

    //=======================================================
    //=======================================================
    void fireClassHaveChanged() {
        for (int i=0 ; i {
        private PogoGUI gui;
        private String warnings = "";
        private static final long serialVersionUID = -3468411367658544269L;

        //=======================================================
        private ClassPanels(PogoGUI gui) {
            this.gui = gui;
        }

        //=======================================================
        //=======================================================
        @SuppressWarnings("SameParameterValue")
        private String getPanelNameAt(int idx) {
            ClassPanel panel = (ClassPanel) tabbedPane.getComponent(idx);
            return panel.getName();
        }
        //=======================================================
        private ClassTree getSelectedTree() {
            return get(tabbedPane.getSelectedIndex()).getTree();
        }
        //=======================================================
        private void addPanel(DeviceClass deviceClass) {
            ClassPanel cp = new ClassPanel(gui);
            cp.setTree(deviceClass, this.size() > 0);
            add(cp);
            tabbedPane.add(cp);
            tabbedPane.setIconAt(class_panels.size()-1, Utils.getInstance().logoIcon);
        }
        //=======================================================
        private void addPanels(DeviceClass deviceClass) {
            //  Reset if needed
            this.removeAll(this);
            tabbedPane.removeAll();
            warnings = org.tango.pogo.gui.InheritanceUtils.getInstance().manageInheritanceItems(deviceClass);

            addPanel(deviceClass);

            //  manage inheritance elements
            List ancestors = deviceClass.getAncestors();
            for (int i=ancestors.size()-1 ; i>=0 ; i--) {
                addPanel(ancestors.get(i));
            }
            hasInheritance = (ancestors.size()>0);

            //  Build inheritance panel
            getContentPane().remove(inherPanel);
            inherPanel = new InheritancePanel(deviceClass, gui);
            getContentPane().add(inherPanel, java.awt.BorderLayout.EAST);
            pack();
        }
        //=======================================================
        private void checkWarnings() {
            if (warnings.length() > 0) {
                Utils.getInstance().stopSplashRefresher();
                JOptionPane.showMessageDialog(gui,
                        "Inheritance change(s):\n" + warnings,
                        "Warning Window", JOptionPane.WARNING_MESSAGE);
            }
        }
        //=======================================================
        private void updateInheritancePanelForSelection() {
            if (!reBuildTabbedPane) {
                ClassPanel panel = (ClassPanel) tabbedPane.getSelectedComponent();
                if (inherPanel instanceof InheritancePanel)
                    ((InheritancePanel) inherPanel).setSelected(panel.getName());
            }
        }
        //=======================================================
    }
    //===============================================================
    //===============================================================


    //===============================================================
    //===============================================================
    private static class SetVisibleLater extends Thread {
        private Component component;

        private SetVisibleLater(Component component) {
            this.component = component;
        }

        public void run() {
            try {
                sleep(100);
            } catch (InterruptedException e) { /* */ }
            component.setVisible(true);
        }
    }
    //===============================================================
    //===============================================================






    //===============================================================
    //===============================================================
    private class LanguagePopupMenu extends JPopupMenu {
        private JLabel  label;
        private final int OFFSET = 2;    //	Label And separator

        private String[] menuLabels = {
                PogoConst.strLang[PogoConst.Java],
                PogoConst.strLang[PogoConst.Cpp],
                PogoConst.strLang[PogoConst.Python],
                PogoConst.strLang[PogoConst.PythonHL],
        };

        //===========================================================
        private LanguagePopupMenu(JLabel label) {
            this.label = label;
            JLabel  title = new JLabel("Language");
            title.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
            add(title);
            add(new JPopupMenu.Separator());

            for (String menuLabel : menuLabels) {
                if (menuLabel == null)
                    add(new Separator());
                else {
                    JMenuItem btn = new JMenuItem(menuLabel);
                    btn.addActionListener(this::menuActionPerformed);
                    add(btn);
                }
            }
            String  s = System.getenv("PythonHL");
            getComponent(OFFSET+PogoConst.PythonHL).setVisible(s!=null && s.equals("true"));
        }
        //===========================================================
        public void showMenu(MouseEvent evt) {
            //  If has inheritance -> cannot change language
            if (hasInheritance)
                return;
            int mask = evt.getModifiers();
            if ((mask & MouseEvent.BUTTON3_MASK)!=0)
                show(label, evt.getX(), evt.getY());
        }
        //===========================================================
        private void menuActionPerformed(ActionEvent evt) {
            //	Check component source
            Object obj = evt.getSource();
            int cmdidx = 0;
            for (int i = 0; i < menuLabels.length; i++)
                if (getComponent(OFFSET + i) == obj)
                    cmdidx = i;
            ClassTree tree = class_panels.getSelectedTree();
            if (tree!=null) {
                tree.setClassLanguage(cmdidx);
                setLanguageLogo(PogoConst.strLang[cmdidx]);
                tree.setModified(true);
            }
        }
        //===========================================================
    }
    //===============================================================
    //===============================================================
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy