/*******************************************************************************
* Copyright (c) 2007-2014 G. Weirich, A. Brögli and A. Häffner.
* 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:
* rgw - initial API and implementation
* rgw - 2014: Changes for Elexis 2.x
******************************************************************************/
package ch.elexis.molemax.views;
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.molemax.data.MolemaxACL;
import ch.elexis.molemax.data.Tracker;
import ch.elexis.core.ui.util.SWTHelper;
import ch.rgw.tools.TimeTool;
public class ImageSlot extends Composite implements DropTargetListener {
// slots
public static final int LEFT_1 = 0;
public static final int FRONT_1 = 1;
public static final int RIGHT_1 = 2;
public static final int BACK_1 = 3;
public static final int LEFT_2 = 4;
public static final int FRONT_2 = 5;
public static final int RIGHT_2 = 6;
public static final int BACK_2 = 7;
public static final int LEFT_3 = 8;
public static final int FRONT_3 = 9;
public static final int RIGHT_3 = 10;
public static final int BACK_3 = 11;
public static final String CAPTION_NOOP = Messages.ImageSlot_notPermitted;
public static final String TEXT_NOOP = Messages.ImageSlot_insufficientRights;
public static final String INSUFF_RIGHTS = Messages.ImageSlot_insufficientRights2;
private Tracker[] myTracker;
final int mySlot;
private final Overview home;
private final MenuItem mDelete;
public ImageSlot(final Overview home, final Composite parent,
final int slotNr) {
super(parent, SWT.BORDER);
DropTarget dt = new DropTarget(this, DND.DROP_COPY);
dt.setTransfer(new Transfer[] { FileTransfer.getInstance() });
dt.addDropListener(this);
setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
myTracker = home.trackers[slotNr];
mySlot = slotNr;
this.home = home;
addPaintListener(new PaintListener() {
public void paintControl(final PaintEvent e) {
GC gc = e.gc;
double scale = 1.0;
if ((myTracker.length > 0) && (myTracker[0] != null)) {
Point pt = getSize();
if (CoreHub.acl.request(MolemaxACL.SEE_IMAGES)) {
Image img = myTracker[0].createImage();
if (img != null) {
ImageData idata = img.getImageData();
if (idata != null) {
scale = (double) pt.x / (double) idata.width;
gc.drawImage(img, 0, 0, idata.width,
idata.height, 0, 0,
(int) Math.round(idata.width * scale),
(int) Math.round(idata.height * scale));
}
}
} else {
SWTHelper.writeCentered(gc, INSUFF_RIGHTS,
new Rectangle(0, 0, pt.x, pt.y));
}
}
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(final MouseEvent e) {
if (e.button == 1) {
ImageSlot ims = (ImageSlot) e.getSource();
home.dispRow.rightContents.setslot(ims.mySlot);
home.setTopControl(home.dispRow);
home.dispRow.setRow(ims.mySlot % 4);
}
}
});
Menu menu = new Menu(this);
mDelete = new MenuItem(menu, SWT.NONE);
mDelete.setText(Messages.ImageSlot_delete);
mDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
int num = myTracker.length;
String question = Messages.ImageSlot_reallydelete;
if (num > 1) {
question = Messages.ImageSlot_these + Integer.toString(num)
+ Messages.ImageSlot_imagesdelete;
}
if (SWTHelper.askYesNo(Messages.ImageSlot_imageDel, question)) {
Tracker.delete(myTracker);
redraw();
}
}
});
setMenu(menu);
setUser();
}
public void setUser() {
mDelete.setEnabled(CoreHub.acl.request(MolemaxACL.CHANGE_IMAGES));
}
public void dragEnter(final DropTargetEvent event) {
event.detail = DND.DROP_COPY;
}
public void dragLeave(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void dragOperationChanged(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void dragOver(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void drop(final DropTargetEvent event) {
if (CoreHub.acl.request(MolemaxACL.CHANGE_IMAGES)) {
String[] files = (String[]) event.data;
TimeTool today = new TimeTool();
TimeTool seq = new TimeTool(home.date);
long diff = today.diff(seq, 60000 * 60 * 24);
if (diff > 1) {
if (SWTHelper.askYesNo(Messages.ImageSlot_newsequence,
Messages.ImageSlot_chosensequenceis + diff
+ Messages.ImageSlot_daysold)) {
home.setPatient(home.pat, today.toString(TimeTool.DATE_GER));
}
}
for (String file : files) {
if (myTracker.length == 0) {
myTracker = new Tracker[1];
myTracker[0] = new Tracker(home.pat, home.date, mySlot,
new File(file));
} else {
if (SWTHelper.askYesNo(Messages.ImageSlot_replace,
Messages.ImageSlot_deleteall)) {
Tracker.delete(myTracker);
myTracker = new Tracker[1];
myTracker[0] = new Tracker(home.pat, home.date, mySlot,
new File(file));
}
}
}
redraw();
} else {
SWTHelper.alert(CAPTION_NOOP, TEXT_NOOP);
}
}
public void dropAccept(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void setImage(final File file) {
if (CoreHub.acl.request(MolemaxACL.CHANGE_IMAGES)) {
if (file.getName().startsWith("base")) {
if (myTracker.length != 0) {
if (SWTHelper.askYesNo(Messages.ImageSlot_replace,
Messages.ImageSlot_deleteall)) {
Tracker.delete(myTracker);
} else {
return;
}
}
myTracker = new Tracker[1];
myTracker[0] = new Tracker(home.pat, home.date, mySlot, file);
// myTracker[0].setFile(file);
} else {
if (myTracker.length == 0) {
SWTHelper.showError("Fehlerhafte Struktur",
"Dieses Verzeichnis "
+ file.getParentFile().getAbsolutePath()
+ " enthält kein Basisbild");
} else {
String[] koord = file.getName().split("-");
Rectangle rec = new Rectangle(Integer.parseInt(koord[0]),
Integer.parseInt(koord[1]),
Integer.parseInt(koord[2]),
Integer.parseInt(koord[3]));
Tracker t = new Tracker(home.pat, myTracker[0], home.date,
mySlot, rec);
Tracker[] tOld = home.trackers[mySlot];
Tracker[] tNew = new Tracker[tOld.length + 1];
for (int i = 0; i < tOld.length; i++) {
tNew[i] = tOld[i];
}
tNew[tOld.length] = t;
home.trackers[mySlot] = tNew;
t.setFile(file);
}
}
}
}
}