/*******************************************************************************
* 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 java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
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;
public class DetailDisplay extends Composite {
private org.eclipse.swt.widgets.Tracker mouseTracker;
private final DetailDisplay self;
private final Overview home;
private int actSlot;
private final Menu menu;
private final MenuItem mDelete;
public DetailDisplay(final Composite parent, final Overview h) {
super(parent, SWT.NONE);
self = this;
this.home = h;
addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(final MouseEvent e) {
if (e.button == 1) {
mouseTracker = new org.eclipse.swt.widgets.Tracker(self,
SWT.RESIZE);
Rectangle beg = new Rectangle(e.x, e.y, 5, 5);
mouseTracker.setRectangles(new Rectangle[] { beg });
mouseTracker.open();
Rectangle[] rec = mouseTracker.getRectangles();
if ((rec[0].width > 10) && (rec[0].height > 10)) {
Tracker in = new Tracker(home.pat,
home.trackers[actSlot][0], home.date, actSlot,
rec[0]);
Tracker[] tOld = home.trackers[actSlot];
Tracker[] tNew = new Tracker[tOld.length + 1];
for (int i = 0; i < tOld.length; i++) {
tNew[i] = tOld[i];
}
tNew[tOld.length] = in;
home.trackers[actSlot] = tNew;
self.redraw();
}
} else {
Tracker[] myTracker = home.trackers[actSlot];
int t = Tracker.getTrackerAtPoint(myTracker, e.x, e.y);
if (t > 0) {
setMenu(menu);
menu.setData(t);
} else {
setMenu(null);
}
super.mouseDown(e);
}
}
@Override
public void mouseDoubleClick(final MouseEvent e) {
Tracker[] myTracker = home.trackers[actSlot];
List<Tracker> list = Tracker.getTrackersAtPoint(myTracker, e.x,
e.y);
if (list.size() > 0) {
home.tmd.setTracker(list);
home.setTopControl(home.tmd);
}
}
});
addPaintListener(new PaintListener() {
public void paintControl(final PaintEvent e) {
GC gc = e.gc;
if (CoreHub.acl.request(MolemaxACL.SEE_IMAGES)) {
Tracker[] myTracker = home.trackers[actSlot];
if (myTracker != null) {
for (int i = 0; i < myTracker.length; i++) {
if (myTracker[i] != null) {
Image img = myTracker[i].createImage();
Rectangle bounds = myTracker[i].getBounds();
if (bounds != null) {
if (img == null) {
gc.drawRectangle(bounds);
} else {
if (i == 0) {
gc.drawImage(img, bounds.x,
bounds.y);
} else {
ImageData idata = img
.getImageData();
if (idata != null) {
double scale = (double) bounds.width
/ idata.width;
gc.drawImage(
img,
0,
0,
idata.width,
idata.height,
bounds.x,
bounds.y,
(int) Math
.round(idata.width
* scale),
(int) Math
.round(idata.height
* scale));
}
}
}
}
}
}
}
} else {
SWTHelper.writeCentered(gc, ImageSlot.INSUFF_RIGHTS,
getBounds());
}
}
});
DropTarget dt = new DropTarget(this, DND.DROP_COPY);
dt.setTransfer(new Transfer[] { FileTransfer.getInstance() });
dt.addDropListener(new DropTargetAdapter() {
@Override
public void drop(final DropTargetEvent event) {
if (!CoreHub.acl.request(MolemaxACL.CHANGE_IMAGES)) {
SWTHelper
.alert(ImageSlot.CAPTION_NOOP, ImageSlot.TEXT_NOOP);
return;
}
Tracker[] myTracker = home.trackers[actSlot];
Point pC = self.toControl(event.x, event.y);
int t = Tracker.getTrackerAtPoint(myTracker, pC.x, pC.y);
if (t > 0) {
String[] files = (String[]) event.data;
Tracker tracker = myTracker[t];
Image img = tracker.createImage();
if (img == null) {
tracker.setFile(new File(files[0]));
} else {
Tracker in = new Tracker(home.pat, myTracker[0], null,
actSlot, myTracker[t].getBounds());
in.setFile(new File(files[0]));
Tracker[] tOld = home.trackers[actSlot];
Tracker[] tNew = new Tracker[tOld.length + 1];
for (int i = 0; i < tOld.length; i++) {
tNew[i] = tOld[i];
}
tNew[tOld.length] = in;
home.trackers[actSlot] = tNew;
self.redraw();
}
redraw();
}
}
@Override
public void dragEnter(final DropTargetEvent event) {
event.detail = DND.DROP_COPY;
}
@Override
public void dragOver(final DropTargetEvent event) {
Tracker[] myTracker = home.trackers[actSlot];
Point pC = self.toControl(event.x, event.y);
int t = Tracker.getTrackerAtPoint(myTracker, pC.x, pC.y);
if (t == 0) {
event.detail = DND.DROP_NONE;
} else {
event.detail = DND.DROP_COPY;
}
}
});
menu = new Menu(this);
mDelete = new MenuItem(menu, SWT.NONE);
mDelete.setText(Messages.DetailDisplay_deleteFrame);
mDelete.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
if (SWTHelper.askYesNo(
Messages.DetailDisplay_deleteFrameAndImage,
Messages.DetailDisplay_deleteReally)) {
Integer t = (Integer) ((MenuItem) e.getSource())
.getParent().getData();
Tracker[] myTracker = home.trackers[actSlot];
myTracker[t].delete();
Tracker[] tNew = new Tracker[myTracker.length - 1];
for (int i = 0, j = 0; i < myTracker.length; i++) {
if (i == t) {
continue;
}
tNew[j++] = myTracker[i];
}
home.trackers[actSlot] = tNew;
self.redraw();
}
}
});
setUser();
}
public void setUser() {
mDelete.setEnabled(CoreHub.acl.request(MolemaxACL.CHANGE_IMAGES));
}
void setslot(final int slot) {
actSlot = slot;
Tracker[] myTracker = home.trackers[actSlot];
if (myTracker.length > 0) {
Image img = myTracker[0].createImage();
if (img != null) {
ImageData imd = img.getImageData();
setSize(imd.width + getBorderWidth(), imd.height);
getParent().layout(true);
}
redraw();
}
}
}