You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
basket/src/basket.h

843 lines
27 KiB

/***************************************************************************
* Copyright (C) 2003 by S<EFBFBD>astien Laot *
* slaout@linux62.org *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef BASKET_H
#define BASKET_H
#include <tqscrollview.h>
#include <tqtooltip.h>
#include <tqvaluelist.h>
#include <tqtimer.h>
#include <tqimage.h>
#include <tqdatetime.h>
#include <tqclipboard.h>
#include <tdeshortcut.h>
#include <kdirwatch.h>
#include <tdeaction.h>
#include <tdeio/job.h>
#include <kdialogbase.h>
#include "filter.h"
#include "note.h" // For Note::Zone
#include "config.h"
#define BASKET_USE_DRKONQI
class TQVBoxLayout;
class TQDomDocument;
class TQDomElement;
class Basket;
class Note;
class NoteEditor;
class Tag;
#ifdef HAVE_LIBGPGME
class KGpgMe;
#endif
/** Provide a dialog to avert the user the disk is full.
* This dialog is modal and is shown until the user has made space on the disk.
* @author S<EFBFBD>astien Laot
*/
class DiskErrorDialog : public KDialogBase
{
Q_OBJECT
public:
DiskErrorDialog(const TQString &titleMessage, const TQString &message, TQWidget *parent = 0);
~DiskErrorDialog();
protected:
void closeEvent(TQCloseEvent *event);
void keyPressEvent(TQKeyEvent*);
};
/** A list of flags to set how notes are inserted/plugged in the basket
* Declare a varible with the type PlugOptions::Flags and assign a value like PlugOptions::DoSelection...
* @author S<EFBFBD>astien Laot
*/
namespace PlugOptions
{
enum Flags {
SelectOnlyNewNotes = 0x01, /// << Unselect every notes in the basket and select the newly inserted ones
DoTagsInheriting = 0x02 /// << The new notes inherit the tags of the sibbling note
};
// TODO: FocusLastInsertedNote (last visible!), EnsureVisibleAddedNotes, PopupFeebackBaloon (if not called by hand), AnimateNewPosition, FeedbackUnmatched
// TODO: moveNoteInTree(bool animate);
}
/** This represent a hierarchy of the selected classes.
* If this is null, then there is no selected note.
*/
class NoteSelection
{
public:
NoteSelection() : note(0), parent(0), firstChild(0), next(0), fullPath() {}
NoteSelection(Note *n) : note(n), parent(0), firstChild(0), next(0), fullPath() {}
Note *note;
NoteSelection *parent;
NoteSelection *firstChild;
NoteSelection *next;
TQString fullPath; // Needeed for 'Cut' code to store temporary path of the cutted note.
NoteSelection* firstStacked();
NoteSelection* nextStacked();
void append(NoteSelection *node);
int count();
TQValueList<Note*> parentGroups();
};
/** This store all needed information when exporting to HTML
*/
class HtmlExportData
{
public:
TQString iconsFolderPath;
TQString iconsFolderName;
TQString imagesFolderPath;
TQString imagesFolderName;
TQString dataFolderPath;
TQString dataFolderName;
bool formatForImpression;
bool embedLinkedFiles;
bool embedLinkedFolders;
};
/** This class handle Basket and add a FilterWidget on top of it.
* @author S<EFBFBD>astien Laot
*/
class DecoratedBasket : public TQWidget
{
Q_OBJECT
public:
DecoratedBasket(TQWidget *parent, const TQString &folderName, const char *name = 0, WFlags fl = 0);
~DecoratedBasket();
void setFilterBarPosition(bool onTop);
void resetFilter();
void setFilterBarShown(bool show, bool switchFocus = true);
bool isFilterBarShown() { return m_filter->isShown(); }
const FilterData& filterData() { return m_filter->filterData(); }
FilterBar* filterBar() { return m_filter; }
Basket* basket() { return m_basket; }
private:
TQVBoxLayout *m_layout;
FilterBar *m_filter;
Basket *m_basket;
};
class TransparentWidget : public TQWidget
{
Q_OBJECT
public:
TransparentWidget(Basket *basket);
void setPosition(int x, int y);
//void reparent(TQWidget *parent, WFlags f, const TQPoint &p, bool showIt = FALSE);
protected:
void paintEvent(TQPaintEvent*);
void mouseMoveEvent(TQMouseEvent *event);
bool eventFilter(TQObject *object, TQEvent *event);
private:
Basket *m_basket;
int m_x;
int m_y;
};
/**
* @author S<EFBFBD>astien Laot
*/
class Basket : public TQScrollView, public TQToolTip
{
/// CONSTRUCTOR AND DESTRUCTOR:
Q_OBJECT
public:
enum EncryptionTypes {
NoEncryption = 0,
PasswordEncryption = 1,
PrivateKeyEncryption = 2
};
public:
Basket(TQWidget *parent, const TQString &folderName);
~Basket();
/// USER INTERACTION:
private:
bool m_noActionOnMouseRelease;
bool m_ignoreCloseEditorOnNextMouseRelease;
TQPoint m_pressPos;
bool m_canDrag;
public:
void viewportResizeEvent(TQResizeEvent *);
void drawContents(TQPainter *painter, int clipX, int clipY, int clipWidth, int clipHeight);
void enterEvent(TQEvent *);
void leaveEvent(TQEvent *);
void contentsMouseMoveEvent(TQMouseEvent *event);
void contentsMousePressEvent(TQMouseEvent *event);
void contentsMouseReleaseEvent(TQMouseEvent *event);
void contentsMouseDoubleClickEvent(TQMouseEvent *event);
void contentsContextMenuEvent(TQContextMenuEvent *event);
void updateNote(Note *note);
void clickedToInsert(TQMouseEvent *event, Note *clicked = 0, int zone = 0);
private slots:
void setFocusIfNotInPopupMenu();
/// LAYOUT:
private:
Note *m_firstNote;
int m_columnsCount;
bool m_mindMap;
Note *m_resizingNote;
int m_pickedResizer;
Note *m_movingNote;
TQPoint m_pickedHandle;
public:
int tmpWidth;
int tmpHeight;
public:
void unsetNotesWidth();
void relayoutNotes(bool animate);
Note* noteAt(int x, int y);
inline Note* firstNote() { return m_firstNote; }
inline int columnsCount() { return m_columnsCount; }
inline bool isColumnsLayout() { return m_columnsCount > 0; }
inline bool isFreeLayout() { return m_columnsCount <= 0; }
inline bool isMindMap() { return isFreeLayout() && m_mindMap; }
Note* resizingNote() { return m_resizingNote; }
void deleteNotes();
Note* lastNote();
void setDisposition(int disposition, int columnCount);
void equalizeColumnSizes();
/// NOTES INSERTION AND REMOVAL:
public:
/// The following methods assume that the note(s) to insert already all have 'this' as the parent basket:
void prependNoteIn( Note *note, Note *in); /// << Add @p note (and the next linked notes) as the first note(s) of the group @p in.
void appendNoteIn( Note *note, Note *in); /// << Add @p note (and the next linked notes) as the last note(s) of the group @p in.
void appendNoteAfter( Note *note, Note *after); /// << Add @p note (and the next linked notes) just after (just below) the note @p after.
void appendNoteBefore(Note *note, Note *before); /// << Add @p note (and the next linked notes) just before (just above) the note @p before.
void groupNoteAfter( Note *note, Note *with); /// << Add a group at @p with place, move @p with in it, and add @p note (and the next linked notes) just after the group.
void groupNoteBefore( Note *note, Note *with); /// << Add a group at @p with place, move @p with in it, and add @p note (and the next linked notes) just before the group.
void unplugNote( Note *note); /// << Unplug @p note (and its child notes) from the basket (and also decrease counts...).
/// << After that, you should delete the notes yourself. Do not call prepend/append/group... functions two times: unplug and ok
void ungroupNote( Note *group); /// << Unplug @p group but put child notes at its place.
/// And this one do almost all the above methods depending on the context:
void insertNote(Note *note, Note *clicked, int zone, const TQPoint &pos = TQPoint(), bool animateNewPosition = false);
void insertCreatedNote(Note *note);
/// And working with selections:
void unplugSelection(NoteSelection *selection);
void insertSelection(NoteSelection *selection, Note *after);
void selectSelection(NoteSelection *selection);
private:
void preparePlug(Note *note);
private:
Note *m_clickedToInsert;
int m_zoneToInsert;
TQPoint m_posToInsert;
Note *m_savedClickedToInsert;
int m_savedZoneToInsert;
TQPoint m_savedPosToInsert;
bool m_isInsertPopupMenu;
public:
void saveInsertionData();
void restoreInsertionData();
void resetInsertionData();
public slots:
void insertEmptyNote(int type);
void insertWizard(int type);
void insertColor(const TQColor &color);
void insertImage(const TQPixmap &image);
void pasteNote(TQClipboard::Mode mode = TQClipboard::Clipboard);
void delayedCancelInsertPopupMenu();
void setInsertPopupMenu() { m_isInsertPopupMenu = true; }
void cancelInsertPopupMenu() { m_isInsertPopupMenu = false; }
private slots:
void hideInsertPopupMenu();
void timeoutHideInsertPopupMenu();
/// TOOL TIPS:
protected:
void maybeTip(const TQPoint &pos);
/// ANIMATIONS:
private:
TQValueList<Note*> m_animatedNotes;
TQTimer m_animationTimer;
int m_deltaY;
TQTime m_lastFrameTime;
static const int FRAME_DELAY;
private slots:
void animateObjects();
public slots:
void animateLoad();
public:
void addAnimatedNote(Note *note);
/// LOAD AND SAVE:
private:
bool m_loaded;
bool m_loadingLaunched;
bool m_locked;
bool m_shouldConvertPlainTextNotes;
TQFrame* m_decryptBox;
TQPushButton* m_button;
int m_encryptionType;
TQString m_encryptionKey;
#ifdef HAVE_LIBGPGME
KGpgMe* m_gpg;
#endif
TQTimer m_inactivityAutoLockTimer;
void enableActions();
private slots:
void loadNotes(const TQDomElement &notes, Note *parent);
void saveNotes(TQDomDocument &document, TQDomElement &element, Note *parent);
void unlock();
protected slots:
void inactivityAutoLockTimeout();
public slots:
void load();
void loadProperties(const TQDomElement &properties);
void saveProperties(TQDomDocument &document, TQDomElement &properties);
bool save();
public:
bool isEncrypted();
bool isFileEncrypted();
bool isLocked() { return m_locked; };
void lock();
bool isLoaded() { return m_loaded; };
bool loadingLaunched() { return m_loadingLaunched; };
bool loadFromFile(const TQString &fullPath, TQString* string, bool isLocalEncoding = false);
bool loadFromFile(const TQString &fullPath, TQByteArray* array);
bool saveToFile(const TQString& fullPath, const TQByteArray& array);
bool saveToFile(const TQString& fullPath, const TQByteArray& array, TQ_ULONG length);
bool saveToFile(const TQString& fullPath, const TQString& string, bool isLocalEncoding = false);
static bool safelySaveToFile(const TQString& fullPath, const TQByteArray& array);
static bool safelySaveToFile(const TQString& fullPath, const TQByteArray& array, TQ_ULONG length);
static bool safelySaveToFile(const TQString& fullPath, const TQString& string, bool isLocalEncoding = false);
bool setProtection(int type, TQString key);
int encryptionType() { return m_encryptionType; };
TQString encryptionKey(){ return m_encryptionKey; };
bool saveAgain();
/// BACKGROUND:
private:
TQColor m_backgroundColorSetting;
TQString m_backgroundImageName;
TQPixmap *m_backgroundPixmap;
TQPixmap *m_opaqueBackgroundPixmap;
TQPixmap *m_selectedBackgroundPixmap;
bool m_backgroundTiled;
TQColor m_textColorSetting;
public:
inline bool hasBackgroundImage() { return m_backgroundPixmap != 0; }
inline const TQPixmap* backgroundPixmap() { return m_backgroundPixmap; }
inline bool isTiledBackground() { return m_backgroundTiled; }
inline TQString backgroundImageName() { return m_backgroundImageName; }
inline TQColor backgroundColorSetting() { return m_backgroundColorSetting; }
inline TQColor textColorSetting() { return m_textColorSetting; }
TQColor backgroundColor();
TQColor textColor();
void setAppearance(const TQString &icon, const TQString &name, const TQString &backgroundImage, const TQColor &backgroundColor, const TQColor &textColor);
void blendBackground(TQPainter &painter, const TQRect &rect, int xPainter = -1, int yPainter = -1, bool opaque = false, TQPixmap *bg = 0);
void unbufferizeAll();
void subscribeBackgroundImages();
void unsubscribeBackgroundImages();
/// KEYBOARD SHORTCUT:
public: // Temporar: for deletion purpose
TDEAction *m_action;
private:
int m_shortcutAction;
private slots:
void activatedShortcut();
public:
TDEShortcut shortcut() { return m_action->shortcut(); }
int shortcutAction() { return m_shortcutAction; }
void setShortcut(TDEShortcut shortcut, int action);
/// USER INTERACTION:
private:
Note *m_hoveredNote;
int m_hoveredZone;
bool m_lockedHovering;
bool m_underMouse;
TQRect m_inserterRect;
bool m_inserterShown;
bool m_inserterSplit;
bool m_inserterTop;
bool m_inserterGroup;
void placeInserter(Note *note, int zone);
void removeInserter();
public:
// bool inserterShown() { return m_inserterShown; }
bool inserterSplit() { return m_inserterSplit; }
bool inserterGroup() { return m_inserterGroup; }
public slots:
void doHoverEffects(Note *note, Note::Zone zone, const TQPoint &pos = TQPoint(0, 0)); /// << @p pos is optionnal and only used to show the link target in the statusbar
void doHoverEffects(const TQPoint &pos);
void doHoverEffects(); // The same, but using the current cursor position
void mouseEnteredEditorWidget();
public:
void popupTagsMenu(Note *note);
void popupEmblemMenu(Note *note, int emblemNumber);
void addTagToSelectedNotes(Tag *tag);
void removeTagFromSelectedNotes(Tag *tag);
void removeAllTagsFromSelectedNotes();
void addStateToSelectedNotes(State *state);
void changeStateOfSelectedNotes(State *state);
bool selectedNotesHaveTags();
const TQRect& inserterRect() { return m_inserterRect; }
bool inserterShown() { return m_inserterShown; }
void drawInserter(TQPainter &painter, int xPainter, int yPainter);
DecoratedBasket* decoration();
State *stateForTagFromSelectedNotes(Tag *tag);
public slots:
void activatedTagShortcut(Tag *tag);
void recomputeAllStyles();
void removedStates(const TQValueList<State*> &deletedStates);
private slots:
void toggledTagInMenu(int id);
void toggledStateInMenu(int id);
void unlockHovering();
void disableNextClick();
void contentsMoved();
public:
Note *m_tagPopupNote;
private:
Tag *m_tagPopup;
TQTime m_lastDisableClick;
/// SELECTION:
private:
bool m_isSelecting;
bool m_selectionStarted;
bool m_selectionInvert;
TQPoint m_selectionBeginPoint;
TQPoint m_selectionEndPoint;
TQRect m_selectionRect;
TQTimer m_autoScrollSelectionTimer;
void stopAutoScrollSelection();
private slots:
void doAutoScrollSelection();
public:
inline bool isSelecting() { return m_isSelecting; }
inline const TQRect& selectionRect() { return m_selectionRect; }
void selectNotesIn(const TQRect &rect, bool invertSelection, bool unselectOthers = true);
void resetWasInLastSelectionRect();
void selectAll();
void unselectAll();
void invertSelection();
void unselectAllBut(Note *toSelect);
void invertSelectionOf(Note *toSelect);
TQColor selectionRectInsideColor();
Note* theSelectedNote();
NoteSelection* selectedNotes();
/// BLANK SPACES DRAWING:
private:
TQValueList<TQRect> m_blankAreas;
void recomputeBlankRects();
TQWidget *m_cornerWidget;
/// COMMUNICATION WITH ITS CONTAINER:
signals:
void postMessage(const TQString &message); /// << Post a temporar message in the statusBar.
void setStatusBarText(const TQString &message); /// << Set the permanent statusBar text or reset it if message isEmpty().
void resetStatusBarText(); /// << Equivalent to setStatusBarText("").
void propertiesChanged(Basket *basket);
void countsChanged(Basket *basket);
public slots:
void linkLookChanged();
void signalCountsChanged();
private:
TQTimer m_timerCountsChanged;
private slots:
void countsChangedTimeOut();
/// NOTES COUNTING:
public:
void addSelectedNote() { ++m_countSelecteds; signalCountsChanged(); }
void removeSelectedNote() { --m_countSelecteds; signalCountsChanged(); }
void resetSelectedNote() { m_countSelecteds = 0; signalCountsChanged(); } // FIXME: Useful ???
int count() { return m_count; }
int countFounds() { return m_countFounds; }
int countSelecteds() { return m_countSelecteds; }
private:
int m_count;
int m_countFounds;
int m_countSelecteds;
/// PROPERTIES:
public:
TQString basketName() { return m_basketName; }
TQString icon() { return m_icon; }
TQString folderName() { return m_folderName; }
TQString fullPath();
TQString fullPathForFileName(const TQString &fileName); // Full path of an [existing or not] note in this basket
static TQString fullPathForFolderName(const TQString &folderName);
private:
TQString m_basketName;
TQString m_icon;
TQString m_folderName;
/// ACTIONS ON SELECTED NOTES FROM THE INTERFACE:
public slots:
void noteEdit(Note *note = 0L, bool justAdded = false, const TQPoint &clickedPoint = TQPoint());
void showEditedNoteWhileFiltering();
void noteDelete();
void noteDeleteWithoutConfirmation(bool deleteFilesToo = true);
void noteCopy();
void noteCut();
void noteOpen(Note *note = 0L);
void noteOpenWith(Note *note = 0L);
void noteSaveAs();
void noteGroup();
void noteUngroup();
void noteMoveOnTop();
void noteMoveOnBottom();
void noteMoveNoteUp();
void noteMoveNoteDown();
void moveSelectionTo(Note *here, bool below);
public:
enum CopyMode { CopyToClipboard, CopyToSelection, CutToClipboard };
void doCopy(CopyMode copyMode);
bool selectionIsOneGroup();
Note* selectedGroup();
Note* firstSelected();
Note* lastSelected();
/// NOTES EDITION:
private:
NoteEditor *m_editor;
//TQWidget *m_rightEditorBorder;
TransparentWidget *m_leftEditorBorder;
TransparentWidget *m_rightEditorBorder;
bool m_redirectEditActions;
int m_editorWidth;
int m_editorHeight;
TQTimer m_inactivityAutoSaveTimer;
bool m_doNotCloseEditor;
int m_editParagraph;
int m_editIndex;
public:
bool isDuringEdit() { return m_editor; }
bool redirectEditActions() { return m_redirectEditActions; }
bool hasTextInEditor();
bool hasSelectedTextInEditor();
bool selectedAllTextInEditor();
Note* editedNote();
protected slots:
void selectionChangedInEditor();
void contentChangedInEditor();
void inactivityAutoSaveTimeout();
public slots:
void editorCursorPositionChanged();
private:
int m_editorX;
int m_editorY;
public slots:
void placeEditor(bool andEnsureVisible = false);
void placeEditorAndEnsureVisible();
bool closeEditor();
void closeEditorDelayed();
void updateEditorAppearance();
void editorPropertiesChanged();
void openBasket();
void closeBasket();
/// FILTERING:
public slots:
void newFilter(const FilterData &data, bool andEnsureVisible = true);
void cancelFilter();
void validateFilter();
void filterAgain(bool andEnsureVisible = true);
void filterAgainDelayed();
bool isFiltering();
/// DRAG AND DROP:
private:
bool m_isDuringDrag;
TQValueList<Note*> m_draggedNotes;
public:
static void acceptDropEvent(TQDropEvent *event, bool preCond = true);
void contentsDropEvent(TQDropEvent *event);
void blindDrop(TQDropEvent* event);
bool isDuringDrag() { return m_isDuringDrag; }
TQValueList<Note*> draggedNotes() { return m_draggedNotes; }
protected:
void contentsDragEnterEvent(TQDragEnterEvent*);
void contentsDragMoveEvent(TQDragMoveEvent *event);
void contentsDragLeaveEvent(TQDragLeaveEvent*);
public slots:
void slotCopyingDone2(TDEIO::Job *job);
public:
Note* noteForFullPath(const TQString &path);
/// EXPORTATION:
public:
TQValueList<State*> usedStates();
static TQString saveGradientBackground(const TQColor &color, const TQFont &font, const TQString &folder);
public:
void listUsedTags(TQValueList<Tag*> &list);
/// MANAGE FOCUS:
private:
Note *m_focusedNote;
public:
void setFocusedNote(Note *note);
void focusANote();
void focusANonSelectedNoteAbove(bool inSameColumn);
void focusANonSelectedNoteBelow(bool inSameColumn);
void focusANonSelectedNoteBelowOrThenAbove();
void focusANonSelectedNoteAboveOrThenBelow();
Note* focusedNote() { return m_focusedNote; }
Note* firstNoteInStack();
Note* lastNoteInStack();
Note* firstNoteShownInStack();
Note* lastNoteShownInStack();
void selectRange(Note *start, Note *end, bool unselectOthers = true); /// FIXME: Not really a focus related method!
void ensureNoteVisible(Note *note);
virtual void keyPressEvent(TQKeyEvent *event);
virtual void focusInEvent(TQFocusEvent*);
virtual void focusOutEvent(TQFocusEvent*);
TQRect noteVisibleRect(Note *note); // clipped global (desktop as origin) rectangle
Note* firstNoteInGroup();
Note *noteOnHome();
Note *noteOnEnd();
enum NoteOn { LEFT_SIDE = 1, RIGHT_SIDE, TOP_SIDE, BOTTOM_SIDE };
Note* noteOn(NoteOn side);
/// REIMPLEMENTED:
public:
void deleteFiles();
bool convertTexts();
public:
void wheelEvent(TQWheelEvent *event);
public:
Note *m_startOfShiftSelectionNote;
/// THE NEW FILE WATCHER:
private:
KDirWatch *m_watcher;
TQTimer m_watcherTimer;
TQValueList<TQString> m_modifiedFiles;
public:
void addWatchedFile(const TQString &fullPath);
void removeWatchedFile(const TQString &fullPath);
private slots:
void watchedFileModified(const TQString &fullPath);
void watchedFileDeleted(const TQString &fullPath);
void updateModifiedNotes();
/// FROM OLD ARCHITECTURE **********************
public slots:
void showFrameInsertTo() {}
void resetInsertTo() {}
void computeInsertPlace(const TQPoint &/*cursorPosition*/) { }
public:
friend class SystemTray;
/// SPEED OPTIMIZATION
private:
bool m_finishLoadOnFirstShow;
bool m_relayoutOnNextShow;
public:
void aboutToBeActivated();
};
#if 0
#include <tqwidget.h>
#include <tqscrollview.h>
#include <tqclipboard.h>
#include <tqptrlist.h>
#include <tqtimer.h>
#include <tdeio/job.h>
#include <tqcolor.h>
#include "filter.h"
class TQFrame;
class TQVBoxLayout;
class TQCheckBox;
class TQString;
class TQColor;
class TQPixmap;
class TQAction;
class TQStringList;
class TQRect;
class TQDomElement;
class KDirWatch;
class Basket;
class Note;
class NoteEditorBase;
/** Used to enqueue a file path when the Basket receive a file modification / creation / deletion
* It associate the file name with an event.
* All this queue will be treated later.
* TODO: rename to class WatcherEvent ?
* @author S<EFBFBD>astien Laot
*/
class FileEvent
{
public:
enum Event { Modified = 1, Created, Deleted, Renamed };
FileEvent(Event evt, const TQString &path)
: event(evt), filePath(path)
{ }
public: // Because it must be fast and theire is no need to be private
Event event;
TQString filePath;
};
/** Basket that contain some Notes.
* @author S<EFBFBD>astien Laot
*/
clas s Bas ket : public TQScrollView
{
Q_OBJECT
public:
/** Construtor and destructor */
Bask et(TQWidget *parent, const TQString &folderName, const char *name = "", WFlags fl = 0);
public:
protected:
virtual void contentsContextMenuEvent(TQContextMenuEvent *event);
virtual void contentsMousePressEvent(TQMouseEvent *event); // For redirected event !!
virtual void showEvent(TQShowEvent *);
/** Drag and drop functions */
virtual void dragEnterEvent(TQDragEnterEvent*);
virtual void dragMoveEvent(TQDragMoveEvent* event);
virtual void dragLeaveEvent(TQDragLeaveEvent*);
public:
virtual void dropEvent(TQDropEvent *event);
static void acceptDropEvent(TQDropEvent *event, bool preCond = true);
bool canDragNote() { return !isEmpty(); }
void computeInsertPlace(const TQPoint &cursorPosition);
Note* noteAtPosition(const TQPoint &pos);
Note* duplicatedOf(Note *note);
void checkClipboard();
void processActionAsYouType(TQKeyEvent *event);
void exportToHTML();
signals:
void nameChanged(Basket *basket, const TQString &name);
void iconChanged(Basket *basket, const TQString &icon);
void notesNumberChanged(Basket *basket);
public slots:
void linkLookChanged();
void showNotesToolTipChanged();
/** Notes manipulation */
void insertNote(Note *note);
void delNote(Note *note, bool askForMirroredFile = true);
void changeNotePlace(Note *note);
void pasteNote(TQClipboard::Mode mode = TQClipboard::Clipboard);
void recolorizeNotes();
void reloadMirroredFolder();
void showMirrorOnlyOnceInfo();
/** Selection of note(s) */
void selectAll();
void unselectAll();
void unselectAllBut(Note *toSelect);
void invertSelection();
void selectRange(Note *start, Note *end);
void clicked(Note *note, bool controlPressed, bool shiftPressed);
void setFocusedNote(Note *note);
void focusANote();
void ensureVisibleNote(Note *note);
TQRect noteRect(Note *note); // clipped global (desktop as origin) rectangle
/** Travel the list to find the next shown note, or the previous if step == -1, or the next after 10 if step == 10... */
Note* nextShownNoteFrom(Note *note, int step);
/** Actions on (selected) notes */
void editNote(Note *note, bool editAnnotations = false);
void editNote();
void delNote();
void copyNote();
void cutNote();
void openNote();
void openNoteWith();
void saveNoteAs();
void moveOnTop();
void moveOnBottom();
void moveNoteUp();
void moveNoteDown();
public:
void dontCareOfCreation(const TQString &path);
TQString copyIcon(const TQString &iconName, int size, const TQString &destFolder);
TQString copyFile(const TQString &srcPath, const TQString &destFolder, bool createIt = false);
protected slots:
void slotModifiedFile(const TQString &path);
void slotCreatedFile(const TQString &path);
void slotDeletedFile(const TQString &path);
void slotUpdateNotes();
void placeEditor();
void closeEditor(bool save = true);
void clipboardChanged(bool selectionMode = false);
void selectionChanged();
private:
TQTimer m_updateTimer;
TQPtrList<FileEvent> m_updateQueue;
TQStringList m_dontCare;
static const int c_updateTime;
private:
void load(); // Load is performed only once, during contructor
void loadNotes(const TQDomElement &notes);
bool importLauncher(const TQString &type, const TQDomElement &content, const TQString &runCommand,
const TQString &annotations/*, bool checked*/);
void computeShownNotes();
private:
KDirWatch *m_watcher;
NoteEditorBase *m_editor;
TQKeyEvent *m_stackedKeyEvent;
};
#endif // #if 0
#endif // BASKET_H