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čítkoZamknoutActionPerformed"/>
4.24 </Events>
4.25 </Component>
4.26 + <Component class="javax.swing.JButton" name="tlačítkoKopí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řeklady.properties" key="schránka.kopírovat" replaceFormat="java.util.ResourceBundle.getBundle("{bundleNameSlashes}").getString("{key}")"/>
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čítkoKopí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;