package org.jtheque.films.view.impl.panels.principals;
/*
* Copyright JTheque (Baptiste Wicht)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.jtheque.core.managers.Managers;
import org.jtheque.core.managers.beans.IBeansManager;
import org.jtheque.core.managers.error.JThequeError;
import org.jtheque.core.managers.persistence.able.DataContainer;
import org.jtheque.core.utils.ui.Borders;
import org.jtheque.core.utils.ui.builders.I18nPanelBuilder;
import org.jtheque.core.utils.ui.builders.JThequePanelBuilder;
import org.jtheque.core.utils.ui.builders.PanelBuilder;
import org.jtheque.core.utils.ui.constraints.ConstraintManager;
import org.jtheque.films.services.able.IRealizersService;
import org.jtheque.films.utils.Constants;
import org.jtheque.films.view.able.IRealizerView;
import org.jtheque.films.view.impl.actions.sort.AcSortRealizer;
import org.jtheque.films.view.impl.models.RealizersModel;
import org.jtheque.films.view.impl.models.able.IRealizersModel;
import org.jtheque.films.view.impl.toolbars.JPanelRealizerToolBar;
import org.jtheque.primary.controller.able.FormBean;
import org.jtheque.primary.od.able.Person;
import org.jtheque.primary.od.able.SimpleData;
import org.jtheque.primary.view.able.fb.IPersonFormBean;
import org.jtheque.primary.view.impl.actions.principal.CreateNewPrincipalAction;
import org.jtheque.primary.view.impl.components.panels.AbstractPrincipalDataPanel;
import org.jtheque.primary.view.impl.components.panels.JThequeTitledPanel;
import org.jtheque.primary.view.impl.fb.PersonFormBean;
import org.jtheque.primary.view.impl.listeners.ObjectChangedEvent;
import org.jtheque.primary.view.impl.models.DataContainerCachedComboBoxModel;
import org.jtheque.primary.view.impl.models.NotesComboBoxModel;
import org.jtheque.primary.view.impl.renderers.NoteComboRenderer;
import org.jtheque.utils.ui.GridBagUtils;
import org.jdesktop.swingx.JXHyperlink;
import org.jdesktop.swingx.JXTitledPanel;
import org.jdesktop.swingx.border.DropShadowBorder;
import javax.annotation.PostConstruct;
import javax.swing.Action;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.TreeSelectionListener;
import java.awt.Color;
import java.awt.Font;
import java.util.Collection;
/**
* User interface to edit/add realizer.
*
* @author Baptiste Wicht
*/
public final class RealizerView extends AbstractPrincipalDelegatedView<AbstractPrincipalDataPanel<IRealizersModel>> implements IRealizerView {
/**
* Construct a new ActorView.
*/
public RealizerView() {
super(3, "realizer.data.title");
UIManager.put("JXTitledPanel.title.foreground", Color.white);
}
@Override
public IPersonFormBean fillPersonFormBean() {
IPersonFormBean fb = new PersonFormBean();
getImplementationView().fillFormBean(fb);
return fb;
}
@Override
public void objectChanged(ObjectChangedEvent event) {
getImplementationView().setCurrent(event.getObject());
}
@Override
public IRealizersModel getModel() {
return (IRealizersModel) super.getModel();
}
@PostConstruct
public void init() {
buildInEDT();
getModel().addCurrentObjectListener(this);
}
@Override
protected void buildDelegatedView() {
RealizerViewImpl impl = new RealizerViewImpl();
setView(impl);
impl.build();
}
private static final class RealizerViewImpl extends AbstractPrincipalDataPanel<IRealizersModel> {
private JXTitledPanel panelRealizer;
private JTextField fieldFirstName;
private JTextField fieldName;
private DataContainerCachedComboBoxModel<SimpleData> modelCountries;
private NotesComboBoxModel modelNote;
private JComboBox comboCountries;
private JComboBox comboNote;
private final Action newCountryAction;
private static final int FIELD_COLUMNS = 20;
private RealizerViewImpl() {
super(IRealizersService.DATA_TYPE);
setModel(new RealizersModel());
newCountryAction = new CreateNewPrincipalAction("generic.view.actions.new", "realizersController");
}
/**
* Build the view.
*/
private void build() {
getModel().addDisplayListListener(this);
PanelBuilder builder = new JThequePanelBuilder(this);
buildPanelList(builder);
buildPanelTri(builder);
buildPanelRealizer(builder);
setBorder(Borders.DIALOG_BORDER);
getTree().addTreeSelectionListener(Managers.getManager(IBeansManager.class).<TreeSelectionListener>getBean("realizerController"));
selectFirst();
}
/**
* Build the internal panel realizer.
*
* @param parent The builder of the frame.
*/
private void buildPanelRealizer(PanelBuilder parent) {
panelRealizer = new JThequeTitledPanel("realizer.view.panel.realizer.title");
panelRealizer.setBorder(new DropShadowBorder());
panelRealizer.setTitleFont(panelRealizer.getTitleFont().deriveFont(Font.BOLD));
I18nPanelBuilder builder = new JThequePanelBuilder();
JPanelRealizerToolBar toolBar = new JPanelRealizerToolBar();
setToolBar(toolBar);
builder.add(toolBar, builder.gbcSet(0, 0, GridBagUtils.HORIZONTAL, 0, 1));
addNamesFields(builder);
addCountryField(builder);
addNoteField(builder);
panelRealizer.setContentContainer(builder.getPanel());
parent.add(panelRealizer, parent.gbcSet(1, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 1, 2, 1 - Constants.A_QUARTER, 1.0));
}
/**
* Add the field for the name and the first name of the realizer.
*
* @param builder The builder of the view.
*/
private void addNamesFields(I18nPanelBuilder builder) {
builder.addI18nLabel(Constants.Properties.Person.FIRST_NAME, builder.gbcSet(0, 1));
fieldFirstName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 1, GridBagUtils.NONE, 0, 1));
ConstraintManager.configure(fieldFirstName, Constants.Properties.Person.FIRST_NAME);
fieldFirstName.setEnabled(false);
builder.addI18nLabel(Constants.Properties.Person.NAME, builder.gbcSet(0, 2));
fieldName = builder.add(new JTextField(FIELD_COLUMNS), builder.gbcSet(1, 2, GridBagUtils.NONE, 0, 1));
ConstraintManager.configure(fieldName, Constants.Properties.Person.NAME);
fieldName.setEnabled(false);
}
/**
* Add the field for country.
*
* @param builder The builder.
*/
private void addCountryField(I18nPanelBuilder builder) {
builder.addI18nLabel(Constants.Properties.Person.COUNTRY, builder.gbcSet(0, 3));
modelCountries = new DataContainerCachedComboBoxModel<SimpleData>(
Managers.getManager(IBeansManager.class).<DataContainer<SimpleData>>getBean("countriesService"));
comboCountries = builder.addComboBox(modelCountries, builder.gbcSet(1, 3));
comboCountries.setEnabled(false);
newCountryAction.setEnabled(false);
builder.addButton(newCountryAction, builder.gbcSet(2, 3, GridBagUtils.NONE, 0, 1));
}
/**
* Add the field for note.
*
* @param builder The builder.
*/
private void addNoteField(I18nPanelBuilder builder) {
builder.addI18nLabel(Constants.Properties.Person.NOTE, builder.gbcSet(0, 4));
modelNote = new NotesComboBoxModel(daoNotes);
comboNote = builder.addComboBox(modelNote, builder.gbcSet(1, 4, GridBagUtils.NONE, GridBagUtils.ABOVE_BASELINE_LEADING, 0, 0, 1.0, 1.0));
comboNote.setEnabled(false);
comboNote.setRenderer(new NoteComboRenderer(daoNotes));
}
/**
* Build the internal panel sort.
*
* @param parent The builder of the frame.
*/
private static void buildPanelTri(PanelBuilder parent) {
JXTitledPanel panelTri = new JThequeTitledPanel("realizer.view.panel.sort.title");
panelTri.setBorder(new DropShadowBorder());
panelTri.setTitleFont(panelTri.getTitleFont().deriveFont(Font.BOLD));
PanelBuilder builder = new JThequePanelBuilder();
JXHyperlink linkTriPays = builder.add(new JXHyperlink(new AcSortRealizer("realizer.view.actions.sort.country", "Countries")),
builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
linkTriPays.setClickedColor(linkTriPays.getUnclickedColor());
JXHyperlink linkTriNote = builder.add(new JXHyperlink(new AcSortRealizer("realizer.view.actions.sort.note", "Notes")),
builder.gbcSet(0, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 0, 1, 1.0, 0.0));
linkTriNote.setClickedColor(linkTriNote.getUnclickedColor());
panelTri.setContentContainer(builder.getPanel());
parent.add(panelTri, parent.gbcSet(0, 1, GridBagUtils.HORIZONTAL, GridBagUtils.FIRST_LINE_START, Constants.A_QUARTER, 0.0));
}
/**
* Build the internal panel list.
*
* @param parent The builder of the frame.
*/
private void buildPanelList(PanelBuilder parent) {
JXTitledPanel panelList = new JThequeTitledPanel("realizer.view.panel.list.title");
panelList.setBorder(new DropShadowBorder());
panelList.setTitleFont(panelList.getTitleFont().deriveFont(Font.BOLD));
PanelBuilder builder = new JThequePanelBuilder();
setTreeModel(getSorter().createInitialModel(IRealizersService.DATA_TYPE));
initTree();
builder.addScrolled(getTree(), builder.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, 0, 0, 1.0, 1.0));
panelList.setContentContainer(builder.getPanel());
parent.add(panelList, parent.gbcSet(0, 0, GridBagUtils.BOTH, GridBagUtils.BASELINE_LEADING, Constants.A_QUARTER, 1.0));
}
@Override
public void fillFormBean(FormBean formBean) {
IPersonFormBean fb = (IPersonFormBean) formBean;
fb.setName(fieldName.getText());
fb.setFirstName(fieldFirstName.getText());
fb.setNote(modelNote.getSelectedNote());
fb.setCountry(modelCountries.getSelectedData());
}
@Override
public void setCurrent(Object object) {
Person current = (Person) object;
assert current.getType().equals(IRealizersService.PERSON_TYPE) : "The person must of type Actor";
panelRealizer.setTitle(current.getDisplayableText());
fieldFirstName.setText(current.getFirstName());
fieldName.setText(current.getName());
comboCountries.setSelectedItem(current.getTheCountry().getName());
comboNote.setSelectedItem(current.getNote());
}
@Override
protected void validate(Collection<JThequeError> errors) {
ConstraintManager.validate(Constants.Properties.Person.NAME, fieldName.getText(), errors);
ConstraintManager.validate(Constants.Properties.Person.FIRST_NAME, fieldFirstName.getText(), errors);
ConstraintManager.validate(Constants.Properties.Person.COUNTRY, modelCountries.getSelectedData(), errors);
}
@Override
public void setEnabled(boolean enabled) {
fieldFirstName.setEnabled(enabled);
fieldName.setEnabled(enabled);
comboCountries.setEnabled(enabled);
comboNote.setEnabled(enabled);
newCountryAction.setEnabled(enabled);
}
}
}