/*******************************************************************************
* 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.base.explorer.list;
import java.awt.Dimension;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import javax.swing.JComponent;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import org.weasis.base.explorer.JIExplorerContext;
import org.weasis.core.api.media.data.MediaElement;
import org.weasis.core.api.util.ThreadUtil;
import org.weasis.core.ui.editor.image.DefaultView2d;
@SuppressWarnings("serial")
public abstract class AThumbnailListPane<E extends MediaElement> extends JScrollPane implements IThumbnailListPane<E> {
protected final IThumbnailList<E> thumbnailList;
protected final ExecutorService pool;
public AThumbnailListPane(IThumbnailList<E> thumbList) {
super(thumbList.asComponent(), ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
this.pool = ThreadUtil.buildNewSingleThreadExecutor("Thumbnail List"); //$NON-NLS-1$
this.thumbnailList = thumbList;
this.thumbnailList.addListSelectionListener(new JIListSelectionAdapter());
this.thumbnailList.registerListeners();
this.setPreferredSize(new Dimension(200,200));
this.setAutoscrolls(true);
}
@Override
public void loadDirectory(Path dir) {
JRootPane pane = getRootPane();
Optional.ofNullable(pane).ifPresent(p -> p.setCursor(DefaultView2d.WAIT_CURSOR));
this.pool.execute(() -> {
AThumbnailListPane.this.thumbnailList.getThumbnailListModel().setData(dir);
AThumbnailListPane.this.thumbnailList.setChanged();
AThumbnailListPane.this.thumbnailList.clearChanged();
Optional.ofNullable(pane).ifPresent(p -> p.setCursor(DefaultView2d.DEFAULT_CURSOR));
});
}
final class JIListSelectionAdapter implements javax.swing.event.ListSelectionListener {
JIListSelectionAdapter() {
}
@Override
public void valueChanged(final ListSelectionEvent e) {
final Thread runner = new Thread() {
@Override
public void run() {
SwingUtilities.invokeLater(() -> AThumbnailListPane.this.thumbnailList.listValueChanged(e));
}
};
runner.start();
}
}
public void notifyObservers() {
this.thumbnailList.notifyObservers(null);
}
@Override
public void notifyObservers(final Object arg) {
this.thumbnailList.notifyObservers(arg);
}
@Override
public boolean hasChanged() {
return this.thumbnailList.hasChanged();
}
@Override
public IThumbnailModel<E> getFileListModel() {
return this.thumbnailList.getThumbnailListModel();
}
public JIExplorerContext getReloadContext() {
return this.thumbnailList.getThumbnailListModel().getReloadContext();
}
public void setReloadContext(final JIExplorerContext reloadContext) {
this.thumbnailList.getThumbnailListModel().setReloadContext(reloadContext);
}
public int[] getSelectedIndices() {
return this.thumbnailList.getSelectedIndices();
}
public JComponent getRendererComponent() {
final Object obj = this.thumbnailList.getCellRenderer();
return (obj != null) && (obj instanceof JComponent) ? (JComponent) obj : null;
}
@Override
public void loadDirectory(String pathname) {
loadDirectory(Paths.get(pathname));
}
@Override
public List<E> getSelectedValuesList() {
return thumbnailList.getSelectedValuesList();
}
public IThumbnailList<E> getThumbnailList() {
return thumbnailList;
}
}