Add three-state column sorting. Fix inplace editing (wasn't checking HT for editable state). Change name of *StandAloneState to *StandAlone. Add convenience function for setting/getting column data.

This commit is contained in:
slamm%netscape.com 1998-10-08 22:14:05 +00:00
parent b0818d4a9c
commit bef014ff03
2 changed files with 139 additions and 139 deletions

View File

@ -61,46 +61,6 @@ extern "C"
};
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));
}
}
//
// Command Handling
//
@ -154,7 +114,9 @@ public:
};
};
// END OF COMMAND DEFINES
// End of Commands
/////////////////////////////////////////////////////////////////////
// Start of XFE_RDFTreeView definitions
static XFE_CommandList* my_commands = 0;
@ -165,8 +127,7 @@ XFE_RDFTreeView::XFE_RDFTreeView(XFE_Component * toplevel,
XFE_View(toplevel, parent_view, context),
XFE_RDFBase(),
_popup(NULL),
_standAloneState(False),
_isCellEditable(False)
_isStandAlone(False)
{
if (!my_commands)
{
@ -259,6 +220,33 @@ XFE_RDFTreeView::doAttachments()
}
//////////////////////////////////////////////////////////////////////////
void
XFE_RDFTreeView::setColumnData(int column, void * token, uint32 token_type)
{
XFE_ColumnData *column_data = getColumnData(column);
if (column_data) {
column_data->token = token;
column_data->token_type = token_type;
} else {
column_data = new XFE_ColumnData(token, token_type);
}
XtVaSetValues(_tree,
XmNcolumn, column,
XmNcolumnUserData, column_data,
NULL);
}
XFE_ColumnData *
XFE_RDFTreeView::getColumnData(int column)
{
XFE_ColumnData * column_data;
XmLGridColumn colp = XmLGridGetColumn(_tree, XmCONTENT, column);
XtVaGetValues(_tree,
XmNcolumnPtr, colp,
XmNcolumnUserData, &column_data,
NULL);
return column_data;
}
/////////////////////////////////////////////////////////////////////
void
XFE_RDFTreeView::init_pixmaps(void)
{
XP_ASSERT( XfeIsAlive(_tree) );
@ -397,12 +385,8 @@ XFE_RDFTreeView::edit_cell(XtPointer callData)
{
XmLGridColumn column = XmLGridGetColumn(_tree, XmCONTENT,
cbs->column);
RDFColumnData *column_data = NULL;
XtVaGetValues(_tree,
XmNcolumnPtr, column,
XmNcolumnUserData, &column_data,
NULL);
XFE_ColumnData *column_data = getColumnData(cbs->column);
XmLGridRow row = XmLGridGetRow(_tree, XmCONTENT, cbs->row);
XmString cell_string;
@ -427,9 +411,45 @@ XFE_RDFTreeView::select_cb(Widget,
XFE_RDFTreeView *obj = (XFE_RDFTreeView*)clientData;
XmLGridCallbackStruct *cbs = (XmLGridCallbackStruct *)callData;
D(fprintf(stderr,"select_cb(%d)\n",cbs->row););
if (cbs->rowType == XmHEADING) {
obj->sort_column(cbs->column);
} else {
obj->select_row(cbs->row);
}
}
void
XFE_RDFTreeView::sort_column(int column)
{
int old_sort_column;
unsigned char old_sort_type;
XmLGridGetSort(_tree, &old_sort_column, &old_sort_type);
unsigned char sort_type = XmSORT_ASCENDING;
if (old_sort_column == column) {
if (old_sort_type == XmSORT_ASCENDING)
sort_type = XmSORT_DESCENDING;
else if (old_sort_type == XmSORT_DESCENDING)
sort_type = XmSORT_NONE;
}
XFE_ColumnData * column_data = getColumnData(column);
if (sort_type == XmSORT_NONE) {
HT_SetSortColumn(_ht_view, NULL, NULL, PR_FALSE);
} else {
XP_ASSERT(column_data);
if (!column_data) return;
HT_SetSortColumn(_ht_view,
column_data->token,
column_data->token_type,
sort_type == XmSORT_DESCENDING ? PR_TRUE : PR_FALSE);
}
XmLGridSetSort(_tree, column, sort_type);
}
void
@ -530,6 +550,7 @@ XFE_RDFTreeView::notify(HT_Resource n, HT_Event whatHappened)
break;
}
case HT_EVENT_VIEW_REFRESH:
case HT_EVENT_VIEW_SORTING_CHANGED:
{
int row = HT_GetNodeIndex(_ht_view, n);
PRBool expands = HT_IsContainer(n);
@ -573,12 +594,6 @@ XFE_RDFTreeView::fill_tree()
int item_count = HT_GetItemListCount(_ht_view);
//void * data=NULL;
/* This s'd eventually be replaced by the HT property useInlineEditing */
if (getStandAloneState())
_isCellEditable = True;
else
_isCellEditable = False;
XtVaSetValues(_tree,
XmNlayoutFrozen, True,
XmNcolumns, 1,
@ -701,28 +716,27 @@ XFE_RDFTreeView::add_row
int column_count;
// Should only need to do this for visible columns
XtVaGetValues(_tree, XmNcolumns, &column_count, NULL);
RDFColumnData *column_data;
void *data;
for (int ii = 0; ii < column_count; ii++)
{
XmLGridColumn column = XmLGridGetColumn(_tree, XmCONTENT, ii);
XtVaGetValues(_tree,
XmNcolumnPtr, column,
XmNcolumnUserData, &column_data,
NULL);
/*
Boolean is_editable = HT_IsNodeDataEditable(node,
XFE_ColumnData *column_data = getColumnData(ii);
if (column_data)
{
Boolean is_editable = False;
if (isStandAlone())
{
is_editable = HT_IsNodeDataEditable(node,
column_data->token,
column_data->token_type);
*/
Boolean is_editable = _isCellEditable;
}
XtVaSetValues(_tree,
XmNrow, row,
XmNcolumn, ii,
XmNcellEditable, is_editable,
NULL);
if (column_data && HT_GetNodeData (node, column_data->token,
if (HT_GetNodeData (node, column_data->token,
column_data->token_type, &data)
&& data)
{
@ -732,32 +746,20 @@ XFE_RDFTreeView::add_row
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_DATE_STRING:
case HT_COLUMN_STRING:
strcpy(buffer, (char*)data);
break;
}
/*D(fprintf(stderr,"Node data (%d, %d) = '%s'\n",row,ii,buffer););*/
XmLGridSetStringsPos(_tree,
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););*/
}
}
}
@ -781,14 +783,14 @@ XFE_RDFTreeView::add_column(int index, char *name, uint32 width,
XmLGridAddColumns(_tree, XmCONTENT, index, 1);
}
RDFColumnData *column_data = new RDFColumnData(token, token_type);
XtVaSetValues(_tree,
XmNcolumn, index,
XmNcolumnSizePolicy, XmCONSTANT,
XmNcolumnWidth, width,
XmNcolumnUserData, column_data,
NULL);
setColumnData(index, token, token_type);
XmLGridSetStringsPos(_tree,
XmHEADING, 0,
XmCONTENT, index,
@ -845,26 +847,19 @@ XFE_RDFTreeView::collapse_row(int row)
void
XFE_RDFTreeView::delete_cb(Widget w,
XtPointer /*clientData*/,
XtPointer clientData,
XtPointer callData)
{
XFE_RDFTreeView *obj = (XFE_RDFTreeView*)clientData;
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);
XFE_ColumnData * column_data = obj->getColumnData(cbs->column);
if (column_data)
delete column_data;
}
@ -948,18 +943,18 @@ XFE_RDFPopupMenu::PushButtonActivate(Widget /* w */, XtPointer userData)
//
//////////////////////////////////////////////////////////////////////////
void
XFE_RDFTreeView::setStandAloneState(XP_Bool state)
XFE_RDFTreeView::setStandAlone(XP_Bool stand_alone)
{
XP_ASSERT( XfeIsAlive(_tree) );
_standAloneState = state;
_isStandAlone = stand_alone;
#ifdef UNDEF
/*
* We need to set lot more properties based on standalone state.
* We instead call setHTTreeviewProperties to do all that
*/
int visibleColumns = (_standAloneState ? 0 : 1);
int visibleColumns = (_isStandAlone ? 0 : 1);
XtVaSetValues(_tree,
XmNvisibleColumns, visibleColumns,
@ -968,12 +963,6 @@ XFE_RDFTreeView::setStandAloneState(XP_Bool state)
}
//////////////////////////////////////////////////////////////////////////
XP_Bool
XFE_RDFTreeView::getStandAloneState()
{
return _standAloneState;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@ -1100,7 +1089,7 @@ XFE_RDFTreeView::setHTTreeViewProperties( HT_View view)
else if ((!XP_STRCASECMP(answer, "No")) || (!XP_STRCASECMP(answer, "0")))
{ }
*/
if (_standAloneState)
if (isStandAlone())
{
/* Management mode */
XtSetArg(av[ac], XmNheadingRows, 1);

View File

@ -47,6 +47,16 @@ protected:
HT_Pane m_pane;
};
//////////////////////////////////////////////////////////////////////////
class XFE_ColumnData
{
public:
XFE_ColumnData(void) : token(NULL), token_type(0) {}
XFE_ColumnData(void *t, uint32 tt) : token(t), token_type(tt) {}
void* token;
uint32 token_type;
};
//////////////////////////////////////////////////////////////////////////
class XFE_RDFTreeView : public XFE_View,
@ -81,12 +91,15 @@ public:
void doPopup(XEvent *event);
// Stand alone set/get methods
void setStandAloneState(XP_Bool state);
XP_Bool getStandAloneState();
void setStandAlone(XP_Bool);
XP_Bool isStandAlone() { return _isStandAlone; }
// Set HT Properties
void setHTTreeViewProperties(HT_View);
void setColumnData (int column, void *token, uint32 tkntype);
XFE_ColumnData *getColumnData (int column);
protected:
// The XmL tree widget
Widget _tree;
@ -101,10 +114,7 @@ private:
XFE_RDFPopupMenu * _popup;
// Is this a stand alone view ?
XP_Bool _standAloneState;
// Are the cells editable?
XP_Bool _isCellEditable;
XP_Bool _isStandAlone;
// icons for use in the bookmark window.
static fe_icon bookmark;
@ -130,6 +140,7 @@ private:
void resize(XtPointer);
void edit_cell(XtPointer);
void select_row(int row);
void sort_column(int column);
void deselect_row(int row);
static void expand_row_cb(Widget, XtPointer, XtPointer);