source: src/main/java/genius/gui/domainrepository/DomainRepositoryUI.java@ 10

Last change on this file since 10 was 10, checked in by Wouter Pasman, 7 years ago

#5 refactoring NegoGuiView. Made interface to NegoGuiView to get clear about the core public functions of this panel.

File size: 10.6 KB
Line 
1package genius.gui.domainrepository;
2
3import java.awt.Font;
4import java.awt.event.MouseAdapter;
5import java.awt.event.MouseEvent;
6import java.io.File;
7import java.io.IOException;
8import java.net.MalformedURLException;
9import java.net.URL;
10
11import javax.swing.JMenuItem;
12import javax.swing.JOptionPane;
13import javax.swing.JPopupMenu;
14import javax.swing.JTree;
15import javax.swing.tree.DefaultTreeModel;
16import javax.swing.tree.TreePath;
17import javax.swing.tree.TreeSelectionModel;
18
19import genius.core.Domain;
20import genius.core.DomainImpl;
21import genius.core.repository.DomainRepItem;
22import genius.core.repository.ProfileRepItem;
23import genius.core.repository.RepItem;
24import genius.core.repository.Repository;
25import genius.core.repository.RepositoryFactory;
26import genius.core.utility.AdditiveUtilitySpace;
27import genius.core.xml.SimpleElement;
28import genius.gui.MainPanelInterface;
29import genius.gui.NegoGUIApp;
30import genius.gui.tree.TreeFrame;
31
32/**
33 * A user interface to the domain repository
34 *
35 */
36@SuppressWarnings("serial")
37public class DomainRepositoryUI extends JTree {
38 private Repository<DomainRepItem> domainrepository;
39 private MyTreeNode root = new MyTreeNode(null);
40 private DefaultTreeModel scenarioTreeModel;
41 private MainPanelInterface negoView;
42
43 public DomainRepositoryUI(MainPanelInterface negoView) {
44 domainrepository = RepositoryFactory.get_domain_repos();
45 initTree();
46 setModel(scenarioTreeModel);
47 this.negoView = negoView;
48
49 setMinimumSize(new java.awt.Dimension(100, 100));
50 setName("treeDomains");
51
52 addMouseListener(new java.awt.event.MouseAdapter() {
53 @Override
54 public void mouseClicked(java.awt.event.MouseEvent evt) {
55 treeDomainsMouseClicked(evt);
56 }
57 });
58
59 }
60
61 private void initTree() {
62 // for all domains in the domain repository
63 for (DomainRepItem repitem : domainrepository.getItems()) {
64 DomainRepItem dri = repitem;
65 MyTreeNode domainNode = new MyTreeNode(dri);
66 // add all preference profiles of the domain as nodes
67 for (ProfileRepItem profileitem : dri.getProfiles()) {
68 domainNode.add(new MyTreeNode(profileitem));
69 }
70 root.add(domainNode);
71 }
72
73 scenarioTreeModel = new DefaultTreeModel(root);
74 setModel(scenarioTreeModel);
75 Font currentFont = getFont();
76 Font bigFont = new Font(currentFont.getName(), currentFont.getStyle(),
77 currentFont.getSize() + 2);
78 setRowHeight(23);
79 setFont(bigFont);
80 setRootVisible(false);
81 setShowsRootHandles(true);
82 getSelectionModel()
83 .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
84 addMouseListener(new MouseAdapter() {
85
86 // for Windows
87 @Override
88 public void mouseReleased(MouseEvent e) {
89 mouseCode(e);
90 }
91
92 // for Linux
93 @Override
94 public void mousePressed(MouseEvent e) {
95 mouseCode(e);
96 }
97
98 private void mouseCode(MouseEvent e) {
99 if (e.getButton() == MouseEvent.BUTTON3) {
100 TreePath selPath = getPathForLocation(e.getX(), e.getY());
101 if (selPath == null) {
102 JPopupMenu popup = createPopupMenu(null);
103 popup.show(e.getComponent(), e.getX(), e.getY());
104 return;
105 }
106
107 MyTreeNode node = (MyTreeNode) selPath
108 .getLastPathComponent();
109 setSelectionPath(selPath);
110 if (e.isPopupTrigger()
111 && e.getComponent() instanceof JTree) {
112 JPopupMenu popup = createPopupMenu(node);
113 popup.show(e.getComponent(), e.getX(), e.getY());
114 }
115 }
116 }
117 });
118 }
119
120 private JPopupMenu createPopupMenu(final MyTreeNode node) {
121 JPopupMenu popup = new JPopupMenu();
122
123 JMenuItem newDomain = new JMenuItem("New domain");
124 newDomain.addActionListener(new java.awt.event.ActionListener() {
125 @Override
126 public void actionPerformed(java.awt.event.ActionEvent evt) {
127 addDomain();
128 }
129 });
130
131 popup.add(newDomain);
132
133 if (node != null) {
134 if (node.getRepositoryItem() instanceof ProfileRepItem) {
135 JMenuItem deletePP = new JMenuItem("Delete preference profile");
136 deletePP.addActionListener(new java.awt.event.ActionListener() {
137 @Override
138 public void actionPerformed(
139 java.awt.event.ActionEvent evt) {
140 deleteProfile(node);
141 }
142 });
143 popup.add(deletePP);
144 } else {
145 JMenuItem newPP = new JMenuItem("New preference profile");
146 newPP.addActionListener(new java.awt.event.ActionListener() {
147 @Override
148 public void actionPerformed(
149 java.awt.event.ActionEvent evt) {
150 if (domainHasIssues(node)) {
151 newPreferenceProfile(node);
152 } else {
153 JOptionPane.showMessageDialog(null,
154 "Before creating a preference profile, the domain must be saved with at least one isue.",
155 "Domain error", 0);
156 }
157 }
158 });
159 popup.add(newPP);
160 JMenuItem deleteDomain = new JMenuItem("Delete domain");
161 deleteDomain
162 .addActionListener(new java.awt.event.ActionListener() {
163 @Override
164 public void actionPerformed(
165 java.awt.event.ActionEvent evt) {
166 deleteDomain(node);
167 }
168 });
169 popup.add(deleteDomain);
170 }
171 }
172 return popup;
173 }
174
175 protected boolean domainHasIssues(MyTreeNode node) {
176 // get the directory of the domain
177 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
178 String fullPath = dri.getURL().toString().substring(5);
179 Domain domain = null;
180 try {
181 domain = new DomainImpl(fullPath);
182 } catch (Exception e) {
183 e.printStackTrace();
184 }
185 return domain != null && domain.getIssues().size() > 0;
186 }
187
188 private void newPreferenceProfile(MyTreeNode node) {
189
190 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
191 String domainName = dri.getURL().toString().replace("file:", "");
192 String cleanName = domainName.replace(".xml", "").replace("_domain",
193 "");
194 String path = "";
195
196 int i = 1;
197 boolean found = false;
198 while (!found && i < 100) {
199 path = cleanName + "_util" + i + ".xml";
200 File file = new File(path);
201 if (!file.exists()) {
202 found = true;
203 }
204 i++;
205 }
206 String url = "file:" + path;
207 ProfileRepItem newPref = null;
208
209 try {
210 newPref = new ProfileRepItem(new URL(url), dri);
211 dri.getProfiles().add(newPref);
212 MyTreeNode newNode = new MyTreeNode(newPref);
213 scenarioTreeModel.insertNodeInto(newNode, node,
214 node.getChildCount());
215 domainrepository.save();
216
217 Domain domain = null;
218 try {
219 domain = new DomainImpl(domainName);
220 } catch (Exception e1) {
221 e1.printStackTrace();
222 }
223 AdditiveUtilitySpace space = null;
224 try {
225 space = new AdditiveUtilitySpace(domain, "");
226 } catch (Exception e) {
227 e.printStackTrace();
228 }
229 try {
230 space.toXML().saveToFile(path);
231 } catch (IOException e) {
232 e.printStackTrace();
233 }
234 showRepositoryItemInTab(newPref, newNode);
235 } catch (MalformedURLException e) {
236 e.printStackTrace();
237 }
238 }
239
240 private void addDomain() {
241
242 String result = new CreateNewDomain(NegoGUIApp.negoGUIView.getFrame())
243 .getResult();
244 if (result != null) {
245 String dirName = "etc" + File.separator + "templates"
246 + File.separator + result;
247
248 File dir = new File(dirName);
249 if (!dir.exists()) {
250 dir.mkdir();
251 }
252
253 String path = dirName + File.separator + result + ".xml";
254 DomainRepItem dri = null;
255 try {
256 dri = new DomainRepItem(new URL("file:" + path));
257 } catch (MalformedURLException e) {
258 e.printStackTrace();
259 }
260 domainrepository.getItems().add(dri);
261 domainrepository.save();
262 MyTreeNode newNode = new MyTreeNode(dri);
263 scenarioTreeModel.insertNodeInto(newNode, root,
264 root.getChildCount());
265 saveDomainAsFile(path, result);
266 showRepositoryItemInTab(dri, newNode);
267 updateUI();
268 }
269 }
270
271 private void saveDomainAsFile(String relativePath, String domainName) {
272 SimpleElement template = new SimpleElement("negotiation_template");
273 SimpleElement utilSpace = new SimpleElement("utility_space");
274 SimpleElement objective = new SimpleElement("objective");
275 objective.setAttribute("index", "0");
276 objective.setAttribute("description", "");
277 objective.setAttribute("name", domainName);
278 objective.setAttribute("type", "objective");
279 objective.setAttribute("etype", "objective");
280 utilSpace.addChildElement(objective);
281 template.addChildElement(utilSpace);
282 template.saveToFile(relativePath);
283 }
284
285 private void deleteDomain(MyTreeNode node) {
286 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
287 scenarioTreeModel.removeNodeFromParent(node);
288 domainrepository.getItems().remove(dri);
289 domainrepository.save();
290 }
291
292 private void deleteProfile(MyTreeNode node) {
293 ProfileRepItem pri = (ProfileRepItem) node.getRepositoryItem();
294 scenarioTreeModel.removeNodeFromParent(node);
295 domainrepository.removeProfileRepItem(pri);
296 domainrepository.save();
297 }
298
299 private void treeDomainsMouseClicked(java.awt.event.MouseEvent evt) {
300 int selRow = getRowForLocation(evt.getX(), evt.getY());
301 TreePath selPath = getPathForLocation(evt.getX(), evt.getY());
302 if (selRow != -1) {
303 if (evt.getClickCount() == 2) {
304 if (selPath != null) {
305 MyTreeNode node = (MyTreeNode) (selPath
306 .getLastPathComponent());
307 RepItem repItem = node.getRepositoryItem();
308 showRepositoryItemInTab(repItem, node);
309 }
310 }
311 }
312 }
313
314 public void showRepositoryItemInTab(RepItem repItem, MyTreeNode node) {
315 TreeFrame tf;
316 if (repItem instanceof DomainRepItem) {
317 try {
318 boolean hasNoProfiles = ((DomainRepItem) repItem).getProfiles()
319 .size() == 0;
320 String filename = ((DomainRepItem) repItem).getURL().getFile();
321 DomainImpl domain = new DomainImpl(filename);
322 tf = new TreeFrame(domain, hasNoProfiles);
323 negoView.addTab(StripExtension(GetPlainFileName(filename)), tf);
324 } catch (Exception e) {
325 e.printStackTrace();
326 }
327 } else if (repItem instanceof ProfileRepItem) {
328 try {
329 MyTreeNode parentNode = (MyTreeNode) (node.getParent());
330 String filename = ((ProfileRepItem) repItem).getURL().getFile();
331
332 DomainImpl domain = new DomainImpl(
333 ((DomainRepItem) (parentNode.getRepositoryItem()))
334 .getURL().getFile());
335
336 // we can handle only AdditiveUtilitySpace in TreeFrame anyway
337 // so we guess it's that...
338 AdditiveUtilitySpace utilitySpace = new AdditiveUtilitySpace(
339 domain, filename);
340
341 tf = new TreeFrame(domain, utilitySpace);
342 negoView.addTab(StripExtension(GetPlainFileName(filename)), tf);
343 } catch (Exception e) {
344 e.printStackTrace();
345 }
346 }
347 }
348
349 /**
350 * @param filename
351 * @return part of filename following the last slash, or full filename if
352 * there is no slash.
353 */
354 public String GetPlainFileName(String filename) {
355 int i = filename.lastIndexOf('/');
356 if (i == -1)
357 return filename;
358 return filename.substring(i + 1);
359 }
360
361 /**
362 * @param filename
363 * @return filename stripped of its extension (the part after the last dot).
364 */
365 public String StripExtension(String filename) {
366 int i = filename.lastIndexOf('.');
367 if (i == -1)
368 return filename;
369 return filename.substring(0, i);
370 }
371
372}
Note: See TracBrowser for help on using the repository browser.