Mozilla/mozilla/cmd/xfe/src/SubAllView.cpp
spider 957093e8c5 Normandy Merge ....
git-svn-id: svn://10.0.0.236/trunk@4231 18797224-902f-48f8-a5cc-f745e15eee43
1998-06-22 21:19:46 +00:00

422 lines
13 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.
*/
/*
SubAllView.cpp -- 4.x subscribe view, all newsgroup tab.
Created: Chris Toshok <toshok@netscape.com>, 18-Oct-1996.
*/
#include "SubAllView.h"
#include "NewsServerDialog.h"
#include "Outliner.h"
#include "Command.h"
#include "ViewGlue.h"
#include "xfe.h"
#include "msgcom.h"
#include "xp_mem.h"
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/Separator.h>
#include <Xm/TextF.h>
#include "DtWidgets/ComboBox.h"
#include "felocale.h"
#include <Xfe/Xfe.h>
#ifdef DEBUG_toshok
#define D(x) x
#else
#define D(x)
#endif
extern int XFE_ALL_NEWSGROUP_TAB;
#define OUTLINER_GEOMETRY_PREF "mail.subscribepane.all_groups.outliner_geometry"
XFE_SubAllView::XFE_SubAllView(XFE_Component *toplevel_component,
Widget parent, XFE_View *parent_view,
MWContext *context, MSG_Pane *p)
: XFE_SubTabView(toplevel_component, parent, parent_view, context, XFE_ALL_NEWSGROUP_TAB, p)
{
int num_columns = 3;
static int column_widths[] = {40, 3, 9};
m_outliner = new XFE_Outliner("subscribeAllList",
this,
getToplevel(),
m_form,
False, // constantSize
True, //hasHeadings
num_columns,
num_columns,
column_widths,
OUTLINER_GEOMETRY_PREF);
XtVaSetValues(m_outliner->getBaseWidget(),
XmNvisibleRows, 15,
NULL);
init_outliner_icons(m_outliner->getBaseWidget());
// the all newsgroups view is hierarchical
m_outliner->setPipeColumn(OUTLINER_COLUMN_NAME);
m_outliner->setHideColumnsAllowed( True );
m_outliner->setMultiSelectAllowed( True );
m_outliner->setColumnWidth(OUTLINER_COLUMN_SUBSCRIBE, subscribedIcon.width + 2 /* for the outliner's shadow */);
m_outliner->setColumnResizable(OUTLINER_COLUMN_SUBSCRIBE, False);
// create other gadgets
Widget actionForm = XmCreateRowColumn(m_form, "actionForm", NULL, 0);
m_addserverButton =
XmCreatePushButtonGadget(actionForm,xfeCmdAddNewsServer, NULL,0);
XtManageChild(m_addserverButton);
// this holds the data at the top of the form -
// server, newsgroup
Widget dataForm = XmCreateForm(m_form, "dataForm", NULL, 0);
Widget serverLabel, newsgroupLabel;
int i=0;
Widget dataWidgets[6];
// Server & dropdown
dataWidgets[i++] = serverLabel =
XmCreateLabelGadget(dataForm, "serverLabel", NULL, 0);
initializeServerCombo(dataForm);
dataWidgets[i++] = m_serverCombo;
int server_height = XfeVaGetTallestWidget(serverLabel,
m_serverCombo,
m_addserverButton,
NULL);
XtVaSetValues(serverLabel,
XmNheight, server_height,
XmNalignment, XmALIGNMENT_END,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(m_serverCombo,
XmNheight, server_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, serverLabel,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, serverLabel,
XmNrightAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(m_addserverButton,
XmNheight, server_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, serverLabel,
XmNrightAttachment, XmATTACH_FORM,
NULL);
// newsgroup, text field, and button
dataWidgets[i++] = newsgroupLabel =
XmCreateLabelGadget(dataForm, "newsgroupLabel", NULL, 0);
dataWidgets[i++] = m_newsgroupText =
fe_CreateTextField(dataForm, "newsgroupText",NULL, 0);
int newsgroup_height = XfeVaGetTallestWidget(newsgroupLabel,
m_newsgroupText,
NULL);
XtVaSetValues(newsgroupLabel,
XmNheight, newsgroup_height,
XmNalignment, XmALIGNMENT_END,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, serverLabel,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(m_newsgroupText,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, newsgroupLabel,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, m_serverCombo,
XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNrightWidget, m_serverCombo,
NULL);
int label_width = XfeVaGetWidestWidget(serverLabel,
newsgroupLabel,
NULL);
XtVaSetValues(serverLabel, XmNwidth, label_width, NULL);
XtVaSetValues(newsgroupLabel, XmNwidth, label_width, NULL);
XtManageChildren(dataWidgets,i);
i=0;
Widget buttons[6];
// buttons
Widget buttonForm = XtCreateManagedWidget("buttonForm",
xmRowColumnWidgetClass,
m_form,
NULL, 0);
buttons[i++] =
m_subscribeButton = XtVaCreateManagedWidget(xfeCmdToggleSubscribe,
xmPushButtonWidgetClass,
buttonForm,
NULL);
buttons[i++] =
m_unsubscribeButton = XtVaCreateManagedWidget(xfeCmdUnsubscribe,
xmPushButtonWidgetClass,
buttonForm,
NULL);
buttons[i++] = XmCreateSeparatorGadget(buttonForm, "sep1", NULL, 0);
buttons[i++] =
m_getdeletionsButton = XtVaCreateManagedWidget(xfeCmdFetchGroupList,
xmPushButtonWidgetClass,
buttonForm,
NULL);
buttons[i++] =
m_expandallButton = XtVaCreateManagedWidget(xfeCmdExpandAll,
xmPushButtonWidgetClass,
buttonForm,
NULL);
buttons[i++] =
m_collapseallButton = XtVaCreateManagedWidget(xfeCmdCollapseAll,
xmPushButtonWidgetClass,
buttonForm,
NULL);
buttons [i++] = XmCreateSeparatorGadget(buttonForm, "sep2", NULL, 0);
buttons[i++] =
m_stopButton = XtVaCreateManagedWidget(xfeCmdStopLoading,
xmPushButtonWidgetClass,
buttonForm,
NULL);
XtManageChildren(buttons,i);
// now arrange the forms
int button_width = XfeVaGetWidestWidget(actionForm, dataForm, NULL);
XtVaSetValues(actionForm,
XmNwidth, button_width,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(buttonForm,
XmNwidth, button_width,
XmNrightAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, dataForm,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(dataForm,
XmNwidth, button_width,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_WIDGET,
XmNrightWidget, actionForm,
NULL);
XtVaSetValues(m_outliner->getBaseWidget(),
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, dataForm,
XmNrightAttachment, XmATTACH_WIDGET,
XmNrightWidget, buttonForm,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
XtAddCallback(m_newsgroupText, XmNvalueChangedCallback, newsgroup_typedown_callback, this);
XtAddCallback(m_newsgroupText, XmNactivateCallback, newsgroup_selected_callback, this);
XtAddCallback(m_subscribeButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_unsubscribeButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_expandallButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_collapseallButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_getdeletionsButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_stopButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtAddCallback(m_addserverButton, XmNactivateCallback, XFE_SubTabView::button_callback, this);
XtManageChild(actionForm);
XtManageChild(buttonForm);
XtManageChild(dataForm);
m_outliner->show();
// setBaseWidget is done in SubTabView.
}
XFE_SubAllView::~XFE_SubAllView()
{
}
Boolean
XFE_SubAllView::handlesCommand(CommandType command, void *calldata, XFE_CommandInfo*)
{
if (command == xfeCmdExpandAll
|| command == xfeCmdCollapseAll
|| command == xfeCmdFetchGroupList
|| command == xfeCmdAddNewsServer)
{
return True;
}
else
{
return XFE_SubTabView::handlesCommand(command, calldata);
}
}
void
XFE_SubAllView::updateButtons()
{
#define S(x) XtSetSensitive((x), isCommandEnabled(Command::intern(XtName((x)))))
S(m_subscribeButton);
S(m_expandallButton);
S(m_collapseallButton);
S(m_getdeletionsButton);
S(m_stopButton);
#undef S
}
void
XFE_SubAllView::defaultFocus()
{
XmProcessTraversal(m_newsgroupText, XmTRAVERSE_CURRENT);
}
void
XFE_SubAllView::doCommand(CommandType command, void *calldata, XFE_CommandInfo*)
{
if (command == xfeCmdFetchGroupList)
m_outliner->deselectAllItems();
// Then fall through -- MNView maps this cmd to MSG_FetchGroupList.
if (command == xfeCmdAddNewsServer)
{
XFE_NewsServerDialog *d = new XFE_NewsServerDialog(getToplevel()->getBaseWidget(),
"addServer",
/* Tao: we might need to check if this returns a
* non-NULL frame
*/
ViewGlue_getFrame(m_contextData));
XP_Bool ok_pressed = d->post();
if (ok_pressed)
{
const char *serverName = d->getServer();
int serverPort = d->getPort();
XP_Bool isSecure = d->isSecure();
MSG_NewsHost *newshost;
newshost = MSG_CreateNewsHost(XFE_MNView::getMaster(),
serverName,
isSecure,
serverPort);
MSG_SubscribeSetHost(m_pane,
MSG_GetMSGHostFromNewsHost(newshost));
syncServerList();
syncServerCombo();
serverSelected();
}
delete d;
}
else
{
XFE_SubTabView::doCommand(command, calldata);
}
}
void
XFE_SubAllView::serverSelected()
{
doCommand(xfeCmdFetchGroupList);
notifyInterested(XFE_View::chromeNeedsUpdating);
}
void
XFE_SubAllView::newsgroup_typedown()
{
MSG_ViewIndex index;
const char *str;
/* bstell: do we need to fix this ? */
str = fe_GetTextField(m_newsgroupText);
index = MSG_SubscribeFindFirst(m_pane, str);
XtFree((char*)str);
if (index == MSG_VIEWINDEXNONE)
{
m_outliner->deselectAllItems();
}
else
{
m_outliner->selectItemExclusive(index);
m_outliner->makeVisible(index);
}
}
void
XFE_SubAllView::newsgroup_selected()
{
const int *selected;
int count;
// Get the selection
m_outliner->getSelection(&selected, &count);
// Subscribe to the newsgroup
MSG_Command(m_pane, MSG_ToggleSubscribed, (MSG_ViewIndex*)selected,
count);
}
void
XFE_SubAllView::newsgroup_typedown_callback(Widget /*w*/,
XtPointer clientData,
XtPointer /*callData*/)
{
XFE_SubAllView *obj = (XFE_SubAllView*)clientData;
obj->newsgroup_typedown();
}
void
XFE_SubAllView::newsgroup_selected_callback(Widget /*w*/,
XtPointer clientData,
XtPointer /*callData*/)
{
XFE_SubAllView *obj = (XFE_SubAllView*)clientData;
obj->newsgroup_selected();
}