TopComponent not running

"ruperty" <[email protected]>
Newsgroups gmane.comp.java.netbeans.modules.openide.devel
Message-ID <[email protected]>
Thanks for your response.


Graeme wrote:
> As Geertjan has indicated without code you have not given anyone much information to go on.  A picture doesn't help.
> 
> You provided a log but didn't provide a comparison log - e.g. successful vs unsuccessful launch.
> 


When I run the application through Netbeans and View->IDE Log, the output window that comes up is blank.


> 
> When you launch from the Installed version you will be using a different User directory and cache directory.  If you are relying on files that were generated during development launches e.g. saved state like which top-components are visible - all that information will be lost in the installed version.
> 
> It is possible the installed version runs with a different JRE version - that probably isn't the cause but another environment difference.
> 


There's only a slight difference 1.8.0_121 (App) 1.8.0_91 (NB).


> 
> You could edit your installed configuration files and point to the development directories and see if that helps.
> 


Which files are these?


> 
> Also compare the logs from a successful IDE launch vs Installer launch.  Are there any differences in the number of modules that get loaded/started?  Are there any warnings/errors in one and not the other?
> 


As mentioned above I don't see a log for the former.


> 
> If you can create a small project that demonstrates the issue and post the code on github others might be able to help you resolve the issue.


Not sure where I'd start on that without rebuilding the entire project, as I don't know what the issue might be.

The installer worked about 8 months ago, on Linux, but doesn't now. Something I've done recently is delete some of the menus, through XML Layer. Might that be an issue?

Wasn't sure what code to post, but here's the main topcomponent maybe that will help.



Code:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uk.co.moonsit.gui.controlpanel.core;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import uk.co.moons.gui.components.ControlHierarchyEventMonitor;
import uk.co.moons.gui.controlpanel.helper.ControlPanelHelper;
import uk.co.moons.gui.controlpanel.helper.ParameterslPanelHelper;
import uk.co.moons.gui.controlpanel.helper.PlotPanelHelper;
import uk.co.moonsit.utils.Environment;
import uk.co.moonsit.sockets.ControlDataClient;

/**
 * Top component which displays something.
 */
@ConvertAsProperties(
        dtd = "-//uk.co.moonsit.gui.controlpanel.core//ControlPanel//EN",
        autostore = false)
@TopComponent.Description(
        preferredID = "ControlPanelTopComponent",
        //iconBase="SET/PATH/TO/ICON/HERE", 
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "editor", openAtStartup = true)
@ActionID(category = "Window", id = "uk.co.moonsit.gui.controlpanel.core.ControlPanelTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration(
        displayName = "#CTL_ControlPanelAction",
        preferredID = "ControlPanelTopComponent")
@Messages({
    "CTL_ControlPanelAction=ControlPanel",
    "CTL_ControlPanelTopComponent=ControlPanel Window",
    "HINT_ControlPanelTopComponent=This is a ControlPanel window"
})
public final class ControlPanelTopComponent extends TopComponent {

    static final Logger LOG = Logger.getLogger(ControlPanelTopComponent.class.getName());

    public ControlPanelTopComponent() {
        initComponents();

        {
            env = System.getenv("CPA_CONTROLLERS");
            if (env == null) {
                jTextFieldControllersDir.setText("CPA_CONTROLLERS environmental variable not set");
            } else {
                jTextFieldControllersDir.setText(env);
            }
        }
        {
            String env = System.getenv("EV3_IP");
            if (env == null) {
                jTextFieldHost.setText("EV3_IP environmental variable not set");
            } else {
                jTextFieldHost.setText(env);
            }
        }
        jFileChooser.setCurrentDirectory(new File(jTextFieldControllersDir.getText()));
        Environment.getInstance().setShortNames(jCheckBoxShortNames.isSelected());

        setName(Bundle.CTL_ControlPanelTopComponent());
        setToolTipText(Bundle.HINT_ControlPanelTopComponent());

    }

