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

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

#5 refactoring NegoGuiView and DomainRepositoryUI

File size: 8.1 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.Repository;
24import genius.core.repository.RepositoryFactory;
25import genius.core.utility.AdditiveUtilitySpace;
26import genius.core.xml.SimpleElement;
27import genius.gui.NegoGUIApp;
28import genius.gui.NegoGUIView;
29
30/**
31 * A user interface to the domain repository
32 *
33 */
34public class DomainRepositoryUI extends JTree {
35 private Repository<DomainRepItem> domainrepository;
36 private MyTreeNode root = new MyTreeNode(null);
37 private DefaultTreeModel scenarioTreeModel;
38 private NegoGUIView negoView;
39
40 public DomainRepositoryUI(NegoGUIView negoView) {
41 domainrepository = RepositoryFactory.get_domain_repos();
42 initTree();
43 setModel(scenarioTreeModel);
44 this.negoView = negoView;
45
46 setMinimumSize(new java.awt.Dimension(100, 100));
47 setName("treeDomains");
48 }
49
50 private void initTree() {
51 // for all domains in the domain repository
52 for (DomainRepItem repitem : domainrepository.getItems()) {
53 DomainRepItem dri = repitem;
54 MyTreeNode domainNode = new MyTreeNode(dri);
55 // add all preference profiles of the domain as nodes
56 for (ProfileRepItem profileitem : dri.getProfiles()) {
57 domainNode.add(new MyTreeNode(profileitem));
58 }
59 root.add(domainNode);
60 }
61
62 scenarioTreeModel = new DefaultTreeModel(root);
63 setModel(scenarioTreeModel);
64 Font currentFont = getFont();
65 Font bigFont = new Font(currentFont.getName(), currentFont.getStyle(),
66 currentFont.getSize() + 2);
67 setRowHeight(23);
68 setFont(bigFont);
69 setRootVisible(false);
70 setShowsRootHandles(true);
71 getSelectionModel()
72 .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
73 addMouseListener(new MouseAdapter() {
74
75 // for Windows
76 @Override
77 public void mouseReleased(MouseEvent e) {
78 mouseCode(e);
79 }
80
81 // for Linux
82 @Override
83 public void mousePressed(MouseEvent e) {
84 mouseCode(e);
85 }
86
87 private void mouseCode(MouseEvent e) {
88 if (e.getButton() == MouseEvent.BUTTON3) {
89 TreePath selPath = getPathForLocation(e.getX(), e.getY());
90 if (selPath == null) {
91 JPopupMenu popup = createPopupMenu(null);
92 popup.show(e.getComponent(), e.getX(), e.getY());
93 return;
94 }
95
96 MyTreeNode node = (MyTreeNode) selPath
97 .getLastPathComponent();
98 setSelectionPath(selPath);
99 if (e.isPopupTrigger()
100 && e.getComponent() instanceof JTree) {
101 JPopupMenu popup = createPopupMenu(node);
102 popup.show(e.getComponent(), e.getX(), e.getY());
103 }
104 }
105 }
106 });
107 }
108
109 private JPopupMenu createPopupMenu(final MyTreeNode node) {
110 JPopupMenu popup = new JPopupMenu();
111
112 JMenuItem newDomain = new JMenuItem("New domain");
113 newDomain.addActionListener(new java.awt.event.ActionListener() {
114 @Override
115 public void actionPerformed(java.awt.event.ActionEvent evt) {
116 addDomain();
117 }
118 });
119
120 popup.add(newDomain);
121
122 if (node != null) {
123 if (node.getRepositoryItem() instanceof ProfileRepItem) {
124 JMenuItem deletePP = new JMenuItem("Delete preference profile");
125 deletePP.addActionListener(new java.awt.event.ActionListener() {
126 @Override
127 public void actionPerformed(
128 java.awt.event.ActionEvent evt) {
129 deleteProfile(node);
130 }
131 });
132 popup.add(deletePP);
133 } else {
134 JMenuItem newPP = new JMenuItem("New preference profile");
135 newPP.addActionListener(new java.awt.event.ActionListener() {
136 @Override
137 public void actionPerformed(
138 java.awt.event.ActionEvent evt) {
139 if (domainHasIssues(node)) {
140 newPreferenceProfile(node);
141 } else {
142 JOptionPane.showMessageDialog(null,
143 "Before creating a preference profile, the domain must be saved with at least one isue.",
144 "Domain error", 0);
145 }
146 }
147 });
148 popup.add(newPP);
149 JMenuItem deleteDomain = new JMenuItem("Delete domain");
150 deleteDomain
151 .addActionListener(new java.awt.event.ActionListener() {
152 @Override
153 public void actionPerformed(
154 java.awt.event.ActionEvent evt) {
155 deleteDomain(node);
156 }
157 });
158 popup.add(deleteDomain);
159 }
160 }
161 return popup;
162 }
163
164 protected boolean domainHasIssues(MyTreeNode node) {
165 // get the directory of the domain
166 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
167 String fullPath = dri.getURL().toString().substring(5);
168 Domain domain = null;
169 try {
170 domain = new DomainImpl(fullPath);
171 } catch (Exception e) {
172 e.printStackTrace();
173 }
174 return domain != null && domain.getIssues().size() > 0;
175 }
176
177 private void newPreferenceProfile(MyTreeNode node) {
178
179 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
180 String domainName = dri.getURL().toString().replace("file:", "");
181 String cleanName = domainName.replace(".xml", "").replace("_domain",
182 "");
183 String path = "";
184
185 int i = 1;
186 boolean found = false;
187 while (!found && i < 100) {
188 path = cleanName + "_util" + i + ".xml";
189 File file = new File(path);
190 if (!file.exists()) {
191 found = true;
192 }
193 i++;
194 }
195 String url = "file:" + path;
196 ProfileRepItem newPref = null;
197
198 try {
199 newPref = new ProfileRepItem(new URL(url), dri);
200 dri.getProfiles().add(newPref);
201 MyTreeNode newNode = new MyTreeNode(newPref);
202 scenarioTreeModel.insertNodeInto(newNode, node,
203 node.getChildCount());
204 domainrepository.save();
205
206 Domain domain = null;
207 try {
208 domain = new DomainImpl(domainName);
209 } catch (Exception e1) {
210 e1.printStackTrace();
211 }
212 AdditiveUtilitySpace space = null;
213 try {
214 space = new AdditiveUtilitySpace(domain, "");
215 } catch (Exception e) {
216 e.printStackTrace();
217 }
218 try {
219 space.toXML().saveToFile(path);
220 } catch (IOException e) {
221 e.printStackTrace();
222 }
223 negoView.showRepositoryItemInTab(newPref, newNode);
224 } catch (MalformedURLException e) {
225 e.printStackTrace();
226 }
227 }
228
229 private void addDomain() {
230
231 String result = new CreateNewDomain(NegoGUIApp.negoGUIView.getFrame())
232 .getResult();
233 if (result != null) {
234 String dirName = "etc" + File.separator + "templates"
235 + File.separator + result;
236
237 File dir = new File(dirName);
238 if (!dir.exists()) {
239 dir.mkdir();
240 }
241
242 String path = dirName + File.separator + result + ".xml";
243 DomainRepItem dri = null;
244 try {
245 dri = new DomainRepItem(new URL("file:" + path));
246 } catch (MalformedURLException e) {
247 e.printStackTrace();
248 }
249 domainrepository.getItems().add(dri);
250 domainrepository.save();
251 MyTreeNode newNode = new MyTreeNode(dri);
252 scenarioTreeModel.insertNodeInto(newNode, root,
253 root.getChildCount());
254 saveDomainAsFile(path, result);
255 negoView.showRepositoryItemInTab(dri, newNode);
256 updateUI();
257 }
258 }
259
260 private void saveDomainAsFile(String relativePath, String domainName) {
261 SimpleElement template = new SimpleElement("negotiation_template");
262 SimpleElement utilSpace = new SimpleElement("utility_space");
263 SimpleElement objective = new SimpleElement("objective");
264 objective.setAttribute("index", "0");
265 objective.setAttribute("description", "");
266 objective.setAttribute("name", domainName);
267 objective.setAttribute("type", "objective");
268 objective.setAttribute("etype", "objective");
269 utilSpace.addChildElement(objective);
270 template.addChildElement(utilSpace);
271 template.saveToFile(relativePath);
272 }
273
274 private void deleteDomain(MyTreeNode node) {
275 DomainRepItem dri = (DomainRepItem) node.getRepositoryItem();
276 scenarioTreeModel.removeNodeFromParent(node);
277 domainrepository.getItems().remove(dri);
278 domainrepository.save();
279 }
280
281 private void deleteProfile(MyTreeNode node) {
282 ProfileRepItem pri = (ProfileRepItem) node.getRepositoryItem();
283 scenarioTreeModel.removeNodeFromParent(node);
284 domainrepository.removeProfileRepItem(pri);
285 domainrepository.save();
286 }
287}
Note: See TracBrowser for help on using the repository browser.