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

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

Initial import : Genius 9.0.0

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