mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-28 15:32:40 -04:00
made the "file not unique" problem more transparent to the user.
This commit is contained in:
parent
418c96903d
commit
d337760b1f
@ -153,11 +153,7 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
node.add(TestCaseElement.TESTCASEDESCRIPTION);
|
node.add(TestCaseElement.TESTCASEDESCRIPTION);
|
||||||
root.add(node);
|
root.add(node);
|
||||||
|
|
||||||
try {
|
populateNodeMap();
|
||||||
populateNodeMap();
|
|
||||||
} catch (IOException e) {
|
|
||||||
// can not happen because there are no custom elements yet
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -176,11 +172,9 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
return customNode;
|
return customNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateNodeMap() throws IOException {
|
private void populateNodeMap() {
|
||||||
map.clear();
|
map.clear();
|
||||||
String dn = root.traverse(new PopulateModelVisitor(map)).getDoubleNode();
|
root.traverse(new PopulateMapVisitor(map));
|
||||||
if (dn != null)
|
|
||||||
throw new IOException(Lang.get("err_file_N0_ExistsTwiceBelow_N1", dn, rootLibraryPath));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -555,11 +549,10 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class PopulateModelVisitor implements Visitor {
|
private static final class PopulateMapVisitor implements Visitor {
|
||||||
private final HashMap<String, LibraryNode> map;
|
private final HashMap<String, LibraryNode> map;
|
||||||
private String doubleNode;
|
|
||||||
|
|
||||||
private PopulateModelVisitor(HashMap<String, LibraryNode> map) {
|
private PopulateMapVisitor(HashMap<String, LibraryNode> map) {
|
||||||
this.map = map;
|
this.map = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,15 +561,15 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
if (libraryNode.isLeaf()) {
|
if (libraryNode.isLeaf()) {
|
||||||
final String name = libraryNode.getName();
|
final String name = libraryNode.getName();
|
||||||
|
|
||||||
if (map.containsKey(name))
|
LibraryNode presentNode = map.get(name);
|
||||||
doubleNode = name;
|
if (presentNode==null) {
|
||||||
|
map.put(name, libraryNode);
|
||||||
map.put(name, libraryNode);
|
libraryNode.setUnique(true);
|
||||||
|
} else {
|
||||||
|
presentNode.setUnique(false);
|
||||||
|
libraryNode.setUnique(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getDoubleNode() {
|
|
||||||
return doubleNode;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import de.neemann.digital.core.element.ElementTypeDescription;
|
|||||||
import de.neemann.digital.draw.elements.VisualElement;
|
import de.neemann.digital.draw.elements.VisualElement;
|
||||||
import de.neemann.digital.draw.shapes.ShapeFactory;
|
import de.neemann.digital.draw.shapes.ShapeFactory;
|
||||||
import de.neemann.digital.lang.Lang;
|
import de.neemann.digital.lang.Lang;
|
||||||
|
import de.neemann.gui.IconCreator;
|
||||||
import de.neemann.gui.StringUtils;
|
import de.neemann.gui.StringUtils;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
@ -18,6 +19,7 @@ import java.util.Iterator;
|
|||||||
* Created by hneemann on 25.03.17.
|
* Created by hneemann on 25.03.17.
|
||||||
*/
|
*/
|
||||||
public class LibraryNode implements Iterable<LibraryNode> {
|
public class LibraryNode implements Iterable<LibraryNode> {
|
||||||
|
private static final Icon ICON_NOT_UNIQUE = IconCreator.create("testFailed.png");
|
||||||
|
|
||||||
private final ArrayList<LibraryNode> children;
|
private final ArrayList<LibraryNode> children;
|
||||||
private final String translatedName;
|
private final String translatedName;
|
||||||
@ -27,6 +29,7 @@ public class LibraryNode implements Iterable<LibraryNode> {
|
|||||||
private ImageIcon icon;
|
private ImageIcon icon;
|
||||||
private ElementLibrary library;
|
private ElementLibrary library;
|
||||||
private LibraryNode parent;
|
private LibraryNode parent;
|
||||||
|
private boolean unique;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new node with the given name.
|
* Creates a new node with the given name.
|
||||||
@ -121,6 +124,9 @@ public class LibraryNode implements Iterable<LibraryNode> {
|
|||||||
*/
|
*/
|
||||||
public ElementTypeDescription getDescription() throws IOException {
|
public ElementTypeDescription getDescription() throws IOException {
|
||||||
if (description == null) {
|
if (description == null) {
|
||||||
|
if (!unique)
|
||||||
|
throw new IOException(Lang.get("err_file_N0_ExistsTwiceBelow_N1", file, library.getRootFilePath()));
|
||||||
|
|
||||||
description = library.importElement(file);
|
description = library.importElement(file);
|
||||||
library.fireLibraryChanged(this);
|
library.fireLibraryChanged(this);
|
||||||
}
|
}
|
||||||
@ -210,7 +216,7 @@ public class LibraryNode implements Iterable<LibraryNode> {
|
|||||||
* @return the icon
|
* @return the icon
|
||||||
* @throws IOException IOException
|
* @throws IOException IOException
|
||||||
*/
|
*/
|
||||||
public ImageIcon getIcon(ShapeFactory shapeFactory) throws IOException {
|
public Icon getIcon(ShapeFactory shapeFactory) throws IOException {
|
||||||
getDescription();
|
getDescription();
|
||||||
return getIconOrNull(shapeFactory);
|
return getIconOrNull(shapeFactory);
|
||||||
}
|
}
|
||||||
@ -222,10 +228,13 @@ public class LibraryNode implements Iterable<LibraryNode> {
|
|||||||
* @param shapeFactory the shape factory to create the icon
|
* @param shapeFactory the shape factory to create the icon
|
||||||
* @return the icon or null
|
* @return the icon or null
|
||||||
*/
|
*/
|
||||||
public ImageIcon getIconOrNull(ShapeFactory shapeFactory) {
|
public Icon getIconOrNull(ShapeFactory shapeFactory) {
|
||||||
if (icon == null && description != null)
|
if (unique) {
|
||||||
icon = new VisualElement(description.getName()).setShapeFactory(shapeFactory).createIcon(75);
|
if (icon == null && description != null)
|
||||||
return icon;
|
icon = new VisualElement(description.getName()).setShapeFactory(shapeFactory).createIcon(75);
|
||||||
|
return icon;
|
||||||
|
} else
|
||||||
|
return ICON_NOT_UNIQUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -280,11 +289,30 @@ public class LibraryNode implements Iterable<LibraryNode> {
|
|||||||
*/
|
*/
|
||||||
public String getToolTipText() {
|
public String getToolTipText() {
|
||||||
if (isCustom()) {
|
if (isCustom()) {
|
||||||
if (description == null)
|
if (isUnique()) {
|
||||||
return null;
|
if (description == null)
|
||||||
else
|
return null;
|
||||||
return StringUtils.textToHTML(description.getDescription(new ElementAttributes()));
|
else
|
||||||
|
return StringUtils.textToHTML(description.getDescription(new ElementAttributes()));
|
||||||
|
} else
|
||||||
|
return Lang.get("msg_fileIsNotUnique");
|
||||||
} else
|
} else
|
||||||
return StringUtils.textToHTML(Lang.getNull("elem_" + getName() + "_tt"));
|
return StringUtils.textToHTML(Lang.getNull("elem_" + getName() + "_tt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the unique state of this node
|
||||||
|
*
|
||||||
|
* @param unique true if this node is unique
|
||||||
|
*/
|
||||||
|
void setUnique(boolean unique) {
|
||||||
|
this.unique = unique;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if element is unique
|
||||||
|
*/
|
||||||
|
public boolean isUnique() {
|
||||||
|
return unique;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ public final class InsertAction extends ToolTipAction {
|
|||||||
this.node = node;
|
this.node = node;
|
||||||
this.insertHistory = insertHistory;
|
this.insertHistory = insertHistory;
|
||||||
this.circuitComponent = circuitComponent;
|
this.circuitComponent = circuitComponent;
|
||||||
|
setActive(node.isUnique());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -76,7 +77,7 @@ public final class InsertAction extends ToolTipAction {
|
|||||||
public void update(LibraryNode node) {
|
public void update(LibraryNode node) {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
try {
|
try {
|
||||||
final ImageIcon icon = node.getIcon(shapeFactory);
|
final Icon icon = node.getIcon(shapeFactory);
|
||||||
setIcon(icon);
|
setIcon(icon);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorImportingModel")).addCause(ex));
|
SwingUtilities.invokeLater(new ErrorMessage(Lang.get("msg_errorImportingModel")).addCause(ex));
|
||||||
|
@ -43,7 +43,7 @@ public class SelectTree extends JTree {
|
|||||||
TreePath path = getSelectionPath();
|
TreePath path = getSelectionPath();
|
||||||
if (path != null && path.getPathCount() > 0) {
|
if (path != null && path.getPathCount() > 0) {
|
||||||
LibraryNode node = (LibraryNode) path.getLastPathComponent();
|
LibraryNode node = (LibraryNode) path.getLastPathComponent();
|
||||||
if (node.isLeaf()) {
|
if (node.isLeaf() && node.isUnique()) {
|
||||||
clearSelection();
|
clearSelection();
|
||||||
try {
|
try {
|
||||||
ElementTypeDescription d = node.getDescription();
|
ElementTypeDescription d = node.getDescription();
|
||||||
|
@ -737,6 +737,7 @@ Die Icons stammen aus dem Tango Desktop Project.</string>
|
|||||||
<string name="msg_startExternalFitter">Starten des externen Fitters</string>
|
<string name="msg_startExternalFitter">Starten des externen Fitters</string>
|
||||||
<string name="msg_actualCircuit">Aktuelle Schaltung</string>
|
<string name="msg_actualCircuit">Aktuelle Schaltung</string>
|
||||||
<string name="msg_fileNotAccessible">Dieser Dateiename ist nicht aus dem aktuellen Projekt importierbar!</string>
|
<string name="msg_fileNotAccessible">Dieser Dateiename ist nicht aus dem aktuellen Projekt importierbar!</string>
|
||||||
|
<string name="msg_fileIsNotUnique">Der Dateiname ist nicht eindeutig!</string>
|
||||||
|
|
||||||
<string name="ok">Ok</string>
|
<string name="ok">Ok</string>
|
||||||
<string name="rot_0">0°</string>
|
<string name="rot_0">0°</string>
|
||||||
|
@ -724,6 +724,7 @@ The icons are taken from the Tango Desktop Project.</string>
|
|||||||
<string name="msg_startExternalFitter">Execution of external fitter</string>
|
<string name="msg_startExternalFitter">Execution of external fitter</string>
|
||||||
<string name="msg_actualCircuit">Actual Circuit</string>
|
<string name="msg_actualCircuit">Actual Circuit</string>
|
||||||
<string name="msg_fileNotAccessible">The selected file name is not importable from the actual project!</string>
|
<string name="msg_fileNotAccessible">The selected file name is not importable from the actual project!</string>
|
||||||
|
<string name="msg_fileIsNotUnique">The file name is not unique!</string>
|
||||||
|
|
||||||
<string name="ok">Ok</string>
|
<string name="ok">Ok</string>
|
||||||
<string name="rot_0">0°</string>
|
<string name="rot_0">0°</string>
|
||||||
|
@ -14,11 +14,12 @@ import java.io.IOException;
|
|||||||
public class DiodeTest extends TestCase {
|
public class DiodeTest extends TestCase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Two antiparallel unidirectional diodes are able to hold each other either in low or in
|
* Two anti parallel unidirectional diodes are able to hold each other either in low or in
|
||||||
* high state, depending on which diode is processed first.
|
* high state, depending on which diode is processed first.
|
||||||
* The current simulation model which is build up on inputs which are modifing the outputs
|
* The current simulation model which is build up on inputs which are modifying the outputs
|
||||||
* is not suited to handle bidirectional passive diodes.
|
* is not suited to handle bidirectional passive diodes.
|
||||||
* For the same reason also bidirectional switches are impossible to implement.
|
* The solution implemented for switches - form a common net if switch is closed - is also
|
||||||
|
* not able to handle diodes.
|
||||||
*
|
*
|
||||||
* To make this possible the simulation core needs a significant improvement.
|
* To make this possible the simulation core needs a significant improvement.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user