Project: e4-rendering
/*******************************************************************************
 * Copyright (c) 2011 Kai Toedter and others. 
 *  
 * All rights reserved. This program and the accompanying materials  
 * are made available under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution, and is available at 
 * http://www.eclipse.org/legal/epl-v10.html. 
 *  
 * Contributors: 
 *     Kai Toedter - initial API and implementation 
 ******************************************************************************/
 
package com.toedter.e4.demo.contacts.javafx.views; 
 
import at.bestsolution.efxclipse.runtime.databinding.IJFXBeanValueProperty; 
import at.bestsolution.efxclipse.runtime.databinding.JFXBeanProperties; 
import com.toedter.e4.demo.contacts.generic.databinding.AggregateNameObservableValue; 
import com.toedter.e4.demo.contacts.generic.model.Contact; 
import java.io.ByteArrayInputStream; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.geometry.VPos; 
import javafx.scene.Node; 
import javafx.scene.control.Label; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.control.TextField; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javax.inject.Inject; 
import org.eclipse.core.databinding.DataBindingContext; 
import org.eclipse.core.databinding.beans.BeanProperties; 
import org.eclipse.core.databinding.observable.value.WritableValue; 
import org.eclipse.e4.core.di.annotations.Optional; 
import org.eclipse.e4.ui.model.application.MApplication; 
import org.eclipse.osgi.internal.signedcontent.Base64; 
 
@SuppressWarnings("restriction"
public class DetailsView { 
 private final WritableValue writableValue = new WritableValue(); 
 
 private int detailsPanelRow; 
 private GridPane grid; 
 
 private IJFXBeanValueProperty uiProp; 
 
 private DataBindingContext ctx; 
 
 private ImageView imageView; 
 
 private TextField titleText; 
 
 @Inject 
 public DetailsView(BorderPane parent, final MApplication application) { 
  Node node = createDetailsPanel(); 
  parent.setCenter(node); 
 
 
 private Node createDetailsPanel() { 
  uiProp = JFXBeanProperties.value("text"); 
  ctx = new DataBindingContext(); 
 
  grid = new GridPane(); 
  grid.getStyleClass().add("my-gridpane"); 
 
  grid.setHgap(10); 
  grid.setVgap(5); 
  grid.setPadding(new Insets(10101010)); 
 
  detailsPanelRow = 0
  addSeparator("General"); 
 
  titleText = addProperty("Title""title"); 
  addProperty("Name""name"); 
  addProperty("Company""company"); 
  addProperty("Job Title""jobTitle"); 
  addProperty("Note""note"2); 
 
  Image image = new Image(getClass().getResourceAsStream("dummy.png")); 
  imageView = new ImageView(image); 
  grid.add(imageView, 3015); 
  GridPane.setValignment(imageView, VPos.BOTTOM); 
  GridPane.setHalignment(imageView, HPos.LEFT); 
  double scaleFactor = 102 / image.getHeight(); 
  imageView.setFitHeight(scaleFactor * image.getHeight()); 
  imageView.setFitWidth(scaleFactor * image.getWidth()); 
 
  titleText.heightProperty().addListener(new ChangeListener<Number>() { 
 
   public void changed(ObservableValue<? extends Number> observable, 
     Number oldValue, Number newValue) { 
    Image image = imageView.getImage(); 
    double scaleFactor = ((Double) newValue + 3.5) * 4 
      / image.getHeight(); 
    imageView.setFitHeight(scaleFactor * image.getHeight()); 
    imageView.setFitWidth(scaleFactor * image.getWidth()); 
   
  }); 
 
  addSeparator("Business Address"); 
  addProperty("Street""street"2); 
  addProperty("City""city"2); 
  addProperty("Zip""zip"2); 
  addProperty("Country""country"2); 
 
  addSeparator("Business Phones"); 
  addProperty("Phone""phone"2); 
  addProperty("Mobile""mobile"2); 
 
  addSeparator("Business Internet"); 
  addProperty("E-Mail""email"2); 
  addProperty("Web Site""webPage"2); 
 
  ColumnConstraints separatorConstraints = new ColumnConstraints(); 
  separatorConstraints.setHalignment(HPos.LEFT); 
  grid.getColumnConstraints().add(separatorConstraints); 
 
  ColumnConstraints labelConstraints = new ColumnConstraints(); 
  labelConstraints.setHalignment(HPos.RIGHT); 
  grid.getColumnConstraints().add(labelConstraints); 
 
  ScrollPane scrollPane = new ScrollPane(); 
  scrollPane.setFitToWidth(true); 
  scrollPane.setContent(grid); 
  scrollPane.autosize(); 
  return scrollPane; 
 
 
 public void addSeparator(String text) { 
  Label label = new Label(text); 
  label.getStyleClass().add("separator-label"); 
  grid.add(label, 0, detailsPanelRow++, 41); 
 
 
 public TextField addProperty(String labelText, String property, int span) { 
  Label label = new Label(labelText); 
 
  grid.add(label, 1, detailsPanelRow); 
 
  TextField textField = new TextField(); 
 
  grid.add(textField, 2, detailsPanelRow); 
 
  GridPane.setConstraints(textField, 2, detailsPanelRow, span, 1
    HPos.LEFT, VPos.BASELINE, Priority.ALWAYS, Priority.ALWAYS); 
 
  detailsPanelRow++; 
  if ("Name".equals(labelText)) { 
   ctx.bindValue(uiProp.observe(textField), 
     new AggregateNameObservableValue(writableValue)); 
  else { 
   ctx.bindValue(uiProp.observe(textField), 
     BeanProperties.value(property).observeDetail(writableValue)); 
  
 
  return textField; 
 
 
 public TextField addProperty(String labelText, String inputText) { 
  return addProperty(labelText, inputText, 1); 
 
 
 @Inject 
 public void setSelection(@Optional final Contact contact) { 
  if (contact != null) { 
   writableValue.setValue(contact); 
 
   String jpegString = contact.getJpegString(); 
   byte[] imageBytes = Base64.decode(jpegString.getBytes()); 
   ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); 
 
   imageView.setImage(new Image(is)); 
  
 
}