]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormBase.h
Introduce LFUN_PRINT.
[lyx.git] / src / frontends / xforms / FormBase.h
index 4b46673d077084da33c438dc7d55ff36120ca053..3ed7cf1d2db552f1d90d469ebc119e8ee8806344 100644 (file)
 // -*- C++ -*-
-/* This file is part of
- * ====================================================== 
+/**
+ * \file FormBase.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- *           LyX, The Document Processor
+ * \author Angus Leeming
  *
- *           Copyright 2000 The LyX Team.
- *
- * ======================================================
+ * Full author contact details are available in file CREDITS.
+ */
+
+/* A base class for the MCV-ed xforms dialogs.
  */
 
 #ifndef FORMBASE_H
 #define FORMBASE_H
 
-#include "DialogBase.h"
-#include "LString.h"
-#include <boost/utility.hpp>
-#include FORMS_H_LOCATION
-#include "ButtonController.h"
-#include "gettext.h"
-#include <sigc++/signal_system.h> // temporary
 
-class Buffer;
-class Dialogs;
-class LyXView;
+#include "ViewBase.h"
+#include "ButtonPolicies.h"
+#include "forms_fwd.h"
+
+#include <boost/scoped_ptr.hpp>
+#include <X11/Xlib.h> // for Pixmap
+
+class xformsBC;
+class Tooltips;
 
-#ifdef __GNUG__
-#pragma interface
-#endif
 
 /** This class is an XForms GUI base class.
-    It is meant to be used solely as the parent class to FormBaseBI
-    and FormBaseBD.
-    @author Angus Leeming
  */
-
-class FormBase : public DialogBase, public noncopyable {
+class FormBase : public ViewBase
+{
 public:
-       /// Callback functions
-       static  int WMHideCB(FL_FORM *, void *);
-       ///
-       static void ApplyCB(FL_OBJECT *, long);
-       ///
-       static void OKCB(FL_OBJECT *, long);
        ///
-       static void CancelCB(FL_OBJECT *, long);
+       FormBase(std::string const &, bool allowResize);
        ///
-       static void InputCB(FL_OBJECT *, long);
+       virtual ~FormBase();
+
+       /** Input callback function.
+        *  Invoked only by the xforms callback interface
+        */
+       void InputCB(FL_OBJECT *, long);
+
+       /** Message callback function.
+        *  Invoked only by the xforms callback interface
+        */
+       void MessageCB(FL_OBJECT *, int event);
+
+       /** Prehandler callback function.
+        *  Invoked only by the xforms callback interface
+        */
+       void PrehandlerCB(FL_OBJECT * ob, int event, int key);
+
        ///
-       static void RestoreCB(FL_OBJECT *, long);
+       Tooltips & tooltips();
 
-protected: // methods
+protected:
+       /// Build the dialog
+       virtual void build() = 0;
+       /// Hide the dialog.
+       virtual void hide();
+       /// Create the dialog if necessary, update it and display it.
+       virtual void show();
        ///
-       FormBase(LyXView *, Dialogs *, string const &,
-                ButtonPolicy *, char const *, char const *);
+       virtual bool isVisible() const;
+
+       /** Prepare the way to:
+        *  1. display feedback as the mouse moves over ob. This feedback will
+        *  typically be rather more verbose than just a tooltip.
+        *  2. activate the button controller after a paste with the middle
+        *  mouse button.
+        */
+       static void setPrehandler(FL_OBJECT * ob);
+
+       /** Pass the class a pointer to the message_widget so that it can
+           post the message */
+       void setMessageWidget(FL_OBJECT * message_widget);
+
+       /** Send the warning message from the daughter class to the
+           message_widget direct. The message will persist till the mouse
+           movesto a new object. */
+       void postWarning(std::string const & warning);
+       /// Reset the message_widget_
+       void clearMessage();
+
        ///
-       virtual ~FormBase();
+       xformsBC & bcview();
+
+private:
+       /// Pointer to the actual instantiation of xform's form
+       virtual FL_FORM * form() const = 0;
+       /// Filter the inputs on callback from xforms
+       virtual ButtonPolicy::SMInput input(FL_OBJECT *, long);
 
        /** Redraw the form (on receipt of a Signal indicating, for example,
-           that the xform colours have been re-mapped).
-           Must be virtual because dialogs with tabbed folders will need to
-           redraw the form for each tab.
-       */
+        *  that the xform colors have been re-mapped).
+        */
        virtual void redraw();
 
-       /// Create the dialog if necessary, update it and display it.
-       void show();
-       /// Hide the dialog.
-       virtual void hide();
-       /// Update the dialog.
-       virtual void update() {}
-       /// Connect signals. Also perform any necessary initialisation.
-       virtual void connect();
-       /// Disconnect signals. Also perform any necessary housekeeping.
-       virtual void disconnect();
-       /// Build the dialog
-       virtual void build() = 0;
-       /** Filter the inputs on callback from xforms
-           Return true if inputs are valid.
+       /** Called on the first show() request, initialising various bits and
+        *  pieces.
         */
-       virtual bool input( FL_OBJECT *, long) {
-               return true;
-       }
-       /// Apply from dialog (modify or create inset)
-       virtual void apply() {}
-       /// OK from dialog
-       virtual void ok() {
-               apply();
-               hide();
-       }
-       /// Cancel from dialog
-       virtual void cancel() {
-               hide();
-       }
-       /// Restore from dialog
-       virtual void restore() {
-               update();
-       }
-       /// Pointer to the actual instantiation of xform's form
-       virtual FL_FORM * form() const = 0;
+       void prepare_to_show();
 
-       /** Which LyXFunc do we use?
-           We could modify Dialogs to have a visible LyXFunc* instead and
-           save a couple of bytes per dialog.
-       */
-       LyXView * lv_;
-       /// Useable even in derived-class's const functions.
-       mutable ButtonController bc_;
-       /// Used so we can get at the signals we have to connect to.
-       Dialogs * d_;
-       /// Hide connection.
-       Connection h_;
-       /// Redraw connection.
-       Connection r_;
-       /// dialog title, displayed by WM.
-       string title;
-private:
+       /** Get the feedback message for ob.
+           Called if warning_posted_ == false. */
+       virtual std::string const getFeedback(FL_OBJECT * /* ob */)
+               { return std::string(); }
+
+       /// Post the feedback message for ob to message_widget_
+       void postMessage(std::string const & message);
+
+       /** Variable used to decide whether to remove the existing feedback
+           message or not (if it is in fact a warning) */
+       bool warning_posted_;
+       /// The widget to display the feedback
+       FL_OBJECT * message_widget_;
+
+       /// The dialog's minimum allowable dimensions.
+       int minw_;
        ///
-       ButtonPolicy * bp_;
-public:
-       /// Overcome a dumb xforms sizing bug
-       mutable int minw_;
+       int minh_;
+       /// Can the dialog be resized after it has been created?
+       bool allow_resize_;
+       /// Passed to the window manager to give a pretty little symbol ;-)
+       Pixmap icon_pixmap_;
+       ///
+       Pixmap icon_mask_;
        ///
-       mutable int minh_;
+       Tooltips * tooltips_;
 };
 
 
