/**
   * Starts an asynchronous call to save the passed file back to the server.
   *
   * @param file The file to save.
   * @param asynch Pass <code>true</code> to save asynchronously, <code>false</code> otherwise.
   */
  void fireFileSaving(File file, boolean asynch) {
    boolean fileIsExp = browser.isModelExperiment();
    int fileType = (fileIsExp ? FileSaver.EXPERIMENT : FileSaver.PROTOCOL);

    saveFile(file);
    FileAnnotationData data = null;
    DataObject linkTo = parent;
    if (fileAnnotation != null) data = fileAnnotation;
    else data = new FileAnnotationData(file);
    if (data.getId() > 0) linkTo = null;
    String description = CPEsummaryExport.export(browser.getTreeModel());
    if (description != null) data.setDescription(description);

    if (asynch) {
      currentLoader = new FileSaver(component, ctx, file, data, fileType, linkTo);
      currentLoader.load();
      state = Editor.SAVING;
    } else {
      OmeroMetadataService svc = EditorAgent.getRegistry().getMetadataService();
      try {
        svc.archivedFile(ctx, fileAnnotation, file, fileType, linkTo);
      } catch (Exception e) {
        LogMessage msg = new LogMessage();
        msg.print("State: " + state);
        msg.print("Cannot save file back to server");
        msg.print(e);
        EditorAgent.getRegistry().getLogger().error(this, msg);
      }
    }
  }
    /**
     * Opens a dialog box for users to enter a URL
     *
     * @see ActionListener#actionPerformed(ActionEvent)
     */
    public void actionPerformed(ActionEvent e) {
      JFrame f = EditorAgent.getRegistry().getTaskBar().getFrame();
      InputDialog dialog = new InputDialog(f, "Enter ID of Editor File on Server", "");

      int option = dialog.centerMsgBox();
      if (option == InputDialog.SAVE) {
        String newFileID = dialog.getText();

        // could check valid ID (integer) etc?
        if (EditorLinkParam.isLinkValidId(newFileID)) {
          attributeEdited(TextParam.PARAM_VALUE, newFileID);
        } else {
          UserNotifier un = EditorAgent.getRegistry().getUserNotifier();
          un.notifyInfo("Not valid ID", "Did not enter a valid Editor file ID");
        }
      }
    }
 /** Creates an instance. Sets the Name, Description and Icon. */
 public GetIDAction() {
   boolean server = EditorAgent.isServerAvailable();
   putValue(Action.NAME, "File on Server");
   putValue(
       Action.SHORT_DESCRIPTION,
       server ? "Choose the ID of a file on the server." : "Server not available");
   putValue(Action.SMALL_ICON, editorLinkIcon);
   setEnabled(server);
 }
  /**
   * This listener for the linkButton uses BareBonesBrowserLauncher, passing it URLlink.
   *
   * @see ActionListener#actionPerformed(ActionEvent)
   */
  public void actionPerformed(ActionEvent e) {

    if (filePath != null) {

      File f = new File(filePath);
      // if link to local file that exists, open in Editor.
      if (f.exists()) EditorAgent.openLocalFile(f);
    } else if (fileID > 0) {
      /*TODO: review that work
      EventBus bus = MetadataViewerAgent.getRegistry().getEventBus();
      bus.post(new EditFileEvent(fileID));
      */
    }
  }
 /**
  * Returns <code>true</code> if the user is the owner of the file, <code>false</code> otherwise.
  * If the file is <code>null</code>, return <code>true</code>.
  *
  * @return See above.
  */
 boolean isUserOwner() {
   if (fileAnnotation == null) return true;
   long userID = EditorAgent.getUserDetails().getId();
   return EditorUtil.isUserOwner(fileAnnotation, userID);
 }
 /**
  * Creates a temporary file in the Editor Home Directory with the given fileName, sends the file
  * to the server by calling {@link #fireFileSaving(File)}, saving according to the current {@link
  * #fileAnnotation}.
  *
  * @param fileName The name of the file.
  * @param asynch Pass <code>true</code> to save asynchronously, <code>false</code> otherwise.
  */
 void fireFileSaving(String fileName, boolean asynch) {
   String filePath = EditorAgent.getEditorHome() + File.separator + fileName;
   File toEdit = new File(filePath);
   fireFileSaving(toEdit, asynch);
 }
  /**
   * Sets the file to edit. If the file cannot be read by {@link TreeModelFactory#getTree()} then
   * the state of this model is re-set to {@link Editor#NEW}.
   *
   * @param file The file to edit.
   * @return See above.
   */
  boolean setFileToEdit(File file) {
    if (file == null) {
      fileToEdit = null;
      state = Editor.NEW;
      fileName = EditorFactory.BLANK_MODEL;
      return false;
    }
    TreeModel treeModel = null;

    // try opening file as recognised OMERO.editor file (pro.xml or cpe.xml)
    try {
      treeModel = TreeModelFactory.getTree(file);
      fileToEdit = file;
    } catch (ParsingException e) {

      // may get a parsing exception simply because the file was not
      // recognised as Editor File..

      Registry reg = EditorAgent.getRegistry();
      UserNotifier un = reg.getUserNotifier();

      // ... try opening as ANY xml file
      try {
        treeModel = TreeModelFactory.getTreeXml(file);
        // if this worked, we have an XML file converted to cpe.xml
        // .. tell user..
        un.notifyInfo(
            "File not recognised",
            "File was converted from an unrecognised format into\n"
                + "OMERO.editor's cpe.xml format.\nOverwriting the "
                + "original file will erase the original XML format.");
        // must avoid overwriting the original file...
        // 'Save' won't work.
        if (fileID > 0) { // try to read a file downloaded
          file.delete();
        }
        fileToEdit = null;
        setFileAnnotationData(null);

      } catch (ParsingException ex) {

        LogMessage message = new LogMessage();
        message.print(ex);
        reg.getLogger().error(this, message);

        // ...and notify the user. Use the exception message.
        String errMsg = ex.getMessage();
        un.notifyInfo("File Failed to Open", errMsg);
      }
    }

    if (treeModel == null) {
      fileToEdit = null;
      state = Editor.NEW;
      fileName = EditorFactory.BLANK_MODEL;
      return false;
    }

    fileName = file.getName();
    browser.setTreeModel(treeModel);
    state = Editor.READY;
    return true;
  }