Coverage Report - org.jtheque.films.view.impl.panels.FilmView
 
Classes in this File Line Coverage Branch Coverage Complexity
FilmView
0 %
0/163
0 %
0/6
1.083
 
 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.JXImagePanel;
 21  
 import org.jdesktop.swingx.JXTitledPanel;
 22  
 import org.jdesktop.swingx.JXTree;
 23  
 import org.jdesktop.swingx.border.DropShadowBorder;
 24  
 import org.jtheque.core.managers.Managers;
 25  
 import org.jtheque.core.managers.error.JThequeError;
 26  
 import org.jtheque.core.managers.language.ILanguageManager;
 27  
 import org.jtheque.core.managers.language.TabTitleUpdater;
 28  
 import org.jtheque.core.managers.resource.IResourceManager;
 29  
 import org.jtheque.core.managers.resource.ImageType;
 30  
 import org.jtheque.core.utils.ui.PanelBuilder;
 31  
 import org.jtheque.core.utils.ui.constraints.ConstraintManager;
 32  
 import org.jtheque.films.controllers.able.IFilmController;
 33  
 import org.jtheque.films.services.able.IFilmsService;
 34  
 import org.jtheque.films.utils.Constants;
 35  
 import org.jtheque.films.utils.Constants.Properties.Film;
 36  
 import org.jtheque.films.view.able.IFilmView;
 37  
 import org.jtheque.films.view.able.IInfosActorsView;
 38  
 import org.jtheque.films.view.able.IInfosFilmView;
 39  
 import org.jtheque.films.view.able.IInfosKindsView;
 40  
 import org.jtheque.films.view.able.IInfosOthersView;
 41  
 import org.jtheque.films.view.able.IInfosPersoView;
 42  
 import org.jtheque.films.view.impl.fb.FilmFormBean;
 43  
 import org.jtheque.films.view.impl.fb.IFilmFormBean;
 44  
 import org.jtheque.films.view.impl.models.able.IFilmsModel;
 45  
 import org.jtheque.films.view.impl.toolbars.JPanelFilmToolBar;
 46  
 import org.jtheque.primary.od.able.Type;
 47  
 import org.jtheque.primary.services.able.ITypesService;
 48  
 import org.jtheque.primary.view.able.ToolbarView;
 49  
 import org.jtheque.primary.view.impl.components.panels.JThequeTitledPanel;
 50  
 import org.jtheque.primary.view.impl.components.panels.PrincipalDataPanel;
 51  
 import org.jtheque.primary.view.impl.listeners.ObjectChangedEvent;
 52  
 import org.jtheque.primary.view.impl.models.DataContainerCachedComboBoxModel;
 53  
 import org.jtheque.primary.view.impl.renderers.JThequeTreeCellRenderer;
 54  
 import org.jtheque.primary.view.impl.sort.SortManager;
 55  
 import org.jtheque.utils.ui.GridBagUtils;
 56  
 
 57  
 import javax.annotation.PostConstruct;
 58  
 import javax.annotation.Resource;
 59  
 import javax.swing.Action;
 60  
 import javax.swing.JButton;
 61  
 import javax.swing.JComboBox;
 62  
 import javax.swing.JComponent;
 63  
 import javax.swing.JTabbedPane;
 64  
 import javax.swing.JTextField;
 65  
 import javax.swing.UIManager;
 66  
 import java.awt.Color;
 67  
 import java.awt.Font;
 68  
 import java.awt.Insets;
 69  
 import java.awt.image.BufferedImage;
 70  
 import java.util.Collection;
 71  
 import java.util.HashMap;
 72  
 import java.util.Map;
 73  
 
 74  
 /**
 75  
  * View to create/edit films.
 76  
  *
 77  
  * @author Baptiste Wicht
 78  
  */
 79  0
 public final class FilmView extends PrincipalDataPanel<IFilmsModel> implements IFilmView {
 80  
     private static final long serialVersionUID = -461914454879477388L;
 81  
 
 82  
     private JXTitledPanel panelFilm;
 83  
 
 84  
     private JTextField fieldTitle;
 85  
     private DataContainerCachedComboBoxModel<Type> modelType;
 86  
     private JComboBox comboType;
 87  
     private JButton buttonNewType;
 88  
     private JXImagePanel panelImage;
 89  
 
 90  
     private IInfosKindsView panelKinds;
 91  
     private IInfosActorsView panelActors;
 92  
     private IInfosPersoView panelPerso;
 93  
     private IInfosFilmView panelInfos;
 94  
     private IInfosOthersView panelOthers;
 95  
 
 96  
     private JPanelFilmToolBar toolBar;
 97  
 
 98  
     private JXTree treeFilms;
 99  
 
 100  0
     private final SortManager sorter = new SortManager();
 101  
 
 102  
     private Action sortByKindAction;
 103  
     private Action sortByTypeAction;
 104  
     private Action sortByRealizerAction;
 105  
     private Action sortByYearAction;
 106  
     private Action newTypeAction;
 107  
 
 108  
     @Resource
 109  
     private ITypesService typesService;
 110  
 
 111  
     @Resource
 112  
     private IFilmController filmController;
 113  
     private static final double A_QUARTER = 0.25;
 114  
 
 115  
     /**
 116  
      * Build the view.
 117  
      */
 118  
     @PostConstruct
 119  
     private void build() {
 120  0
         getModel().addDisplayListListener(this);
 121  0
         getModel().addViewStateListener(this);
 122  
 
 123  0
         PanelBuilder builder = new PanelBuilder(this);
 124  
 
 125  0
         buildPanelList(builder);
 126  0
         buildPanelTri(builder);
 127  0
         buildPanelFilm(builder);
 128  
 
 129  0
         addListeners();
 130  0
     }
 131  
 
 132  
     /**
 133  
      * Add listeners to and from the view.
 134  
      */
 135  
     private void addListeners() {
 136  0
         panelImage.addMouseListener(filmController);
 137  0
         treeFilms.addTreeSelectionListener(filmController);
 138  
 
 139  0
         getModel().addViewStateListener(this);
 140  0
         getModel().addDisplayListListener(this);
 141  
 
 142  0
         getModel().addCurrentObjectListener(this);
 143  0
         getModel().addCurrentObjectListener(panelKinds);
 144  0
         getModel().addCurrentObjectListener(panelInfos);
 145  0
         getModel().addCurrentObjectListener(panelActors);
 146  0
         getModel().addCurrentObjectListener(panelPerso);
 147  0
         getModel().addCurrentObjectListener(panelOthers);
 148  0
     }
 149  
 
 150  
     /**
 151  
      * Build the internal panel film.
 152  
      *
 153  
      * @param parent The parent builder.
 154  
      */
 155  
     private void buildPanelFilm(PanelBuilder parent) {
 156  0
         panelFilm = new JThequeTitledPanel("film.view.panel.film.title");
 157  0
         panelFilm.setBorder(new DropShadowBorder());
 158  0
         panelFilm.setTitleFont(panelFilm.getTitleFont().deriveFont(Font.BOLD));
 159  
 
 160  0
         PanelBuilder builder = new PanelBuilder();
 161  
 
 162  0
         builder.add(toolBar, builder.gbcSet(0, 0, GridBagUtils.HORIZONTAL, 4, 1));
 163  
 
 164  0
         builder.addI18nLabel(Film.TITLE, builder.gbcSet(0, 1));
 165  
 
 166  0
         fieldTitle = builder.add(new JTextField(20), builder.gbcSet(1, 1, GridBagUtils.NONE, 0, 1));
 167  0
         ConstraintManager.configure(fieldTitle, Film.TITLE);
 168  0
         fieldTitle.setEnabled(false);
 169  
 
 170  0
         addTypeField(builder);
 171  
 
 172  0
         panelImage = new JXImagePanel();
 173  0
         panelImage.setBackground(Color.white);
 174  0
         builder.add(panelImage, builder.gbcSet(3, 1, GridBagUtils.BOTH, 1, 2));
 175  
 
 176  0
         addTabbedPane(builder);
 177  
 
 178  0
         panelFilm.setContentContainer(builder.getPanel());
 179  
 
 180  0
         parent.add(panelFilm, parent.gbcSet(1, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 1, 2, 1 - A_QUARTER, 1.0));
 181  0
     }
 182  
 
 183  
     /**
 184  
      * Add the field for the type.
 185  
      *
 186  
      * @param builder The builder of the view.
 187  
      */
 188  
     private void addTypeField(PanelBuilder builder) {
 189  0
         builder.addI18nLabel(Film.TYPE, builder.gbcSet(0, 2));
 190  
 
 191  0
         modelType = new DataContainerCachedComboBoxModel<Type>(typesService);
 192  
 
 193  0
         comboType = builder.addComboBox(modelType, builder.gbcSet(1, 2));
 194  0
         comboType.setEnabled(false);
 195  
 
 196  0
         buttonNewType = builder.addButton(newTypeAction, builder.gbcSet(2, 2));
 197  0
         buttonNewType.setEnabled(false);
 198  0
     }
 199  
 
 200  
     /**
 201  
      * Add the tabbed pane to the view.
 202  
      *
 203  
      * @param builder The builder of the view.
 204  
      */
 205  
     private void addTabbedPane(PanelBuilder builder) {
 206  0
         Insets oldInsets = UIManager.getInsets("TabbedPane.contentBorderInsets");
 207  0
         UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0));
 208  
 
 209  0
         JTabbedPane tabInfos = new JTabbedPane();
 210  
 
 211  0
         UIManager.put("TabbedPane.contentBorderInsets", oldInsets);
 212  
 
 213  0
         Map<JComponent, String> components = new HashMap<JComponent, String>(3);
 214  
 
 215  0
         components.put(panelInfos.getImpl(), "film.view.panel.general.title");
 216  0
         tabInfos.addTab(getMessage("film.view.panel.general.title"), panelInfos.getImpl());
 217  
 
 218  0
         components.put(panelKinds.getImpl(), "film.view.panel.kinds.title");
 219  0
         tabInfos.addTab(getMessage("film.view.panel.kinds.title"), panelKinds.getImpl());
 220  
 
 221  0
         components.put(panelActors.getImpl(), "film.view.panel.actors.title");
 222  0
         tabInfos.addTab(getMessage("film.view.panel.actors.title"), panelActors.getImpl());
 223  
 
 224  0
         components.put(panelOthers.getImpl(), "film.view.panel.others.title");
 225  0
         tabInfos.addTab(getMessage("film.view.panel.others.title"), panelOthers.getImpl());
 226  
 
 227  0
         components.put(panelPerso.getImpl(), "film.view.panel.personal.title");
 228  0
         tabInfos.addTab(getMessage("film.view.panel.personal.title"), panelPerso.getImpl());
 229  
 
 230  0
         builder.add(tabInfos, builder.gbcSet(0, 3, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 0, 0, 1.0, 1.0));
 231  
 
 232  0
         Managers.getManager(ILanguageManager.class).addInternationalizable(new TabTitleUpdater(tabInfos, components));
 233  0
     }
 234  
 
 235  
     /**
 236  
      * Build the internal panel sort.
 237  
      *
 238  
      * @param parent The parent builder.
 239  
      */
 240  
     private void buildPanelTri(PanelBuilder parent) {
 241  0
         JXTitledPanel panelTri = new JThequeTitledPanel("film.view.panel.sort.title");
 242  0
         panelTri.setBorder(new DropShadowBorder());
 243  0
         panelTri.setTitleFont(panelTri.getTitleFont().deriveFont(Font.BOLD));
 244  
 
 245  0
         PanelBuilder builder = new PanelBuilder();
 246  
 
 247  0
         JXHyperlink linkTriGenre = builder.add(new JXHyperlink(sortByKindAction),
 248  
                 builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 249  0
         linkTriGenre.setClickedColor(linkTriGenre.getUnclickedColor());
 250  
 
 251  0
         JXHyperlink linkTriType = builder.add(new JXHyperlink(sortByTypeAction),
 252  
                 builder.gbcSet(0, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 253  0
         linkTriType.setClickedColor(linkTriType.getUnclickedColor());
 254  
 
 255  0
         JXHyperlink linkTriRealizer = builder.add(new JXHyperlink(sortByRealizerAction),
 256  
                 builder.gbcSet(0, 2, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 257  0
         linkTriRealizer.setClickedColor(linkTriRealizer.getUnclickedColor());
 258  
 
 259  0
         JXHyperlink linkTriYear = builder.add(new JXHyperlink(sortByYearAction),
 260  
                 builder.gbcSet(0, 3, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
 261  0
         linkTriYear.setClickedColor(linkTriYear.getUnclickedColor());
 262  
 
 263  0
         panelTri.setContentContainer(builder.getPanel());
 264  
 
 265  0
         parent.add(panelTri, parent.gbcSet(0, 1, GridBagUtils.HORIZONTAL, GridBagUtils.FIRST_LINE_START, A_QUARTER, 0.0));
 266  0
     }
 267  
 
 268  
     /**
 269  
      * Build the internal panel list.
 270  
      *
 271  
      * @param parent The parent builder.
 272  
      */
 273  
     private void buildPanelList(PanelBuilder parent) {
 274  0
         JXTitledPanel panelList = new JThequeTitledPanel("film.view.panel.list.title");
 275  0
         panelList.setBorder(new DropShadowBorder());
 276  0
         panelList.setTitleFont(panelList.getTitleFont().deriveFont(Font.BOLD));
 277  
 
 278  0
         PanelBuilder builder = new PanelBuilder();
 279  
 
 280  0
         setTreeModel(sorter.createInitialModel(IFilmsService.DATA_TYPE));
 281  
 
 282  0
         treeFilms = new JXTree(getTreeModel());
 283  0
         treeFilms.setCellRenderer(new JThequeTreeCellRenderer());
 284  0
         treeFilms.putClientProperty("JTree.lineStyle", "None");
 285  
 
 286  0
         builder.addScrolled(treeFilms, builder.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 0, 0, 1.0, 1.0));
 287  
 
 288  0
         panelList.setContentContainer(builder.getPanel());
 289  
 
 290  0
         parent.add(panelList, parent.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, A_QUARTER, 1.0));
 291  0
     }
 292  
 
 293  
     @Override
 294  
     public void objectChanged(ObjectChangedEvent event) {
 295  0
         setCurrentFilm((org.jtheque.films.persistence.od.able.Film) event.getObject());
 296  0
     }
 297  
 
 298  
     /**
 299  
      * Set the currently displayed film.
 300  
      *
 301  
      * @param film The new current film
 302  
      */
 303  
     private void setCurrentFilm(org.jtheque.films.persistence.od.able.Film film) {
 304  0
         panelFilm.setTitle(film.getDisplayableText());
 305  
 
 306  0
         fieldTitle.setText(film.getTitle());
 307  
 
 308  0
         if (film.getTheType() != null) {
 309  0
             modelType.setSelectedItem(film.getTheType());
 310  
         }
 311  
 
 312  0
         if (film.getImage() == null || film.getImage().length() == 0) {
 313  0
             panelImage.setImage(null);
 314  
         } else {
 315  0
             panelImage.setImage(Managers.getManager(IResourceManager.class).getImage(
 316  
                     film.getImage(),
 317  
                     ImageType.JPG,
 318  
                     Constants.MINIATURE_WIDTH));
 319  
         }
 320  0
     }
 321  
 
 322  
     @Override
 323  
     public void stateChanged() {
 324  0
         setEnabled(getModel().isEnabled());
 325  0
     }
 326  
 
 327  
     @Override
 328  
     public void setEnabled(boolean enabled) {
 329  0
         fieldTitle.setEnabled(enabled);
 330  0
         buttonNewType.setEnabled(enabled);
 331  0
         comboType.setEnabled(enabled);
 332  
 
 333  0
         panelKinds.setEnabled(enabled);
 334  0
         panelActors.setEnabled(enabled);
 335  0
         panelPerso.setEnabled(enabled);
 336  0
         panelInfos.setEnabled(enabled);
 337  0
         panelOthers.setEnabled(enabled);
 338  0
     }
 339  
 
 340  
     @Override
 341  
     public boolean isEnabled() {
 342  0
         return getModel().isEnabled();
 343  
     }
 344  
 
 345  
     @Override
 346  
     public IFilmFormBean fillFilmFormBean() {
 347  0
         IFilmFormBean fb = new FilmFormBean();
 348  
 
 349  0
         fb.setTitle(fieldTitle.getText());
 350  0
         fb.setType(modelType.getSelectedData());
 351  
 
 352  0
         panelActors.fillFilm(fb);
 353  0
         panelPerso.fillFilm(fb);
 354  0
         panelInfos.fillFilm(fb);
 355  0
         panelOthers.fillFilm(fb);
 356  0
         panelKinds.fillFilm(fb);
 357  
 
 358  0
         return fb;
 359  
     }
 360  
 
 361  
     @Override
 362  
     public ToolbarView getToolbarView() {
 363  0
         return toolBar;
 364  
     }
 365  
 
 366  
     @Override
 367  
     public void setImageOfPanel(BufferedImage image) {
 368  0
         panelImage.setImage(image);
 369  0
     }
 370  
 
 371  
     @Override
 372  
     public IInfosActorsView getPanelActors() {
 373  0
         return panelActors;
 374  
     }
 375  
 
 376  
     @Override
 377  
     public IInfosKindsView getPanelKinds() {
 378  0
         return panelKinds;
 379  
     }
 380  
 
 381  
     @Override
 382  
     public String getDataType() {
 383  0
         return IFilmsService.DATA_TYPE;
 384  
     }
 385  
 
 386  
     @Override
 387  
     protected JXTree getTree() {
 388  0
         return treeFilms;
 389  
     }
 390  
 
 391  
     @Override
 392  
     public JComponent getImpl() {
 393  0
         return this;
 394  
     }
 395  
 
 396  
     @Override
 397  
     public Integer getPosition() {
 398  0
         return 1;
 399  
     }
 400  
 
 401  
     @Override
 402  
     public String getTitleKey() {
 403  0
         return "film.data.title";
 404  
     }
 405  
 
 406  
     @Override
 407  
     public void clear() {
 408  0
     }
 409  
 
 410  
     @Override
 411  
     public JComponent getComponent() {
 412  0
         return this;
 413  
     }
 414  
 
 415  
     @Override
 416  
     protected void validate(Collection<JThequeError> errors) {
 417  0
         ConstraintManager.validate(Film.TITLE, fieldTitle.getText(), errors);
 418  0
         ConstraintManager.validate(Film.TYPE, modelType, errors);
 419  
 
 420  0
         panelKinds.validate(errors);
 421  0
         panelActors.validate(errors);
 422  0
         panelPerso.validate(errors);
 423  0
         panelInfos.validate(errors);
 424  0
         panelOthers.validate(errors);
 425  0
     }
 426  
 
 427  
     /**
 428  
      * Set the action to sort by kind.
 429  
      *
 430  
      * @param sortByKindAction The action to sort by kind.
 431  
      */
 432  
     public void setSortByKindAction(Action sortByKindAction) {
 433  0
         this.sortByKindAction = sortByKindAction;
 434  0
     }
 435  
 
 436  
     /**
 437  
      * Set the action to sort by type.
 438  
      *
 439  
      * @param sortByTypeAction The action to sort by type.
 440  
      */
 441  
     public void setSortByTypeAction(Action sortByTypeAction) {
 442  0
         this.sortByTypeAction = sortByTypeAction;
 443  0
     }
 444  
 
 445  
     /**
 446  
      * Set the action to sort by realizer.
 447  
      *
 448  
      * @param sortByRealizerAction The action to sort by realizer.
 449  
      */
 450  
     public void setSortByRealizerAction(Action sortByRealizerAction) {
 451  0
         this.sortByRealizerAction = sortByRealizerAction;
 452  0
     }
 453  
 
 454  
     /**
 455  
      * Set the action to sort by year.
 456  
      *
 457  
      * @param sortByYearAction The action to sort by year.
 458  
      */
 459  
     public void setSortByYearAction(Action sortByYearAction) {
 460  0
         this.sortByYearAction = sortByYearAction;
 461  0
     }
 462  
 
 463  
     /**
 464  
      * Set the action to create a new type.
 465  
      *
 466  
      * @param newTypeAction The action to create a new type.
 467  
      */
 468  
     public void setNewTypeAction(Action newTypeAction) {
 469  0
         this.newTypeAction = newTypeAction;
 470  0
     }
 471  
 
 472  
     /**
 473  
      * Set the panel of the actors.
 474  
      *
 475  
      * @param panelActors The panel of actors.
 476  
      */
 477  
     public void setPanelActors(IInfosActorsView panelActors) {
 478  0
         this.panelActors = panelActors;
 479  0
     }
 480  
 
 481  
     /**
 482  
      * Set the panel of the general informations.
 483  
      *
 484  
      * @param panelInfos The panel of general informations.
 485  
      */
 486  
     public void setPanelInfos(IInfosFilmView panelInfos) {
 487  0
         this.panelInfos = panelInfos;
 488  0
     }
 489  
 
 490  
     /**
 491  
      * Set the panel of the kinds.
 492  
      *
 493  
      * @param panelKinds The panel of kinds.
 494  
      */
 495  
     public void setPanelKinds(IInfosKindsView panelKinds) {
 496  0
         this.panelKinds = panelKinds;
 497  0
     }
 498  
 
 499  
     /**
 500  
      * Set the panel of the personal informations.
 501  
      *
 502  
      * @param panelPerso The panel of the personal informations.
 503  
      */
 504  
     public void setPanelPerso(IInfosPersoView panelPerso) {
 505  0
         this.panelPerso = panelPerso;
 506  0
     }
 507  
 
 508  
     /**
 509  
      * Set the panel of the others informations.
 510  
      *
 511  
      * @param panelOthers The panel of others informations.
 512  
      */
 513  
     public void setPanelOthers(IInfosOthersView panelOthers) {
 514  0
         this.panelOthers = panelOthers;
 515  0
     }
 516  
 
 517  
     /**
 518  
      * Set the tool bar of the view.
 519  
      *
 520  
      * @param toolBar The tool bar of the view.
 521  
      */
 522  
     public void setToolBar(JPanelFilmToolBar toolBar) {
 523  0
         this.toolBar = toolBar;
 524  0
     }
 525  
 }