kopírování atributů do schránky (ve formátu CSV) v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 16 Dec 2023 14:09:00 +0100
branchv_0
changeset 3572ea1c6d836c
parent 34 c2ce9d916103
child 36 a7de67e6578c
kopírování atributů do schránky (ve formátu CSV)
java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CSV.java
java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties
java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties
java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form
java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CSV.java	Sat Dec 16 14:09:00 2023 +0100
     1.3 @@ -0,0 +1,65 @@
     1.4 +/**
     1.5 + * Rozšířené atributy – program na správu rozšířených atributů souborů
     1.6 + * Copyright © 2023 František Kučera (frantovo.cz)
     1.7 + *
     1.8 + * This program is free software: you can redistribute it and/or modify
     1.9 + * it under the terms of the GNU General Public License as published by
    1.10 + * the Free Software Foundation, either version 3 of the License.
    1.11 + *
    1.12 + * This program is distributed in the hope that it will be useful,
    1.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    1.15 + * GNU General Public License for more details.
    1.16 + *
    1.17 + * You should have received a copy of the GNU General Public License
    1.18 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
    1.19 + */
    1.20 +package cz.frantovo.rozsireneatributy;
    1.21 +
    1.22 +import java.io.IOException;
    1.23 +import java.io.Writer;
    1.24 +
    1.25 +/**
    1.26 + * Generátor standardních CSV.
    1.27 + *
    1.28 + * @author Ing. František Kučera
    1.29 + */
    1.30 +public class CSV {
    1.31 +
    1.32 +	private final Writer výstup;
    1.33 +	private int sloupec = 0;
    1.34 +	private int početSloupců = -1;
    1.35 +
    1.36 +	public CSV(Writer výstup) {
    1.37 +		this.výstup = výstup;
    1.38 +	}
    1.39 +
    1.40 +	public void hodnota(String hodnota) throws IOException {
    1.41 +		if (sloupec > 0) výstup.write(',');
    1.42 +		if (hodnota != null && !hodnota.isEmpty()) {
    1.43 +			výstup.write('"');
    1.44 +			for (char ch : hodnota.toCharArray()) {
    1.45 +				if (ch == '"') výstup.write('"');
    1.46 +				výstup.write(ch);
    1.47 +			}
    1.48 +			výstup.write('"');
    1.49 +		}
    1.50 +		sloupec++;
    1.51 +		výstup.flush();
    1.52 +	}
    1.53 +
    1.54 +	public void konecŘádku() throws IOException {
    1.55 +		if (početSloupců < 0) početSloupců = sloupec;
    1.56 +		if (sloupec == početSloupců) {
    1.57 +			výstup.write("\r\n");
    1.58 +			sloupec = 0;
    1.59 +		} else {
    1.60 +			throw new IOException("Neodpovídá počet sloupců:"
    1.61 +				+ " aktuální=" + sloupec
    1.62 +				+ " celkový=" + početSloupců
    1.63 +			);
    1.64 +		}
    1.65 +		výstup.flush();
    1.66 +	}
    1.67 +
    1.68 +}
     2.1 --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties	Fri Dec 15 20:41:41 2023 +0100
     2.2 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties	Sat Dec 16 14:09:00 2023 +0100
     2.3 @@ -5,6 +5,7 @@
     2.4  chyba.souborNeexistuje=Soubor neexistuje: {0}
     2.5  chyba.nepoda\u0159iloSeSmazat=Nepoda\u0159ilo se smazat atribut.
     2.6  chyba.nepoda\u0159iloSeNa\u010d\u00edst=Nepoda\u0159ilo se na\u010d\u00edst atributy.
     2.7 +chyba.nepoda\u0159iloSeZkop\u00edrovat=Nepoda\u0159ilo se zkop\u00edrovat atributy do schr\u00e1nky.
     2.8  chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Nepoda\u0159ilo se nastavit z\u00e1mek.
     2.9  chyba.lzeZamknoutJenSoubor=Je podporov\u00e1no zamyk\u00e1n\u00ed pouze norm\u00e1ln\u00edch sobour\u016f ne adres\u00e1\u0159\u016f atd.
    2.10  chyba.cli.nezn\u00e1m\u00fdParametr=Nezn\u00e1m\u00fd parametr: 
    2.11 @@ -14,6 +15,9 @@
    2.12  tabulka.n\u00e1zev=N\u00e1zev
    2.13  tabulka.hodnota=Hodnota
    2.14  
    2.15 +schr\u00e1nka.kop\u00edrovat=Kop\u00edrovat
    2.16 +schr\u00e1nka.vlo\u017eit=Vlo\u017eit
    2.17 +
    2.18  p\u0159idatAtribut=P\u0159idat atribut
    2.19  smazatAtribut=Smazat atribut
    2.20  znovuNa\u010d\u00edst=Znovu na\u010d\u00edst
     3.1 --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties	Fri Dec 15 20:41:41 2023 +0100
     3.2 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties	Sat Dec 16 14:09:00 2023 +0100
     3.3 @@ -5,6 +5,7 @@
     3.4  chyba.souborNeexistuje=File does not exist: {0}
     3.5  chyba.nepoda\u0159iloSeSmazat=Failed to delete the attribute.
     3.6  chyba.nepoda\u0159iloSeNa\u010d\u00edst=Failed to load attributes.
     3.7 +chyba.nepoda\u0159iloSeZkop\u00edrovat=Unable to copy attributes to the clipboard.
     3.8  chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Unable to lock the file.
     3.9  chyba.lzeZamknoutJenSoubor=File locking is supported only for regular files, not for directories or specials.
    3.10  chyba.cli.nezn\u00e1m\u00fdParametr=Unknown option: 
    3.11 @@ -14,6 +15,9 @@
    3.12  tabulka.n\u00e1zev=Name
    3.13  tabulka.hodnota=Value
    3.14  
    3.15 +schr\u00e1nka.kop\u00edrovat=Copy
    3.16 +schr\u00e1nka.vlo\u017eit=Paste
    3.17 +
    3.18  p\u0159idatAtribut=Add attribute
    3.19  smazatAtribut=Delete attribute
    3.20  znovuNa\u010d\u00edst=Reload all
     4.1 --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form	Fri Dec 15 20:41:41 2023 +0100
     4.2 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form	Sat Dec 16 14:09:00 2023 +0100
     4.3 @@ -25,7 +25,9 @@
     4.4                <Component id="tlačítkoZnovuNačíst" min="-2" max="-2" attributes="0"/>
     4.5                <EmptySpace max="-2" attributes="0"/>
     4.6                <Component id="tlačítkoZamknout" min="-2" max="-2" attributes="0"/>
     4.7 -              <EmptySpace pref="122" max="32767" attributes="0"/>
     4.8 +              <EmptySpace max="-2" attributes="0"/>
     4.9 +              <Component id="tlačítkoKopírovat" min="-2" max="-2" attributes="0"/>
    4.10 +              <EmptySpace pref="25" max="32767" attributes="0"/>
    4.11            </Group>
    4.12            <Component id="posuvnýPanel" alignment="0" pref="543" max="32767" attributes="0"/>
    4.13        </Group>
    4.14 @@ -40,6 +42,7 @@
    4.15                    <Component id="tlačítkoSmazat" alignment="3" min="-2" max="-2" attributes="0"/>
    4.16                    <Component id="tlačítkoZnovuNačíst" alignment="3" min="-2" max="-2" attributes="0"/>
    4.17                    <Component id="tlačítkoZamknout" alignment="3" min="-2" max="-2" attributes="0"/>
    4.18 +                  <Component id="tlačítkoKopírovat" alignment="3" min="-2" max="-2" attributes="0"/>
    4.19                </Group>
    4.20                <EmptySpace max="-2" attributes="0"/>
    4.21            </Group>
    4.22 @@ -95,5 +98,15 @@
    4.23          <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="tla&#x10d;&#xed;tkoZamknoutActionPerformed"/>
    4.24        </Events>
    4.25      </Component>
    4.26 +    <Component class="javax.swing.JButton" name="tla&#x10d;&#xed;tkoKop&#xed;rovat">
    4.27 +      <Properties>
    4.28 +        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
    4.29 +          <ResourceString bundle="cz/frantovo/rozsireneatributy/P&#x159;eklady.properties" key="schr&#xe1;nka.kop&#xed;rovat" replaceFormat="java.util.ResourceBundle.getBundle(&quot;{bundleNameSlashes}&quot;).getString(&quot;{key}&quot;)"/>
    4.30 +        </Property>
    4.31 +      </Properties>
    4.32 +      <Events>
    4.33 +        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="tla&#x10d;&#xed;tkoKop&#xed;rovatActionPerformed"/>
    4.34 +      </Events>
    4.35 +    </Component>
    4.36    </SubComponents>
    4.37  </Form>
     5.1 --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java	Fri Dec 15 20:41:41 2023 +0100
     5.2 +++ b/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java	Sat Dec 16 14:09:00 2023 +0100
     5.3 @@ -17,8 +17,11 @@
     5.4  package cz.frantovo.rozsireneatributy.gui;
     5.5  
     5.6  import cz.frantovo.rozsireneatributy.Atribut;
     5.7 -import java.awt.Dimension;
     5.8 +import cz.frantovo.rozsireneatributy.CSV;
     5.9 +import java.awt.Toolkit;
    5.10 +import java.awt.datatransfer.StringSelection;
    5.11  import java.io.IOException;
    5.12 +import java.io.StringWriter;
    5.13  import java.util.ResourceBundle;
    5.14  import java.util.logging.Level;
    5.15  import java.util.logging.Logger;
    5.16 @@ -56,7 +59,7 @@
    5.17  		nastavEditor();
    5.18  		tabulka.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    5.19  		posuvnýPanel.setViewportView(tabulka);
    5.20 -		
    5.21 +
    5.22  		tabulka.setRowHeight((int) (tabulka.getRowHeight() * 1.3));
    5.23  
    5.24  		/** Výběr aktuálního atributu v tabulce */
    5.25 @@ -100,6 +103,31 @@
    5.26  			překlady.getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE);
    5.27  		log.log(Level.WARNING, hláška, chyba);
    5.28  	}
    5.29 +	
    5.30 +	private void kopírujDoSchránky() {
    5.31 +		try {
    5.32 +			StringWriter výstup = new StringWriter();
    5.33 +			CSV csv = new CSV(výstup);
    5.34 +
    5.35 +			csv.hodnota(překlady.getString("tabulka.název").toLowerCase());
    5.36 +			csv.hodnota(překlady.getString("tabulka.hodnota").toLowerCase());
    5.37 +			csv.konecŘádku();
    5.38 +
    5.39 +			for (int i = 0; i < model.getRowCount(); i++) {
    5.40 +				csv.hodnota(String.valueOf(model.getValueAt(i, 0)));
    5.41 +				csv.hodnota(String.valueOf(model.getValueAt(i, 1)));
    5.42 +				csv.konecŘádku();
    5.43 +			}
    5.44 +
    5.45 +			Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
    5.46 +				new StringSelection(výstup.toString()),
    5.47 +				null
    5.48 +			);
    5.49 +		} catch (Exception e) {
    5.50 +			zobrazChybovouHlášku(překlady
    5.51 +				.getString("chyba.nepodařiloSeZkopírovat"), e);
    5.52 +		}
    5.53 +	}
    5.54  
    5.55  	@SuppressWarnings("unchecked")
    5.56      // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    5.57 @@ -110,6 +138,7 @@
    5.58          tlačítkoSmazat = new javax.swing.JButton();
    5.59          tlačítkoZnovuNačíst = new javax.swing.JButton();
    5.60          tlačítkoZamknout = new javax.swing.JToggleButton();
    5.61 +        tlačítkoKopírovat = new javax.swing.JButton();
    5.62  
    5.63          tlačítkoPřidat.setMnemonic('p');
    5.64          java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("cz/frantovo/rozsireneatributy/Překlady"); // NOI18N
    5.65 @@ -144,6 +173,13 @@
    5.66              }
    5.67          });
    5.68  
    5.69 +        tlačítkoKopírovat.setText(bundle.getString("schránka.kopírovat")); // NOI18N
    5.70 +        tlačítkoKopírovat.addActionListener(new java.awt.event.ActionListener() {
    5.71 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
    5.72 +                tlačítkoKopírovatActionPerformed(evt);
    5.73 +            }
    5.74 +        });
    5.75 +
    5.76          javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    5.77          this.setLayout(layout);
    5.78          layout.setHorizontalGroup(
    5.79 @@ -157,7 +193,9 @@
    5.80                  .addComponent(tlačítkoZnovuNačíst)
    5.81                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    5.82                  .addComponent(tlačítkoZamknout)
    5.83 -                .addContainerGap(122, Short.MAX_VALUE))
    5.84 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    5.85 +                .addComponent(tlačítkoKopírovat)
    5.86 +                .addContainerGap(25, Short.MAX_VALUE))
    5.87              .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE)
    5.88          );
    5.89          layout.setVerticalGroup(
    5.90 @@ -169,7 +207,8 @@
    5.91                      .addComponent(tlačítkoPřidat)
    5.92                      .addComponent(tlačítkoSmazat)
    5.93                      .addComponent(tlačítkoZnovuNačíst)
    5.94 -                    .addComponent(tlačítkoZamknout))
    5.95 +                    .addComponent(tlačítkoZamknout)
    5.96 +                    .addComponent(tlačítkoKopírovat))
    5.97                  .addContainerGap())
    5.98          );
    5.99      }// </editor-fold>//GEN-END:initComponents
   5.100 @@ -197,7 +236,7 @@
   5.101  	}//GEN-LAST:event_tlačítkoZnovuNačístActionPerformed
   5.102  
   5.103      private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed
   5.104 -        try {
   5.105 +		try {
   5.106  			model.nastavZámek(tlačítkoZamknout.isSelected());
   5.107  		} catch (Exception e) {
   5.108  			zobrazChybovouHlášku(překlady
   5.109 @@ -205,8 +244,13 @@
   5.110  		}
   5.111      }//GEN-LAST:event_tlačítkoZamknoutActionPerformed
   5.112  
   5.113 +    private void tlačítkoKopírovatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoKopírovatActionPerformed
   5.114 +		kopírujDoSchránky();
   5.115 +    }//GEN-LAST:event_tlačítkoKopírovatActionPerformed
   5.116 +
   5.117      // Variables declaration - do not modify//GEN-BEGIN:variables
   5.118      private javax.swing.JScrollPane posuvnýPanel;
   5.119 +    private javax.swing.JButton tlačítkoKopírovat;
   5.120      private javax.swing.JButton tlačítkoPřidat;
   5.121      private javax.swing.JButton tlačítkoSmazat;
   5.122      private javax.swing.JToggleButton tlačítkoZamknout;