src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 19 Dec 2023 00:47:41 +0100
branchv_0
changeset 41 64e564c2f069
parent 39 ec0e970e0830
child 42 d2414701ce09
permissions -rw-r--r--
buňky tabulky editovatelné po stisku mezerníku
     1 /**
     2  * Rozšířené atributy – program na správu rozšířených atributů souborů
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, either version 3 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 package cz.frantovo.rozsireneatributy.gui;
    18 
    19 import cz.frantovo.rozsireneatributy.Atribut;
    20 import cz.frantovo.rozsireneatributy.CSV;
    21 import java.awt.Toolkit;
    22 import java.awt.datatransfer.StringSelection;
    23 import java.awt.event.KeyEvent;
    24 import java.io.IOException;
    25 import java.io.StringWriter;
    26 import java.util.ResourceBundle;
    27 import java.util.logging.Level;
    28 import java.util.logging.Logger;
    29 import javax.swing.JOptionPane;
    30 import javax.swing.JTable;
    31 import javax.swing.KeyStroke;
    32 import javax.swing.ListSelectionModel;
    33 import javax.swing.event.ListSelectionEvent;
    34 import javax.swing.event.ListSelectionListener;
    35 
    36 /**
    37  * @author Ing. František Kučera (frantovo.cz)
    38  */
    39 public class Panel extends javax.swing.JPanel {
    40 
    41 	public static final int SLOUPEC_NÁZVU = 0;
    42 	public static final int SLOUPEC_HODNOTY = 1;
    43 	private static final Logger log = Logger
    44 		.getLogger(Panel.class.getSimpleName());
    45 	private static final ResourceBundle překlady = ResourceBundle
    46 		.getBundle(Atribut.class.getPackageName() + ".Překlady");
    47 	private Model model;
    48 	private Atribut vybranýAtribut;
    49 	private JTable tabulka;
    50 
    51 	public Panel(Model model) {
    52 		this.model = model;
    53 		initComponents();
    54 
    55 		tlačítkoZamknout.setEnabled(model.isZámekPodporovaný());
    56 		tlačítkoZamknout.setToolTipText(model.isZámekPodporovaný()
    57 			? překlady.getString("zamknout.popis")
    58 			: překlady.getString("chyba.lzeZamknoutJenSoubor"));
    59 
    60 		tabulka = new JTable(model);
    61 		nastavEditor();
    62 		tabulka.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    63 		posuvnýPanel.setViewportView(tabulka);
    64 
    65 		tabulka.setRowHeight((int) (tabulka.getRowHeight() * 1.3));
    66 
    67 		// Výběr aktuálního atributu v tabulce:
    68 		tabulka.getSelectionModel().addListSelectionListener(
    69 			new ListSelectionListener() {
    70 
    71 			@Override
    72 			public void valueChanged(ListSelectionEvent e) {
    73 				int řádek = tabulka.getSelectedRow();
    74 				if (řádek < 0) {
    75 					vybranýAtribut = null;
    76 					tlačítkoSmazat.setEnabled(false);
    77 				} else {
    78 					vybranýAtribut = getModel().getAtribut(řádek);
    79 					tlačítkoSmazat.setEnabled(true);
    80 				}
    81 			}
    82 		});
    83 
    84 		// Buňky tabulky editovatelné po stisku mezerníku:
    85 		tabulka.getInputMap()
    86 			.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "startEditing");
    87 	}
    88 
    89 	private void nastavEditor() {
    90 		tabulka.getColumnModel().getColumn(SLOUPEC_NÁZVU)
    91 			.setCellEditor(new EditorNázvůAtributů(model.getKonfigurace()));
    92 		tabulka.getColumnModel().getColumn(SLOUPEC_HODNOTY)
    93 			.setCellEditor(new EditorHodnotAtributů(model.getKonfigurace()));
    94 	}
    95 
    96 	private Model getModel() {
    97 		return model;
    98 	}
    99 
   100 	public void setModel(Model model) {
   101 		this.model = model;
   102 		tabulka.setModel(model);
   103 		nastavEditor();
   104 	}
   105 
   106 	private void zobrazChybovouHlášku(String hláška, Throwable chyba) {
   107 		JOptionPane.showMessageDialog(this, hláška + "\n"
   108 			+ chyba.getLocalizedMessage(),
   109 			překlady.getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE);
   110 		log.log(Level.WARNING, hláška, chyba);
   111 	}
   112 	
   113 	private void kopírujDoSchránky() {
   114 		try {
   115 			StringWriter výstup = new StringWriter();
   116 			CSV csv = new CSV(výstup);
   117 
   118 			csv.hodnota(překlady.getString("tabulka.název").toLowerCase());
   119 			csv.hodnota(překlady.getString("tabulka.hodnota").toLowerCase());
   120 			csv.konecŘádku();
   121 
   122 			for (int i = 0; i < model.getRowCount(); i++) {
   123 				csv.hodnota(String.valueOf(model.getValueAt(i, 0)));
   124 				csv.hodnota(String.valueOf(model.getValueAt(i, 1)));
   125 				csv.konecŘádku();
   126 			}
   127 
   128 			Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
   129 				new StringSelection(výstup.toString()),
   130 				null
   131 			);
   132 		} catch (Exception e) {
   133 			zobrazChybovouHlášku(překlady
   134 				.getString("chyba.nepodařiloSeZkopírovat"), e);
   135 		}
   136 	}
   137 
   138 	@SuppressWarnings("unchecked")
   139     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
   140     private void initComponents() {
   141 
   142         posuvnýPanel = new javax.swing.JScrollPane();
   143         tlačítkoPřidat = new javax.swing.JButton();
   144         tlačítkoSmazat = new javax.swing.JButton();
   145         tlačítkoZnovuNačíst = new javax.swing.JButton();
   146         tlačítkoZamknout = new javax.swing.JToggleButton();
   147         tlačítkoKopírovat = new javax.swing.JButton();
   148 
   149         tlačítkoPřidat.setMnemonic('p');
   150         java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("cz/frantovo/rozsireneatributy/Překlady"); // NOI18N
   151         tlačítkoPřidat.setText(bundle.getString("přidatAtribut")); // NOI18N
   152         tlačítkoPřidat.addActionListener(new java.awt.event.ActionListener() {
   153             public void actionPerformed(java.awt.event.ActionEvent evt) {
   154                 tlačítkoPřidatActionPerformed(evt);
   155             }
   156         });
   157 
   158         tlačítkoSmazat.setMnemonic('s');
   159         tlačítkoSmazat.setText(bundle.getString("smazatAtribut")); // NOI18N
   160         tlačítkoSmazat.setEnabled(false);
   161         tlačítkoSmazat.addActionListener(new java.awt.event.ActionListener() {
   162             public void actionPerformed(java.awt.event.ActionEvent evt) {
   163                 tlačítkoSmazatActionPerformed(evt);
   164             }
   165         });
   166 
   167         tlačítkoZnovuNačíst.setMnemonic('z');
   168         tlačítkoZnovuNačíst.setText(bundle.getString("znovuNačíst")); // NOI18N
   169         tlačítkoZnovuNačíst.addActionListener(new java.awt.event.ActionListener() {
   170             public void actionPerformed(java.awt.event.ActionEvent evt) {
   171                 tlačítkoZnovuNačístActionPerformed(evt);
   172             }
   173         });
   174 
   175         tlačítkoZamknout.setText(bundle.getString("zamknout")); // NOI18N
   176         tlačítkoZamknout.addActionListener(new java.awt.event.ActionListener() {
   177             public void actionPerformed(java.awt.event.ActionEvent evt) {
   178                 tlačítkoZamknoutActionPerformed(evt);
   179             }
   180         });
   181 
   182         tlačítkoKopírovat.setText(bundle.getString("schránka.kopírovat")); // NOI18N
   183         tlačítkoKopírovat.addActionListener(new java.awt.event.ActionListener() {
   184             public void actionPerformed(java.awt.event.ActionEvent evt) {
   185                 tlačítkoKopírovatActionPerformed(evt);
   186             }
   187         });
   188 
   189         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
   190         this.setLayout(layout);
   191         layout.setHorizontalGroup(
   192             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   193             .addGroup(layout.createSequentialGroup()
   194                 .addContainerGap()
   195                 .addComponent(tlačítkoPřidat)
   196                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   197                 .addComponent(tlačítkoSmazat)
   198                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   199                 .addComponent(tlačítkoZnovuNačíst)
   200                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   201                 .addComponent(tlačítkoZamknout)
   202                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   203                 .addComponent(tlačítkoKopírovat)
   204                 .addContainerGap(25, Short.MAX_VALUE))
   205             .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE)
   206         );
   207         layout.setVerticalGroup(
   208             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   209             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
   210                 .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
   211                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   212                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   213                     .addComponent(tlačítkoPřidat)
   214                     .addComponent(tlačítkoSmazat)
   215                     .addComponent(tlačítkoZnovuNačíst)
   216                     .addComponent(tlačítkoZamknout)
   217                     .addComponent(tlačítkoKopírovat))
   218                 .addContainerGap())
   219         );
   220     }// </editor-fold>//GEN-END:initComponents
   221 
   222 	private void tlačítkoPřidatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoPřidatActionPerformed
   223 		model.přidejAtribut(new Atribut());
   224 	}//GEN-LAST:event_tlačítkoPřidatActionPerformed
   225 
   226 	private void tlačítkoSmazatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoSmazatActionPerformed
   227 		try {
   228 			model.odeberAtribut(vybranýAtribut);
   229 		} catch (IOException e) {
   230 			zobrazChybovouHlášku(překlady
   231 				.getString("chyba.nepodařiloSeSmazat"), e);
   232 		}
   233 	}//GEN-LAST:event_tlačítkoSmazatActionPerformed
   234 
   235 	private void tlačítkoZnovuNačístActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZnovuNačístActionPerformed
   236 		try {
   237 			model.načtiAtributy();
   238 		} catch (IOException e) {
   239 			zobrazChybovouHlášku(překlady
   240 				.getString("chyba.nepodařiloSeNačíst"), e);
   241 		}
   242 	}//GEN-LAST:event_tlačítkoZnovuNačístActionPerformed
   243 
   244     private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed
   245 		try {
   246 			model.nastavZámek(tlačítkoZamknout.isSelected());
   247 		} catch (Exception e) {
   248 			zobrazChybovouHlášku(překlady
   249 				.getString("chyba.nepodařiloSeNastavitZámek"), e);
   250 		}
   251     }//GEN-LAST:event_tlačítkoZamknoutActionPerformed
   252 
   253     private void tlačítkoKopírovatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoKopírovatActionPerformed
   254 		kopírujDoSchránky();
   255     }//GEN-LAST:event_tlačítkoKopírovatActionPerformed
   256 
   257     // Variables declaration - do not modify//GEN-BEGIN:variables
   258     private javax.swing.JScrollPane posuvnýPanel;
   259     private javax.swing.JButton tlačítkoKopírovat;
   260     private javax.swing.JButton tlačítkoPřidat;
   261     private javax.swing.JButton tlačítkoSmazat;
   262     private javax.swing.JToggleButton tlačítkoZamknout;
   263     private javax.swing.JButton tlačítkoZnovuNačíst;
   264     // End of variables declaration//GEN-END:variables
   265 }