gecko-dev/cmd/xfe/src/CategoryView.cpp
1998-06-25 05:50:45 +00:00

332 lines
7.5 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 "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 Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are Copyright (C) 1996
* Netscape Communications Corporation. All Rights Reserved.
*/
/*
CategoryView.cpp -- presents view of news categories.
Created: Chris Toshok <toshok@netscape.com>, 29-Aug-96.
*/
#include "MozillaApp.h"
#include "CategoryView.h"
#include "xpassert.h"
#include "xpgetstr.h"
extern int XFE_CATEGORY_OUTLINER_COLUMN_NAME;
#ifdef DEBUG_toshok
#define D(x) x
#else
#define D(x)
#endif
#define OUTLINER_GEOMETRY_PREF "mail.categorypane.outliner_geometry"
const int XFE_CategoryView::OUTLINER_COLUMN_NAME = 0;
const char *XFE_CategoryView::categorySelected = "XFE_CategoryView::categorySelected";
XFE_CategoryView::XFE_CategoryView(XFE_Component *toplevel_component,
Widget parent,
XFE_View *parent_view, MWContext *context,
MSG_Pane *p)
: XFE_MNListView(toplevel_component, parent_view, context, p)
{
int num_columns = 1;
static int default_column_widths[] = { 20 };
// create our view if we don't have one already.
if (!p)
setPane(MSG_CreateCategoryPane(m_contextData,
XFE_MNView::m_master));
// create our outliner.
m_outliner = new XFE_Outliner("categoryList",
this,
getToplevel(),
parent,
FALSE, // constantSize
TRUE, // hasHeadings
num_columns,
num_columns,
default_column_widths,
OUTLINER_GEOMETRY_PREF);
m_outliner->setPipeColumn( OUTLINER_COLUMN_NAME );
m_outliner->setMultiSelectAllowed( True );
setBaseWidget(m_outliner->getBaseWidget());
}
XFE_CategoryView::~XFE_CategoryView()
{
D(printf ("In XFE_CategoryView::~XFE_CategoryView()\n");)
delete m_outliner;
destroyPane();
}
void
XFE_CategoryView::loadFolder(MSG_FolderInfo *folderinfo)
{
m_folderInfo = folderinfo;
MSG_LoadNewsGroup(m_pane, m_folderInfo);
XFE_MozillaApp::theApp()->notifyInterested(XFE_MNView::MNChromeNeedsUpdating);
}
void
XFE_CategoryView::selectCategory(MSG_FolderInfo *category)
{
MSG_ViewIndex index;
index = MSG_GetFolderIndexForInfo(m_pane, category, True);
if (index != MSG_VIEWINDEXNONE)
m_outliner->selectItemExclusive(index);
}
Boolean
XFE_CategoryView::isCommandEnabled(CommandType cmd,
void *calldata, XFE_CommandInfo*)
{
return XFE_MNListView::isCommandEnabled(cmd, calldata);
}
Boolean
XFE_CategoryView::handlesCommand(CommandType cmd,
void *calldata, XFE_CommandInfo*)
{
if (cmd == xfeCmdDeleteCategory
|| cmd == xfeCmdKillCategory
|| cmd == xfeCmdMarkCategoryRead
|| cmd == xfeCmdMarkCategoryUnread
|| cmd == xfeCmdSelectCategory)
{
return True;
}
else
{
return XFE_MNListView::handlesCommand(cmd, calldata);
}
}
void
XFE_CategoryView::doCommand(CommandType cmd, void *calldata, XFE_CommandInfo* info)
{
MSG_CommandType msg_cmd = commandToMsgCmd(cmd);
const int *selected;
int count;
m_outliner->getSelection(&selected, &count);
if ((msg_cmd == (MSG_CommandType)~0) ||
(msg_cmd == MSG_PostNew) ||
(msg_cmd == MSG_MailNew) )
{
XFE_MNListView::doCommand(cmd, calldata, info);
}
else
{
MSG_Command(m_pane, msg_cmd, (MSG_ViewIndex*)selected, count);
}
getToplevel()->notifyInterested(XFE_View::chromeNeedsUpdating);
}
void *
XFE_CategoryView::ConvFromIndex(int index)
{
return MSG_GetFolderInfo(m_pane, index);
}
int
XFE_CategoryView::ConvToIndex(void *item)
{
MSG_ViewIndex index = MSG_GetFolderIndex(m_pane, (MSG_FolderInfo*)item);
if (index == MSG_VIEWINDEXNONE)
return -1;
else
return index;
}
char *
XFE_CategoryView::getColumnName(int column)
{
// there is only one column in the category view.
XP_ASSERT(column == OUTLINER_COLUMN_NAME);
return "Category";
}
char *
XFE_CategoryView::getColumnHeaderText(int column)
{
// there is only one column in the category view.
XP_ASSERT(column == OUTLINER_COLUMN_NAME);
return XP_GetString(XFE_CATEGORY_OUTLINER_COLUMN_NAME);
}
fe_icon *
XFE_CategoryView::getColumnHeaderIcon(int)
{
return 0;
}
EOutlinerTextStyle
XFE_CategoryView::getColumnHeaderStyle(int)
{
return OUTLINER_Default;
}
void *
XFE_CategoryView::aquireLineData(int line)
{
m_ancestorInfo = NULL;
if (!MSG_GetFolderLineByIndex(m_pane, line, 1, &m_categoryLine))
return NULL;
if ( m_categoryLine.level > 0 )
{
m_ancestorInfo = new OutlinerAncestorInfo[ m_categoryLine.level ];
}
else
{
m_ancestorInfo = new OutlinerAncestorInfo[ 1 ];
}
// ripped straight from the winfe
int i = m_categoryLine.level - 1;
int idx = line + 1;
int total_lines = m_outliner->getTotalLines();
while ( i > 0 ) {
int level;
if ( idx < total_lines ) {
level = MSG_GetFolderLevelByIndex( m_pane, idx );
if ( (level - 1) == i ) {
m_ancestorInfo[i].has_prev = TRUE;
m_ancestorInfo[i].has_next = TRUE;
i--;
idx++;
} else if ( (level - 1) < i ) {
m_ancestorInfo[i].has_prev = FALSE;
m_ancestorInfo[i].has_next = FALSE;
i--;
} else {
idx++;
}
} else {
m_ancestorInfo[i].has_prev = FALSE;
m_ancestorInfo[i].has_next = FALSE;
i--;
}
}
m_ancestorInfo[0].has_prev = FALSE;
m_ancestorInfo[0].has_next = FALSE;
return &m_categoryLine;
}
void
XFE_CategoryView::getTreeInfo(XP_Bool *expandable, XP_Bool *is_expanded,
int *depth, OutlinerAncestorInfo **ancestor)
{
XP_Bool is_line_expandable;
XP_Bool is_line_expanded;
is_line_expandable = m_categoryLine.numChildren > 0;
if (is_line_expandable)
{
is_line_expanded = !(m_categoryLine.flags & MSG_FOLDER_FLAG_ELIDED);
}
else
{
is_line_expanded = FALSE;
}
if (ancestor)
*ancestor = m_ancestorInfo;
if (depth)
*depth = m_categoryLine.level - 1;
if (expandable)
*expandable = is_line_expandable;
if (is_expanded)
*is_expanded = is_line_expanded;
}
EOutlinerTextStyle
XFE_CategoryView::getColumnStyle(int)
{
return (m_categoryLine.unseen > 0) ? OUTLINER_Bold : OUTLINER_Default;
}
char *
XFE_CategoryView::getColumnText(int)
{
if (m_categoryLine.prettyName)
return (char*)m_categoryLine.prettyName;
else
return (char*)m_categoryLine.name;
}
fe_icon *
XFE_CategoryView::getColumnIcon(int)
{
return &newsgroupIcon;
}
void
XFE_CategoryView::releaseLineData()
{
delete [] m_ancestorInfo;
m_ancestorInfo = NULL;
}
void
XFE_CategoryView::Buttonfunc(const OutlineButtonFuncData *data)
{
MSG_FolderLine line;
if (!MSG_GetFolderLineByIndex(m_pane, data->row, 1, &line)) return;
m_outliner->selectItemExclusive(data->row);
notifyInterested(categorySelected, MSG_GetFolderInfo(m_pane, data->row));
getToplevel()->notifyInterested(XFE_View::chromeNeedsUpdating);
}
void
XFE_CategoryView::Flippyfunc(const OutlineFlippyFuncData *data)
{
if (MSG_ExpansionDelta(m_pane, data->row) != 0)
MSG_ToggleExpansion(m_pane, data->row, NULL);
getToplevel()->notifyInterested(XFE_View::chromeNeedsUpdating);
}