Coverage Report - org.jtheque.films.view.impl.panels.ActorView
 
Classes in this File Line Coverage Branch Coverage Complexity
ActorView
0 %
0/112
0 %
0/4
1
 
 1  
 package org.jtheque.films.view.impl.panels;
 2  
 
 3  
 /*
 4  
  * This file is part of JTheque.
 5  
  *
 6  
  * JTheque is free software: you can redistribute it and/or modify
 7  
  * it under the terms of the GNU General Public License as published by
 8  
  * the Free Software Foundation, either version 3 of the License.
 9  
  *
 10  
  * JTheque is distributed in the hope that it will be useful,
 11  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13  
  * GNU General Public License for more details.
 14  
  *
 15  
  * You should have received a copy of the GNU General Public License
 16  
  * along with JTheque.  If not, see <http://www.gnu.org/licenses/>.
 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.IActorController;
 28  
 import org.jtheque.films.services.able.IActorService;
 29  
 import org.jtheque.films.utils.Constants;
 30  
 import org.jtheque.films.view.able.IActorView;
 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.IActorsModel;
 34  
 import org.jtheque.films.view.impl.toolbars.JPanelActorToolBar;
 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  
  * View to add/edit an actor.
 60  
  *
 61  
  * @author Baptiste Wicht
 62  
  */
 63  0
 public final class ActorView extends PrincipalDataPanel<IActorsModel> implements IActorView {
 64  
     private static final long serialVersionUID = -4304886748651187432L;
 65  
 
 66  
     private JXTitledPanel actorPanel;
 67  
 
 68  
     private JTextField fieldFirstName;
 69  
     private JTextField fieldName;
 70  
     private DataContainerCachedComboBoxModel<Country> modelCountries;
 71  
     private NotesComboBoxModel modelNote;
 72  
     private final JPanelActorToolBar toolBar;
 73  
     private JComboBox comboCountries;
 74  
     private JComboBox comboNote;
 75  
 
 76  
     private JXTree treeActors;
 77  
 
 78  0
     private final SortManager sorter = new SortManager();
 79  
 
 80  
     @Resource
 81  
     private ICountriesService countriesService;
 82  
 
 83  
     @Resource
 84  
     private IActorController actorController;
 85  
 
 86  
     private final Action newCountryAction;
 87  
     private final Action sortByNoteAction;
 88  
     private final Action sortByCountryAction;
 89  
 
 90  
     private static final int FIELD_COLUMNS = 20;
 91  
     private static final double AN_HALF = 0.25;
 92  
 
 93  
     /**
 94  
      * Construct a new ActorView.
 95  
      *
 96  
      * @param newCountryAction    The action to create a new country.
 97  
      * @param sortByNoteAction    The action to sort by note.
 98  
      * @param sortByCountryAction The action to sort by country.
 99  
      * @param toolBar             The tool bar.
 100  
      */
 101  
     public ActorView(Action newCountryAction, Action sortByNoteAction, Action sortByCountryAction, JPanelActorToolBar 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  
      * Build the view.
 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
         buildPanelActor(builder);
 122  
 
 123  0
         setBorder(Borders.DIALOG_BORDER);
 124  
 
 125  0
         addListeners();
 126  
 
 127  0
         selectFirst();
 128  0
     }
 129  
 
 130  
     /**
 131  
      * Add listeners to and from the view.
 132  
      */
 133  
     private void addListeners() {
 134  0
         treeActors.addTreeSelectionListener(actorController);
 135  
 
 136  0
         getModel().addDisplayListListener(this);
 137  0
         getModel().addCurrentObjectListener(this);
 138  0
     }
 139  
 
 140  
     /**
 141  
      * Build the internal panel actor.
 142  
      *
 143  
      * @param parent The builder of the frame.
 144  
      */
 145  
     private void buildPanelActor(PanelBuilder parent) {
 146  0
         actorPanel = new JThequeTitledPanel("actor.view.panel.actor.title");
 147  0
         actorPanel.setBorder(new DropShadowBorder());
 148  0
         actorPanel.setTitleFont(actorPanel.getTitleFont().deriveFont(Font.BOLD));
 149  
 
 150  0
         PanelBuilder builder = new PanelBuilder();
 151  
 
 152  0
         builder.add(toolBar, builder.gbcSet(0, 0, GridBagUtils.HORIZONTAL, 0, 1));
 153  
 
 154  0
         addFirstNameField(builder);
 155  0
         addNameField(builder);
 156  0
         addCountryField(builder);
 157  0
         addNoteField(builder);
 158  
 
 159  0
         actorPanel.setContentContainer(builder.getPanel());
 160  
 
 161  0
         parent.add(actorPanel, parent.gbcSet(1, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 1, 2, 1 - AN_HALF, 1.0));
 162  0
     }
 163  
 
 164  
     /**
 165  
      * Add the field for first name.
 166  
      *
 167  
      * @param builder The builder.
 168  
      */
 169  
     private void addFirstNameField(PanelBuilder builder) {
 170  0
         builder.addI18nLabel(Constants.Properties.Person.FIRST_NAME, builder.gbcSet(0, 1));
 171  
 
 172  0
         fieldFirstName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 1, GridBagUtils.NONE, 0, 1));
 173  0
         ConstraintManager.configure(fieldFirstName, Constants.Properties.Person.FIRST_NAME);
 174  0
         fieldFirstName.setEnabled(false);
 175  0
     }
 176  
 
 177  
     /**
 178  
      * Add the field for name.
 179  
      *
 180  
      * @param builder The builder.
 181  
      */
 182  
     private void addNameField(PanelBuilder builder) {
 183  0
         builder.addI18nLabel(Constants.Properties.Person.NAME, builder.gbcSet(0, 2));
 184  
 
 185  0
         fieldName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 2, GridBagUtils.NONE, 0, 1));
 186  0
         ConstraintManager.configure(fieldName, Constants.Properties.Person.NAME);
 187  0
         fieldName.setEnabled(false);
 188  0
     }
 189  
 
 190  
     /**
 191  
      * Add the field for country.
 192  
      *
 193  
      * @param builder The builder.
 194  
      */
 195  
     private void addCountryField(PanelBuilder builder) {
 196  0
         builder.addI18nLabel(Constants.Properties.Person.COUNTRY, builder.gbcSet(0, 3));
 197  
 
 198  0
         modelCountries = new DataContainerCachedComboBoxModel<Country>(countriesService);
 199  
 
 200  0
         comboCountries = builder.addComboBox(modelCountries, builder.gbcSet(1, 3));
 201  0
         comboCountries.setEnabled(false);
 202  
 
 203  0
         newCountryAction.setEnabled(false);
 204  
 
 205  0
         builder.addButton(newCountryAction, builder.gbcSet(2, 3, GridBagUtils.NONE, 0, 1));
 206  0
     }
 207  
 
 208  
     /**
 209  
      * Add the field for note.
 210  
      *
 211  
      * @param builder The builder.
 212  
      */
 213  
     private void addNoteField(PanelBuilder builder) {
 214  0
         builder.addI18nLabel(Constants.Properties.Person.NOTE, builder.gbcSet(0, 4));
 215  
 
 216  0
         modelNote = new NotesComboBoxModel();
 217  
 
 218  0
         comboNote = builder.addComboBox(modelNote, builder.gbcSet(1, 4, GridBagUtils.NONE, GridBagUtils.ABOVE_BASELINE_LEADING, 0, 0, 1.0, 1.0));
 219  0
         comboNote.setEnabled(false);
 220  0
         comboNote.setRenderer(new NoteComboRenderer());
 221  0
     }
 222  
 
 223  
     /**
 224  
      * Build the internal panel sort.
 225  
      *
 226  
      * @param parent The builder of the frame.
 227  
      */
 228  
     private void buildPanelTri(PanelBuilder parent) {
 229  0
         JXTitledPanel panelTri = new JThequeTitledPanel("actor.view.panel.sort.title");
 230  0
         panelTri.setBorder(new DropShadowBorder());
 231  0
         panelTri.setTitleFont(panelTri.getTitleFont().deriveFont(Font.BOLD));
 232  
 
 233  0
         PanelBuilder builder = new PanelBuilder();
 234  
 
 235  0
         JXHyperlink linkTriPays = builder.add(new JXHyperlink(sortByCountryAction),
 236  
                 builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 237  0
         linkTriPays.setClickedColor(linkTriPays.getUnclickedColor());
 238  
 
 239  0
         JXHyperlink linkTriNote = builder.add(new JXHyperlink(sortByNoteAction),
 240  
                 builder.gbcSet(0, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 241  0
         linkTriNote.setClickedColor(linkTriNote.getUnclickedColor());
 242  
 
 243  0
         panelTri.setContentContainer(builder.getPanel());
 244  
 
 245  0
         parent.add(panelTri, parent.gbcSet(0, 1, GridBagUtils.HORIZONTAL, GridBagUtils.FIRST_LINE_START, AN_HALF, 0.0));
 246  0
     }
 247  
 
 248  
     /**
 249  
      * Build the internal panel list.
 250  
      *
 251  
      * @param parent The builder of the frame.
 252  
      */
 253  
     private void buildPanelList(PanelBuilder parent) {
 254  0
         JXTitledPanel panelList = new JThequeTitledPanel("actor.view.panel.list.title");
 255  0
         panelList.setBorder(new DropShadowBorder());
 256  0
         panelList.setTitleFont(panelList.getTitleFont().deriveFont(Font.BOLD));
 257  
 
 258  0
         PanelBuilder builder = new PanelBuilder();
 259  
 
 260  0
         setTreeModel(sorter.createInitialModel(IActorService.DATA_TYPE));
 261  
 
 262  0
         treeActors = new JXTree(getTreeModel());
 263  0
         treeActors.setCellRenderer(new JThequeTreeCellRenderer());
 264  0
         treeActors.putClientProperty("JTree.lineStyle", "None");
 265  
 
 266  0
         builder.addScrolled(treeActors, builder.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 0, 0, 1.0, 1.0));
 267  
 
 268  0
         panelList.setContentContainer(builder.getPanel());
 269  
 
 270  0
         parent.add(panelList, parent.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, AN_HALF, 1.0));
 271  0
     }
 272  
 
 273  
     /**
 274  
      * Set the current actor in the view.
 275  
      *
 276  
      * @param current The current actor.
 277  
      */
 278  
     private void setCurrentActor(Person current) {
 279  0
         assert current.getType().equals(IActorService.PERSON_TYPE) : "The person must of type Actor";
 280  
 
 281  0
         actorPanel.setTitle(current.getDisplayableText());
 282  
 
 283  0
         fieldFirstName.setText(current.getFirstName());
 284  0
         fieldName.setText(current.getName());
 285  0
         modelCountries.setSelectedItem(current.getTheCountry());
 286  0
         modelNote.setSelectedItem(current.getNote());
 287  0
     }
 288  
 
 289  
     @Override
 290  
     public IPersonFormBean fillActorFormBean() {
 291  0
         IPersonFormBean fb = new PersonFormBean();
 292  
 
 293  0
         fb.setName(fieldName.getText());
 294  0
         fb.setFirstName(fieldFirstName.getText());
 295  0
         fb.setNote(modelNote.getSelectedNote());
 296  0
         fb.setCountry(modelCountries.getSelectedData());
 297  
 
 298  0
         return fb;
 299  
     }
 300  
 
 301  
     @Override
 302  
     public void objectChanged(ObjectChangedEvent event) {
 303  0
         setCurrentActor((Person) event.getObject());
 304  0
     }
 305  
 
 306  
     @Override
 307  
     public void setEnabled(boolean enabled) {
 308  0
         fieldFirstName.setEnabled(enabled);
 309  0
         fieldName.setEnabled(enabled);
 310  0
         comboCountries.setEnabled(enabled);
 311  0
         comboNote.setEnabled(enabled);
 312  0
         newCountryAction.setEnabled(enabled);
 313  0
     }
 314  
 
 315  
     @Override
 316  
     public ToolbarView getToolbarView() {
 317  0
         return toolBar;
 318  
     }
 319  
 
 320  
     @Override
 321  
     public String getDataType() {
 322  0
         return IActorService.DATA_TYPE;
 323  
     }
 324  
 
 325  
     @Override
 326  
     protected JXTree getTree() {
 327  0
         return treeActors;
 328  
     }
 329  
 
 330  
     @Override
 331  
     public JComponent getImpl() {
 332  0
         return this;
 333  
     }
 334  
 
 335  
     @Override
 336  
     public Integer getPosition() {
 337  0
         return 2;
 338  
     }
 339  
 
 340  
     @Override
 341  
     public String getTitleKey() {
 342  0
         return "actor.data.title";
 343  
     }
 344  
 
 345  
     @Override
 346  
     public void clear() {
 347  0
     }
 348  
 
 349  
     @Override
 350  
     protected void validate(Collection<JThequeError> errors) {
 351  0
         ConstraintManager.validate(Constants.Properties.Person.NAME, fieldName.getText(), errors);
 352  0
         ConstraintManager.validate(Constants.Properties.Person.FIRST_NAME, fieldFirstName.getText(), errors);
 353  0
         ConstraintManager.validate(Constants.Properties.Person.COUNTRY, modelCountries.getSelectedData(), errors);
 354  0
     }
 355  
 
 356  
     @Override
 357  
     public JComponent getComponent() {
 358  0
         return this;
 359  
     }
 360  
 }