summaryrefslogtreecommitdiffstats
path: root/krusader/Panel/krview.h
blob: 97f09def730ab6636fb84c81927013da8cd6d8f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/***************************************************************************
                                krview.h
                             -------------------
    copyright            : (C) 2000-2002 by Shie Erlich & Rafi Yanai
    e-mail               : krusader@users.sourceforge.net
    web site             : http://krusader.sourceforge.net
 ---------------------------------------------------------------------------
  Description
 ***************************************************************************

  A

     db   dD d8888b. db    db .d8888.  .d8b.  d8888b. d88888b d8888b.
     88 ,8P' 88  `8D 88    88 88'  YP d8' `8b 88  `8D 88'     88  `8D
     88,8P   88oobY' 88    88 `8bo.   88ooo88 88   88 88ooooo 88oobY'
     88`8b   88`8b   88    88   `Y8b. 88~~~88 88   88 88~~~~~ 88`8b
     88 `88. 88 `88. 88b  d88 db   8D 88   88 88  .8D 88.     88 `88.
     YP   YD 88   YD ~Y8888P' `8888Y' YP   YP Y8888D' Y88888P 88   YD

                                                     H e a d e r    F i l e

 ***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#ifndef KRVIEW_H
#define KRVIEW_H

#include <tqpixmap.h>
#include <tqvariant.h>
#include <tqdict.h>
#include "../krusader.h"
#include "../VFS/vfile.h"
#include "../VFS/vfs.h"
#include "../VFS/krquery.h"

#include <kdebug.h>

class KrView;
class KrViewItem;
typedef TQValueList<KrViewItem*> KrViewItemList;

// KrViewProperties
// This class is an interface class between KrView and KrViewItem
// In order for KrViewItem to be as independant as possible, KrView holds 
// an instance of this class, and fills it with the correct data. A reference
// to this should be given to each KrViewItem, which then queries it for 
// information regarding how things should be displayed in the current view.
//
// Every property that the item needs to know about the view must be here!
class KrViewProperties {
public:
	enum SortSpec { Name=0x1, Ext=0x2, Size=0x4, Type=0x8, Modified=0x10, Permissions=0x20,
						KrPermissions=0x40, Owner=0x80, Group=0x100, Descending=0x200,
						DirsFirst=0x400, IgnoreCase=0x800, AlwaysSortDirsByName=0x1000 };
	enum FilterSpec { Dirs=0x1, Files=0x2, All=0x3, Custom=0x4, ApplyToDirs=0x8 };
	
	bool displayIcons;	// true if icons should be displayed in this view
	SortSpec sortMode;	// sort specifications
	FilterSpec filter;	// what items to show (all, custom, exec)
	KRQuery filterMask;	// what items to show (*.cpp, *.h etc)
	bool localeAwareCompareIsCaseSensitive; // mostly, it is not! depends on LC_COLLATE
	bool humanReadableSize;		// display size as KB, MB or just as a long number
	TQStringList atomicExtensions;	// list of strings, which will be treated as one extension. Must start with a dot.
};

// operator can handle two ways of doing things:
// 1. if the view is a widget (inherits krview and tdelistview for example)
// 2. if the view HAS A widget (a krview-son has a member of tdelistview)
// this is done by specifying the view and the widget in the constructor,
// even if they are actually the same object (specify it twice in that case)
class KrViewOperator: public TQObject {
	Q_OBJECT
  
public:
	KrViewOperator(KrView *view, TQWidget *widget);
	~KrViewOperator();
	KrView *view() const { return _view; }
	TQWidget *widget() const { return _widget; }
	void startDrag();
	
	void emitSelectionChanged() { emit selectionChanged(); }
	void emitGotDrop(TQDropEvent *e) { emit gotDrop(e); }
	void emitLetsDrag(TQStringList items, TQPixmap icon ) { emit letsDrag(items, icon); }
	void emitItemDescription(TQString &desc) { emit itemDescription(desc); }
	void emitContextMenu(const TQPoint &point) { emit contextMenu(point); }
	void emitEmptyContextMenu(const TQPoint &point) { emit emptyContextMenu(point); }
   void emitRenameItem(const TQString &oldName, const TQString &newName) { emit renameItem(oldName, newName); }
   void emitExecuted( TQString &name ) { emit executed(name); }
   void emitNeedFocus() { emit needFocus(); }
	
signals:
	void selectionChanged();
	void gotDrop( TQDropEvent *e );
	void letsDrag( TQStringList items, TQPixmap icon );
	void itemDescription( TQString &desc );
   void contextMenu( const TQPoint &point );
   void emptyContextMenu( const TQPoint& point );
   void renameItem( const TQString &oldName, const TQString &newName );
   void executed( TQString &name );
   void needFocus();

	
protected:
	// never delete those
	KrView *_view;
	TQWidget *_widget;
};

/****************************************************************************
 * READ THIS FIRST: Using the view
 *
 * You always hold a pointer to KrView, thus you can only use functions declared
 * in this class. If you need something else, either this class is missing something
 * or you are ;-) Using a true name (like dynamic_cast<KrDetailedViewItem*>) should be
 * needed only when doing new(), or connect() - see example in listpanel.cpp
 *
 * The functions you'd usually want:
 * 1) getSelectedItems - returns all selected items, or (if none) the current item.
 *    it never returns anything which includes the "..", and thus can return an empty list!
 * 2) getSelectedKrViewItems - the same as (1), but returns a TQValueList with KrViewItems
 * 3) getCurrentItem, setCurrentItem - work with TQString
 * 4) getFirst, getNext, getPrev, getCurrentKrViewItem - all work with KrViewItems, and
 *    used to iterate through a list of items. note that getNext and getPrev accept a pointer
 *    to the current item (used in detailedview for safe iterating), thus your loop should be:
 *       for (KrViewItem *it = view->getFirst(); it!=0; it = view->getNext(it)) { blah; }
 * 5) nameToMakeCurrent(), setNameToMakeCurrent() - work with TQString
 *
 * IMPORTANT NOTE: every one who subclasses this must call initProperties() in the constructor !!!
 */ 
