/**
   * Displays a notification dialog about the server being shut down regardless of whether the edit
   * contractor dialog itself is currently visible or not.
   */
  public final void deactivate() {
    // Disable everything
    nameField.setEnabled(false);
    locationField.setEnabled(false);
    specialtiesField.setEnabled(false);
    sizeField.setEnabled(false);
    rateField.setEnabled(false);
    ownerField.setEnabled(false);
    okButton.setEnabled(false);
    cancelButton.setEnabled(false);

    // Display notification about server going down
    JOptionPane.showMessageDialog(
        isVisible() ? this : getParent(),
        Text.SERVER_IS_GOING_DOWN,
        Text.SERVER_TERMINATION_NOTIFICATION,
        JOptionPane.WARNING_MESSAGE);

    if (isVisible()) {
      setVisible(false);
    }
  }
  /**
   * Configures the dialog as a book contractor dialog and displays it. Returns when the dialog has
   * been made invisible after confirmation or cancellation.
   *
   * @param recNo the number of the contractor record to book
   * @param contractor the contractor object corresponding to the given <code>recNo</code>
   * @param businessServices an object implementing the <code>BusinessServices</code> interface for
   *     the <code>book</code> request to the model
   * @return a <code>BookResult</code> with <code>BookStatus</code> and <code>Contractor</code> if
   *     booking was actually attempted (OK button pressed), otherwise (Cancel button pressed)
   *     <code>null</code>.
   */
  public final BookResult bookContractor(
      final long recNo, final Contractor contractor, final BusinessServices businessServices) {
    validOwner = false;

    BookActionHandler bookActionHandler = new BookActionHandler(recNo, businessServices);
    okButton.addActionListener(bookActionHandler);

    okButton.setEnabled(validOwner);
    // Activate the cancel button (possibly still deactivated from previous
    // invocation).
    cancelButton.setEnabled(true);

    nameField.setText(contractor.getName());
    nameField.setEnabled(false);

    locationField.setText(contractor.getLocation());
    locationField.setEnabled(false);

    specialtiesField.setText(contractor.getSpecialties());
    specialtiesField.setEnabled(false);

    sizeField.setText(contractor.getSize());
    sizeField.setEnabled(false);

    rateField.setText(contractor.getRate());
    rateField.setEnabled(false);

    // To validate the initial text, it is crucial that the validity
    // listener be added before setting the text.
    ownerField.addValidityChangeListener(
        new ValidityChangeListener() {
          @Override
          public void validityGained(final ValidityChangeEvent ve) {
            validOwner = true;
            okButton.setEnabled(validOwner);
          }

          @Override
          public void validityLost(final ValidityChangeEvent ve) {
            validOwner = false;
            okButton.setEnabled(validOwner);
          }
        });
    ownerField.setText(contractor.getOwner());
    ownerField.setEnabled(true);
    ownerField.addKeyListener(textFieldEnterKeyHandler);

    setTitle(Text.BOOK_CONTRACTOR_TITLE);
    setLocationRelativeTo(getParent());

    ownerField.requestFocusInWindow();

    setVisible(true);

    okButton.removeActionListener(bookActionHandler);

    // Return true if OK button has been pushed.
    JOptionPane optionPane = (JOptionPane) getContentPane();
    if (optionPane.getValue() instanceof Integer) {
      int status = ((Integer) (optionPane.getValue())).intValue();
      if (status == JOptionPane.OK_OPTION) {
        return bookActionHandler.bookResult;
      }
    }
    return null;
  }