private void processNewFile(DataBean bean) {
    try {
      locker.acquire();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    playback.addFile((String) bean.getGuiParameters().get(GuiParameters.FILENAME));
    String colourScheme = getPreferenceColourMapChoice();

    SWTGridEntry entry =
        new SWTGridEntry(
            (String) bean.getGuiParameters().get(GuiParameters.FILENAME),
            bean.getData().get(0),
            canvas,
            colourScheme,
            getPreferenceAutoContrastLo(),
            getPreferenceAutoContrastHi());
    Integer xPos = (Integer) bean.getGuiParameters().get(GuiParameters.IMAGEGRIDXPOS);
    Integer yPos = (Integer) bean.getGuiParameters().get(GuiParameters.IMAGEGRIDYPOS);
    if (xPos != null && yPos != null) imageGrid.addEntry(entry, xPos, yPos);
    else imageGrid.addEntry(entry);
    imageGrid.setThumbnailSize(getPreferenceImageSize());
    locker.release();
    if (liveActive) playback.moveToLast();
  }
 private void resetPlaying(boolean reset) {
   playback.stop();
   if (reset) playback.clearPlayback();
   btnPlay.setSelection(false);
   btnPlay.setImage(imgPlay);
   sldProgress.setSelection(0);
   curPosition = -1;
 }
 /** Play button action of ImageExplorer */
 public void play() {
   boolean isPaused = playback.isPaused();
   btnPlay.setImage(imgStill);
   playback.start();
   if (!isPaused) {
     playback.setSelection(getSelection());
     playback.setDelay(getPreferenceTimeDelay());
     playback.setStepping(getPreferencePlaybackRate());
     execSvc.execute(playback);
   }
 }
  @Override
  public void dispose() {
    isDisposed = true;
    GuiBean finalBean = saveStateToServer();

    if (imageGrid != null) {
      imageGrid.dispose();
    }
    if (execSvc != null) {
      execSvc.shutdown();
    }
    if (finalBean != null) {
      try {
        plotServer.updateGui(plotViewName, finalBean);
      } catch (Exception e) {
        logger.warn("Problem with updating plot server with GUI data");
        e.printStackTrace();
      }
    }

    playback.dispose();
  }
 @Override
 public void widgetSelected(SelectionEvent e) {
   if (e.getSource().equals(cmbDirectoryLocation)) {
     final String newDirectory =
         cmbDirectoryLocation.getItem(cmbDirectoryLocation.getSelectionIndex());
     if (newDirectory != null && newDirectory.length() > 0) {
       addToHistory();
       resetHistory();
       resetPlaying(true);
       spawnLoadJob(newDirectory);
       currentDir = newDirectory;
     }
   } else if (e.getSource().equals(btnHistoryBack)) {
     String newDir = history.get(historyPointer);
     btnHistoryForw.setEnabled(true);
     cmbDirectoryLocation.setText(newDir);
     resetPlaying(true);
     spawnLoadJob(newDir);
     historyPointer++;
     if (historyPointer >= history.size()) {
       btnHistoryBack.setEnabled(false);
       historyPointer = history.size() - 1;
     }
     if (firstBack) {
       addToHistory();
       firstBack = false;
       historyPointer++;
     }
   } else if (e.getSource().equals(btnHistoryForw)) {
     historyPointer--;
     String newDir = history.get(historyPointer);
     resetPlaying(true);
     spawnLoadJob(newDir);
     cmbDirectoryLocation.setText(newDir);
     btnHistoryBack.setEnabled(true);
     if (historyPointer <= 0) {
       btnHistoryForw.setEnabled(false);
       historyPointer = 1;
     }
   } else if (e.getSource().equals(btnPlay)) {
     if (btnPlay.getSelection()) {
       boolean isPaused = playback.isPaused();
       btnPlay.setImage(imgStill);
       playback.start();
       if (!isPaused) {
         playback.setSelection(getSelection());
         playback.setDelay(getPreferenceTimeDelay());
         playback.setStepping(getPreferencePlaybackRate());
         execSvc.execute(playback);
       }
     } else {
       playback.pause();
       btnPlay.setImage(imgPlay);
     }
   } else if (e.getSource().equals(btnStop)) {
     sldProgress.setSelection(0);
     curPosition = -1;
     btnPlay.setSelection(false);
     btnPlay.setImage(imgPlay);
     playback.stop();
   } else if (e.getSource().equals(btnRewind)) {
     sldProgress.setSelection(0);
     curPosition = -1;
     playback.rewind();
   } else if (e.getSource().equals(btnForward)) {
     sldProgress.setSelection(sldProgress.getMaximum());
     playback.forward();
   } else if (e.getSource().equals(sldProgress)) {
     int p = sldProgress.getSelection();
     if (p != curPosition) {
       playback.setPlayPos(p);
       curPosition = p;
     }
   } else if (e.getSource().equals(btnPlayLoop)) {
     playback.setAutoRewind(btnPlayLoop.getSelection());
   }
 }
  @SuppressWarnings("unchecked")
  @Override
  public void update(Object source, Object changeCode) {
    if (stopLoading) return;

    if (source == ImageExplorerView.FOLDER_UPDATE_MARKER) { // Folder Update
      if (changeCode instanceof List<?>) {
        playback.clearPlayback();
        btnPlay
            .getDisplay()
            .asyncExec(
                new Runnable() {
                  @Override
                  public void run() {
                    resetPlaying(false);
                    if (isLive) {
                      playback.setDelay(50);
                      playback.setStepping(1);
                      playback.start();
                      btnPlay.setSelection(true);
                      btnPlay.setImage(imgStill);
                      execSvc.execute(playback);
                      if (!monActive)
                        CommandExecutor.executeCommand(
                            getViewSite(),
                            "uk.ac.diamond.scisoft.analysis.rcp.MontorDirectoryAction");
                      cmbDirectoryLocation.setText(currentDir);
                      isLive = false;
                    }
                  }
                });
        filesToLoad = (List<String>) changeCode;
        processClientLocalUpdate();
      }
    } else {
      if (source instanceof RMIPlotServer && changeCode instanceof String) {
        String viewName = (String) changeCode;
        if (!viewName.startsWith("Image Explorer")) return;
        RMIPlotServer server = (RMIPlotServer) source;
        try {
          String[] names = server.getGuiNames();
          final DataBean bean = server.getData(names[0]);
          // when imagegrid size is set it means we need to reset the grid
          if (bean != null && bean.getGuiParameters().get(GuiParameters.IMAGEGRIDSIZE) != null) {
            Display.getDefault()
                .syncExec(
                    new Runnable() {
                      @Override
                      public void run() {
                        Integer[] gridDim =
                            (Integer[]) bean.getGuiParameters().get(GuiParameters.IMAGEGRIDSIZE);
                        if (imageGrid != null) imageGrid.dispose();
                        imageGrid =
                            new PlotServerSWTImageGrid(
                                gridDim[0], gridDim[1], canvas, plotViewName);
                        imageGrid.setThumbnailSize(getPreferenceImageSize());
                      }
                    });
          }
          if (bean != null) {
            if (bean.getData().isEmpty()) {
              // We try to load the data from the filename if data not in the databean
              String filename = (String) bean.getGuiParameters().get(GuiParameters.FILENAME);
              if (filename == null) return;
              List<DatasetWithAxisInformation> data = new ArrayList<>();
              DatasetWithAxisInformation dwai = new DatasetWithAxisInformation();
              IDataHolder holder = LoaderFactory.getData(filename);
              IDataset loadedData = holder.getDataset(0);
              dwai.setData(loadedData);
              data.add(dwai);
              bean.setData(data);
            }
            processUpdate(bean);
          } else {
            throw new Exception("Databean is null. This image grid use is not supported.");
          }
        } catch (Exception e) {
          logger.error("Error updating data from server: ", e);
        }
      }
    }
  }