/*******************************************************************************
* 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.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.weasis.acquire.explorer.AcquireImageInfo;
import org.weasis.acquire.explorer.AcquireManager;
import org.weasis.acquire.explorer.Messages;
import org.weasis.acquire.explorer.core.bean.SeriesGroup;
import org.weasis.acquire.explorer.gui.central.AcquireTabPanel;
import org.weasis.acquire.explorer.gui.central.SerieButton;
import org.weasis.acquire.explorer.gui.dialog.AcquireNewSerieDialog;
import org.weasis.base.explorer.list.AThumbnailList;
import org.weasis.base.explorer.list.IThumbnailModel;
import org.weasis.core.api.gui.util.JMVUtils;
import org.weasis.core.api.image.ImageOpNode;
import org.weasis.core.api.image.RotationOp;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.api.media.data.MediaElement;
import org.weasis.core.api.util.StringUtil;
import org.weasis.core.ui.util.DefaultAction;
@SuppressWarnings({ "serial" })
public class AcquireCentralThumnailList<E extends MediaElement> extends AThumbnailList<E> {
private AcquireTabPanel acquireTabPanel;
public AcquireCentralThumnailList() {
super();
}
@Override
public IThumbnailModel<E> newModel() {
return new AcquireCentralThumbnailModel<>(this);
}
public void setAcquireTabPanel(AcquireTabPanel acquireTabPanel) {
this.acquireTabPanel = acquireTabPanel;
}
public SerieButton getSelectedSerie() {
if (acquireTabPanel != null) {
return acquireTabPanel.getSelected();
}
return null;
}
@Override
public void registerDragListeners() {
// No drag capabilities
}
@Override
public void openSelection() {
for (E s : getSelectedValuesList()) {
openSelection(Arrays.asList(s), true, true, false);
}
}
@Override
public JPopupMenu buidContexMenu(final MouseEvent e) {
final List<E> medias = getSelected(e);
if (!medias.isEmpty()) {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem(
new DefaultAction(Messages.getString("AcquireCentralThumnailList.edit"), event -> openSelection()))); //$NON-NLS-1$
popupMenu
.add(new JMenuItem(new DefaultAction(Messages.getString("AcquireCentralThumnailList.remove"), event -> { //$NON-NLS-1$
clearSelection();
AcquireManager.getInstance().removeMedias(medias);
repaint();
})));
JMenu moveToMenu = new JMenu(Messages.getString("AcquireCentralThumnailList.moveto")); //$NON-NLS-1$
moveToOther(moveToMenu, medias);
moveToMenu.addSeparator();
moveToExisting(moveToMenu, medias);
if (moveToMenu.getItemCount() > 3) {
moveToMenu.addSeparator();
}
moveToNewSerie(moveToMenu, medias);
JMenu operationsMenu = new JMenu(Messages.getString("AcquireCentralThumnailList.operations")); //$NON-NLS-1$
operationRotate(operationsMenu, medias, Messages.getString("AcquireCentralThumnailList.rotate") //$NON-NLS-1$
+ StringUtil.COLON_AND_SPACE + Messages.getString("AcquireCentralThumnailList.plus90"), 90); //$NON-NLS-1$
operationRotate(operationsMenu, medias, Messages.getString("AcquireCentralThumnailList.rotate") //$NON-NLS-1$
+ StringUtil.COLON_AND_SPACE + Messages.getString("AcquireCentralThumnailList.min90"), 270); //$NON-NLS-1$
popupMenu.add(moveToMenu);
// TODO need do better
// popupMenu.add(operationsMenu);
return popupMenu;
}
return null;
}
private void moveToExisting(JMenu moveToMenu, final List<E> medias) {
AcquireCentralThumnailList.this.acquireTabPanel.getSeries().stream().forEach(s -> {
if (!s.equals(AcquireCentralThumnailList.this.acquireTabPanel.getSelected().getSerie())
&& !SeriesGroup.Type.NONE.equals(s.getType())) {
moveToMenu.add(new JMenuItem(new DefaultAction(s.getDisplayName(), event -> {
AcquireCentralThumnailList.this.acquireTabPanel.moveElements(s,
AcquireManager.toAcquireImageInfo(medias));
repaint();
})));
}
});
}
private void moveToOther(JMenu moveToMenu, final List<E> medias) {
moveToMenu.add(new JMenuItem(new DefaultAction(SeriesGroup.DEFAULT_SERIE_NAME, event -> {
AcquireCentralThumnailList.this.acquireTabPanel.moveElements(AcquireManager.getDefaultSeries(),
AcquireManager.toAcquireImageInfo(medias));
repaint();
})));
}
private void moveToNewSerie(JMenu moveToMenu, final List<E> medias) {
moveToMenu
.add(new JMenuItem(new DefaultAction(Messages.getString("AcquireCentralThumnailList.new_series"), event -> { //$NON-NLS-1$
JDialog dialog = new AcquireNewSerieDialog(AcquireCentralThumnailList.this.acquireTabPanel,
AcquireManager.toImageElement(medias));
JMVUtils.showCenterScreen(dialog, AcquireCentralThumnailList.this.acquireTabPanel);
repaint();
})));
}
private void operationRotate(JMenu operationsMenu, final List<E> medias, String label, final int angle) {
operationsMenu.add(new JMenuItem(new DefaultAction(label,
event -> medias.stream().filter(ImageElement.class::isInstance).map(ImageElement.class::cast).forEach(i -> {
AcquireImageInfo info = AcquireManager.findByImage(i);
int change = (info.getNextValues().getFullRotation() + angle >= 0)
? info.getNextValues().getRotation() + angle : info.getNextValues().getRotation() + 360 + angle;
info.getNextValues().setRotation(change);
ImageOpNode node = info.getPreProcessOpManager().getNode(RotationOp.OP_NAME);
if (node == null) {
node = new RotationOp();
info.addPreProcessImageOperationAction(node);
} else {
node.clearIOCache();
}
node.setParam(RotationOp.P_ROTATE, info.getNextValues().getFullRotation());
}))));
}
@Override
public void mouseClickedEvent(MouseEvent e) {
if (e.getClickCount() == 2) {
openSelection();
}
}
public void updateAll() {
acquireTabPanel.clearUnusedSeries(AcquireManager.getBySeries());
acquireTabPanel.setSelected(acquireTabPanel.getSelected());
acquireTabPanel.revalidate();
acquireTabPanel.repaint();
}
@Override
public void jiThumbnailKeyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_PAGE_DOWN:
nextPage(e);
break;
case KeyEvent.VK_PAGE_UP:
lastPage(e);
break;
case KeyEvent.VK_ENTER:
openSelection();
e.consume();
break;
case KeyEvent.VK_DELETE:
List<E> selected = getSelectedValuesList();
if (!selected.isEmpty()) {
List<AcquireImageInfo> list = AcquireManager.toAcquireImageInfo(selected);
clearSelection();
AcquireManager.getInstance().removeImages(list);
}
break;
}
}
}