package name.abuchen.portfolio.ui.views.settings;
import javax.inject.Inject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import name.abuchen.portfolio.model.Bookmark;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.ClientSettings;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.ui.Images;
import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.util.ContextMenu;
import name.abuchen.portfolio.ui.util.DesktopAPI;
import name.abuchen.portfolio.ui.util.viewers.Column;
import name.abuchen.portfolio.ui.util.viewers.ColumnEditingSupport;
import name.abuchen.portfolio.ui.util.viewers.ColumnEditingSupport.ModificationListener;
import name.abuchen.portfolio.ui.util.viewers.ShowHideColumnHelper;
import name.abuchen.portfolio.ui.util.viewers.StringEditingSupport;
public class BookmarksListTab implements SettingsView.Tab, ModificationListener
{
private static final String DEFAULT_URL = "http://example.net/{tickerSymbol}?isin={isin}&wkn={wkn}&name={name}"; //$NON-NLS-1$
private TableViewer bookmarks;
@Inject
private Client client;
@Inject
private IPreferenceStore preferences;
@Override
public CTabItem createTab(CTabFolder folder)
{
Composite container = new Composite(folder, SWT.NONE);
TableColumnLayout layout = new TableColumnLayout();
container.setLayout(layout);
bookmarks = new TableViewer(container, SWT.FULL_SELECTION | SWT.MULTI);
ColumnEditingSupport.prepare(bookmarks);
ShowHideColumnHelper support = new ShowHideColumnHelper(BookmarksListTab.class.getSimpleName() + "@bottom", //$NON-NLS-1$
preferences, bookmarks, layout);
// Create Column for Bookmark
Column column = new Column(Messages.BookmarksListView_bookmark, SWT.None, 150);
column.setLabelProvider(new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
return ((Bookmark) element).getLabel();
}
@Override
public Image getImage(Object element)
{
return Images.TEXT.image();
}
});
new StringEditingSupport(Bookmark.class, "label").addListener(this).attachTo(column); //$NON-NLS-1$
support.addColumn(column);
// Create Column for URL
column = new Column(Messages.BookmarksListView_url, SWT.None, 500);
column.setLabelProvider(new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
return ((Bookmark) element).getPattern();
}
});
new StringEditingSupport(Bookmark.class, "pattern").addListener(this).attachTo(column); //$NON-NLS-1$
support.addColumn(column);
support.createColumns();
bookmarks.getTable().setHeaderVisible(true);
bookmarks.getTable().setLinesVisible(true);
bookmarks.setContentProvider(ArrayContentProvider.getInstance());
bookmarks.setInput(client.getSettings().getBookmarks());
bookmarks.refresh();
new ContextMenu(bookmarks.getTable(), m -> fillContextMenu(m)).hook();
CTabItem item = new CTabItem(folder, SWT.NONE);
item.setText(Messages.BookmarksListView_title);
item.setControl(container);
return item;
}
@Override
public void onModified(Object element, Object newValue, Object oldValue)
{
client.markDirty();
}
private void fillContextMenu(IMenuManager manager)
{
Bookmark bookmark = (Bookmark) ((IStructuredSelection) bookmarks.getSelection()).getFirstElement();
if (bookmark == null)
return;
if (!bookmark.isSeparator())
addTestMenu(manager, bookmark);
addMoveUpAndDownActions(manager, bookmark);
manager.add(new Separator());
manager.add(new Action(Messages.BookmarksListView_insertBefore)
{
@Override
public void run()
{
Bookmark index = (Bookmark) ((IStructuredSelection) bookmarks.getSelection()).getFirstElement();
Bookmark wl = new Bookmark(Messages.BookmarksListView_NewBookmark, DEFAULT_URL);
client.getSettings().insertBookmark(index, wl);
client.markDirty();
bookmarks.setInput(client.getSettings().getBookmarks());
bookmarks.editElement(wl, 0);
}
});
manager.add(new Action(Messages.BookmarksListView_insertAfter)
{
@Override
public void run()
{
Bookmark index = (Bookmark) ((IStructuredSelection) bookmarks.getSelection()).getFirstElement();
Bookmark wl = new Bookmark(Messages.BookmarksListView_NewBookmark, DEFAULT_URL);
client.getSettings().insertBookmarkAfter(index, wl);
client.markDirty();
bookmarks.setInput(client.getSettings().getBookmarks());
bookmarks.editElement(wl, 0);
}
});
manager.add(new Action(Messages.BookmarksListView_addSeparator)
{
@Override
public void run()
{
Bookmark index = (Bookmark) ((IStructuredSelection) bookmarks.getSelection()).getFirstElement();
Bookmark wl = new Bookmark("-", ""); //$NON-NLS-1$ //$NON-NLS-2$
client.getSettings().insertBookmarkAfter(index, wl);
client.markDirty();
bookmarks.setInput(client.getSettings().getBookmarks());
}
});
manager.add(new Separator());
manager.add(new Action(Messages.BookmarksListView_delete)
{
@Override
public void run()
{
ClientSettings settings = client.getSettings();
for (Object element : ((IStructuredSelection) bookmarks.getSelection()).toArray())
settings.removeBookmark((Bookmark) element);
client.markDirty();
bookmarks.setInput(settings.getBookmarks());
}
});
}
private void addTestMenu(IMenuManager manager, Bookmark bookmark)
{
MenuManager securities = new MenuManager(Messages.MenuOpenSecurityOnSite);
for (Security security : client.getSecurities())
{
securities.add(new Action(security.getName())
{
@Override
public void run()
{
DesktopAPI.browse(bookmark.constructURL(security));
}
});
}
manager.add(securities);
manager.add(new Separator());
}
private void addMoveUpAndDownActions(IMenuManager manager, Bookmark bookmark)
{
int index = client.getSettings().getBookmarks().indexOf(bookmark);
if (index > 0)
{
manager.add(new Action(Messages.MenuMoveUp)
{
@Override
public void run()
{
ClientSettings settings = client.getSettings();
settings.removeBookmark(bookmark);
settings.insertBookmark(index - 1, bookmark);
bookmarks.setInput(client.getSettings().getBookmarks());
client.markDirty();
}
});
}
if (index < client.getSettings().getBookmarks().size() - 1)
{
manager.add(new Action(Messages.MenuMoveDown)
{
@Override
public void run()
{
ClientSettings settings = client.getSettings();
settings.removeBookmark(bookmark);
settings.insertBookmark(index + 1, bookmark);
bookmarks.setInput(client.getSettings().getBookmarks());
client.markDirty();
}
});
}
}
@Override
public void showAddMenu(Shell shell)
{
Bookmark wl = new Bookmark(Messages.BookmarksListView_NewBookmark, DEFAULT_URL);
client.getSettings().getBookmarks().add(wl);
client.markDirty();
bookmarks.setInput(client.getSettings().getBookmarks());
bookmarks.editElement(wl, 0);
}
}