460 lines
12 KiB
C
460 lines
12 KiB
C
|
#ifndef _LISTWND_H
|
||
|
#define _LISTWND_H
|
||
|
|
||
|
#include <api/wnd/wndclass/scbkgwnd.h>
|
||
|
#include <bfc/common.h>
|
||
|
|
||
|
#include <bfc/freelist.h>
|
||
|
#include "SelItemList.h"
|
||
|
#define POS_LAST -1
|
||
|
|
||
|
#define LISTWND_PARENT ScrlBkgWnd
|
||
|
|
||
|
#define LW_HT_DONTKNOW (-1)
|
||
|
#define LW_HT_ABOVE (-10)
|
||
|
#define LW_HT_BELOW (-20)
|
||
|
|
||
|
#define COL_LEFTALIGN 0
|
||
|
#define COL_CENTERALIGN 1
|
||
|
#define COL_RIGHTALIGN 2
|
||
|
|
||
|
class listItem;
|
||
|
class ListWnd;
|
||
|
class CompareListItem;
|
||
|
|
||
|
class ListColumn : public NamedW
|
||
|
{
|
||
|
friend class ListWnd;
|
||
|
public:
|
||
|
ListColumn(const wchar_t *name=NULL, int isdynamic=FALSE);
|
||
|
virtual ~ListColumn() { }
|
||
|
|
||
|
int getWidth();
|
||
|
void setWidth(int newwidth);
|
||
|
const wchar_t *getLabel();
|
||
|
void setLabel(const wchar_t *newlabel);
|
||
|
virtual int customDrawHeader(Canvas *c, RECT *cr, const Wasabi::FontInfo *fontInfo);
|
||
|
virtual int onHeaderClick() { return 0; }//return 1 if you override
|
||
|
virtual int onColumnLeftClick(int pos) { return 0; }//return 1 if you override
|
||
|
int getNumeric() { return numeric; }
|
||
|
void setDynamic(int isdynamic);
|
||
|
int isDynamic() { return dynamic; }
|
||
|
void setAlignment(int _align) { align = _align; }
|
||
|
int getAlignment() { return align; }
|
||
|
|
||
|
protected:
|
||
|
void setIndex(int i);
|
||
|
int getIndex();
|
||
|
void setList(ListWnd *list);
|
||
|
ListWnd *getList();
|
||
|
|
||
|
void setNumeric(int n) { numeric=n; }
|
||
|
|
||
|
private:
|
||
|
int width;
|
||
|
int index;
|
||
|
int numeric;
|
||
|
int dynamic;
|
||
|
ListWnd *list;
|
||
|
int align;
|
||
|
};
|
||
|
|
||
|
//class SelItemList;
|
||
|
|
||
|
|
||
|
|
||
|
class ListWnd : public ScrlBkgWnd
|
||
|
{
|
||
|
friend class ListColumn;
|
||
|
friend class SelItemList;
|
||
|
public:
|
||
|
ListWnd();
|
||
|
|
||
|
virtual ~ListWnd();
|
||
|
virtual int onInit();
|
||
|
virtual int onPostOnInit();
|
||
|
virtual int onPaint(Canvas *canvas);
|
||
|
virtual int onResize();
|
||
|
virtual int onLeftButtonDown(int x, int y);
|
||
|
virtual int onLeftButtonUp(int x, int y);
|
||
|
virtual int onRightButtonDown(int x, int y);
|
||
|
virtual int onRightButtonUp(int x, int y);
|
||
|
virtual int onMouseMove(int x, int y);
|
||
|
virtual int onLeftButtonDblClk(int x, int y);
|
||
|
virtual int onChar(unsigned int c);
|
||
|
virtual int onKeyDown(int keyCode);
|
||
|
virtual int onContextMenu (int x, int y);
|
||
|
virtual int wantAutoContextMenu();
|
||
|
virtual int onMouseWheelUp(int click, int lines);
|
||
|
virtual int onMouseWheelDown(int click, int lines);
|
||
|
virtual int wantAutoDeselect() { return wantautodeselect; }
|
||
|
virtual void setWantAutoDeselect(int want) { wantautodeselect = want; }
|
||
|
|
||
|
void onSetVisible(int show);
|
||
|
|
||
|
void setAutoSort(bool dosort);
|
||
|
void setOwnerDraw(bool doownerdraw);
|
||
|
|
||
|
virtual void timerCallback(int id);
|
||
|
|
||
|
void next(int wantcb=1);
|
||
|
void selectCurrent();
|
||
|
void selectFirstEntry(int wantcb=1);
|
||
|
void previous(int wantcb=1);
|
||
|
void pagedown(int wantcb=1);
|
||
|
void pageup(int wantcb=1);
|
||
|
void home(int wantcb=1);
|
||
|
void end(int wantcb=1);
|
||
|
void setItemCount(int c);
|
||
|
void reset();
|
||
|
void setShowColumnsHeaders(int show);
|
||
|
int addColumn(const wchar_t *name, int width, int numeric=0, int align=COL_LEFTALIGN); // adds to end
|
||
|
ListColumn *getColumn(int n);
|
||
|
int getNumColumns();
|
||
|
int getColumnWidth(int col);
|
||
|
bool setRedraw(bool redraw); // returns prev state
|
||
|
bool getRedraw();
|
||
|
void setMinimumSize(int size);
|
||
|
virtual int addItem(const wchar_t *label, LPARAM lParam);
|
||
|
virtual int insertItem(int pos, const wchar_t *label, LPARAM lParam);
|
||
|
virtual int getLastAddedItemPos();
|
||
|
virtual void setSubItem(int pos, int subpos, const wchar_t *txt);
|
||
|
virtual void deleteAllItems();
|
||
|
virtual int deleteByPos(int pos);
|
||
|
int getNumItems(void);
|
||
|
|
||
|
virtual int getItemLabel(int pos, int subpos, wchar_t *text, int textmax);
|
||
|
virtual void setItemLabel(int pos, const wchar_t *text);
|
||
|
virtual LPARAM getItemData(int pos);
|
||
|
virtual int getItemRect(int pos, RECT *r);
|
||
|
virtual int getItemSelected(int pos); // returns 1 if selected
|
||
|
virtual int getItemFocused(int pos); // returns 1 if focused
|
||
|
virtual int getItemFocused(); // returns focused item
|
||
|
void setItemFocused(int pos, int ensure_visible=TRUE);
|
||
|
void ensureItemVisible(int pos);
|
||
|
void invalidateColumns();
|
||
|
virtual int scrollAbsolute(int x);
|
||
|
virtual int scrollRelative(int x);
|
||
|
virtual void scrollLeft(int lines=1);
|
||
|
virtual void scrollRight(int lines=1);
|
||
|
virtual void scrollUp(int lines=1);
|
||
|
virtual void scrollDown(int lines=1);
|
||
|
virtual const wchar_t *getSubitemText(int pos, int subpos);
|
||
|
|
||
|
|
||
|
int getFirstItemSelected();
|
||
|
|
||
|
|
||
|
int getNextItemSelected(int lastpos); // next item AFTER given pos
|
||
|
|
||
|
|
||
|
virtual int selectAll(int cb=1); // force all items selected
|
||
|
|
||
|
virtual int deselectAll(int cb=1); // force all items to be deselected
|
||
|
|
||
|
virtual int invertSelection(int cb=1); // invert all selections
|
||
|
|
||
|
virtual int hitTest(POINT pos, int drag=0);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
virtual int hitTest(int x, int y, int drag=0);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
virtual int invalidateItem(int pos);
|
||
|
virtual int locateData(LPARAM data);
|
||
|
|
||
|
// -1 if we've never been drawn yet
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
int getFirstItemVisible() const { return firstItemVisible; }
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
int getLastItemVisible() const { return lastItemVisible; }
|
||
|
|
||
|
virtual int setFontSize(int size);
|
||
|
|
||
|
virtual int getFontSize();
|
||
|
virtual void jumpToNext(wchar_t c);
|
||
|
int wantFocus() { return 1; }
|
||
|
void scrollToItem(int pos);
|
||
|
virtual void resort();
|
||
|
int getSortDirection();
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
int getSortColumn();
|
||
|
|
||
|
void setSortColumn(int col);
|
||
|
|
||
|
void setSortDirection(int dir);
|
||
|
|
||
|
int findItemByParam(LPARAM param);
|
||
|
|
||
|
void setItemParam(int pos, LPARAM param);
|
||
|
|
||
|
int getItemCount() { return getNumItems(); }
|
||
|
|
||
|
void setSelectionStart(int pos, int wantcb=1);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
virtual void setSelectionEnd(int pos);
|
||
|
|
||
|
void setSelected(int pos, int selected, int cb=1);
|
||
|
void toggleSelection(int pos, int setfocus=TRUE, int cb=1);
|
||
|
virtual int getHeaderHeight();
|
||
|
|
||
|
// this sort function just provides string/numeric comparison
|
||
|
// if you need more types, just override and provide your own
|
||
|
|
||
|
virtual int sortCompareItem(listItem *p1, listItem *p2);
|
||
|
|
||
|
int getPreventMultipleSelection() { return preventMultipleSelection; }
|
||
|
int setPreventMultipleSelection(int val) { return preventMultipleSelection = val; }
|
||
|
void moveItem(int from, int to);
|
||
|
virtual int onAcceleratorEvent(const wchar_t *name);
|
||
|
|
||
|
// override this to turn the LPARAM into a text
|
||
|
virtual const wchar_t *convertlParam(LPARAM lParam) { return NULL; }
|
||
|
virtual void convertlParamColumn(int col, int pos, LPARAM param, wchar_t *str, int maxlen) { };
|
||
|
|
||
|
protected:
|
||
|
/*static */void CreateXMLParameters(int master_handle);
|
||
|
|
||
|
// return 1 if you override this
|
||
|
|
||
|
virtual int ownerDraw(Canvas *canvas, int pos, RECT *r, LPARAM lParam, int selected, int focused) { return 0; };
|
||
|
virtual void onPreItemDraw(Canvas *canvas, int pos, RECT *r, LPARAM lParam, int selected, int focused) { }
|
||
|
virtual void onPostItemDraw(Canvas *canvas, int pos, RECT *r, LPARAM lParam, int selected, int focused) { };
|
||
|
virtual ARGB32 getTextColor(LPARAM lParam);
|
||
|
int getTextAntialias(LPARAM lParam) { return antialias; }
|
||
|
virtual int getTextBold(LPARAM lParam) { return 0; }
|
||
|
virtual int getTextItalic(LPARAM lParam) { return 0; }
|
||
|
virtual ARGB32 getSelBgColor(LPARAM lParam);
|
||
|
virtual ARGB32 getSelFgColor(LPARAM lParam);
|
||
|
virtual ARGB32 getBgColor();
|
||
|
virtual ARGB32 getFocusColor(LPARAM lParam);
|
||
|
virtual ARGB32 getFocusRectColor(LPARAM lParam);
|
||
|
virtual int needFocusRect(LPARAM lParam) { return 0; }
|
||
|
virtual ARGB32 getColumnSepColor();
|
||
|
virtual int wantColSepOnItems();
|
||
|
virtual int getXShift();
|
||
|
|
||
|
public:
|
||
|
int insertColumn(ListColumn *col, int pos=-1, int alignment=COL_LEFTALIGN);// -1 is add to end
|
||
|
// void deleteColumn(int pos);
|
||
|
void deleteAllColumns();
|
||
|
|
||
|
void setHoverSelect(int a) { hoverselect = a; }
|
||
|
int getHoverSelect() { return hoverselect; }
|
||
|
|
||
|
void setSelectOnUpDown(int i) { selectonupdown = i; }
|
||
|
int getSelectOnUpDown() { return selectonupdown; }
|
||
|
virtual int onAction(const wchar_t *action, const wchar_t *param=NULL, int x=-1, int y=-1, intptr_t p1=0, intptr_t p2=0, void *data=NULL, size_t datalen=0, ifc_window *source=NULL);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
Will only work with simple text lists, be forwarned!!!
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
*/
|
||
|
int getItemHeight();
|
||
|
void setItemHeight(int height, bool forceInvalidate = true);
|
||
|
|
||
|
int getIconWidth();
|
||
|
void setIconWidth(int width);
|
||
|
int getIconHeight();
|
||
|
void setIconHeight(int height);
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual int getColumnsHeight();
|
||
|
virtual int getColumnsWidth();
|
||
|
virtual int getContentsWidth();
|
||
|
virtual int getContentsHeight();
|
||
|
|
||
|
virtual void drawBackground(Canvas *canvas);
|
||
|
|
||
|
void drawColumnHeaders(Canvas *c);
|
||
|
|
||
|
void drawItems(Canvas *canvas);
|
||
|
|
||
|
void updateScrollX();
|
||
|
|
||
|
void updateScrollY();
|
||
|
int doJumpToNext(wchar_t c, bool fromTop);
|
||
|
int fullyVisible(int pos);
|
||
|
|
||
|
virtual int onBeginDrag(int iItem);
|
||
|
|
||
|
|
||
|
virtual int dragOver(int x, int y, ifc_window *sourceWnd);
|
||
|
virtual void onSelectAll(); // hit Control-A
|
||
|
|
||
|
virtual void onDelete(); // hit 'delete'
|
||
|
|
||
|
virtual void onItemDelete(LPARAM lparam) {}
|
||
|
|
||
|
virtual void onDoubleClick(int itemnum); // double-click on an item
|
||
|
// this is called with the selected item#
|
||
|
|
||
|
virtual void onLeftClick(int itemnum); // left-click
|
||
|
// the second time you click on an already-focused item
|
||
|
|
||
|
virtual void onSecondLeftClick(int itemnum);
|
||
|
// this is called once for the item under cursor on click
|
||
|
|
||
|
virtual int onRightClick(int itemnum); // right-click on item
|
||
|
|
||
|
virtual int onIconLeftClick(int itemnum, int x, int y); // Returns 1 if we should not invoke onLeftClick()
|
||
|
|
||
|
// override this to be notified of item selections & deselections
|
||
|
|
||
|
virtual void onItemSelection(int itemnum, int selected);
|
||
|
|
||
|
virtual int onColumnDblClick(int col, int x, int y) { return 0; }
|
||
|
|
||
|
virtual int onColumnLabelClick(int col, int x, int y);
|
||
|
|
||
|
void selectRect(int x1, int y1, int x2, int y2);
|
||
|
|
||
|
void drawRect(int x1, int y1, int x2, int y2);
|
||
|
|
||
|
// interface to Freelist
|
||
|
|
||
|
listItem *createListItem();
|
||
|
void deleteListItem(listItem *item);
|
||
|
ListColumn *enumListColumn(int pos);
|
||
|
|
||
|
int getColumnPosByName(const wchar_t *name);
|
||
|
|
||
|
int delColumnByPos(int pos);
|
||
|
public: // Martin> dunno why these were protected...
|
||
|
void setShowIcons(int icons);
|
||
|
int getShowIcons(); // Maybe useful or not
|
||
|
SkinBitmap *getItemIcon(int item);
|
||
|
void setItemIcon(int pos, const wchar_t *bitmapid);
|
||
|
|
||
|
protected:
|
||
|
int item_invalidate_border;
|
||
|
bool showColumnsHeaders;
|
||
|
void recalcHeaders();
|
||
|
void itemSelection(int itemnum, int selected);
|
||
|
|
||
|
private:
|
||
|
int doAddItem(const wchar_t *label, LPARAM lParam, int pos);
|
||
|
|
||
|
|
||
|
int hitTestColumns(POINT p, int *origin=NULL);
|
||
|
int hitTestColumnClient(int x);
|
||
|
int hitTestColumnsLabel(POINT p);
|
||
|
void drawXorLine(int x);
|
||
|
void calcNewColWidth(int col, int x);
|
||
|
void calcBounds();
|
||
|
void onDragTimer();
|
||
|
void notifySelChanged(int item=-1, int sel=-1);
|
||
|
virtual int wantResizeCols() { return 1; }
|
||
|
|
||
|
int autosort, ownerdraw;
|
||
|
int textsize;
|
||
|
int itemHeight;
|
||
|
int iconWidth; // If it's still negative use itemHeight instead -- better user getIconWidth()
|
||
|
int iconHeight;
|
||
|
bool metrics_ok;
|
||
|
bool redraw;
|
||
|
int columnsHeight;
|
||
|
int dragtimeron;
|
||
|
|
||
|
int antialias;
|
||
|
|
||
|
PtrList<ListColumn> columnsList;
|
||
|
PtrListQuickSorted<listItem,CompareListItem> itemList;
|
||
|
|
||
|
int firstItemVisible;
|
||
|
int lastItemVisible;
|
||
|
|
||
|
listItem *lastItemFocused;
|
||
|
int lastItemFocusedPos;
|
||
|
|
||
|
listItem *lastAddedItem;
|
||
|
SelItemList selItemList;
|
||
|
|
||
|
int dragskip;
|
||
|
int dragskipcount;
|
||
|
int selectionStart;
|
||
|
int colresize;
|
||
|
POINT colresizept;
|
||
|
bool resizing_col;
|
||
|
int colresizeo;
|
||
|
|
||
|
bool processbup;
|
||
|
bool bdown;
|
||
|
bool nodrag;
|
||
|
int bdownx, bdowny;
|
||
|
bool firstComplete, lastComplete;
|
||
|
|
||
|
int rectselecting;
|
||
|
POINT selectStart;
|
||
|
POINT selectLast;
|
||
|
|
||
|
int sortdir, sortcol, lastcolsort;
|
||
|
|
||
|
int preventMultipleSelection;
|
||
|
|
||
|
Freelist<listItem> listItem_freelist;
|
||
|
int wantautodeselect;
|
||
|
|
||
|
int hoverselect;
|
||
|
int selectonupdown;
|
||
|
PtrList<ifc_window> tempselectnotifies;
|
||
|
StringW accessibleItemName;
|
||
|
int showicons;
|
||
|
|
||
|
private:
|
||
|
/* XML Parameters */
|
||
|
static XMLParamPair params[];
|
||
|
int xuihandle;
|
||
|
bool hasUserBg;
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
LIST_ANTIALIAS = 0,
|
||
|
LIST_BACKGROUND,
|
||
|
LIST_TILE,
|
||
|
LIST_NOCOLHEADER,
|
||
|
};
|
||
|
protected:
|
||
|
int setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value);
|
||
|
};
|
||
|
|
||
|
#endif
|