diff options
Diffstat (limited to 'lib/interfaces/tdevcore.h')
-rw-r--r-- | lib/interfaces/tdevcore.h | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/lib/interfaces/tdevcore.h b/lib/interfaces/tdevcore.h new file mode 100644 index 00000000..fadcdfde --- /dev/null +++ b/lib/interfaces/tdevcore.h @@ -0,0 +1,388 @@ +/* This file is part of the KDE project + Copyright (C) 2001-2002 Matthias Hoelzer-Kluepfel <hoelzer@kde.org> + Copyright (C) 2001-2002 Bernd Gehrmann <bernd@kdevelop.org> + Copyright (C) 2001 Sandy Meier <smeier@kdevelop.org> + Copyright (C) 2002 Daniel Engelschalt <daniel.engelschalt@gmx.net> + Copyright (C) 2002 Simon Hausmann <hausmann@kde.org> + Copyright (C) 2002-2003 Roberto Raggi <roberto@kdevelop.org> + Copyright (C) 2003 Mario Scalas <mario.scalas@libero.it> + Copyright (C) 2003 Harald Fernengel <harry@kdevelop.org> + Copyright (C) 2003 Hamish Rodda <rodda@kde.org> + Copyright (C) 2004 Alexander Dymo <adymo@kdevelop.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef TDEVCORE_H +#define TDEVCORE_H + +/** +@file tdevcore.h +The interface to the application core and context menu classes. +*/ + +#include <tqstringlist.h> +#include <tqdict.h> +#include <tqobject.h> + +#include <kurl.h> + +class KDialogBase; +class TDevPlugin; +class CodeModelItem; +class ProjectModelItem; + +namespace KParts +{ + class Part; +} + +class TQStatusBar; +class TQPopupMenu; + +/** +Base class for every context. +Think of a Context-based class as "useful +info associated to a context menu". Several context menu can be defined, +each defining different information: because of these context menus being +used in many modules, they are defined here. + +When context menu with a certain "context" associated appears, KDevelop core +sends a notification signal and all plugins which receive this signal have +the ability to add own items into the menu. For example, VCS plugin could +add "commit" and "update" menu items to the context menu of a file. + +<b>How to use context from a plugin:</b> +-# Create a popup menu in context menu event handler: @code TDEPopupMenu menu(this); @endcode +-# Create a context: @code MyContext context(param). @endcode +-# Fill a context menu: @code core()->fillContextMenu(&menu, &context); @endcode +-# Show the popup menu: @code menu.exec(event->globalPos()); @endcode +. +In this example @em event is an object of TQContextMenuEvent class which you have access +to if you reimplement TQWidget::contextMenuEvent method. + +<b>How to fill context menu from a plugin:</b> +-# Create a @code contextMenu(TQPopupMenu *, const Context *) @endcode slot in your plugin class. +-# Connect TDevCore::contextMenu(TQPopupMenu *, const Context *) signal to that slot in +the constructor of your plugin:\n +@code +connect(core(), TQT_SIGNAL(contextMenu(TQPopupMenu *, const Context *)), + this, TQT_SLOT(contextMenu(TQPopupMenu *, const Context *))); +@endcode +-# Fill the menu in the slot you created, for example:\n +@code +if (context->hasType(Context::EditorContext)) +{ + const EditorContext *econtext = static_cast<const EditorContext*>(context); + int id = popup->insertItem(i18n("My Menu Item 1"), this, TQT_SLOT(myMenuAction1())); + popup->setWhatsThis(id, i18n("What's this for my menu item 1")); +} +else if context->hasType(MyContext)) +{ + int id = popup->insertItem(... + ... +} +... +@endcode +*/ +class Context +{ +public: + /**Pre-defined context types. More may be added so it is possible to add custom + contexts. <strong>We reserve enum values until 1000 (yeah, it is one thousand ) + for tdevelop official context types.</strong>*/ + enum Type + { + EditorContext, /**<Editor context menu.*/ + DocumentationContext, /**<Documentation browser context menu.*/ + FileContext, /**<File context menu.*/ + ProjectModelItemContext, /**<Project tree context menu.*/ + CodeModelItemContext /**<Class tree context menu.*/ + }; + + /**Implement this in the context so we can provide rtti.*/ + virtual int type() const = 0; + + /**@return The type of this Context, so clients can discriminate + between different file contexts.*/ + virtual bool hasType(int type) const; + +protected: + /**Constructor.*/ + Context(); + + /**Destructor.*/ + virtual ~Context(); +}; + +/**A context for the popup menu in the editor.*/ +class EditorContext: public Context +{ +public: + /**Builds a context for an editor part. + @param url The url of a file in the editor. + @param line The line number where the cursor is. + @param col The column number where the cursor is. + @param linestr The content of the line where the cursor is. + @param wordstr The current word under the cursor.*/ + EditorContext(const KURL &url, int line, int col, + const TQString &linestr, const TQString &wordstr); + + /**Destructor.*/ + virtual ~EditorContext(); + + virtual int type() const; + + /**@return The url for the file which this context was invoked for.*/ + const KURL &url() const; + + /**@return The line number for the cursor position.*/ + int line() const; + + /**@return The column number for the cursor position.*/ + int col() const; + + /**@return A TQString with the content of the line which this context was + invoked for.*/ + TQString currentLine() const; + + /**@return A TQString containing the word near to the cursor when this + context object was created.*/ + TQString currentWord() const; + +private: + class Private; + Private *d; + + EditorContext( const EditorContext &); + EditorContext &operator=( const EditorContext &); +}; + + +/** +A context for the popup menu in the documentation browser widget. +*/ +class DocumentationContext: public Context +{ +public: + + /**Builds a DocumentationContext. + @param url The URL that the context will be for. + @param selection Selected text.*/ + DocumentationContext(const TQString &url, const TQString &selection ); + + /**Copy constructor.*/ + DocumentationContext(const DocumentationContext &); + DocumentationContext &operator=(const DocumentationContext &); + + /**Destructor.*/ + virtual ~DocumentationContext(); + + virtual int type() const; + + /**@return The url of the document this context was invoked for.*/ + TQString url() const; + + /**@return The selected text in the document.*/ + TQString selection() const; + +private: + class Private; + Private *d; +}; + +/** +A context for the popup menu in file views and other parts that show files. +Context allows multiple selections of files. +*/ +class FileContext : public Context +{ +public: + /**Builds the file context using a @ref KURL::List + @param someURLs The list of selected files URLs.*/ + FileContext(const KURL::List &someURLs); + + /**Destructor.*/ + virtual ~FileContext(); + + virtual int type() const; + + /**@return A reference to the selected of URLs.*/ + const KURL::List &urls() const; + +private: + class Private; + Private *d; + + FileContext( const FileContext &); + FileContext &operator=( const FileContext &); +}; + +/** +A context for the popup menu in class views. +*/ +class CodeModelItemContext: public Context +{ +public: + /**Builds the context. + @param item Selected code model item representation. Usually a symbol from the code + like class, function, etc.*/ + CodeModelItemContext(const CodeModelItem* item); + + /**Destructor.*/ + virtual ~CodeModelItemContext(); + + virtual int type() const; + + /**@return The code model item for the selected item.*/ + const CodeModelItem* item() const; + +private: + class Private; + Private *d; + + CodeModelItemContext( const CodeModelItemContext &); + CodeModelItemContext &operator=( const CodeModelItemContext &); +}; + +/** +A context for the popup menu in project views. +*/ +class ProjectModelItemContext : public Context +{ +public: + /**Builds the context. + @param item The item to build the context from.*/ + ProjectModelItemContext(const ProjectModelItem* item); + + /**Destructor.*/ + virtual ~ProjectModelItemContext(); + + virtual int type() const; + + /**@return The code model item for the selected item.*/ + const ProjectModelItem* item() const; + +private: + class Private; + Private *d; + + ProjectModelItemContext( const ProjectModelItemContext &); + ProjectModelItemContext &operator=( const ProjectModelItemContext &); +}; + + + + +/** +A TDevCore class defines an object which takes care about the cooperation +between the various plug-in which compose KDevelop. +It defines: +- signals that can be captured for menu customization; +- notifications about opening / closing projects; +- methods to access functionality of KDevelop core; +- requests to fill project and global settings widgets; +- etc. +. +*/ +class TDevCore: public TQObject +{ + Q_OBJECT + +public: + /**Constructor + @param parent The TQObject that's the parent of this class. + @param name The name of the class.*/ + TDevCore(TQObject *parent=0, const char *name=0); + + /**Destructor.*/ + virtual ~TDevCore(); + + /**Fills the context menu. + This method should be called by a part that wants to show a + context menu. The parameter @p context should be filled with + information about the context in which this happens (see + EditorContext, DocumentationContext, ClassContext, ...). + Essentially, this method emits the signal contextMenu() + which other parts can use to hook in. + @sa Context for a detailed explanation of context menu initializations and usage. + @param popup The popup menu to fill. + @param context The pointer to a Context object of this popup menu.*/ + virtual void fillContextMenu(TQPopupMenu *popup, const Context *context) = 0; + + /**Closes the current project and open the new one. You cannot use the @ref TDevPlugin::project() + * method right after opening a new project, as it will return a null pointer. + *You must wait for the eventloop to be reentered, so use a signleshot timer + *to do the job needed after the project is opened or connect a slot to the + *@ref projectOpened signal. + * @param projectFileName The file name of the project to open.*/ + virtual void openProject(const TQString& projectFileName) = 0; + + /**Marks the component as running (or not running). As long as at least one + component is running, the stop button is enabled. When it is pressed, + component get a stopButtonClicked(). This is usable for plugins which + run certain commands and want KDevelop core to be notified of that. + If core is notified, it can allow the user to stop(interrupt) the command + manually by means of stop button. + @param which The plugin to mark. + @param runs true if plugin is running something, false if it is not.*/ + virtual void running(TDevPlugin *which, bool runs) = 0; + +signals: + /**Emitted after the core has done all initializations and + the main window has been shown.*/ + void coreInitialized(); + + /**A project has been opened.*/ + void projectOpened(); + + /**The project is about to be closed.*/ + void projectClosed(); + + /**The language support part has been changed.*/ + void languageChanged(); + + /**The user has clicked the stop button. + If all actions should be cancelled, pass 0 to @p which + @param which The TDevPlugin object to stop.*/ + void stopButtonClicked(TDevPlugin *which); + + /**A context menu has been requested somewhere. Components + may hook some entries into it. More information on the + context can be obtained by looking for the type of + @p context and casting it accordingly. + @sa Context for a detailed explanation of context menu initializations and usage. + @param popupMenu The popup menu to fill. + @param context The Context of this popup menu.*/ + void contextMenu(TQPopupMenu *popupMenu, const Context *context); + + /**Expects that a configuration page for use in the + KDevelop settings dialog is created by the component. + The configuration page is not demand-loading, it will be created before + global settings dialog is shown. Use @ref ConfigWidgetProxy in your plugin + to create demand-loading configuration pages. + @param dlg The dialog which the configuration widget should be added to.*/ + void configWidget(KDialogBase *dlg); + + /**Expects that a configuration page for use in the + Project settings dialog is created by the component. + The configuration page is not demand-loading, it will be created before + project settings dialog is shown. Use @ref ConfigWidgetProxy in your plugin + to create demand-loading configuration pages. + @param dlg The dialog which the configuration widget should be added to.*/ + void projectConfigWidget(KDialogBase *dlg); +}; + +#endif |