589 lines
15 KiB
C++
589 lines
15 KiB
C++
/* -*- 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.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
/*
|
|
FolderFrame.cpp -- Folder window stuff
|
|
Created: Chris Toshok <toshok@netscape.com>, 29-Aug-96.
|
|
*/
|
|
|
|
|
|
|
|
#include "MozillaApp.h"
|
|
#include "ThreadFrame.h"
|
|
#include "FolderFrame.h"
|
|
#include "FolderView.h"
|
|
#include "FolderMenu.h"
|
|
#include "Dashboard.h"
|
|
#include "Command.h"
|
|
#ifdef CLEAN_UP_NEWS
|
|
#include "MailDownloadFrame.h"
|
|
#include "Xfe/Xfe.h"
|
|
#endif
|
|
#include "xpassert.h"
|
|
|
|
#include "libi18n.h"
|
|
#include "intl_csi.h"
|
|
|
|
#ifdef DEBUG_toshok
|
|
#define D(x) x
|
|
#else
|
|
#define D(x)
|
|
#endif
|
|
|
|
#include "xpgetstr.h"
|
|
extern int XFE_SILLY_NAME_FOR_SEEMINGLY_UNAMEABLE_THING;
|
|
extern int XFE_MN_FOLDER_TITLE;
|
|
extern int XFE_INBOX_DOESNT_EXIST;
|
|
|
|
/* there is only one folder frame. */
|
|
static XFE_FolderFrame *theFrame = NULL;
|
|
|
|
MenuSpec XFE_FolderFrame::file_menu_spec[] = {
|
|
{ "newSubmenu", CASCADEBUTTON, (MenuSpec *) &XFE_ThreadFrame::new_submenu_spec },
|
|
{ xfeCmdNewNewsHost, PUSHBUTTON },
|
|
{ xfeCmdOpenSelected, PUSHBUTTON },
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdRenameFolder, PUSHBUTTON },
|
|
{ xfeCmdEmptyTrash, PUSHBUTTON },
|
|
{ xfeCmdCompressFolders, PUSHBUTTON },
|
|
{ xfeCmdCleanUpDisk, PUSHBUTTON },
|
|
MENU_SEPARATOR,
|
|
{ "newMsgSubmenu", CASCADEBUTTON, (MenuSpec *) &XFE_Frame::newMsg_submenu_spec },
|
|
{ xfeCmdSendMessagesInOutbox, PUSHBUTTON },
|
|
#if 0
|
|
{ xfeCmdUpdateMessageCount, PUSHBUTTON },
|
|
#endif
|
|
{ xfeCmdAddNewsgroup, PUSHBUTTON },
|
|
//MENU_SEPARATOR,
|
|
//{ xfeCmdGoOffline, PUSHBUTTON },
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdClose, PUSHBUTTON },
|
|
{ xfeCmdExit, PUSHBUTTON },
|
|
{ NULL }
|
|
};
|
|
|
|
MenuSpec XFE_FolderFrame::edit_menu_spec[] = {
|
|
{ xfeCmdUndo, PUSHBUTTON },
|
|
{ xfeCmdRedo, PUSHBUTTON },
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdCut, PUSHBUTTON },
|
|
{ xfeCmdCopy, PUSHBUTTON },
|
|
{ xfeCmdPaste, PUSHBUTTON },
|
|
{ xfeCmdDeleteFolder, PUSHBUTTON },
|
|
{ xfeCmdSelectAll, PUSHBUTTON },
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdSearch, PUSHBUTTON },
|
|
#if 0
|
|
/* temporary take out
|
|
*/
|
|
{ xfeCmdSearchAddress, PUSHBUTTON },
|
|
#endif
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdEditMailFilterRules,PUSHBUTTON },
|
|
{ xfeCmdViewProperties, PUSHBUTTON },
|
|
{ xfeCmdEditPreferences, PUSHBUTTON },
|
|
{ NULL }
|
|
};
|
|
|
|
MenuSpec XFE_FolderFrame::view_menu_spec[] = {
|
|
{ "showSubmenu", CASCADEBUTTON, (MenuSpec *) &XFE_ThreadFrame::show_submenu_spec },
|
|
MENU_SEPARATOR,
|
|
{ "expandCollapseSubmenu", CASCADEBUTTON,
|
|
(MenuSpec *) &XFE_Frame::expand_collapse_submenu_spec },
|
|
// Move Folders out of the menu for now -- see bug 68204.
|
|
// { "moveSubmenu", DYNA_CASCADEBUTTON, NULL, NULL, False,
|
|
// (void*)xfeCmdMoveFoldersInto, XFE_FolderMenu::generate },
|
|
MENU_SEPARATOR,
|
|
{ xfeCmdStopLoading, PUSHBUTTON },
|
|
{ NULL }
|
|
};
|
|
|
|
MenuSpec XFE_FolderFrame::menu_bar_spec[] = {
|
|
{ xfeMenuFile, CASCADEBUTTON, file_menu_spec },
|
|
{ xfeMenuEdit, CASCADEBUTTON, edit_menu_spec },
|
|
{ xfeMenuView, CASCADEBUTTON, view_menu_spec },
|
|
{ "bookmarksSubmenu", CASCADEBUTTON, XFE_Frame::bookmark_submenu_spec },
|
|
{ xfeMenuWindow, CASCADEBUTTON, XFE_Frame::window_menu_spec },
|
|
{ xfeMenuHelp, CASCADEBUTTON, XFE_Frame::help_menu_spec },
|
|
{ NULL }
|
|
};
|
|
|
|
ToolbarSpec XFE_FolderFrame::toolbar_spec[] = {
|
|
{ xfeCmdGetNewMessages, PUSHBUTTON, &MNTB_GetMsg_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
|
|
},
|
|
{ xfeCmdNewFolder, PUSHBUTTON, &MNTB_NewFolder_group },
|
|
{ xfeCmdAddNewsgroup, PUSHBUTTON, &MNTB_AddGroup_group },
|
|
#if 0
|
|
{ xfeCmdDeleteFolder, PUSHBUTTON, &MNTB_Trash_group },
|
|
#endif
|
|
{ xfeCmdStopLoading, PUSHBUTTON, &TB_Stop_group },
|
|
{ NULL }
|
|
};
|
|
|
|
XFE_FolderFrame::XFE_FolderFrame(Widget toplevel,
|
|
XFE_Frame *parent_frame,
|
|
Chrome *chromespec)
|
|
: XFE_Frame("MailFolder", toplevel, parent_frame,
|
|
FRAME_MAILNEWS_FOLDER, chromespec)
|
|
{
|
|
INTL_CharSetInfo c = LO_GetDocumentCharacterSetInfo(m_context);
|
|
INTL_SetCSIWinCSID(c,
|
|
INTL_DocToWinCharSetID (CONTEXT_DATA (m_context)->xfe_doc_csid));
|
|
|
|
geometryPrefName = "mail.folder";
|
|
|
|
D( printf ("in XFE_FolderFrame::XFE_FolderFrame()\n");)
|
|
|
|
// create the folder view
|
|
XFE_FolderView *view = new XFE_FolderView(this, getChromeParent(), NULL, m_context);
|
|
char banner_title[1024];
|
|
|
|
m_banner = new XFE_MNBanner(this, m_toolbox);
|
|
|
|
setView(view);
|
|
|
|
PR_snprintf(banner_title, sizeof(banner_title),
|
|
XP_GetString( XFE_SILLY_NAME_FOR_SEEMINGLY_UNAMEABLE_THING ),
|
|
FE_UsersFullName());
|
|
|
|
m_banner->setTitle( banner_title );
|
|
m_banner->setSubtitle("");
|
|
|
|
// window title
|
|
char title[1024];
|
|
PR_snprintf(title, sizeof(title),
|
|
XP_GetString(XFE_MN_FOLDER_TITLE),
|
|
FE_UsersFullName());
|
|
|
|
setTitle(title );
|
|
|
|
setMenubar(menu_bar_spec);
|
|
setToolbar(toolbar_spec);
|
|
|
|
// m_banner->show();
|
|
view->show();
|
|
|
|
|
|
XFE_MozillaApp::theApp()->registerInterest(XFE_MNView::MNChromeNeedsUpdating,
|
|
this,
|
|
(XFE_FunctionNotification)MNChromeUpdate_cb);
|
|
|
|
{
|
|
Pixel bg_pixel;
|
|
|
|
XtVaGetValues(m_banner->getBaseWidget(),
|
|
XmNbackground, &bg_pixel,
|
|
NULL);
|
|
|
|
if (!XFE_MNView::collectionsIcon.pixmap)
|
|
fe_NewMakeIcon(m_widget,
|
|
getFGPixel(),
|
|
bg_pixel,
|
|
&XFE_MNView::collectionsIcon,
|
|
NULL,
|
|
MN_MessageCenter.width, MN_MessageCenter.height,
|
|
MN_MessageCenter.mono_bits, MN_MessageCenter.color_bits,
|
|
MN_MessageCenter.mask_bits, FALSE);
|
|
}
|
|
|
|
m_banner->setProxyIcon(&XFE_MNView::collectionsIcon);
|
|
|
|
m_dashboard->setShowStatusBar(True);
|
|
m_dashboard->setShowProgressBar(True);
|
|
|
|
// Configure the toolbox for the first time
|
|
configureToolbox();
|
|
|
|
D( printf ("leaving XFE_FolderFrame::XFE_FolderFrame()\n");)
|
|
}
|
|
|
|
XFE_FolderFrame::~XFE_FolderFrame()
|
|
{
|
|
D( printf ("in XFE_FolderFrame::~XFE_FolderFrame()\n");)
|
|
|
|
XFE_MozillaApp::theApp()->unregisterInterest(XFE_MNView::MNChromeNeedsUpdating,
|
|
this,
|
|
(XFE_FunctionNotification)MNChromeUpdate_cb);
|
|
|
|
theFrame = NULL;
|
|
|
|
D( printf ("leaving XFE_FolderFrame::~XFE_FolderFrame()\n");)
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_FolderFrame::isCommandEnabled(CommandType cmd,
|
|
void *calldata, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdToggleLocationToolbar)
|
|
return True;
|
|
else if (cmd == xfeCmdCleanUpDisk)
|
|
return True;
|
|
else
|
|
return XFE_Frame::isCommandEnabled(cmd, calldata);
|
|
}
|
|
|
|
void
|
|
XFE_FolderFrame::doCommand(CommandType cmd,
|
|
void *calldata, XFE_CommandInfo* info)
|
|
{
|
|
if (cmd == xfeCmdToggleLocationToolbar)
|
|
{
|
|
if (m_banner)
|
|
{
|
|
// Toggle the showing state
|
|
m_banner->toggleShowingState();
|
|
|
|
// Configure the logo
|
|
configureLogo();
|
|
|
|
// Update prefs
|
|
toolboxItemChangeShowing(m_banner);
|
|
|
|
// Update chrome
|
|
notifyInterested(XFE_View::chromeNeedsUpdating);
|
|
}
|
|
|
|
return;
|
|
} else if ( (cmd == xfeCmdComposeMessage) ||
|
|
(cmd == xfeCmdComposeMessagePlain) ||
|
|
(cmd == xfeCmdComposeMessageHTML) ||
|
|
(cmd == xfeCmdComposeArticle) ||
|
|
(cmd == xfeCmdComposeArticlePlain) ||
|
|
(cmd == xfeCmdComposeArticleHTML) )
|
|
|
|
{
|
|
XFE_FolderView *tview = (XFE_FolderView*)m_view;
|
|
|
|
tview->doCommand(cmd, calldata,info);
|
|
|
|
}
|
|
|
|
else
|
|
XFE_Frame::doCommand(cmd, calldata, info);
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_FolderFrame::handlesCommand(CommandType cmd,
|
|
void *calldata, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdToggleLocationToolbar)
|
|
return True;
|
|
else
|
|
return XFE_Frame::handlesCommand(cmd, calldata);
|
|
}
|
|
|
|
char *
|
|
XFE_FolderFrame::commandToString(CommandType cmd,
|
|
void *calldata, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdToggleLocationToolbar)
|
|
{
|
|
char *res = NULL;
|
|
|
|
if (m_banner->isShown())
|
|
res = "hideLocationToolbarCmdString";
|
|
else
|
|
res = "showLocationToolbarCmdString";
|
|
|
|
return stringFromResource(res);
|
|
}
|
|
else
|
|
{
|
|
return XFE_Frame::commandToString(cmd, calldata);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_FolderFrame::show()
|
|
{
|
|
XFE_Frame::show();
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_FolderFrame, MNChromeUpdate)(XFE_NotificationCenter*,
|
|
void*, void*)
|
|
{
|
|
notifyInterested(XFE_View::chromeNeedsUpdating);
|
|
}
|
|
|
|
void
|
|
XFE_FolderFrame::show(MSG_FolderInfo *info)
|
|
{
|
|
XFE_FolderView *fview = (XFE_FolderView*)m_view;
|
|
|
|
show();
|
|
|
|
fview->selectFolder(info);
|
|
}
|
|
|
|
void
|
|
XFE_FolderFrame::show(MSG_ViewIndex index)
|
|
{
|
|
MSG_FolderInfo *info = NULL;
|
|
XFE_FolderView *fview = (XFE_FolderView*)m_view;
|
|
|
|
if (!index) {
|
|
int m_inboxes = MSG_GetFoldersWithFlag(XFE_MNView::getMaster(),
|
|
MSG_FOLDER_FLAG_INBOX,
|
|
NULL, 0);
|
|
if (m_inboxes == 1) {
|
|
if (1 != MSG_GetFoldersWithFlag(XFE_MNView::getMaster(),
|
|
MSG_FOLDER_FLAG_INBOX,
|
|
&info, 1))
|
|
info = NULL;
|
|
}/* if */
|
|
if (!info) {
|
|
// Prompt the user to enter the email address
|
|
char tmp[256];
|
|
XP_SAFE_SPRINTF(tmp, sizeof(tmp),
|
|
"%s",
|
|
XP_GetString(XFE_INBOX_DOESNT_EXIST));
|
|
fe_Alert_2(CONTEXT_WIDGET(m_context), tmp);
|
|
|
|
}/* if */
|
|
}/* if */
|
|
else {
|
|
info = MSG_GetFolderInfo(fview->getPane(),
|
|
index);
|
|
}/* else */
|
|
|
|
show();
|
|
if (info && fview)
|
|
fview->selectFolder(info);
|
|
}
|
|
|
|
extern "C" MWContext*
|
|
fe_showFoldersWithSelected(Widget toplevel,
|
|
XFE_Frame *parent_frame,
|
|
Chrome *chromespec,
|
|
MSG_FolderInfo *info)
|
|
{
|
|
if (theFrame == NULL)
|
|
theFrame = new XFE_FolderFrame(toplevel, parent_frame, chromespec);
|
|
|
|
if (info)
|
|
theFrame->show(info);
|
|
else
|
|
theFrame->show();
|
|
|
|
return theFrame->getContext();
|
|
}
|
|
|
|
extern "C" MWContext*
|
|
fe_showFolders(Widget toplevel, XFE_Frame *parent_frame, Chrome *chromespec)
|
|
{
|
|
D( printf ("in fe_showFolders()\n");)
|
|
|
|
// we are assuming that the first folder with the MAIL flag
|
|
// is the mail server... I hope this is an ok assumption to
|
|
// make.
|
|
|
|
if (theFrame == NULL)
|
|
theFrame = new XFE_FolderFrame(toplevel, parent_frame, chromespec);
|
|
|
|
theFrame->show((MSG_ViewIndex)0);
|
|
|
|
D( printf ("leaving fe_showFolders()\n");)
|
|
|
|
return theFrame->getContext();
|
|
}
|
|
|
|
extern "C" MWContext*
|
|
fe_showNewsgroups(Widget toplevel,
|
|
XFE_Frame *parent_frame,
|
|
Chrome *chromespec)
|
|
{
|
|
D( printf ("in fe_showNewsgroups()\n");)
|
|
MSG_FolderInfo *folderinfo = NULL;
|
|
|
|
if (MSG_GetFoldersWithFlag(XFE_MNView::getMaster(),
|
|
MSG_FOLDER_FLAG_NEWS_HOST,
|
|
NULL, 0) > 0)
|
|
{
|
|
MSG_GetFoldersWithFlag(XFE_MNView::getMaster(),
|
|
MSG_FOLDER_FLAG_NEWS_HOST,
|
|
&folderinfo, 1);
|
|
}
|
|
|
|
D( printf ("leaving fe_showNewsgroups()\n");)
|
|
|
|
return fe_showFoldersWithSelected(toplevel, parent_frame, chromespec, folderinfo);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Toolbox methods
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_FolderFrame::toolboxItemSnap(XFE_ToolboxItem * item)
|
|
{
|
|
XP_ASSERT( item == m_toolbar || item == m_banner );
|
|
|
|
// Navigation
|
|
fe_globalPrefs.folders_navigation_toolbar_position = m_toolbar->getPosition();
|
|
|
|
// Location
|
|
fe_globalPrefs.folders_location_toolbar_position = m_banner->getPosition();
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_FolderFrame::toolboxItemClose(XFE_ToolboxItem * item)
|
|
{
|
|
XP_ASSERT( item != NULL );
|
|
|
|
// Navigation
|
|
if (item == m_toolbar)
|
|
{
|
|
fe_globalPrefs.folders_navigation_toolbar_open = False;
|
|
}
|
|
// Location
|
|
else if (item == m_banner)
|
|
{
|
|
fe_globalPrefs.folders_location_toolbar_open = False;
|
|
}
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_FolderFrame::toolboxItemOpen(XFE_ToolboxItem * item)
|
|
{
|
|
XP_ASSERT( item != NULL );
|
|
|
|
// Navigation
|
|
if (item == m_toolbar)
|
|
{
|
|
fe_globalPrefs.folders_navigation_toolbar_open = True;
|
|
}
|
|
// Location
|
|
else if (item == m_banner)
|
|
{
|
|
fe_globalPrefs.folders_location_toolbar_open = True;
|
|
}
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_FolderFrame::toolboxItemChangeShowing(XFE_ToolboxItem * item)
|
|
{
|
|
XP_ASSERT( item != NULL );
|
|
|
|
// Navigation
|
|
if (item == m_toolbar)
|
|
{
|
|
fe_globalPrefs.folders_navigation_toolbar_showing = item->isShown();
|
|
}
|
|
// Location
|
|
else if (item == m_banner)
|
|
{
|
|
fe_globalPrefs.folders_location_toolbar_showing = item->isShown();
|
|
}
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_FolderFrame::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;
|
|
}
|
|
|
|
// Navigation
|
|
if (m_toolbar)
|
|
{
|
|
m_toolbar->setShowing(fe_globalPrefs.folders_navigation_toolbar_showing);
|
|
m_toolbar->setOpen(fe_globalPrefs.folders_navigation_toolbar_open);
|
|
m_toolbar->setPosition(fe_globalPrefs.folders_navigation_toolbar_position);
|
|
}
|
|
|
|
// Location
|
|
if (m_banner)
|
|
{
|
|
m_banner->setShowing(fe_globalPrefs.folders_location_toolbar_showing);
|
|
m_banner->setOpen(fe_globalPrefs.folders_location_toolbar_open);
|
|
m_banner->setPosition(fe_globalPrefs.folders_location_toolbar_position);
|
|
}
|
|
|
|
}
|
|
|
|
extern int XFE_SEND_UNSENTMAIL;
|
|
|
|
XP_Bool
|
|
XFE_FolderFrame::isOkToClose()
|
|
{
|
|
Boolean haveQueuedMail = False;
|
|
XFE_FolderView *tview = (XFE_FolderView*)m_view;
|
|
|
|
if ( XFE_MozillaApp::theApp()->mailNewsWindowCount() == 1 )
|
|
{
|
|
|
|
MSG_CommandStatus(tview->getPane(), MSG_DeliverQueuedMessages, NULL, 0,
|
|
&haveQueuedMail, NULL, NULL, NULL );
|
|
|
|
if (haveQueuedMail) {
|
|
void * sendNow = 0;
|
|
const char *buf = XP_GetString (XFE_SEND_UNSENTMAIL);
|
|
sendNow = fe_dialog (CONTEXT_WIDGET(m_context),
|
|
"sendNow", buf, TRUE, 0, TRUE, FALSE, 0);
|
|
if (sendNow) {
|
|
MSG_Command (tview->getPane(), MSG_DeliverQueuedMessages, NULL, 0);
|
|
return False;
|
|
}
|
|
}
|
|
|
|
#ifdef CLEAN_UP_NEWS // see comment in ThreadFrame.cpp
|
|
#ifdef DEBUG_akkana
|
|
printf("FolderFrame: Checking whether cleanup is needed\n");
|
|
#endif
|
|
|
|
// See if we need to clean up based on disk space prefs
|
|
if (MSG_CleanupNeeded(tview->getMaster()))
|
|
{
|
|
#ifdef DEBUG_akkana
|
|
printf("Cleaning up\n");
|
|
#endif
|
|
// create progress pane
|
|
XFE_MailDownloadFrame* progressFrame =
|
|
new XFE_MailDownloadFrame(XfeAncestorFindApplicationShell(getBaseWidget()),
|
|
this,
|
|
tview->getPane());
|
|
progressFrame->cleanUpNews();
|
|
return True;
|
|
}
|
|
#endif /* CLEAN_UP_NEWS */
|
|
}
|
|
return True;
|
|
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|