source: src/main/java/genius/gui/tree/TreeFrame.java@ 27

Last change on this file since 27 was 27, checked in by Tim Baarslag, 7 years ago

Save button resize

File size: 9.8 KB
Line 
1package genius.gui.tree;
2
3import java.util.Enumeration;
4
5import java.awt.BorderLayout;
6import java.awt.Color;
7import java.awt.Dimension;
8import java.awt.event.MouseAdapter;
9import java.awt.event.MouseEvent;
10import java.io.IOException;
11
12import javax.swing.Icon;
13import javax.swing.ImageIcon;
14import javax.swing.JButton;
15import javax.swing.JLabel;
16import javax.swing.JMenu;
17import javax.swing.JMenuBar;
18import javax.swing.JOptionPane;
19import javax.swing.JPanel;
20import javax.swing.JScrollPane;
21import javax.swing.JTextField;
22import javax.swing.ListSelectionModel;
23import javax.swing.table.DefaultTableCellRenderer;
24import javax.swing.table.TableColumnModel;
25
26import genius.core.DomainImpl;
27import genius.core.issue.Issue;
28import genius.core.issue.Objective;
29import genius.core.jtreetable.JTreeTable;
30import genius.core.repository.DomainRepItem;
31import genius.core.utility.AdditiveUtilitySpace;
32import genius.gui.dialogs.EditIssueDialog;
33import genius.gui.dialogs.NewIssueDialog;
34
35/**
36 * Frame from a domain.
37 *
38 * @author Wouter Pasman, Mark Hendrikx
39 */
40public class TreeFrame extends JPanel {
41
42 private static final long serialVersionUID = 9072786889017106286L;
43 // Attributes
44 private static final Color UNSELECTED = Color.WHITE;
45 private static final Color HIGHLIGHT = Color.YELLOW;
46 private JTreeTable treeTable;
47 private NegotiatorTreeTableModel model;
48 private JMenuBar menuBar;
49 private JMenu fileMenu;
50 private JMenu editMenu;
51 private DomainRepItem fDomainRepItem;
52 // as we can't use this in a listener
53 private TreeFrame thisFrame;
54 private boolean hasNoProfiles;
55 private JTextField discount;
56 private JTextField reservationValue;
57
58 // Constructors
59 public TreeFrame(DomainImpl domain, boolean hasNoProfiles) {
60 this(new NegotiatorTreeTableModel(domain), hasNoProfiles);
61 }
62
63 public TreeFrame(DomainImpl domain, AdditiveUtilitySpace utilitySpace) {
64 this(new NegotiatorTreeTableModel(domain, utilitySpace), false);
65 }
66
67 public TreeFrame(NegotiatorTreeTableModel treeModel, boolean hasNoProfiles) {
68 super();
69 this.hasNoProfiles = hasNoProfiles;
70 init(treeModel, null);
71 }
72
73 public void clearTreeTable(DomainImpl domain,
74 AdditiveUtilitySpace utilitySpace) {
75 init(new NegotiatorTreeTableModel(domain, utilitySpace), this.getSize());
76 }
77
78 public boolean isDomain() {
79 return model.getUtilitySpace() == null;
80 }
81
82 private void init(NegotiatorTreeTableModel treeModel, Dimension size) {
83 thisFrame = this;
84 model = treeModel;
85 setLayout(new BorderLayout());
86 // Initialize the table
87 initTable(model);
88 treeTable.addMouseListener(new MouseAdapter() {
89 @Override
90 public void mouseReleased(MouseEvent e) {
91
92 if (e.getClickCount() == 2) {
93 Object selected = treeTable.getTree()
94 .getLastSelectedPathComponent();
95
96 if (selected instanceof Issue) {
97 if (hasNoProfiles || !isDomain()) {
98 new EditIssueDialog(thisFrame, (Issue) selected);
99 } else {
100 JOptionPane
101 .showMessageDialog(
102 null,
103 "You may only edit the issues when there are no preference profiles.",
104 "Edit error", 0);
105 }
106 }
107 }
108 }
109 });
110 treeTable.setRowHeight(40);
111 // Initialize the Menu
112 initMenus();
113 JPanel simplePanel = new JPanel();
114
115 JButton saveButton = new JButton("Save changes");
116 Icon icon = new ImageIcon(getClass().getClassLoader().getResource(
117 "genius/gui/resources/save.png"));
118 saveButton.setPreferredSize(new Dimension(180, 60));
119 saveButton.setIcon(icon);
120 saveButton.setFont(saveButton.getFont().deriveFont(14.0f));
121 saveButton.addActionListener(new java.awt.event.ActionListener() {
122 public void actionPerformed(java.awt.event.ActionEvent evt) {
123 if (model.getUtilitySpace() != null) {
124 double newDiscount = 1.0;
125 try {
126 newDiscount = Double.parseDouble(discount.getText());
127 if (newDiscount < 0 || newDiscount > 1) {
128 JOptionPane.showMessageDialog(null,
129 "The discount value is not valid.");
130 return;
131 }
132 } catch (Exception e) {
133 JOptionPane.showMessageDialog(null,
134 "The discount value is not valid.");
135 return;
136 }
137 double newRV = 1.0;
138 try {
139 newRV = Double.parseDouble(reservationValue.getText());
140 if (newRV < 0 || newRV > 1) {
141 JOptionPane.showMessageDialog(null,
142 "The reservation value is not valid.");
143 return;
144 }
145 } catch (Exception e) {
146 JOptionPane.showMessageDialog(null,
147 "The reservation value is not valid.");
148 return;
149 }
150 model.getUtilitySpace().setDiscount(newDiscount);
151 model.getUtilitySpace().setReservationValue(newRV);
152 try {
153 model.getUtilitySpace()
154 .toXML()
155 .saveToFile(
156 model.getUtilitySpace().getFileName());
157 } catch (IOException e) {
158 e.printStackTrace();
159 }
160 } else { // this is a domain
161 model.getDomain().toXML()
162 .saveToFile(model.getDomain().getName());
163 }
164 }
165 });
166
167 if (hasNoProfiles) {
168
169 JButton addIssue = new JButton("Add issue");
170 Icon icon2 = new ImageIcon(getClass().getClassLoader().getResource(
171 "genius/gui/resources/edit_add-32.png"));
172 addIssue.setPreferredSize(new Dimension(180, 60));
173 addIssue.setIcon(icon2);
174 addIssue.setFont(addIssue.getFont().deriveFont(18.0f));
175 addIssue.addActionListener(new java.awt.event.ActionListener() {
176 public void actionPerformed(java.awt.event.ActionEvent evt) {
177 new NewIssueDialog(thisFrame);
178 }
179 });
180 simplePanel.add(addIssue);
181
182 JButton removeIssue = new JButton("Remove issue");
183 Icon icon3 = new ImageIcon(getClass().getClassLoader().getResource(
184 "genius/gui/resources/edit_remove-32.png"));
185 removeIssue.setPreferredSize(new Dimension(180, 60));
186 removeIssue.setIcon(icon3);
187 removeIssue.setFont(removeIssue.getFont().deriveFont(18.0f));
188 removeIssue.addActionListener(new java.awt.event.ActionListener() {
189 public void actionPerformed(java.awt.event.ActionEvent evt) {
190 Object selected = treeTable.getTree()
191 .getLastSelectedPathComponent();
192
193 if (selected instanceof Issue) {
194 ((Issue) selected).removeFromParent();
195 // correct numbering
196 for (int i = 0; i < model.getDomain().getIssues()
197 .size(); i++) {
198 model.getDomain().getIssues().get(i)
199 .setNumber(i + 1); // + 1 for root
200 }
201 treeTable.updateUI();
202 }
203 }
204 });
205 simplePanel.add(removeIssue);
206 }
207 simplePanel.add(saveButton);
208
209 if (model.getUtilitySpace() != null) {
210 simplePanel.add(new JLabel("Discount: "));
211 discount = new JTextField(model.getUtilitySpace()
212 .getDiscountFactor() + "", 5);
213 simplePanel.add(discount);
214
215 simplePanel.add(new JLabel("Reservation value: "));
216 reservationValue = new JTextField(model.getUtilitySpace()
217 .getReservationValueUndiscounted() + "", 5);
218 simplePanel.add(reservationValue);
219 }
220
221 add(simplePanel, BorderLayout.SOUTH);
222
223 if (size != null)
224 this.setSize(size);
225
226 }
227
228 public boolean hasNoProfiles() {
229 return hasNoProfiles;
230 }
231
232 private void initTable(NegotiatorTreeTableModel model) {
233 treeTable = new JTreeTable(model);
234 treeTable.setPreferredSize(new Dimension(1024, 800));
235 treeTable.setPreferredScrollableViewportSize(new Dimension(1024, 300));
236 treeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
237 treeTable.setRowSelectionAllowed(true);
238 treeTable.setColumnSelectionAllowed(false);
239 treeTable.setCellSelectionEnabled(true);
240
241 TableColumnModel colModel = treeTable.getColumnModel();
242 if (treeTable.getColumnCount() > 3)
243 colModel.getColumn(3).setMinWidth(220); // Wouter: make it likely
244 // that Weight column is
245 // shown completely.
246
247 DefaultTableCellRenderer labelRenderer = new JLabelCellRenderer();
248 treeTable.setDefaultRenderer(JLabel.class, labelRenderer);
249 treeTable.setDefaultRenderer(JTextField.class, labelRenderer);
250
251 IssueValueCellEditor valueEditor = new IssueValueCellEditor(model);
252 treeTable.setDefaultRenderer(IssueValuePanel.class, valueEditor);
253 treeTable.setDefaultEditor(IssueValuePanel.class, valueEditor);
254
255 WeightSliderCellEditor cellEditor = new WeightSliderCellEditor(model);
256 treeTable.setDefaultRenderer(WeightSlider.class, cellEditor);
257 treeTable.setDefaultEditor(WeightSlider.class, cellEditor);
258 treeTable.setRowHeight(24);
259
260 JScrollPane treePane = new JScrollPane(treeTable);
261 treePane.setBackground(treeTable.getBackground());
262 add(treePane, BorderLayout.CENTER);
263 }
264
265 private void initMenus() {
266 menuBar = new JMenuBar();
267 fileMenu = new JMenu("File");
268 editMenu = new JMenu("Edit");
269 menuBar.add(fileMenu);
270 menuBar.add(editMenu);
271 }
272
273 public JTreeTable getTreeTable() {
274 return treeTable;
275 }
276
277 public NegotiatorTreeTableModel getNegotiatorTreeTableModel() {
278 return model;
279 }
280
281 protected void updateHighlights(Objective selected) {
282 Objective parent = null;
283 if (selected != null) {
284 parent = selected.getParent();
285 }
286 Enumeration<Objective> treeEnum = ((Objective) model.getRoot())
287 .getPreorderEnumeration();
288 while (treeEnum.hasMoreElements()) {
289 Objective obj = treeEnum.nextElement();
290 if (selected == null || parent == null) {
291 setRowBackground(obj, UNSELECTED);
292 } else if (parent.isParent(obj)) {
293 setRowBackground(obj, HIGHLIGHT);
294 } else {
295 setRowBackground(obj, UNSELECTED);
296 }
297 }
298 }
299
300 public Objective getRoot() {
301 return (Objective) model.getRoot();
302 }
303
304 protected void setRowBackground(Objective node, Color color) {
305 model.getNameField(node).setBackground(color);
306 model.getTypeField(node).setBackground(color);
307 model.getNumberField(node).setBackground(color);
308 model.getIssueValuePanel(node).setBackground(color);
309 }
310
311 public DomainRepItem getDomainRepItem() {
312 return fDomainRepItem;
313 }
314}
Note: See TracBrowser for help on using the repository browser.