# HG changeset patch # User František Kučera # Date 1703374721 -3600 # Node ID d2414701ce0938f73c944de3e1cbdd7041f8cf4b # Parent 64e564c2f069c531cec18014f43a6c88634d15a4 režimy zamykání: - vypnuté: tlačítko pro zamykání je skryté a soubor se nezamyká - volitelné: uživatel může soubor zamknout, ale může editovat i bez toho - povinné: uživatel musí soubor zamknout, aby mohl atributy editovat Změny v atributech se vždy propisují okamžitě - na ně zámek nemá vliv. Zámek je na souboru (ne metadatech) a slouží pro kooperující procesy. Proces, který soubor/metadata čte, si jednak může soubor zamknout (POSIX) a tím mít jistotu, že zrovna neprobíhá editace. A jednak může reagovat na notifikace CLOSE_WRITE (inotify). Notifikaci mu pošleme tím, že soubor odemkneme (čímž se i zavře). diff -r 64e564c2f069 -r d2414701ce09 src/main/java/cz/frantovo/rozsireneatributy/CLIParser.java --- a/src/main/java/cz/frantovo/rozsireneatributy/CLIParser.java Tue Dec 19 00:47:41 2023 +0100 +++ b/src/main/java/cz/frantovo/rozsireneatributy/CLIParser.java Sun Dec 24 00:38:41 2023 +0100 @@ -18,6 +18,7 @@ import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty; +import cz.frantovo.rozsireneatributy.Konfigurace.RežimZamykání; import java.io.File; import java.util.Arrays; import java.util.Collection; @@ -60,8 +61,8 @@ if (k.getSoubor() == null) throw new CLIParserException( - překlady.getString("chyba.cli.chybíSoubor")); - + překlady.getString("chyba.cli.chybíSoubor")); + return k; } @@ -101,12 +102,17 @@ return index - originalIndex; } }, - POVINNÉ_ZAMYKÁNÍ("--povinné-zamykání", "--mandatory-locking") { + REŽIM_ZAMYKÁNÍ("--režim-zamykání", "--locking-mode") { @Override public int parsuj(String[] parametry, int index, Konfigurace k) throws CLIParserException { int originalIndex = index; - k.setPovinnéZamykání(načtiDalšíBoolean(parametry, ++index)); + String hodnota = načtiDalší(parametry, ++index); + k.setRežimZamykání(RežimZamykání.najdiRežim(hodnota)); + if (k.getRežimZamykání() == null) + throw new CLIParserException( + // TODO: překlad: + "Neplatný režim zamykání: " + hodnota); return index - originalIndex; } }, diff -r 64e564c2f069 -r d2414701ce09 src/main/java/cz/frantovo/rozsireneatributy/Konfigurace.java --- a/src/main/java/cz/frantovo/rozsireneatributy/Konfigurace.java Tue Dec 19 00:47:41 2023 +0100 +++ b/src/main/java/cz/frantovo/rozsireneatributy/Konfigurace.java Sun Dec 24 00:38:41 2023 +0100 @@ -17,8 +17,11 @@ package cz.frantovo.rozsireneatributy; import java.io.File; +import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * @author Ing. František Kučera (frantovo.cz) @@ -89,9 +92,32 @@ } } + public enum RežimZamykání { + VYPNUTÉ("vypnuté", "disabled"), + VOLITELNÉ("volitelné", "optional"), + POVINNÉ("povinné", "mandatory"); + + private final Set hodnoty = new HashSet<>(); + + private RežimZamykání(String... hodnoty) { + this.hodnoty.addAll(Arrays.asList(hodnoty)); + } + + public boolean odpovídá(String hodnota) { + return hodnoty.contains(hodnota); + } + + public static RežimZamykání najdiRežim(String hodnota) { + for (RežimZamykání režim : values()) { + if (režim.odpovídá(hodnota)) return režim; + } + return null; + } + } + private File soubor; - private boolean povinnéZamykání = false; + private RežimZamykání režimZamykání = RežimZamykání.VOLITELNÉ; private final List atributy = new LinkedList<>(); @@ -103,12 +129,12 @@ this.soubor = soubor; } - public boolean isPovinnéZamykání() { - return povinnéZamykání; + public RežimZamykání getRežimZamykání() { + return režimZamykání; } - public void setPovinnéZamykání(boolean povinnéZamykání) { - this.povinnéZamykání = povinnéZamykání; + public void setRežimZamykání(RežimZamykání režimZamykání) { + this.režimZamykání = režimZamykání; } public List getAtributy() { diff -r 64e564c2f069 -r d2414701ce09 src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java --- a/src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java Tue Dec 19 00:47:41 2023 +0100 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java Sun Dec 24 00:38:41 2023 +0100 @@ -18,6 +18,7 @@ import cz.frantovo.rozsireneatributy.Atribut; import cz.frantovo.rozsireneatributy.CSV; +import cz.frantovo.rozsireneatributy.Konfigurace; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyEvent; @@ -32,6 +33,7 @@ import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableCellEditor; /** * @author Ing. František Kučera (frantovo.cz) @@ -71,19 +73,50 @@ @Override public void valueChanged(ListSelectionEvent e) { int řádek = tabulka.getSelectedRow(); - if (řádek < 0) { - vybranýAtribut = null; - tlačítkoSmazat.setEnabled(false); - } else { - vybranýAtribut = getModel().getAtribut(řádek); - tlačítkoSmazat.setEnabled(true); - } + if (řádek < 0) vybranýAtribut = null; + else vybranýAtribut = getModel().getAtribut(řádek); + aktualizujPovolenéÚpravy(); } }); // Buňky tabulky editovatelné po stisku mezerníku: tabulka.getInputMap() .put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "startEditing"); + + aktualizujPovolenéÚpravy(); + + // TODO: Provádět IO operace v jiném vlákně + // SwingWorker.doInBackground() + SwingUtilities.invokeLater() + } + + private void aktualizujPovolenéÚpravy() { + Konfigurace k = model.getKonfigurace(); + switch (k.getRežimZamykání()) { + case VYPNUTÉ: + tlačítkoZamknout.setVisible(false); + setPovolenéÚpravy(true); + break; + case VOLITELNÉ: + setPovolenéÚpravy(true); + break; + case POVINNÉ: + setPovolenéÚpravy(tlačítkoZamknout.isSelected()); + break; + default: + break; + } + } + + private void setPovolenéÚpravy(boolean povolené) { + if (!povolené) { + TableCellEditor ce = tabulka.getCellEditor(); + if (ce != null) ce.cancelCellEditing(); + tabulka.clearSelection(); + } + + tabulka.setEnabled(povolené); + tlačítkoPřidat.setEnabled(povolené); + tlačítkoSmazat.setEnabled(povolené && tabulka.getSelectedRow() > -1); } private void nastavEditor() { @@ -109,7 +142,7 @@ překlady.getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE); log.log(Level.WARNING, hláška, chyba); } - + private void kopírujDoSchránky() { try { StringWriter výstup = new StringWriter(); @@ -243,6 +276,7 @@ private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed try { + aktualizujPovolenéÚpravy(); model.nastavZámek(tlačítkoZamknout.isSelected()); } catch (Exception e) { zobrazChybovouHlášku(překlady diff -r 64e564c2f069 -r d2414701ce09 src/main/resources/cz/frantovo/rozsireneatributy/Překlady_cs.properties --- a/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_cs.properties Tue Dec 19 00:47:41 2023 +0100 +++ b/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_cs.properties Sun Dec 24 00:38:41 2023 +0100 @@ -21,5 +21,5 @@ p\u0159idatAtribut=P\u0159idat atribut smazatAtribut=Smazat atribut znovuNa\u010d\u00edst=Znovu na\u010d\u00edst -zamknout=Zamknout +zamknout=Zamknout a upravovat zamknout.popis=Otev\u0159e soubor pro z\u00e1pis a vytvo\u0159\u00ed na n\u011bm z\u00e1mek. P\u0159i odemknut\u00ed uvoln\u00ed z\u00e1mek a zav\u0159e soubor. diff -r 64e564c2f069 -r d2414701ce09 src/main/resources/cz/frantovo/rozsireneatributy/Překlady_en.properties --- a/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_en.properties Tue Dec 19 00:47:41 2023 +0100 +++ b/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_en.properties Sun Dec 24 00:38:41 2023 +0100 @@ -21,5 +21,5 @@ p\u0159idatAtribut=Add attribute smazatAtribut=Delete attribute znovuNa\u010d\u00edst=Reload all -zamknout=Lock +zamknout=Lock & editing zamknout.popis=Open the file for write and lock it. On unlocking, release the lock and close the file.