blob: 0dbf576886d9cd2b628817dbf2c2ba369bd6d2ad [file] [log] [blame]
/*
* Copyright (c) 2009-2012, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*
* Initial Publication:
* Eclipse Magazin - http://www.eclipse-magazin.de
*/
package org.gastro.rcp.internal.department;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider.FontAndColorProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.part.ViewPart;
import com.swtdesigner.ResourceManager;
import com.swtdesigner.SWTResourceManager;
import org.gastro.business.BusinessDay;
import org.gastro.business.Order;
import org.gastro.business.OrderDetail;
import org.gastro.business.OrderState;
import org.gastro.inventory.Department;
import org.gastro.inventory.Product;
import org.gastro.rcp.IModel;
import org.gastro.rcp.IModel.ITransactionalOperation;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
/**
* @author Eike Stepper
*/
public class OrdersView extends ViewPart
{
public static final String ID = "org.gastro.rcp.orders.view";
private static final AdapterFactory FACTORY = IModel.INSTANCE.getAdapterFactory();
private TreeViewer treeViewer;
private Adapter businessDayAdapter = new AdapterImpl()
{
@Override
public void notifyChanged(Notification msg)
{
try
{
treeViewer.getTree().getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
treeViewer.refresh(true);
treeViewer.expandAll();
}
catch (Exception ex)
{
}
}
});
}
catch (Exception ex)
{
}
}
};
public OrdersView()
{
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus()
{
}
@Override
public void dispose()
{
IModel.INSTANCE.getBusinessDay().eAdapters().remove(businessDayAdapter);
super.dispose();
}
/**
* This is a callback that will allow us to create the viewer and initialize it.
*/
@Override
public void createPartControl(Composite parent)
{
BusinessDay businessDay = IModel.INSTANCE.getBusinessDay();
businessDay.eAdapters().add(businessDayAdapter);
{
treeViewer = new TreeViewer(parent, SWT.NONE);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
Object object = ((IStructuredSelection)event.getSelection()).getFirstElement();
if (object instanceof OrderDetail)
{
OrderDetail orderDetail = (OrderDetail)object;
IModel.INSTANCE.modify(orderDetail, new ITransactionalOperation<OrderDetail>()
{
public Object execute(OrderDetail orderDetail)
{
orderDetail
.setState(orderDetail.getState() == OrderState.ORDERED ? OrderState.SERVED : OrderState.ORDERED);
return null;
}
});
treeViewer.refresh(true);
}
}
});
Tree tree = treeViewer.getTree();
tree.setToolTipText("Klicken um Zustand zu wechseln");
tree.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_BLUE));
tree.setFont(SWTResourceManager.getFont("Segoe UI", 16, SWT.BOLD));
{
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
TreeColumn trclmnTitel = treeViewerColumn.getColumn();
trclmnTitel.setToolTipText("Klicken um Zustand zu wechseln");
trclmnTitel.setWidth(400);
trclmnTitel.setText("Angebot");
}
{
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
TreeColumn trclmnQuantity = treeViewerColumn.getColumn();
trclmnQuantity.setResizable(false);
trclmnQuantity.setAlignment(SWT.RIGHT);
trclmnQuantity.setWidth(50);
trclmnQuantity.setText("Menge");
}
{
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
TreeColumn trclmnPreis = treeViewerColumn.getColumn();
trclmnPreis.setAlignment(SWT.RIGHT);
trclmnPreis.setResizable(false);
trclmnPreis.setWidth(100);
trclmnPreis.setText("Preis");
}
{
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE);
TreeColumn trclmnSumme = treeViewerColumn.getColumn();
trclmnSumme.setAlignment(SWT.RIGHT);
trclmnSumme.setResizable(false);
trclmnSumme.setWidth(100);
trclmnSumme.setText("Summe");
}
treeViewer.setContentProvider(new AdapterFactoryContentProvider(FACTORY)
{
@Override
public Object[] getElements(Object object)
{
return getChildren(object);
}
@Override
public Object[] getChildren(Object object)
{
Department department = (Department)IModel.INSTANCE.getStation();
if (object instanceof BusinessDay)
{
BusinessDay businessDay = (BusinessDay)object;
List<Object> result = new ArrayList<Object>();
for (Order order : businessDay.getOrders())
{
for (OrderDetail orderDetail : order.getOrderDetails())
{
if (orderDetail.getState() == OrderState.ORDERED)
{
Product product = orderDetail.getOffering().getProduct();
if (product != null)
{
if (product.getDepartment() != department)
{
continue;
}
}
result.add(order);
break;
}
}
}
return result.toArray();
}
if (object instanceof Order)
{
Order order = (Order)object;
List<Object> result = new ArrayList<Object>();
for (OrderDetail orderDetail : order.getOrderDetails())
{
Product product = orderDetail.getOffering().getProduct();
if (product == null || product.getDepartment() == department)
{
result.add(orderDetail);
}
}
return result.toArray();
}
return super.getChildren(object);
}
@Override
public boolean hasChildren(Object object)
{
return getChildren(object).length != 0;
}
});
treeViewer.setLabelProvider(new FontAndColorProvider(FACTORY, treeViewer)
{
@Override
public String getColumnText(Object object, int columnIndex)
{
if (object instanceof Order)
{
Order order = (Order)object;
switch (columnIndex)
{
case 0:
return order.getTable().getStationID();
case 1:
case 2:
case 3:
return "";
}
}
if (object instanceof OrderDetail)
{
OrderDetail orderDetail = (OrderDetail)object;
switch (columnIndex)
{
case 0:
return orderDetail.getOffering().getName();
case 1:
return "" + orderDetail.getQuantity() + "x";
case 2:
return formatPrice(orderDetail.getOffering().getPrice());
case 3:
return formatPrice(orderDetail.getOffering().getPrice() * orderDetail.getQuantity());
}
}
return super.getColumnText(object, columnIndex);
}
@Override
public Image getColumnImage(Object object, int columnIndex)
{
if (columnIndex == 0 && object instanceof OrderDetail)
{
OrderDetail orderDetail = (OrderDetail)object;
if (orderDetail.getState() == OrderState.ORDERED)
{
return ResourceManager.getPluginImage("org.gastro.rcp.department", "icons/ordered.gif");
}
return ResourceManager.getPluginImage("org.gastro.rcp.department", "icons/served.gif");
}
return null;
}
@Override
public Color getForeground(Object object, int columnIndex)
{
if (object instanceof OrderDetail)
{
OrderDetail orderDetail = (OrderDetail)object;
if (orderDetail.getState() != OrderState.ORDERED)
{
return treeViewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
}
return super.getForeground(object, columnIndex);
}
private String formatPrice(float price)
{
return NumberFormat.getCurrencyInstance().format(price);
}
});
treeViewer.setInput(businessDay);
treeViewer.expandAll();
}
}
}