зеркало из https://github.com/mozilla/pjs.git
Change NavCenter (aka Aurora) to use the XmLTree instead
of the Outliner class. This will be cleaner in the end and will give us an easy way to do dynamic columns.
This commit is contained in:
Родитель
064c092ade
Коммит
642d03f241
|
@ -52,6 +52,7 @@ XFE_NavCenterView::XFE_NavCenterView(XFE_Component *toplevel_component,
|
|||
pane, NULL);
|
||||
|
||||
m_htview = NULL;
|
||||
m_pane = NULL;
|
||||
m_rdfview = new XFE_RDFView(this, pane,
|
||||
NULL, context, m_htview);
|
||||
|
||||
|
@ -162,41 +163,20 @@ XFE_NavCenterView::notify(HT_Notification ns, HT_Resource n,
|
|||
HT_Event whatHappened)
|
||||
{
|
||||
switch (whatHappened) {
|
||||
case HT_EVENT_NODE_ADDED:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_ADDED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_DELETED_DATA:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_DELETED_DATA",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_DELETED_NODATA:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_DELETED_NODATA",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_VPROP_CHANGED:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_VPROP_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_SELECTION_CHANGED:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_SELECTION_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_OPENCLOSE_CHANGED:
|
||||
{
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_OPENCLOSE_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
|
||||
m_rdfview->setRDFView(m_htview);
|
||||
break;
|
||||
}
|
||||
case HT_EVENT_VIEW_CLOSED:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_VIEW_CLOSED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_VIEW_SELECTED:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_VIEW_SELECTED",
|
||||
HT_GetNodeName(n)););
|
||||
{
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_VIEW_SELECTED",
|
||||
HT_GetNodeName(n)););
|
||||
|
||||
HT_View view = HT_GetView(n);
|
||||
|
||||
if (m_htview != view)
|
||||
setRDFView(view);
|
||||
}
|
||||
break;
|
||||
case HT_EVENT_VIEW_ADDED:
|
||||
{
|
||||
|
@ -206,26 +186,37 @@ XFE_NavCenterView::notify(HT_Notification ns, HT_Resource n,
|
|||
HT_View view = HT_GetView(n);
|
||||
|
||||
addRDFView(view);
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case HT_EVENT_NODE_ADDED:
|
||||
case HT_EVENT_NODE_DELETED_DATA:
|
||||
case HT_EVENT_NODE_DELETED_NODATA:
|
||||
case HT_EVENT_NODE_VPROP_CHANGED:
|
||||
case HT_EVENT_NODE_SELECTION_CHANGED:
|
||||
case HT_EVENT_NODE_OPENCLOSE_CHANGED:
|
||||
case HT_EVENT_NODE_OPENCLOSE_CHANGING:
|
||||
D(printf("HT_Event: %s on %s\n","HT_EVENT_NODE_OPENCLOSE_CHANGING",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
default:
|
||||
D(printf("HT_Event: Unknown type on %s\n",HT_GetNodeName(n)););
|
||||
D(printf("HT_Event(%d): Unknown type on %s\n",whatHappened,HT_GetNodeName(n)););
|
||||
break;
|
||||
}
|
||||
// Pass through to the outliner
|
||||
// xxxShould check to make sure that it applies to rdfview's view.
|
||||
m_rdfview->notify(ns,n,whatHappened);
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
XFE_NavCenterView::setRDFView(HT_View view)
|
||||
{
|
||||
//m_htview = HT_GetNthView(m_pane, viewnum);
|
||||
HT_SetSelectedView(m_pane, view);
|
||||
Widget toolbar;
|
||||
// WidgetList tool_items = NULL;
|
||||
XtVaGetValues(m_selector,XmNtoolBar,&toolbar,NULL);
|
||||
//XfeToolBarSetSelectedButton(toolbar, xxx);
|
||||
|
||||
HT_SetSelectedView(m_pane, view);
|
||||
m_htview = view;
|
||||
m_rdfview->setRDFView(view);
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
|
|
|
@ -25,6 +25,13 @@
|
|||
#include "RDFView.h"
|
||||
#include "Frame.h" // for xfe_ExecuteCommand
|
||||
#include "xfe2_extern.h"
|
||||
#include "xpgetstr.h"
|
||||
#include <Xm/Xm.h>
|
||||
#include <XmL/Tree.h>
|
||||
|
||||
|
||||
#define TREE_NAME "RdfTree"
|
||||
|
||||
#ifdef DEBUG_slamm
|
||||
#define D(x) x
|
||||
#else
|
||||
|
@ -36,40 +43,107 @@ fe_icon XFE_RDFView::bookmark = { 0 };
|
|||
fe_icon XFE_RDFView::closedFolder = { 0 };
|
||||
fe_icon XFE_RDFView::openedFolder = { 0 };
|
||||
|
||||
#define SECONDS_PER_DAY 86400L
|
||||
|
||||
extern int XP_BKMKS_HOURS_AGO;
|
||||
extern int XP_BKMKS_DAYS_AGO;
|
||||
extern int XP_BKMKS_LESS_THAN_ONE_HOUR_AGO;
|
||||
|
||||
struct RDFColumnData
|
||||
{
|
||||
RDFColumnData(void) : token(NULL), token_type(0) {}
|
||||
RDFColumnData(void *t, uint32 tt) : token(t), token_type(tt) {}
|
||||
|
||||
void* token;
|
||||
uint32 token_type;
|
||||
};
|
||||
|
||||
|
||||
void HTFE_MakePrettyDate(char* buffer, time_t lastVisited)
|
||||
{
|
||||
buffer[0] = 0;
|
||||
time_t today = XP_TIME();
|
||||
int elapsed = today - lastVisited;
|
||||
|
||||
if (elapsed < SECONDS_PER_DAY)
|
||||
{
|
||||
int32 hours = (elapsed + 1800L) / 3600L;
|
||||
if (hours < 1)
|
||||
{
|
||||
XP_STRCPY(buffer, XP_GetString(XP_BKMKS_LESS_THAN_ONE_HOUR_AGO));
|
||||
}
|
||||
sprintf(buffer, XP_GetString(XP_BKMKS_HOURS_AGO), hours);
|
||||
}
|
||||
else if (elapsed < (SECONDS_PER_DAY * 31))
|
||||
{
|
||||
sprintf(buffer, XP_GetString(XP_BKMKS_DAYS_AGO),
|
||||
(elapsed + (SECONDS_PER_DAY / 2)) / SECONDS_PER_DAY);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct tm* tmp;
|
||||
tmp = localtime(&lastVisited);
|
||||
|
||||
sprintf(buffer, asctime(tmp));
|
||||
}
|
||||
}
|
||||
|
||||
XFE_RDFView::XFE_RDFView(XFE_Component *toplevel, Widget parent,
|
||||
XFE_View *parent_view, MWContext *context,
|
||||
HT_View htview)
|
||||
: XFE_View(toplevel, parent_view, context)
|
||||
{
|
||||
// xxx Pull this info out of rdf
|
||||
int num_columns = 1;
|
||||
static int column_widths[] = {40};
|
||||
|
||||
m_toplevel = getToplevel();
|
||||
m_widget = getBaseWidget();
|
||||
#ifdef DEBUG_spence
|
||||
if (m_toplevel != toplevel) {
|
||||
printf ("m_toplevel != toplevel\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
m_outliner = new XFE_Outliner("rdfList",
|
||||
this,
|
||||
getToplevel(),
|
||||
parent,
|
||||
False, // constantSize
|
||||
True, // hasHeadings
|
||||
1, //num_columns, // Number of columns.
|
||||
1, //num_columns, // Number of visible columns.
|
||||
column_widths,
|
||||
NULL /*BOOKMARK_OUTLINER_GEOMETRY_PREF*/);
|
||||
Widget tree =
|
||||
XtVaCreateManagedWidget(TREE_NAME,
|
||||
xmlTreeWidgetClass,
|
||||
parent,
|
||||
XmNshadowThickness, 0,
|
||||
XmNhorizontalSizePolicy, XmRESIZE_IF_POSSIBLE,
|
||||
XmNallowColumnResize, True,
|
||||
XmNselectionPolicy, XmSELECT_MULTIPLE_ROW,
|
||||
XmNheadingRows, 1,
|
||||
XmNvisibleRows, 14,
|
||||
/*XmNshowHideButton, True,*/
|
||||
XmNdebugLevel, 1,
|
||||
NULL);
|
||||
|
||||
m_outliner->setHideColumnsAllowed( TRUE );
|
||||
m_outliner->setPipeColumn( 0 /*OUTLINER_COLUMN_NAME*/ );
|
||||
m_outliner->setMultiSelectAllowed( TRUE );
|
||||
setBaseWidget(m_outliner->getBaseWidget());
|
||||
setBaseWidget(tree);
|
||||
|
||||
{
|
||||
XtVaSetValues(m_widget, XmNcellAlignment, XmALIGNMENT_LEFT, NULL);
|
||||
XtVaSetValues(m_widget,
|
||||
XmNcellDefaults, True,
|
||||
XmNcellAlignment, XmALIGNMENT_LEFT,
|
||||
NULL);
|
||||
|
||||
init_pixmaps();
|
||||
|
||||
XtAddCallback(m_widget, XmNexpandCallback, expand_row_cb, this);
|
||||
XtAddCallback(m_widget, XmNcollapseCallback, collapse_row_cb, this);
|
||||
XtAddCallback(m_widget, XmNdeleteCallback, delete_cb, NULL);
|
||||
XtAddCallback(m_widget, XmNactivateCallback, activate_cb, this);
|
||||
XtAddCallback(m_widget, XmNresizeCallback, resize_cb, this);
|
||||
|
||||
//fe_AddTipStringCallback(outline, XFE_Outliner::tip_cb, this);
|
||||
|
||||
setRDFView(htview);
|
||||
}
|
||||
|
||||
XFE_RDFView::~XFE_RDFView()
|
||||
{
|
||||
//xxx what to delete?
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
XFE_RDFView::init_pixmaps(void)
|
||||
{
|
||||
Pixel bg_pixel;
|
||||
|
||||
XtVaGetValues(m_widget, XmNbackground, &bg_pixel, 0);
|
||||
|
@ -81,7 +155,8 @@ XFE_RDFView::XFE_RDFView(XFE_Component *toplevel, Widget parent,
|
|||
&bookmark,
|
||||
NULL,
|
||||
BM_Bookmark.width, BM_Bookmark.height,
|
||||
BM_Bookmark.mono_bits, BM_Bookmark.color_bits, BM_Bookmark.mask_bits, FALSE);
|
||||
BM_Bookmark.mono_bits, BM_Bookmark.color_bits,
|
||||
BM_Bookmark.mask_bits, FALSE);
|
||||
if (!closedFolder.pixmap)
|
||||
fe_NewMakeIcon(m_widget,
|
||||
BlackPixelOfScreen(XtScreen(m_widget)),
|
||||
|
@ -89,7 +164,8 @@ XFE_RDFView::XFE_RDFView(XFE_Component *toplevel, Widget parent,
|
|||
&closedFolder,
|
||||
NULL,
|
||||
BM_Folder.width, BM_Folder.height,
|
||||
BM_Folder.mono_bits, BM_Folder.color_bits, BM_Folder.mask_bits, FALSE);
|
||||
BM_Folder.mono_bits, BM_Folder.color_bits,
|
||||
BM_Folder.mask_bits, FALSE);
|
||||
|
||||
if (!openedFolder.pixmap)
|
||||
fe_NewMakeIcon(m_widget,
|
||||
|
@ -98,237 +174,18 @@ XFE_RDFView::XFE_RDFView(XFE_Component *toplevel, Widget parent,
|
|||
&openedFolder,
|
||||
NULL,
|
||||
BM_FolderO.width, BM_FolderO.height,
|
||||
BM_FolderO.mono_bits, BM_FolderO.color_bits, BM_FolderO.mask_bits, FALSE);
|
||||
}
|
||||
|
||||
setRDFView(htview);
|
||||
}
|
||||
|
||||
XFE_RDFView::~XFE_RDFView()
|
||||
{
|
||||
//xxx what to delete?
|
||||
}
|
||||
|
||||
Boolean
|
||||
XFE_RDFView::isCommandEnabled(CommandType cmd, void *calldata,
|
||||
XFE_CommandInfo* info)
|
||||
{
|
||||
{
|
||||
return XFE_View::isCommandEnabled(cmd, calldata, info);
|
||||
}
|
||||
BM_FolderO.mono_bits, BM_FolderO.color_bits,
|
||||
BM_FolderO.mask_bits, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::doCommand(CommandType cmd, void *calldata, XFE_CommandInfo*info)
|
||||
XFE_RDFView::activate_row(int row)
|
||||
{
|
||||
const int * selected;
|
||||
int count;
|
||||
|
||||
m_outliner->getSelection(&selected, &count);
|
||||
|
||||
{
|
||||
XFE_View::doCommand(cmd,calldata,info);
|
||||
}
|
||||
}
|
||||
|
||||
Boolean
|
||||
XFE_RDFView::handlesCommand(CommandType cmd, void *calldata,
|
||||
XFE_CommandInfo* info)
|
||||
{
|
||||
{
|
||||
return XFE_View::handlesCommand(cmd, calldata, info);
|
||||
}
|
||||
}
|
||||
|
||||
XP_Bool
|
||||
XFE_RDFView::isCommandSelected(CommandType cmd,
|
||||
void *calldata, XFE_CommandInfo* info)
|
||||
{
|
||||
{
|
||||
XFE_View *view = getParent();
|
||||
return (view && view->isCommandSelected(cmd, calldata, info));
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
XFE_RDFView::commandToString(CommandType cmd, void*, XFE_CommandInfo*)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// Methods from the outlinable interface.
|
||||
void *
|
||||
XFE_RDFView::ConvFromIndex(int /*index*/)
|
||||
{
|
||||
XP_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
XFE_RDFView::ConvToIndex(void */*item*/)
|
||||
{
|
||||
XP_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
XFE_RDFView::acquireLineData(int line)
|
||||
{
|
||||
m_node = HT_GetNthItem(m_rdfview, line /*+ 1*/);
|
||||
|
||||
if (!m_node)
|
||||
return NULL;
|
||||
|
||||
m_nodeDepth = HT_GetItemIndentation(m_node);
|
||||
m_ancestorInfo = new OutlinerAncestorInfo[ m_nodeDepth + 1];
|
||||
|
||||
if (m_nodeDepth)
|
||||
{
|
||||
HT_Resource tmp;
|
||||
int i;
|
||||
|
||||
for (tmp = m_node, i = m_nodeDepth;
|
||||
tmp != NULL;
|
||||
tmp = HT_GetParent(tmp), i --)
|
||||
{
|
||||
m_ancestorInfo[i].has_prev = HT_ItemHasBackwardSibling(tmp);
|
||||
m_ancestorInfo[i].has_next = HT_ItemHasForwardSibling(tmp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ancestorInfo[0].has_prev = HT_ItemHasBackwardSibling(m_node);
|
||||
m_ancestorInfo[0].has_next = HT_ItemHasForwardSibling(m_node);
|
||||
}
|
||||
|
||||
return m_node;
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::getTreeInfo(XP_Bool *expandable,
|
||||
XP_Bool *is_expanded,
|
||||
int *depth,
|
||||
OutlinerAncestorInfo **ancestor)
|
||||
{
|
||||
XP_Bool is_node_expandable = False;
|
||||
XP_Bool is_node_expanded = False;
|
||||
|
||||
XP_ASSERT(m_node);
|
||||
|
||||
if (!m_node)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
is_node_expandable = HT_IsContainer(m_node);
|
||||
if (is_node_expandable)
|
||||
is_node_expanded = HT_IsContainerOpen(m_node);
|
||||
|
||||
if (expandable)
|
||||
*expandable = is_node_expandable;
|
||||
|
||||
if (is_expanded)
|
||||
*is_expanded = is_node_expanded;
|
||||
|
||||
if (depth)
|
||||
*depth = m_nodeDepth;
|
||||
|
||||
if (ancestor)
|
||||
*ancestor = m_ancestorInfo;
|
||||
}
|
||||
|
||||
EOutlinerTextStyle
|
||||
XFE_RDFView::getColumnStyle(int /*column*/)
|
||||
{
|
||||
XP_ASSERT(m_node);
|
||||
|
||||
return OUTLINER_Default;
|
||||
//return BM_IsAlias(m_node) ? OUTLINER_Italic : OUTLINER_Default;
|
||||
}
|
||||
|
||||
char *
|
||||
XFE_RDFView::getColumnText(int /*column*/)
|
||||
{
|
||||
static char node_buf[2048]; // does this need to be thread safe???
|
||||
void *data;
|
||||
|
||||
XP_ASSERT(m_node);
|
||||
|
||||
// xxx Need error handling and column switching
|
||||
HT_NodeDisplayString(m_node, node_buf, sizeof(node_buf));
|
||||
return node_buf;
|
||||
}
|
||||
|
||||
fe_icon *
|
||||
XFE_RDFView::getColumnIcon(int column)
|
||||
{
|
||||
XP_ASSERT(m_node);
|
||||
|
||||
if (column != 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (HT_IsContainer(m_node)) {
|
||||
if (HT_IsContainerOpen(m_node)) {
|
||||
return &openedFolder;
|
||||
} else {
|
||||
return &closedFolder;
|
||||
}
|
||||
} else {
|
||||
return &bookmark;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
XFE_RDFView::getColumnName(int /*column*/)
|
||||
{
|
||||
// xxx Widget name
|
||||
return "Name";
|
||||
}
|
||||
|
||||
char *
|
||||
XFE_RDFView::getColumnHeaderText(int /*column*/)
|
||||
{
|
||||
// xxx Column Label
|
||||
return "Name";
|
||||
}
|
||||
|
||||
fe_icon *
|
||||
XFE_RDFView::getColumnHeaderIcon(int /*column*/)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
EOutlinerTextStyle
|
||||
XFE_RDFView::getColumnHeaderStyle(int /*column*/)
|
||||
{
|
||||
return OUTLINER_Default;
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::releaseLineData()
|
||||
{
|
||||
delete [] m_ancestorInfo;
|
||||
m_ancestorInfo = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::Buttonfunc(const OutlineButtonFuncData *data)
|
||||
{
|
||||
if (data->row == -1)
|
||||
{
|
||||
// Click on Column header
|
||||
|
||||
// data->column has the column
|
||||
return;
|
||||
}
|
||||
|
||||
HT_Resource node = HT_GetNthItem(m_rdfview, data->row);
|
||||
HT_Resource node = HT_GetNthItem(m_rdfview, row);
|
||||
|
||||
if (!node) return;
|
||||
|
||||
if (data->clicks == 1)
|
||||
{
|
||||
#if 0
|
||||
if (data->ctrl)
|
||||
{
|
||||
HT_ToggleSelection(node);
|
||||
|
@ -344,84 +201,438 @@ XFE_RDFView::Buttonfunc(const OutlineButtonFuncData *data)
|
|||
HT_SetSelection(node);
|
||||
m_outliner->selectItemExclusive(data->row);
|
||||
|
||||
if (data->button == Button2)
|
||||
{
|
||||
// Dispatch in new window (same as double click)
|
||||
char *s = HT_GetNodeURL (node);
|
||||
URL_Struct *url = NET_CreateURLStruct (s, NET_DONT_RELOAD);
|
||||
url->window_target = XP_STRDUP("_rdf_target");
|
||||
fe_reuseBrowser (m_contextData, url);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (data->clicks == 2)
|
||||
{
|
||||
HT_SetSelection(node);
|
||||
m_outliner->selectItemExclusive(data->row);
|
||||
|
||||
if (HT_IsContainer(node))
|
||||
{
|
||||
PRBool isOpen;
|
||||
|
||||
HT_GetOpenState(node, &isOpen);
|
||||
if (isOpen)
|
||||
{
|
||||
//BM_ClearAllChildSelection(m_contextData, node, TRUE);
|
||||
}
|
||||
|
||||
HT_SetOpenState(m_node, (PRBool)!isOpen);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dispatch in new window (same as button2 above)
|
||||
char *s = HT_GetNodeURL (node);
|
||||
URL_Struct *url = NET_CreateURLStruct (s, NET_DONT_RELOAD);
|
||||
url->window_target = XP_STRDUP("_rdf_target");
|
||||
fe_reuseBrowser (m_contextData, url);
|
||||
}
|
||||
}
|
||||
|
||||
getToplevel()->notifyInterested(XFE_View::chromeNeedsUpdating);
|
||||
#endif /*0*/
|
||||
|
||||
if (!HT_IsContainer(node)) {
|
||||
// Dispatch in new window
|
||||
char *s = HT_GetNodeURL (node);
|
||||
URL_Struct *url = NET_CreateURLStruct (s, NET_DONT_RELOAD);
|
||||
url->window_target = XP_STRDUP("_rdf_target");
|
||||
fe_reuseBrowser (m_contextData, url);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::Flippyfunc(const OutlineFlippyFuncData *data)
|
||||
XFE_RDFView::resize_cb(Widget,
|
||||
XtPointer clientData,
|
||||
XtPointer callData)
|
||||
{
|
||||
HT_Resource node = HT_GetNthItem(m_rdfview, data->row);
|
||||
if (node && HT_IsContainer(node))
|
||||
XFE_RDFView *obj = (XFE_RDFView*)clientData;
|
||||
|
||||
obj->resize(callData);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::resize(XtPointer callData)
|
||||
{
|
||||
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct*)callData;
|
||||
|
||||
XP_ASSERT(m_widget);
|
||||
if(!m_widget)
|
||||
return;
|
||||
|
||||
if (cbs->reason == XmCR_RESIZE_COLUMN)
|
||||
{
|
||||
PRBool isOpen;
|
||||
|
||||
HT_GetOpenState(node, &isOpen);
|
||||
if (isOpen)
|
||||
{
|
||||
//BM_ClearAllChildSelection(m_contextData, node, TRUE);
|
||||
}
|
||||
|
||||
HT_SetOpenState(m_node, (PRBool)!isOpen);
|
||||
D( printf("Inside XFE_RDFView::resize(COLUMN, %d)\n", cbs->column););
|
||||
}
|
||||
}
|
||||
|
||||
XFE_Outliner *
|
||||
XFE_RDFView::getOutliner()
|
||||
|
||||
void
|
||||
XFE_RDFView::refresh(HT_Resource node)
|
||||
{
|
||||
return m_outliner;
|
||||
if (!m_rdfview) return;
|
||||
|
||||
XP_ASSERT(HT_IsContainer(node));
|
||||
if (!HT_IsContainer(node)) return;
|
||||
|
||||
if (HT_IsContainerOpen(node))
|
||||
{
|
||||
HT_Resource child;
|
||||
|
||||
HT_Cursor child_cursor = HT_NewCursor(node);
|
||||
while (child = HT_GetNextItem(child_cursor))
|
||||
{
|
||||
add_row(child);
|
||||
|
||||
if (HT_IsContainer(child) && HT_IsContainerOpen(child))
|
||||
refresh(child);
|
||||
}
|
||||
HT_DeleteCursor(child_cursor);
|
||||
}
|
||||
else
|
||||
{
|
||||
int row = HT_GetNodeIndex(m_rdfview, node);
|
||||
|
||||
XmLTreeDeleteChildren(m_widget, row);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
XFE_RDFView::notify(HT_Notification ns, HT_Resource n,
|
||||
HT_Event whatHappened)
|
||||
{
|
||||
switch (whatHappened) {
|
||||
case HT_EVENT_NODE_ADDED:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_ADDED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_DELETED_DATA:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_DELETED_DATA",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_DELETED_NODATA:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_DELETED_NODATA",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_VPROP_CHANGED:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_VPROP_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_SELECTION_CHANGED:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_SELECTION_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_NODE_OPENCLOSE_CHANGED:
|
||||
{
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_OPENCLOSE_CHANGED",
|
||||
HT_GetNodeName(n)););
|
||||
|
||||
refresh(n);
|
||||
|
||||
break;
|
||||
}
|
||||
case HT_EVENT_VIEW_CLOSED:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_VIEW_CLOSED",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
case HT_EVENT_VIEW_SELECTED:
|
||||
{
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_VIEW_SELECTED",
|
||||
HT_GetNodeName(n)););
|
||||
|
||||
HT_View view = HT_GetView(n);
|
||||
|
||||
if (m_rdfview != view)
|
||||
setRDFView(view);
|
||||
}
|
||||
break;
|
||||
case HT_EVENT_NODE_OPENCLOSE_CHANGING:
|
||||
D(printf("RDFView::HT_Event: %s on %s\n","HT_EVENT_NODE_OPENCLOSE_CHANGING",
|
||||
HT_GetNodeName(n)););
|
||||
break;
|
||||
default:
|
||||
D(printf("RDFView::HT_Event: Unknown type on %s\n",HT_GetNodeName(n)););
|
||||
break;
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
XFE_RDFView::setRDFView(HT_View htview)
|
||||
{
|
||||
if (htview == m_rdfview) return;
|
||||
|
||||
m_rdfview = htview;
|
||||
|
||||
if (!m_rdfview) return;
|
||||
|
||||
int itemCount = HT_GetItemListCount(htview);
|
||||
|
||||
m_outliner->change(0, itemCount,
|
||||
(itemCount > 0 ? itemCount : 0));
|
||||
fill_tree();
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::fill_tree()
|
||||
{
|
||||
if (!m_rdfview) return;
|
||||
|
||||
int item_count = HT_GetItemListCount(m_rdfview);
|
||||
|
||||
XtVaSetValues(m_widget,
|
||||
XmNlayoutFrozen, True,
|
||||
XmNcolumns, 1,
|
||||
XmNrows, 0,
|
||||
NULL);
|
||||
|
||||
// Set default values for column headings
|
||||
// (Should make so that the grid widget has separate defaults
|
||||
// for headings and content cells)
|
||||
XtVaSetValues(m_widget,
|
||||
XmNcellDefaults, True,
|
||||
XmNcellLeftBorderType, XmBORDER_LINE,
|
||||
XmNcellRightBorderType, XmBORDER_LINE,
|
||||
XmNcellTopBorderType, XmBORDER_LINE,
|
||||
XmNcellBottomBorderType, XmBORDER_LINE,
|
||||
NULL);
|
||||
|
||||
// add columns
|
||||
char *column_name;
|
||||
uint32 column_width;
|
||||
void *token;
|
||||
uint32 token_type;
|
||||
int ii = 0;
|
||||
HT_Cursor column_cursor = HT_NewColumnCursor (m_rdfview);
|
||||
while (HT_GetNextColumn(column_cursor, &column_name, &column_width,
|
||||
&token, &token_type)) {
|
||||
add_column(ii, column_name, column_width, token, token_type);
|
||||
ii++;
|
||||
}
|
||||
HT_DeleteColumnCursor(column_cursor);
|
||||
|
||||
// Set default values for new content cells
|
||||
XtVaSetValues(m_widget,
|
||||
XmNcellDefaults, True,
|
||||
XmNcellMarginLeft, 1,
|
||||
XmNcellMarginRight, 1,
|
||||
XmNcellLeftBorderType, XmBORDER_NONE,
|
||||
XmNcellRightBorderType, XmBORDER_NONE,
|
||||
XmNcellTopBorderType, XmBORDER_NONE,
|
||||
XmNcellBottomBorderType, XmBORDER_NONE,
|
||||
NULL);
|
||||
|
||||
|
||||
// add rows
|
||||
for (ii=0; ii < item_count; ii++) {
|
||||
add_row(ii);
|
||||
}
|
||||
|
||||
XtVaSetValues(m_widget,
|
||||
XmNlayoutFrozen, False,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::destroy_tree()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::add_row(int row)
|
||||
{
|
||||
HT_Resource node = HT_GetNthItem (m_rdfview, row);
|
||||
add_row(node);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::add_row(HT_Resource node)
|
||||
{
|
||||
//HT_Resource node = GetNthItem (m_rdfview, row);
|
||||
int row = HT_GetNodeIndex(m_rdfview, node);
|
||||
char *name = HT_GetNodeName(node);
|
||||
int depth = HT_GetItemIndentation(node);
|
||||
Boolean expands = HT_IsContainer(node);
|
||||
Boolean isExpanded = HT_IsContainerOpen(node);
|
||||
|
||||
/*D( fprintf(stderr,"XFE_RDFView::add_row(0x%x %d) name(%s) depth(%d)\n",
|
||||
node,row, name, depth);)*/
|
||||
|
||||
Pixmap pixmap, mask;
|
||||
|
||||
//pixmap = XmUNSPECIFIED_PIXMAP;
|
||||
//pixmask = XmUNSPECIFIED_PIXMAP;
|
||||
if (expands && isExpanded) {
|
||||
pixmap = openedFolder.pixmap;
|
||||
mask = openedFolder.mask;
|
||||
} else if (expands && !isExpanded) {
|
||||
pixmap = closedFolder.pixmap;
|
||||
mask = closedFolder.mask;
|
||||
} else {
|
||||
pixmap = bookmark.pixmap;
|
||||
mask = bookmark.mask;
|
||||
}
|
||||
|
||||
XmString xmstr = XmStringCreateSimple(name);
|
||||
|
||||
XmLTreeAddRow(m_widget,
|
||||
depth,
|
||||
expands,
|
||||
isExpanded,
|
||||
row,
|
||||
pixmap,
|
||||
mask,
|
||||
xmstr);
|
||||
|
||||
XmStringFree(xmstr);
|
||||
|
||||
int column_count;
|
||||
// Should only need to do this for visible columns
|
||||
XtVaGetValues(m_widget, XmNcolumns, &column_count, NULL);
|
||||
RDFColumnData *column_data;
|
||||
void *data;
|
||||
for (int ii = 1; ii < column_count; ii++)
|
||||
{
|
||||
XmLGridColumn column = XmLGridGetColumn(m_widget, XmCONTENT, ii);
|
||||
XtVaGetValues(m_widget,
|
||||
XmNcolumnPtr, column,
|
||||
XmNcolumnUserData, &column_data,
|
||||
NULL);
|
||||
|
||||
Boolean is_editable = HT_IsNodeDataEditable(node,
|
||||
column_data->token,
|
||||
column_data->token_type);
|
||||
XtVaSetValues(m_widget,
|
||||
XmNrow, row,
|
||||
XmNcolumn, ii,
|
||||
XmNcellEditable, is_editable,
|
||||
NULL);
|
||||
|
||||
if (HT_GetNodeData (node, column_data->token,
|
||||
column_data->token_type, &data)
|
||||
&& data)
|
||||
{
|
||||
time_t dateVal;
|
||||
struct tm* time;
|
||||
char buffer[200];
|
||||
|
||||
switch (column_data->token_type)
|
||||
{
|
||||
case HT_COLUMN_DATE_STRING:
|
||||
if ((dateVal = (time_t)atol((char *)data)) == 0) break;
|
||||
if ((time = localtime(&dateVal)) == NULL) break;
|
||||
HTFE_MakePrettyDate(buffer, dateVal);
|
||||
break;
|
||||
case HT_COLUMN_DATE_INT:
|
||||
if ((time = localtime((time_t *) &data)) == NULL) break;
|
||||
HTFE_MakePrettyDate(buffer, (time_t)data);
|
||||
break;
|
||||
case HT_COLUMN_INT:
|
||||
sprintf(buffer,"%d",(int)data);
|
||||
break;
|
||||
case HT_COLUMN_STRING:
|
||||
strcpy(buffer, (char*)data);
|
||||
break;
|
||||
}
|
||||
/*D(fprintf(stderr,"Node data (%d, %d) = '%s'\n",row,ii,buffer););*/
|
||||
XmLGridSetStringsPos(m_widget,
|
||||
XmCONTENT, row,
|
||||
XmCONTENT, ii,
|
||||
buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*D(fprintf(stderr,"No column data r(%d) c(%d) type(%d)\n",row,ii,
|
||||
column_data->token_type););*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::delete_row(int row)
|
||||
{
|
||||
XmLGridDeleteRows(m_widget, XmCONTENT, row, 1);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::add_column(int index, char *name, uint32 width,
|
||||
void *token, uint32 token_type)
|
||||
{
|
||||
D( fprintf(stderr,"XFE_RDFView::add_column index(%d) name(%s) width(%d)\n",
|
||||
index, name,width););
|
||||
|
||||
if (index > 0) {
|
||||
XmLGridAddColumns(m_widget, XmCONTENT, index, 1);
|
||||
}
|
||||
|
||||
RDFColumnData *column_data = new RDFColumnData(token, token_type);
|
||||
XtVaSetValues(m_widget,
|
||||
XmNcolumn, index,
|
||||
XmNcolumnSizePolicy, XmCONSTANT,
|
||||
XmNcolumnWidth, width,
|
||||
XmNcolumnUserData, column_data,
|
||||
NULL);
|
||||
|
||||
XmLGridSetStringsPos(m_widget,
|
||||
XmHEADING, 0,
|
||||
XmCONTENT, index,
|
||||
name);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::delete_column(HT_Resource cursor)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::expand_row_cb(Widget,
|
||||
XtPointer clientData,
|
||||
XtPointer callData)
|
||||
{
|
||||
XFE_RDFView *obj = (XFE_RDFView*)clientData;
|
||||
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct *)callData;
|
||||
|
||||
D(fprintf(stderr,"expand_row_cb(%d)\n",cbs->row););
|
||||
|
||||
obj->expand_row(cbs->row);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::expand_row(int row)
|
||||
{
|
||||
HT_Resource node = HT_GetNthItem (m_rdfview, row);
|
||||
|
||||
HT_SetOpenState (node, (PRBool)TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::collapse_row_cb(Widget,
|
||||
XtPointer clientData,
|
||||
XtPointer callData)
|
||||
{
|
||||
XFE_RDFView *obj = (XFE_RDFView*)clientData;
|
||||
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct *)callData;
|
||||
|
||||
D(fprintf(stderr,"collapse_row_cb(%d)\n",cbs->row););
|
||||
|
||||
obj->collapse_row(cbs->row);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::collapse_row(int row)
|
||||
{
|
||||
HT_Resource node = HT_GetNthItem (m_rdfview, row);
|
||||
|
||||
HT_SetOpenState (node, (PRBool)FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::delete_cb(Widget w,
|
||||
XtPointer /*clientData*/,
|
||||
XtPointer callData)
|
||||
{
|
||||
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct *)callData;
|
||||
|
||||
XmLGridColumn column;
|
||||
RDFColumnData *column_data = NULL;
|
||||
|
||||
cbs = (XmLGridCallbackStruct *)callData;
|
||||
|
||||
if (cbs->reason != XmCR_DELETE_COLUMN)
|
||||
return;
|
||||
|
||||
column = XmLGridGetColumn(w, XmCONTENT, cbs->column);
|
||||
|
||||
XtVaGetValues(w,
|
||||
XmNcolumnPtr, column,
|
||||
XmNcolumnUserData, &column_data,
|
||||
NULL);
|
||||
|
||||
delete column_data;
|
||||
}
|
||||
|
||||
void
|
||||
XFE_RDFView::activate_cb(Widget,
|
||||
XtPointer clientData,
|
||||
XtPointer callData)
|
||||
{
|
||||
XFE_RDFView *obj = (XFE_RDFView*)clientData;
|
||||
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct *)callData;
|
||||
|
||||
if (cbs->rowType != XmCONTENT)
|
||||
return;
|
||||
|
||||
obj->activate_row(cbs->row);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,13 +27,11 @@
|
|||
|
||||
#include "View.h"
|
||||
#include "IconGroup.h"
|
||||
#include "Outliner.h"
|
||||
#include "Outlinable.h"
|
||||
#include "htrdf.h"
|
||||
|
||||
//#include "PopupMenu.h"
|
||||
|
||||
class XFE_RDFView : public XFE_View, public XFE_Outlinable
|
||||
class XFE_RDFView : public XFE_View
|
||||
{
|
||||
public:
|
||||
XFE_RDFView(XFE_Component *toplevel, Widget parent,
|
||||
|
@ -41,44 +39,6 @@ public:
|
|||
|
||||
~XFE_RDFView();
|
||||
|
||||
// Methods we override from XFE_View
|
||||
virtual Boolean isCommandEnabled(CommandType cmd, void *calldata = NULL,
|
||||
XFE_CommandInfo* i = NULL);
|
||||
virtual void doCommand(CommandType cmd, void *calldata = NULL,
|
||||
XFE_CommandInfo* i = NULL);
|
||||
virtual Boolean handlesCommand(CommandType cmd, void *calldata = NULL,
|
||||
XFE_CommandInfo* i = NULL);
|
||||
virtual XP_Bool isCommandSelected(CommandType cmd, void *calldata,
|
||||
XFE_CommandInfo* info);
|
||||
virtual char *commandToString(CommandType cmd, void *calldata = NULL,
|
||||
XFE_CommandInfo* i = NULL);
|
||||
|
||||
//void setClipContents(void *block, int32 length);
|
||||
//void *getClipContents(int32 *length);
|
||||
//void freeClipContents();
|
||||
|
||||
// The Outlinable interface.
|
||||
virtual void *ConvFromIndex(int index);
|
||||
virtual int ConvToIndex(void *item);
|
||||
|
||||
virtual char *getColumnName(int column);
|
||||
|
||||
virtual char *getColumnHeaderText(int column);
|
||||
virtual fe_icon *getColumnHeaderIcon(int column);
|
||||
virtual EOutlinerTextStyle getColumnHeaderStyle(int column);
|
||||
virtual void *acquireLineData(int line);
|
||||
virtual void getTreeInfo(XP_Bool *expandable, XP_Bool *is_expanded,
|
||||
int *depth, OutlinerAncestorInfo **ancestor);
|
||||
virtual EOutlinerTextStyle getColumnStyle(int column);
|
||||
virtual char *getColumnText(int column);
|
||||
virtual fe_icon *getColumnIcon(int column);
|
||||
virtual void releaseLineData();
|
||||
|
||||
virtual void Buttonfunc(const OutlineButtonFuncData *data);
|
||||
virtual void Flippyfunc(const OutlineFlippyFuncData *data);
|
||||
|
||||
virtual XFE_Outliner *getOutliner();
|
||||
|
||||
// Get tooltipString & docString;
|
||||
// returned string shall be freed by the callee
|
||||
// row < 0 indicates heading row; otherwise it is a content row
|
||||
|
@ -87,22 +47,21 @@ public:
|
|||
virtual char *getCellTipString(int /* row */, int /* column */) {return NULL;}
|
||||
virtual char *getCellDocString(int /* row */, int /* column */) {return NULL;}
|
||||
|
||||
// Refresh the outliner
|
||||
void refresh(HT_Resource node);
|
||||
|
||||
// Open properties dialog
|
||||
//void openPropertiesWindow();
|
||||
//void closePropertiesWindow();
|
||||
|
||||
// RDF Specific calls
|
||||
void notify(HT_Notification ns, HT_Resource n, HT_Event whatHappened);
|
||||
|
||||
void setRDFView(HT_View view);
|
||||
|
||||
private:
|
||||
//HT_Pane m_Pane; // The pane that owns this view
|
||||
HT_View m_rdfview; // The view as registered in the hypertree
|
||||
HT_Resource m_node; // needed by the outlinable interface methods.
|
||||
|
||||
int m_nodeDepth; // needed by the outlinable interface methods.
|
||||
OutlinerAncestorInfo *m_ancestorInfo; // needed by the outlinable interface methods.
|
||||
|
||||
XFE_Outliner *m_outliner; // the outliner object used to display everything.
|
||||
|
||||
//XFE_PopupMenu *m_popup;
|
||||
|
||||
|
@ -111,6 +70,29 @@ private:
|
|||
static fe_icon openedFolder;
|
||||
static fe_icon closedFolder;
|
||||
|
||||
void init_pixmaps();
|
||||
|
||||
void fill_tree();
|
||||
void destroy_tree();
|
||||
|
||||
void add_row(HT_Resource node);
|
||||
void add_row(int node);
|
||||
void delete_row(int row);
|
||||
void add_column(int index, char *name, uint32 width,
|
||||
void *token, uint32 token_type);
|
||||
|
||||
void expand_row(int row);
|
||||
void collapse_row(int row);
|
||||
void delete_column(HT_Resource cursor);
|
||||
void activate_row(int row);
|
||||
void resize(XtPointer);
|
||||
|
||||
static void expand_row_cb(Widget, XtPointer, XtPointer);
|
||||
static void collapse_row_cb(Widget, XtPointer, XtPointer);
|
||||
static void delete_cb(Widget, XtPointer, XtPointer);
|
||||
static void activate_cb(Widget, XtPointer, XtPointer);
|
||||
static void resize_cb(Widget, XtPointer, XtPointer);
|
||||
|
||||
#ifdef NOTYET
|
||||
void dropfunc(Widget dropw, fe_dnd_Event type, fe_dnd_Source *source, XEvent *event);
|
||||
static void drop_func(Widget dropw, void *closure, fe_dnd_Event type,
|
||||
|
|
Загрузка…
Ссылка в новой задаче