/* -*- 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 , 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; } //////////////////////////////////////////////////////////////////////////