1 | |
package org.jtheque.films.view.impl.panels; |
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
import org.jdesktop.swingx.JXHyperlink; |
20 | |
import org.jdesktop.swingx.JXTitledPanel; |
21 | |
import org.jdesktop.swingx.JXTree; |
22 | |
import org.jdesktop.swingx.border.DropShadowBorder; |
23 | |
import org.jtheque.core.managers.error.JThequeError; |
24 | |
import org.jtheque.core.utils.ui.Borders; |
25 | |
import org.jtheque.core.utils.ui.PanelBuilder; |
26 | |
import org.jtheque.core.utils.ui.constraints.ConstraintManager; |
27 | |
import org.jtheque.films.controllers.able.IRealizerController; |
28 | |
import org.jtheque.films.services.able.IRealizersService; |
29 | |
import org.jtheque.films.utils.Constants; |
30 | |
import org.jtheque.films.view.able.IRealizerView; |
31 | |
import org.jtheque.films.view.impl.fb.IPersonFormBean; |
32 | |
import org.jtheque.films.view.impl.fb.PersonFormBean; |
33 | |
import org.jtheque.films.view.impl.models.able.IRealizersModel; |
34 | |
import org.jtheque.films.view.impl.toolbars.JPanelRealizerToolBar; |
35 | |
import org.jtheque.primary.od.able.Country; |
36 | |
import org.jtheque.primary.od.able.Person; |
37 | |
import org.jtheque.primary.services.able.ICountriesService; |
38 | |
import org.jtheque.primary.view.able.ToolbarView; |
39 | |
import org.jtheque.primary.view.impl.components.panels.JThequeTitledPanel; |
40 | |
import org.jtheque.primary.view.impl.components.panels.PrincipalDataPanel; |
41 | |
import org.jtheque.primary.view.impl.listeners.ObjectChangedEvent; |
42 | |
import org.jtheque.primary.view.impl.models.DataContainerCachedComboBoxModel; |
43 | |
import org.jtheque.primary.view.impl.models.NotesComboBoxModel; |
44 | |
import org.jtheque.primary.view.impl.renderers.JThequeTreeCellRenderer; |
45 | |
import org.jtheque.primary.view.impl.renderers.NoteComboRenderer; |
46 | |
import org.jtheque.primary.view.impl.sort.SortManager; |
47 | |
import org.jtheque.utils.ui.GridBagUtils; |
48 | |
|
49 | |
import javax.annotation.PostConstruct; |
50 | |
import javax.annotation.Resource; |
51 | |
import javax.swing.Action; |
52 | |
import javax.swing.JComboBox; |
53 | |
import javax.swing.JComponent; |
54 | |
import javax.swing.JTextField; |
55 | |
import java.awt.Font; |
56 | |
import java.util.Collection; |
57 | |
|
58 | |
|
59 | |
|
60 | |
|
61 | |
|
62 | |
|
63 | 0 | public final class RealizerView extends PrincipalDataPanel<IRealizersModel> implements IRealizerView { |
64 | |
private static final long serialVersionUID = -4304886748651187432L; |
65 | |
|
66 | |
private JXTitledPanel panelRealizer; |
67 | |
|
68 | |
private JTextField fieldFirstName; |
69 | |
private JTextField fieldName; |
70 | |
private DataContainerCachedComboBoxModel<Country> modelCountries; |
71 | |
private NotesComboBoxModel modelNote; |
72 | |
private JComboBox comboCountries; |
73 | |
private JComboBox comboNote; |
74 | |
private final JPanelRealizerToolBar toolBar; |
75 | |
|
76 | |
private JXTree treeRealizers; |
77 | |
|
78 | |
|
79 | 0 | private final SortManager sorter = new SortManager(); |
80 | |
|
81 | |
@Resource |
82 | |
private ICountriesService countriesService; |
83 | |
|
84 | |
@Resource |
85 | |
private IRealizerController realizerController; |
86 | |
|
87 | |
private final Action newCountryAction; |
88 | |
private final Action sortByNoteAction; |
89 | |
private final Action sortByCountryAction; |
90 | |
private static final int FIELD_COLUMNS = 20; |
91 | |
private static final double A_QUARTER = 0.25; |
92 | |
|
93 | |
|
94 | |
|
95 | |
|
96 | |
|
97 | |
|
98 | |
|
99 | |
|
100 | |
|
101 | |
public RealizerView(Action newCountryAction, Action sortByNoteAction, Action sortByCountryAction, JPanelRealizerToolBar toolBar) { |
102 | 0 | super(); |
103 | |
|
104 | 0 | this.newCountryAction = newCountryAction; |
105 | 0 | this.sortByNoteAction = sortByNoteAction; |
106 | 0 | this.sortByCountryAction = sortByCountryAction; |
107 | 0 | this.toolBar = toolBar; |
108 | 0 | } |
109 | |
|
110 | |
|
111 | |
|
112 | |
|
113 | |
@PostConstruct |
114 | |
private void build() { |
115 | 0 | getModel().addDisplayListListener(this); |
116 | |
|
117 | 0 | PanelBuilder builder = new PanelBuilder(this); |
118 | |
|
119 | 0 | buildPanelList(builder); |
120 | 0 | buildPanelTri(builder); |
121 | 0 | buildPanelRealizer(builder); |
122 | |
|
123 | 0 | setBorder(Borders.DIALOG_BORDER); |
124 | |
|
125 | 0 | addListeners(); |
126 | |
|
127 | 0 | selectFirst(); |
128 | 0 | } |
129 | |
|
130 | |
|
131 | |
|
132 | |
|
133 | |
private void addListeners() { |
134 | 0 | treeRealizers.addTreeSelectionListener(realizerController); |
135 | |
|
136 | 0 | getModel().addCurrentObjectListener(this); |
137 | 0 | } |
138 | |
|
139 | |
|
140 | |
|
141 | |
|
142 | |
|
143 | |
|
144 | |
private void buildPanelRealizer(PanelBuilder parent) { |
145 | 0 | panelRealizer = new JThequeTitledPanel("realizer.view.panel.realizer.title"); |
146 | 0 | panelRealizer.setBorder(new DropShadowBorder()); |
147 | 0 | panelRealizer.setTitleFont(panelRealizer.getTitleFont().deriveFont(Font.BOLD)); |
148 | |
|
149 | 0 | PanelBuilder builder = new PanelBuilder(); |
150 | |
|
151 | 0 | builder.add(toolBar, builder.gbcSet(0, 0, GridBagUtils.HORIZONTAL, 0, 1)); |
152 | |
|
153 | 0 | addNamesFields(builder); |
154 | 0 | addCountryField(builder); |
155 | 0 | addNoteField(builder); |
156 | |
|
157 | 0 | panelRealizer.setContentContainer(builder.getPanel()); |
158 | |
|
159 | 0 | parent.add(panelRealizer, parent.gbcSet(1, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 1, 2, 1 - A_QUARTER, 1.0)); |
160 | 0 | } |
161 | |
|
162 | |
|
163 | |
|
164 | |
|
165 | |
|
166 | |
|
167 | |
private void addNamesFields(PanelBuilder builder) { |
168 | 0 | builder.addI18nLabel(Constants.Properties.Person.FIRST_NAME, builder.gbcSet(0, 1)); |
169 | |
|
170 | 0 | fieldFirstName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 1, GridBagUtils.NONE, 0, 1)); |
171 | 0 | ConstraintManager.configure(fieldFirstName, Constants.Properties.Person.FIRST_NAME); |
172 | 0 | fieldFirstName.setEnabled(false); |
173 | |
|
174 | 0 | builder.addI18nLabel(Constants.Properties.Person.NAME, builder.gbcSet(0, 2)); |
175 | |
|
176 | 0 | fieldName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 2, GridBagUtils.NONE, 0, 1)); |
177 | 0 | ConstraintManager.configure(fieldName, Constants.Properties.Person.NAME); |
178 | 0 | fieldName.setEnabled(false); |
179 | 0 | } |
180 | |
|
181 | |
|
182 | |
|
183 | |
|
184 | |
|
185 | |
|
186 | |
private void addCountryField(PanelBuilder builder) { |
187 | 0 | builder.addI18nLabel(Constants.Properties.Person.COUNTRY, builder.gbcSet(0, 3)); |
188 | |
|
189 | 0 | modelCountries = new DataContainerCachedComboBoxModel<Country>(countriesService); |
190 | |
|
191 | 0 | comboCountries = builder.addComboBox(modelCountries, builder.gbcSet(1, 3)); |
192 | 0 | comboCountries.setEnabled(false); |
193 | |
|
194 | 0 | newCountryAction.setEnabled(false); |
195 | |
|
196 | 0 | builder.addButton(newCountryAction, builder.gbcSet(2, 3, GridBagUtils.NONE, 0, 1)); |
197 | 0 | } |
198 | |
|
199 | |
|
200 | |
|
201 | |
|
202 | |
|
203 | |
|
204 | |
private void addNoteField(PanelBuilder builder) { |
205 | 0 | builder.addI18nLabel(Constants.Properties.Person.NOTE, builder.gbcSet(0, 4)); |
206 | |
|
207 | 0 | modelNote = new NotesComboBoxModel(); |
208 | |
|
209 | 0 | comboNote = builder.addComboBox(modelNote, builder.gbcSet(1, 4, GridBagUtils.NONE, GridBagUtils.ABOVE_BASELINE_LEADING, 0, 0, 1.0, 1.0)); |
210 | 0 | comboNote.setEnabled(false); |
211 | 0 | comboNote.setRenderer(new NoteComboRenderer()); |
212 | 0 | } |
213 | |
|
214 | |
|
215 | |
|
216 | |
|
217 | |
|
218 | |
|
219 | |
private void buildPanelTri(PanelBuilder parent) { |
220 | 0 | JXTitledPanel panelTri = new JThequeTitledPanel("realizer.view.panel.sort.title"); |
221 | 0 | panelTri.setBorder(new DropShadowBorder()); |
222 | 0 | panelTri.setTitleFont(panelTri.getTitleFont().deriveFont(Font.BOLD)); |
223 | |
|
224 | 0 | PanelBuilder builder = new PanelBuilder(); |
225 | |
|
226 | 0 | JXHyperlink linkTriPays = builder.add(new JXHyperlink(sortByCountryAction), |
227 | |
builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0)); |
228 | 0 | linkTriPays.setClickedColor(linkTriPays.getUnclickedColor()); |
229 | |
|
230 | 0 | JXHyperlink linkTriNote = builder.add(new JXHyperlink(sortByNoteAction), |
231 | |
builder.gbcSet(0, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0)); |
232 | 0 | linkTriNote.setClickedColor(linkTriNote.getUnclickedColor()); |
233 | |
|
234 | 0 | panelTri.setContentContainer(builder.getPanel()); |
235 | |
|
236 | 0 | parent.add(panelTri, parent.gbcSet(0, 1, GridBagUtils.HORIZONTAL, GridBagUtils.FIRST_LINE_START, A_QUARTER, 0.0)); |
237 | 0 | } |
238 | |
|
239 | |
|
240 | |
|
241 | |
|
242 | |
|
243 | |
|
244 | |
private void buildPanelList(PanelBuilder parent) { |
245 | 0 | JXTitledPanel panelList = new JThequeTitledPanel("realizer.view.panel.list.title"); |
246 | 0 | panelList.setBorder(new DropShadowBorder()); |
247 | 0 | panelList.setTitleFont(panelList.getTitleFont().deriveFont(Font.BOLD)); |
248 | |
|
249 | 0 | PanelBuilder builder = new PanelBuilder(); |
250 | |
|
251 | 0 | setTreeModel(sorter.createInitialModel(IRealizersService.DATA_TYPE)); |
252 | |
|
253 | 0 | treeRealizers = new JXTree(getTreeModel()); |
254 | 0 | treeRealizers.setCellRenderer(new JThequeTreeCellRenderer()); |
255 | 0 | treeRealizers.putClientProperty("JTree.lineStyle", "None"); |
256 | |
|
257 | 0 | builder.addScrolled(treeRealizers, builder.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 0, 0, 1.0, 1.0)); |
258 | |
|
259 | 0 | panelList.setContentContainer(builder.getPanel()); |
260 | |
|
261 | 0 | parent.add(panelList, parent.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, A_QUARTER, 1.0)); |
262 | 0 | } |
263 | |
|
264 | |
|
265 | |
|
266 | |
|
267 | |
|
268 | |
|
269 | |
private void setCurrentRealizer(Person current) { |
270 | 0 | assert current.getType().equals(IRealizersService.PERSON_TYPE) : "The person must of type Actor"; |
271 | |
|
272 | 0 | panelRealizer.setTitle(current.getDisplayableText()); |
273 | |
|
274 | 0 | fieldFirstName.setText(current.getFirstName()); |
275 | 0 | fieldName.setText(current.getName()); |
276 | 0 | comboCountries.setSelectedItem(current.getTheCountry().getName()); |
277 | 0 | comboNote.setSelectedItem(current.getNote()); |
278 | 0 | } |
279 | |
|
280 | |
@Override |
281 | |
public IPersonFormBean fillPersonFormBean() { |
282 | 0 | IPersonFormBean fb = new PersonFormBean(); |
283 | |
|
284 | 0 | fb.setName(fieldName.getText()); |
285 | 0 | fb.setFirstName(fieldFirstName.getText()); |
286 | 0 | fb.setNote(modelNote.getSelectedNote()); |
287 | 0 | fb.setCountry(modelCountries.getSelectedData()); |
288 | |
|
289 | 0 | return fb; |
290 | |
} |
291 | |
|
292 | |
@Override |
293 | |
public void objectChanged(ObjectChangedEvent event) { |
294 | 0 | setCurrentRealizer((Person) event.getObject()); |
295 | 0 | } |
296 | |
|
297 | |
@Override |
298 | |
public void setEnabled(boolean enabled) { |
299 | 0 | fieldFirstName.setEnabled(enabled); |
300 | 0 | fieldName.setEnabled(enabled); |
301 | 0 | comboCountries.setEnabled(enabled); |
302 | 0 | comboNote.setEnabled(enabled); |
303 | 0 | newCountryAction.setEnabled(enabled); |
304 | 0 | } |
305 | |
|
306 | |
@Override |
307 | |
public ToolbarView getToolbarView() { |
308 | 0 | return toolBar; |
309 | |
} |
310 | |
|
311 | |
@Override |
312 | |
public String getDataType() { |
313 | 0 | return IRealizersService.DATA_TYPE; |
314 | |
} |
315 | |
|
316 | |
@Override |
317 | |
protected JXTree getTree() { |
318 | 0 | return treeRealizers; |
319 | |
} |
320 | |
|
321 | |
@Override |
322 | |
public JComponent getImpl() { |
323 | 0 | return this; |
324 | |
} |
325 | |
|
326 | |
@Override |
327 | |
public Integer getPosition() { |
328 | 0 | return 3; |
329 | |
} |
330 | |
|
331 | |
@Override |
332 | |
public String getTitleKey() { |
333 | 0 | return "realizer.data.title"; |
334 | |
} |
335 | |
|
336 | |
@Override |
337 | |
public void clear() { |
338 | 0 | } |
339 | |
|
340 | |
@Override |
341 | |
protected void validate(Collection<JThequeError> errors) { |
342 | 0 | ConstraintManager.validate(Constants.Properties.Person.NAME, fieldName.getText(), errors); |
343 | 0 | ConstraintManager.validate(Constants.Properties.Person.FIRST_NAME, fieldFirstName.getText(), errors); |
344 | 0 | ConstraintManager.validate(Constants.Properties.Person.COUNTRY, modelCountries.getSelectedData(), errors); |
345 | 0 | } |
346 | |
|
347 | |
@Override |
348 | |
public JComponent getComponent() { |
349 | 0 | return this; |
350 | |
} |
351 | |
} |