diff --git a/CHANGELOG.md b/CHANGELOG.md
index e93506a..6595fa2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.0 (2022-06-18)
+### Added
+ - US / ANSI style gate symbols and option to switch in the menu, thanks to Sett17
+
## 2.1.0 (2022-01-25)
### Fixed
- Bumped launch4j to version 2.1.0
diff --git a/pom.xml b/pom.xml
index e2e115e..2c68f3c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
lc.kra.jds
jds
- 2.1.0
+ 2.2.0
JDigitalSimulator
http://kra.lc/projects/jdigitalsimulator/
diff --git a/src/main/java/lc/kra/jds/Simulation.java b/src/main/java/lc/kra/jds/Simulation.java
index 2864517..dd72d23 100644
--- a/src/main/java/lc/kra/jds/Simulation.java
+++ b/src/main/java/lc/kra/jds/Simulation.java
@@ -743,6 +743,7 @@ private void paintComponents(Graphics graphics, Collection components
wire.paint(graphics);
}
private List paintComponent(Graphics graphics, Component component) {
+ component.checkSymbolStandard();
Point location = component.getLocation();
Dimension size = component.getSize();
graphics.setColor(Color.BLACK);
diff --git a/src/main/java/lc/kra/jds/Utilities.java b/src/main/java/lc/kra/jds/Utilities.java
index 2ae2a64..952df00 100644
--- a/src/main/java/lc/kra/jds/Utilities.java
+++ b/src/main/java/lc/kra/jds/Utilities.java
@@ -17,6 +17,11 @@
*/
package lc.kra.jds;
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.swing.JFileChooser;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
@@ -45,12 +50,6 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.DESKeySpec;
-import javax.swing.JFileChooser;
-
public final class Utilities {
public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP, DESCRIPTION; }
@@ -58,6 +57,7 @@ public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP
CONFIGURATION_LOCALIZATION_LANGUAGE = "localization.language",
CONFIGURATION_LOOK_AND_FEEL_CLASS = "lookandfeel.class",
CONFIGURATION_LOOK_AND_FEEL_NAME = "lookandfeel.name",
+ CONFIGURATION_ANSI_SYMBOLS = "symbols.ansi",
CONFIGURATION_WINDOW_SIZE = "window.size",
CONFIGURATION_WINDOW_LOCATION = "window.location",
CONFIGURATION_WINDOW_MAXIMIZED = "window.maximized";
@@ -66,9 +66,11 @@ public static enum TranslationType { TEXT, ALTERNATIVE, TITLE, EXTERNAL, TOOLTIP
private static Locale currentLocale = Locale.getDefault();
private static ResourceBundle translationBundle;
private static SimpleClassLoader simpleClassLoader;
-
+
private static Properties configuration = new Properties();
+ private static boolean useAnsiSymbols = false;
+
public static Object copy(Object object) throws CloneNotSupportedException { //deep clone using serilization
Object copy = null;
FastByteArrayOutputStream byteOutput = new FastByteArrayOutputStream();
@@ -135,6 +137,13 @@ public static String getTranslation(String key, TranslationType type, Object...
else return MessageFormat.format(bundle.getString(key), variables);
}
+ public static boolean useAnsiSymbols(){
+ return useAnsiSymbols;
+ }
+ public static void setUseAnsiSymbols(boolean value){
+ useAnsiSymbols = value;
+ }
+
public static URL getResource(String name) {
if(!name.startsWith("/"))
name = "/lc/kra/jds/"+name;
@@ -420,7 +429,7 @@ private Class> loadClass(byte[] bytes) {
return cls;
}
}
-
+
public static class AlternateClassLoaderObjectInputStream extends ObjectInputStream {
protected final ClassLoader alternateClassLoader;
public AlternateClassLoaderObjectInputStream(InputStream in, ClassLoader alternateClassLoader) throws IOException {
@@ -445,7 +454,7 @@ public static String replaceLegacyPackage(String name) {
return name.replaceFirst("^(\\[L)?"+Pattern.quote(LEGACY_PACKAGE_PREFIX), "$1"+Matcher.quoteReplacement(PACKAGE_PREFIX));
}
}
-
+
public static URL getLocalPath() {
URL path = Utilities.class.getProtectionDomain().getCodeSource().getLocation();
try { return new URL(URLDecoder.decode(path.toString(), "UTF-8")); }
@@ -487,4 +496,4 @@ private static File getLastDirectory() {
setConfiguration("directory", selected.getParentFile().toString());
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/lc/kra/jds/components/Component.java b/src/main/java/lc/kra/jds/components/Component.java
index bec70d9..c335871 100644
--- a/src/main/java/lc/kra/jds/components/Component.java
+++ b/src/main/java/lc/kra/jds/components/Component.java
@@ -57,10 +57,20 @@ public abstract class Component implements Paintable, Locatable, Moveable, Clone
private Point location;
protected PropertyChangeSupport change;
+ protected Boolean useAnsiSymbols;
public Component() { this.location = new Point(); }
public Component(Point location) { this.setLocation(location); }
+ public final void checkSymbolStandard() {
+ Boolean currentUseAnsiSymbols = Boolean.valueOf(useAnsiSymbols());
+ if (!currentUseAnsiSymbols.equals(useAnsiSymbols)) {
+ useAnsiSymbols = currentUseAnsiSymbols;
+ changeSymbolStandard();
+ }
+ }
+ protected void changeSymbolStandard() {}
+
public abstract Dimension getSize();
@Override public void moveTo(Point location) { this.setLocation(location); }
@Override public void moveRelative(Point location) {
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java
index 4d4fc29..d9b6896 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/AbstractGate.java
@@ -17,12 +17,6 @@
*/
package lc.kra.jds.components.buildin.gate;
-import java.awt.Graphics;
-import java.awt.Point;
-import java.beans.PropertyVetoException;
-import java.util.HashMap;
-import java.util.Map;
-
import lc.kra.jds.Utilities;
import lc.kra.jds.components.Configurable;
import lc.kra.jds.components.Configurable.Option.OptionType;
@@ -32,6 +26,12 @@
import lc.kra.jds.contacts.InputContact;
import lc.kra.jds.contacts.OutputContact;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.beans.PropertyVetoException;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Abstract-Gate (build-in component)
* @author Kristian Kraljic (kris@kra.lc)
@@ -50,13 +50,30 @@ public AbstractGate() {
contacts = ContactUtilities.concatenateContacts(output, inputs.toArray());
}
+ @Override
+ protected void changeSymbolStandard() {
+ super.changeSymbolStandard();
+ if (inputs != null)
+ inputs.setContactLocations();
+ if (output != null)
+ output.setLocation(new Point(this.size.width, this.size.height / 2));
+ }
+
@Override public void paint(Graphics graphics) {
super.paint(graphics);
Class extends AbstractGate> cls = this.getClass();
if(cls.equals(NandGate.class)||cls.equals(NorGate.class)||cls.equals(XnorGate.class))
- ContactUtilities.paintSolderingJoint(graphics, 5, 3, output);
+ ContactUtilities.paintSolderingJoint(graphics, 5, 3, output);
else ContactUtilities.paintSolderingJoint(graphics, 5, 10, output);
- inputs.paintSolderingJoints(graphics, 5, 10);
+ if (useAnsiSymbols) {
+ if (cls.equals(OrGate.class)||cls.equals(NorGate.class)||cls.equals(XorGate.class)||cls.equals(XnorGate.class)) {
+ inputs.paintSolderingJoints(graphics, 9, 10);
+ } else {
+ inputs.paintSolderingJoints(graphics, 5, 10);
+ }
+ } else {
+ inputs.paintSolderingJoints(graphics, 5, 10);
+ }
}
@Override public Contact[] getContacts() { return contacts; }
@@ -75,4 +92,4 @@ public AbstractGate() {
configuration.put(getOptions()[0], inputs.getContactsCount());
return configuration;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java
index 0d6aca8..7723c6c 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/AndGate.java
@@ -37,7 +37,13 @@ public class AndGate extends AbstractGate {
@Override public void paint(Graphics graphics) {
super.paint(graphics);
- paintLabel(graphics, "&");
+ if(useAnsiSymbols){
+ int transition = size.width - size.height / 2 - 11;
+ graphics.drawPolyline(new int[]{transition, 5, 5, transition}, new int[]{0, 0, size.height, size.height}, 4);
+ graphics.drawArc(transition - size.height / 2, 0, size.height, size.height, 90, -180);
+ } else {
+ paintLabel(graphics, "&");
+ }
}
@Override public void calculate() {
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java b/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java
index f97ec51..c289693 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/Gate.java
@@ -17,14 +17,14 @@
*/
package lc.kra.jds.components.buildin.gate;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-
import lc.kra.jds.components.Component;
import lc.kra.jds.components.Sociable;
import lc.kra.jds.contacts.Contact;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+
/**
* Gate (build-in component)
* @author Kristian Kraljic (kris@kra.lc)
@@ -32,18 +32,32 @@
public abstract class Gate extends Component implements Sociable {
private static final long serialVersionUID = 2l;
+ private static final Dimension ISO_SIZE = new Dimension(50, 48), ANSI_SIZE = new Dimension(55, 35);
+
protected Dimension size;
- public Gate() { size = new Dimension(50, 48); }
+ public Gate() {
+ checkSymbolStandard();
+ }
+
+ protected void changeSymbolStandard() {
+ if (useAnsiSymbols) {
+ size = ANSI_SIZE;
+ } else {
+ size = ISO_SIZE;
+ }
+ }
@Override public void paint(Graphics graphics) {
graphics.setColor(Color.BLACK);
- graphics.drawRect(5, 0, size.width-15, size.height);
+ if (!useAnsiSymbols) {
+ graphics.drawRect(5, 0, size.width-15, size.height);
+ }
}
protected void paintLabel(Graphics graphics, String label) { graphics.drawString(label, 5+(size.width-15)/2-graphics.getFontMetrics().stringWidth(label)/2, 15); }
protected void paintNot(Graphics graphics) { graphics.drawOval(size.width-10, size.height/2-3, 6, 6); }
@Override public abstract Contact[] getContacts();
- @Override public final Dimension getSize() { return size; }
+ @Override public Dimension getSize() { return size; }
@Override public abstract void calculate();
-}
\ No newline at end of file
+}
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java
index 26b87b6..0865220 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/NotGate.java
@@ -17,17 +17,18 @@
*/
package lc.kra.jds.components.buildin.gate;
-import static lc.kra.jds.Utilities.*;
-
-import java.awt.Graphics;
-import java.awt.Point;
-
import lc.kra.jds.Utilities.TranslationType;
import lc.kra.jds.contacts.Contact;
import lc.kra.jds.contacts.ContactUtilities;
import lc.kra.jds.contacts.InputContact;
import lc.kra.jds.contacts.OutputContact;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Point;
+
+import static lc.kra.jds.Utilities.getTranslation;
+
/**
* NOT-Gate (build-in component)
* @author Kristian Kraljic (kris@kra.lc)
@@ -38,6 +39,7 @@ public class NotGate extends Gate {
private static final String KEY;
static { KEY = "component.gate."+NotGate.class.getSimpleName().toLowerCase(); }
public static final ComponentAttributes componentAttributes = new ComponentAttributes(KEY, getTranslation(KEY), "group.gate", getTranslation(KEY, TranslationType.DESCRIPTION), "Kristian Kraljic (kris@kra.lc)", 1);
+ private static final Dimension ANSI_SIZE = new Dimension(45, 35);
private InputContact input;
private OutputContact output;
@@ -50,15 +52,31 @@ public NotGate() {
contacts = new Contact[]{input, output};
}
+ @Override
+ protected void changeSymbolStandard() {
+ super.changeSymbolStandard();
+ if (useAnsiSymbols)
+ size = ANSI_SIZE;
+ if (input != null)
+ input.setLocation(new Point(0, this.size.height / 2));
+ if (output != null)
+ output.setLocation(new Point(this.size.width, this.size.height / 2));
+ }
+
@Override public void paint(Graphics graphics) {
super.paint(graphics);
ContactUtilities.paintSolderingJoints(graphics, contacts);
- paintLabel(graphics, "1");
+ if (useAnsiSymbols) {
+ graphics.drawPolyline(new int[]{5, size.width - 11, 5, 5}, new int[]{0, size.height / 2, size.height, 0}, 4);
+ } else {
+ paintLabel(graphics, "1");
+ }
paintNot(graphics);
}
@Override public Contact[] getContacts() { return contacts; }
+ @Override public Dimension getSize() { return size; }
@Override public void calculate() {
output.setCharged(!input.isCharged());
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java
index 91cc46a..40115ae 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/OrGate.java
@@ -37,7 +37,13 @@ public class OrGate extends AbstractGate {
@Override public void paint(Graphics graphics) {
super.paint(graphics);
- paintLabel(graphics, "\u22651");
+ if(useAnsiSymbols){
+ graphics.drawArc(5 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180);
+ graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, 0, (int) (size.width * 1.6), (int) (size.height * 1.7), 90, -65);
+ graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, size.height - ((int) (size.height * 1.7)), (int) (size.width * 1.6), (int) (size.height * 1.7), -90, 65);
+ } else {
+ paintLabel(graphics, "\u22651");
+ }
}
@Override public void calculate() {
diff --git a/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java b/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java
index 1caeff2..dea29d5 100644
--- a/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java
+++ b/src/main/java/lc/kra/jds/components/buildin/gate/XorGate.java
@@ -38,7 +38,14 @@ public class XorGate extends AbstractGate {
@Override public void paint(Graphics graphics) {
super.paint(graphics);
- paintLabel(graphics, "=1");
+ if (useAnsiSymbols) {
+ graphics.drawArc(5 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180);
+ graphics.drawArc(1 - (size.height / 3) / 2, 0, size.height / 3, size.height, 90, -180);
+ graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, 0, (int) (size.width * 1.6), (int) (size.height * 1.7), 90, -65);
+ graphics.drawArc(5 - ((int) (size.width * 1.6)) / 2, size.height - ((int) (size.height * 1.7)), (int) (size.width * 1.6), (int) (size.height * 1.7), -90, 65);
+ } else {
+ paintLabel(graphics, "=1");
+ }
}
@Override public void calculate() {
diff --git a/src/main/java/lc/kra/jds/contacts/ComponentContact.java b/src/main/java/lc/kra/jds/contacts/ComponentContact.java
index 7a566f3..ed2fd13 100644
--- a/src/main/java/lc/kra/jds/contacts/ComponentContact.java
+++ b/src/main/java/lc/kra/jds/contacts/ComponentContact.java
@@ -21,6 +21,7 @@
import java.awt.Point;
import lc.kra.jds.components.Component;
+import lc.kra.jds.components.Wire;
import lc.kra.jds.exceptions.LocationOutOfBoundsException;
public abstract class ComponentContact extends Contact implements Cloneable {
@@ -39,9 +40,14 @@ public ComponentContact(Component component, Point location) {
@Override public Component getComponent() { return component; }
@Override public Point getLocation() { return this.location; }
@Override public void setLocation(Point location) throws LocationOutOfBoundsException {
- this.location = location;
- if(location.x+location.y!=0)
- validateLocation(); //store location but throw a exception
+ if (!location.equals(this.location)) {
+ this.location = location;
+ if(location.x+location.y!=0)
+ validateLocation(); //store location but throw a exception
+ for(Wire wire:getWires()) {
+ wire.revalidate();
+ }
+ }
}
@Override protected void validateLocation() throws LocationOutOfBoundsException {
diff --git a/src/main/java/lc/kra/jds/gui/Application.java b/src/main/java/lc/kra/jds/gui/Application.java
index 6a2ef01..6d8f46c 100644
--- a/src/main/java/lc/kra/jds/gui/Application.java
+++ b/src/main/java/lc/kra/jds/gui/Application.java
@@ -140,7 +140,7 @@
/**
* JDigitalSimulator
* @author Kristian Kraljic
- * @version 2.1.0
+ * @version 2.2.0
*/
public class Application extends JFrame {
private static final long serialVersionUID = -4693271310855486553L;
@@ -148,7 +148,7 @@ public class Application extends JFrame {
public static final String FILE_EXTENSION = "jdsim";
public static File pluginDirectory, currentDirectory;
- private static final String VERSION = "2.1.0", COPYRIGHT = "2010-2022", LINES_OF_CODE = "9.509", WORDS_OF_CODE = "36.133", PAGES_OF_CODE = "245";
+ private static final String VERSION = "2.2.0", COPYRIGHT = "2010-2022", LINES_OF_CODE = "9.509", WORDS_OF_CODE = "36.133", PAGES_OF_CODE = "245";
private static final String[]
TOOLBAR_FRAME_FOCUS = new String[]{"save", "print", "print_level", "simulate", "left", "right", "up", "down", "grid", "secure", "zoom_default", "zoom", "zoom_in", "zoom_out"},
@@ -586,6 +586,16 @@ public void actionPerformed(ActionEvent event) {
lookAndFeel.setSelectedItem(UIManager.getLookAndFeel().getName());
centerPane.add(lookAndFeelPane);
+ centerPane.add(javax.swing.Box.createVerticalStrut(20));
+
+ centerPane.add(Guitilities.createSeparator(getTranslation("properties.symbols")));
+ javax.swing.JPanel symbolStandardPane = new javax.swing.JPanel(new java.awt.GridBagLayout());
+ final javax.swing.JComboBox symbolStandard = Guitilities.addGridPairLine(symbolStandardPane, 0, new javax.swing.JLabel(getTranslation("properties.symbols.name")), new javax.swing.JComboBox());
+ symbolStandard.addItem("IEC 60617-12 : 1997");
+ symbolStandard.addItem("ANSI/IEEE Std 91/91a-1991");
+ symbolStandard.setSelectedIndex(useAnsiSymbols() ? 1 : 0);
+ centerPane.add(symbolStandardPane);
+
JPanel bottomPane = Guitilities.createGradientFooter();
final ActionListener cancelListener = new ActionListener() {
@Override public void actionPerformed(ActionEvent event) { dialog.dispose(); }
@@ -607,6 +617,15 @@ public void actionPerformed(ActionEvent event) {
SwingUtilities.updateComponentTreeUI(dialog);
SwingUtilities.updateComponentTreeUI(Application.this);
}
+ boolean useAnsiSymbols = symbolStandard.getSelectedIndex() == 1;
+ if (useAnsiSymbols != useAnsiSymbols()) {
+ setUseAnsiSymbols(useAnsiSymbols);
+ Utilities.setConfiguration(Utilities.CONFIGURATION_ANSI_SYMBOLS, Boolean.toString(useAnsiSymbols));
+ for(ComponentButton button:componentButtons)
+ button.refreshIcon();
+ }
+ revalidate();
+ repaint();
}
};
bottomPane.add(Guitilities.createButton(getTranslation("properties.okay"), new ActionListener() {
@@ -1028,9 +1047,9 @@ protected class ComponentButton extends JButton {
public ComponentButton(ComponentAttributes attributes, final Class extends Component> cls) throws InstantiationException, IllegalAccessException {
this.component = createComponent(cls);
- setText(attributes.name);
+ setText((this.attributes = attributes).name);
setToolTipText(attributes.description);
- setIcon(icon=createComponentImage(component, attributes.description));
+ refreshIcon();
setIconTextGap(10);
setHorizontalTextPosition(JButton.TRAILING);
setHorizontalAlignment(JButton.LEADING);
@@ -1075,15 +1094,20 @@ public ComponentButton(ComponentAttributes attributes, final Class extends Com
});
}
+ public void refreshIcon() {
+ setIcon(icon=createComponentImage(component, attributes.description));
+ repaint();
+ }
public void setIconVisible(boolean visible) {
if(!visible)
- this.setIcon(null);
+ this.setIcon(null);
else this.setIcon(icon);
repaint();
}
private Component createComponent(Class extends Component> cls) throws InstantiationException, IllegalAccessException { return cls.newInstance(); }
private ImageIcon createComponentImage(Component component, String tooltip) {
+ component.checkSymbolStandard();
Dimension size = component.getSize();
Image image = Guitilities.createTranslucentImage(size.width+1, size.height+1);
Graphics2D graphics = (Graphics2D) image.getGraphics();
@@ -1319,6 +1343,7 @@ public static void main(String[] args) {
for(Locale locale:Utilities.SUPPORTED_LOCALES)
if(locale.getLanguage().equals(localizationLanguage))
Utilities.setCurrentLocale(locale);
+ setUseAnsiSymbols(Boolean.parseBoolean(lc.kra.jds.Utilities.getConfiguration(CONFIGURATION_ANSI_SYMBOLS)));
Application application = new Application();
if(args.length!=0)
try { application.openWorksheet(new File(args[0])); }
diff --git a/src/main/resources/lc/kra/jds/TranslationBundle.properties b/src/main/resources/lc/kra/jds/TranslationBundle.properties
index 5266062..fc11a88 100644
--- a/src/main/resources/lc/kra/jds/TranslationBundle.properties
+++ b/src/main/resources/lc/kra/jds/TranslationBundle.properties
@@ -302,6 +302,8 @@ properties.localization.language = Language:
properties.localization.info = Note: You will have to restart the JDigitalSimulator in order to complete the change of the default display language completely.
properties.lookandfeel = Look and feel
properties.lookandfeel.name = Preferred design:
+properties.symbols = Symbols
+properties.symbols.name = Preferred standard:
properties.okay = Okay
properties.cancel = Cancel
properties.apply = Apply
diff --git a/src/main/resources/lc/kra/jds/TranslationBundle_de.properties b/src/main/resources/lc/kra/jds/TranslationBundle_de.properties
index f651ef4..a670050 100644
--- a/src/main/resources/lc/kra/jds/TranslationBundle_de.properties
+++ b/src/main/resources/lc/kra/jds/TranslationBundle_de.properties
@@ -1,6 +1,6 @@
# This is the German TranslationBundle_de.properties file
translation.author = Kristian Kraljic
-translation.title = - Übersetzt durch Kristian Kraljic
+translation.title = - Ãœbersetzt durch Kristian Kraljic
translation.version = 1.0
menubar.file = Datei
@@ -12,7 +12,7 @@ menubar.help = Hilfe
toolbar = Werkzeugleiste
toolbar.new = Neu
-toolbar.open = Öffnen
+toolbar.open = Öffnen
toolbar.save = Speichern
toolbar.exit = Beenden
toolbar.print = Drucken
@@ -56,20 +56,20 @@ toolbar.fullscreen.tooltip = In Vollbildansicht wechseln
toolbar.properties.tooltip = Eigenschaften anzeigen
menu.file.new = Neu
-menu.file.open = Öffnen
+menu.file.open = Öffnen
menu.file.close = Schliessen
menu.file.save = Speichern
menu.file.save_as = Speichern unter
menu.file.print = Drucken
menu.file.print_level = Pegelschreiber drucken
menu.file.exit = Beenden
-menu.edit.undo = Rückgängig
+menu.edit.undo = Rückgängig
menu.edit.redo = Wiederherstellen
menu.edit.cut = Ausschneiden
menu.edit.copy = Kopieren
-menu.edit.paste = Einfügen
-menu.edit.delete = Löschen
-menu.edit.select_all = Alles Auswählen
+menu.edit.paste = Einfügen
+menu.edit.delete = Löschen
+menu.edit.select_all = Alles Auswählen
menu.edit.front = Nach Vorne
menu.edit.back = Nach Hinten
menu.properties.worksheet = Arbeitsblatt Einstellungen
@@ -79,10 +79,10 @@ menu.display.zoom_in = Hinein Zoomen
menu.display.zoom_out = Heraus Zoomen
menu.display.fullscreen = Vollbild
menu.window.cascade = Kacheln
-menu.window.tile = Übereinander
-menu.help.about = Über
-menu.oscilloscope.direction = Richtung ändern
-menu.oscilloscope.clear = Rücksetzen
+menu.window.tile = Ãœbereinander
+menu.help.about = Ãœber
+menu.oscilloscope.direction = Richtung ändern
+menu.oscilloscope.clear = Rücksetzen
menu.oscilloscope.save = Als Bild speichern
menu.file.new.tooltip = Eine neue Datei erstellen
@@ -95,8 +95,8 @@ menu.file.print_level.tooltip = Pegelschreiber drucken
menu.file.exit.tooltip = Programm beenden
menu.edit.cut.tooltip = Schneidet die selektierten Komponenten aus
menu.edit.copy.tooltip = Kopiert die selektierten Komponenten
-menu.edit.paste.tooltip = Fügt alle Komponenten aus der Zwischenablage ein
-menu.edit.delete.tooltip = Löscht alle selektierten Komponenten
+menu.edit.paste.tooltip = Fügt alle Komponenten aus der Zwischenablage ein
+menu.edit.delete.tooltip = Löscht alle selektierten Komponenten
menu.edit.select_all.tooltip = Seketiert alle Komponenten
menu.edit.front.tooltip = In den Vordergrund bringen
menu.edit.back.tooltip = In den Hintergrund schieben
@@ -108,23 +108,23 @@ menu.display.zoom_out.tooltip = Raus Zoomen
menu.display.fullscreen.tooltip = In Vollbildansicht wechseln
menu.window.cascade.tooltip = Kachelt die Fenster im Arbeitsbereich
menu.window.tile.tooltip = Ordnet die Fenster im Arbeitsbereich nebeneinander an
-menu.help.about.tooltip = Zeigt informationen über das Programm und den Author an
-menu.oscilloscope.clear.tooltip = Setzt die aktuellen Werte des Pegelschreibers zurück
+menu.help.about.tooltip = Zeigt informationen über das Programm und den Author an
+menu.oscilloscope.clear.tooltip = Setzt die aktuellen Werte des Pegelschreibers zurück
menu.component.properties = Eigenschaften
-menu.component.delete = Löschen
-menu.component.open.simulation = Simulation Öffnen
-menu.wire.add.junction = Knotenpunkt hinzufügen
-menu.wire.add.voltmeter = Spannungsmessgerät hinzufügen
+menu.component.delete = Löschen
+menu.component.open.simulation = Simulation Öffnen
+menu.wire.add.junction = Knotenpunkt hinzufügen
+menu.wire.add.voltmeter = Spannungsmessgerät hinzufügen
-menu.display.fullscreen.not_supported = Eine Vollbildschirmdarstellung ist nicht möglich.
+menu.display.fullscreen.not_supported = Eine Vollbildschirmdarstellung ist nicht möglich.
oscilloscope.save.error = Der Pegelschreiber konnte nicht in eine Datei gespeichert werden.
components.title = Komponenten
components.load.error = Einige der eingebauten Komponenten konnten nicht korrekt geladen werden.\nBitte versuchen sie es erneut oder kontaktieren sie den Entwickler um einen Fehler zu melden.
components.load.error.title = Fehler beim laden einiger eingebauten Komponenten
-components.load.plugin.error = Einige der zusätzlichen Komponenten konnte nicht korrekt geladen werden.\nBitte prüfen sie Ihr Plugin-Verzeichniss und versuchen sie es erneut.
-components.load.plugin.error.title = Fehler beim laden einiger zusätzlichen Komponenten
+components.load.plugin.error = Einige der zusätzlichen Komponenten konnte nicht korrekt geladen werden.\nBitte prüfen sie Ihr Plugin-Verzeichniss und versuchen sie es erneut.
+components.load.plugin.error.title = Fehler beim laden einiger zusätzlichen Komponenten
component.configuration = {0}
component.configuration.title = Komponenten Einstellungen
@@ -136,28 +136,28 @@ component.configuration.error.number = Mindestens ein Eingabefeld erlaubt nur di
component.connector.name = Name
component.connector.name.default = Stecker
-component.connector.name.error = Bitte geben sie einen Namen für diesen Stecker an.
+component.connector.name.error = Bitte geben sie einen Namen für diesen Stecker an.
component.simulation.file = Datei
component.simulation.file.unknown = Unbekannte Datei
-component.simulation.file.choose = Datei auswählen
+component.simulation.file.choose = Datei auswählen
component.voltmeter.name = Name:
component.voltmeter.name.default = V-{0}
-component.voltmeter.name.error = The Spannungsmessgerät braucht einen Namen.
+component.voltmeter.name.error = The Spannungsmessgerät braucht einen Namen.
component.text.default = Text
component.text.text = Text:
-component.text.size = Größe:
+component.text.size = Größe:
component.text.text.error = Bitte geben sie eien Text an.
-component.text.size.minimum = Die Mindestgröße für Schrift ist {0}.
-component.text.size.maximum = Die Maximalgröße für Schrift ist {0}.
+component.text.size.minimum = Die Mindestgröße für Schrift ist {0}.
+component.text.size.maximum = Die Maximalgröße für Schrift ist {0}.
component.clock.low = Low-Pegel (Hunderstelsekunde)
component.clock.high = High-Pegel (Hunderstelsekunde)
component.clock.minimum = Die kleinste Tacktzeit ist eine Hunderstelsekunde.
-component.switch.position = Standardmäßig auf An
+component.switch.position = Standardmäßig auf An
component.flipflop.tigger = Taktart
component.flipflop.masterslave = Master/Slave
@@ -172,8 +172,8 @@ component.alu.halfadder = Halb-Addierer
component.alu.alu74181 = ALU 74181
component.converter.bytetodecimalconverter = Byte nach Dezimal Konverter
component.converter.bytetosevensegmentconverter = Byte nach Siebensegment Konverter
-component.counter.binarycounter = Binär Zähler
-component.counter.loadablebinarycounter = Ladbarer Binär Zähler
+component.counter.binarycounter = Binär Zähler
+component.counter.loadablebinarycounter = Ladbarer Binär Zähler
component.display.binarydisplay = Anzeige
component.display.displayarray = Anzeigen
component.display.sevensegmentdisplay = Sieben-Segment Anzeige
@@ -194,13 +194,13 @@ component.gate.notgate = NOT-Gatter
component.gate.orgate = OR-Gatter
component.gate.xnorgate = XNOR-Gatter
component.gate.xorgate = XOR-Gatter
-component.general.junction = Verbindungsstück
+component.general.junction = Verbindungsstück
component.general.text = Text
-component.register.loadableregister = Ladbares Binäres Register
+component.register.loadableregister = Ladbares Binäres Register
component.register.loadableshiftregister = Ladbares Schiebe-Register
component.register.shiftregister = Schiebe-Register
component.memory.bitmemory = n-Bit Speicher
-component.memory.guardedbitmemory = Geschützter n-Bit Speicher
+component.memory.guardedbitmemory = Geschützter n-Bit Speicher
component.memory.randomaccessmemory = Random-Access Memory (RAM)
component.switches.clock = Takt
component.switches.gnd = Gnd
@@ -214,8 +214,8 @@ component.alu.halfadder.description = Halb-Addierer
component.alu.alu74181.description = ALU 74181
component.converter.bytetodecimalconverter.description = Byte nach Dezimal Konverter
component.converter.bytetosevensegmentconverter.description = Byte nach Siebensegment Konverter
-component.counter.binarycounter.description = Binär Zähler
-component.counter.loadablebinarycounter.description = Ladbarer Binär Zähler
+component.counter.binarycounter.description = Binär Zähler
+component.counter.loadablebinarycounter.description = Ladbarer Binär Zähler
component.display.binarydisplay.description = Anzeige
component.display.displayarray.description = Anzeigen
component.display.sevensegmentdisplay.description = Sieben-Segment Anzeige
@@ -236,13 +236,13 @@ component.gate.notgate.description = NOT-Gatter
component.gate.orgate.description = OR-Gatter
component.gate.xnorgate.description = XNOR-Gatter
component.gate.xorgate.description = XOR-Gatter
-component.general.junction.description = Verbindungsstück
+component.general.junction.description = Verbindungsstück
component.general.text.description = Text
-component.register.loadableregister.description = Ladbares Binäres Register
+component.register.loadableregister.description = Ladbares Binäres Register
component.register.loadableshiftregister.description = Ladbares Schiebe-Register
component.register.shiftregister.description = Schiebe-Register
component.memory.bitmemory.description = n-Bit Speicher
-component.memory.guardedbitmemory.description = Geschützter n-Bit Speicher
+component.memory.guardedbitmemory.description = Geschützter n-Bit Speicher
component.memory.randomaccessmemory.description = Random-Access Memory (RAM)
component.switches.clock.description = Takt
component.switches.gnd.description = Erde
@@ -251,22 +251,22 @@ component.switches.switch.description = Schalter
component.switches.vcc.description = Positive Versorgungsspannung
component.memory.address.count = Adressbits
-component.memory.address.count.minimum = Es müssen mindestens {0} Addressbits gewählt werden.
-component.memory.address.count.maximum = Es sind höchstens {0} Adressbits zugelassen
-component.memory.word.size = Wortgröße
-component.memory.word.size.mimimum = Die Wortgröße muss mindestens {0} Bit betragen.
-component.memory.word.size.maximum = Es ist höchstens eine Wortgröße von {0} Bit zugelassen.
-component.memory.size.overflow = Die Speichergröße ist auf {0} Bit limitiert, aktuelle Größe {1} Bit.
+component.memory.address.count.minimum = Es müssen mindestens {0} Addressbits gewählt werden.
+component.memory.address.count.maximum = Es sind höchstens {0} Adressbits zugelassen
+component.memory.word.size = Wortgröße
+component.memory.word.size.mimimum = Die Wortgröße muss mindestens {0} Bit betragen.
+component.memory.word.size.maximum = Es ist höchstens eine Wortgröße von {0} Bit zugelassen.
+component.memory.size.overflow = Die Speichergröße ist auf {0} Bit limitiert, aktuelle Größe {1} Bit.
contact.count = Anzahl Kontakte
-contact.minimum = Es müssen mindestens {0} Kontakte sein.
-contact.maximum = Es sind höchstens {0} Kontakte zugelassen.
+contact.minimum = Es müssen mindestens {0} Kontakte sein.
+contact.maximum = Es sind höchstens {0} Kontakte zugelassen.
contact.input.count = Anzahl Eingangskontakte
-contact.input.minimum = Es müssen mindestens {0} Eingangskontakte sein.
-contact.input.maximum = Es sind höchstens {0} Eingangskontakte zugelassen.
+contact.input.minimum = Es müssen mindestens {0} Eingangskontakte sein.
+contact.input.maximum = Es sind höchstens {0} Eingangskontakte zugelassen.
contact.output.count = Anzahl Ausgangskontakte
-contact.output.minimum = Es müssen mindestens {0} Ausgangskontakte sein.
-contact.output.maximum = Es sind höchstens {0} Ausgangskontakte zugelassen.
+contact.output.minimum = Es müssen mindestens {0} Ausgangskontakte sein.
+contact.output.maximum = Es sind höchstens {0} Ausgangskontakte zugelassen.
group.images = Bilder anzeigen
group.expand = Klicken um diese Gruppe zusammenzuklappen oder zu erweitern
@@ -279,10 +279,10 @@ group.register = Register
group.register = Speicher
group.selector = Selektoren
group.alu = ALU
-group.counter = Zähler
+group.counter = Zähler
group.converter = Konverter
group.interface = Interface
-group.additional = Zusätzliche
+group.additional = Zusätzliche
group.others = Weitere
group.external = Extern
@@ -299,45 +299,47 @@ properties.circuit.description = Beschreibung:
properties.circuit.version = Version:
properties.localization = Spracheinstellungen
properties.localization.language = Sprache:
-properties.localization.info = Hinweis: Sie müssen den JDigitalSimulator neustarten damit die Sprachänderungen vollständig wirksam werden.
+properties.localization.info = Hinweis: Sie müssen den JDigitalSimulator neustarten damit die Sprachänderungen vollständig wirksam werden.
properties.lookandfeel = Erscheinungsbild
properties.lookandfeel.name = Bevorzugtes Aussehen:
+properties.symbols = Symbole
+properties.symbols.name = Bevorzugter Standard:
properties.okay = Okay
properties.cancel = Abbrechen
-properties.apply = Übernehmen
+properties.apply = Ãœbernehmen
properties.secure = Datei Sichern
persist.filter.description = Simulation (*.jdsim)
-persist.changes = Wollen sie die Änderungen an ''{0}'' speichern?
-persist.changes.title = Änderungen speichern?
-persist.overwrite = {0} ist bereits vorhanden.\nMöchten Sie sie ersetzen?
-persist.overwrite.title = Überschreiben bestätigen
-persist.error.save = Beim Sichern des Arbeitsblattes trat ein Fehler auf.\nDas Arbeitsblatt konnte nicht gespeichert werden.\n\nBitte überprüfen sie das Speichermedium und versuchen sie es erneut.
+persist.changes = Wollen sie die Änderungen an ''{0}'' speichern?
+persist.changes.title = Änderungen speichern?
+persist.overwrite = {0} ist bereits vorhanden.\nMöchten Sie sie ersetzen?
+persist.overwrite.title = Überschreiben bestätigen
+persist.error.save = Beim Sichern des Arbeitsblattes trat ein Fehler auf.\nDas Arbeitsblatt konnte nicht gespeichert werden.\n\nBitte überprüfen sie das Speichermedium und versuchen sie es erneut.
persist.error.save.title = Fehler beim speichern der Datei.
-persist.error.load = Beim Laden des Arbeitsblattes kam es zu einem Fehler.\nDas Arbeitsblatt konnte nicht geladen werden.\n\nBitte überprüfen sie ob die Datei fehlerfrei vorliegt und versuchen sie es erneut.
+persist.error.load = Beim Laden des Arbeitsblattes kam es zu einem Fehler.\nDas Arbeitsblatt konnte nicht geladen werden.\n\nBitte überprüfen sie ob die Datei fehlerfrei vorliegt und versuchen sie es erneut.
persist.error.load.title = Fehler beim laden der Datei.
-password.enter = Diese Arbeitsmappe scheint mit einem Passwort geschützt zu sein.\n\nBitte geben sie das Kennwort für dieses Arbeitsblatt ein:
-password.enter.old = Bitte geben sie das alte Kennwort für dieses Arbeitsblatt ein:
-password.enter.new = Bitte geben sie das neue Kennwort für dieses Arbeitsblatt ein:\n(Oder brechen sie ab um das Kennwort zu entfernen)
+password.enter = Diese Arbeitsmappe scheint mit einem Passwort geschützt zu sein.\n\nBitte geben sie das Kennwort für dieses Arbeitsblatt ein:
+password.enter.old = Bitte geben sie das alte Kennwort für dieses Arbeitsblatt ein:
+password.enter.new = Bitte geben sie das neue Kennwort für dieses Arbeitsblatt ein:\n(Oder brechen sie ab um das Kennwort zu entfernen)
password.enter.title = Bitte geben sie ein Kennwort ein.
password.wrong = Anscheinend haben sie das falsche Passwort angegeben. Bitte versuchen sie es erneut.
-password.wrong_file = Es war nicht möglich das Arbeitsblatt Fehlerfrei zu lesen.\nVielleicht haben sie das falsche Passwort eingegeben oder die Datei liegt in einem nicht kompatiblen Format vor.\n\nBitte versuchen sie es erneut (Hinweis: Bei der Passworteingabe auf Groß-/Kleinschreibung achten).
+password.wrong_file = Es war nicht möglich das Arbeitsblatt Fehlerfrei zu lesen.\nVielleicht haben sie das falsche Passwort eingegeben oder die Datei liegt in einem nicht kompatiblen Format vor.\n\nBitte versuchen sie es erneut (Hinweis: Bei der Passworteingabe auf Groß-/Kleinschreibung achten).
password.wrong.title = Falsches Passswort eingegeben.
-password.changed = Das Passwort wurde erfogreich geändert.
+password.changed = Das Passwort wurde erfogreich geändert.
password.removed = Das Passwort wurde erfogreich entfernt.
password.error.title = Fehler bei der Passworteingabe
-password.error.missing = Es war leider nicht möglich das Arbeitsblatt ohne Kennwort zu laden.\n\nBitte versuchen sie es unter angabe eines Passworts erneut.
+password.error.missing = Es war leider nicht möglich das Arbeitsblatt ohne Kennwort zu laden.\n\nBitte versuchen sie es unter angabe eines Passworts erneut.
password.error.security = Es kam zu einem Problem die Sicherheitseinstellungen zu initialisieren. Bitte versuchen sie es erneut.
clipboard.copy.error = Die Selektion konnte nicht in die Zwischenablage kopiert werden.
-clipboard.copy.error.title = Kopieren in die Zwischenablage nicht möglich.
+clipboard.copy.error.title = Kopieren in die Zwischenablage nicht möglich.
clipboard.cut.error = Die Selektion konnte nicht in die Zwischenablage verschoben werden.
clipboard.cut.error.title = Die Selektion konnte nicht in die Zwischenablage verschoben werden.
-clipboard.paste.error = Die Seketion in der Zwischenablage konnte nicht eingefügt werden.
-clipboard.paste.error.title = Einfügen von der Zwischenablage nicht möglich.
+clipboard.paste.error = Die Seketion in der Zwischenablage konnte nicht eingefügt werden.
+clipboard.paste.error.title = Einfügen von der Zwischenablage nicht möglich.
-about.title = Über - JDigitalSimulator
+about.title = Ãœber - JDigitalSimulator
about.donate = Spenden
about.close = Schliessen