mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-20 20:05:53 +01:00
427 lines
6.8 KiB
C
427 lines
6.8 KiB
C
|
//PORTABLE
|
||
|
#ifndef _ITEMLIST_H
|
||
|
#define _ITEMLIST_H
|
||
|
|
||
|
#include "listwnd.h"
|
||
|
#include "../canvas.h"
|
||
|
#include "../named.h"
|
||
|
#include "../ptrlist.h"
|
||
|
#include "../string.h"
|
||
|
#include "../../studio/metacb.h"
|
||
|
|
||
|
class FilenameNC;
|
||
|
class DragItemI;
|
||
|
class ContextMenu;
|
||
|
|
||
|
// this class just handles rendering the various properties of playitems
|
||
|
// in a listwnd... the rest is up to you, just override the convert fn
|
||
|
|
||
|
// abstract base class to render something in a column for a playstring
|
||
|
|
||
|
/**
|
||
|
Class
|
||
|
|
||
|
@short
|
||
|
@author Nullsoft
|
||
|
@ver 1.0
|
||
|
@see
|
||
|
*/
|
||
|
class NOVTABLE ItemListColumn : public ListColumn {
|
||
|
protected:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
ItemListColumn(const wchar_t *name=NULL) : ListColumn(name) {}
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual ~ItemListColumn() {}
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void render(int pos, const wchar_t *playstring, Canvas &c, RECT &r)=0;
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
|
||
|
virtual void columnToText(int pos, const wchar_t *playstring, wchar_t *str, int maxlen)=0;
|
||
|
};
|
||
|
|
||
|
#define ITEMLISTWND_PARENT ListWnd
|
||
|
|
||
|
/**
|
||
|
Class
|
||
|
|
||
|
@short
|
||
|
@author Nullsoft
|
||
|
@ver 1.0
|
||
|
@see
|
||
|
*/
|
||
|
class ItemListWnd : public ListWnd, private MetaCallbackI {
|
||
|
friend class ItemListColumn_Callback;
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
ItemListWnd();
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual ~ItemListWnd();
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int onInit();
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
int insertColumn(ItemListColumn *column, int width, int pos=-1);
|
||
|
|
||
|
protected:
|
||
|
// override and return 0 to suppress auto-dragging from window
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int wantAutoDrag() { return 1; }
|
||
|
// handles auto-adding all selected rows and calls addDragTypes
|
||
|
// so you can add more via addDragItem()
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int onBeginDrag(int);
|
||
|
// if you return 0, the Filename version will be auto-added, otherwise not
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int addMoreDragTypes(int pos) { return 0; }
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int dragComplete(int success);
|
||
|
|
||
|
// tell ListWnd we do our own drawing
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int ownerDraw(Canvas *canvas, int pos, RECT *r, LPARAM lParam, int isselected, int isfocused);
|
||
|
|
||
|
// ItemListColumn_Callback calls this to do its rendering, lParam is what you
|
||
|
// gave it to pass back to you
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void userRender(int pos, const wchar_t *playstring, Canvas &c, RECT &r, LPARAM lParam) {}
|
||
|
|
||
|
// ItemListColumn_Callback calls this to get the column text, lParam is what you
|
||
|
// gave it to pass back to you
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void userColumnToText(int pos, const wchar_t *playstring, LPARAM lParam, wchar_t *str, int maxlen) {}
|
||
|
|
||
|
// override this to turn the ownerdraw into a playstring
|
||
|
virtual const wchar_t *convertlParam(LPARAM lParam)=0;
|
||
|
virtual void convertlParamColumn(int col, int pos, LPARAM lParam, wchar_t *str, int maxlen);
|
||
|
|
||
|
// override this and return 1 if you want a "current" box around item
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int getSelected(LPARAM lParam) { return 0; }
|
||
|
|
||
|
// virtual int onRightClick(int itemnum, int x, int y);
|
||
|
// automatically generated context menu (uses Filename)
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int onContextMenu(int x, int y);
|
||
|
|
||
|
// return optional DragItemI for context menu (will be deleted for you)
|
||
|
virtual DragItemI *itemlistwnd_getDragItem(int x, int y) { return NULL; }
|
||
|
virtual DragItemI *itemlistwnd_getSecondDragItem(int n) { return NULL; }
|
||
|
virtual void itemlistwnd_addCustomContextMenuCommands(ContextMenu *cm) { }
|
||
|
virtual void itemlistwnd_contextMenuResult(int res) { }
|
||
|
|
||
|
// return TRUE if it's ok to edit in place
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual int allowEdition(const wchar_t *playstring, wchar_t *field) { return 0; }
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void resort() {
|
||
|
//TODO> implement me!
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
// implement this if you want to know when an item's metadata changed
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void onItemChange(int pos, const wchar_t *playstring) { }
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void onItemDel(int pos, const wchar_t *playstring) { }
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void metacb_onItemChange(const wchar_t *playstring, const wchar_t *tag);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void metacb_onItemDel(const wchar_t *);
|
||
|
|
||
|
private:
|
||
|
PtrList<FilenameNC> *keep;
|
||
|
};
|
||
|
|
||
|
// column class to ask ItemListWnd to do the rendering
|
||
|
|
||
|
/**
|
||
|
Class
|
||
|
|
||
|
@short
|
||
|
@author Nullsoft
|
||
|
@ver 1.0
|
||
|
@see
|
||
|
*/
|
||
|
class ItemListColumn_Callback : public ItemListColumn {
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
ItemListColumn_Callback(ItemListWnd *_parent, LPARAM _lparam, const wchar_t *name=NULL);
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void render(int pos, const wchar_t *playstring, Canvas &c, RECT &r);
|
||
|
virtual void columnToText(int pos, const wchar_t *playstring, wchar_t *str, int maxlen);
|
||
|
|
||
|
private:
|
||
|
ItemListWnd *parent;
|
||
|
LPARAM lparam;
|
||
|
};
|
||
|
|
||
|
// column class to render a metatag
|
||
|
|
||
|
/**
|
||
|
Class
|
||
|
|
||
|
@short
|
||
|
@author Nullsoft
|
||
|
@ver 1.0
|
||
|
@see
|
||
|
*/
|
||
|
class ItemListColumn_MetaTag : public ItemListColumn {
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
ItemListColumn_MetaTag(const wchar_t *tag, int center=0, const wchar_t *label=NULL);
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual ~ItemListColumn_MetaTag() {}
|
||
|
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void render(int pos, const wchar_t *playstring, Canvas &c, RECT &r);
|
||
|
virtual void columnToText(int pos, const wchar_t *playstring, wchar_t *str, int maxlen);
|
||
|
|
||
|
const wchar_t *getTag();
|
||
|
|
||
|
private:
|
||
|
StringW tag;
|
||
|
int center;
|
||
|
int datatype;
|
||
|
};
|
||
|
|
||
|
// this just renders the position of the item, starting from 1
|
||
|
|
||
|
/**
|
||
|
Class
|
||
|
|
||
|
@short
|
||
|
@author Nullsoft
|
||
|
@ver 1.0
|
||
|
@see
|
||
|
*/
|
||
|
class ItemListColumn_Numbered : public ItemListColumn {
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
ItemListColumn_Numbered(int _offset=0) : offset(_offset) {}
|
||
|
|
||
|
/**
|
||
|
Method
|
||
|
|
||
|
@see
|
||
|
@ret
|
||
|
@param
|
||
|
*/
|
||
|
virtual void render(int pos, const wchar_t *playstring, Canvas &c, RECT &r);
|
||
|
virtual void columnToText(int pos, const wchar_t *playstring, wchar_t *str, int maxlen);
|
||
|
|
||
|
private:
|
||
|
int offset;
|
||
|
};
|
||
|
|
||
|
#endif
|