source: ogBrowser-Git/qtermwidget/src/Filter.h @ ac45929

jenkinsmain
Last change on this file since ac45929 was 050d67a, checked in by adelcastillo <adelcastillo@…>, 16 years ago

Ahora el browser tiene consola en vez del output.
Pasado todo el sistema de compilacion a cmake.

git-svn-id: https://opengnsys.es/svn/trunk@408 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 13.1 KB
Line 
1/*
2    Copyright (C) 2007 by Robert Knight <robertknight@gmail.com>
3
4    Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19    02110-1301  USA.
20*/
21
22#ifndef FILTER_H
23#define FILTER_H
24
25// Qt
26#include <QtGui/QAction>
27#include <QtCore/QList>
28#include <QtCore/QObject>
29#include <QtCore/QStringList>
30#include <QtCore/QHash>
31#include <QtCore/QRegExp>
32
33// Local
34#include "Character.h"
35
36namespace Konsole
37{
38
39/**
40 * A filter processes blocks of text looking for certain patterns (such as URLs or keywords from a list)
41 * and marks the areas which match the filter's patterns as 'hotspots'.
42 *
43 * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ),
44 * and an action.  When the user performs some activity such as a mouse-click in a hotspot area ( the exact
45 * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's
46 * activate() method should be called.  Depending on the type of hotspot this will trigger a suitable response.
47 *
48 * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser.
49 * Hotspots may have more than one action, in which case the list of actions can be obtained using the
50 * actions() method.
51 *
52 * Different subclasses of filter will return different types of hotspot.
53 * Subclasses must reimplement the process() method to examine a block of text and identify sections of interest.
54 * When processing the text they should create instances of Filter::HotSpot subclasses for sections of interest
55 * and add them to the filter's list of hotspots using addHotSpot()
56 */
57class Filter
58{
59public:
60    /**
61    * Represents an area of text which matched the pattern a particular filter has been looking for.
62    *
63    * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ),
64    * and an action.  When the user performs some activity such as a mouse-click in a hotspot area ( the exact
65    * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's
66    * activate() method should be called.  Depending on the type of hotspot this will trigger a suitable response.
67    *
68    * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser.
69    * Hotspots may have more than one action, in which case the list of actions can be obtained using the
70    * actions() method.  These actions may then be displayed in a popup menu or toolbar for example.
71    */
72    class HotSpot
73    {
74    public:
75       /**
76        * Constructs a new hotspot which covers the area from (@p startLine,@p startColumn) to (@p endLine,@p endColumn)
77        * in a block of text.
78        */
79       HotSpot(int startLine , int startColumn , int endLine , int endColumn);
80       virtual ~HotSpot();
81
82       enum Type
83       {
84            // the type of the hotspot is not specified
85            NotSpecified,
86            // this hotspot represents a clickable link
87            Link,
88            // this hotspot represents a marker
89            Marker
90       };
91
92       /** Returns the line when the hotspot area starts */
93       int startLine() const;
94       /** Returns the line where the hotspot area ends */
95       int endLine() const;
96       /** Returns the column on startLine() where the hotspot area starts */
97       int startColumn() const;
98       /** Returns the column on endLine() where the hotspot area ends */
99       int endColumn() const;
100       /**
101        * Returns the type of the hotspot.  This is usually used as a hint for views on how to represent
102        * the hotspot graphically.  eg.  Link hotspots are typically underlined when the user mouses over them
103        */
104       Type type() const;
105       /**
106        * Causes the an action associated with a hotspot to be triggered.
107        *
108        * @param object The object which caused the hotspot to be triggered.  This is
109        * typically null ( in which case the default action should be performed ) or
110        * one of the objects from the actions() list.  In which case the associated
111        * action should be performed.
112        */
113       virtual void activate(QObject* object = 0) = 0;
114       /**
115        * Returns a list of actions associated with the hotspot which can be used in a
116        * menu or toolbar
117        */
118       virtual QList<QAction*> actions();
119
120       /**
121        * Returns the text of a tooltip to be shown when the mouse moves over the hotspot, or
122        * an empty string if there is no tooltip associated with this hotspot.
123        *
124        * The default implementation returns an empty string.
125        */
126       virtual QString tooltip() const;
127
128    protected:
129       /** Sets the type of a hotspot.  This should only be set once */
130       void setType(Type type);
131
132    private:
133       int    _startLine;
134       int    _startColumn;
135       int    _endLine;
136       int    _endColumn;
137       Type _type;
138   
139    };
140
141    /** Constructs a new filter. */
142    Filter();
143    virtual ~Filter();
144
145    /** Causes the filter to process the block of text currently in its internal buffer */
146    virtual void process() = 0;
147
148    /**
149     * Empties the filters internal buffer and resets the line count back to 0.
150     * All hotspots are deleted.
151     */
152    void reset();
153
154    /** Adds a new line of text to the filter and increments the line count */
155    //void addLine(const QString& string);
156
157    /** Returns the hotspot which covers the given @p line and @p column, or 0 if no hotspot covers that area */
158    HotSpot* hotSpotAt(int line , int column) const;
159
160    /** Returns the list of hotspots identified by the filter */
161    QList<HotSpot*> hotSpots() const;
162
163    /** Returns the list of hotspots identified by the filter which occur on a given line */
164    QList<HotSpot*> hotSpotsAtLine(int line) const;
165
166    /**
167     * TODO: Document me
168     */
169    void setBuffer(const QString* buffer , const QList<int>* linePositions);
170
171protected:
172    /** Adds a new hotspot to the list */
173    void addHotSpot(HotSpot*);
174    /** Returns the internal buffer */
175    const QString* buffer();
176    /** Converts a character position within buffer() to a line and column */
177    void getLineColumn(int position , int& startLine , int& startColumn);
178
179private:
180    QMultiHash<int,HotSpot*> _hotspots;
181    QList<HotSpot*> _hotspotList;
182   
183    const QList<int>* _linePositions;
184    const QString* _buffer;
185};
186
187/**
188 * A filter which searches for sections of text matching a regular expression and creates a new RegExpFilter::HotSpot
189 * instance for them.
190 *
191 * Subclasses can reimplement newHotSpot() to return custom hotspot types when matches for the regular expression
192 * are found.
193 */
194class RegExpFilter : public Filter
195{
196public:
197    /**
198     * Type of hotspot created by RegExpFilter.  The capturedTexts() method can be used to find the text
199     * matched by the filter's regular expression.
200     */
201    class HotSpot : public Filter::HotSpot
202    {
203    public:
204        HotSpot(int startLine, int startColumn, int endLine , int endColumn);
205        virtual void activate(QObject* object = 0);
206
207        /** Sets the captured texts associated with this hotspot */
208        void setCapturedTexts(const QStringList& texts);
209        /** Returns the texts found by the filter when matching the filter's regular expression */
210        QStringList capturedTexts() const;
211    private:
212        QStringList _capturedTexts;
213    };
214
215    /** Constructs a new regular expression filter */
216    RegExpFilter();
217
218    /**
219     * Sets the regular expression which the filter searches for in blocks of text.
220     *
221     * Regular expressions which match the empty string are treated as not matching
222     * anything.
223     */
224    void setRegExp(const QRegExp& text);
225    /** Returns the regular expression which the filter searches for in blocks of text */
226    QRegExp regExp() const;
227
228    /**
229     * Reimplemented to search the filter's text buffer for text matching regExp()
230     *
231     * If regexp matches the empty string, then process() will return immediately
232     * without finding results.
233     */
234    virtual void process();
235
236protected:
237    /**
238     * Called when a match for the regular expression is encountered.  Subclasses should reimplement this
239     * to return custom hotspot types
240     */
241    virtual RegExpFilter::HotSpot* newHotSpot(int startLine,int startColumn,
242                                    int endLine,int endColumn);
243
244private:
245    QRegExp _searchText;
246};
247
248class FilterObject;
249
250/** A filter which matches URLs in blocks of text */
251class UrlFilter : public RegExpFilter
252{
253public:
254    /**
255     * Hotspot type created by UrlFilter instances.  The activate() method opens a web browser
256     * at the given URL when called.
257     */
258    class HotSpot : public RegExpFilter::HotSpot
259    {
260    public:
261        HotSpot(int startLine,int startColumn,int endLine,int endColumn);
262        virtual ~HotSpot();
263
264        virtual QList<QAction*> actions();
265
266        /**
267         * Open a web browser at the current URL.  The url itself can be determined using
268         * the capturedTexts() method.
269         */
270        virtual void activate(QObject* object = 0);
271
272        virtual QString tooltip() const;
273    private:
274        enum UrlType
275        {
276            StandardUrl,
277            Email,
278            Unknown
279        };
280        UrlType urlType() const;
281
282        FilterObject* _urlObject;
283    };
284
285    UrlFilter();
286
287protected:
288    virtual RegExpFilter::HotSpot* newHotSpot(int,int,int,int);
289
290private:
291   
292    static const QRegExp FullUrlRegExp;
293    static const QRegExp EmailAddressRegExp;
294
295    // combined OR of FullUrlRegExp and EmailAddressRegExp
296    static const QRegExp CompleteUrlRegExp;
297};
298
299class FilterObject : public QObject
300{
301Q_OBJECT
302public:
303    FilterObject(Filter::HotSpot* filter) : _filter(filter) {}
304private slots:
305    void activated();
306private:
307    Filter::HotSpot* _filter;
308};
309
310/**
311 * A chain which allows a group of filters to be processed as one.
312 * The chain owns the filters added to it and deletes them when the chain itself is destroyed.
313 *
314 * Use addFilter() to add a new filter to the chain. 
315 * When new text to be filtered arrives, use addLine() to add each additional
316 * line of text which needs to be processed and then after adding the last line, use
317 * process() to cause each filter in the chain to process the text.
318 *
319 * After processing a block of text, the reset() method can be used to set the filter chain's
320 * internal cursor back to the first line.
321 *
322 * The hotSpotAt() method will return the first hotspot which covers a given position.
323 *
324 * The hotSpots() and hotSpotsAtLine() method return all of the hotspots in the text and on
325 * a given line respectively.
326 */
327class FilterChain : protected QList<Filter*>
328{
329public:
330    virtual ~FilterChain();
331
332    /** Adds a new filter to the chain.  The chain will delete this filter when it is destroyed */
333    void addFilter(Filter* filter);
334    /** Removes a filter from the chain.  The chain will no longer delete the filter when destroyed */
335    void removeFilter(Filter* filter);
336    /** Returns true if the chain contains @p filter */
337    bool containsFilter(Filter* filter);
338    /** Removes all filters from the chain */
339    void clear();
340
341    /** Resets each filter in the chain */
342    void reset();
343    /**
344     * Processes each filter in the chain
345     */
346    void process();
347
348    /** Sets the buffer for each filter in the chain to process. */
349    void setBuffer(const QString* buffer , const QList<int>* linePositions);
350
351    /** Returns the first hotspot which occurs at @p line, @p column or 0 if no hotspot was found */
352    Filter::HotSpot* hotSpotAt(int line , int column) const;
353    /** Returns a list of all the hotspots in all the chain's filters */
354    QList<Filter::HotSpot*> hotSpots() const;
355    /** Returns a list of all hotspots at the given line in all the chain's filters */
356    QList<Filter::HotSpot> hotSpotsAtLine(int line) const;
357
358};
359
360/** A filter chain which processes character images from terminal displays */
361class TerminalImageFilterChain : public FilterChain
362{
363public:
364    TerminalImageFilterChain();
365    virtual ~TerminalImageFilterChain();
366
367    /**
368     * Set the current terminal image to @p image.
369     *
370     * @param image The terminal image
371     * @param lines The number of lines in the terminal image
372     * @param columns The number of columns in the terminal image
373     */
374    void setImage(const Character* const image , int lines , int columns,
375                                  const QVector<LineProperty>& lineProperties); 
376
377private:
378    QString* _buffer;
379    QList<int>* _linePositions;
380};
381
382}
383#endif //FILTER_H
Note: See TracBrowser for help on using the repository browser.