package name.abuchen.portfolio.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.ui.util.Colors;
public abstract class AbstractFinanceView
{
private PortfolioPart part;
private IEclipseContext context;
private Composite top;
private Label title;
private LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources());
private List<Menu> contextMenus = new ArrayList<>();
protected abstract String getDefaultTitle();
protected String getTitle()
{
return title.getText();
}
protected final void updateTitle(String title)
{
this.title.setText(title);
}
/** called when some other view modifies the model */
public void notifyModelUpdated()
{}
public void init(PortfolioPart part, Object parameter)
{
this.part = part;
}
public PortfolioPart getPart()
{
return part;
}
public IPreferenceStore getPreferenceStore()
{
return part.getPreferenceStore();
}
/* package */void setContext(IEclipseContext context)
{
this.context = context;
}
/* package */IEclipseContext getContext()
{
return this.context;
}
public Client getClient()
{
return part.getClient();
}
public void markDirty()
{
part.markDirty();
}
public Shell getActiveShell()
{
return Display.getDefault().getActiveShell();
}
public final void createViewControl(Composite parent)
{
top = new Composite(parent, SWT.NONE);
// on windows, add a spacing line as tables
// have white top and need a border
int spacing = Platform.OS_WIN32.equals(Platform.getOS()) ? 1 : 0;
GridLayoutFactory.fillDefaults().spacing(spacing, spacing).applyTo(top);
Control header = createHeader(top);
GridDataFactory.fillDefaults().grab(true, false).applyTo(header);
Control body = createBody(top);
GridDataFactory.fillDefaults().grab(true, true).applyTo(body);
top.addDisposeListener(e -> dispose());
}
protected abstract Control createBody(Composite parent);
private Control createHeader(Composite parent)
{
Composite header = new Composite(parent, SWT.NONE);
header.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
Font boldFont = resourceManager.createFont(FontDescriptor
.createFrom(JFaceResources.getFont(JFaceResources.HEADER_FONT)).setStyle(SWT.BOLD));
title = new Label(header, SWT.NONE);
title.setText(getDefaultTitle());
title.setFont(boldFont);
title.setForeground(resourceManager.createColor(Colors.HEADINGS.swt()));
title.setBackground(header.getBackground());
ToolBar toolBar = new ToolBar(header, SWT.FLAT | SWT.RIGHT);
toolBar.setBackground(header.getBackground());
addButtons(toolBar);
// layout
GridLayoutFactory.fillDefaults().numColumns(2).margins(5, 5).applyTo(header);
GridDataFactory.fillDefaults().grab(true, false).applyTo(title);
GridDataFactory.fillDefaults().applyTo(toolBar);
return header;
}
protected void addButtons(ToolBar toolBar)
{}
protected final void hookContextMenu(Control control, IMenuListener listener)
{
doCreateContextMenu(control, true, listener);
}
protected final Menu createContextMenu(Control control, IMenuListener listener)
{
return doCreateContextMenu(control, false, listener);
}
private final Menu doCreateContextMenu(Control control, boolean hook, IMenuListener listener)
{
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(listener);
Menu contextMenu = menuMgr.createContextMenu(control);
if (hook)
control.setMenu(contextMenu);
contextMenus.add(contextMenu);
return contextMenu;
}
public void dispose()
{
for (Menu contextMenu : contextMenus)
if (!contextMenu.isDisposed())
contextMenu.dispose();
resourceManager.dispose();
}
public final Control getControl()
{
return top;
}
public void setFocus()
{
getControl().setFocus();
}
public <T> T make(Class<T> type, Object... parameters)
{
if (parameters == null || parameters.length == 0)
return ContextInjectionFactory.make(type, this.context);
IEclipseContext c2 = EclipseContextFactory.create();
for (Object param : parameters)
c2.set(param.getClass().getName(), param);
return ContextInjectionFactory.make(type, this.context, c2);
}
}