package net.sourceforge.squirrel_sql.client.session.mainpanel; import net.sourceforge.squirrel_sql.client.resources.SquirrelResources; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.fw.datasetviewer.*; import net.sourceforge.squirrel_sql.fw.datasetviewer.ReadMoreResultsHandlerListener; import javax.swing.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ReadMoreResultsHandler { private ISession _session; private final JLabel _lblLoading; private final ImageIcon _loadingGif; private ExecutorService _executorService; private Future<SwingWorker<SwingWorker, Object>> _future; public ReadMoreResultsHandler(ISession session) { _session = session; _loadingGif = _session.getApplication().getResources().getIcon(SquirrelResources.IImageNames.LOADING_GIF); _lblLoading = new JLabel(_loadingGif); _lblLoading.setVisible(false); _executorService = Executors.newFixedThreadPool(1); } public void readMoreResults(final ResultSetDataSet rsds, final ReadMoreResultsHandlerListener readChannelCallBack) { if(null != _future && false == _future.isDone()) { return; } _lblLoading.setVisible(true); SwingWorker<SwingWorker, Object> sw = new SwingWorker<SwingWorker, Object>() { @Override protected SwingWorker doInBackground() { rsds.readMoreResults(); return this; } @Override protected void done() { try { get(); onReadMoreResultsDone(readChannelCallBack); } catch (Exception e) { throw new RuntimeException(e); } } }; _future = (Future<SwingWorker<SwingWorker, Object>>) _executorService.submit(sw); } private void onReadMoreResultsDone(net.sourceforge.squirrel_sql.fw.datasetviewer.ReadMoreResultsHandlerListener readChannelCallBack) { try { _lblLoading.setVisible(false); readChannelCallBack.moreResultsHaveBeenRead(); } catch (Throwable t) { throw new RuntimeException(t); } } public JLabel getLoadingLabel() { return _lblLoading; } }