1 // Program.java 2 3 package net.sf.gogui.gui; 4 5 import java.util.ArrayList; 6 import java.util.prefs.Preferences; 7 import static net.sf.gogui.gui.I18n.i18n; 8 import net.sf.gogui.util.PrefUtil; 9 import net.sf.gogui.util.ObjectUtil; 10 import net.sf.gogui.util.StringUtil; 11 12 /** Command line and other information to run a GTP engine. */ 13 public final class Program 14 { 15 public String m_label; 16 17 public String m_name; 18 19 public String m_version; 20 21 public String m_command; 22 23 public String m_workingDirectory; 24 Program(Program program)25 public Program(Program program) 26 { 27 copyFrom(program); 28 } 29 Program(String label, String name, String version, String command, String workingDirectory)30 public Program(String label, String name, String version, String command, 31 String workingDirectory) 32 { 33 init(label, name, version, command, workingDirectory); 34 } 35 copyFrom(Program program)36 public void copyFrom(Program program) 37 { 38 init(program.m_label, program.m_name, program.m_version, 39 program.m_command, program.m_workingDirectory); 40 } 41 42 /** Find program info for a given command in a list of program infos. 43 @return The program info or null if no program with this comamnd 44 exists */ findProgram(ArrayList<Program> programs, String command)45 public static Program findProgram(ArrayList<Program> programs, 46 String command) 47 { 48 for (Program p : programs) 49 if (p.m_command.equals(command)) 50 return p; 51 return null; 52 } 53 load()54 public static ArrayList<Program> load() 55 { 56 ArrayList<Program> programs = new ArrayList<Program>(); 57 Preferences prefs = PrefUtil.getNode("net/sf/gogui/gui/program"); 58 if (prefs == null) 59 return programs; 60 int size = prefs.getInt("size", 0); 61 for (int i = 0; i < size; ++i) 62 { 63 prefs = PrefUtil.getNode("net/sf/gogui/gui/program/" + i); 64 if (prefs == null) 65 break; 66 String label = prefs.get("label", null); 67 if (label == null) 68 break; 69 String name = prefs.get("name", ""); 70 String version = prefs.get("version", ""); 71 String command = prefs.get("command", ""); 72 String workingDirectory = prefs.get("working-directory", ""); 73 programs.add(new Program(label, name, version, command, 74 workingDirectory)); 75 } 76 return programs; 77 } 78 save(ArrayList<Program> programs)79 public static void save(ArrayList<Program> programs) 80 { 81 Preferences prefs = PrefUtil.createNode("net/sf/gogui/gui/program"); 82 if (prefs == null) 83 return; 84 prefs.putInt("size", programs.size()); 85 for (int i = 0; i < programs.size(); ++i) 86 { 87 prefs = PrefUtil.createNode("net/sf/gogui/gui/program/" + i); 88 if (prefs == null) 89 break; 90 Program p = programs.get(i); 91 prefs.put("label", p.m_label); 92 prefs.put("name", p.m_name); 93 prefs.put("version", p.m_version); 94 prefs.put("command", p.m_command); 95 prefs.put("working-directory", p.m_workingDirectory); 96 } 97 } 98 99 /** Suggest and set a label derived from program name without 100 collision with an existing array of programs. */ setUniqueLabel(ArrayList<Program> programs)101 public void setUniqueLabel(ArrayList<Program> programs) 102 { 103 String label = m_name; 104 if (StringUtil.isEmpty(label)) 105 label = i18n("LB_UNKNOWN_PROGRAM"); 106 String tryLabel = label; 107 boolean alreadyExists = false; 108 for (int i = 0; i < programs.size(); ++i) 109 if (tryLabel.equals((programs.get(i)).m_label)) 110 { 111 alreadyExists = true; 112 break; 113 } 114 if (! alreadyExists) 115 { 116 m_label = tryLabel; 117 return; 118 } 119 for (int i = 2; ; ++i) 120 { 121 tryLabel = label + " (" + i + ")"; 122 alreadyExists = false; 123 for (int j = 0; j < programs.size(); ++j) 124 if (tryLabel.equals((programs.get(j)).m_label)) 125 { 126 alreadyExists = true; 127 break; 128 } 129 if (! alreadyExists) 130 { 131 m_label = tryLabel; 132 return; 133 } 134 } 135 } 136 137 /** Update program information if changed. 138 Useful, if a program was replaced, and reports a different name or 139 version than at the last invocation. 140 @param name Program name at current invovation (may be null) 141 @param version Program name at current invovation (may be null) 142 @return true, if name or version program was updated */ updateInfo(String name, String version)143 public boolean updateInfo(String name, String version) 144 { 145 if (name == null) 146 name = ""; 147 if (version == null) 148 version = ""; 149 boolean changed = false; 150 if (! ObjectUtil.equals(m_name, name)) 151 { 152 m_name = name; 153 changed = true; 154 } 155 if (! ObjectUtil.equals(m_version, version)) 156 { 157 m_version = version; 158 changed = true; 159 } 160 return changed; 161 } 162 init(String label, String name, String version, String command, String workingDirectory)163 private void init(String label, String name, String version, 164 String command, String workingDirectory) 165 { 166 m_label = label.trim(); 167 m_name = name.trim(); 168 m_version = version.trim(); 169 m_command = command.trim(); 170 m_workingDirectory = workingDirectory.trim(); 171 } 172 } 173