/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */
/* 
   AddrBookFrame.cpp -- address book window stuff.
   Created: Chris Toshok <toshok@netscape.com>, 29-Aug-96.
   Revised: Tao Cheng <tao@netscape.com>, 01-nov-96
 */

#include "AddrBookFrame.h"
#include "LdapSearchFrame.h"

#include "AB2PaneView.h"
#include "AddrBookView.h"

#include "ComposeView.h"
#include "ComposeFolderView.h"
#include "Dashboard.h"
#include <Xfe/Xfe.h>

#include "xpassert.h"

#include "prefs.h"
#include "prefapi.h"

#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/TextF.h>
#include <Xm/DialogS.h>
#include <Xm/FileSB.h>

#include "DtWidgets/ComboBox.h"

extern "C" {
#include "xfe.h"

XP_List* FE_GetDirServers();
};

MenuSpec XFE_AddrBookFrame::file_menu_spec[] = {
  { "newSubmenu",		CASCADEBUTTON,
	(MenuSpec*)&XFE_Frame::new_menu_spec },
  { xfeCmdAddToAddressBook,	PUSHBUTTON },
  { xfeCmdABNewList,		PUSHBUTTON },
  { xfeCmdImport,		PUSHBUTTON },
  MENU_SEPARATOR,
  { xfeCmdSaveAs,		PUSHBUTTON },
  { xfeCmdABCall,		PUSHBUTTON },
  MENU_SEPARATOR,
  { xfeCmdClose,		PUSHBUTTON },
  { xfeCmdExit,		PUSHBUTTON },
  { NULL }
};

MenuSpec XFE_AddrBookFrame::edit_menu_spec[] = {
  { xfeCmdUndo,			PUSHBUTTON },
  { xfeCmdRedo,			PUSHBUTTON },
  MENU_SEPARATOR,
#if 0
  /* do not take out yet */
  { xfeCmdCut,			PUSHBUTTON },
  { xfeCmdCopy,	        PUSHBUTTON },
  { xfeCmdPaste,		PUSHBUTTON },
#endif
  { xfeCmdABDeleteEntry,PUSHBUTTON },
  { xfeCmdSelectAll,	PUSHBUTTON },
  MENU_SEPARATOR,
  { xfeCmdSearchAddress,		PUSHBUTTON },
  MENU_SEPARATOR,
  { xfeCmdDisplayHTMLDomainsDialog,	PUSHBUTTON },
  { xfeCmdViewProperties,	PUSHBUTTON },
  { xfeCmdEditPreferences,	PUSHBUTTON },
  { NULL }
};

