BALL  1.4.1
pyWidget.h
Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 
00005 #ifndef BALL_VIEW_WIDGETS_PYWIDGET_H
00006 #define BALL_VIEW_WIDGETS_PYWIDGET_H
00007 
00008 #ifndef BALL_COMMON_H
00009 # include <BALL/common.h>
00010 #endif
00011 
00012 #ifndef BALL_DATATYPE_STRING_H
00013 # include <BALL/DATATYPE/string.h>
00014 #endif
00015 
00016 #ifndef BALL_VIEW_WIDGETS_DOCKWIDGET_H
00017 # include <BALL/VIEW/WIDGETS/dockWidget.h>
00018 #endif
00019 
00020 #ifndef BALL_VIEW_WIDGETS_TEXTEDITORWIDGET_H
00021 # include <BALL/VIEW/WIDGETS/textEditorWidget.h>
00022 #endif
00023 
00024 #include <QtGui/QDragEnterEvent>
00025 #include <QtGui/QKeyEvent>
00026 #include <QtGui/QDropEvent>
00027 #include <QtGui/QLineEdit>
00028 #include <QtGui/QComboBox>
00029 #include <QtGui/QTabWidget>
00030 #include <QtGui/QSyntaxHighlighter>
00031 #include <QtGui/QValidator>
00032 #include <QtCore/QStringList>
00033 
00034 #include <QtCore/QThread>
00035 
00036 // currently doesnt work right
00037 #undef BALL_QT_HAS_THREADS
00038 
00039 namespace BALL
00040 {
00041   namespace VIEW
00042   {
00043 
00044 class PythonSettings;
00045 class Preferences;
00046 
00047 class RunPythonThread;
00048 
00052 class BALL_VIEW_EXPORT PythonHighlighter
00053   : public QSyntaxHighlighter
00054 {
00055   public:
00056 
00057   PythonHighlighter();
00058 
00059   ~PythonHighlighter() {};
00060 
00061   void compilePattern();
00062   void highlightBlock(const QString& text);
00063 
00064   QStringList python_keywords;
00065   QStringList BALL_keywords;
00066   QTextCharFormat my_class_format;
00067   QTextCharFormat python_format;
00068   QTextCharFormat string_format;
00069   QTextCharFormat comment_format;
00070   vector<QRegExp> python_patterns;
00071   vector<QRegExp> BALL_patterns;
00072   QRegExp         string_pattern;
00073   QRegExp         comment_pattern;
00074 };
00075 
00079 class BALL_VIEW_EXPORT PythonValidator
00080   : public QValidator
00081 {
00082   public:
00083     PythonValidator(QObject* parent = 0);
00084     virtual ~PythonValidator();
00085     
00086     virtual State validate(QString& input, int& pos) const;   
00087 };
00088 
00089 class BALL_VIEW_EXPORT RunPythonThread
00090   : public QThread
00091 {
00092   public:
00093     RunPythonThread();
00094 
00096     virtual void run();
00097 
00098     bool state;
00099     String input;
00100     String output;
00101 };
00102 
00104 struct BALL_VIEW_EXPORT Hotkey
00105 {
00106 
00107   public:
00108 
00109   static Hotkey createHotkey(String modifier, String key, String command, 
00110                              bool& ok, String comment = "");
00111 
00113   bool operator == (const Hotkey& hotkey) const;
00114 
00116   bool operator == (const QKeyEvent& e) const;
00117 
00119   const Hotkey& operator = (const Hotkey& s);
00120 
00122   bool operator < (const Hotkey& key) { return this < &key;}
00123 
00125   bool set(const String& data);
00126 
00128   void get(String& data) const;
00129 
00130   String                comment;
00131   String                action;
00132   Qt::KeyboardModifiers button_state;
00133   Qt::Key               key;
00134 };
00135 
00142 class BALL_VIEW_EXPORT PyWidget
00143   : public DockWidget
00144 {
00145   class MyLineEdit
00146     : public QLineEdit
00147   {
00148     public:
00149       MyLineEdit(QWidget* parent)
00150         : QLineEdit(parent) {};
00151 
00152       void setPyWidget(PyWidget* pw) { pw_ = pw;}
00153 
00154     protected:
00155 
00156       virtual void keyPressEvent(QKeyEvent* event);
00157 
00158       PyWidget* pw_;
00159   };
00160 
00161   class MyTextEdit
00162     : public TextEditorWidget
00163   {
00164     public:
00165       MyTextEdit(QWidget* parent)
00166         : TextEditorWidget(parent) {};
00167 
00168       void setPyWidget(PyWidget* pw) { pw_ = pw;}
00169 
00170     protected:
00171 
00172       virtual void keyPressEvent(QKeyEvent* event);
00173 
00174       PyWidget* pw_;
00175   };
00176 
00177   friend class MyLineEdit;
00178 
00179   Q_OBJECT
00180 
00181   public:
00182   
00183   BALL_EMBEDDABLE(PyWidget, Embeddable)
00184 
00185   
00188 
00195   PyWidget(QWidget* parent = 0, const char* name = 0);
00196 
00198   PyWidget(const PyWidget& p);
00199 
00201   ~PyWidget();
00202   
00204   bool isValid() const 
00205     { return valid_;}
00206 
00210 
00213   virtual void initializeWidget(MainControl& main_control);
00214 
00217   virtual void finalizeWidget(MainControl& main_control);
00218   
00220   void initializePreferencesTab(Preferences &preferences);
00221   
00223   void finalizePreferencesTab(Preferences &preferences);
00224 
00226   virtual void applyPreferences();
00227   
00229   virtual void scriptDialog(bool run = false);
00230 
00232   bool toAbortScript();
00233 
00238   void map(String modifier, String key, String command, String comment = "");
00239 
00241   void unmap(String modifier, String key);
00242 
00244   void insertHotkey(const Hotkey& hotkey);
00245 
00247   void removeHotkey(const Hotkey& hotkey);
00248 
00250   void reactTo(const QKeyEvent& e);
00251 
00257   virtual bool canHandle(const String& fileformat) const;
00258 
00263   virtual bool openFile(const String& filename);
00264 
00268   bool openFile(const String& filename, bool run, bool is_current = false);
00269 
00270   //
00271   bool runString(String command);
00272 
00273   //
00274   String getCurrentLine() const;
00275 
00276   //
00277   void dump(std::ostream& s, Size depth) const;
00278 
00279   //
00280   void showClassDocu(String classname, String member);
00281 
00282   //
00283   virtual void fetchPreferences(INIFile& inifile);
00284   
00285   //
00286   virtual void writePreferences(INIFile& inifile);
00287 
00288   //
00289   void checkMenu(MainControl& main_control);
00290 
00292   QString getCurrentScript();
00293 
00295   bool isInDirectMode() const;
00296 
00297   public slots:
00298 
00299   //
00300   void showEditContextMenu(const QPoint& point);
00301 
00302   //
00303   void showContextMenu(const QPoint& point);
00304 
00305   //
00306   void showCompletion();
00307 
00308   //
00309   void clear();
00310 
00311   //
00312   void exportHistory();
00313 
00314   //
00315   void abortScript();
00316 
00317   // Show the docu for the current line
00318   void showDocumentation();
00319 
00321   bool runCurrentScript();
00322 
00324   void loadScript();
00325   
00327   void execScript();
00328 
00330   void saveScript();
00331 
00333   void clearScript();
00334 
00335   virtual void hotkeyItem();
00336 
00337   virtual void modifyHotkeys();
00338 
00339   void appendText(const String& text, bool output = false, bool state_message = false);
00340 
00341   bool getMembers(const String& classname, QStringList& sl, const String& prefix);
00342 
00343   protected slots:
00344 
00345   virtual bool returnPressed();
00346 
00347   virtual bool completionSelected_();
00348 
00349   virtual void showHelp_();
00350 
00351   virtual void printCursorPosition_();
00352 
00353   virtual void createScript_();
00354 
00355   virtual void clearHistory_();
00356 
00357   protected:
00358 
00359   bool getClassAndMember_(String toc);
00360 
00361   void setError_(bool state);
00362 
00368   virtual void startInterpreter();
00369 
00370   virtual void paste();
00371 
00373   bool parseLine_(String line);
00374 
00375   void appendToHistory_(const String& line);
00376   
00382   void newPrompt_();
00383 
00384   bool testMultilineStart_(const String& line);
00385 
00386   //_
00387   const char* getPrompt_() const;
00388 
00389   //_
00390   bool storeScript_();
00391 
00392   //_ Wrapper for multi and single threading call
00393   String runCommand_(const String& command, bool& state);
00394 
00395   void appendText_(TextEditorWidget* te, String text);
00396 
00403   void retrieveHistoryLine_(Position index);
00404 
00405   virtual void contentsDragEnterEvent(QDragEnterEvent* e);
00406 
00407   virtual void contentsDropEvent(QDropEvent* e);
00408 
00409   bool keyPressed(QKeyEvent* e);
00410 
00411   void createMenuHelpEntry_(QMenu* menu, TextEditorWidget* text_edit, const QPoint& point);
00412 
00413   void findError_(String result);
00414 
00415   String getCurrentWord_(QTextCursor& text_cursor);
00416 
00417   QComboBox* getCompletionBox_();
00418 
00419   std::list<Hotkey>::iterator findKey_(Hotkey& hotkey);
00420 
00421   TextEditorWidget*         text_edit_, *script_output_;
00422   MyTextEdit*       script_edit_;
00423   QTabWidget*       tab_widget_;
00424   PythonHighlighter highlighter_1_, highlighter_2_;
00425   PythonValidator   validator_;
00426   MyLineEdit*       line_edit_;
00427   QComboBox*        combo_box_, *editor_combo_box_;
00428   std::list<Hotkey> hotkeys_;
00429   //                we use an own working dir to find Python Scripts
00430   String            working_dir_;
00431   bool              valid_;
00432   bool              started_startup_script_;
00433   Preferences*      preferences_;
00434 
00435   Position          current_line_;
00436   bool              multi_line_mode_;
00437   Size              multi_lines_;
00438   String            multi_line_text_;
00439   vector<String>    history_;
00440   vector<bool>      results_;
00441   Position          history_position_;
00442   String            startup_script_;
00443   PythonSettings*   python_settings_;
00444   RunPythonThread*  thread_;
00445   bool              stop_script_;
00446   Size              complete_prefix_;
00447   String            class_, member_;
00448   Position          intend_;
00449   bool              running_;
00450   bool              silent_, full_silent_;
00451   bool              script_mode_;
00452   String            current_script_;
00453 };
00454 
00455   } // namespaces 
00456 } // namespaces
00457   
00458 #endif // BALL_VIEW_WIDGETS_PYWIDGET_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines