package ch.elexis.global_inbox;
import java.io.File;
import java.text.MessageFormat;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.services.GlobalServiceDescriptors;
import ch.elexis.core.data.services.IDocumentManager;
import ch.elexis.core.data.util.Extensions;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.text.GenericDocument;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.data.Patient;
import ch.rgw.io.FileTool;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.TimeTool;
public class InboxView extends ViewPart {
private TableViewer tv;
private IAction addAction, deleteAction, execAction, reloadAction;
String[] columnHeaders = new String[] {
Messages.InboxView_category, Messages.InboxView_title
};
TableColumn[] tc;
private IStatus inboxConfigStat;
private boolean configErrorShown = false;
public InboxView(){
// TODO Auto-generated constructor stub
}
@Override
public void createPartControl(Composite parent){
Table table = new Table(parent, SWT.FULL_SELECTION);
tv = new TableViewer(table);
tc = new TableColumn[columnHeaders.length];
for (int i = 0; i < tc.length; i++) {
tc[i] = new TableColumn(table, SWT.NONE);
tc[i].setText(columnHeaders[i]);
tc[i].setWidth(100);
}
table.setHeaderVisible(true);
table.setLinesVisible(true);
InboxContentProvider cp = Activator.getDefault().getContentProvider();
makeActions();
tv.setContentProvider(cp);
tv.setLabelProvider(new InboxLabelProvider());
tv.setSorter(new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2){
File f1 = (File) e1;
File f2 = (File) e2;
return f1.getAbsolutePath().compareTo(f2.getAbsolutePath());
}
});
tv.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event){
IStructuredSelection sel = (IStructuredSelection) tv.getSelection();
addAction.setEnabled(!sel.isEmpty());
deleteAction.setEnabled(!sel.isEmpty());
execAction.setEnabled(!sel.isEmpty());
}
});
cp.setView(this);
inboxConfigStat = cp.reload();
tv.setInput(this);
final MenuManager mgr = new MenuManager();
mgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager){
mgr.add(addAction);
mgr.add(execAction);
mgr.add(new Separator());
mgr.add(deleteAction);
}
});
mgr.setRemoveAllWhenShown(true);
table.setMenu(mgr.createContextMenu(table));
ViewMenus menus = new ViewMenus(getViewSite());
menus.createToolbar(addAction, execAction, reloadAction, null, deleteAction);
addAction.setEnabled(false);
deleteAction.setEnabled(false);
execAction.setEnabled(false);
}
@Override
public void dispose(){
Activator.getDefault().getContentProvider().setView(null);
super.dispose();
}
@Override
public void setFocus(){
if (!inboxConfigStat.isOK() && !configErrorShown) {
SWTHelper.alert(Messages.Activator_noInbox,
Messages.InboxContentProvider_noInboxDefined);
configErrorShown = true;
}
}
public void reload(){
UiDesk.asyncExec(new Runnable() {
@Override
public void run(){
tv.refresh();
}
});
}
public File getSelection(){
IStructuredSelection sel = (IStructuredSelection) tv.getSelection();
if (sel.isEmpty()) {
return null;
}
return (File) sel.getFirstElement();
}
private void makeActions(){
addAction = new Action(Messages.InboxView_assign) {
{
setToolTipText(Messages.InboxView_assignThisDocument);
setImageDescriptor(Images.IMG_OK.getImageDescriptor());
}
@Override
public void run(){
File sel = getSelection();
Patient pat = ElexisEventDispatcher.getSelectedPatient();
if (sel != null && pat != null) {
long heapSize = Runtime.getRuntime().totalMemory();
long length = sel.length();
if (length >= heapSize) {
MessageDialog.openInformation(UiDesk.getTopShell(), "Fehler bei Import",
"Kann " + sel.getAbsolutePath()
+ " nicht importieren, da groesser heap size. (#3652)");
return;
}
if (SWTHelper.askYesNo(
Messages.InboxView_inbox,
MessageFormat.format(Messages.InboxView_assignxtoy, sel.getName(),
pat.getLabel()))) {
IDocumentManager dm =
(IDocumentManager) Extensions
.findBestService(GlobalServiceDescriptors.DOCUMENT_MANAGEMENT);
try {
String cat = Activator.getDefault().getCategory(sel);
if (cat.equals("-")) {
cat = "";
}
tv.remove(sel);
GenericDocument fd =
new GenericDocument(pat, sel.getName(), cat, sel,
new TimeTool().toString(TimeTool.DATE_GER), "", null);
boolean bSucc = sel.delete();
sel = null;
dm.addDocument(fd);
fd = null;
Activator.getDefault().getContentProvider().reload();
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.alert(Messages.InboxView_error, ex.getMessage());
}
}
}
}
};
deleteAction = new Action(Messages.InboxView_delete) {
{
setToolTipText(Messages.InboxView_reallydelete);
setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
}
@Override
public void run(){
File sel = getSelection();
if (SWTHelper.askYesNo(Messages.InboxView_inbox,
MessageFormat.format(Messages.InboxView_thisreallydelete, sel.getName()))) {
sel.delete();
reloadInbox();
}
}
};
execAction = new Action(Messages.InboxView_view) {
{
setToolTipText(Messages.InboxView_viewThisDocument);
setImageDescriptor(Images.IMG_EDIT.getImageDescriptor());
}
@Override
public void run(){
try {
File sel = getSelection();
String ext = FileTool.getExtension(sel.getName());
Program proggie = Program.findProgram(ext);
String arg = sel.getAbsolutePath();
if (proggie != null) {
proggie.execute(arg);
} else {
if (Program.launch(sel.getAbsolutePath()) == false) {
Runtime.getRuntime().exec(arg);
}
}
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.InboxView_couldNotStart, ex.getMessage());
}
}
};
reloadAction = new Action(Messages.InboxView_reload) {
{
setToolTipText(Messages.InboxView_reloadNow);
setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor());
}
@Override
public void run(){
reloadInbox();
}
};
}
private void reloadInbox(){
IStatus status = Activator.getDefault().getContentProvider().reload();
if (status == Status.CANCEL_STATUS) {
SWTHelper.showError(Messages.InboxView_error, Messages.InvoxView_errorCantDetectInbox);
}
}
}