# HG changeset patch # User František Kučera # Date 1702753993 -3600 # Node ID ec0e970e0830db9ac0de226c30480cbbd900d3e5 # Parent 41e91ea94acbf26a7689e29638ce4a6b94720a1e Make, Ant, Maven a Netbeans - různé způsoby sestavení aplikace diff -r 41e91ea94acb -r ec0e970e0830 .hgignore --- a/.hgignore Sat Dec 16 19:09:35 2023 +0100 +++ b/.hgignore Sat Dec 16 20:13:13 2023 +0100 @@ -1,7 +1,12 @@ -java/rozsirene-atributy/dist/* -java/rozsirene-atributy/build/* -java/rozsirene-atributy/nbproject/private/* +syntax: glob -java/rozsirene-atributy-jedit/dist/* -java/rozsirene-atributy-jedit/build/* -java/rozsirene-atributy-jedit/nbproject/private/* +*~ +*.class +*.so +*.o + +syntax: regexp + +^temp/ + +^target/ diff -r 41e91ea94acb -r ec0e970e0830 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,45 @@ +# Rozšířené atributy – program na správu rozšířených atributů souborů +# Copyright © 2023 František Kučera (Frantovo.cz) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +SRC=$(shell find src -name '*.java') +MAIN=cz.frantovo.rozsireneatributy.Startér +LAF=-Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel +VERSION=0.1-SNAPSHOT +JAR=target/rozsirene-atributy-$(VERSION).jar + +all: $(JAR) + +.PHONY: all clean run run-binfmt + +clean: + rm -rf target + +target/classes: $(SRC) + mkdir -p target/classes + touch target/classes + javac -d target/classes $(SRC) + cp \ + src/main/resources/cz/frantovo/rozsireneatributy/*.properties \ + target/classes/cz/frantovo/rozsireneatributy/ + +$(JAR): target/classes + jar --create --file $(@) --main-class $(MAIN) -C target/classes . + chmod +x $(@) + +run: $(JAR) + java $(LAF) -jar $(<) --soubor $(<) + +run-binfmt: $(JAR) + $(<) --soubor $(<) diff -r 41e91ea94acb -r ec0e970e0830 build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build.xml Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/Makefile --- a/java/rozsirene-atributy/Makefile Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -# Rozšířené atributy – program na správu rozšířených atributů souborů -# Copyright © 2023 František Kučera (Frantovo.cz) -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -all: dist/rozsirene-atributy.jar - -.PHONY: all clean run run-binfmt - -clean: - rm -rf build - rm -rf dist - -SRC=$(shell find -name '*.java') -MAIN=cz.frantovo.rozsireneatributy.Startér -LAF=-Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel -JAR=dist/rozsirene-atributy.jar - -build: $(SRC) - mkdir -p build - touch build - javac -d build $(SRC) - cp \ - src/cz/frantovo/rozsireneatributy/*.properties \ - build/cz/frantovo/rozsireneatributy/ - -$(JAR): build - mkdir -p dist - jar --create --file $(@) --main-class $(MAIN) -C build . - chmod +x $(@) - -run: $(JAR) - java $(LAF) -jar $(<) --soubor $(<) - -run-binfmt: $(JAR) - $(<) --soubor $(<) diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/build.xml --- a/java/rozsirene-atributy/build.xml Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ - - - - - - - - - - - Builds, tests, and runs the project rozsirene-atributy. - - - diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/build2.xml --- a/java/rozsirene-atributy/build2.xml Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/manifest.mf --- a/java/rozsirene-atributy/manifest.mf Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/nbproject/build-impl.xml --- a/java/rozsirene-atributy/nbproject/build-impl.xml Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1771 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No tests executed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - Must select one file in the IDE or set profile.class - This target only works when run from inside the NetBeans IDE. - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - Must select some files in the IDE or set test.includes - - - - - Must select one file in the IDE or set run.class - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - Must select some files in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - Must select one file in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/nbproject/genfiles.properties --- a/java/rozsirene-atributy/nbproject/genfiles.properties Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -build.xml.data.CRC32=ca43bb03 -build.xml.script.CRC32=3b4ae2a0 -build.xml.stylesheet.CRC32=f85dc8f2@1.105.0.48 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=ca43bb03 -nbproject/build-impl.xml.script.CRC32=e8b330b8 -nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.105.0.48 diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/nbproject/project.properties --- a/java/rozsirene-atributy/nbproject/project.properties Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -#Sun Dec 10 23:58:00 CET 2023 -excludes= -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.processorpath=\ - ${javac.classpath} -dist.javadoc.dir=${dist.dir}/javadoc -jnlp.codebase.user= -jnlp.offline-allowed=false -test.src.dir=test -jnlp.signing.keystore= -jnlp.signing.alias= -run.modulepath=\ - ${javac.modulepath} -annotation.processing.enabled=true -jnlp.codebase.type=user -jar.index=${jnlp.enabled} -build.sysclasspath=ignore -debug.modulepath=${run.modulepath} -javac.compilerargs= -auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml -javadoc.noindex=false -javadoc.private=false -jar.archive.disabled=${jnlp.enabled} -javadoc.author=false -endorsed.classpath= -main.class=cz.frantovo.rozsireneatributy.Start\u00e9r -junit.selected.version=4 -source.encoding=UTF-8 -javac.source=1.7 -includes=** -javadoc.use=true -jar.compress=false -javadoc.nonavbar=false -annotation.processing.enabled.in.editor=false -javadoc.notree=false -annotation.processing.processors.list= -javac.deprecation=false -application.vendor=fiki -jlink.launcher=false -javadoc.additionalparam= -manifest.custom.caller.allowable.codebase= -jnlp.mixed.code=default -jnlp.signed=false -jlink.launcher.name=rozsirene-atributy -build.generated.sources.dir=${build.dir}/generated-sources -javadoc.splitindex=true -javac.processormodulepath= -manifest.custom.application.library.allowable.codebase= -run.jvmargs= -javadoc.encoding=${source.encoding} -javac.classpath= -manifest.custom.permissions= -mkdist.disabled=false -run.test.modulepath=\ - ${javac.test.modulepath} -build.classes.excludes=**/*.java,**/*.form -dist.jar=${dist.dir}/rozsirene-atributy.jar -build.classes.dir=${build.dir}/classes -debug.test.modulepath=${run.test.modulepath} -build.test.classes.dir=${build.dir}/test/classes -javadoc.windowtitle= -build.test.results.dir=${build.dir}/test/results -jnlp.enabled=false -dist.dir=dist -build.dir=build -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -build.generated.dir=${build.dir}/generated -javadoc.version=false -application.title=rozsirene-atributy -javac.test.modulepath=\ - ${javac.modulepath} -debug.test.classpath=${run.test.classpath} -javac.external.vm=false -javac.target=1.7 -jnlp.signing= -platform.active=default_platform -manifest.file=manifest.mf -manifest.custom.codebase= -javadoc.html5=false -javac.test.processorpath=${javac.test.classpath} -jnlp.descriptor=application -meta.inf.dir=${src.dir}/META-INF -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -annotation.processing.run.all.processors=true -javac.modulepath= -src.dir=src -debug.classpath=${run.classpath} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/nbproject/project.xml --- a/java/rozsirene-atributy/nbproject/project.xml Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - rozsirene-atributy - - - - - - - - - diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Atribut.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Atribut.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -import java.nio.ByteBuffer; -import java.nio.charset.Charset; - -/** - * @author Ing. František Kučera (frantovo.cz) - */ -public class Atribut { - - private String klíč; - private String hodnota; - - public Atribut(String klíč, String hodnota) { - this.klíč = klíč; - this.hodnota = hodnota; - } - - public Atribut(String klíč, ByteBuffer hodnota) { - this.klíč = klíč; - setHodnota(hodnota); - } - - public Atribut() { - } - - public String getKlíč() { - return klíč; - } - - public void setKlíč(String klíč) { - this.klíč = klíč; - } - - /** - * Název atributu musí být nenulový a mít nějakou délku, aby šel uložit - * TODO: další kontroly? - * @return jestli je platný - */ - public boolean isPlatnýKlíč() { - return klíč != null && klíč.length() > 0; - } - - /** - * nulová hodnota → smazání atributu - * (ale může být prázdný řetězec) - * @return jestli je platná - */ - public boolean isPlatnáHodnota() { - return hodnota != null; - } - - public String getHodnota() { - return hodnota; - } - - public final ByteBuffer getHodnotaBajty() { - return zakóduj(getHodnota()); - } - - public void setHodnota(String hodnota) { - this.hodnota = hodnota; - } - - public final void setHodnota(ByteBuffer hodnota) { - setHodnota(dekóduj(hodnota)); - } - - private static String dekóduj(ByteBuffer bajty) { - bajty.flip(); - return Charset.defaultCharset().decode(bajty).toString(); - } - - private static ByteBuffer zakóduj(String text) { - if (text == null) { - return null; - } else { - return Charset.defaultCharset().encode(text); - } - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CLIParser.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CLIParser.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,173 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2023 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; -import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty; -import java.io.File; -import java.util.Arrays; -import java.util.Collection; -import java.util.ResourceBundle; - -/** - * Converts command line arguments from String array to object. Checks basic - * constraints (if only supported options are used and if they have correct - * number of parameters) - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class CLIParser { - - private static final ResourceBundle překlady = ResourceBundle - .getBundle(Atribut.class.getPackageName() + ".Překlady"); - - public Konfigurace parsujParametry(String[] parametry) - throws CLIParserException { - Konfigurace k = new Konfigurace(); - - for (int i = 0; i < parametry.length; i++) { - String parametr = parametry[i]; - - boolean odpovídá = false; - - for (Token t : Token.values()) { - if (t.odpovídá(parametr)) { - int parsedArgs = t.parsuj(parametry, i, k); - i = i + parsedArgs; - odpovídá = true; - } - } - - if (!odpovídá) { - throw new CLIParserException( - překlady.getString("chyba.cli.neznámýParametr") + parametr); - } - } - - if (k.getSoubor() == null) - throw new CLIParserException( - překlady.getString("chyba.cli.chybíSoubor")); - - return k; - } - - private static String načtiDalší(String[] parametry, int index) - throws CLIParserException { - if (index < parametry.length) { - return parametry[index]; - } else { - throw new CLIParserException("Expecting value for option: " - + parametry[index - 1]); - } - } - - private static boolean načtiDalšíBoolean(String[] parametry, int index) - throws CLIParserException { - String s = načtiDalší(parametry, index); - switch (s) { - case "true": - case "ano": - return true; - case "false": - case "ne": - return false; - default: - throw new CLIParserException("Neplatná logická hodnota: " + s); - } - } - - private static enum Token { - - SOUBOR("--soubor", "--file") { - @Override - public int parsuj(String[] parametry, int index, Konfigurace k) - throws CLIParserException { - int originalIndex = index; - k.setSoubor(new File(načtiDalší(parametry, ++index))); - return index - originalIndex; - } - }, - POVINNÉ_ZAMYKÁNÍ("--povinné-zamykání", "--mandatory-locking") { - @Override - public int parsuj(String[] parametry, int index, Konfigurace k) - throws CLIParserException { - int originalIndex = index; - k.setPovinnéZamykání(načtiDalšíBoolean(parametry, ++index)); - return index - originalIndex; - } - }, - DEFINICE_ATRIBUTU("--definice-atributu", "--attribute-definition") { - @Override - public int parsuj(String[] parametry, int index, Konfigurace k) - throws CLIParserException { - int originalIndex = index; - String název = načtiDalší(parametry, ++index); - String popis = načtiDalší(parametry, ++index); - k.addAtribut(new DefiniceAtributu(název, popis)); - return index - originalIndex; - } - }, - HODNOTA_ATRIBUTU("--hodnota", "--value") { - @Override - public int parsuj(String[] parametry, int index, Konfigurace k) - throws CLIParserException { - int originalIndex = index; - String hodnota = načtiDalší(parametry, ++index); - String popis = načtiDalší(parametry, ++index); - - if (k.getAtributy().isEmpty()) - throw new CLIParserException( - překlady.getString("chyba.cli.chybíDefiniceAtributu")); - - k.getAtributy() - .get(k.getAtributy().size() - 1) - .addHodnota(new DefiniceHodnoty(hodnota, popis)); - - return index - originalIndex; - } - }; - - private final Collection parametry; - - private Token(String... parametry) { - this.parametry = Arrays.asList(parametry); - } - - /** - * @param parametr e.g. „--input-file“ - * @return whether option is this token - */ - public boolean odpovídá(String parametr) { - return parametry.contains(parametr); - } - - /** - * Parse String arguments and fill values into the options object. - * - * @param parametry CLI arguments - * @param index index of the option matched by this token, like - * „--input-file“ - * @param k object to be filled - * @return number of parsed arguments – if option has no arguments (just - * boolean flag), return 0, otherwise return positive integer: number of - * eaten arguments. - * @throws CLIParserException - */ - public abstract int parsuj(String[] parametry, int index, Konfigurace k) - throws CLIParserException; - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CLIParserException.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CLIParserException.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2023 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -/** - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class CLIParserException extends Exception { - - public CLIParserException() { - } - - public CLIParserException(String message) { - super(message); - } - - public CLIParserException(Throwable cause) { - super(cause); - } - - public CLIParserException(String message, Throwable cause) { - super(message, cause); - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CSV.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/CSV.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2023 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -import java.io.IOException; -import java.io.Writer; - -/** - * Generátor standardních CSV. - * - * @author Ing. František Kučera - */ -public class CSV { - - private final Writer výstup; - private int sloupec = 0; - private int početSloupců = -1; - - public CSV(Writer výstup) { - this.výstup = výstup; - } - - public void hodnota(String hodnota) throws IOException { - if (sloupec > 0) výstup.write(','); - if (hodnota != null && !hodnota.isEmpty()) { - výstup.write('"'); - for (char ch : hodnota.toCharArray()) { - if (ch == '"') výstup.write('"'); - výstup.write(ch); - } - výstup.write('"'); - } - sloupec++; - výstup.flush(); - } - - public void konecŘádku() throws IOException { - if (početSloupců < 0) početSloupců = sloupec; - if (sloupec == početSloupců) { - výstup.write("\r\n"); - sloupec = 0; - } else { - throw new IOException("Neodpovídá počet sloupců:" - + " aktuální=" + sloupec - + " celkový=" + početSloupců - ); - } - výstup.flush(); - } - -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Konfigurace.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Konfigurace.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2023 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -import java.io.File; -import java.util.LinkedList; -import java.util.List; - -/** - * @author Ing. František Kučera (frantovo.cz) - */ -public class Konfigurace { - - public static class DefiniceAtributu { - - private String název; - private String popis; - private final List hodnoty = new LinkedList<>(); - - public DefiniceAtributu(String název, String popis) { - this.název = název; - this.popis = popis; - } - - public String getNázev() { - return název; - } - - public void setNázev(String název) { - this.název = název; - } - - public String getPopis() { - return popis; - } - - public void setPopis(String popis) { - this.popis = popis; - } - - public List getHodnoty() { - return hodnoty; - } - - public void addHodnota(DefiniceHodnoty hodnota) { - this.hodnoty.add(hodnota); - } - - } - - public static class DefiniceHodnoty { - - private String název; - private String popis; - - public DefiniceHodnoty(String název, String popis) { - this.název = název; - this.popis = popis; - } - - public String getNázev() { - return název; - } - - public void setNázev(String název) { - this.název = název; - } - - public String getPopis() { - return popis; - } - - public void setPopis(String popis) { - this.popis = popis; - } - } - - private File soubor; - - private boolean povinnéZamykání = false; - - private final List atributy = new LinkedList<>(); - - public File getSoubor() { - return soubor; - } - - public void setSoubor(File soubor) { - this.soubor = soubor; - } - - public boolean isPovinnéZamykání() { - return povinnéZamykání; - } - - public void setPovinnéZamykání(boolean povinnéZamykání) { - this.povinnéZamykání = povinnéZamykání; - } - - public List getAtributy() { - return atributy; - } - - public void addAtribut(DefiniceAtributu atribut) { - this.atributy.add(atribut); - } - -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady.properties --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady.properties Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -Překlady_cs.properties \ No newline at end of file diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_cs.properties Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -titulek=Roz\u0161\u00ed\u0159en\u00e9 stributy souboru: {0} - -chyba=Chyba: -chyba.titulek=Chyba -chyba.souborNeexistuje=Soubor neexistuje: {0} -chyba.nepoda\u0159iloSeSmazat=Nepoda\u0159ilo se smazat atribut. -chyba.nepoda\u0159iloSeNa\u010d\u00edst=Nepoda\u0159ilo se na\u010d\u00edst atributy. -chyba.nepoda\u0159iloSeZkop\u00edrovat=Nepoda\u0159ilo se zkop\u00edrovat atributy do schr\u00e1nky. -chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Nepoda\u0159ilo se nastavit z\u00e1mek. -chyba.lzeZamknoutJenSoubor=Je podporov\u00e1no zamyk\u00e1n\u00ed pouze norm\u00e1ln\u00edch sobour\u016f ne adres\u00e1\u0159\u016f atd. -chyba.cli.nezn\u00e1m\u00fdParametr=Nezn\u00e1m\u00fd parametr: -chyba.cli.chyb\u00edDefiniceAtributu=Chyb\u00ed definice atributu (hodnota se vztahuje k n\u00ed). -chyba.cli.chyb\u00edSoubor=Nebyl uveden soubor. - -tabulka.n\u00e1zev=N\u00e1zev -tabulka.hodnota=Hodnota - -schr\u00e1nka.kop\u00edrovat=Kop\u00edrovat -schr\u00e1nka.vlo\u017eit=Vlo\u017eit - -p\u0159idatAtribut=P\u0159idat atribut -smazatAtribut=Smazat atribut -znovuNa\u010d\u00edst=Znovu na\u010d\u00edst -zamknout=Zamknout -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 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Překlady_en.properties Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -titulek=Extended Attributes of file: {0} - -chyba=Error: -chyba.titulek=Error -chyba.souborNeexistuje=File does not exist: {0} -chyba.nepoda\u0159iloSeSmazat=Failed to delete the attribute. -chyba.nepoda\u0159iloSeNa\u010d\u00edst=Failed to load attributes. -chyba.nepoda\u0159iloSeZkop\u00edrovat=Unable to copy attributes to the clipboard. -chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Unable to lock the file. -chyba.lzeZamknoutJenSoubor=File locking is supported only for regular files, not for directories or specials. -chyba.cli.nezn\u00e1m\u00fdParametr=Unknown option: -chyba.cli.chyb\u00edDefiniceAtributu=Missing attribute definition (value is associated with it). -chyba.cli.chyb\u00edSoubor=File name was not specified. - -tabulka.n\u00e1zev=Name -tabulka.hodnota=Value - -schr\u00e1nka.kop\u00edrovat=Copy -schr\u00e1nka.vlo\u017eit=Paste - -p\u0159idatAtribut=Add attribute -smazatAtribut=Delete attribute -znovuNa\u010d\u00edst=Reload all -zamknout=Lock -zamknout.popis=Open the file for write and lock it. On unlocking, release the lock and close the file. diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Startér.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/Startér.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy; - -import cz.frantovo.rozsireneatributy.gui.Model; -import cz.frantovo.rozsireneatributy.gui.Panel; -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.io.File; -import java.text.MessageFormat; -import java.util.ResourceBundle; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.KeyStroke; - -/** - * Spouštěč programu - * - * http://freedesktop.org/wiki/CommonExtendedAttributes - * http://download.oracle.com/javase/tutorial/essential/io/fileAttr.html#user - * http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html - * #so-what-is-a-path-really - * - * $ setfattr -n "user.franta.pozdrav" -v 'Dobrý den!' pokus.txt (v javě pak - * pracujeme s klíči bez předpony „user.“) - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class Startér { - - private static final Logger log = Logger - .getLogger(Startér.class.getSimpleName()); - private static final ResourceBundle překlady = ResourceBundle - .getBundle(Atribut.class.getPackageName() + ".Překlady"); - - /** - * @param args název souboru - */ - public static void main(String[] args) { - - try { - // TODO: načítat konfiguraci i z XML souboru - CLIParser parser = new CLIParser(); - Konfigurace konfigurace = parser.parsujParametry(args); - - File soubor = konfigurace.getSoubor(); - - if (soubor.exists()) { - log.log(Level.INFO, "Pracuji se souborem: {0}", soubor); - - Model model = new Model(konfigurace); - - final JFrame f = new JFrame(); - Panel p = new Panel(model); - - f.setLayout(new BorderLayout()); - f.add(p, BorderLayout.CENTER); - - // Ukončení programu klávesou Escape: - f.getRootPane().registerKeyboardAction(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent ae) { - f.dispose(); - } - }, - KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), - JComponent.WHEN_IN_FOCUSED_WINDOW); - - f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - f.setTitle(MessageFormat - .format(překlady.getString("titulek"), soubor)); - f.setSize(640, 240); - f.setLocationRelativeTo(null); - f.setVisible(true); - } else { - ukončiChybou(MessageFormat.format(překlady - .getString("chyba.souborNeexistuje"), soubor)); - } - } catch (Exception e) { - log.log(Level.SEVERE, překlady.getString("chyba"), e); - ukončiChybou(e.getLocalizedMessage()); - } - } - - private static void ukončiChybou(String hláška) { - log.log(Level.SEVERE, hláška); - JOptionPane.showMessageDialog(null, hláška, překlady - .getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE); - System.exit(1); - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/EditorHodnotAtributů.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/EditorHodnotAtributů.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy.gui; - -import cz.frantovo.rozsireneatributy.Konfigurace; -import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; -import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.EventObject; -import java.util.Objects; -import javax.swing.JComboBox; -import javax.swing.JTable; -import javax.swing.event.CellEditorListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.EventListenerList; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableModel; - -/** - * Umožňuje výběr hodnoty atributu z předvoleného seznamu. - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class EditorHodnotAtributů - extends JComboBox - implements TableCellEditor { - - private final Konfigurace konfigurace; - private JTable tabulka; - private TableModel model; - private int řádek; - private int sloupec; - protected EventListenerList posluchače = new EventListenerList(); - protected ChangeEvent událost = new ChangeEvent(this); - - public EditorHodnotAtributů(Konfigurace konfigurace) { - super(); - this.konfigurace = konfigurace; - setEditable(true); - addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - fireEditiaceSkončila(); - } - }); - } - - protected void fireEditiaceSkončila() { - for (Object posluchač : posluchače.getListenerList()) { - if (posluchač instanceof CellEditorListener) { - ((CellEditorListener) posluchač).editingStopped(událost); - } - } - } - - protected void fireEditiaceZrušena() { - for (Object posluchač : posluchače.getListenerList()) { - if (posluchač instanceof CellEditorListener) { - ((CellEditorListener) posluchač).editingCanceled(událost); - } - } - } - - private void obnovHodnoty(Object hodnotaAtributu) { - removeAllItems(); - - if (hodnotaAtributu == null) { - hodnotaAtributu = ""; - } else if (!(hodnotaAtributu instanceof String)) { - hodnotaAtributu = String.valueOf(hodnotaAtributu); - } - addItem((String) hodnotaAtributu); - setSelectedItem(hodnotaAtributu); - - Object názevAtributu = model.getValueAt(řádek, Panel.SLOUPEC_NÁZVU); - for (DefiniceAtributu da : konfigurace.getAtributy()) { - if (Objects.equals(názevAtributu, da.getNázev())) { - for (DefiniceHodnoty dh : da.getHodnoty()) { - addItem(dh.getNázev()); - } - } - } - - } - - @Override - public Component getTableCellEditorComponent( - JTable tabulka, - Object hodnota, - boolean vybraná, - int řádek, - int sloupec) // - { - this.řádek = řádek; - this.sloupec = sloupec; - this.tabulka = tabulka; - this.model = tabulka.getModel(); - obnovHodnoty(hodnota); - // TODO: více různých instancí? - return this; - } - - @Override - public Object getCellEditorValue() { - return getSelectedItem(); - } - - @Override - public boolean isCellEditable(EventObject anEvent) { - return true; - } - - @Override - public boolean shouldSelectCell(EventObject anEvent) { - return true; - } - - @Override - public boolean stopCellEditing() { - fireEditiaceSkončila(); - return true; - } - - @Override - public void cancelCellEditing() { - fireEditiaceZrušena(); - } - - @Override - public void addCellEditorListener(CellEditorListener l) { - posluchače.add(CellEditorListener.class, l); - } - - @Override - public void removeCellEditorListener(CellEditorListener l) { - posluchače.remove(CellEditorListener.class, l); - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/EditorNázvůAtributů.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/EditorNázvůAtributů.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy.gui; - -import cz.frantovo.rozsireneatributy.Konfigurace; -import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.EventObject; -import javax.swing.JComboBox; -import javax.swing.JTable; -import javax.swing.event.CellEditorListener; -import javax.swing.event.ChangeEvent; -import javax.swing.event.EventListenerList; -import javax.swing.table.TableCellEditor; - -/** - * Umožňuje výběr názvu atributu z předvoleného seznamu - * (standardizované atributy). - * - * @author Ing. František Kučera (frantovo.cz) - */ -public class EditorNázvůAtributů - extends JComboBox - implements TableCellEditor { - - private final Konfigurace konfigurace; - protected EventListenerList posluchače = new EventListenerList(); - protected ChangeEvent událost = new ChangeEvent(this); - - public EditorNázvůAtributů(Konfigurace konfigurace) { - super(); - this.konfigurace = konfigurace; - setEditable(true); - addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - fireEditiaceSkončila(); - } - }); - } - - protected void fireEditiaceSkončila() { - for (Object posluchač : posluchače.getListenerList()) { - if (posluchač instanceof CellEditorListener) { - ((CellEditorListener) posluchač).editingStopped(událost); - } - } - } - - protected void fireEditiaceZrušena() { - for (Object posluchač : posluchače.getListenerList()) { - if (posluchač instanceof CellEditorListener) { - ((CellEditorListener) posluchač).editingCanceled(událost); - } - } - } - - /** - * TODO: - * - další standardní atributy - * - načítat z XML souboru - * - * @see http://www.freedesktop.org/wiki/CommonExtendedAttributes - */ - private void obnovHodnoty(Object názevAtributu) { - removeAllItems(); - - if (názevAtributu == null) { - názevAtributu = ""; - } else if (!(názevAtributu instanceof String)) { - názevAtributu = String.valueOf(názevAtributu); - } - addItem((String) názevAtributu); - setSelectedItem(názevAtributu); - - for (DefiniceAtributu da : konfigurace.getAtributy()) { - addItem(da.getNázev()); - } - - if (!konfigurace.getAtributy().isEmpty()) return; - - // General attributes in current use - addItem("mime_type"); - addItem("charset"); - addItem("creator"); - - // Proposed metadata attributes - addItem("xdg.comment"); - addItem("xdg.origin.url"); - addItem("xdg.origin.email.subject"); - addItem("xdg.origin.email.from"); - addItem("xdg.origin.email.message-id"); - addItem("xdg.language"); - addItem("xdg.creator"); - addItem("xdg.publisher"); - - // Proposed control attributes - addItem("xdg.robots.index"); - addItem("xdg.robots.backup"); - - // Dublin Core - addItem("dublincore.title"); - addItem("dublincore.creator"); - addItem("dublincore.subject"); - addItem("dublincore.description"); - addItem("dublincore.publisher"); - addItem("dublincore.contributor"); - addItem("dublincore.date"); - addItem("dublincore.type"); - addItem("dublincore.format"); - addItem("dublincore.identifier"); - addItem("dublincore.source"); - addItem("dublincore.language"); - addItem("dublincore.relation"); - addItem("dublincore.coverage"); - addItem("dublincore.rights"); - - // Application-specific attributes in current use - addItem("mime_encoding"); - addItem("apache_handler"); - addItem("Beagle.AttrTime"); - addItem("Beagle.Fingerprint"); - addItem("Beagle.MTime"); - addItem("Beagle.Uid"); - } - - @Override - public Component getTableCellEditorComponent( - JTable tabulka, - Object hodnota, - boolean vybraná, - int řádek, - int sloupec) { - obnovHodnoty(hodnota); - return this; - } - - @Override - public Object getCellEditorValue() { - return getSelectedItem(); - } - - @Override - public boolean isCellEditable(EventObject anEvent) { - return true; - } - - @Override - public boolean shouldSelectCell(EventObject anEvent) { - return true; - } - - @Override - public boolean stopCellEditing() { - fireEditiaceSkončila(); - return true; - } - - @Override - public void cancelCellEditing() { - fireEditiaceZrušena(); - } - - @Override - public void addCellEditorListener(CellEditorListener l) { - posluchače.add(CellEditorListener.class, l); - } - - @Override - public void removeCellEditorListener(CellEditorListener l) { - posluchače.remove(CellEditorListener.class, l); - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Model.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,218 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy.gui; - -import cz.frantovo.rozsireneatributy.Atribut; -import cz.frantovo.rozsireneatributy.Konfigurace; -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.nio.file.Path; -import java.nio.file.attribute.UserDefinedFileAttributeView; -import java.nio.file.spi.FileSystemProvider; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.table.TableModel; - -/** - * @author Ing. František Kučera (frantovo.cz) - */ -public class Model implements TableModel { - - private static final Logger log = Logger - .getLogger(Model.class.getSimpleName()); - private static final ResourceBundle překlady = ResourceBundle - .getBundle(Atribut.class.getPackageName() + ".Překlady"); - private final String[] sloupečky = { - překlady.getString("tabulka.název"), - překlady.getString("tabulka.hodnota") - }; - private final Set posluchače = new HashSet<>(); - private final Konfigurace konfigurace; - private final UserDefinedFileAttributeView souborovýSystém; - private final List atributy = new ArrayList<>(); - - private RandomAccessFile zámekSoubor; - private FileChannel zámekKanál; - private FileLock zámek; - - public Model(Konfigurace konfigurace) throws IOException { - this.konfigurace = konfigurace; - Path cesta = konfigurace.getSoubor().toPath(); - FileSystemProvider posyktovatelFS = cesta.getFileSystem().provider(); - souborovýSystém = posyktovatelFS - .getFileAttributeView(cesta, UserDefinedFileAttributeView.class); - načtiAtributy(); - } - - public Konfigurace getKonfigurace() { - return konfigurace; - } - - @Override - public int getRowCount() { - return atributy.size(); - } - - @Override - public int getColumnCount() { - return sloupečky.length; - } - - @Override - public String getColumnName(int n) { - return sloupečky[n]; - } - - @Override - public Class getColumnClass(int n) { - return String.class; - } - - @Override - public boolean isCellEditable(int m, int n) { - return true; - } - - @Override - public Object getValueAt(int m, int n) { - switch (n) { - case 0: - return atributy.get(m).getKlíč(); - case 1: - return atributy.get(m).getHodnota(); - default: - return null; - } - } - - @Override - public void setValueAt(Object hodnota, int m, int n) { - Atribut a = atributy.get(m); - try { - if (n == 0) { - /** - * Měníme klíč – název atributu - */ - String novýKlíč = String.valueOf(hodnota); - if (!novýKlíč.equals(a.getKlíč())) { - if (a.isPlatnýKlíč()) { - souborovýSystém.delete(a.getKlíč()); - } - a.setKlíč(novýKlíč); - if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) { - souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty()); - } - } - } else if (n == 1) { - /** - * Měníme hodnotu atributu - */ - a.setHodnota(String.valueOf(hodnota)); - if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) { - souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty()); - } - } - } catch (IOException e) { - log.log(Level.SEVERE, "Selhalo ukládání atributu na FS", e); - } - } - - @Override - public void addTableModelListener(TableModelListener l) { - posluchače.add(l); - } - - @Override - public void removeTableModelListener(TableModelListener l) { - posluchače.remove(l); - } - - /** - * @param m číslo řádku - * @return atribut, který se na něm nachází - */ - public Atribut getAtribut(int m) { - return atributy.get(m); - } - - public void přidejAtribut(Atribut a) { - atributy.add(a); - upozorniPosluchače(); - } - - public void odeberAtribut(Atribut a) throws IOException { - atributy.remove(a); - if (a.isPlatnýKlíč()) { - souborovýSystém.delete(a.getKlíč()); - } - upozorniPosluchače(); - } - - public final void načtiAtributy() throws IOException { - List jménaAtributů = souborovýSystém.list(); - atributy.clear(); - for (String jménoAtributu : jménaAtributů) { - ByteBuffer hodnotaAtributu = ByteBuffer - .allocate(souborovýSystém.size(jménoAtributu)); - souborovýSystém.read(jménoAtributu, hodnotaAtributu); - atributy.add(new Atribut(jménoAtributu, hodnotaAtributu)); - } - upozorniPosluchače(); - } - - private void upozorniPosluchače() { - for (TableModelListener p : posluchače) { - p.tableChanged(new TableModelEvent(this)); - } - } - - public boolean isZámekPodporovaný() { - return konfigurace.getSoubor().isFile(); - } - - public void nastavZámek(boolean zamknout) throws IOException { - if (!isZámekPodporovaný()) { - throw new IOException(překlady - .getString("chyba.lzeZamknoutJenSoubor")); - } - - if (zamknout && zámekSoubor == null) { - zámekSoubor = new RandomAccessFile(konfigurace.getSoubor(), "rw"); - zámekKanál = zámekSoubor.getChannel(); - zámek = zámekKanál.lock(); - } else if (!zamknout && zámekSoubor != null) { - zámek.release(); - zámekKanál.close(); - zámekSoubor.close(); - zámek = null; - zámekKanál = null; - zámekSoubor = null; - } - - } -} diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.form Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff -r 41e91ea94acb -r ec0e970e0830 java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java --- a/java/rozsirene-atributy/src/cz/frantovo/rozsireneatributy/gui/Panel.java Sat Dec 16 19:09:35 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -/** - * Rozšířené atributy – program na správu rozšířených atributů souborů - * Copyright © 2012 František Kučera (frantovo.cz) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package cz.frantovo.rozsireneatributy.gui; - -import cz.frantovo.rozsireneatributy.Atribut; -import cz.frantovo.rozsireneatributy.CSV; -import java.awt.Toolkit; -import java.awt.datatransfer.StringSelection; -import java.io.IOException; -import java.io.StringWriter; -import java.util.ResourceBundle; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -/** - * @author Ing. František Kučera (frantovo.cz) - */ -public class Panel extends javax.swing.JPanel { - - public static final int SLOUPEC_NÁZVU = 0; - public static final int SLOUPEC_HODNOTY = 1; - private static final Logger log = Logger - .getLogger(Panel.class.getSimpleName()); - private static final ResourceBundle překlady = ResourceBundle - .getBundle(Atribut.class.getPackageName() + ".Překlady"); - private Model model; - private Atribut vybranýAtribut; - private JTable tabulka; - - public Panel(Model model) { - this.model = model; - initComponents(); - - tlačítkoZamknout.setEnabled(model.isZámekPodporovaný()); - tlačítkoZamknout.setToolTipText(model.isZámekPodporovaný() - ? překlady.getString("zamknout.popis") - : překlady.getString("chyba.lzeZamknoutJenSoubor")); - - tabulka = new JTable(model); - nastavEditor(); - tabulka.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - posuvnýPanel.setViewportView(tabulka); - - tabulka.setRowHeight((int) (tabulka.getRowHeight() * 1.3)); - - /** Výběr aktuálního atributu v tabulce */ - tabulka.getSelectionModel().addListSelectionListener( - new ListSelectionListener() { - - @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); - } - } - }); - } - - private void nastavEditor() { - tabulka.getColumnModel().getColumn(SLOUPEC_NÁZVU) - .setCellEditor(new EditorNázvůAtributů(model.getKonfigurace())); - tabulka.getColumnModel().getColumn(SLOUPEC_HODNOTY) - .setCellEditor(new EditorHodnotAtributů(model.getKonfigurace())); - } - - private Model getModel() { - return model; - } - - public void setModel(Model model) { - this.model = model; - tabulka.setModel(model); - nastavEditor(); - } - - private void zobrazChybovouHlášku(String hláška, Throwable chyba) { - JOptionPane.showMessageDialog(this, hláška + "\n" - + chyba.getLocalizedMessage(), - 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(); - CSV csv = new CSV(výstup); - - csv.hodnota(překlady.getString("tabulka.název").toLowerCase()); - csv.hodnota(překlady.getString("tabulka.hodnota").toLowerCase()); - csv.konecŘádku(); - - for (int i = 0; i < model.getRowCount(); i++) { - csv.hodnota(String.valueOf(model.getValueAt(i, 0))); - csv.hodnota(String.valueOf(model.getValueAt(i, 1))); - csv.konecŘádku(); - } - - Toolkit.getDefaultToolkit().getSystemClipboard().setContents( - new StringSelection(výstup.toString()), - null - ); - } catch (Exception e) { - zobrazChybovouHlášku(překlady - .getString("chyba.nepodařiloSeZkopírovat"), e); - } - } - - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - posuvnýPanel = new javax.swing.JScrollPane(); - tlačítkoPřidat = new javax.swing.JButton(); - tlačítkoSmazat = new javax.swing.JButton(); - tlačítkoZnovuNačíst = new javax.swing.JButton(); - tlačítkoZamknout = new javax.swing.JToggleButton(); - tlačítkoKopírovat = new javax.swing.JButton(); - - tlačítkoPřidat.setMnemonic('p'); - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("cz/frantovo/rozsireneatributy/Překlady"); // NOI18N - tlačítkoPřidat.setText(bundle.getString("přidatAtribut")); // NOI18N - tlačítkoPřidat.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tlačítkoPřidatActionPerformed(evt); - } - }); - - tlačítkoSmazat.setMnemonic('s'); - tlačítkoSmazat.setText(bundle.getString("smazatAtribut")); // NOI18N - tlačítkoSmazat.setEnabled(false); - tlačítkoSmazat.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tlačítkoSmazatActionPerformed(evt); - } - }); - - tlačítkoZnovuNačíst.setMnemonic('z'); - tlačítkoZnovuNačíst.setText(bundle.getString("znovuNačíst")); // NOI18N - tlačítkoZnovuNačíst.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tlačítkoZnovuNačístActionPerformed(evt); - } - }); - - tlačítkoZamknout.setText(bundle.getString("zamknout")); // NOI18N - tlačítkoZamknout.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tlačítkoZamknoutActionPerformed(evt); - } - }); - - tlačítkoKopírovat.setText(bundle.getString("schránka.kopírovat")); // NOI18N - tlačítkoKopírovat.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tlačítkoKopírovatActionPerformed(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(tlačítkoPřidat) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tlačítkoSmazat) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tlačítkoZnovuNačíst) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tlačítkoZamknout) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tlačítkoKopírovat) - .addContainerGap(25, Short.MAX_VALUE)) - .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tlačítkoPřidat) - .addComponent(tlačítkoSmazat) - .addComponent(tlačítkoZnovuNačíst) - .addComponent(tlačítkoZamknout) - .addComponent(tlačítkoKopírovat)) - .addContainerGap()) - ); - }// //GEN-END:initComponents - - private void tlačítkoPřidatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoPřidatActionPerformed - model.přidejAtribut(new Atribut()); - }//GEN-LAST:event_tlačítkoPřidatActionPerformed - - private void tlačítkoSmazatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoSmazatActionPerformed - try { - model.odeberAtribut(vybranýAtribut); - } catch (IOException e) { - zobrazChybovouHlášku(překlady - .getString("chyba.nepodařiloSeSmazat"), e); - } - }//GEN-LAST:event_tlačítkoSmazatActionPerformed - - private void tlačítkoZnovuNačístActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZnovuNačístActionPerformed - try { - model.načtiAtributy(); - } catch (IOException e) { - zobrazChybovouHlášku(překlady - .getString("chyba.nepodařiloSeNačíst"), e); - } - }//GEN-LAST:event_tlačítkoZnovuNačístActionPerformed - - private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed - try { - model.nastavZámek(tlačítkoZamknout.isSelected()); - } catch (Exception e) { - zobrazChybovouHlášku(překlady - .getString("chyba.nepodařiloSeNastavitZámek"), e); - } - }//GEN-LAST:event_tlačítkoZamknoutActionPerformed - - private void tlačítkoKopírovatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoKopírovatActionPerformed - kopírujDoSchránky(); - }//GEN-LAST:event_tlačítkoKopírovatActionPerformed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JScrollPane posuvnýPanel; - private javax.swing.JButton tlačítkoKopírovat; - private javax.swing.JButton tlačítkoPřidat; - private javax.swing.JButton tlačítkoSmazat; - private javax.swing.JToggleButton tlačítkoZamknout; - private javax.swing.JButton tlačítkoZnovuNačíst; - // End of variables declaration//GEN-END:variables -} diff -r 41e91ea94acb -r ec0e970e0830 licence/header.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/licence/header.txt Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,16 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ \ No newline at end of file diff -r 41e91ea94acb -r ec0e970e0830 nb-configuration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nb-configuration.xml Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,18 @@ + + + + + + ${project.basedir}/licence/header.txt + + diff -r 41e91ea94acb -r ec0e970e0830 nbactions.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nbactions.xml Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,55 @@ + + + + run + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:3.0.0:exec + + + + ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} + --soubor target + ${packageClassName} + java + + + + debug + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:3.0.0:exec + + + -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} + ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} + --soubor target + ${packageClassName} + java + true + + + + profile + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:3.0.0:exec + + + + ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs} + ${packageClassName} + java + --soubor target + + + diff -r 41e91ea94acb -r ec0e970e0830 pom.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pom.xml Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,42 @@ + + + 4.0.0 + + cz.frantovo.xattr + rozsirene-atributy + 0.1-SNAPSHOT + jar + + + 1.7 + 1.7 + UTF-8 + UTF-8 + cz.frantovo.rozsireneatributy.Startér + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + true + + true + ${main-class} + + + + + + + + diff -r 41e91ea94acb -r ec0e970e0830 rozšířené-atributy.sh --- a/rozšířené-atributy.sh Sat Dec 16 19:09:35 2023 +0100 +++ b/rozšířené-atributy.sh Sat Dec 16 20:13:13 2023 +0100 @@ -1,11 +1,11 @@ #!/bin/bash -JAVA_HOME="/opt/jdk1.7.0"; -JAVA_BIN="${JAVA_HOME}/bin/java"; +#JAVA_HOME="/opt/jdk1.7.0"; +#JAVA_BIN="${JAVA_HOME}/bin/java"; +JAVA_BIN="java"; SWING_LAF="-Dswing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"; -JAR="java/rozsirene-atributy/dist/rozsirene-atributy.jar"; +SWING_LAF="-Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel"; +VER="0.1-SNAPSHOT" +JAR="$(dirname $(realpath $0))/target/rozsirene-atributy-${VER}.jar"; -# For English localization uncomment this: -# LANG="en_US.utf8"; - -${JAVA_BIN} ${SWING_LAF} -jar ${JAR} "${1}"; +${JAVA_BIN} ${SWING_LAF} -jar ${JAR} "${@}"; diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/Atribut.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/Atribut.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,97 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +/** + * @author Ing. František Kučera (frantovo.cz) + */ +public class Atribut { + + private String klíč; + private String hodnota; + + public Atribut(String klíč, String hodnota) { + this.klíč = klíč; + this.hodnota = hodnota; + } + + public Atribut(String klíč, ByteBuffer hodnota) { + this.klíč = klíč; + setHodnota(hodnota); + } + + public Atribut() { + } + + public String getKlíč() { + return klíč; + } + + public void setKlíč(String klíč) { + this.klíč = klíč; + } + + /** + * Název atributu musí být nenulový a mít nějakou délku, aby šel uložit + * TODO: další kontroly? + * @return jestli je platný + */ + public boolean isPlatnýKlíč() { + return klíč != null && klíč.length() > 0; + } + + /** + * nulová hodnota → smazání atributu + * (ale může být prázdný řetězec) + * @return jestli je platná + */ + public boolean isPlatnáHodnota() { + return hodnota != null; + } + + public String getHodnota() { + return hodnota; + } + + public final ByteBuffer getHodnotaBajty() { + return zakóduj(getHodnota()); + } + + public void setHodnota(String hodnota) { + this.hodnota = hodnota; + } + + public final void setHodnota(ByteBuffer hodnota) { + setHodnota(dekóduj(hodnota)); + } + + private static String dekóduj(ByteBuffer bajty) { + bajty.flip(); + return Charset.defaultCharset().decode(bajty).toString(); + } + + private static ByteBuffer zakóduj(String text) { + if (text == null) { + return null; + } else { + return Charset.defaultCharset().encode(text); + } + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/CLIParser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/CLIParser.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,173 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2023 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; +import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty; +import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.ResourceBundle; + +/** + * Converts command line arguments from String array to object. Checks basic + * constraints (if only supported options are used and if they have correct + * number of parameters) + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class CLIParser { + + private static final ResourceBundle překlady = ResourceBundle + .getBundle(Atribut.class.getPackageName() + ".Překlady"); + + public Konfigurace parsujParametry(String[] parametry) + throws CLIParserException { + Konfigurace k = new Konfigurace(); + + for (int i = 0; i < parametry.length; i++) { + String parametr = parametry[i]; + + boolean odpovídá = false; + + for (Token t : Token.values()) { + if (t.odpovídá(parametr)) { + int parsedArgs = t.parsuj(parametry, i, k); + i = i + parsedArgs; + odpovídá = true; + } + } + + if (!odpovídá) { + throw new CLIParserException( + překlady.getString("chyba.cli.neznámýParametr") + parametr); + } + } + + if (k.getSoubor() == null) + throw new CLIParserException( + překlady.getString("chyba.cli.chybíSoubor")); + + return k; + } + + private static String načtiDalší(String[] parametry, int index) + throws CLIParserException { + if (index < parametry.length) { + return parametry[index]; + } else { + throw new CLIParserException("Expecting value for option: " + + parametry[index - 1]); + } + } + + private static boolean načtiDalšíBoolean(String[] parametry, int index) + throws CLIParserException { + String s = načtiDalší(parametry, index); + switch (s) { + case "true": + case "ano": + return true; + case "false": + case "ne": + return false; + default: + throw new CLIParserException("Neplatná logická hodnota: " + s); + } + } + + private static enum Token { + + SOUBOR("--soubor", "--file") { + @Override + public int parsuj(String[] parametry, int index, Konfigurace k) + throws CLIParserException { + int originalIndex = index; + k.setSoubor(new File(načtiDalší(parametry, ++index))); + return index - originalIndex; + } + }, + POVINNÉ_ZAMYKÁNÍ("--povinné-zamykání", "--mandatory-locking") { + @Override + public int parsuj(String[] parametry, int index, Konfigurace k) + throws CLIParserException { + int originalIndex = index; + k.setPovinnéZamykání(načtiDalšíBoolean(parametry, ++index)); + return index - originalIndex; + } + }, + DEFINICE_ATRIBUTU("--definice-atributu", "--attribute-definition") { + @Override + public int parsuj(String[] parametry, int index, Konfigurace k) + throws CLIParserException { + int originalIndex = index; + String název = načtiDalší(parametry, ++index); + String popis = načtiDalší(parametry, ++index); + k.addAtribut(new DefiniceAtributu(název, popis)); + return index - originalIndex; + } + }, + HODNOTA_ATRIBUTU("--hodnota", "--value") { + @Override + public int parsuj(String[] parametry, int index, Konfigurace k) + throws CLIParserException { + int originalIndex = index; + String hodnota = načtiDalší(parametry, ++index); + String popis = načtiDalší(parametry, ++index); + + if (k.getAtributy().isEmpty()) + throw new CLIParserException( + překlady.getString("chyba.cli.chybíDefiniceAtributu")); + + k.getAtributy() + .get(k.getAtributy().size() - 1) + .addHodnota(new DefiniceHodnoty(hodnota, popis)); + + return index - originalIndex; + } + }; + + private final Collection parametry; + + private Token(String... parametry) { + this.parametry = Arrays.asList(parametry); + } + + /** + * @param parametr e.g. „--input-file“ + * @return whether option is this token + */ + public boolean odpovídá(String parametr) { + return parametry.contains(parametr); + } + + /** + * Parse String arguments and fill values into the options object. + * + * @param parametry CLI arguments + * @param index index of the option matched by this token, like + * „--input-file“ + * @param k object to be filled + * @return number of parsed arguments – if option has no arguments (just + * boolean flag), return 0, otherwise return positive integer: number of + * eaten arguments. + * @throws CLIParserException + */ + public abstract int parsuj(String[] parametry, int index, Konfigurace k) + throws CLIParserException; + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/CLIParserException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/CLIParserException.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,39 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2023 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +/** + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class CLIParserException extends Exception { + + public CLIParserException() { + } + + public CLIParserException(String message) { + super(message); + } + + public CLIParserException(Throwable cause) { + super(cause); + } + + public CLIParserException(String message, Throwable cause) { + super(message, cause); + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/CSV.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/CSV.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,65 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2023 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +import java.io.IOException; +import java.io.Writer; + +/** + * Generátor standardních CSV. + * + * @author Ing. František Kučera + */ +public class CSV { + + private final Writer výstup; + private int sloupec = 0; + private int početSloupců = -1; + + public CSV(Writer výstup) { + this.výstup = výstup; + } + + public void hodnota(String hodnota) throws IOException { + if (sloupec > 0) výstup.write(','); + if (hodnota != null && !hodnota.isEmpty()) { + výstup.write('"'); + for (char ch : hodnota.toCharArray()) { + if (ch == '"') výstup.write('"'); + výstup.write(ch); + } + výstup.write('"'); + } + sloupec++; + výstup.flush(); + } + + public void konecŘádku() throws IOException { + if (početSloupců < 0) početSloupců = sloupec; + if (sloupec == početSloupců) { + výstup.write("\r\n"); + sloupec = 0; + } else { + throw new IOException("Neodpovídá počet sloupců:" + + " aktuální=" + sloupec + + " celkový=" + početSloupců + ); + } + výstup.flush(); + } + +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/Konfigurace.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/Konfigurace.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,122 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2023 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; + +/** + * @author Ing. František Kučera (frantovo.cz) + */ +public class Konfigurace { + + public static class DefiniceAtributu { + + private String název; + private String popis; + private final List hodnoty = new LinkedList<>(); + + public DefiniceAtributu(String název, String popis) { + this.název = název; + this.popis = popis; + } + + public String getNázev() { + return název; + } + + public void setNázev(String název) { + this.název = název; + } + + public String getPopis() { + return popis; + } + + public void setPopis(String popis) { + this.popis = popis; + } + + public List getHodnoty() { + return hodnoty; + } + + public void addHodnota(DefiniceHodnoty hodnota) { + this.hodnoty.add(hodnota); + } + + } + + public static class DefiniceHodnoty { + + private String název; + private String popis; + + public DefiniceHodnoty(String název, String popis) { + this.název = název; + this.popis = popis; + } + + public String getNázev() { + return název; + } + + public void setNázev(String název) { + this.název = název; + } + + public String getPopis() { + return popis; + } + + public void setPopis(String popis) { + this.popis = popis; + } + } + + private File soubor; + + private boolean povinnéZamykání = false; + + private final List atributy = new LinkedList<>(); + + public File getSoubor() { + return soubor; + } + + public void setSoubor(File soubor) { + this.soubor = soubor; + } + + public boolean isPovinnéZamykání() { + return povinnéZamykání; + } + + public void setPovinnéZamykání(boolean povinnéZamykání) { + this.povinnéZamykání = povinnéZamykání; + } + + public List getAtributy() { + return atributy; + } + + public void addAtribut(DefiniceAtributu atribut) { + this.atributy.add(atribut); + } + +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/Startér.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/Startér.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,111 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy; + +import cz.frantovo.rozsireneatributy.gui.Model; +import cz.frantovo.rozsireneatributy.gui.Panel; +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.io.File; +import java.text.MessageFormat; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.KeyStroke; + +/** + * Spouštěč programu + * + * http://freedesktop.org/wiki/CommonExtendedAttributes + * http://download.oracle.com/javase/tutorial/essential/io/fileAttr.html#user + * http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html + * #so-what-is-a-path-really + * + * $ setfattr -n "user.franta.pozdrav" -v 'Dobrý den!' pokus.txt (v javě pak + * pracujeme s klíči bez předpony „user.“) + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class Startér { + + private static final Logger log = Logger + .getLogger(Startér.class.getSimpleName()); + private static final ResourceBundle překlady = ResourceBundle + .getBundle(Atribut.class.getPackageName() + ".Překlady"); + + /** + * @param args název souboru + */ + public static void main(String[] args) { + + try { + // TODO: načítat konfiguraci i z XML souboru + CLIParser parser = new CLIParser(); + Konfigurace konfigurace = parser.parsujParametry(args); + + File soubor = konfigurace.getSoubor(); + + if (soubor.exists()) { + log.log(Level.INFO, "Pracuji se souborem: {0}", soubor); + + Model model = new Model(konfigurace); + + final JFrame f = new JFrame(); + Panel p = new Panel(model); + + f.setLayout(new BorderLayout()); + f.add(p, BorderLayout.CENTER); + + // Ukončení programu klávesou Escape: + f.getRootPane().registerKeyboardAction(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent ae) { + f.dispose(); + } + }, + KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), + JComponent.WHEN_IN_FOCUSED_WINDOW); + + f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + f.setTitle(MessageFormat + .format(překlady.getString("titulek"), soubor)); + f.setSize(640, 240); + f.setLocationRelativeTo(null); + f.setVisible(true); + } else { + ukončiChybou(MessageFormat.format(překlady + .getString("chyba.souborNeexistuje"), soubor)); + } + } catch (Exception e) { + log.log(Level.SEVERE, překlady.getString("chyba"), e); + ukončiChybou(e.getLocalizedMessage()); + } + } + + private static void ukončiChybou(String hláška) { + log.log(Level.SEVERE, hláška); + JOptionPane.showMessageDialog(null, hláška, překlady + .getString("chyba.titulek"), JOptionPane.ERROR_MESSAGE); + System.exit(1); + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/gui/EditorHodnotAtributů.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/EditorHodnotAtributů.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,155 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy.gui; + +import cz.frantovo.rozsireneatributy.Konfigurace; +import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; +import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.EventObject; +import java.util.Objects; +import javax.swing.JComboBox; +import javax.swing.JTable; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.EventListenerList; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableModel; + +/** + * Umožňuje výběr hodnoty atributu z předvoleného seznamu. + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class EditorHodnotAtributů + extends JComboBox + implements TableCellEditor { + + private final Konfigurace konfigurace; + private JTable tabulka; + private TableModel model; + private int řádek; + private int sloupec; + protected EventListenerList posluchače = new EventListenerList(); + protected ChangeEvent událost = new ChangeEvent(this); + + public EditorHodnotAtributů(Konfigurace konfigurace) { + super(); + this.konfigurace = konfigurace; + setEditable(true); + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + fireEditiaceSkončila(); + } + }); + } + + protected void fireEditiaceSkončila() { + for (Object posluchač : posluchače.getListenerList()) { + if (posluchač instanceof CellEditorListener) { + ((CellEditorListener) posluchač).editingStopped(událost); + } + } + } + + protected void fireEditiaceZrušena() { + for (Object posluchač : posluchače.getListenerList()) { + if (posluchač instanceof CellEditorListener) { + ((CellEditorListener) posluchač).editingCanceled(událost); + } + } + } + + private void obnovHodnoty(Object hodnotaAtributu) { + removeAllItems(); + + if (hodnotaAtributu == null) { + hodnotaAtributu = ""; + } else if (!(hodnotaAtributu instanceof String)) { + hodnotaAtributu = String.valueOf(hodnotaAtributu); + } + addItem((String) hodnotaAtributu); + setSelectedItem(hodnotaAtributu); + + Object názevAtributu = model.getValueAt(řádek, Panel.SLOUPEC_NÁZVU); + for (DefiniceAtributu da : konfigurace.getAtributy()) { + if (Objects.equals(názevAtributu, da.getNázev())) { + for (DefiniceHodnoty dh : da.getHodnoty()) { + addItem(dh.getNázev()); + } + } + } + + } + + @Override + public Component getTableCellEditorComponent( + JTable tabulka, + Object hodnota, + boolean vybraná, + int řádek, + int sloupec) // + { + this.řádek = řádek; + this.sloupec = sloupec; + this.tabulka = tabulka; + this.model = tabulka.getModel(); + obnovHodnoty(hodnota); + // TODO: více různých instancí? + return this; + } + + @Override + public Object getCellEditorValue() { + return getSelectedItem(); + } + + @Override + public boolean isCellEditable(EventObject anEvent) { + return true; + } + + @Override + public boolean shouldSelectCell(EventObject anEvent) { + return true; + } + + @Override + public boolean stopCellEditing() { + fireEditiaceSkončila(); + return true; + } + + @Override + public void cancelCellEditing() { + fireEditiaceZrušena(); + } + + @Override + public void addCellEditorListener(CellEditorListener l) { + posluchače.add(CellEditorListener.class, l); + } + + @Override + public void removeCellEditorListener(CellEditorListener l) { + posluchače.remove(CellEditorListener.class, l); + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/gui/EditorNázvůAtributů.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/EditorNázvůAtributů.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,190 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy.gui; + +import cz.frantovo.rozsireneatributy.Konfigurace; +import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.EventObject; +import javax.swing.JComboBox; +import javax.swing.JTable; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.EventListenerList; +import javax.swing.table.TableCellEditor; + +/** + * Umožňuje výběr názvu atributu z předvoleného seznamu + * (standardizované atributy). + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class EditorNázvůAtributů + extends JComboBox + implements TableCellEditor { + + private final Konfigurace konfigurace; + protected EventListenerList posluchače = new EventListenerList(); + protected ChangeEvent událost = new ChangeEvent(this); + + public EditorNázvůAtributů(Konfigurace konfigurace) { + super(); + this.konfigurace = konfigurace; + setEditable(true); + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + fireEditiaceSkončila(); + } + }); + } + + protected void fireEditiaceSkončila() { + for (Object posluchač : posluchače.getListenerList()) { + if (posluchač instanceof CellEditorListener) { + ((CellEditorListener) posluchač).editingStopped(událost); + } + } + } + + protected void fireEditiaceZrušena() { + for (Object posluchač : posluchače.getListenerList()) { + if (posluchač instanceof CellEditorListener) { + ((CellEditorListener) posluchač).editingCanceled(událost); + } + } + } + + /** + * TODO: + * - další standardní atributy + * - načítat z XML souboru + * + * @see http://www.freedesktop.org/wiki/CommonExtendedAttributes + */ + private void obnovHodnoty(Object názevAtributu) { + removeAllItems(); + + if (názevAtributu == null) { + názevAtributu = ""; + } else if (!(názevAtributu instanceof String)) { + názevAtributu = String.valueOf(názevAtributu); + } + addItem((String) názevAtributu); + setSelectedItem(názevAtributu); + + for (DefiniceAtributu da : konfigurace.getAtributy()) { + addItem(da.getNázev()); + } + + if (!konfigurace.getAtributy().isEmpty()) return; + + // General attributes in current use + addItem("mime_type"); + addItem("charset"); + addItem("creator"); + + // Proposed metadata attributes + addItem("xdg.comment"); + addItem("xdg.origin.url"); + addItem("xdg.origin.email.subject"); + addItem("xdg.origin.email.from"); + addItem("xdg.origin.email.message-id"); + addItem("xdg.language"); + addItem("xdg.creator"); + addItem("xdg.publisher"); + + // Proposed control attributes + addItem("xdg.robots.index"); + addItem("xdg.robots.backup"); + + // Dublin Core + addItem("dublincore.title"); + addItem("dublincore.creator"); + addItem("dublincore.subject"); + addItem("dublincore.description"); + addItem("dublincore.publisher"); + addItem("dublincore.contributor"); + addItem("dublincore.date"); + addItem("dublincore.type"); + addItem("dublincore.format"); + addItem("dublincore.identifier"); + addItem("dublincore.source"); + addItem("dublincore.language"); + addItem("dublincore.relation"); + addItem("dublincore.coverage"); + addItem("dublincore.rights"); + + // Application-specific attributes in current use + addItem("mime_encoding"); + addItem("apache_handler"); + addItem("Beagle.AttrTime"); + addItem("Beagle.Fingerprint"); + addItem("Beagle.MTime"); + addItem("Beagle.Uid"); + } + + @Override + public Component getTableCellEditorComponent( + JTable tabulka, + Object hodnota, + boolean vybraná, + int řádek, + int sloupec) { + obnovHodnoty(hodnota); + return this; + } + + @Override + public Object getCellEditorValue() { + return getSelectedItem(); + } + + @Override + public boolean isCellEditable(EventObject anEvent) { + return true; + } + + @Override + public boolean shouldSelectCell(EventObject anEvent) { + return true; + } + + @Override + public boolean stopCellEditing() { + fireEditiaceSkončila(); + return true; + } + + @Override + public void cancelCellEditing() { + fireEditiaceZrušena(); + } + + @Override + public void addCellEditorListener(CellEditorListener l) { + posluchače.add(CellEditorListener.class, l); + } + + @Override + public void removeCellEditorListener(CellEditorListener l) { + posluchače.remove(CellEditorListener.class, l); + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/gui/Model.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/Model.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,218 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy.gui; + +import cz.frantovo.rozsireneatributy.Atribut; +import cz.frantovo.rozsireneatributy.Konfigurace; +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.file.Path; +import java.nio.file.attribute.UserDefinedFileAttributeView; +import java.nio.file.spi.FileSystemProvider; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.ResourceBundle; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +/** + * @author Ing. František Kučera (frantovo.cz) + */ +public class Model implements TableModel { + + private static final Logger log = Logger + .getLogger(Model.class.getSimpleName()); + private static final ResourceBundle překlady = ResourceBundle + .getBundle(Atribut.class.getPackageName() + ".Překlady"); + private final String[] sloupečky = { + překlady.getString("tabulka.název"), + překlady.getString("tabulka.hodnota") + }; + private final Set posluchače = new HashSet<>(); + private final Konfigurace konfigurace; + private final UserDefinedFileAttributeView souborovýSystém; + private final List atributy = new ArrayList<>(); + + private RandomAccessFile zámekSoubor; + private FileChannel zámekKanál; + private FileLock zámek; + + public Model(Konfigurace konfigurace) throws IOException { + this.konfigurace = konfigurace; + Path cesta = konfigurace.getSoubor().toPath(); + FileSystemProvider posyktovatelFS = cesta.getFileSystem().provider(); + souborovýSystém = posyktovatelFS + .getFileAttributeView(cesta, UserDefinedFileAttributeView.class); + načtiAtributy(); + } + + public Konfigurace getKonfigurace() { + return konfigurace; + } + + @Override + public int getRowCount() { + return atributy.size(); + } + + @Override + public int getColumnCount() { + return sloupečky.length; + } + + @Override + public String getColumnName(int n) { + return sloupečky[n]; + } + + @Override + public Class getColumnClass(int n) { + return String.class; + } + + @Override + public boolean isCellEditable(int m, int n) { + return true; + } + + @Override + public Object getValueAt(int m, int n) { + switch (n) { + case 0: + return atributy.get(m).getKlíč(); + case 1: + return atributy.get(m).getHodnota(); + default: + return null; + } + } + + @Override + public void setValueAt(Object hodnota, int m, int n) { + Atribut a = atributy.get(m); + try { + if (n == 0) { + /** + * Měníme klíč – název atributu + */ + String novýKlíč = String.valueOf(hodnota); + if (!novýKlíč.equals(a.getKlíč())) { + if (a.isPlatnýKlíč()) { + souborovýSystém.delete(a.getKlíč()); + } + a.setKlíč(novýKlíč); + if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) { + souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty()); + } + } + } else if (n == 1) { + /** + * Měníme hodnotu atributu + */ + a.setHodnota(String.valueOf(hodnota)); + if (a.isPlatnýKlíč() && a.isPlatnáHodnota()) { + souborovýSystém.write(a.getKlíč(), a.getHodnotaBajty()); + } + } + } catch (IOException e) { + log.log(Level.SEVERE, "Selhalo ukládání atributu na FS", e); + } + } + + @Override + public void addTableModelListener(TableModelListener l) { + posluchače.add(l); + } + + @Override + public void removeTableModelListener(TableModelListener l) { + posluchače.remove(l); + } + + /** + * @param m číslo řádku + * @return atribut, který se na něm nachází + */ + public Atribut getAtribut(int m) { + return atributy.get(m); + } + + public void přidejAtribut(Atribut a) { + atributy.add(a); + upozorniPosluchače(); + } + + public void odeberAtribut(Atribut a) throws IOException { + atributy.remove(a); + if (a.isPlatnýKlíč()) { + souborovýSystém.delete(a.getKlíč()); + } + upozorniPosluchače(); + } + + public final void načtiAtributy() throws IOException { + List jménaAtributů = souborovýSystém.list(); + atributy.clear(); + for (String jménoAtributu : jménaAtributů) { + ByteBuffer hodnotaAtributu = ByteBuffer + .allocate(souborovýSystém.size(jménoAtributu)); + souborovýSystém.read(jménoAtributu, hodnotaAtributu); + atributy.add(new Atribut(jménoAtributu, hodnotaAtributu)); + } + upozorniPosluchače(); + } + + private void upozorniPosluchače() { + for (TableModelListener p : posluchače) { + p.tableChanged(new TableModelEvent(this)); + } + } + + public boolean isZámekPodporovaný() { + return konfigurace.getSoubor().isFile(); + } + + public void nastavZámek(boolean zamknout) throws IOException { + if (!isZámekPodporovaný()) { + throw new IOException(překlady + .getString("chyba.lzeZamknoutJenSoubor")); + } + + if (zamknout && zámekSoubor == null) { + zámekSoubor = new RandomAccessFile(konfigurace.getSoubor(), "rw"); + zámekKanál = zámekSoubor.getChannel(); + zámek = zámekKanál.lock(); + } else if (!zamknout && zámekSoubor != null) { + zámek.release(); + zámekKanál.close(); + zámekSoubor.close(); + zámek = null; + zámekKanál = null; + zámekSoubor = null; + } + + } +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.form --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.form Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,112 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 41e91ea94acb -r ec0e970e0830 src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/cz/frantovo/rozsireneatributy/gui/Panel.java Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,259 @@ +/** + * Rozšířené atributy – program na správu rozšířených atributů souborů + * Copyright © 2012 František Kučera (frantovo.cz) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package cz.frantovo.rozsireneatributy.gui; + +import cz.frantovo.rozsireneatributy.Atribut; +import cz.frantovo.rozsireneatributy.CSV; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.io.IOException; +import java.io.StringWriter; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +/** + * @author Ing. František Kučera (frantovo.cz) + */ +public class Panel extends javax.swing.JPanel { + + public static final int SLOUPEC_NÁZVU = 0; + public static final int SLOUPEC_HODNOTY = 1; + private static final Logger log = Logger + .getLogger(Panel.class.getSimpleName()); + private static final ResourceBundle překlady = ResourceBundle + .getBundle(Atribut.class.getPackageName() + ".Překlady"); + private Model model; + private Atribut vybranýAtribut; + private JTable tabulka; + + public Panel(Model model) { + this.model = model; + initComponents(); + + tlačítkoZamknout.setEnabled(model.isZámekPodporovaný()); + tlačítkoZamknout.setToolTipText(model.isZámekPodporovaný() + ? překlady.getString("zamknout.popis") + : překlady.getString("chyba.lzeZamknoutJenSoubor")); + + tabulka = new JTable(model); + nastavEditor(); + tabulka.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + posuvnýPanel.setViewportView(tabulka); + + tabulka.setRowHeight((int) (tabulka.getRowHeight() * 1.3)); + + /** Výběr aktuálního atributu v tabulce */ + tabulka.getSelectionModel().addListSelectionListener( + new ListSelectionListener() { + + @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); + } + } + }); + } + + private void nastavEditor() { + tabulka.getColumnModel().getColumn(SLOUPEC_NÁZVU) + .setCellEditor(new EditorNázvůAtributů(model.getKonfigurace())); + tabulka.getColumnModel().getColumn(SLOUPEC_HODNOTY) + .setCellEditor(new EditorHodnotAtributů(model.getKonfigurace())); + } + + private Model getModel() { + return model; + } + + public void setModel(Model model) { + this.model = model; + tabulka.setModel(model); + nastavEditor(); + } + + private void zobrazChybovouHlášku(String hláška, Throwable chyba) { + JOptionPane.showMessageDialog(this, hláška + "\n" + + chyba.getLocalizedMessage(), + 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(); + CSV csv = new CSV(výstup); + + csv.hodnota(překlady.getString("tabulka.název").toLowerCase()); + csv.hodnota(překlady.getString("tabulka.hodnota").toLowerCase()); + csv.konecŘádku(); + + for (int i = 0; i < model.getRowCount(); i++) { + csv.hodnota(String.valueOf(model.getValueAt(i, 0))); + csv.hodnota(String.valueOf(model.getValueAt(i, 1))); + csv.konecŘádku(); + } + + Toolkit.getDefaultToolkit().getSystemClipboard().setContents( + new StringSelection(výstup.toString()), + null + ); + } catch (Exception e) { + zobrazChybovouHlášku(překlady + .getString("chyba.nepodařiloSeZkopírovat"), e); + } + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + posuvnýPanel = new javax.swing.JScrollPane(); + tlačítkoPřidat = new javax.swing.JButton(); + tlačítkoSmazat = new javax.swing.JButton(); + tlačítkoZnovuNačíst = new javax.swing.JButton(); + tlačítkoZamknout = new javax.swing.JToggleButton(); + tlačítkoKopírovat = new javax.swing.JButton(); + + tlačítkoPřidat.setMnemonic('p'); + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("cz/frantovo/rozsireneatributy/Překlady"); // NOI18N + tlačítkoPřidat.setText(bundle.getString("přidatAtribut")); // NOI18N + tlačítkoPřidat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoPřidatActionPerformed(evt); + } + }); + + tlačítkoSmazat.setMnemonic('s'); + tlačítkoSmazat.setText(bundle.getString("smazatAtribut")); // NOI18N + tlačítkoSmazat.setEnabled(false); + tlačítkoSmazat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoSmazatActionPerformed(evt); + } + }); + + tlačítkoZnovuNačíst.setMnemonic('z'); + tlačítkoZnovuNačíst.setText(bundle.getString("znovuNačíst")); // NOI18N + tlačítkoZnovuNačíst.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoZnovuNačístActionPerformed(evt); + } + }); + + tlačítkoZamknout.setText(bundle.getString("zamknout")); // NOI18N + tlačítkoZamknout.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoZamknoutActionPerformed(evt); + } + }); + + tlačítkoKopírovat.setText(bundle.getString("schránka.kopírovat")); // NOI18N + tlačítkoKopírovat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tlačítkoKopírovatActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(tlačítkoPřidat) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tlačítkoSmazat) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tlačítkoZnovuNačíst) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tlačítkoZamknout) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tlačítkoKopírovat) + .addContainerGap(25, Short.MAX_VALUE)) + .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 543, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(posuvnýPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tlačítkoPřidat) + .addComponent(tlačítkoSmazat) + .addComponent(tlačítkoZnovuNačíst) + .addComponent(tlačítkoZamknout) + .addComponent(tlačítkoKopírovat)) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + private void tlačítkoPřidatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoPřidatActionPerformed + model.přidejAtribut(new Atribut()); + }//GEN-LAST:event_tlačítkoPřidatActionPerformed + + private void tlačítkoSmazatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoSmazatActionPerformed + try { + model.odeberAtribut(vybranýAtribut); + } catch (IOException e) { + zobrazChybovouHlášku(překlady + .getString("chyba.nepodařiloSeSmazat"), e); + } + }//GEN-LAST:event_tlačítkoSmazatActionPerformed + + private void tlačítkoZnovuNačístActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZnovuNačístActionPerformed + try { + model.načtiAtributy(); + } catch (IOException e) { + zobrazChybovouHlášku(překlady + .getString("chyba.nepodařiloSeNačíst"), e); + } + }//GEN-LAST:event_tlačítkoZnovuNačístActionPerformed + + private void tlačítkoZamknoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoZamknoutActionPerformed + try { + model.nastavZámek(tlačítkoZamknout.isSelected()); + } catch (Exception e) { + zobrazChybovouHlášku(překlady + .getString("chyba.nepodařiloSeNastavitZámek"), e); + } + }//GEN-LAST:event_tlačítkoZamknoutActionPerformed + + private void tlačítkoKopírovatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tlačítkoKopírovatActionPerformed + kopírujDoSchránky(); + }//GEN-LAST:event_tlačítkoKopírovatActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane posuvnýPanel; + private javax.swing.JButton tlačítkoKopírovat; + private javax.swing.JButton tlačítkoPřidat; + private javax.swing.JButton tlačítkoSmazat; + private javax.swing.JToggleButton tlačítkoZamknout; + private javax.swing.JButton tlačítkoZnovuNačíst; + // End of variables declaration//GEN-END:variables +} diff -r 41e91ea94acb -r ec0e970e0830 src/main/resources/cz/frantovo/rozsireneatributy/Překlady.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/resources/cz/frantovo/rozsireneatributy/Překlady.properties Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,1 @@ +Překlady_cs.properties \ No newline at end of file diff -r 41e91ea94acb -r ec0e970e0830 src/main/resources/cz/frantovo/rozsireneatributy/Překlady_cs.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_cs.properties Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,25 @@ +titulek=Roz\u0161\u00ed\u0159en\u00e9 stributy souboru: {0} + +chyba=Chyba: +chyba.titulek=Chyba +chyba.souborNeexistuje=Soubor neexistuje: {0} +chyba.nepoda\u0159iloSeSmazat=Nepoda\u0159ilo se smazat atribut. +chyba.nepoda\u0159iloSeNa\u010d\u00edst=Nepoda\u0159ilo se na\u010d\u00edst atributy. +chyba.nepoda\u0159iloSeZkop\u00edrovat=Nepoda\u0159ilo se zkop\u00edrovat atributy do schr\u00e1nky. +chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Nepoda\u0159ilo se nastavit z\u00e1mek. +chyba.lzeZamknoutJenSoubor=Je podporov\u00e1no zamyk\u00e1n\u00ed pouze norm\u00e1ln\u00edch sobour\u016f ne adres\u00e1\u0159\u016f atd. +chyba.cli.nezn\u00e1m\u00fdParametr=Nezn\u00e1m\u00fd parametr: +chyba.cli.chyb\u00edDefiniceAtributu=Chyb\u00ed definice atributu (hodnota se vztahuje k n\u00ed). +chyba.cli.chyb\u00edSoubor=Nebyl uveden soubor. + +tabulka.n\u00e1zev=N\u00e1zev +tabulka.hodnota=Hodnota + +schr\u00e1nka.kop\u00edrovat=Kop\u00edrovat +schr\u00e1nka.vlo\u017eit=Vlo\u017eit + +p\u0159idatAtribut=P\u0159idat atribut +smazatAtribut=Smazat atribut +znovuNa\u010d\u00edst=Znovu na\u010d\u00edst +zamknout=Zamknout +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 41e91ea94acb -r ec0e970e0830 src/main/resources/cz/frantovo/rozsireneatributy/Překlady_en.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/resources/cz/frantovo/rozsireneatributy/Překlady_en.properties Sat Dec 16 20:13:13 2023 +0100 @@ -0,0 +1,25 @@ +titulek=Extended Attributes of file: {0} + +chyba=Error: +chyba.titulek=Error +chyba.souborNeexistuje=File does not exist: {0} +chyba.nepoda\u0159iloSeSmazat=Failed to delete the attribute. +chyba.nepoda\u0159iloSeNa\u010d\u00edst=Failed to load attributes. +chyba.nepoda\u0159iloSeZkop\u00edrovat=Unable to copy attributes to the clipboard. +chyba.nepoda\u0159iloSeNastavitZ\u00e1mek=Unable to lock the file. +chyba.lzeZamknoutJenSoubor=File locking is supported only for regular files, not for directories or specials. +chyba.cli.nezn\u00e1m\u00fdParametr=Unknown option: +chyba.cli.chyb\u00edDefiniceAtributu=Missing attribute definition (value is associated with it). +chyba.cli.chyb\u00edSoubor=File name was not specified. + +tabulka.n\u00e1zev=Name +tabulka.hodnota=Value + +schr\u00e1nka.kop\u00edrovat=Copy +schr\u00e1nka.vlo\u017eit=Paste + +p\u0159idatAtribut=Add attribute +smazatAtribut=Delete attribute +znovuNa\u010d\u00edst=Reload all +zamknout=Lock +zamknout.popis=Open the file for write and lock it. On unlocking, release the lock and close the file.