class KrView {
friend class KrViewItem;
friend class KrBriefViewItem;
friend class KrDetailedViewItem;
public:
  // instantiating a new view
  // 1. new KrView
  // 2. view->init()
  // notes: constructor does as little as possible, setup() does the rest. esp, note that
  // if you need something from operator or properties, move it into setup()
  virtual void init();

protected:
  virtual void initProperties() { tqFatal("Please implement your own initProperties() method"); }
  virtual void initOperator() { tqFatal("Please implement your own initOperator() method"); }
  virtual void setup() { tqFatal("Please implement your own setup() method"); }
  
  ///////////////////////////////////////////////////////
  // Every view must implement the following functions //
  ///////////////////////////////////////////////////////
public:
  virtual KrViewItem *getFirst() = 0;
  virtual KrViewItem *getLast() = 0;
  virtual KrViewItem *getNext(KrViewItem *current) = 0;
  virtual KrViewItem *getPrev(KrViewItem *current) = 0;
  virtual KrViewItem *getCurrentKrViewItem() = 0;
  virtual KrViewItem *getKrViewItemAt(const TQPoint &vp) = 0;
  virtual KrViewItem *findItemByName(const TQString &name) = 0;
  virtual void addItems(vfs* v, bool addUpDir = true) = 0; // kill me, kill me now
  virtual TQString getCurrentItem() const = 0;
  virtual void setCurrentItem(const TQString& name) = 0;
  virtual void makeItemVisible(const KrViewItem *item) = 0;
  virtual void clear();
  virtual void updateView() = 0;
  virtual void updateItem(KrViewItem* item) = 0;
  virtual void sort() = 0;
  virtual void saveSettings() = 0;
  virtual void restoreSettings() = 0;
  virtual void prepareForActive() { _focused = true; }
  virtual void prepareForPassive() { _focused = false; }
  virtual void renameCurrentItem(); // Rename current item. returns immediatly
  virtual TQString nameInTDEConfig() const { return _nameInTDEConfig; }

protected:
	virtual KrViewItem *preAddItem(vfile *vf) = 0;
	virtual bool preDelItem(KrViewItem *item) = 0;

public:
  //////////////////////////////////////////////////////
  // the following functions are already implemented, //
  // and normally - should NOT be re-implemented.     //
  //////////////////////////////////////////////////////
  virtual KrViewItem *addItem(vfile *vf);
  virtual void updateItem(vfile *vf);
  virtual void delItem(const TQString &name);
  virtual uint numSelected() const { return _numSelected; }
  virtual TDEIO::filesize_t selectedSize() const { return _selectedSize; }
  virtual uint numFiles() const { return _count-_numDirs; }
  virtual uint numDirs() const { return _numDirs; }
  virtual uint count() const { return _count; }
  virtual TDEIO::filesize_t countSize() const { return _countSize; }
  virtual void getSelectedItems(TQStringList* names);
  virtual void getItemsByMask(TQString mask, TQStringList* names, bool dirs = true, bool files = true);
  virtual void getSelectedKrViewItems(KrViewItemList *items);
  virtual void selectAllIncludingDirs() { changeSelection( KRQuery( "*" ), true, true); }
  virtual void select( const KRQuery& filter = KRQuery( "*" ) ) { changeSelection(filter, true); }
  virtual void unselect(const KRQuery& filter = KRQuery( "*" ) ) { changeSelection(filter, false); }
  virtual void invertSelection();
  virtual TQString nameToMakeCurrent() const { return _nameToMakeCurrent; }
  virtual void setNameToMakeCurrent(const TQString name) { _nameToMakeCurrent = name; }
  virtual TQString nameToMakeCurrentIfAdded() const { return _nameToMakeCurrentIfAdded; }
  virtual void setNameToMakeCurrentIfAdded(const TQString name) { _nameToMakeCurrentIfAdded = name; }  
  virtual TQString firstUnmarkedBelowCurrent();
  virtual TQString statistics();
  virtual const KrViewProperties* properties() const { return _properties; }
  virtual KrViewOperator* op() const { return _operator; }