MenuSpec XFE_AddrBookFrame::view_menu_spec[] = {
	{ xfeCmdToggleNavigationToolbar,	PUSHBUTTON },
	MENU_SEPARATOR,
	{ xfeCmdABByType,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	{ xfeCmdABByName,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	{ xfeCmdABByEmailAddress,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	{ xfeCmdABByNickName,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	{ xfeCmdABByCompany,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	{ xfeCmdABByLocality,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortTypeGroup" },
	MENU_SEPARATOR,
	{ xfeCmdSortAscending,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortOrderGroup" },
	{ xfeCmdSortDescending,	
	  TOGGLEBUTTON, NULL, "AddrBookViewSortOrderGroup" },
	MENU_SEPARATOR,
	{ xfeCmdABvCard,	PUSHBUTTON },
	{ NULL }
};

MenuSpec XFE_AddrBookFrame::menu_bar_spec[] = {
  { xfeMenuFile, 	CASCADEBUTTON, 
    (MenuSpec*)&XFE_AddrBookFrame::file_menu_spec },
  { xfeMenuEdit, 	CASCADEBUTTON, 
    (MenuSpec*)&XFE_AddrBookFrame::edit_menu_spec },
  { xfeMenuView, 	CASCADEBUTTON, 
    (MenuSpec*)&XFE_AddrBookFrame::view_menu_spec },
  { xfeMenuWindow, 	CASCADEBUTTON, 
    (MenuSpec*)&XFE_Frame::window_menu_spec },
  { xfeMenuHelp, 	CASCADEBUTTON,
    (MenuSpec*)&XFE_Frame::help_menu_spec },
  { NULL }
};

ToolbarSpec XFE_AddrBookFrame::toolbar_spec[] = {
  { xfeCmdAddToAddressBook,	PUSHBUTTON, &MNAB_NewPerson_group},
  { xfeCmdABNewList,	        PUSHBUTTON, &MNAB_NewList_group},
  { xfeCmdABEditEntry,		PUSHBUTTON, &MNAB_Properties_group},

  {  // XX mail only
    xfeCmdComposeMessage,
    CASCADEBUTTON,
    &MNTB_Compose_group, NULL, NULL, NULL, // Icons
    compose_message_submenu_spec, // Submenu spec
    NULL, NULL, // Generate proc/arg
    XFE_TOOLBAR_DELAY_LONG // Popup delay
  },

  { xfeCmdSearchAddress,	        PUSHBUTTON, &MNC_Directory_group},
  { xfeCmdABCall,	        PUSHBUTTON, &MNAB_Call_group},
  { xfeCmdABDeleteEntry,	PUSHBUTTON, &MNTB_Trash_group},
  { xfeCmdStopLoading,		PUSHBUTTON, &TB_Stop_group },
  { NULL }
};

MenuSpec XFE_AddrBookFrame::frame_popup_spec[] = {
  { xfeCmdAddToAddressBook,	PUSHBUTTON },
  { xfeCmdABNewList,		PUSHBUTTON },
  { NULL }
};


extern "C" {
	Widget fe_CreateFileSelectionBox(Widget, char*, Arg*, Cardinal);
	const char *FE_UsersFullName (void);
};

#include "xpgetstr.h"

extern int XFE_AB_FRAME_TITLE;
/* Hack:
 * pixmaps for the address book. 
 */
XFE_Frame* XFE_AddrBookFrame::m_theFrame = 0;
//
XFE_AddrBookFrame::XFE_AddrBookFrame(Widget toplevel, 
									 XFE_Frame *parent_frame,
									 Chrome *chromespec) 
  : XFE_Frame("AddressBook",
			  toplevel, 
			  parent_frame,
			  FRAME_ADDRESSBOOK,
              chromespec,
			  False /* HTML */,
			  True  /* menuBar */, 
			  True /* toolBar */, 
			  True  /* dashBoard */,
			  True /* destroyOnClose */),
	m_popup(0)
{
  m_abView = 0;
  setToolbar(toolbar_spec);
  /* create the addressbook view; 
   * import from XFE_BookmarkFrame::XFE_BookmarkFrame
   */
  XFE_AB2PaneView *view = new XFE_AB2PaneView(this, 
											  getViewParent(), 
											  NULL,
											  m_context,
											  AB_BOOK);
  m_abView = (XFE_AddrBookView *) view->getEntriesListView();

  /* Attachment
   */
  XtVaSetValues(view->getBaseWidget(),
		XmNleftAttachment, XmATTACH_FORM,
		XmNtopAttachment, XmATTACH_FORM,
		XmNrightAttachment, XmATTACH_FORM,
		XmNbottomAttachment, XmATTACH_FORM,
		NULL);

  setView(view);
  setMenubar(menu_bar_spec);

  char title[kMaxFullNameLength+64];
  PR_snprintf(title, sizeof(title),
              XP_GetString(XFE_AB_FRAME_TITLE),
    	      FE_UsersFullName());
  setTitle(title);

  /* show 
   */
  view->show();

  m_dashboard->setShowStatusBar(True);
  m_dashboard->setShowProgressBar(True);
  //
  m_dashboard->setShowSecurityIcon(True);

  // Configure the toolbox for the first time
  configureToolbox();
}

XFE_AddrBookFrame::~XFE_AddrBookFrame()
{
	m_theFrame = 0;
}

XP_Bool XFE_AddrBookFrame::handlesCommand(CommandType cmd, 
										  void */* calldata */,
										  XFE_CommandInfo* /* info */)
{
  if (cmd == xfeCmdShowPopup
	  || cmd == xfeCmdImport
	  || cmd == xfeCmdSaveAs
	  || cmd == xfeCmdStopLoading
	  || cmd == xfeCmdUndo
	  || cmd == xfeCmdRedo
	  || cmd == xfeCmdABDeleteEntry
	  || cmd == xfeCmdFindInObject
	  || cmd == xfeCmdFindAgain
	  || cmd == xfeCmdSearchAddress
	  || cmd == xfeCmdEditPreferences
	  || cmd == xfeCmdABByType
	  || cmd == xfeCmdABByName
	  || cmd == xfeCmdABByEmailAddress
	  || cmd == xfeCmdABByCompany
	  || cmd == xfeCmdABByLocality
	  || cmd == xfeCmdABByNickName
	  || cmd == xfeCmdSortAscending
	  || cmd == xfeCmdSortDescending
	  || cmd == xfeCmdAddToAddressBook
	  || cmd == xfeCmdABNewList
	  || cmd == xfeCmdViewProperties
	  || cmd == xfeCmdDisplayHTMLDomainsDialog
	  || cmd == xfeCmdABEditEntry
	  || cmd == xfeCmdABDeleteEntry
	  || cmd == xfeCmdABCall
	  || cmd == xfeCmdABvCard)
	  return TRUE;
  else
	  /* Default
	   */
	  return XFE_Frame::handlesCommand(cmd);
}

char *XFE_AddrBookFrame::commandToString(CommandType cmd,
						   void *calldata, XFE_CommandInfo* info)
{
	XFE_Command* handler = getCommand(cmd);

	if (handler != NULL)
		return handler->getLabel(this, info);

	if (cmd == xfeCmdToggleNavigationToolbar) {
		char *res = NULL;
		
		if (m_toolbar->isShown())
			res = "hideNavToolbarCmdString";
		else
			res = "showNavToolbarCmdString";
		return stringFromResource(res);
	}
	else
		return XFE_Frame::commandToString(cmd, calldata, info);
}

XP_Bool
XFE_AddrBookFrame::isCommandEnabled(CommandType cmd, void *, XFE_CommandInfo*)
{
  /* first we handle the commands we know about.. 
   * xfeCmdClose xfeCmdEditPreferences 
   */
  if (cmd == xfeCmdOpenInbox
      || cmd == xfeCmdOpenNewsgroups
      || cmd == xfeCmdOpenFolders

	  || cmd == xfeCmdSearchAddress
      || cmd == xfeCmdEditPreferences

      || cmd == xfeCmdOpenBookmarks

#ifdef JAVA
      || cmd == xfeCmdJavaConsole 
#endif /* JAVA */

	  || cmd == xfeCmdSelectAll
	  || cmd == xfeCmdABvCard

	  || cmd == xfeCmdDisplayHTMLDomainsDialog) {
	  return TRUE;
  }/* if */
  else if (cmd == xfeCmdOpenAddressBook) {
	  return FALSE;
  }/* else if */
  else if (cmd == xfeCmdStopLoading) {
	  return m_abView?m_abView->isSearching():False;
  }/* else if */
  else {
    return XFE_Frame::isCommandEnabled(cmd);
  }/* else */
}

char *XFE_AddrBookFrame::getDocString(CommandType cmd)
{
	if ((cmd == xfeCmdComposeMessage ||
	    (cmd == xfeCmdComposeMessageHTML) ||
	    (cmd == xfeCmdComposeMessagePlain) ||
		cmd == xfeCmdABCall) && m_abView)
		return m_abView->getDocString(cmd);
	return XFE_Frame::getDocString(cmd);
}

char *XFE_AddrBookFrame::getTipString(CommandType /* cmd */)
{
	return NULL;
}

void XFE_AddrBookFrame::doCommand(CommandType cmd, 
								  void *calldata, XFE_CommandInfo* info)
{
  /* first we handle the commands we know about. 
   */

  /* file_menu_spec xfeCmdClose
   */
  if (cmd == xfeCmdComposeMessage) 
	  composeMessage();
  else if (cmd == xfeCmdStopLoading) 
	  m_abView->stopSearch();
  else if (cmd == xfeCmdComposeMessageHTML) 
  {
     CONTEXT_DATA(m_context)->stealth_cmd = 
			(fe_globalPrefs.send_html_msg == False);
     composeMessage();
  }
  else if ( cmd == xfeCmdComposeMessagePlain) 
  {
     CONTEXT_DATA(m_context)->stealth_cmd = 
			(fe_globalPrefs.send_html_msg == True);
     composeMessage();
  }
  else if (cmd == xfeCmdImport)
    import();
  else if (cmd == xfeCmdSaveAs)
    saveAs();
  /* edit_menu_spec
   */
  else if (cmd == xfeCmdUndo)
    undo();
  else if (cmd == xfeCmdRedo)
    redo();
  else if (cmd == xfeCmdABDeleteEntry)
    abDelete();
  else if (cmd == xfeCmdFindInObject)
    printf("\n %s", xfeCmdComposeMessage);
  else if (cmd == xfeCmdFindAgain)
    printf("\n %s", xfeCmdComposeMessage);
  else if (cmd == xfeCmdSearchAddress) {
	  fe_showLdapSearch(XfeAncestorFindApplicationShell(getBaseWidget()), this, (Chrome*)NULL);
  }/* else if */
  else if (cmd == xfeCmdEditPreferences)
    fe_showMailNewsPreferences(this, (MWContext*)m_view->getContext());

  /* view_menu_spec
   */
#if defined(USE_ABCOM)
  else if (cmd == xfeCmdABByType) {
    m_abView->setSortType(AB_attribEntryType);
  }
  else if (cmd == xfeCmdABByName) {
    m_abView->setSortType(AB_attribFullName);
  }
  else if (cmd == xfeCmdABByEmailAddress) {
    m_abView->setSortType(AB_attribEmailAddress);
  }
  else if (cmd == xfeCmdABByCompany) {
    m_abView->setSortType(AB_attribCompanyName);
  }
  else if (cmd == xfeCmdABByLocality) {
    m_abView->setSortType(AB_attribLocality);
  }
  else if (cmd == xfeCmdABByNickName) {
    m_abView->setSortType(AB_attribNickName);
  }
#else
  else if (cmd == xfeCmdABByType) {
    m_abView->setSortType(AB_SortByTypeCmd);
  }
  else if (cmd == xfeCmdABByName) {
    m_abView->setSortType(AB_SortByFullNameCmd);
  }
  else if (cmd == xfeCmdABByEmailAddress) {
    m_abView->setSortType(AB_SortByEmailAddress);
  }
  else if (cmd == xfeCmdABByCompany) {
    m_abView->setSortType(AB_SortByCompanyName);
  }
  else if (cmd == xfeCmdABByLocality) {
    m_abView->setSortType(AB_SortByLocality);
  }
  else if (cmd == xfeCmdABByNickName) {
    m_abView->setSortType(AB_SortByNickname);
  }
#endif /* USE_ABCOM */
  else if (cmd == xfeCmdSortAscending) {
    m_abView->setAscending(True);
  }
  else if (cmd == xfeCmdSortDescending) {
    m_abView->setAscending(False);
  }
  /* item_menu_spec
   */
  else if (cmd == xfeCmdAddToAddressBook)
    /* Add new user
     */
    addToAddressBook();
  else if (cmd == xfeCmdABNewList)
    /* Add new list
     */
    newList();
  else if (cmd == xfeCmdViewProperties)
    /* Edit property
     */
    viewProperties();

  else if (cmd == xfeCmdDisplayHTMLDomainsDialog)
    
	  MSG_DisplayHTMLDomainsDialog((MWContext*)m_view->getContext());
  /* ToolBar
   */
  else if (cmd == xfeCmdABEditEntry)
    /* Edit property
     */
    viewProperties();
  else if (cmd == xfeCmdABDeleteEntry)
    abDelete();
  else if (cmd == xfeCmdABCall)
	  abCall();
  else if (cmd == xfeCmdABvCard)
	  abVCard();
  else	if (cmd == xfeCmdShowPopup) {
		// Finish up the popup
		XEvent *event = info->event;

		if (m_popup)
			delete m_popup;
		
		m_popup = new XFE_PopupMenu("popup",(XFE_Frame *) this,
									XfeAncestorFindApplicationShell(getBaseWidget()));
		m_popup->addMenuSpec(frame_popup_spec);
		m_popup->position (event);
		m_popup->show();
  }/* else if */
  else
    /* Default
     */
    XFE_Frame::doCommand(cmd, calldata, info);
}/* XFE_AddrBookFrame::doCommand() */


void XFE_AddrBookFrame::openBrowser() {

}

void XFE_AddrBookFrame::composeMessage() {
  MSG_Pane *pane = NULL;
  pane = MSG_Mail((MWContext*)m_abView->getContext());

  ABAddrMsgCBProcStruc *pairs = ((XFE_AddrBookView*)m_abView)->getSelections();

  if (pairs && pairs->m_count) {
	  XFE_ComposeView *composeView = (XFE_ComposeView *)MSG_GetFEData(pane);

	  if (composeView) {
		  XFE_ComposeFolderView *composeFolderView = 
			  (XFE_ComposeFolderView *)composeView->getComposeFolderView();
		  
		  if (composeFolderView)
			  composeFolderView->getAddrFolderView()->addrMsgCB(pairs);
	  }/* if */
  }/* if */
}

void XFE_AddrBookFrame::abAddToMessage() 
{
}

void XFE_AddrBookFrame::import() 
{

  AB_ImportFromFile(((XFE_AddrBookView *)m_abView)->getABPane(),
					(MWContext *)m_abView->getContext());

}/* XFE_AddrBookFrame::import() */

void XFE_AddrBookFrame::saveAs()
{

	AB_ExportToFile(((XFE_AddrBookView *)m_view)->getABPane(),
					(MWContext *)m_abView->getContext());

}

XP_Bool XFE_AddrBookFrame::isOkToClose()
{
  XFE_ABListSearchView *searchView = (XFE_ABListSearchView *) m_abView;
  searchView->unRegisterInterested();
  return TRUE;
}/* XFE_AddrBookFrame::isOkToClose() */

void XFE_AddrBookFrame::close() {
  delete_response();
}

void XFE_AddrBookFrame::undo() {
  m_abView->undo();
}

void XFE_AddrBookFrame::redo() {
  m_abView->redo();
}

void XFE_AddrBookFrame::abDelete() {
  m_abView->delUser();
}

void XFE_AddrBookFrame::addToAddressBook() {
  /* shall this be new user ??
   */
  m_abView->newUser();
}

void XFE_AddrBookFrame::abVCard() {
  /* shall this be new user ??
   */
  m_abView->abVCard();
}

void XFE_AddrBookFrame::newList() {
  /* popup new lsit
   */
  m_abView->newList();
}

void XFE_AddrBookFrame::viewProperties() { 
  /* edit property
   */
  m_abView->editProperty();
}

void XFE_AddrBookFrame::abCall() { 
  m_abView->abCall();
}

/* C API
 */
extern "C"  MWContext*
fe_showAddrBook(Widget toplevel, XFE_Frame *parent_frame, Chrome *chromespec)
{

	if (!XFE_AddrBookFrame::m_theFrame)
		XFE_AddrBookFrame::m_theFrame = 
			new XFE_AddrBookFrame(toplevel, parent_frame, chromespec);

	XFE_AddrBookFrame::m_theFrame->show();
	
	return XFE_AddrBookFrame::m_theFrame->getContext();
}

//////////////////////////////////////////////////////////////////////////
//
// Toolbox methods
//
//////////////////////////////////////////////////////////////////////////
void
XFE_AddrBookFrame::toolboxItemClose(XFE_ToolboxItem * item)
{
	XP_ASSERT( item != NULL );

	// Address_Book_Toolbar
	if (item == m_toolbar)
	{
		fe_globalPrefs.address_book_address_book_toolbar_open = False;
	}
}
//////////////////////////////////////////////////////////////////////////
void
XFE_AddrBookFrame::toolboxItemOpen(XFE_ToolboxItem * item)
{
	XP_ASSERT( item != NULL );

	// Address_Book_Toolbar
	if (item == m_toolbar)
	{
		fe_globalPrefs.address_book_address_book_toolbar_open = True;
	}
}
//////////////////////////////////////////////////////////////////////////
void
XFE_AddrBookFrame::toolboxItemChangeShowing(XFE_ToolboxItem * item)
{
	XP_ASSERT( item != NULL );

	// Address_Book_Toolbar
	if (item == m_toolbar)
	{
		fe_globalPrefs.address_book_address_book_toolbar_showing = item->isShown();
	}
}
//////////////////////////////////////////////////////////////////////////
void
XFE_AddrBookFrame::configureToolbox()
{
	// If a the frame was constructed with a chromespec, then we ignore
	// all the preference magic.
	if (m_chromespec_provided)
	{
		return;
	}

	// Make sure the toolbox is alive
	if (!m_toolbox || (m_toolbox && !m_toolbox->isAlive()))
	{
		return;
	}

	// Address_Book_Toolbar
	if (m_toolbar)
	{
		m_toolbar->setShowing(fe_globalPrefs.address_book_address_book_toolbar_showing);
		m_toolbar->setOpen(fe_globalPrefs.address_book_address_book_toolbar_open);
	}
}
//////////////////////////////////////////////////////////////////////////
