Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git
/*
 * Copyright 2016 White Magic Software, Ltd.
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  o Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *  o Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.scrivenvar.service.events;

import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.stage.Window;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Observer;

/**
 * Provides the application with a uniform way to notify the user of events.
 *
 * @author White Magic Software, Ltd.
 */
public interface Notifier {

  ButtonType YES = ButtonType.YES;
  ButtonType NO = ButtonType.NO;
  ButtonType CANCEL = ButtonType.CANCEL;

  /**
   * Notifies the user of a problem.
   *
   * @param message The problem description.
   */
  void notify( final String message );

  /**
   * Notifies the user about the exception.
   *
   * @param ex The exception containing a message to show to the user.
   */
  default void notify( final Exception ex ) {
    assert ex != null;

    log( ex );
    notify( ex.getMessage() );
  }

  /**
   * Writes the exception to a log file. The log file should be written
   * in the System's temporary directory.
   *
   * @param ex The exception to show in the status bar and log to a file.
   */
  default void log( final Exception ex ) {
    try(
        final FileWriter fw = new FileWriter( getLogPath(), true );
        final PrintWriter pw = new PrintWriter( fw )
    ) {
      ex.printStackTrace( pw );
    } catch( final IOException ioe ) {
      // The notify method will display the message on the status
      // bar.
    }
  }

  /**
   * Returns the fully qualified path to the log file to write to when
   * an exception occurs.
   *
   * @return Location of the log file for writing unexpected exceptions.
   */
  File getLogPath();

  /**
   * Causes any displayed notifications to disappear.
   */
  void clear();

  /**
   * Constructs a default alert message text for a modal alert dialog.
   *
   * @param title   The dialog box message title.
   * @param message The dialog box message content (needs formatting).
   * @param args    The arguments to the message content that must be formatted.
   * @return The message suitable for building a modal alert dialog.
   */
  Notification createNotification(
      String title,
      String message,
      Object... args );

  /**
   * Creates an alert of alert type error with a message showing the cause of
   * the error.
   *
   * @param parent  Dialog box owner (for modal purposes).
   * @param message The error message, title, and possibly more details.
   * @return A modal alert dialog box ready to display using showAndWait.
   */
  Alert createError( Window parent, Notification message );

  /**
   * Creates an alert of alert type confirmation with Yes/No/Cancel buttons.
   *
   * @param parent  Dialog box owner (for modal purposes).
   * @param message The message, title, and possibly more details.
   * @return A modal alert dialog box ready to display using showAndWait.
   */
  Alert createConfirmation( Window parent, Notification message );

  /**
   * Adds an observer to the list of objects that receive notifications about
   * error messages to be presented to the user.
   *
   * @param observer The observer instance to notify.
   */
  void addObserver( Observer observer );
}