package tela.editor;
import static aplicacao.helper.MessageHelper.openInformation;
import static aplicacao.helper.MessageHelper.openQuestion;
import static aplicacao.helper.ValidatorHelper.validar;
import java.math.BigDecimal;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.wb.swt.ResourceManager;
import tela.dialog.SelecionarItemDialog;
import tela.editingSupport.ForneceProdutoEditingSupport;
import tela.editor.editorInput.ProdutoEditorInput;
import aplicacao.exception.ValidationException;
import aplicacao.helper.FormatterHelper;
import aplicacao.helper.LayoutHelper;
import aplicacao.service.MecasoftService;
import aplicacao.service.PessoaService;
import aplicacao.service.ProdutoServicoService;
import banco.modelo.ForneceProduto;
import banco.modelo.Pessoa;
import banco.modelo.ProdutoServico;
public class ProdutoEditor extends MecasoftEditor {
public static final String ID = "tela.editor.ProdutoEditor"; //$NON-NLS-1$
private Text txtDescricao;
private Text txtMediaUnitaria;
private Table tableFornecedores;
private TableViewer tvFornecedores;
private Button btnAtivo;
private ProdutoServicoService service = new ProdutoServicoService();
private PessoaService pessoaService = new PessoaService();
public ProdutoEditor() {
}
@Override
public void salvarRegistro() throws ValidationException{
validar(service.getProdutoServico());
if(service.getProdutoServico().getListaFornecedores().size() == 0 && service.getProdutoServico().getAtivo())
throw new ValidationException("Para o cadastro do Produto selecione um fornecedor, caso n�o possua fornecedor, o Produto devera ser desativado.");
for(ForneceProduto fp : service.getProdutoServico().getListaFornecedores()){
validar(fp);
}
service.saveOrUpdate();
openInformation("Produto cadastrado com sucesso!");
}
@Override
public void excluirRegistro() {}
@Override
public void addComponentes(Composite compositeConteudo) {
compositeConteudo.setLayout(new GridLayout(3, false));
Label lblDescrio = new Label(compositeConteudo, SWT.NONE);
lblDescrio.setText("Descri��o:");
txtDescricao = new Text(compositeConteudo, SWT.BORDER);
txtDescricao.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
btnAtivo = new Button(compositeConteudo, SWT.CHECK);
btnAtivo.setText("Ativo");
Label lblMediaUnitaria = new Label(compositeConteudo, SWT.NONE);
lblMediaUnitaria.setText("M\u00E9dia val. unit\u00E1rio:");
txtMediaUnitaria = new Text(compositeConteudo, SWT.BORDER);
txtMediaUnitaria.setEnabled(false);
txtMediaUnitaria.setEditable(false);
txtMediaUnitaria.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
new Label(compositeConteudo, SWT.NONE);
Label lblFornecedores = new Label(compositeConteudo, SWT.NONE);
lblFornecedores.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
lblFornecedores.setText("Fornecedores:");
tvFornecedores = new TableViewer(compositeConteudo, SWT.BORDER | SWT.FULL_SELECTION);
tableFornecedores = tvFornecedores.getTable();
tableFornecedores.setLinesVisible(true);
tableFornecedores.setHeaderVisible(true);
GridData gd_tableFornecedores = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 2);
gd_tableFornecedores.heightHint = 95;
tableFornecedores.setLayoutData(gd_tableFornecedores);
TableViewerColumn tvcNome = new TableViewerColumn(tvFornecedores, SWT.NONE);
tvcNome.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return ((ForneceProduto)element).getPessoa().getNomeFantasia();
}
});
TableColumn tblclmnNome = tvcNome.getColumn();
tblclmnNome.setWidth(274);
tblclmnNome.setText("Nome");
TableViewerColumn tvcValorUnitario = new TableViewerColumn(tvFornecedores, SWT.NONE);
ForneceProdutoEditingSupport fpes = new ForneceProdutoEditingSupport(tvFornecedores){
@Override
protected void setValue(Object element, Object value) {
super.setValue(element, value);
initDataBindings();
}
};
tvcValorUnitario.setEditingSupport(fpes);
tvcValorUnitario.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
try{
return FormatterHelper.getDecimalFormat().format(((ForneceProduto)element).getValorUnitario());
}catch(Exception e){
return "";
}
}
});
TableColumn tblclmnValorUnitario = tvcValorUnitario.getColumn();
tblclmnValorUnitario.setWidth(100);
tblclmnValorUnitario.setText("Valor Unit�rio");
Button btnAdicionar = new Button(compositeConteudo, SWT.NONE);
btnAdicionar.setImage(ResourceManager.getPluginImage("mecasoft", "assents/funcoes/fornecedor/removeFornecedor16.png"));
btnAdicionar.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Pessoa p = selecionarFornecedor();
if(p != null){
ForneceProduto fp = new ForneceProduto();
fp.setPessoa(p);
fp.setProduto(service.getProdutoServico());
service.getProdutoServico().getListaFornecedores().add(fp);
calcularMedia();
tvFornecedores.refresh();
initDataBindings();
}
}
});
btnAdicionar.setText("Adicionar");
new Label(compositeConteudo, SWT.NONE);
Button btnRemover = new Button(compositeConteudo, SWT.NONE);
btnRemover.setImage(ResourceManager.getPluginImage("mecasoft", "assents/funcoes/fornecedor/addFornecedor16.png"));
btnRemover.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selecao = (IStructuredSelection) tvFornecedores.getSelection();
if(selecao.isEmpty())
return;
if(openQuestion("Deseja realmente remover este fornecedor da lista?")){
ForneceProduto fp = (ForneceProduto)selecao.getFirstElement();
fp.getPessoa().getListaProduto().remove(fp);
service.getProdutoServico().getListaFornecedores().remove(fp);
calcularMedia();
tvFornecedores.refresh();
initDataBindings();
}
}
});
btnRemover.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
btnRemover.setText("Remover");
initDataBindings();
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
ProdutoEditorInput pei = (ProdutoEditorInput) input;
setShowExcluir(false);
if(pei.getProdutoServico().getId() != null){
service.setProdutoServico(service.find(pei.getProdutoServico().getId()));
this.setPartName("Produto: " + service.getProdutoServico().getDescricao());
}else{
service.setProdutoServico(pei.getProdutoServico());
service.getProdutoServico().setTipo(ProdutoServico.TIPOPRODUTO);
}
setInput(input);
setSite(site);
}
private Pessoa selecionarFornecedor(){
SelecionarItemDialog sid = new SelecionarItemDialog(LayoutHelper.getActiveShell(), new LabelProvider(){
@Override
public String getText(Object element) {
return ((Pessoa)element).getNomeFantasia();
}
});
//remover fornecedores ja adicionados
List<Pessoa> fornecedores = pessoaService.findAllFornecedoresAtivos();
for(ForneceProduto fp : service.getProdutoServico().getListaFornecedores()){
if(fornecedores.contains(fp.getPessoa()))
fornecedores.remove(fp.getPessoa());
}
sid.setElements(fornecedores.toArray());
return (Pessoa) sid.getElementoSelecionado();
}
private void calcularMedia(){
BigDecimal media = BigDecimal.ZERO;
for(ForneceProduto fp : service.getProdutoServico().getListaFornecedores()){
media = media.add(fp.getValorUnitario() == null ? BigDecimal.ZERO : fp.getValorUnitario());
}
if(service.getProdutoServico().getListaFornecedores().size() > 0)
media = media.divide(new BigDecimal(service.getProdutoServico().getListaFornecedores().size()));
service.getProdutoServico().setValorUnitario(media);
}
@Override
public boolean isDirty() {
return service.isDirty();
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue txtDescricaoObserveTextObserveWidget = SWTObservables.observeText(txtDescricao, SWT.Modify);
IObservableValue servicegetProdutoServicoDescricaoObserveValue = PojoObservables.observeValue(service.getProdutoServico(), "descricao");
bindingContext.bindValue(txtDescricaoObserveTextObserveWidget, servicegetProdutoServicoDescricaoObserveValue, null, null);
//
IObservableValue txtValorUnitarioObserveTextObserveWidget = SWTObservables.observeText(txtMediaUnitaria, SWT.Modify);
IObservableValue servicegetProdutoServicoValorUnitarioObserveValue = PojoObservables.observeValue(service.getProdutoServico(), "valorUnitario");
bindingContext.bindValue(txtValorUnitarioObserveTextObserveWidget, servicegetProdutoServicoValorUnitarioObserveValue, null, null);
//
ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
// IObservableMap[] observeMaps = PojoObservables.observeMaps(listContentProvider.getKnownElements(), ForneceProduto.class, new String[]{"id.pessoa.nomeFantasia", "valorUnitario"});
// tvFornecedores.setLabelProvider(new ObservableMapLabelProvider(observeMaps));
tvFornecedores.setContentProvider(listContentProvider);
//
IObservableList servicegetProdutoServicoListaFornecedoresObserveList = PojoObservables.observeList(Realm.getDefault(), service.getProdutoServico(), "listaFornecedores");
tvFornecedores.setInput(servicegetProdutoServicoListaFornecedoresObserveList);
//
IObservableValue btnAtivoObserveSelectionObserveWidget = SWTObservables.observeSelection(btnAtivo);
IObservableValue servicegetProdutoServicoAtivoObserveValue = PojoObservables.observeValue(service.getProdutoServico(), "ativo");
bindingContext.bindValue(btnAtivoObserveSelectionObserveWidget, servicegetProdutoServicoAtivoObserveValue, null, null);
//
return bindingContext;
}
@Override
public void setFocus() {
initDataBindings();
}
@Override
public MecasoftService<?> getService() {
return service;
}
}