  /////////////////////////////////////////////////////////////
  // the following functions have a default and minimalistic //
  // implementation, and may be re-implemented if needed     //
  /////////////////////////////////////////////////////////////
  virtual void setSortMode(KrViewProperties::SortSpec mode) { _properties->sortMode = mode; }
  virtual KrViewProperties::SortSpec sortMode() const { return _properties->sortMode; }
  virtual void setFilter(KrViewProperties::FilterSpec filter) { _properties->filter = filter; }
  virtual KrViewProperties::FilterSpec filter() const { return _properties->filter; }
  virtual void setFilterMask( KRQuery mask ) { _properties->filterMask = mask; }
  virtual const KRQuery& filterMask() const { return _properties->filterMask; }
  inline TQWidget *widget() { return _widget; }
  inline void setWidget(TQWidget *w) { _widget = w; }

  // todo: what about selection modes ???
  virtual ~KrView();
protected:
  KrView(TDEConfig *cfg = krConfig);
  static TQPixmap getIcon(vfile *vf);
  void changeSelection(const KRQuery& filter, bool select, bool includeDirs = false);


protected:
  TDEConfig *_config;
  TQWidget *_widget;
  TQString _nameToMakeCurrent;
  TQString _nameToMakeCurrentIfAdded;
  uint _numSelected, _count, _numDirs;
  TDEIO::filesize_t _countSize, _selectedSize;
  bool _left;
  KrViewProperties *_properties;
  KrViewOperator *_operator;
  TQDict<KrViewItem> _dict;
  bool _focused;
  TQString _nameInTDEConfig;
};

#endif /* KRVIEW_H */