/*
 * Planai.java
 *
 * Created on Šeštadienis, 2004, Gegužės 22, 18.49
 */

//package planai;

import java.net.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;

/**
 *
 * @author  Alex Jakušev
 */
public class Planai extends javax.swing.JApplet implements TableColumnModelListener {
    
    /** total number of plan parameters.
     * set during data reading
     */
    int parametru_sk = 0;
    /** total number of plans.
     * set during data reading
     */
    int planu_sk = 0;
    /** parametru reiksmes [planu_sk][parametru_sk]
     */
    double parametrai[][]; /* */
    /** parametru verciu daugikliai [parametru_sk]
     */
    double daugikliai[]; /* */
 double daugikliaia[];
    /** planu pavadinimai [planu_sk]
     */
    String strPlanai[]; /* */
    /** tiekeju pavadinimai [planu_sk]
     */
    String strTiekejai[]; 
    /** Parametru pavadinimai
     */
    String strParams[];
    /** geriausi planai masyve zymimi vienetu 
     */
    int geriausi[], reikalingi[]; 
    /** About dialog
     */
    AboutDialog About = null; /* */
    /** Help dialog
     */
    HelpDialog HelpDlg = null; /* */
    /** This array is an index of displayed array element
     * numbers, [planu_sk]. Only values from 0 to displayedPlans
     * are valid, however.
     */
    int[] planDisplayIndex; /* */
    /** total amount of plans to be displayed
     */
    int displayedPlans = 0; /* */
   
    /** Very general class for all plans tablemodels,
     * used as ancestor
     */
    abstract class PlansRelatedModel extends AbstractTableModel {
        
        public Class getColumnClass(int columnIndex) {
            if ( columnIndex < 2 )
                return String.class;
            else 
                return Double.class;
        }
        
        public int getColumnCount() {
            return 2 + parametru_sk;
        }
        
    } /* */
    
    /** Table model for plans
     */
    class PlansTableModel extends PlansRelatedModel {
        
        public int getRowCount() {
            return displayedPlans;
        }
        
        public boolean isCellEditable(int row, int col) { 
            if ( col < 2 )
                return false;
            
            return jRadioButtonShowAll.isSelected();
        }
        
        public void setValueAt(Object value, int row, int col) {
            if ( (col < 2 ) || (!jRadioButtonShowAll.isSelected()) )
                return; 
            
            parametrai[ planDisplayIndex[row] ][ col-2 ] = 
              ((Double) value).doubleValue();
            fireTableCellUpdated(row, col);
        }
        
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch ( columnIndex ) {
                case 0 :
                    return strTiekejai[ planDisplayIndex[rowIndex] ];
                case 1 :
                    return strPlanai[ planDisplayIndex[rowIndex] ];
                default :
                    return new Double( 
                      parametrai[planDisplayIndex[ rowIndex ] ][columnIndex-2] 
                      );
            }
        }
        
