/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/HTMLEditorController.h"

#include "mozilla/EditorCommands.h"    // for StyleUpdatingCommand, etc
#include "mozilla/mozalloc.h"          // for operator new
#include "nsControllerCommandTable.h"  // for nsControllerCommandTable
#include "nsError.h"                   // for NS_OK

namespace mozilla {

#define NS_REGISTER_COMMAND(_cmdClass, _cmdName)                       \
  {                                                                    \
    aCommandTable->RegisterCommand(                                    \
        _cmdName,                                                      \
        static_cast<nsIControllerCommand*>(_cmdClass::GetInstance())); \
  }

// static
nsresult HTMLEditorController::RegisterEditorDocStateCommands(
    nsControllerCommandTable* aCommandTable) {
  // observer commands for document state
  NS_REGISTER_COMMAND(DocumentStateCommand, "obs_documentCreated")
  NS_REGISTER_COMMAND(DocumentStateCommand, "obs_documentWillBeDestroyed")
  NS_REGISTER_COMMAND(DocumentStateCommand, "obs_documentLocationChanged")

  // commands that may get or change state
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_setDocumentModified")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_setDocumentUseCSS")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_setDocumentReadOnly")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_insertBrOnReturn")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_defaultParagraphSeparator")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_enableObjectResizing")
  NS_REGISTER_COMMAND(SetDocumentStateCommand, "cmd_enableInlineTableEditing")
  NS_REGISTER_COMMAND(SetDocumentStateCommand,
                      "cmd_enableAbsolutePositionEditing")
  NS_REGISTER_COMMAND(SetDocumentStateCommand,
                      "cmd_enableCompatibleJoinSplitNodeDirection")

  return NS_OK;
}

// static
nsresult HTMLEditorController::RegisterHTMLEditorCommands(
    nsControllerCommandTable* aCommandTable) {
  // Edit menu
  NS_REGISTER_COMMAND(PasteNoFormattingCommand, "cmd_pasteNoFormatting");

  // indent/outdent
  NS_REGISTER_COMMAND(IndentCommand, "cmd_indent");
  NS_REGISTER_COMMAND(OutdentCommand, "cmd_outdent");

  // Styles
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_bold");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_italic");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_underline");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_tt");

  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_strikethrough");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_superscript");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_subscript");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_nobreak");

  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_em");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_strong");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_cite");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_abbr");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_acronym");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_code");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_samp");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_var");
  NS_REGISTER_COMMAND(StyleUpdatingCommand, "cmd_removeLinks");

  // lists
  NS_REGISTER_COMMAND(ListCommand, "cmd_ol");
  NS_REGISTER_COMMAND(ListCommand, "cmd_ul");
  NS_REGISTER_COMMAND(ListItemCommand, "cmd_dt");
  NS_REGISTER_COMMAND(ListItemCommand, "cmd_dd");
  NS_REGISTER_COMMAND(RemoveListCommand, "cmd_removeList");

  // format stuff
  NS_REGISTER_COMMAND(ParagraphStateCommand, "cmd_paragraphState");
  NS_REGISTER_COMMAND(FontFaceStateCommand, "cmd_fontFace");
  NS_REGISTER_COMMAND(FontSizeStateCommand, "cmd_fontSize");
  NS_REGISTER_COMMAND(FontColorStateCommand, "cmd_fontColor");
  NS_REGISTER_COMMAND(BackgroundColorStateCommand, "cmd_backgroundColor");
  NS_REGISTER_COMMAND(HighlightColorStateCommand, "cmd_highlight");

  NS_REGISTER_COMMAND(AlignCommand, "cmd_align");
  NS_REGISTER_COMMAND(RemoveStylesCommand, "cmd_removeStyles");

  NS_REGISTER_COMMAND(IncreaseFontSizeCommand, "cmd_increaseFont");
  NS_REGISTER_COMMAND(DecreaseFontSizeCommand, "cmd_decreaseFont");

  // Insert content
  NS_REGISTER_COMMAND(InsertHTMLCommand, "cmd_insertHTML");
  NS_REGISTER_COMMAND(InsertTagCommand, "cmd_insertLinkNoUI");
  NS_REGISTER_COMMAND(InsertTagCommand, "cmd_insertImageNoUI");
  NS_REGISTER_COMMAND(InsertTagCommand, "cmd_insertHR");

  NS_REGISTER_COMMAND(AbsolutePositioningCommand, "cmd_absPos");
  NS_REGISTER_COMMAND(DecreaseZIndexCommand, "cmd_decreaseZIndex");
  NS_REGISTER_COMMAND(IncreaseZIndexCommand, "cmd_increaseZIndex");

  return NS_OK;
}

// static
void HTMLEditorController::Shutdown() {
  // EditorDocStateCommands
  DocumentStateCommand::Shutdown();
  SetDocumentStateCommand::Shutdown();

  // HTMLEditorCommands
  PasteNoFormattingCommand::Shutdown();
  IndentCommand::Shutdown();
  OutdentCommand::Shutdown();
  StyleUpdatingCommand::Shutdown();
  ListCommand::Shutdown();
  ListItemCommand::Shutdown();
  RemoveListCommand::Shutdown();
  ParagraphStateCommand::Shutdown();
  FontFaceStateCommand::Shutdown();
  FontSizeStateCommand::Shutdown();
  FontColorStateCommand::Shutdown();
  BackgroundColorStateCommand::Shutdown();
  HighlightColorStateCommand::Shutdown();
  AlignCommand::Shutdown();
  RemoveStylesCommand::Shutdown();
  IncreaseFontSizeCommand::Shutdown();
  DecreaseFontSizeCommand::Shutdown();
  InsertHTMLCommand::Shutdown();
  InsertTagCommand::Shutdown();
  AbsolutePositioningCommand::Shutdown();
  DecreaseZIndexCommand::Shutdown();
  IncreaseZIndexCommand::Shutdown();
}

}  // namespace mozilla