-/** This class is an XForms GUI base class for Buffer Independent dialogs.
-    Such dialogs do not require an update Connection although they may use
-    an update() function which is also supported by restore().
- */
-class FormBaseBI : public FormBase {
+template <class Dialog>
+class FormDB: public FormBase
+{
 protected:
-       /// Constructor
-       FormBaseBI(LyXView *, Dialogs *, string const &,
-                  ButtonPolicy * bp,
-                  char const * close = N_("Close"),
-                  char const * cancel = N_("Cancel"));
-
-       /// Connect signals
-       virtual void connect();
+       ///
+       FormDB(std::string const &, bool allowResize=true);
+       /// Pointer to the actual instantiation of xform's form
+       virtual FL_FORM * form() const;
+       /// Real GUI implementation.
+       boost::scoped_ptr<Dialog> dialog_;
 };
 
 
-/** This class is an XForms GUI base class for Buffer Dependent dialogs
- */
-class FormBaseBD : public FormBase {
+template <class Dialog>
+FormDB<Dialog>::FormDB(std::string const & t, bool allowResize)
+       : FormBase(t, allowResize)
+{}
+
+
+template <class Dialog>
+FL_FORM * FormDB<Dialog>::form() const
+{
+       return dialog_.get() ? dialog_->form : 0;
+}
+
+
+template <class Controller, class Base>
+class FormCB: public Base
+{
+public:
+       /// The parent controller
+       Controller & controller();
+       ///
+       Controller const & controller() const;
+
 protected:
-       /// Constructor
-       FormBaseBD(LyXView *, Dialogs *, string const &,
-                  ButtonPolicy * bp,
-                  char const * close = N_("Close"),
-                  char const * cancel = N_("Cancel"));
-
-       /// Connect signals
-       virtual void connect();
-       /// Disconnect signals
-       virtual void disconnect();
-       /// bool indicates if a buffer switch took place
-       virtual void updateSlot(bool) { update(); }
-
-       /// Update connection.
-       Connection u_;
+       ///
+       FormCB(std::string const &, bool allowResize = true);
 };
 
 
-#endif
+template <class Controller, class Base>
+FormCB<Controller, Base>::FormCB(std::string const & t, bool allowResize)
+       : Base(t, allowResize)
+{}
+
+
+template <class Controller, class Base>
+Controller & FormCB<Controller, Base>::controller()
+{
+       return static_cast<Controller &>(this->getController());
+}
+
+
+template <class Controller, class Base>
+Controller const & FormCB<Controller, Base>::controller() const
+{
+       return static_cast<Controller const &>(this->getController());
+}
+
+
+#endif // FORMBASE_H