/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* 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:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.acquire.explorer.gui.central.tumbnail;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import javax.swing.event.ListSelectionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.acquire.explorer.AcquireImageInfo;
import org.weasis.acquire.explorer.AcquireManager;
import org.weasis.acquire.explorer.core.bean.SeriesGroup;
import org.weasis.acquire.explorer.gui.central.AcquireTabPanel;
import org.weasis.base.explorer.list.AThumbnailListPane;
import org.weasis.base.explorer.list.IThumbnailModel;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.api.media.data.MediaElement;
import org.weasis.core.api.media.data.MediaReader;
import org.weasis.core.api.media.data.Series;
import org.weasis.core.ui.editor.ViewerPluginBuilder;
import org.weasis.core.ui.util.UriListFlavor;
public class AcquireCentralTumbnailPane<E extends MediaElement> extends AThumbnailListPane<E> {
private static final long serialVersionUID = 5728507793866004078L;
private static final Logger LOGGER = LoggerFactory.getLogger(AcquireCentralTumbnailPane.class);
public AcquireCentralTumbnailPane(List<E> list) {
super(new AcquireCentralThumnailList<E>());
setList(list);
setTransferHandler(new SequenceHandler());
}
public void setAcquireTabPanel(AcquireTabPanel acquireTabPanel) {
((AcquireCentralThumnailList) this.thumbnailList).setAcquireTabPanel(acquireTabPanel);
}
public void addListSelectionListener(ListSelectionListener listener) {
this.thumbnailList.addListSelectionListener(listener);
}
public void addElements(List<E> elements) {
if (elements != null) {
IThumbnailModel<E> model = this.thumbnailList.getThumbnailListModel();
elements.forEach(model::addElement);
repaintList();
}
}
public void setList(List<E> elements) {
IThumbnailModel<E> model = this.thumbnailList.getThumbnailListModel();
model.clear();
if (elements != null) {
elements.forEach(model::addElement);
repaintList();
}
}
public void repaintList() {
// Require to repaint the scroll pane correctly (otherwise not all the elements of JList are repainted)
if(thumbnailList.asComponent() instanceof JComponent){
((JComponent) thumbnailList.asComponent()).updateUI();
}
}
private class SequenceHandler extends TransferHandler {
private static final long serialVersionUID = -9199885304640621515L;
public SequenceHandler() {
super("series"); //$NON-NLS-1$
}
@Override
public Transferable createTransferable(JComponent comp) {
return null;
}
@Override
public boolean canImport(TransferSupport support) {
if (!support.isDrop()) {
return false;
}
if (AcquireManager.getInstance().getAcquireExplorer().getImportPanel().isLoading()) {
return false;
}
if (support.isDataFlavorSupported(Series.sequenceDataFlavor)
|| support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| support.isDataFlavorSupported(UriListFlavor.flavor)) {
return true;
}
return false;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public boolean importData(TransferSupport support) {
if (!canImport(support)) {
return false;
}
Transferable transferable = support.getTransferable();
List<File> files = null;
// Not supported on Linux
if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
try {
files = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
} catch (Exception e) {
LOGGER.error("Drop image file", e); //$NON-NLS-1$
}
return dropDFiles(files);
}
// When dragging a file or group of files from a Gnome or Kde environment
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4899516
else if (support.isDataFlavorSupported(UriListFlavor.flavor)) {
try {
// Files with spaces in the filename trigger an error
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6936006
String val = (String) transferable.getTransferData(UriListFlavor.flavor);
files = UriListFlavor.textURIListToFileList(val);
} catch (Exception e) {
LOGGER.error("Drop image URI", e); //$NON-NLS-1$
}
return dropDFiles(files);
}
try {
Object object = transferable.getTransferData(Series.sequenceDataFlavor);
if (object instanceof Series) {
MediaElement media = ((Series) object).getMedia(0, null, null);
addToSerie(media);
}
} catch (UnsupportedFlavorException | IOException e) {
LOGGER.error("Drop thumnail", e); //$NON-NLS-1$
}
return true;
}
@SuppressWarnings("rawtypes")
private void addToSerie(MediaElement media) {
if (media instanceof ImageElement) {
AcquireCentralThumnailList tumbList =
(AcquireCentralThumnailList) AcquireCentralTumbnailPane.this.thumbnailList;
AcquireImageInfo info = AcquireManager.findByImage((ImageElement) media);
if (info != null) {
SeriesGroup seriesGroup = Optional.ofNullable(tumbList.getSelectedSerie()).map(b -> b.getSerie())
.orElseGet(AcquireManager::getDefaultSeries);
AcquireManager.importImage(info, seriesGroup, 0);
}
}
}
@SuppressWarnings("rawtypes")
private boolean dropDFiles(List<File> files) {
if (files != null) {
for (File file : files) {
MediaReader reader = ViewerPluginBuilder.getMedia(file, false);
if (reader != null && !reader.getMediaFragmentMimeType().contains("dicom")) { //$NON-NLS-1$
MediaElement[] medias = reader.getMediaElement();
if (medias != null) {
for (MediaElement mediaElement : medias) {
addToSerie(mediaElement);
}
}
}
}
return true;
}
return false;
}
}
}