Mozilla/mozilla/cmd/xfe/src/Outliner.h
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

445 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.
*/
/*
Outliner.h -- class definition for the Outliner object
Created: Chris Toshok <toshok@netscape.com>, 7-Aug-96.
*/
#ifndef _xfe_outliner_h
#define _xfe_outliner_h
#include "Component.h"
#include "mozilla.h"
#if !defined(USE_MOTIF_DND)
#include "dragdrop.h"
#endif /* USE_MOTIF_DND */
#include "msgcom.h"
#include "icons.h"
#if defined(USE_MOTIF_DND)
#include "icons/icondata.h"
#endif /* USE_MOTIF_DND */
#include "xp_list.h"
#include "XmL/Grid.h"
typedef enum {
OUTLINER_Leaf,
OUTLINER_Folded,
OUTLINER_Expanded
} EOutlinerFlippyType;
typedef enum {
OUTLINER_Default,
OUTLINER_Bold,
OUTLINER_Italic
} EOutlinerTextStyle;
typedef enum
{
PIPE_OPENTOPPARENT,
PIPE_OPENMIDDLEPARENT,
PIPE_OPENBOTTOMPARENT,
PIPE_OPENSINGLEPARENT,
PIPE_CLOSEDTOPPARENT,
PIPE_CLOSEDMIDDLEPARENT,
PIPE_CLOSEDBOTTOMPARENT,
PIPE_CLOSEDSINGLEPARENT,
PIPE_TOPITEM,
PIPE_MIDDLEITEM,
PIPE_BOTTOMITEM,
PIPE_EMPTYITEM
} EOutlinerPipeType;
typedef enum
{
OUTLINER_SortAscending,
OUTLINER_SortDescending
} EOutlinerSortDirection;
class XFE_Outlinable;
#if defined(USE_MOTIF_DND)
class XFE_OutlinerDrop;
class XFE_OutlinerDrag;
#endif /* USE_MOTIF_DND */
struct OutlineButtonFuncData;
struct OutlineFlippyFuncData;
struct OutlinerAncestorInfo;
#if defined(USE_MOTIF_DND)
typedef void (*FEGetDropTargetFunc)(void *,
Atom **targets, int *numtargets);
typedef void (*FEGetDragTargetFunc)(void *,
int row, int col,
Atom **targets, int *numtargets);
typedef fe_icon_data* (*FEGetDragIconDataFunc)(void *,
int row, int col);
typedef char* (*FEConvertDragDataFunc)(void *,
Atom atom);
typedef int (*FEProcessTargetsFunc)(void *,
int row, int col,
Atom *targets,
const char **data,
int numItems);
#endif /* USE_MOTIF_DND */
class XFE_Outliner : public XFE_Component
{
public:
XFE_Outliner(const char *name,
XFE_Outlinable *o,
XFE_Component *toplevel_component,
Widget widget_parent,
XP_Bool constantSize,
XP_Bool hasHeadings,
int num_columns,
int num_visible,
int *column_widths,
char *geom_prefname);
XFE_Outliner();
virtual ~XFE_Outliner();
#if !defined(USE_MOTIF_DND)
void setOutlinable(XFE_Outlinable *o);
#endif /* USE_MOTIF_DND */
int visibleRows(int& firstrow, int& lastrow);
XFE_Outlinable *getOutlinable();
void setSortColumn(int column, EOutlinerSortDirection direction);
int getSortColumn();
void toggleSortDirection();
EOutlinerSortDirection getSortDirection();
XP_Bool isColTextFit(char *str, int row, int col);
int textStart(int col, int maxX);
void setPipeColumn(int column);
int getPipeColumn();
void setColumnResizable(int column, XP_Bool resizable);
XP_Bool getColumnResizable(int column);
void setColumnWidth(int column, int width);
int getColumnWidth(int column);
int getNumContextAndHeaderRows();
void showAllRowsWithRange(int minRows, int maxRows);
void setDescendantSelectAllowed(XP_Bool flag);
XP_Bool getDescendantSelectAllowed();
void setMultiSelectAllowed(XP_Bool flag);
XP_Bool getMultiSelectAllowed();
void setHideColumnsAllowed(XP_Bool flag);
XP_Bool getHideColumnsAllowed();
#if !defined(USE_MOTIF_DND)
void setDragType(fe_dnd_Type dragtype, fe_icon *drag_icon = NULL,
XFE_Component *dragsource = NULL, fe_dnd_SourceDropFunc func = NULL);
fe_dnd_Type getDragType();
fe_icon *getDragIcon();
fe_dnd_SourceDropFunc getSourceDropFunc();
#else
void enableDragDrop(void *this_ptr = NULL,
FEGetDropTargetFunc drop_target_func = NULL,
FEGetDragTargetFunc drag_target_func = NULL,
FEGetDragIconDataFunc drag_icon_func = NULL,
FEConvertDragDataFunc drag_conv_func = NULL,
FEProcessTargetsFunc process_targets_func = NULL);
fe_icon_data* getDragIconData(int row, int col);
void getDragTargets(int row, int col, Atom **targets, int *numTargets);
void getDropTargets(Atom **targets, int *numTargets);
char *dragConvert(Atom atom);
int processTargets(int row, int col,
Atom *targets, const char **data, int numItems);
#endif /* USE_MOTIF_DND */
/* set selection blocked or not
*/
void setBlockSel(XP_Bool b);
void scroll2Item(int index);
void selectAllItems();
void selectItem(int index);
void selectRangeByIndices(int start_index, int end_index);
void selectItemExclusive(int index);
void deselectItem(int index);
void deselectAllItems();
/* set Focus selection
*/
void setInFocus(XP_Bool infocus);
XP_Bool isFocus();
/* timOrExpandSelection - pretty funky. look at Outliner.cpp */
void trimOrExpandSelection(int new_index);
void deselectRangeByIndices(int selection_begin, int selection_end);
void toggleSelected(int index);
XP_Bool isSelected(int line);
int getSelection(const int **indices, int *count);
int getTotalLines();
int XYToRow(int x, int y, XP_Bool *nearbottom = NULL);
void makeVisible(int index);
void change(int index, int num, int total_lines);
/* use these when we need to force the redraw of a line or a group of
lines. */
void invalidate();
void invalidateLine(int line);
void invalidateLines(int start, int count);
void invalidateHeaders();
/* used to give dnd feedback. */
void outlineLine(int line);
void underlineLine(int line);
/* hide/show the right-most column */
void hideColumn();
void showColumn();
/* apply a delta across all columns. Returns the actual delta applied. */
int applyDelta(int delta, int starting_at = 0);
/* move a particular column to another place. */
void moveColumn(int column_to_move, int destination);
#if !defined(USE_MOTIF_DND)
void handleDragEvent(XEvent *event, fe_dnd_Event type, fe_dnd_Source *source);
#endif /* USE_MOTIF_DND */
/* these are needed by the libmsg stuff, and probably should
be used by the bookmark/history/address book/etc stuff
so that sorting is consistent. */
/* Tao_16dec96
* Make them virtual to perform some customization
*/
int getListChangeDepth();
virtual void listChangeStarting(XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num,
int32 total_lines);
virtual void listChangeFinished(XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num,
int32 total_lines);
Widget getScroller();
private:
XFE_Outlinable *m_outlinable;
#if defined(USE_MOTIF_DND)
XFE_OutlinerDrop *m_outlinerdrop;
XFE_OutlinerDrag *m_outlinerdrag;
#endif /* USE_MOTIF_DND */
XP_Bool setDefaultGeometry();
/* used to maintain cached selection information */
void addSelection(int selected_line);
void removeSelection(int selected_line);
XP_Bool insertLines(int start, int count);
XP_Bool deleteLines(int start, int count);
void deselectAll();
/* used to save off and restore the selection when our list
is going to get screwed up (as in mail/news sorting) */
void saveSelection();
void restoreSelection();
/* used to restore a column on the right hand side. */
void hideColumn(int column_number);
void showColumn(int column_numder);
void showHeaderDraw(XmLGridCallbackStruct *call);
void hideHeaderDraw(XmLGridCallbackStruct *call);
void showHeaderClick();
void hideHeaderClick();
int numResizableVisibleColumns(int starting_at = 0);
/* used to maintain the selection information */
int *m_selectedIndices;
int m_selectedItemCount;
int m_selectedSize;
int m_selectedCount;
int m_firstSelectedIndex;
int m_lastSelectedIndex;
int m_selectionDirection; /* -1 for bottom-to-top, and 1 for top-to-bottom.
see the command in selectRangeByIndices */
/* this one is only used by listChange{Starting,Finished} */
void **m_selectedItems;
XP_Bool m_selBlocked; /* False (default): can't select; True, otherwise */
int m_totalLines;
XP_Bool m_descendantSelectAllowed;
XP_Bool m_hideColumnsAllowed;
// pointers used in calls to the flippyfunc and buttonfunc portions
// of the Outlinable interface.
OutlineButtonFuncData *m_buttonfunc_data;
OutlineFlippyFuncData *m_flippyfunc_data;
int m_numcolumns;
int m_numvisible;
char *m_prefname;
char *m_geominfo;
void *m_visibleTimer;
int m_visibleLine;
int m_DataRow;
Time m_lastuptime;
Time m_lastdowntime;
int m_lastx;
int m_lasty;
int *m_columnwidths;
XP_Bool *m_columnResizable;
int *m_columnIndex;
/* drag specific stuff. */
#if !defined(USE_MOTIF_DND)
int m_lastmotionx;
int m_lastmotiony;
int m_hotSpot_x;
int m_hotSpot_y;
#endif /* USE_MOTIF_DND */
XP_Bool m_ignoreevents;
#if !defined(USE_MOTIF_DND)
fe_dnd_Type m_dragtype;
fe_icon *m_dragicon;
XFE_Component *m_source;
fe_dnd_SourceDropFunc m_sourcedropfunc;
void makeDragWidget(int x, int y, fe_dnd_Type type);
void destroyDragWidget();
#endif /* USE_MOTIF_DND */
#if defined(USE_MOTIF_DND)
/* the pointer to the outlinable. */
void *m_dragsource;
FEGetDragTargetFunc m_dragTargetFunc;
FEGetDropTargetFunc m_dropTargetFunc;
FEGetDragIconDataFunc m_dragIconDataFunc;
FEConvertDragDataFunc m_dragConvFunc;
FEProcessTargetsFunc m_processTargetsFunc;
#endif /* USE_MOTIF_DND */
// XXX
XP_Bool m_dragrowbox;
void* m_dragscrolltimer;
int m_dragscrolldir;
int m_dragrow;
#if !defined(USE_MOTIF_DND)
int m_dragcolumn;
#endif /* USE_MOTIF_DND */
GC m_draggc;
EventMask m_activity;
/* the column that displays the sort indicator. */
int m_sortColumn;
/* the direction of the sort. */
EOutlinerSortDirection m_sortDirection;
/* the column that displays the pipes. */
int m_pipeColumn;
/* the column that resizes when the outliner resizes wider */
int m_resizeColumn;
/* used by the listChange{Starting,Finished} machinery to restore
the selection at the proper time. */
int m_listChangeDepth;
const char *styleToTag(EOutlinerTextStyle style);
static fe_icon closedParentIcon;
static fe_icon openParentIcon;
static fe_icon showColumnIcon;
static fe_icon showColumnInsensIcon;
static fe_icon hideColumnIcon;
static fe_icon hideColumnInsensIcon;
void setColumnResizableByIndex(int column_index, XP_Bool resizable);
XP_Bool getColumnResizableByIndex(int column_index);
void setColumnWidthByIndex(int column_index, int width);
int getColumnWidthByIndex(int column_index);
void rememberGeometry();
int getNumVisible(int default_visible);
void drawDottedLine(GC gc, XRectangle *clipRect, int x1, int y1, int x2, int y2);
void PixmapDraw(Pixmap pixmap, Pixmap mask,
int pixmapWidth, int pixmapHeight, unsigned char alignment, GC gc,
XRectangle *rect, XRectangle *clipRect, Pixel bg_color);
EOutlinerPipeType getPipeType(XP_Bool expandable,
XP_Bool expanded,
int depth,
OutlinerAncestorInfo *ancestorInfo);
void pipeDraw(XmLGridCallbackStruct *call);
void headerCellDraw(XmLGridCallbackStruct *call);
void contentCellDraw(XmLGridCallbackStruct *call);
void celldraw(XtPointer callData);
void resize(XtPointer callData);
void sendClick(XEvent *event, Boolean only_if_not_selected);
void buttonEvent(XEvent *event, Boolean *c);
static void celldrawCallback(Widget, XtPointer, XtPointer);
static void resizeCallback(Widget, XtPointer, XtPointer);
static void buttonEventHandler(Widget, XtPointer, XEvent *, Boolean *);
/* tooltips
*/
int m_lastRow;
int m_lastCol;
XP_Bool m_inGrid;
XP_Bool m_isFocus;
char *m_tip_msg_buf;
char *m_doc_msg_buf;
static void tip_cb(Widget, XtPointer, XtPointer cb_data);
virtual void tipCB(Widget, XtPointer cb_data);
};
#endif /* _xfe_outliner_h */