@Override
  public void actionPerformed(ActionEvent evt) {
    final Application app = getApplication();
    if (app.isEnabled()) {
      app.setEnabled(false);
      // Search for an empty view
      View emptyView = app.getActiveView();
      if (emptyView == null || !emptyView.isEmpty() || !emptyView.isEnabled()) {
        emptyView = null;
      }

      final View p;
      if (emptyView == null) {
        p = app.createView();
        app.add(p);
        app.show(p);
      } else {
        p = emptyView;
      }
      openView(p);
    }
  }
  protected void openView(final View view) {
    final Application app = getApplication();
    app.setEnabled(true);

    // If there is another view with the same URI we set the multiple open
    // id of our view to max(multiple open id) + 1.
    int multipleOpenId = 1;
    for (View aView : app.views()) {
      if (aView != view && aView.isEmpty()) {
        multipleOpenId = Math.max(multipleOpenId, aView.getMultipleOpenId() + 1);
      }
    }
    view.setMultipleOpenId(multipleOpenId);
    view.setEnabled(false);

    // Open the file
    view.execute(
        new Worker() {

          @Override
          protected Object construct() throws IOException {
            boolean exists = true;
            try {
              File f = new File(uri);
              exists = f.exists();
            } catch (IllegalArgumentException e) {
              // The URI does not denote a file, thus we can not check whether the file exists.
            }
            if (exists) {
              view.read(uri, null);
              return null;
            } else {
              ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.app.Labels");
              throw new IOException(
                  labels.getFormatted("file.open.fileDoesNotExist.message", URIUtil.getName(uri)));
            }
          }

          @Override
          protected void done(Object value) {
            view.setURI(uri);
            Frame w = (Frame) SwingUtilities.getWindowAncestor(view.getComponent());
            if (w != null) {
              w.setExtendedState(w.getExtendedState() & ~Frame.ICONIFIED);
              w.toFront();
            }
            view.setEnabled(true);
            view.getComponent().requestFocus();
          }

          @Override
          protected void failed(Throwable value) {
            value.printStackTrace();
            String message = value.getMessage() != null ? value.getMessage() : value.toString();
            ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.app.Labels");
            JSheet.showMessageSheet(
                view.getComponent(),
                "<html>"
                    + UIManager.getString("OptionPane.css")
                    + "<b>"
                    + labels.getFormatted("file.open.couldntOpen.message", URIUtil.getName(uri))
                    + "</b><p>"
                    + (message == null ? "" : message),
                JOptionPane.ERROR_MESSAGE,
                new SheetListener() {

                  @Override
                  public void optionSelected(SheetEvent evt) {
                    view.setEnabled(true);
                  }
                });
          }
        });
  }