469 lines
12 KiB
C++
469 lines
12 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.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.
|
|
*/
|
|
/*
|
|
MailDownloadFrame.cpp -- class definition for the mail download window.
|
|
Created: Chris Toshok <toshok@netscape.com>, 22-Jan-97
|
|
*/
|
|
|
|
|
|
|
|
#include "MailDownloadFrame.h"
|
|
#include "MNView.h"
|
|
#include "MozillaApp.h"
|
|
#include "Dashboard.h"
|
|
#include "Logo.h"
|
|
|
|
#include <Xm/Label.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/PushB.h>
|
|
|
|
#include "xpgetstr.h"
|
|
|
|
extern int XFE_DOWNLOADING_NEW_MESSAGES;
|
|
extern int XFE_PURGING_NEWS_MESSAGES;
|
|
|
|
extern "C" {
|
|
void fe_set_scrolled_default_size(MWContext *context);
|
|
}
|
|
|
|
#ifdef DEBUG_toshok
|
|
#define D(x) x
|
|
#else
|
|
#define D(x)
|
|
#endif
|
|
|
|
const char *XFE_MailDownloadView::pastPasswordCheck = "XFE_MailDownloadView::pastPasswordCheck";
|
|
const char *XFE_MailDownloadView::progressDone = "XFE_MailDownloadView::progressDone";
|
|
|
|
XFE_MailDownloadView::XFE_MailDownloadView(XFE_Component *toplevel_component,
|
|
Widget parent,
|
|
XFE_View *parent_view,
|
|
MWContext *context,
|
|
MSG_Pane *parent_pane,
|
|
MSG_Pane *p)
|
|
: XFE_MNView(toplevel_component, parent_view, context, p)
|
|
{
|
|
Widget form;
|
|
XmString xmstr = XmStringCreate(XP_GetString(XFE_DOWNLOADING_NEW_MESSAGES), XmFONTLIST_DEFAULT_TAG);
|
|
XmFontList fontList;
|
|
|
|
form = XtCreateWidget("topArea",
|
|
xmFormWidgetClass,
|
|
parent,
|
|
NULL, 0);
|
|
|
|
m_label = XtVaCreateManagedWidget("label",
|
|
xmLabelWidgetClass,
|
|
form,
|
|
XmNlabelString, xmstr,
|
|
NULL);
|
|
|
|
m_logo = new XFE_Logo((XFE_Frame*)toplevel_component, form, "logo");
|
|
|
|
XtVaGetValues(m_label,
|
|
XmNfontList, &fontList,
|
|
NULL);
|
|
|
|
// we need more space, or else the window is *tiny*
|
|
XtVaSetValues(m_label,
|
|
XmNwidth, XmStringWidth(fontList, xmstr) * 2,
|
|
NULL);
|
|
|
|
XmStringFree(xmstr);
|
|
|
|
/* now do the attachments. */
|
|
|
|
XtVaSetValues(m_label,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_WIDGET,
|
|
XmNrightWidget, m_logo->getBaseWidget(),
|
|
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
|
|
XmNtopWidget, m_logo->getBaseWidget(),
|
|
XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
|
|
XmNbottomWidget, m_logo->getBaseWidget(),
|
|
NULL);
|
|
|
|
XtVaSetValues(m_logo->getBaseWidget(),
|
|
XmNleftAttachment, XmATTACH_NONE,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNbottomAttachment, XmATTACH_NONE,
|
|
XmNtopAttachment, XmATTACH_FORM,
|
|
NULL);
|
|
|
|
m_logo->show();
|
|
|
|
if (!p)
|
|
setPane(MSG_CreateProgressPane(m_contextData, XFE_MNView::getMaster(), parent_pane));
|
|
|
|
setBaseWidget(form);
|
|
}
|
|
|
|
XFE_MailDownloadView::~XFE_MailDownloadView()
|
|
{
|
|
destroyPane();
|
|
|
|
XFE_MozillaApp::theApp()->notifyInterested(XFE_MNView::MNChromeNeedsUpdating);
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadView::startDownload()
|
|
{
|
|
XmString xmstr = XmStringCreate(XP_GetString(XFE_DOWNLOADING_NEW_MESSAGES), XmFONTLIST_DEFAULT_TAG);
|
|
XtVaSetValues(m_label, XmNlabelString, xmstr, 0);
|
|
XmStringFree(xmstr);
|
|
|
|
XFE_MozillaApp::theApp()->notifyInterested(XFE_MNView::MNChromeNeedsUpdating);
|
|
|
|
MSG_Command (m_pane, MSG_GetNewMail, NULL, 0);
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadView::startNewsDownload()
|
|
{
|
|
XmString xmstr = XmStringCreate(XP_GetString(XFE_DOWNLOADING_NEW_MESSAGES), XmFONTLIST_DEFAULT_TAG);
|
|
XtVaSetValues(m_label, XmNlabelString, xmstr, 0);
|
|
XmStringFree(xmstr);
|
|
|
|
XFE_MozillaApp::theApp()->notifyInterested(XFE_MNView::MNChromeNeedsUpdating);
|
|
|
|
MSG_Command (m_pane, MSG_GetNextChunkMessages, NULL, 0);
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadView::cleanUpNews()
|
|
{
|
|
// Change the label string, since we're not actually downloading:
|
|
XmString xmstr = XmStringCreate(XP_GetString(XFE_PURGING_NEWS_MESSAGES),
|
|
XmFONTLIST_DEFAULT_TAG);
|
|
XtVaSetValues(m_label, XmNlabelString, xmstr, 0);
|
|
XmStringFree(xmstr);
|
|
|
|
XFE_MozillaApp::theApp()->notifyInterested(XFE_MNView::MNChromeNeedsUpdating);
|
|
|
|
MSG_CleanupFolders(m_pane);
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadView::paneChanged(XP_Bool,
|
|
MSG_PANE_CHANGED_NOTIFY_CODE notify_code,
|
|
int32)
|
|
{
|
|
if (notify_code == MSG_PanePastPasswordCheck)
|
|
{
|
|
D( printf ("Showing maildownload frame.\n");)
|
|
notifyInterested(pastPasswordCheck);
|
|
}
|
|
else if (notify_code == MSG_PaneProgressDone)
|
|
{
|
|
notifyInterested(progressDone);
|
|
}
|
|
}
|
|
|
|
XFE_Logo *
|
|
XFE_MailDownloadView::getLogo()
|
|
{
|
|
return m_logo;
|
|
}
|
|
|
|
XFE_MailDownloadFrame::XFE_MailDownloadFrame(Widget toplevel,
|
|
XFE_Frame * parent_frame,
|
|
MSG_Pane * parent_pane)
|
|
: XFE_Frame("MessageDownload", // name
|
|
toplevel, // top level
|
|
parent_frame, // parent frame
|
|
FRAME_MAILNEWS_DOWNLOAD, // frame type
|
|
NULL, // chrome
|
|
False, // have html display
|
|
False, // have menu bar
|
|
False, // have toolbar
|
|
False, // have dashboard (we'll do it)
|
|
True) // destroy on close
|
|
{
|
|
Widget form;
|
|
|
|
XFE_MailDownloadView *v = new XFE_MailDownloadView(this, getChromeParent(),
|
|
NULL, m_context, parent_pane);
|
|
XFE_Component *belowView;
|
|
|
|
m_being_deleted = False;
|
|
|
|
form = XtVaCreateManagedWidget("stopButtonForm",
|
|
xmFormWidgetClass,
|
|
getChromeParent(),
|
|
XmNfractionBase, 8,
|
|
NULL);
|
|
|
|
m_stopButton = XtVaCreateManagedWidget(xfeCmdStopLoading,
|
|
xmPushButtonWidgetClass,
|
|
form,
|
|
XmNleftAttachment, XmATTACH_POSITION,
|
|
XmNleftPosition, 3,
|
|
XmNrightAttachment, XmATTACH_POSITION,
|
|
XmNrightPosition, 5,
|
|
XmNtopAttachment, XmATTACH_NONE,
|
|
XmNbottomAttachment, XmATTACH_FORM,
|
|
NULL);
|
|
|
|
XtAddCallback(m_stopButton, XmNactivateCallback, activate_cb, this);
|
|
|
|
belowView = new XFE_Component(form);
|
|
|
|
setView(v);
|
|
setBelowViewArea(belowView);
|
|
|
|
m_dashboard = new XFE_Dashboard(this, // top level
|
|
getChromeParent(), // parent
|
|
this, // parent frame
|
|
False); // have task bar
|
|
|
|
m_dashboard->setShowStatusBar(True);
|
|
m_dashboard->setShowProgressBar(True);
|
|
|
|
v->registerInterest(XFE_MailDownloadView::pastPasswordCheck,
|
|
this,
|
|
(XFE_FunctionNotification)pastPassword_cb);
|
|
v->registerInterest(XFE_MailDownloadView::progressDone,
|
|
this,
|
|
(XFE_FunctionNotification)progressDone_cb);
|
|
|
|
fe_set_scrolled_default_size(m_context);
|
|
v->show();
|
|
belowView->show();
|
|
m_dashboard->show();
|
|
|
|
// Register the logo animation notifications with ourselves
|
|
// We need to do this, cause the XFE_Frame class only does so
|
|
// if the have_toolbars ctor parameter is true and in our case
|
|
// it is not.
|
|
#if defined(GLUE_COMPO_CONTEXT)
|
|
registerInterest(XFE_Component::logoStartAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStartNotice_cb);
|
|
|
|
registerInterest(XFE_Component::logoStopAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStopNotice_cb);
|
|
#else
|
|
registerInterest(XFE_Frame::logoStartAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStartNotice_cb);
|
|
|
|
registerInterest(XFE_Frame::logoStopAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStopNotice_cb);
|
|
#endif /* GLUE_COMPO_CONTEXT */
|
|
}
|
|
|
|
XFE_MailDownloadFrame::~XFE_MailDownloadFrame()
|
|
{
|
|
// Unregister the logo animation notifications with ourselves
|
|
// We need to do this, cause the XFE_Frame class only does so
|
|
// if the have_toolbars ctor parameter is true and in our case
|
|
// it is not.
|
|
#if defined(GLUE_COMPO_CONTEXT)
|
|
unregisterInterest(XFE_Component::logoStartAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStartNotice_cb);
|
|
|
|
unregisterInterest(XFE_Component::logoStopAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStopNotice_cb);
|
|
#else
|
|
unregisterInterest(XFE_Frame::logoStartAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStartNotice_cb);
|
|
|
|
unregisterInterest(XFE_Frame::logoStopAnimation,
|
|
this,
|
|
&XFE_Frame::logoAnimationStopNotice_cb);
|
|
#endif /* GLUE_COMPO_CONTEXT */
|
|
}
|
|
|
|
XFE_Logo *
|
|
XFE_MailDownloadFrame::getLogo()
|
|
{
|
|
XFE_Logo * logo = NULL;
|
|
XFE_MailDownloadView * view = (XFE_MailDownloadView *) getView();
|
|
|
|
if (view)
|
|
{
|
|
logo = view->getLogo();
|
|
}
|
|
|
|
return logo;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void
|
|
XFE_MailDownloadFrame::configureLogo()
|
|
{
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_MailDownloadFrame::isCommandEnabled(CommandType cmd,
|
|
void */*calldata*/, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdStopLoading)
|
|
return fe_IsContextStoppable(m_context);
|
|
else
|
|
return False;
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::doCommand(CommandType cmd,
|
|
void */*calldata*/, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdStopLoading)
|
|
{
|
|
D( printf ("Canceling.\n"); )
|
|
XP_InterruptContext(m_context);
|
|
// allConnectionsComplete will destroy this frame.
|
|
}
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_MailDownloadFrame::handlesCommand(CommandType cmd,
|
|
void */*calldata*/, XFE_CommandInfo*)
|
|
{
|
|
if (cmd == xfeCmdStopLoading)
|
|
return True;
|
|
else
|
|
return False;
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::app_delete_response()
|
|
{
|
|
D(printf ("In XFE_MailDownloadFrame::app_delete_response()\n");)
|
|
if (!m_being_deleted)
|
|
m_being_deleted = TRUE;
|
|
XFE_Frame::app_delete_response();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::allConnectionsComplete(MWContext */* context */)
|
|
{
|
|
D(printf ("All Connections Complete in mail download frame.\n");)
|
|
|
|
if (!m_being_deleted)
|
|
app_delete_response();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::show()
|
|
{
|
|
XFE_Frame *active_frame = XFE_Frame::getActiveFrame();
|
|
|
|
if (active_frame)
|
|
{
|
|
Position x, y;
|
|
Widget parent = active_frame->getBaseWidget();
|
|
Screen *screen = XtScreen(m_widget);
|
|
Dimension screen_width = WidthOfScreen (screen);
|
|
Dimension screen_height = HeightOfScreen (screen);
|
|
Dimension parent_width = 0;
|
|
Dimension parent_height = 0;
|
|
Dimension child_width = 0;
|
|
Dimension child_height = 0;
|
|
|
|
/* we were already realized in the startDownload function below.
|
|
Being realized is a requirement for some of the stuff we
|
|
have to do here. */
|
|
|
|
XtVaGetValues(m_widget,
|
|
XtNwidth, &child_width, XtNheight, &child_height, 0);
|
|
XtVaGetValues (parent,
|
|
XtNwidth, &parent_width, XtNheight, &parent_height, 0);
|
|
|
|
x = (((Position)parent_width) - ((Position)child_width)) / 2;
|
|
y = (((Position)parent_height) - ((Position)child_height)) / 2;
|
|
XtTranslateCoords (parent, x, y, &x, &y);
|
|
|
|
if ((Dimension) (x + child_width) > screen_width)
|
|
x = screen_width - child_width;
|
|
if (x < 0)
|
|
x = 0;
|
|
|
|
if ((Dimension) (y + child_height) > screen_height)
|
|
y = screen_height - child_height;
|
|
if (y < 0)
|
|
y = 0;
|
|
|
|
position(x, y);
|
|
}
|
|
|
|
XFE_Frame::show();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::startDownload()
|
|
{
|
|
XFE_MailDownloadView *v = (XFE_MailDownloadView*)m_view;
|
|
|
|
realize();
|
|
|
|
v->startDownload();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::startNewsDownload()
|
|
{
|
|
XFE_MailDownloadView *v = (XFE_MailDownloadView*)m_view;
|
|
|
|
realize();
|
|
|
|
v->startNewsDownload();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::cleanUpNews()
|
|
{
|
|
XFE_MailDownloadView *v = (XFE_MailDownloadView*)m_view;
|
|
|
|
realize();
|
|
show();
|
|
|
|
v->cleanUpNews();
|
|
}
|
|
|
|
void
|
|
XFE_MailDownloadFrame::activate_cb(Widget w, XtPointer clientData, XtPointer)
|
|
{
|
|
CommandType cmd = Command::intern(XtName(w));
|
|
XFE_MailDownloadFrame *obj = (XFE_MailDownloadFrame*)clientData;
|
|
|
|
if (obj->handlesCommand(cmd) && obj->isCommandEnabled(cmd))
|
|
obj->doCommand(cmd);
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_MailDownloadFrame, pastPassword)(XFE_NotificationCenter*,
|
|
void *,
|
|
void *)
|
|
{
|
|
D(printf ("Showing MailDownloadFrame()\n");)
|
|
show();
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_MailDownloadFrame, progressDone)(XFE_NotificationCenter*,
|
|
void *,
|
|
void *)
|
|
{
|
|
D(printf ("Deleting MailDownloadFrame()\n");)
|
|
if (!m_being_deleted)
|
|
app_delete_response();
|
|
}
|