/* * 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[]; /* */ /** 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 - i; j++) { if ( daugikliai[map[j]] > daugikliai[map[j + 1]]) { temp = map[j]; map[j] = map[j + 1]; map[j + 1] = temp; } } } // 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() + "planai.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]; 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 }