/** Modifies the existing password. */
  private void changePassword() {
    UserNotifier un;
    if (!oldPassword.isVisible()) {
      StringBuffer buf = new StringBuffer();
      buf.append(passwordNew.getPassword());
      String newPass = buf.toString();
      if (newPass == null || newPass.length() == 0) {
        un = MetadataViewerAgent.getRegistry().getUserNotifier();
        un.notifyInfo(PASSWORD_CHANGE_TITLE, "Please enter the new password.");
        passwordNew.requestFocus();
        return;
      }
      un = MetadataViewerAgent.getRegistry().getUserNotifier();
      un.notifyInfo(PASSWORD_CHANGE_TITLE, "Password changed.");
      passwordNew.setText("");
      model.resetPassword(newPass);
      return;
    }
    StringBuffer buf = new StringBuffer();
    buf.append(passwordNew.getPassword());
    String newPass = buf.toString();

    String pass = buf.toString();
    buf = new StringBuffer();
    buf.append(passwordConfirm.getPassword());
    String confirm = buf.toString();

    buf = new StringBuffer();
    buf.append(oldPassword.getPassword());
    String old = buf.toString();
    if (old == null || old.trim().length() == 0) {
      un = MetadataViewerAgent.getRegistry().getUserNotifier();
      un.notifyInfo(PASSWORD_CHANGE_TITLE, "Please specify your old password.");
      oldPassword.requestFocus();
      return;
    }
    if (newPass == null || newPass.length() == 0) {
      un = MetadataViewerAgent.getRegistry().getUserNotifier();
      un.notifyInfo(PASSWORD_CHANGE_TITLE, "Please enter your new password.");
      passwordNew.requestFocus();
      return;
    }

    if (pass == null || confirm == null || confirm.length() == 0 || !pass.equals(confirm)) {
      un = MetadataViewerAgent.getRegistry().getUserNotifier();
      un.notifyInfo(
          PASSWORD_CHANGE_TITLE, "The passwords entered do not match. " + "Please try again.");
      passwordNew.setText("");
      passwordConfirm.setText("");
      passwordNew.requestFocus();
      return;
    }
    model.changePassword(old, confirm);
  }
 /**
  * Creates or recycles the existing figure dialog.
  *
  * @param name The name to display.
  * @param pixels The pixels object of reference.
  * @param index One of the constants defined by this class.
  * @return See above.
  */
 FigureDialog createFigureDialog(String name, PixelsData pixels, int index) {
   if (figureDialog != null) return figureDialog;
   UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier();
   if (FigureDialog.needPixels(index) && pixels == null) {
     un.notifyInfo("Figure", "The image is not valid," + " cannot create the figure.");
     return null;
   }
   JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
   figureDialog = new FigureDialog(f, name, pixels, index, view.getRefObject().getClass());
   figureDialog.addPropertyChangeListener(this);
   return figureDialog;
 }
 /**
  * Returns <code>true</code> if the user is an administrator, <code>false</code> otherwise.
  *
  * @return See above.
  */
 private boolean isUserAdministrator() {
   ExperimenterData user = (ExperimenterData) model.getRefObject();
   ExperimenterData loggedInUser = MetadataViewerAgent.getUserDetails();
   if (user.getId() == loggedInUser.getId()) return MetadataViewerAgent.isAdministrator();
   List<GroupData> groups = user.getGroups();
   Iterator<GroupData> i = groups.iterator();
   GroupData g;
   while (i.hasNext()) {
     g = i.next();
     if (GroupData.SYSTEM.equals(g.getName())) return true;
   }
   return false;
 }
  /** Brings up the folder chooser. */
  private void export() {
    DowngradeChooser chooser =
        new DowngradeChooser(
            new RefWindow(),
            FileChooser.SAVE,
            "Export",
            "Select where to export the image as OME-TIFF.",
            exportFilters);
    try {
      String path =
          MetadataViewerAgent.getRegistry()
              .getTaskBar()
              .getLibFileRelative(TransformsParser.SPECIFICATION + ".jar");
      chooser.parseData(path);
    } catch (Exception e) {
      LogMessage msg = new LogMessage();
      msg.print(e);
      MetadataViewerAgent.getRegistry().getLogger().debug(this, msg);
    }
    String s = UIUtilities.removeFileExtension(view.getRefObjectName());
    if (s != null && s.trim().length() > 0) chooser.setSelectedFile(s);
    chooser.setApproveButtonText("Export");
    IconManager icons = IconManager.getInstance();
    chooser.setTitleIcon(icons.getIcon(IconManager.EXPORT_AS_OMETIFF_48));
    chooser.addPropertyChangeListener(
        new PropertyChangeListener() {

          public void propertyChange(PropertyChangeEvent evt) {
            String name = evt.getPropertyName();
            if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
              File[] files = (File[]) evt.getNewValue();
              File folder = files[0];
              if (folder == null) folder = UIUtilities.getDefaultFolder();
              Object src = evt.getSource();
              Target target = null;
              if (src instanceof DowngradeChooser) {
                ((FileChooser) src).setVisible(false);
                ((FileChooser) src).dispose();
                target = ((DowngradeChooser) src).getSelectedSchema();
              }
              model.exportImageAsOMETIFF(folder, target);
            } else if (DowngradeChooser.HELP_DOWNGRADE_PROPERTY.equals(name)) {
              Registry reg = MetadataViewerAgent.getRegistry();
              String url = (String) reg.lookup("HelpDowngrade");
              reg.getTaskBar().openURL(url);
            }
          }
        });
    chooser.centerDialog();
  }
  /**
   * Fires an asynchronous call to update the passed group.
   *
   * @param data The object to update.
   * @param asynch Pass <code>true</code> to save data asynchronously, <code>false</code> otherwise.
   */
  void fireAdminSaving(AdminObject data, boolean asynch) {
    SecurityContext c = ctx;
    if (MetadataViewerAgent.isAdministrator()) c = getAdminContext();

    MetadataLoader loader;
    GroupData group = data.getGroup();

    switch (data.getIndex()) {
      case AdminObject.UPDATE_GROUP:
        loaderID++;
        loader =
            new GroupEditor(
                component, c, group, data.getPermissions(), loaderID, GroupEditor.UPDATE);
        loaders.put(loaderID, loader);
        loader.load();
        state = MetadataViewer.SAVING;
        break;
      case AdminObject.UPDATE_EXPERIMENTER:
        loaderID++;
        loader = new AdminEditor(component, c, data.getGroup(), data.getExperimenters(), loaderID);
        loaders.put(loaderID, loader);
        loader.load();
        state = MetadataViewer.SAVING;
    }
  }
  /** Opens the file. */
  private void openFile() {
    if (!(data instanceof FileAnnotationData)) return;

    FileAnnotationData fa = (FileAnnotationData) data;
    Registry reg = MetadataViewerAgent.getRegistry();
    UserNotifier un = reg.getUserNotifier();
    OriginalFile f = (OriginalFile) fa.getContent();
    Environment env = (Environment) reg.lookup(LookupNames.ENV);
    DownloadAndLaunchActivityParam activity;
    final long dataId = fa.getId();
    final File dir =
        new File(env.getOmeroFilesHome() + File.separatorChar + "file annotation " + dataId);
    if (!dir.exists()) {
      dir.mkdir();
    }
    if (f != null && f.isLoaded()) {
      activity = new DownloadAndLaunchActivityParam(f, dir, null);
    } else {
      activity =
          new DownloadAndLaunchActivityParam(
              dataId, DownloadAndLaunchActivityParam.FILE_ANNOTATION, dir, null);
    }
    un.notifyActivity(model.getSecurityContext(), activity);
    return;
  }
 /** Brings up the dialog to choose the photo to upload. */
 private void uploadPicture() {
   UploadPictureDialog d =
       new UploadPictureDialog(MetadataViewerAgent.getRegistry().getTaskBar().getFrame());
   d.addPropertyChangeListener(this);
   d.pack();
   UIUtilities.centerAndShow(d);
 }
  /** Brings up the folder chooser. */
  private void download() {
    JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
    FileChooser chooser =
        new FileChooser(
            f,
            FileChooser.FOLDER_CHOOSER,
            "Download",
            "Select where to download the file.",
            null,
            true);
    chooser.setSelectedFileFull(view.getRefObjectName());
    IconManager icons = IconManager.getInstance();
    chooser.setTitleIcon(icons.getIcon(IconManager.DOWNLOAD_48));
    chooser.setApproveButtonText("Download");
    chooser.addPropertyChangeListener(
        new PropertyChangeListener() {

          public void propertyChange(PropertyChangeEvent evt) {
            String name = evt.getPropertyName();
            if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
              String path = (String) evt.getNewValue();
              if (path == null) {
                path = UIUtilities.getDefaultFolderAsString();
              }
              if (!path.endsWith(File.separator)) path += File.separator;
              model.download(new File(path));
            }
          }
        });
    chooser.centerDialog();
  }
 /**
  * Sets the rendering settings associated to the image.
  *
  * @param viewedBy The value to set.
  */
 void setViewedBy(Map viewedBy) {
   Map m = new LinkedHashMap();
   if (viewedBy != null) {
     long id = MetadataViewerAgent.getUserDetails().getId();
     Entry entry;
     Iterator i = viewedBy.entrySet().iterator();
     ExperimenterData exp;
     while (i.hasNext()) {
       entry = (Entry) i.next();
       exp = (ExperimenterData) entry.getKey();
       if (exp.getId() == id) {
         m.put(exp, entry.getValue());
       }
     }
     i = viewedBy.entrySet().iterator();
     while (i.hasNext()) {
       entry = (Entry) i.next();
       exp = (ExperimenterData) entry.getKey();
       if (exp.getId() != id) {
         m.put(exp, entry.getValue());
       }
     }
   }
   this.viewedBy = m;
 }
 /**
  * Adds a new attachment.
  *
  * @param file The attachment to add.
  */
 public void addAttachment(FileAnnotationData file) {
   long userID = MetadataViewerAgent.getUserDetails().getId();
   if (time == null) {
     time = file.getLastModified();
     resultsButton.setToolTipText("Analysis run " + UIUtilities.formatTime(time));
   }
   if (file.getOwner().getId() == userID) deleteButton.setVisible(true);
   if (!attachments.contains(file)) attachments.add(file);
 }
 /** Launches a dialog to select the file to attach to the <code>DataObject</code>. */
 private void selectFileToAttach() {
   JFrame owner = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
   FileChooser chooser =
       new FileChooser(
           owner, FileChooser.LOAD, "Choose File", "Select the file to attach.", filters, true);
   chooser.setMultiSelectionEnabled(true);
   IconManager icons = IconManager.getInstance();
   chooser.setTitleIcon(icons.getIcon(IconManager.ATTACHMENT_48));
   chooser.setApproveButtonText("Attach");
   chooser.addPropertyChangeListener(FileChooser.APPROVE_SELECTION_PROPERTY, this);
   UIUtilities.centerAndShow(chooser);
 }
 /** Adds or edits the description of the tag. */
 private void editDescription() {
   if (!(data instanceof AnnotationData)) return;
   String text = model.getAnnotationDescription((AnnotationData) data);
   originalDescription = text;
   SwingUtilities.convertPointToScreen(popupPoint, this);
   JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
   int type = EditorDialog.EDIT_TYPE;
   if (isModulo) type = EditorDialog.VIEW_TYPE;
   EditorDialog d = new EditorDialog(f, (AnnotationData) data, false, type);
   if (isModulo) d.allowEdit(false);
   d.addPropertyChangeListener(this);
   d.setOriginalDescription(originalDescription);
   d.setSize(300, 250);
   UIUtilities.showOnScreen(d, popupPoint);
 }
  /**
   * Listens to property fired by the Editor dialog.
   *
   * @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
   */
  public void propertyChange(PropertyChangeEvent evt) {
    String name = evt.getPropertyName();
    if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
      File[] files = (File[]) evt.getNewValue();
      File folder = files[0];
      if (folder == null) folder = UIUtilities.getDefaultFolder();
      UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier();

      if (attachments == null || attachments.size() == 0) return;
      IconManager icons = IconManager.getInstance();
      DownloadAndZipParam param =
          new DownloadAndZipParam(attachments, folder, icons.getIcon(IconManager.DOWNLOAD_22));
      // TODO: review
      // un.notifyActivity(param);
    }
  }
 /** Brings up a dialog so that the user can select where to download the file. */
 private void download() {
   String name = null;
   if (data instanceof FileAnnotationData) {
     name = ((FileAnnotationData) data).getFileName();
   }
   JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
   FileChooser chooser =
       new FileChooser(
           f, FileChooser.SAVE, "Download", "Select where to download the files.", null, true);
   if (name != null && name.trim().length() > 0) chooser.setSelectedFileFull(name);
   IconManager icons = IconManager.getInstance();
   chooser.setTitleIcon(icons.getIcon(IconManager.DOWNLOAD_48));
   chooser.setApproveButtonText("Download");
   chooser.addPropertyChangeListener(this);
   chooser.centerDialog();
 }
 /**
  * Creates a new object and sets its state to {@link MetadataViewer#NEW}.
  *
  * @param refObject The reference object.
  * @param index One of the rendering constants defined by the <code>MetadataViewer</code> I/F.
  */
 MetadataViewerModel(Object refObject, int index) {
   state = MetadataViewer.NEW;
   switch (index) {
     case MetadataViewer.RND_GENERAL:
     case MetadataViewer.RND_SPECIFIC:
       this.index = index;
       break;
     default:
       this.index = MetadataViewer.RND_GENERAL;
   }
   this.refObject = refObject;
   loaderID = 0;
   loaders = new HashMap<Integer, MetadataLoader>();
   data = null;
   dataType = null;
   singleMode = true;
   userID = MetadataViewerAgent.getUserDetails().getId();
 }
 /**
  * Selects or not the {@link #ownerBox} if the selected user is an owner. Returns <code>true
  * </code> if the currently logged in user is an owner of the group.
  *
  * @param group The group to handle.
  */
 private boolean setGroupOwner(GroupData group) {
   ExperimenterData ref = (ExperimenterData) model.getRefObject();
   long userID = MetadataViewerAgent.getUserDetails().getId();
   Set leaders = group.getLeaders();
   ExperimenterData exp;
   boolean isOwner = false;
   if (leaders != null) {
     Iterator i = leaders.iterator();
     while (i.hasNext()) {
       exp = (ExperimenterData) i.next();
       if (exp.getId() == ref.getId()) {
         groupOwner = true;
         ownerBox.setSelected(true);
       }
       if (exp.getId() == userID) isOwner = true;
     }
   }
   return isOwner;
 }
 /** Builds and lays out the UI. */
 void buildGUI() {
   removeAll();
   initComponents();
   setLayout(new GridBagLayout());
   GridBagConstraints c = new GridBagConstraints();
   c.fill = GridBagConstraints.HORIZONTAL;
   c.anchor = GridBagConstraints.WEST;
   c.insets = new Insets(0, 2, 2, 0);
   c.gridx = 0;
   c.gridy = 0;
   c.gridwidth = GridBagConstraints.RELATIVE; // next-to-last
   c.weightx = 1.0;
   add(buildContentPanel(), c);
   if (model.isUserOwner(model.getRefObject()) || MetadataViewerAgent.isAdministrator()) {
     c.gridy++;
     add(Box.createVerticalStrut(5), c);
     c.gridy++;
     add(buildPasswordPanel(), c);
   }
 }
  /** Brings up the folder chooser to select where to save the files. */
  private void saveAsJPEG() {
    JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame();
    FileChooser chooser =
        new FileChooser(
            f,
            FileChooser.FOLDER_CHOOSER,
            "Save As",
            "Select where to save locally the images as JPEG.",
            saveAsFilters);
    String s = UIUtilities.removeFileExtension(view.getRefObjectName());
    if (s != null && s.trim().length() > 0) chooser.setSelectedFile(s);
    chooser.setApproveButtonText("Save");
    IconManager icons = IconManager.getInstance();
    chooser.setTitleIcon(icons.getIcon(IconManager.SAVE_AS_48));
    chooser.addPropertyChangeListener(
        new PropertyChangeListener() {

          public void propertyChange(PropertyChangeEvent evt) {
            String name = evt.getPropertyName();
            if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
              // File[] files = (File[]) evt.getNewValue();
              String value = (String) evt.getNewValue();
              File folder = null; // files[0];
              if (value == null || value.trim().length() == 0)
                folder = UIUtilities.getDefaultFolder();
              else folder = new File(value);
              Object src = evt.getSource();
              if (src instanceof FileChooser) {
                ((FileChooser) src).setVisible(false);
                ((FileChooser) src).dispose();
              }
              model.saveAs(folder);
            }
          }
        });
    chooser.centerDialog();
  }
 /**
  * Posts an event to view the protocol.
  *
  * @param protocolID The id of the protocol to view.
  */
 private void viewProtocol(long protocolID) {
   EventBus bus = MetadataViewerAgent.getRegistry().getEventBus();
   bus.post(new EditFileEvent(model.getSecurityContext(), protocolID));
 }
 /**
  * Posts an event to view the image.
  *
  * @param imageID The id of the image to view.
  */
 private void viewImage(long imageID) {
   EventBus bus = MetadataViewerAgent.getRegistry().getEventBus();
   bus.post(new ViewImage(model.getSecurityContext(), new ViewImageObject(imageID), null));
 }
 /**
  * Returns the user currently logged in.
  *
  * @return See above.
  */
 ExperimenterData getCurrentUser() {
   return MetadataViewerAgent.getUserDetails();
 }
 /** Launches RAPID. */
 private void openFLIM() {
   String url = (String) MetadataViewerAgent.getRegistry().lookup(LookupNames.RAPID);
   MetadataViewerAgent.getRegistry().getTaskBar().openURL(url);
 }
  /**
   * Listens to property fired by the Editor dialog.
   *
   * @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
   */
  public void propertyChange(PropertyChangeEvent evt) {
    String name = evt.getPropertyName();
    if (EditorDialog.CREATE_NO_PARENT_PROPERTY.equals(name)) {
      // reset text and tooltip
      String text = "";
      String description = "";
      AnnotationData annotation = null;
      if (data instanceof TagAnnotationData
          || data instanceof TermAnnotationData
          || data instanceof XMLAnnotationData) {
        annotation = (AnnotationData) data;
        text = annotation.getContentAsString();
        text = EditorUtil.truncate(text, TEXT_LENGTH, false);
      }
      if (data instanceof DoubleAnnotationData) {
        annotation = (AnnotationData) data;
        text = "" + ((DoubleAnnotationData) data).getDataValue();
      }
      if (data instanceof LongAnnotationData) {
        annotation = (AnnotationData) data;
        text = "" + ((LongAnnotationData) data).getDataValue();
      }
      if (data instanceof BooleanAnnotationData) {
        annotation = (AnnotationData) data;
        text = "" + ((BooleanAnnotationData) data).getValue();
      }
      description = model.getAnnotationDescription(annotation);
      if (annotation == null) return;
      label.setText(text);
      label.setToolTipText(formatToolTip(annotation, null));
      originalName = text;
      originalDescription = description;
      firePropertyChange(AnnotationUI.EDIT_TAG_PROPERTY, null, this);
    } else if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
      if (data == null) return;
      FileAnnotationData fa = (FileAnnotationData) data;
      OriginalFile f = (OriginalFile) fa.getContent();
      File folder;
      Object o = evt.getNewValue();
      if (o instanceof String) {
        String path = (String) o;
        if (!path.endsWith(File.separator)) {
          path += File.separator;
        }
        path += fa.getFileName();
        folder = new File(path);
      } else {
        File[] files = (File[]) o;
        folder = files[0];
      }
      if (folder == null) folder = UIUtilities.getDefaultFolder();
      UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier();

      IconManager icons = IconManager.getInstance();

      DownloadActivityParam activity =
          new DownloadActivityParam(f, folder, icons.getIcon(IconManager.DOWNLOAD_22));
      // Check Name space
      activity.setLegend(fa.getDescription());
      un.notifyActivity(model.getSecurityContext(), activity);
    }
  }
  /**
   * Returns the experimenter to save.
   *
   * @return See above.
   */
  Object getExperimenterToSave() {
    ExperimenterData original = (ExperimenterData) model.getRefObject();
    // Required fields first

    String v = loginArea.getText();
    if (v == null || v.trim().length() == 0) showRequiredField();
    original.setLastName(v);
    JTextField f = items.get(EditorUtil.EMAIL);
    v = f.getText();
    if (v == null || v.trim().length() == 0) v = ""; // showRequiredField();
    original.setEmail(v);
    f = items.get(EditorUtil.INSTITUTION);
    v = f.getText();
    if (v == null) v = "";
    original.setInstitution(v.trim());
    f = items.get(EditorUtil.LAST_NAME);
    v = f.getText();
    if (v == null) v = "";
    original.setLastName(v.trim());

    f = items.get(EditorUtil.FIRST_NAME);
    v = f.getText();
    if (v == null) v = "";
    original.setFirstName(v.trim());

    f = items.get(EditorUtil.MIDDLE_NAME);
    v = f.getText();
    if (v == null) v = "";
    original.setMiddleName(v.trim());

    // set the groups
    GroupData g = null;
    /*

     	if (selectedIndex != originalIndex) {
     		if (selectedIndex < groupData.length)
     			g = groupData[selectedIndex];
     		ExperimenterData user = (ExperimenterData) model.getRefObject();
     		List userGroups = user.getGroups();
     		List<GroupData> newGroups = new ArrayList<GroupData>();
     		if (g != null) newGroups.add(g);
     		Iterator i = userGroups.iterator();
     		long id = -1;
     		if (g != null) id = g.getId();
     		GroupData group;
     		while (i.hasNext()) {
    	group = (GroupData) i.next();
    	if (group.getId() != id)
    		newGroups.add(group);
    }
     		//Need to see what to do b/c no ExperimenterGroupMap
     		original.setGroups(newGroups);
     	}
     	*/
    String value = loginArea.getText().trim();
    UserCredentials uc = new UserCredentials(value, "");
    Boolean b = ownerBox.isSelected();
    // if (g == null) g = original.getDefaultGroup();
    boolean a = false;
    if (b.compareTo(groupOwner) != 0) {
      a = true;
      uc.setOwner(b);
      Object parent = model.getParentRootObject();
      if (parent instanceof GroupData) {
        Map<GroupData, Boolean> map = new HashMap<GroupData, Boolean>();
        map.put((GroupData) parent, b);
        uc.setGroupsOwner(map);
      }
    }
    if (adminBox.isVisible()) {
      b = adminBox.isSelected();
      if (b.compareTo(admin) != 0) {
        a = true;
        uc.setAdministrator(b);
      }
    }
    if (activeBox.isVisible()) {
      b = activeBox.isSelected();
      if (b.compareTo(active) != 0) {
        a = true;
        uc.setActive(b);
      }
    }
    if (!original.getUserName().equals(value)) a = true;
    // if admin
    if (MetadataViewerAgent.isAdministrator()) a = true;
    if (a) {
      Map<ExperimenterData, UserCredentials> m = new HashMap<ExperimenterData, UserCredentials>();
      m.put(original, uc);
      AdminObject object = new AdminObject(g, m, AdminObject.UPDATE_EXPERIMENTER);
      return object;
    }
    return original; // newOne;
  }
  /**
   * Builds the UI component hosting the UI component used to modify the password.
   *
   * @return See above.
   */
  private JPanel buildPasswordPanel() {
    JPanel content = new JPanel();
    content.setBackground(UIUtilities.BACKGROUND_COLOR);
    Registry reg = MetadataViewerAgent.getRegistry();
    String ldap = (String) reg.lookup(LookupNames.USER_AUTHENTICATION);
    if (ldap != null && ldap.length() > 0) {
      content.setBorder(BorderFactory.createTitledBorder("LDAP Authentication"));
      content.setLayout(new FlowLayout(FlowLayout.LEFT));
      content.add(new JLabel(ldap));
      return content;
    }
    content.setBorder(BorderFactory.createTitledBorder("Change Password"));

    content.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.WEST;
    c.insets = new Insets(0, 2, 2, 0);
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = GridBagConstraints.RELATIVE; // next-to-last
    c.fill = GridBagConstraints.NONE; // reset to default
    c.weightx = 0.0;
    if (MetadataViewerAgent.isAdministrator()) {
      content.add(UIUtilities.setTextFont(PASSWORD_NEW), c);
      c.gridx++;
      c.gridwidth = GridBagConstraints.REMAINDER; // end row
      c.fill = GridBagConstraints.HORIZONTAL;
      c.weightx = 1.0;
      content.add(passwordNew, c);
    } else {
      content.add(UIUtilities.setTextFont(PASSWORD_OLD), c);
      c.gridx++;
      c.gridwidth = GridBagConstraints.REMAINDER; // end row
      c.fill = GridBagConstraints.HORIZONTAL;
      c.weightx = 1.0;
      content.add(oldPassword, c);
      c.gridy++;
      c.gridx = 0;
      c.gridwidth = GridBagConstraints.RELATIVE; // next-to-last
      c.fill = GridBagConstraints.NONE; // reset to default
      c.weightx = 0.0;
      content.add(UIUtilities.setTextFont(PASSWORD_NEW), c);
      c.gridx++;
      c.gridwidth = GridBagConstraints.REMAINDER; // end row
      c.fill = GridBagConstraints.HORIZONTAL;
      c.weightx = 1.0;
      content.add(passwordNew, c);
      c.gridy++;
      c.gridx = 0;
      c.gridwidth = GridBagConstraints.RELATIVE; // next-to-last
      c.fill = GridBagConstraints.NONE; // reset to default
      c.weightx = 0.0;
      content.add(UIUtilities.setTextFont(PASSWORD_CONFIRMATION), c);
      c.gridx++;
      c.gridwidth = GridBagConstraints.REMAINDER; // end row
      c.fill = GridBagConstraints.HORIZONTAL;
      c.weightx = 1.0;
      content.add(passwordConfirm, c);
      c.gridy++;
      c.gridx = 0;
    }

    JPanel p = new JPanel();
    p.setBackground(UIUtilities.BACKGROUND_COLOR);
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
    p.add(content);
    JPanel buttonPanel = UIUtilities.buildComponentPanel(passwordButton);
    buttonPanel.setBackground(UIUtilities.BACKGROUND_COLOR);
    p.add(buttonPanel);
    return p;
  }
 /** Message displayed when one of the required fields is left blank. */
 private void showRequiredField() {
   UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier();
   un.notifyInfo("Edit Profile", "The required fields cannot be left " + "blank.");
   return;
 }
 /**
  * Reacts to property change.
  *
  * @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
  */
 public void propertyChange(PropertyChangeEvent evt) {
   String name = evt.getPropertyName();
   if (SAVE_PROPERTY.equals(name)
       || DataComponent.DATA_MODIFIED_PROPERTY.equals(name)
       || PreviewPanel.PREVIEW_EDITED_PROPERTY.equals(name)) {
     view.setDataToSave(view.hasDataToSave());
   } else if (MetadataViewer.SAVE_DATA_PROPERTY.equals(name)) {
     Boolean b = (Boolean) evt.getNewValue();
     view.saveData(b.booleanValue());
   } else if (MetadataViewer.CLEAR_SAVE_DATA_PROPERTY.equals(name)
       || MetadataViewer.ON_DATA_SAVE_PROPERTY.equals(name)
       || MetadataViewer.ADMIN_UPDATED_PROPERTY.equals(name)) {
     view.clearData();
   } else if (UIUtilities.COLLAPSED_PROPERTY_JXTASKPANE.equals(name)) {
     view.handleTaskPaneCollapsed((JXTaskPane) evt.getSource());
   } else if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
     File[] files = (File[]) evt.getNewValue();
     view.attachFiles(files);
   } else if (AnnotationUI.REMOVE_ANNOTATION_PROPERTY.equals(name)) {
     Object object = evt.getNewValue();
     if (object instanceof DocComponent) {
       DocComponent doc = (DocComponent) object;
       Object data = doc.getData();
       if (data instanceof File) view.removeAttachedFile(data);
       else if (data instanceof FileAnnotationData) view.removeAttachedFile(data);
       else if (data instanceof TagAnnotationData) view.removeObject((DataObject) data);
     }
   } else if (AnnotationUI.DELETE_ANNOTATION_PROPERTY.equals(name)) {
     Object object = evt.getNewValue();
     if (object instanceof DocComponent) {
       DocComponent doc = (DocComponent) object;
       Object data = doc.getData();
       if (data instanceof FileAnnotationData) {
         view.deleteAnnotation((FileAnnotationData) data);
         view.removeAttachedFile(data);
       }
     } else if (object instanceof TextualAnnotationComponent) {
       TextualAnnotationComponent doc = (TextualAnnotationComponent) object;
       TextualAnnotationData data = doc.getData();
       // view.deleteAnnotation((TextualAnnotationData) data);
       view.removeObject(data);
     }
   } else if (AnnotationUI.EDIT_TAG_PROPERTY.equals(name)) {
     Object object = evt.getNewValue();
     if (object instanceof DocComponent) {
       // Save the tag w/o update.
       DataObject d = (DataObject) ((DocComponent) object).getData();
       // Save the tag
       OmeroMetadataService svc = MetadataViewerAgent.getRegistry().getMetadataService();
       long id = MetadataViewerAgent.getUserDetails().getId();
       try {
         svc.saveData(model.getSecurityContext(), Arrays.asList(d), null, null, id);
       } catch (Exception e) {
         Logger l = MetadataViewerAgent.getRegistry().getLogger();
         LogMessage msg = new LogMessage();
         msg.print("Saving object");
         msg.print(e);
         l.error(this, msg);
       }
     }
   } else if (OMEWikiComponent.WIKI_DATA_OBJECT_PROPERTY.equals(name)) {
     WikiDataObject object = (WikiDataObject) evt.getNewValue();
     long id;
     switch (object.getIndex()) {
       case WikiDataObject.IMAGE:
         id = object.getId();
         if (id < 0) viewImage(object.getName());
         else viewImage(id);
         break;
       case WikiDataObject.PROTOCOL:
         viewProtocol(object.getId());
         break;
     }
   } else if (SelectionWizard.SELECTED_ITEMS_PROPERTY.equals(name)) {
     Map m = (Map) evt.getNewValue();
     if (m == null || m.size() != 1) return;
     Set set = m.entrySet();
     Entry entry;
     Iterator i = set.iterator();
     Class type;
     while (i.hasNext()) {
       entry = (Entry) i.next();
       type = (Class) entry.getKey();
       view.handleObjectsSelection(type, (Collection) entry.getValue());
     }
   } else if (PreviewPanel.OPEN_FILE_PROPERTY.equals(name)) {
     Long id = (Long) evt.getNewValue();
     if (id != null) viewProtocol(id.longValue());
   } else if (MetadataViewer.SETTINGS_APPLIED_PROPERTY.equals(name)) {
     model.loadRenderingControl(RenderingControlLoader.RELOAD);
     view.onSettingsApplied(true);
   } else if (MetadataViewer.ACTIVITY_OPTIONS_PROPERTY.equals(name)) {
     List l = (List) evt.getNewValue();
     view.activityOptions((Component) l.get(0), (Point) l.get(1), (Integer) l.get(2));
   } else if (FigureDialog.CREATE_FIGURE_PROPERTY.equals(name)) {
     view.createFigure(evt.getNewValue());
   } else if (FigureDialog.CLOSE_FIGURE_PROPERTY.equals(name)) {
     figureDialog = null;
   } else if (MetadataViewer.CLOSE_RENDERER_PROPERTY.equals(name)) {
     view.discardRenderer(evt.getNewValue());
   } else if (MetadataViewer.RELATED_NODES_PROPERTY.equals(name)) {
     view.onRelatedNodesSet();
   } else if (ScriptingDialog.RUN_SELECTED_SCRIPT_PROPERTY.equals(name)) {
     // view.manageScript((ScriptObject) evt.getNewValue(),
     //		MetadataViewer.RUN);
   } else if (ScriptingDialog.DOWNLOAD_SELECTED_SCRIPT_PROPERTY.equals(name)) {
     Object value = evt.getNewValue();
     if (value instanceof ScriptObject)
       view.manageScript((ScriptObject) value, MetadataViewer.DOWNLOAD);
     else if (value instanceof String) {
       ScriptObject script = view.getScriptFromName((String) value);
       if (script != null) view.manageScript(script, MetadataViewer.DOWNLOAD);
     }
   } else if (ScriptingDialog.VIEW_SELECTED_SCRIPT_PROPERTY.equals(name)) {
     Object value = evt.getNewValue();
     if (value instanceof ScriptObject)
       view.manageScript((ScriptObject) value, MetadataViewer.VIEW);
     else if (value instanceof String) {
       ScriptObject script = view.getScriptFromName((String) value);
       if (script != null) view.manageScript(script, MetadataViewer.VIEW);
     }
   } else if (AnalysisResultsItem.ANALYSIS_RESULTS_DELETE.equals(name)) {
     AnalysisResultsItem item = (AnalysisResultsItem) evt.getNewValue();
     List<FileAnnotationData> list = item.getAttachments();
     view.fireAnnotationsDeletion(list);
   } else if (AnalysisResultsItem.ANALYSIS_RESULTS_VIEW.equals(name)) {
     AnalysisResultsItem item = (AnalysisResultsItem) evt.getNewValue();
     if (view.getRndIndex() == MetadataViewer.RND_GENERAL) {
       model.displayAnalysisResults(item);
       /*
       ViewImage event = new ViewImage(item.getData(), null);
       event.setAnalysis(item);
       EventBus bus = MetadataViewerAgent.getRegistry().getEventBus();
       bus.post(event);
       */
     } else {
       model.displayAnalysisResults(item);
     }
   } else if (AnalysisResultsItem.ANALYSIS_RESULTS_CANCEL.equals(name)) {
     AnalysisResultsItem item = (AnalysisResultsItem) evt.getNewValue();
     view.cancelAnalysisResultsLoading(item);
   }
 }
 /**
  * Fires an asynchronous call to modify the default group of the logged in experimenter.
  *
  * @param group
  */
 void fireChangeGroup(GroupData group) {
   SecurityContext c = ctx;
   if (MetadataViewerAgent.isAdministrator()) c = getAdminContext();
   MetadataLoader loader = new GroupEditor(component, c, group, loaderID, GroupEditor.CHANGE);
   loader.load();
 }
  /**
   * Handles events.
   *
   * @see ActionListener#actionPerformed(ActionEvent)
   */
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() instanceof ScriptMenuItem) {
      ScriptMenuItem item = (ScriptMenuItem) e.getSource();
      if (item.isScriptWithUI()) {
        switch (item.getIndex()) {
          case ScriptMenuItem.MOVIE_FIGURE_SCRIPT:
            model.createFigure(FigureDialog.MOVIE);
            break;
          case ScriptMenuItem.ROI_FIGURE_SCRIPT:
            model.createFigure(FigureDialog.SPLIT_ROI);
            break;
          case ScriptMenuItem.THUMBNAIL_FIGURE_SCRIPT:
            model.createFigure(FigureDialog.THUMBNAILS);
            break;
          case ScriptMenuItem.SPLIT_VIEW_FIGURE_SCRIPT:
            model.createFigure(FigureDialog.SPLIT);
            break;
          case ScriptMenuItem.MOVIE_EXPORT_SCRIPT:
            view.makeMovie(-1, null);
            break;
          case ScriptMenuItem.FLIM_SCRIPT:
            openFLIM();
        }
      } else {
        ScriptObject object = item.getScript();
        if (!object.isParametersLoaded()) model.loadScript(object.getScriptID());
        else model.setScript(object);
      }
      return;
    }

    int index = Integer.parseInt(e.getActionCommand());

    switch (index) {
      case ADD_LOCAL_DOCS:
        selectFileToAttach();
        break;
      case ADD_UPLOADED_DOCS:
        model.loadExistingAttachments();
        break;
      case SAVE:
        view.saveData(true);
        break;
      case DOWNLOAD:
        download();
        break;
      case ADD_TAGS:
        loadExistingTags();
        break;
      case CREATE_NEW_EXPERIMENT:
        view.createNewExperiment();
        break;
      case CREATE_MOVIE:
        view.makeMovie(-1, null);
        break;
      case RENDERER:
        model.loadRenderingControl(RenderingControlLoader.LOAD);
        break;
      case ANALYSE_FLIM:
        view.analyse(AnalysisParam.FLIM);
        break;
      case ANALYSE_FRAP:
        view.analyse(AnalysisParam.FRAP);
        break;
      case REFRESH:
        model.refresh();
        break;
      case EXPORT_AS_OMETIFF:
        export();
        break;
      case SPLIT_VIEW_FIGURE:
        model.createFigure(FigureDialog.SPLIT);
        break;
      case SPLIT_VIEW_ROI_FIGURE:
        model.createFigure(FigureDialog.SPLIT_ROI);
        break;
      case THUMBNAILS_FIGURE:
        model.createFigure(FigureDialog.THUMBNAILS);
        break;
      case MOVIE_FIGURE:
        model.createFigure(FigureDialog.MOVIE);
        break;
      case UPLOAD_SCRIPT:
        view.uploadScript();
        break;
      case RELOAD_SCRIPT:
        view.reloadScript();
        break;
        /*
        case REMOVE_TAGS:
        	view.removeTags();
        	break;
        case REMOVE_DOCS:
        	view.removeAttachedFiles();
        	break;
        	*/
      case SAVE_AS:
        saveAsJPEG();
        break;
      case VIEW_IMAGE:
        Object refObject = view.getRefObject();
        ImageData img = null;
        if (refObject instanceof ImageData) {
          img = (ImageData) refObject;
        } else if (refObject instanceof WellSampleData) {
          img = ((WellSampleData) refObject).getImage();
        }
        if (img != null) {
          ViewImageObject vio = new ViewImageObject(img);
          MetadataViewerAgent.getRegistry()
              .getEventBus()
              .post(new ViewImage(model.getSecurityContext(), vio, null));
        }
        break;
      case VIEW_IMAGE_IN_IJ:
        Object object = view.getRefObject();
        ImageData image = null;
        if (object instanceof ImageData) {
          image = (ImageData) object;
        } else if (object instanceof WellSampleData) {
          image = ((WellSampleData) object).getImage();
        }
        if (image != null) {
          ViewInPluginEvent event =
              new ViewInPluginEvent(
                  model.getSecurityContext(), (DataObject) object, MetadataViewer.IMAGE_J);
          MetadataViewerAgent.getRegistry().getEventBus().post(event);
        }
    }
  }
 /**
  * Returns the security context.
  *
  * @return See above.
  */
 SecurityContext getAdminContext() {
   if (MetadataViewerAgent.isAdministrator()) return MetadataViewerAgent.getAdminContext();
   return null;
 }