// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/model/Contact.java
// @Entity
// @Table(name = "contact")
// @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
// @DiscriminatorValue(value = "?")
// @Inheritance(strategy=InheritanceType.JOINED)
// public abstract class Contact extends AbstractEntity
//                               implements Serializable {
// 
//     /** @see java.io.Serializable */
//     private static final long serialVersionUID = 1L;
// 
//     // <editor-fold desc="Property: photo">
//     public static final String PHOTO_PROPERTY = "photo";
//     private final ObjectProperty<Image> photo = new SimpleObjectProperty<>(this, PHOTO_PROPERTY);
//     public ObjectProperty<Image> photoProperty() {
//         return this.photo;
//     }
//     @Column(name = "photo_data")
//     @Convert(converter = ImageConverter.class)
//     public Image getPhoto() {
//         return this.photo.get();
//     }
//     public void setPhoto(final Image photo) {
//         this.photo.set(photo);
//     }
//     // </editor-fold>
// 
// 
//     public Contact() {
//         super();
//     }
// 
// 
//     @Transient
//     public abstract ContactType getType();
// 
//     public static <T extends Contact> T create(final Class<T> contactType) {
//         final T contact;
//         try {
//             contact = contactType.newInstance();
//         } catch (InstantiationException | IllegalAccessException e) {
//             throw new IllegalStateException(e);
//         }
//         return contact;
//     }
// 
// }


import javax.inject.Inject;
import javax.inject.Named;
import com.cathive.fx.apps.contacts.model.Contact;
import com.cathive.fx.inject.core.FXMLComponent;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Instance;
/*
 * Copyright (C) 2013,2014 The Cat Hive Developers.
 *
 * 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.
 */

package com.cathive.fx.apps.contacts;



/**
 * @author Benjamin P. Jung
 */
@Named
@FXMLComponent(location = "ContactDetailsPane.fxml", resources = "com.cathive.fx.apps.contacts.Messages")
public class ContactDetailsPane extends VBox {

    @Inject private Instance<ContactsApp> appInstance;
    @Inject private ContactRendererFactory displayNameRenderers;

    @FXML private Label displayNameLabel;
    @FXML private Label firstNameLabel;
    @FXML private Label lastNameLabel;
    @FXML private ImageView photoImageView;

    // <editor-fold desc="Property: read only">
    public static final String READ_ONLY_PROPERTY = "readOnly";
    private final BooleanProperty readOnly = new SimpleBooleanProperty(this, READ_ONLY_PROPERTY);
    public boolean isReadOnly() {
        return this.readOnly.get();
    }
    public void setReadOnly(final boolean readOnly) {
        this.readOnly.set(readOnly);
    }
    public BooleanProperty readOnlyBooleanProperty() {
        return this.readOnly;
    }
    // </editor-fold>

    /** Contact to be displayed by this component (thus: the "model"). */
// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/model/Contact.java
// @Entity
// @Table(name = "contact")
// @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
// @DiscriminatorValue(value = "?")
// @Inheritance(strategy=InheritanceType.JOINED)
// public abstract class Contact extends AbstractEntity
//                               implements Serializable {
// 
//     /** @see java.io.Serializable */
//     private static final long serialVersionUID = 1L;
// 
//     // <editor-fold desc="Property: photo">
//     public static final String PHOTO_PROPERTY = "photo";
//     private final ObjectProperty<Image> photo = new SimpleObjectProperty<>(this, PHOTO_PROPERTY);
//     public ObjectProperty<Image> photoProperty() {
//         return this.photo;
//     }
//     @Column(name = "photo_data")
//     @Convert(converter = ImageConverter.class)
//     public Image getPhoto() {
//         return this.photo.get();
//     }
//     public void setPhoto(final Image photo) {
//         this.photo.set(photo);
//     }
//     // </editor-fold>
// 
// 
//     public Contact() {
//         super();
//     }
// 
// 
//     @Transient
//     public abstract ContactType getType();
// 
//     public static <T extends Contact> T create(final Class<T> contactType) {
//         final T contact;
//         try {
//             contact = contactType.newInstance();
//         } catch (InstantiationException | IllegalAccessException e) {
//             throw new IllegalStateException(e);
//         }
//         return contact;
//     }
// 
// }


// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/ContactDetailsPane.java
import javax.inject.Inject;
import javax.inject.Named;
import com.cathive.fx.apps.contacts.model.Contact;
import com.cathive.fx.inject.core.FXMLComponent;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Instance;

/*
 * Copyright (C) 2013,2014 The Cat Hive Developers.
 *
 * 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.
 */

package com.cathive.fx.apps.contacts;



/**
 * @author Benjamin P. Jung
 */
@Named
@FXMLComponent(location = "ContactDetailsPane.fxml", resources = "com.cathive.fx.apps.contacts.Messages")
public class ContactDetailsPane extends VBox {

    @Inject private Instance<ContactsApp> appInstance;
    @Inject private ContactRendererFactory displayNameRenderers;

    @FXML private Label displayNameLabel;
    @FXML private Label firstNameLabel;
    @FXML private Label lastNameLabel;
    @FXML private ImageView photoImageView;

    // <editor-fold desc="Property: read only">
    public static final String READ_ONLY_PROPERTY = "readOnly";
    private final BooleanProperty readOnly = new SimpleBooleanProperty(this, READ_ONLY_PROPERTY);
    public boolean isReadOnly() {
        return this.readOnly.get();
    }
    public void setReadOnly(final boolean readOnly) {
        this.readOnly.set(readOnly);
    }
    public BooleanProperty readOnlyBooleanProperty() {
        return this.readOnly;
    }
    // </editor-fold>

    /** Contact to be displayed by this component (thus: the "model"). */
    private final ObjectProperty<Contact> contact = new SimpleObjectProperty<>(this, "contact");