    /**
     * 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">                          
    private void initComponents() {

        jFileChooser = new javax.swing.JFileChooser();
        mainPanel = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jPanelMainLayers = new javax.swing.JPanel();
        jPanelLayers = new javax.swing.JPanel();
        jPanelControls = new javax.swing.JPanel();
        jPanelLocal = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButtonOpenFile = new javax.swing.JButton();
        jButtonStart = new javax.swing.JButton();
        jButtonStep = new javax.swing.JButton();
        jPanelCommon = new javax.swing.JPanel();
        jPanelOutput = new javax.swing.JPanel();
        jButtonDescription = new javax.swing.JButton();
        jButtonParameters = new javax.swing.JButton();
        jCheckBoxPrint = new javax.swing.JCheckBox();
        jCheckBoxOutput = new javax.swing.JCheckBox();
        jTextFieldFileRoot = new javax.swing.JTextField();
        jCheckBoxPlot = new javax.swing.JCheckBox();
        jTextFieldPlotItems = new javax.swing.JTextField();
        jCheckBoxShortNames = new javax.swing.JCheckBox();
        jTextFieldFontSize = new javax.swing.JTextField();
        jLabelFont = new javax.swing.JLabel();
        jPanelRemote = new javax.swing.JPanel();
        jButtonRemote = new javax.swing.JButton();
        jTextFieldHost = new javax.swing.JTextField();
        jTextFieldFreq = new javax.swing.JTextField();
        jLabelFreq = new javax.swing.JLabel();
        jTextFieldPort = new javax.swing.JTextField();
        jLabelHost = new javax.swing.JLabel();
        jLabelPort = new javax.swing.JLabel();
        jButtonShutdown = new javax.swing.JButton();
        jPanelFile = new javax.swing.JPanel();
        jLabelTime = new javax.swing.JLabel();
        monitor = new ControlHierarchyEventMonitor();
        monitor.addTimePropertyChangeListener(new TimeLabelListener());
        jLabelFilename = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jTextFieldControllersDir = new javax.swing.JTextField();

        setPreferredSize(new java.awt.Dimension(800, 644));
        setLayout(new java.awt.BorderLayout());

        mainPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(51, 153, 255)));
        mainPanel.setLayout(new java.awt.BorderLayout());

        jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 0, 51)));
        jPanel1.setLayout(new java.awt.BorderLayout());

        jPanelMainLayers.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanelMainLayers.setLayout(new java.awt.BorderLayout());

        javax.swing.GroupLayout jPanelLayersLayout = new javax.swing.GroupLayout(jPanelLayers);
        jPanelLayers.setLayout(jPanelLayersLayout);
        jPanelLayersLayout.setHorizontalGroup(
            jPanelLayersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 860, Short.MAX_VALUE)
        );
        jPanelLayersLayout.setVerticalGroup(
            jPanelLayersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 516, Short.MAX_VALUE)
        );

        jPanelMainLayers.add(jPanelLayers, java.awt.BorderLayout.CENTER);

        jPanel1.add(jPanelMainLayers, java.awt.BorderLayout.CENTER);

        jPanelControls.setPreferredSize(new java.awt.Dimension(750, 120));

        jPanelLocal.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabel1.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jButtonOpenFile, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonOpenFile.text")); // NOI18N
        jButtonOpenFile.setActionCommand(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonOpenFile.actionCommand")); // NOI18N
        jButtonOpenFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonOpenFileActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jButtonStart, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonStart.text")); // NOI18N
        jButtonStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonStartActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jButtonStep, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonStep.text")); // NOI18N
        jButtonStep.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonStepActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelLocalLayout = new javax.swing.GroupLayout(jPanelLocal);
        jPanelLocal.setLayout(jPanelLocalLayout);
        jPanelLocalLayout.setHorizontalGroup(
            jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLocalLayout.createSequentialGroup()
                .addGroup(jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelLocalLayout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(16, 16, 16))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLocalLayout.createSequentialGroup()
                        .addComponent(jButtonStart)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)))
                .addGroup(jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButtonOpenFile)
                    .addComponent(jButtonStep))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelLocalLayout.setVerticalGroup(
            jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelLocalLayout.createSequentialGroup()
                .addGroup(jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jButtonOpenFile))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelLocalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButtonStep)
                    .addComponent(jButtonStart))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanelCommon.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jPanelCommon.setPreferredSize(new java.awt.Dimension(814, 34));

        org.openide.awt.Mnemonics.setLocalizedText(jButtonDescription, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonDescription.text")); // NOI18N
        jButtonDescription.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonDescriptionActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jButtonParameters, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonParameters.text")); // NOI18N
        jButtonParameters.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonParametersActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelOutputLayout = new javax.swing.GroupLayout(jPanelOutput);
        jPanelOutput.setLayout(jPanelOutputLayout);
        jPanelOutputLayout.setHorizontalGroup(
            jPanelOutputLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelOutputLayout.createSequentialGroup()
                .addComponent(jButtonParameters)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButtonDescription)
                .addGap(0, 10, Short.MAX_VALUE))
        );
        jPanelOutputLayout.setVerticalGroup(
            jPanelOutputLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelOutputLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jButtonParameters)
                .addComponent(jButtonDescription))
        );

        org.openide.awt.Mnemonics.setLocalizedText(jCheckBoxPrint, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jCheckBoxPrint.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jCheckBoxOutput, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jCheckBoxOutput.text")); // NOI18N

        jTextFieldFileRoot.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldFileRoot.text")); // NOI18N

        jCheckBoxPlot.setSelected(true);
        org.openide.awt.Mnemonics.setLocalizedText(jCheckBoxPlot, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jCheckBoxPlot.text")); // NOI18N

        jTextFieldPlotItems.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldPlotItems.text")); // NOI18N
        jTextFieldPlotItems.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                plotLimitChange(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jCheckBoxShortNames, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jCheckBoxShortNames.text")); // NOI18N
        jCheckBoxShortNames.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxShortNamesActionPerformed(evt);
            }
        });

        jTextFieldFontSize.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldFontSize.text")); // NOI18N
        jTextFieldFontSize.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                focusFontSize(evt);
            }
        });
        jTextFieldFontSize.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                fontSizeChange(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jLabelFont, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelFont.text")); // NOI18N

        javax.swing.GroupLayout jPanelCommonLayout = new javax.swing.GroupLayout(jPanelCommon);
        jPanelCommon.setLayout(jPanelCommonLayout);
        jPanelCommonLayout.setHorizontalGroup(
            jPanelCommonLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelCommonLayout.createSequentialGroup()
                .addComponent(jCheckBoxPrint)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jCheckBoxOutput)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldFileRoot, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jCheckBoxPlot)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldPlotItems, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(5, 5, 5)
                .addComponent(jLabelFont)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldFontSize, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jCheckBoxShortNames)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelOutput, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelCommonLayout.setVerticalGroup(
            jPanelCommonLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelOutput, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelCommonLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jCheckBoxPrint)
                .addComponent(jCheckBoxOutput)
                .addComponent(jTextFieldFileRoot, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jCheckBoxPlot)
                .addComponent(jTextFieldPlotItems, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jCheckBoxShortNames)
                .addComponent(jTextFieldFontSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jLabelFont, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE))
        );

        jPanelRemote.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        org.openide.awt.Mnemonics.setLocalizedText(jButtonRemote, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonRemote.text")); // NOI18N
        jButtonRemote.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonRemoteActionPerformed(evt);
            }
        });

        jTextFieldHost.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextFieldHost.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldHost.text")); // NOI18N

        jTextFieldFreq.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextFieldFreq.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldFreq.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabelFreq, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelFreq.text")); // NOI18N

        jTextFieldPort.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextFieldPort.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldPort.text")); // NOI18N
        jTextFieldPort.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextFieldPortActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(jLabelHost, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelHost.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabelPort, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelPort.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jButtonShutdown, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jButtonShutdown.text")); // NOI18N
        jButtonShutdown.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonShutdownActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelRemoteLayout = new javax.swing.GroupLayout(jPanelRemote);
        jPanelRemote.setLayout(jPanelRemoteLayout);
        jPanelRemoteLayout.setHorizontalGroup(
            jPanelRemoteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelRemoteLayout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(jLabelHost)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldHost, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabelPort)
                .addGap(6, 6, 6)
                .addComponent(jTextFieldPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(jPanelRemoteLayout.createSequentialGroup()
                .addComponent(jButtonRemote)
                .addGap(22, 22, 22)
                .addComponent(jButtonShutdown)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelFreq)
                .addGap(2, 2, 2)
                .addComponent(jTextFieldFreq, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        jPanelRemoteLayout.setVerticalGroup(
            jPanelRemoteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelRemoteLayout.createSequentialGroup()
                .addGroup(jPanelRemoteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelRemoteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jButtonRemote)
                        .addComponent(jButtonShutdown))
                    .addComponent(jLabelFreq))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelRemoteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldHost, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelHost)
                    .addComponent(jLabelPort)
                    .addComponent(jTextFieldPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(jPanelRemoteLayout.createSequentialGroup()
                .addComponent(jTextFieldFreq, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        jPanelFile.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        jLabelTime.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(jLabelTime, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelTime.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabelFilename, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabelFilename.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jLabel6.text")); // NOI18N

        jTextFieldControllersDir.setText(org.openide.util.NbBundle.getMessage(ControlPanelTopComponent.class, "ControlPanelTopComponent.jTextFieldControllersDir.text")); // NOI18N

        javax.swing.GroupLayout jPanelFileLayout = new javax.swing.GroupLayout(jPanelFile);
        jPanelFile.setLayout(jPanelFileLayout);
        jPanelFileLayout.setHorizontalGroup(
            jPanelFileLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelFileLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel6)
                .addGap(18, 18, 18)
                .addComponent(jTextFieldControllersDir, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 17, Short.MAX_VALUE))
            .addGroup(jPanelFileLayout.createSequentialGroup()
                .addComponent(jLabelTime, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabelFilename, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanelFileLayout.setVerticalGroup(
            jPanelFileLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelFileLayout.createSequentialGroup()
                .addGroup(jPanelFileLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelTime)
                    .addComponent(jLabelFilename))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelFileLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel6)
                    .addComponent(jTextFieldControllersDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout jPanelControlsLayout = new javax.swing.GroupLayout(jPanelControls);
        jPanelControls.setLayout(jPanelControlsLayout);
        jPanelControlsLayout.setHorizontalGroup(
            jPanelControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelControlsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanelCommon, javax.swing.GroupLayout.DEFAULT_SIZE, 844, Short.MAX_VALUE)
                    .addGroup(jPanelControlsLayout.createSequentialGroup()
                        .addComponent(jPanelLocal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jPanelRemote, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jPanelFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanelControlsLayout.setVerticalGroup(
            jPanelControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelControlsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jPanelFile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanelLocal, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                    .addComponent(jPanelRemote, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelCommon, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel1.add(jPanelControls, java.awt.BorderLayout.PAGE_END);

        mainPanel.add(jPanel1, java.awt.BorderLayout.CENTER);

        add(mainPanel, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private class TimeLabelListener implements PropertyChangeListener {

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (ControlHierarchyEventMonitor.TIME.equals(evt.getPropertyName())) {
                jLabelTime.setText((String) evt.getNewValue());
            }
        }
    }

    private void jButtonStartActionPerformed(java.awt.event.ActionEvent evt) {                                             
        cph.setStep(false);
        if ("Start".equals(jButtonStart.getText()) || "Resume".equals(jButtonStart.getText())) {
            if ("Start".equals(jButtonStart.getText())) {
                try {
                    cph.init();
                } catch (Exception ex) {
                    //LOG.warning(ex.toString());
                    Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
                    LOG.warning("System exitint");
                    System.exit(0);
                }
            }
            LOG.info("+++ start ");
            if (cph.isFinished()) {
                plotPanelHelper.empty();
            }
            jButtonStart.setText("Stop");
            if (cph != null) {
                Thread tt = new Thread(cph);
                tt.start();
                LOG.info("+++ started thread ");
            }
        } else if ("Stop".equals(jButtonStart.getText())) {
            LOG.info("+++ stop ");
            jButtonStart.setText("Resume");
            if (cph != null) {
                cph.setStep(true);
                try {
                    cph.stop();
                } catch (Exception ex) {
                    Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }


    }                                            

    private String getOutputFileName(String file) {

        String home = System.getProperty("user.home");
        String os = System.getProperty("os.name");
        File dir;
        if (os.equalsIgnoreCase("linux")) {
            dir = new File(home + "/tmp/PCT/");
            if (!dir.exists()) {
                dir.mkdir();
            }
        } else {
            dir = new File(home + "\\tmp\\PCT\\Controllers\\");
            if (!dir.exists()) {
                dir.mkdir();
            }

        }
        
        String outputFile = dir + File.separator + file + ".csv";
        LOG.log(Level.INFO, "Output file path {0}", outputFile);
        File f = new File(outputFile);
        if (f.exists()) {
            f.delete();
        }
        return outputFile;
    }

    @SuppressWarnings("SleepWhileInLoop")
    private void jButtonOpenFileActionPerformed(java.awt.event.ActionEvent evt) {                                                

        LOG.info("+++ openFileAction");
        monitor.clear();

        jButtonStart.setText("Start");
        if (cph != null) {
            try {
                cph.close();
            } catch (Exception ex) {
                Exceptions.printStackTrace(ex);
            }

            if (!jButtonStart.getText().equals("Start")) {
                while (!cph.isFinished()) {
                    LOG.log(Level.INFO, "+++ Waiting for closedown");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        Exceptions.printStackTrace(ex);
                    }
                }
            }
        }
        jButtonStart.setText("Start");

        int returnVal = jFileChooser.showOpenDialog(super.getComponent(0));

        String currentDir = jFileChooser.getCurrentDirectory().getName();
        LOG.log(Level.INFO, "+++ {0}", currentDir);
        if (!currentDir.equalsIgnoreCase(env)) {
            jFileChooser.setCurrentDirectory(new File(currentDir));
        }

        int pdil = Integer.parseInt(jTextFieldPlotItems.getText());
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = jFileChooser.getSelectedFile();

            LOG.log(Level.INFO, "Opening: {0}.", file.getAbsolutePath());
            try {
                jLabelFilename.setText(file.getName());
                Environment.getInstance().setFilePath(file.getAbsolutePath());
                Environment.getInstance().setFileRoot(file.getName());
                cph = new ControlPanelHelper(file, jCheckBoxPrint.isSelected(), jCheckBoxOutput.isSelected(), monitor, pdil);
                if (jCheckBoxOutput.isSelected()) {
                    jTextFieldFileRoot.setText(Environment.getInstance().getFileRoot().substring(0, Environment.getInstance().getFileRoot().length()));
                    cph.setOutputFile(getOutputFileName(Environment.getInstance().getFileRoot().substring(0, Environment.getInstance().getFileRoot().length())));
                }
                cph.setTimeLabel(jLabelTime);
                cph.constructGUI(jPanelLayers);
                //jPanelPlot.add(cph.getPlotPanel());
                if (jCheckBoxPlot.isSelected()) {

                    Set<TopComponent> setTc = WindowManager.getDefault().getRegistry().getOpened();
                    for (TopComponent tc : setTc) {
                        LOG.info("+++ TC " + tc.getName());
                    }
                    pjp = (PlotPanelTopComponent) WindowManager.getDefault().findTopComponent("PlotPanelTopComponent");
                    if (plotPanelHelper == null) {
                        if (pjp == null) {
                            pjp = new PlotPanelTopComponent(cph);
                        }
                        plotPanelHelper = pjp.getPlotPanelHelper();
                        if (pjp.getCph() == null) {
                            pjp.setCph(cph);
                        }
                        plotPanelHelper.addPlotPanel(pjp, cph);
                    } else {
                        plotPanelHelper.clear();
                        pjp.setCph(cph);
                        plotPanelHelper.updateControllersListModel(cph);
                        plotPanelHelper.loadPlotsResource();
                    }
                    cph.setPlotPanelHelper(plotPanelHelper);
                }
                this.getComponent(0).revalidate();
                this.getComponent(0).repaint();
                //cph.setLayerPanel(jPanelLayers);
            } catch (Exception ex) {
                Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
                //  System.exit(0);
            }
        } else {
            LOG.info("Open command cancelled by user.");
        }

    }                                               

    private void jButtonDescriptionActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        JTextArea jTextAreaDescription1 = new JTextArea();
        JFrame descriptionFrame = new JFrame("Description");
        String description = null;
        if (cph == null) {
            description = "Select a controller";
        } else {
            try {
                description = cph.getDescription();
            } catch (Exception ex) {
                Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        descriptionFrame.add(jTextAreaDescription1);

        jTextAreaDescription1.setText(description);

        descriptionFrame.pack();
        descriptionFrame.setVisible(true);
        descriptionFrame.setSize(600, 300);

    }                                                  

    private void jButtonParametersActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        JFrame parametersFrame = new JFrame("Parameters");
        JPanel jPanel = new JPanel();
        JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(jPanel);
        parametersFrame.add(jsp);
        if (cph == null) {
            JTextArea jTextAreaDescription = new JTextArea();
            jPanel.add(jTextAreaDescription);
            jTextAreaDescription.setText("Controller not yet selected");
        } else {
            ParameterslPanelHelper pph = new ParameterslPanelHelper();
            pph.setControlHierarchy(cph.getControlHierarchy());
            pph.constructGUI(jPanel);
        }

        parametersFrame.pack();
        parametersFrame.setVisible(true);
    }                                                 

    private void jButtonStepActionPerformed(java.awt.event.ActionEvent evt) {                                            
        cph.setStep(true);
        //logger.info("+++ step");
        if (cph != null) {
            if (jButtonStart.getText().equalsIgnoreCase("start")) {
                try {
                    cph.init();
                } catch (Exception ex) {
                    Exceptions.printStackTrace(ex);
                }
            }
            jButtonStart.setText("Resume");
            try {
                cph.stop();
            } catch (Exception ex) {
                Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
            }
            Thread tt = new Thread(cph);
            tt.start();
            //logger.info("+++ started step thread ");
        }
    }                                           

    @SuppressWarnings("SleepWhileInLoop")
    private void jButtonRemoteActionPerformed(java.awt.event.ActionEvent evt) {                                              
        monitor.clear();
        if (jButtonRemote.getText().equalsIgnoreCase("connect")) {
            try {
                LOG.info("+++ connecting ...");
                try {
                    int pdil = Integer.parseInt(jTextFieldPlotItems.getText());

                    cph = new ControlPanelHelper(jTextFieldHost.getText(),
                            Integer.parseInt(jTextFieldPort.getText()),
                            Integer.parseInt(jTextFieldPort.getText()) + 1,
                            Integer.parseInt(jTextFieldFreq.getText()),
                            jCheckBoxPrint.isSelected(),
                            jCheckBoxOutput.isSelected(),
                            monitor, pdil, jTextFieldControllersDir.getText(), 20000);

                    jTextFieldFileRoot.setText(cph.getOutputFile());
                    cph.setTimeLabel(jLabelTime);
                    cph.constructGUI(jPanelLayers);

                    jLabelFilename.setText(Environment.getInstance().getFileRoot());

                    if (jCheckBoxPlot.isSelected()) {
                        Set<TopComponent> setTc = WindowManager.getDefault().getRegistry().getOpened();
                        for (TopComponent tc : setTc) {
                            LOG.log(Level.INFO, "+++ TC {0}", tc.getName());
                        }
                        pjp = (PlotPanelTopComponent) WindowManager.getDefault().findTopComponent("PlotPanelTopComponent");
                        if (plotPanelHelper == null) {
                            if (pjp == null) {
                                pjp = new PlotPanelTopComponent(cph);
                            }
                            plotPanelHelper = pjp.getPlotPanelHelper();
                            if (pjp.getCph() == null) {
                                pjp.setCph(cph);
                            }
                            plotPanelHelper.addPlotPanel(pjp, cph);
                        } else {
                            plotPanelHelper.clear();
                            pjp.setCph(cph);
                            plotPanelHelper.updateControllersListModel(cph);
                            plotPanelHelper.loadPlotsResource();
                        }
                        cph.setPlotPanelHelper(plotPanelHelper);
                    }
                    jButtonRemote.setText("Disconnect");
                } catch (Exception ex) {
                    Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
                    //  System.exit(0);
                }

                if (cph != null) {
                    Thread tt = new Thread(cph);
                    tt.start();
                    LOG.info("+++ started cph thread ");
                }

            } catch (NumberFormatException ex) {
                Exceptions.printStackTrace(ex);
            }
        } else {
            disconnect();
        }

    }                                             

    private void disconnect() {
        LOG.info("+++ disconnecting ...");
        try {
            if (cph != null) {
                cph.stop();
                cph.close();
            }
        } catch (Exception ex) {
            Logger.getLogger(ControlPanelTopComponent.class.getName()).log(Level.SEVERE, null, ex);
        }

        jButtonRemote.setText("Connect");
    }

    private void jTextFieldPortActionPerformed(java.awt.event.ActionEvent evt) {                                               
        // TODO add your handling code here:
    }                                              

    private void jCheckBoxShortNamesActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        Environment.getInstance().setShortNames(jCheckBoxShortNames.isSelected());
    }                                                   

    private void jButtonShutdownActionPerformed(java.awt.event.ActionEvent evt) {                                                

        if (cph != null) {
            cph.shutdown();
        }

        disconnect();
    }                                               

    private void plotLimitChange(java.beans.PropertyChangeEvent evt) {                                 
        if (cph != null) {
            cph.setPlotDataItemsLimit(Integer.parseInt(jTextFieldPlotItems.getText()));
        }
    }                                

    private void fontSizeChange(java.beans.PropertyChangeEvent evt) {                                
        //Environment.getInstance().setFontSize(Integer.parseInt(jTextFieldFontSize.getText()));
    }                               

    private void focusFontSize(java.awt.event.FocusEvent evt) {                               
        Environment.getInstance().setFontSize(Integer.parseInt(jTextFieldFontSize.getText()));
    }                              

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButtonDescription;
    private javax.swing.JButton jButtonOpenFile;
    private javax.swing.JButton jButtonParameters;
    private javax.swing.JButton jButtonRemote;
    private javax.swing.JButton jButtonShutdown;
    private javax.swing.JButton jButtonStart;
    private javax.swing.JButton jButtonStep;
    private javax.swing.JCheckBox jCheckBoxOutput;
    private javax.swing.JCheckBox jCheckBoxPlot;
    private javax.swing.JCheckBox jCheckBoxPrint;
    private javax.swing.JCheckBox jCheckBoxShortNames;
    private javax.swing.JFileChooser jFileChooser;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabelFilename;
    private javax.swing.JLabel jLabelFont;
    private javax.swing.JLabel jLabelFreq;
    private javax.swing.JLabel jLabelHost;
    private javax.swing.JLabel jLabelPort;
    private javax.swing.JLabel jLabelTime;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanelCommon;
    private javax.swing.JPanel jPanelControls;
    private javax.swing.JPanel jPanelFile;
    private javax.swing.JPanel jPanelLayers;
    private javax.swing.JPanel jPanelLocal;
    private javax.swing.JPanel jPanelMainLayers;
    private javax.swing.JPanel jPanelOutput;
    private javax.swing.JPanel jPanelRemote;
    private javax.swing.JTextField jTextFieldControllersDir;
    private javax.swing.JTextField jTextFieldFileRoot;
    private javax.swing.JTextField jTextFieldFontSize;
    private javax.swing.JTextField jTextFieldFreq;
    private javax.swing.JTextField jTextFieldHost;
    private javax.swing.JTextField jTextFieldPlotItems;
    private javax.swing.JTextField jTextFieldPort;
    private javax.swing.JPanel mainPanel;
    // End of variables declaration                   
    private ControlPanelHelper cph;
    private boolean connected = false;
    //private DefaultListModel functionsListModel = null;
    private HashMap<String, String> hmFunctions;
    private List<String> selectedFunctions = null;
    private PlotPanelHelper plotPanelHelper = null;
    private PlotPanelTopComponent pjp = null;
    private ControlHierarchyEventMonitor monitor;
    private ControlDataClient mc = null;
    private String env = null;

    @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");
        // TODO store your settings
    }

    void readProperties(java.util.Properties p) {
        String version = p.getProperty("version");
        // TODO read your settings according to their version
    }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.