package com.cburch.logisim.tools; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import javax.swing.JOptionPane; public class LibraryTools { public static void ShowErrors(String LibName,HashMap<String,String> Messages) { JOptionPane.showMessageDialog(null, Message(LibName,Messages), Strings.get("LibLoadErrors")+" "+LibName+" !", JOptionPane.ERROR_MESSAGE); } public static void ShowWarnings(String LibName,HashMap<String,String> Messages) { JOptionPane.showMessageDialog(null, Message(LibName,Messages), Strings.get("LibLoadWarnings")+" "+LibName+" !", JOptionPane.WARNING_MESSAGE); } private static String Message(String LibName,HashMap<String,String> Messages) { String Message = ""; int item = 0; for (String myerror : Messages.keySet()) { item++; Message = Message.concat( item+") "+Strings.get(Messages.get(myerror))+" \""+myerror+"\".\n"); } return Message; } public static void BuildToolList(Library lib, HashSet<String> Tools) { Iterator<? extends Tool> tooliter = lib.getTools().iterator(); while (tooliter.hasNext()) { Tool tool = tooliter.next(); Tools.add(tool.getName().toUpperCase()); } for (Library sublib : lib.getLibraries()) BuildToolList(sublib,Tools); } public static boolean LibraryIsConform(Library lib, HashSet<String> Names, HashSet<String> Tools, HashMap<String,String> Error) { Iterator<? extends Tool> tooliter=lib.getTools().iterator(); boolean HasErrors = false; while (tooliter.hasNext()) { Tool tool = tooliter.next(); if (Tools.contains(tool.getName().toUpperCase())) { HasErrors = true; if (!Error.containsKey(tool.getName())) { Error.put(tool.getName(), "LibraryHasDuplicatedTools"); } } Tools.add(tool.getName().toUpperCase()); } for (Library sublib : lib.getLibraries()) { if (Names.contains(sublib.getName().toUpperCase())) { HasErrors = true; if (!Error.containsKey(sublib.getName())) { Error.put(sublib.getName(), "LibraryHasDuplicatedSublibraries"); } } Names.add(sublib.getName().toUpperCase()); HasErrors |= !LibraryIsConform(sublib,Names,Tools,Error); } return !HasErrors; } public static void BuildLibraryList(Library lib, HashSet<String> Names) { Names.add(lib.getName().toUpperCase()); for (Library sublib : lib.getLibraries()) { BuildLibraryList(sublib,Names); } } public static void RemovePresentLibraries(Library lib, HashSet<String> KnownLibs, boolean AddToSet) { /* we work top -> down */ HashSet<String> ToBeRemoved = new HashSet<String>(); for (Library sublib : lib.getLibraries()) { if (KnownLibs.contains(sublib.getName().toUpperCase())) { ToBeRemoved.add(sublib.getName()); } else if (AddToSet) { KnownLibs.add(sublib.getName().toUpperCase()); } } for (String remove : ToBeRemoved) lib.removeLibrary(remove); for (Library sublib : lib.getLibraries()) RemovePresentLibraries(sublib,KnownLibs,AddToSet); } }