2003-02-25 14:51:38 +00:00
|
|
|
// -*- C++ -*-
|
|
|
|
/**
|
|
|
|
* \file Dialog.h
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
|
|
|
* \author Angus Leeming
|
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef DIALOG_H
|
|
|
|
#define DIALOG_H
|
|
|
|
|
|
|
|
|
|
|
|
#include "Kernel.h"
|
|
|
|
#include "LString.h"
|
|
|
|
#include <boost/utility.hpp>
|
|
|
|
#include <boost/scoped_ptr.hpp>
|
|
|
|
|
|
|
|
|
|
|
|
class LyXView;
|
2003-03-10 03:13:28 +00:00
|
|
|
class ButtonController;
|
2003-02-25 14:51:38 +00:00
|
|
|
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \class Dialog collects the different parts of a Model-Controller-View
|
|
|
|
* split of a generic dialog together.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
class Dialog : boost::noncopyable {
|
|
|
|
public:
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \param name is the identifier given to the dialog by its parent
|
|
|
|
* container.
|
2003-02-25 14:51:38 +00:00
|
|
|
*/
|
|
|
|
Dialog(LyXView &, string const & name);
|
2003-03-10 03:13:28 +00:00
|
|
|
~Dialog();
|
2003-02-25 14:51:38 +00:00
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** the Dialog's name is the means by which a dialog identifies
|
|
|
|
* itself to the kernel.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
string const & name() const { return name_; }
|
|
|
|
|
|
|
|
//@{
|
2003-03-14 00:20:42 +00:00
|
|
|
/** These methods are publicly accessible because they are invoked
|
|
|
|
* by the View when the user presses... guess what ;-)
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
void ApplyButton();
|
|
|
|
void OKButton();
|
|
|
|
void CancelButton();
|
|
|
|
void RestoreButton();
|
|
|
|
//@}
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
//@{
|
2003-02-25 14:51:38 +00:00
|
|
|
/** These methods are publicly accessible because they are invoked
|
2003-03-14 00:20:42 +00:00
|
|
|
* by the parent container acting on commands from the kernel.
|
2003-02-25 14:51:38 +00:00
|
|
|
*/
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \param data The dialog is passed a string encoding the data
|
|
|
|
* that it is to display. This string is passed to the Controller
|
|
|
|
* which translates it into a useable form.
|
|
|
|
*/
|
|
|
|
void show(string const & data);
|
|
|
|
/// \param data \see show().
|
|
|
|
void update(string const & data);
|
|
|
|
|
2003-02-25 14:51:38 +00:00
|
|
|
void hide();
|
|
|
|
bool isVisible() const;
|
2003-03-14 00:20:42 +00:00
|
|
|
|
|
|
|
/** This function is called, for example, if the GUI colours
|
|
|
|
* have been changed.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
void redraw();
|
|
|
|
//@}
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** When applying, it's useful to know whether the dialog is about
|
2003-02-25 14:51:38 +00:00
|
|
|
* to close or not (no point refreshing the display for example).
|
|
|
|
*/
|
|
|
|
bool isClosing() const { return is_closing_; }
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** The LyX kernel is made available through this wrapper class.
|
|
|
|
* In an ideal world, it will shrink as more info is passed to the
|
|
|
|
* show() and update() methods.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
Kernel & kernel() { return kernel_; }
|
|
|
|
|
|
|
|
//@{
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Different dialogs will have different Controllers and Views.
|
|
|
|
* deriving from these base classes.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
class Controller;
|
|
|
|
class View;
|
2003-03-14 00:20:42 +00:00
|
|
|
//@}
|
2003-02-25 14:51:38 +00:00
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
//@{
|
|
|
|
/** Methods to set the Controller and View and so specialise
|
|
|
|
* to a particular dialog.
|
|
|
|
* \param ptr is stored here.
|
|
|
|
*/
|
|
|
|
void setController(Controller * ptr);
|
|
|
|
void setView(View * ptr);
|
|
|
|
//@}
|
2003-02-25 14:51:38 +00:00
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
//@{
|
|
|
|
/// Get methods for the various components making up a dialog.
|
2003-02-25 14:51:38 +00:00
|
|
|
Controller & controller() const;
|
2003-03-10 03:13:28 +00:00
|
|
|
ButtonController & bc() const;
|
2003-02-25 14:51:38 +00:00
|
|
|
View & view() const;
|
|
|
|
//@}
|
|
|
|
|
2003-03-05 11:30:35 +00:00
|
|
|
private:
|
2003-03-14 00:20:42 +00:00
|
|
|
/// Invoked by both OKButton() and ApplyButton().
|
2003-02-25 14:51:38 +00:00
|
|
|
void apply();
|
|
|
|
|
|
|
|
bool is_closing_;
|
|
|
|
Kernel kernel_;
|
|
|
|
string name_;
|
2003-03-10 03:13:28 +00:00
|
|
|
boost::scoped_ptr<ButtonController> bc_ptr_;
|
2003-02-25 14:51:38 +00:00
|
|
|
boost::scoped_ptr<Controller> controller_ptr_;
|
|
|
|
boost::scoped_ptr<View> view_ptr_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \class Dialog::Controller is an abstract base class for the Controller
|
|
|
|
* of a Model-Controller-View split of a generic dialog.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
class Dialog::Controller : boost::noncopyable {
|
|
|
|
public:
|
|
|
|
Controller(Dialog & parent) : parent_(parent) {}
|
|
|
|
virtual ~Controller() {}
|
2003-03-14 00:20:42 +00:00
|
|
|
|
|
|
|
//@{
|
|
|
|
/** These few methods are all that a generic dialog needs of a
|
|
|
|
* controller.
|
|
|
|
*/
|
|
|
|
/** \param data The controller is passed a string encoding of the
|
|
|
|
* parameters that the dialog is to display.
|
|
|
|
* \return true if the translation was successful.
|
|
|
|
*/
|
|
|
|
virtual bool initialiseParams(string const & data) = 0;
|
|
|
|
/** Invoked by Dialog::hide, allowing the controller to
|
|
|
|
* clean up its data structures.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void clearParams() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Invoked by Dialog::apply, enabling the Controller to
|
|
|
|
* dispatch its data back to the LyX kernel.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void dispatchParams() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \return true if the dialog should be shown only when
|
|
|
|
* a buffer is open
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual bool isBufferDependent() const = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \return true if the kernel should disconnect the dialog from
|
|
|
|
* a particular inset after the data has been applied to it.
|
|
|
|
* Clearly this makes sense only for dialogs modifying the contents
|
|
|
|
* of an inset :-)
|
|
|
|
* In practise, only a very few dialogs (e.g. the citation dialog)
|
|
|
|
* return true.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual bool disconnectOnApply() const { return false; }
|
2003-03-14 00:20:42 +00:00
|
|
|
//@}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
//@{
|
|
|
|
/** Enable the derived classes to access the other parts of the
|
|
|
|
* whole.
|
|
|
|
*/
|
2003-03-05 11:30:35 +00:00
|
|
|
Dialog & dialog() { return parent_; }
|
|
|
|
Dialog const & dialog() const { return parent_; }
|
2003-03-14 00:20:42 +00:00
|
|
|
|
2003-02-25 14:51:38 +00:00
|
|
|
Kernel & kernel() { return parent_.kernel(); }
|
|
|
|
Kernel const & kernel() const { return parent_.kernel(); }
|
2003-03-14 00:20:42 +00:00
|
|
|
//@}
|
2003-02-25 14:51:38 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
Dialog & parent_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** \class Dialog::View is an abstract base class to the View
|
|
|
|
* of a Model-Controller-View split of a generic dialog.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
class Dialog::View : boost::noncopyable {
|
|
|
|
public:
|
|
|
|
View(Dialog & parent) : p_(parent) {}
|
|
|
|
virtual ~View() {}
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
//@{
|
|
|
|
/** These few methods are all that a generic dialog needs of a
|
|
|
|
* view.
|
|
|
|
*/
|
|
|
|
/** A request to modify the data structures stored by the
|
|
|
|
* accompanying Controller in preparation for their dispatch to
|
|
|
|
* the LyX kernel.
|
|
|
|
* Invoked by Dialog::apply.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void apply() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Hide the dialog from sight
|
|
|
|
* Invoked by Dialog::hide.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void hide() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Redraw the dialog (e.g. if the colors have been remapped).
|
|
|
|
* Invoked by Dialog::redraw.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void redraw() {}
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Create the dialog if necessary, update it and display it.
|
|
|
|
* Invoked by Dialog::show.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void show() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Update the display of the dialog whilst it is still visible.
|
|
|
|
* Invoked by Dialog::update.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual void update() = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
/// \return true if the dialog is visible.
|
2003-02-25 14:51:38 +00:00
|
|
|
virtual bool isVisible() const = 0;
|
2003-03-14 00:20:42 +00:00
|
|
|
//@}
|
2003-02-25 14:51:38 +00:00
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
/** Defaults to nothing. Can be used by the Controller, however, to
|
|
|
|
* indicate to the View that something has changed and that the
|
2003-02-25 14:51:38 +00:00
|
|
|
* dialog therefore needs updating.
|
|
|
|
*/
|
|
|
|
virtual void partialUpdate(int) {}
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
//@{
|
|
|
|
/** Enable the derived classes to access the other parts of the
|
|
|
|
* whole.
|
|
|
|
*/
|
2003-02-25 14:51:38 +00:00
|
|
|
Dialog & dialog() { return p_; }
|
|
|
|
Dialog const & dialog() const { return p_; }
|
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
protected:
|
2003-02-25 14:51:38 +00:00
|
|
|
Kernel & kernel() { return p_.kernel(); }
|
|
|
|
Kernel const & kernel() const { return p_.kernel(); }
|
|
|
|
|
|
|
|
Controller & getController() { return p_.controller(); }
|
|
|
|
Controller const & getController() const { return p_.controller(); }
|
|
|
|
|
2003-03-10 03:13:28 +00:00
|
|
|
ButtonController & bc() { return p_.bc(); }
|
|
|
|
ButtonController const & bc() const { return p_.bc(); }
|
2003-03-14 00:20:42 +00:00
|
|
|
//@}
|
2003-03-10 03:13:28 +00:00
|
|
|
|
2003-03-14 00:20:42 +00:00
|
|
|
private:
|
2003-02-25 14:51:38 +00:00
|
|
|
///
|
|
|
|
Dialog & p_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // DIALOG_H
|