        public String getColumnName(int col) {
            switch (col) {
                case 0 :
                    return "Tiek\u0117jas";
                case 1 :
                    return "Planas";
                default :
                    return strParams[col-2];
            }
        }
    } /* */
    
    



    /** Table model for weights
     */
    class WeightsTableModel extends PlansRelatedModel {
        
        public int getRowCount() {
            return 1;
        }
        
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch (columnIndex ) {
                case 0 : 
                    return "Eili\u0161kumas";
                case 1 : 
                    return "/ svoris";
                default :
                    return new Double( daugikliai[columnIndex-2] );
            }
        }
        
        public boolean isCellEditable(int row, int col) { 
            return col >= 2;
        }
        
        public void setValueAt(Object value, int row, int col) {
            if (col < 2 )
                return; 
            
            daugikliai[ col-2 ] = 
              ((Double) value).doubleValue();
            fireTableCellUpdated(row, col);
        }
        
    }
 
    /** general table that performs common to all tables 
     * in Planai tasks
     */
    class GeneralTable extends javax.swing.JTable {
        
        //Implement table header tool tips.
        protected JTableHeader createDefaultTableHeader() {
            return new JTableHeader(columnModel) {
                public String getToolTipText(MouseEvent e) {
                    java.awt.Point p = e.getPoint();
                    int index = columnModel.getColumnIndexAtX(p.x);
                    int realIndex = 
                        columnModel.getColumn(index).getModelIndex();

                    switch( realIndex ) {
                        case 0 :
                            return super.getToolTipText(e);
                        case 1 :
                            return super.getToolTipText(e);
                        default :
                            return strParams[realIndex-2];
                    }
                }
            };
        }        
        
        //Implement table cell tool tips.
        public String getToolTipText(MouseEvent e) {
            String tip = null;
            java.awt.Point p = e.getPoint();
            int colIndex = columnAtPoint(p);
            int realColumnIndex = convertColumnIndexToModel(colIndex);
            
            switch( realColumnIndex ) {
                case 0 :
                    return super.getToolTipText(e);
                case 1 :
                    return super.getToolTipText(e);
                default :
                    return strParams[realColumnIndex-2];
            }
        }
    } /* */
    
    /** Initializes the applet Planai */
    public void init() {
        initComponents();
        
        jTablePlans.getColumnModel().addColumnModelListener(this);
    }
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        java.awt.GridBagConstraints gridBagConstraints;

        buttonGroupShowType = new javax.swing.ButtonGroup();
        buttonGroup1 = new javax.swing.ButtonGroup();
        jScrollPaneTable = new javax.swing.JScrollPane();
        jTablePlans = new Planai.GeneralTable();
        jPanelControl = new javax.swing.JPanel();
        jTableWeights = new Planai.GeneralTable();
        jLabelFile = new javax.swing.JLabel();
        jTextFieldFile = new javax.swing.JTextField();
        jPanelShowType = new javax.swing.JPanel();
        jRadioButtonVect = new javax.swing.JRadioButton();
        jRadioButtonScalar = new javax.swing.JRadioButton();
        jRadioButtonShowAll = new javax.swing.JRadioButton();
        jScrollPaneProviders = new javax.swing.JScrollPane();
        jListProviders = new javax.swing.JList();
        jButtonHelp = new javax.swing.JButton();
        jButtonAbout = new javax.swing.JButton();
        jButtonReadFile = new javax.swing.JButton();

        jScrollPaneTable.setToolTipText("Plan\u0173 s\u0105ra\u0161as");
        jScrollPaneTable.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jTablePlans.setModel(new Planai.PlansTableModel());
        jTablePlans.setToolTipText("Plan\u0173 s\u0105ra\u0161as");
        jScrollPaneTable.setViewportView(jTablePlans);

        getContentPane().add(jScrollPaneTable, java.awt.BorderLayout.CENTER);

        jPanelControl.setLayout(new java.awt.GridBagLayout());

        jPanelControl.setToolTipText("Programos valdymas");
        jTableWeights.setModel(new Planai.WeightsTableModel());
        jTableWeights.setToolTipText("Eili\u0161kumas / svoris");
        jTableWeights.setCellSelectionEnabled(true);
        jTableWeights.setRowHeight(20);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 5;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 1, 0, 17);
        jPanelControl.add(jTableWeights, gridBagConstraints);

        jLabelFile.setDisplayedMnemonic('D');
        jLabelFile.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabelFile.setLabelFor(jTextFieldFile);
        jLabelFile.setText("Duomen\u0173 failas : ");
        jLabelFile.setToolTipText("Pilnas kelias iki pasirinkto duomen\u0173 failo");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        jPanelControl.add(jLabelFile, gridBagConstraints);

        jTextFieldFile.setToolTipText("Pilnas kelias iki pasirinkto duomen\u0173 failo");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0);
        jPanelControl.add(jTextFieldFile, gridBagConstraints);

        jPanelShowType.setLayout(new java.awt.GridLayout(1, 0));

        jPanelShowType.setBorder(new javax.swing.border.TitledBorder("Optimalus planas :"));
        jPanelShowType.setToolTipText("Pasirinkite, k\u0105 vaizduoti");
        
        jRadioButtonVect.setMnemonic('V');
        jRadioButtonVect.setText("Vektorinis");
        buttonGroupShowType.add(jRadioButtonVect);
        jRadioButtonVect.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AlgorithmSelected(evt);
            }
        });

        jPanelShowType.add(jRadioButtonVect);

        jRadioButtonScalar.setMnemonic('S');
        jRadioButtonScalar.setText("Skaliarinis");
        buttonGroupShowType.add(jRadioButtonScalar);
        jRadioButtonScalar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AlgorithmSelected(evt);
            }
        });

        jPanelShowType.add(jRadioButtonScalar);

        jRadioButtonShowAll.setMnemonic('P');
        jRadioButtonShowAll.setSelected(true);
        jRadioButtonShowAll.setText("Parodyti visus");
        jRadioButtonShowAll.setToolTipText("Parodyti visus galimus planus");
        buttonGroupShowType.add(jRadioButtonShowAll);
        jRadioButtonShowAll.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AlgorithmSelected(evt);
            }
        });

        jPanelShowType.add(jRadioButtonShowAll);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 4.0;
        jPanelControl.add(jPanelShowType, gridBagConstraints);

        jScrollPaneProviders.setPreferredSize(new java.awt.Dimension(30, 50));
        jListProviders.setToolTipText("Pasirinkite, kokius tiek\u0117jus nagrin\u0117ti. \nNaudokite Shift ir Ctrl tam, kad pasirinkti \nkelius tiek\u0117jus.");
        jScrollPaneProviders.setViewportView(jListProviders);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 4;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridheight = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.weightx = 2.0;
        jPanelControl.add(jScrollPaneProviders, gridBagConstraints);

        jButtonHelp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/HELP.gif")));
        jButtonHelp.setMnemonic('G');
        jButtonHelp.setText("Pagalba");
        jButtonHelp.setToolTipText("Naudojimosi instrukcija");
        jButtonHelp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                HelpButtonClicked(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0);
        jPanelControl.add(jButtonHelp, gridBagConstraints);

        jButtonAbout.setIcon(new javax.swing.ImageIcon(getClass().getResource("/BULBON.gif")));
        jButtonAbout.setMnemonic('A');
        jButtonAbout.setText("Apie program\u0105");
        jButtonAbout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AboutButtonClicked(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0);
        jPanelControl.add(jButtonAbout, gridBagConstraints);

        jButtonReadFile.setIcon(new javax.swing.ImageIcon(getClass().getResource("/FILEOPEN.gif")));
        jButtonReadFile.setMnemonic('N');
        jButtonReadFile.setText("Nuskaityti fail\u0105");
        jButtonReadFile.setToolTipText("Nuskaityti pasirinkt\u0105 fail\u0105");
        jButtonReadFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ReadFileButtonClicked(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 3);
        jPanelControl.add(jButtonReadFile, gridBagConstraints);

        getContentPane().add(jPanelControl, java.awt.BorderLayout.SOUTH);

    }//GEN-END:initComponents

    /** This procedure modifies planDisplayed to 
     * mark all plans, whose provider 
     * is selected in listox, as selected.
     */
    protected void DisplayAll() {
        int i;
        Object[] o = jListProviders.getSelectedValues();
        Vector v = new Vector(  );
        for( i = 0; i < o.length; i++ )
            v.add( o[i] );
      
        displayedPlans = 0;
        for ( i = 0; i < planu_sk; i++ )
            if( v.contains( strTiekejai[i] ) ) 
                planDisplayIndex[ displayedPlans++ ] = i;
    } /* */
    
    /** This procedure modifies planDisplayed to 
     * mark best plans determined by scalar way from
     * plans whose provider is selected in listox, 
     * as selected.
     */
    protected void DisplayScalar() {
        // determine all plan candidates
        DisplayAll(); // we now have good displayedPlans and planDisplayIndex
        
        if ( displayedPlans < 2 ) // nothing to choose from
            return;

        double skaliarai[] = new double[displayedPlans];
        int i, j;
        
        // find scalar plan values
        for ( i = 0; i < displayedPlans; i++ ) {
            skaliarai[i] = 0;
            for ( j = 0; j < parametru_sk; j++ )
                skaliarai[i] += parametrai[planDisplayIndex[i]][j]*daugikliai[j];
        }

        
        // find best plan value
        double geriausias = skaliarai[0];
        for( i = 1; i < displayedPlans; i++ )
            if (skaliarai[i] < geriausias)
                geriausias = skaliarai[i]; // geriausias - maziausias
        
        // remove not the best plans
        for( i = displayedPlans-1; i >= 0; i-- ) {
            if ( skaliarai[i] == geriausias )
                continue;
       
            for (j=i; j < displayedPlans-1; j++) 
                planDisplayIndex[j] = planDisplayIndex[j+1];
            displayedPlans--;
        }
    } /* */
    
    /** This procedure modifies planDisplayed to 
     * mark best plans determined by vector way from
     * plans whose provider is selected in listox, 
     * as selected.
     */
    protected void DisplayVect() {

 // determine all plan candidates
        DisplayAll(); // we now have good displayedPlans and planDisplayIndex
        
        if ( displayedPlans < 2 ) // nothing to choose from
            return;

        int j, i, k, l, nr = 0, pr = 0, pab = parametru_sk, temp;
        boolean geras = true, param_geriau = false, param_blogiau = false;
        int map[] = new int[parametru_sk]; // indexes for parameters
        for ( i = 0; i < parametru_sk; i++)	{
            map[i] = i;
        }
        
        // bubble sort parameters by importance, from least to most
        for ( i = 1; i < parametru_sk-1; i++) {
            for ( j = 0; j < parametru_sk; j++) {
               // if ( daugikliai[map[j]] > daugikliai[map[j + 1]])
              {
                daugikliai[map[j]]=1;                    
              
    		}
            }
        }   

        // parameters with negative or zero weights are omitted
        while ( nr < parametru_sk && daugikliai[map[nr]] <= 0)
            nr++;

        // main cycle - eliminates not the best
        while ( (nr < parametru_sk) && (displayedPlans > 1) ) {
            /// parameters with the same weight are processed at the same time
            /// determine range of such parameters
            pr = pab = nr;

            while ( (nr + 1 < parametru_sk) && (daugikliai[map[nr]] == daugikliai[map[nr + 1]])) {
                nr++;
                pab = nr;
            }
            
            // eliminate bad plans for given range
            for ( i = displayedPlans-1; i >= 0; i-- ) {
                // checking if plan i is good
                geras = true;
                for ( k = 0; (geras == true) && (k < displayedPlans); k++) {
                    if ( k == i ) // don't check a plan against itself
                        continue;
                    
                    // check if plan i is good in comparison to plan k
                    param_geriau = false;
                    param_blogiau = false;
                    for ( l = pr; (param_geriau == false) && (l <= pab); l++) {
                        if ( parametrai[planDisplayIndex[i]][map[l]] > parametrai[planDisplayIndex[k]][map[l]] )
                            param_blogiau = true; // kuo mazesnis, tuo geresnis
                        if ( parametrai[planDisplayIndex[i]][map[l]] < parametrai[planDisplayIndex[k]][map[l]])
                            param_geriau = true;
                    }

                    // if plan i is totally worse than k, it is to be removed
                    if ( !param_geriau && param_blogiau)
                        geras = false;
                }
                
                // removing plan i, if not good
                if (!geras) {
                    for (k=i; k < displayedPlans-1; k++) 
                        planDisplayIndex[k] = planDisplayIndex[k+1];
                    displayedPlans--;
                }
            }
            
            // and, finally
            nr++;
        }
    } 
    
    /** This procedure is called every time when user changes
     * (or simply repeats selection) of data display method
     */
    private void AlgorithmSelected(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AlgorithmSelected
        if ( jRadioButtonShowAll.isSelected() )
            DisplayAll();
        else if ( jRadioButtonScalar.isSelected() )
            DisplayScalar();
        else if ( jRadioButtonVect.isSelected() )
            DisplayVect();
   
        // and, finally
        ((AbstractTableModel) jTablePlans.getModel()).fireTableDataChanged();
    }//GEN-LAST:event_AlgorithmSelected

    /** This procedure is executed when "Read File" button is clicked
     * in any way.
     */
    private void ReadFileButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ReadFileButtonClicked
        LoadData();
    }//GEN-LAST:event_ReadFileButtonClicked

    /** This procedure is executed when "About" button is clicked
     * in any way.
     */
    private void AboutButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutButtonClicked
        if ( About == null )
            About = new AboutDialog( null, true );
        About.show();
    }//GEN-LAST:event_AboutButtonClicked

    /** This procedure is executed when "Help" button is clicked
     * in any way.
     */
    private void HelpButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_HelpButtonClicked
        if ( HelpDlg == null )
            HelpDlg = new HelpDialog( null, true );
        HelpDlg.show();
    }//GEN-LAST:event_HelpButtonClicked

    /** execution start for Planai, loads data etc. */
    public void start() {
        jTextFieldFile.setText(getCodeBase() + "planai1.txt");
        LoadData();
    } /* */   

    /** This routine reads data from file to 
     * internal arrays.
     */
    protected void ReadDataFromFile() throws IOException, MalformedURLException
    {
        URL url = new URL( jTextFieldFile.getText() );
        String line;
        StringTokenizer toke;
        int i;
        
        // establish connection to a file
        URLConnection urlCon = url.openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader( urlCon.getInputStream() ) );
        try {
            // determine number of parameters -> parametru_sk
            line = in.readLine();
            toke = new StringTokenizer( line );
            parametru_sk = -2;
            while ( toke.hasMoreTokens() ) { 
                toke.nextToken( "\t" );
                parametru_sk++; 
            }
            
            // determine number of plans -> planu_sk
            for ( planu_sk = 0; in.readLine() != null; planu_sk++) ;
        } finally {
            in.close();
        }
        
        // allocate space
        parametrai = new double[planu_sk][parametru_sk];
        daugikliai = new double[parametru_sk];
        daugikliaia = new double[100];
        strPlanai = new String[planu_sk];
        strTiekejai = new String[planu_sk];
        strParams = new String[parametru_sk];
        displayedPlans = 0;
        planDisplayIndex = new int[planu_sk];

        // establish connection to a file
        urlCon = url.openConnection();
        in = new BufferedReader( new InputStreamReader( urlCon.getInputStream() ) );
        try {
            // load parameter names
            line = in.readLine(); 
            toke = new StringTokenizer( line );
            toke.nextToken("\t");
            toke.nextToken("\t");
            for ( i = 0; i < parametru_sk; i++ ) {
                daugikliai[i] = 1;
                strParams[i] = toke.nextToken("\t");
            }
          
            // load data from file
            i = 0;
            while ( (line = in.readLine()) != null) {
                toke = new StringTokenizer(line);
                strTiekejai[i] = toke.nextToken("\t");
                strPlanai[i] = toke.nextToken("\t");
                planDisplayIndex[i] = 0;
                for ( int iParamNr = 0; iParamNr < parametru_sk; iParamNr++)
                try {
                    Double d = Double.valueOf(toke.nextToken("\t"));
                    parametrai[i][iParamNr] = d.doubleValue();
                } catch(Exception e) {
                    parametrai[i][iParamNr] = 0;
                }
                i++;
            }
        } finally {
            in.close();
        }
        
        // and, finally
        ((AbstractTableModel) jTablePlans.getModel()).fireTableStructureChanged();
        ((AbstractTableModel) jTableWeights.getModel()).fireTableStructureChanged();
    } /* */
    
    /** This routine extract all providers to 
     * list box
     */
    protected void PopulateTiekejai() {
        Vector v = new Vector();
        int i;
        
        for( i = 0; i < planu_sk; i++ )
            if ( v.indexOf(strTiekejai[i]) < 0 )
                v.add(strTiekejai[i]);
        
        jListProviders.setListData( v );
  
        // select all indices
        int ind[] = new int[ v.size() ];
        for ( i = 0; i < v.size(); i++ )
            ind[i] = i;
        jListProviders.setSelectedIndices( ind );
    } /* */
    
    /** This procedure adjusts table column widths 
     * poroportionally to the displayed data
     */
    protected void AdjustColumnWidths() {
        int i,l,j, prefs[] = {0,0,0};
        java.awt.FontMetrics fm = getFontMetrics( jTablePlans.getFont() );

        // calculate widths
        for ( i = 0; i < planu_sk; i++ ) {
            l = fm.stringWidth( strTiekejai[i] );
            prefs[0] = prefs[0] > l ? prefs[0] : l;
            l = fm.stringWidth( strPlanai[i] );
            prefs[1] = prefs[1] > l ? prefs[1] : l;
            
            for ( j = 0; j < parametru_sk; j++ ) {
                l = fm.stringWidth( Double.toString( parametrai[i][j] ) );
                prefs[2] = prefs[2] > l ? prefs[2] : l;
            }
        }
        
        // set preferred widths
        for ( i = 0; i < jTablePlans.getColumnCount(); i++ )
            jTablePlans.getColumnModel().getColumn(i).setPreferredWidth(
              prefs[ i < 3 ? i : 2 ]
            );
    } /* */
    
    /** This procedure loads plan data into memory */
    protected void LoadData() {
        try {
            ReadDataFromFile();
            AdjustColumnWidths();
            PopulateTiekejai();
            
            // and, finally
            jRadioButtonShowAll.setSelected( true );
            AlgorithmSelected( null );
        } catch(Exception e)
        {
            jTextFieldFile.setText( "Error: " + e.toString() );
        }
    }
   
    /** implementation of TableColumnModelListener 
     * interface. 
     */
    public void columnAdded(TableColumnModelEvent e) {
    } /* */
    
    /** implementation of TableColumnModelListener 
     * interface. 
     */
    public void columnMarginChanged(ChangeEvent e) {
        int m = jTableWeights.getColumnCount();
        m = m < jTablePlans.getColumnCount() ? m : jTablePlans.getColumnCount();
        
        for (int i = 0; i < m; i++) {
            jTableWeights.getColumnModel().getColumn(i).setPreferredWidth(
              jTablePlans.getColumnModel().getColumn(i).getPreferredWidth()
            );
        }
    }
    
    /** implementation of TableColumnModelListener 
     * interface. 
     */
    public void columnMoved(TableColumnModelEvent e) {
        jTableWeights.getColumnModel().moveColumn(
          e.getFromIndex(), e.getToIndex()
        );
    }
    
    /** implementation of TableColumnModelListener 
     * interface. 
     */
    public void columnRemoved(TableColumnModelEvent e) {
    }
    
    /** implementation of TableColumnModelListener 
     * interface. 
     */
    public void columnSelectionChanged(ListSelectionEvent e) {
    }
    
 /* */
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.ButtonGroup buttonGroupShowType;
    private javax.swing.JButton jButtonAbout;
    private javax.swing.JButton jButtonHelp;
    private javax.swing.JButton jButtonReadFile;
    private javax.swing.JLabel jLabelFile;
    private javax.swing.JList jListProviders;
    private javax.swing.JPanel jPanelControl;
    private javax.swing.JPanel jPanelShowType;
    private javax.swing.JRadioButton jRadioButtonScalar;
    private javax.swing.JRadioButton jRadioButtonShowAll;
    private javax.swing.JRadioButton jRadioButtonVect;
    private javax.swing.JScrollPane jScrollPaneProviders;
    public javax.swing.JScrollPane jScrollPaneTable;
    private javax.swing.JTable jTablePlans;
    private javax.swing.JTable jTableWeights;
    private javax.swing.JTextField jTextFieldFile;
    // End of variables declaration//GEN-END:variables
    
}

