A clean-up of the minibuffer code; see xforms/ChangeLog. Qt code seems Ok

in this regard.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6678 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2003-04-02 09:23:24 +00:00
parent b92fba65e8
commit c93bea2449
8 changed files with 115 additions and 88 deletions

View File

@ -49,7 +49,7 @@ LyXView::LyXView()
autosave_timeout_(new Timeout(5000)), autosave_timeout_(new Timeout(5000)),
lyxfunc_(new LyXFunc(this)), lyxfunc_(new LyXFunc(this)),
dialogs_(new Dialogs(*this)), dialogs_(new Dialogs(*this)),
controlcommand_(new ControlCommandBuffer(getLyXFunc())) controlcommand_(new ControlCommandBuffer(*this))
{ {
lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl; lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl;
} }

View File

@ -1,3 +1,10 @@
2003-04-02 Angus Leeming <leeming@lyx.org>
* ControlCommandBuffer.[Ch] (c-tor): passed a LyXView & rather than
a LyXFunc &. Ensuing changes elsewhere.
(getCurrentState): new method, returning bufferview_func's
currentState (needs the currently active BufferView).
2003-03-31 John Levon <levon@movementarian.org> 2003-03-31 John Levon <levon@movementarian.org>
* ControlPrint.C: * ControlPrint.C:

View File

@ -12,13 +12,14 @@
#include <config.h> #include <config.h>
#include "ControlCommandBuffer.h" #include "ControlCommandBuffer.h"
#include "bufferview_funcs.h"
#include "debug.h"
#include "lyxfunc.h"
#include "LyXAction.h"
#include "frontends/LyXView.h"
#include "support/lyxalgo.h" #include "support/lyxalgo.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "LyXAction.h"
#include "lyxfunc.h"
#include "debug.h"
using std::vector; using std::vector;
using std::back_inserter; using std::back_inserter;
@ -39,8 +40,8 @@ struct prefix_p {
} // end of anon namespace } // end of anon namespace
ControlCommandBuffer::ControlCommandBuffer(LyXFunc & lf) ControlCommandBuffer::ControlCommandBuffer(LyXView & lv)
: lyxfunc_(lf), history_pos_(history_.end()) : lv_(lv), history_pos_(history_.end())
{ {
transform(lyxaction.func_begin(), lyxaction.func_end(), transform(lyxaction.func_begin(), lyxaction.func_end(),
back_inserter(commands_), lyx::firster()); back_inserter(commands_), lyx::firster());
@ -67,6 +68,12 @@ string const ControlCommandBuffer::historyDown()
} }
string const ControlCommandBuffer::getCurrentState() const
{
return currentState(lv_.view().get());
}
vector<string> const vector<string> const
ControlCommandBuffer::completions(string const & prefix, string & new_prefix) ControlCommandBuffer::completions(string const & prefix, string & new_prefix)
{ {
@ -113,5 +120,5 @@ void ControlCommandBuffer::dispatch(string const & str)
history_.push_back(str); history_.push_back(str);
history_pos_ = history_.end(); history_pos_ = history_.end();
lyxfunc_.dispatch(str, true); lv_.getLyXFunc().dispatch(str, true);
} }

View File

@ -19,7 +19,7 @@
#include <vector> #include <vector>
class LyXFunc; class LyXView;
/** /**
* ControlCommandBuffer * ControlCommandBuffer
@ -29,7 +29,7 @@ class LyXFunc;
*/ */
class ControlCommandBuffer { class ControlCommandBuffer {
public: public:
ControlCommandBuffer(LyXFunc & lf); ControlCommandBuffer(LyXView & lv);
/// return the previous history entry if any /// return the previous history entry if any
string const historyUp(); string const historyUp();
@ -37,6 +37,9 @@ public:
/// return the next history entry if any /// return the next history entry if any
string const historyDown(); string const historyDown();
/// return the font and depth in the active BufferView as a message.
string const getCurrentState() const;
/// return the possible completions /// return the possible completions
std::vector<string> const completions(string const & prefix, std::vector<string> const completions(string const & prefix,
string & new_prefix); string & new_prefix);
@ -44,8 +47,8 @@ public:
/// dispatch a command /// dispatch a command
void dispatch(string const & str); void dispatch(string const & str);
private: private:
/// controlling lyxfunc /// controlling LyXView
LyXFunc & lyxfunc_; LyXView & lv_;
/// available command names /// available command names
std::vector<string> commands_; std::vector<string> commands_;

View File

@ -1,3 +1,17 @@
2003-04-02 Angus Leeming <leeming@lyx.org>
* XFormsView.C (create_form_form_main): no longer pass this to the
XMinibuffer c-tor.
* XMiniBuffer.[Ch]: something of a clean-up.
(c-tor): no longer requires a XFormsView * in the argument list.
(create_input_box): moved out of the class.
(the_buffer_, input_obj_): replaced by a single input_. Having two
pointers to the same FL_OBJECT was clearly barmy.
(idle_timeout): don't access bufferview_func's currentState direct
but rather use the new controller method. Means that XMinibuffer
knows nothing about the LyX kernel.
2003-04-01 John Levon <levon@movementarian.org> 2003-04-01 John Levon <levon@movementarian.org>
* Alert_pimpl.C: format error messages * Alert_pimpl.C: format error messages

View File

@ -151,7 +151,7 @@ void XFormsView::create_form_form_main(int width, int height)
width - 3 * air, workheight)); width - 3 * air, workheight));
::current_view = bufferview_.get(); ::current_view = bufferview_.get();
minibuffer_.reset(new XMiniBuffer(this, *controlcommand_, minibuffer_.reset(new XMiniBuffer(*controlcommand_,
air, height - (25 + air), width - (2 * air), 25)); air, height - (25 + air), width - (2 * air), 25));
// assign an icon to main form // assign an icon to main form

View File

@ -12,16 +12,13 @@
#include <config.h> #include <config.h>
#include "frontends/xforms/DropDown.h"
#include "frontends/xforms/XFormsView.h"
#include "frontends/controllers/ControlCommandBuffer.h"
#include "frontends/Timeout.h"
#include "XMiniBuffer.h" #include "XMiniBuffer.h"
#include "DropDown.h"
#include "ControlCommandBuffer.h"
#include "gettext.h" #include "gettext.h"
#include "debug.h"
#include "bufferview_funcs.h" #include "frontends/Timeout.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
@ -35,12 +32,21 @@ using std::endl;
using std::vector; using std::vector;
XMiniBuffer::XMiniBuffer(XFormsView * v, ControlCommandBuffer & control, namespace {
FL_Coord x, FL_Coord y, FL_Coord h, FL_Coord w)
: controller_(control), view_(v), /// This creates the input widget for the minibuffer
info_shown_(false) FL_OBJECT * create_input_box(void * parent, int type,
FL_Coord, FL_Coord, FL_Coord, FL_Coord);
} // namespace anon
XMiniBuffer::XMiniBuffer(ControlCommandBuffer & control,
FL_Coord x, FL_Coord y, FL_Coord h, FL_Coord w)
: controller_(control),
info_shown_(false)
{ {
input_obj_ = create_input_box(FL_NORMAL_INPUT, x, y, h, w); input_ = create_input_box(this, FL_NORMAL_INPUT, x, y, h, w);
info_timer_.reset(new Timeout(1500)); info_timer_.reset(new Timeout(1500));
idle_timer_.reset(new Timeout(6000)); idle_timer_.reset(new Timeout(6000));
info_con = info_timer_->timeout.connect(boost::bind(&XMiniBuffer::info_timeout, this)); info_con = info_timer_->timeout.connect(boost::bind(&XMiniBuffer::info_timeout, this));
@ -58,7 +64,7 @@ XMiniBuffer::~XMiniBuffer()
// thanks for nothing, xforms (recursive creation not allowed) // thanks for nothing, xforms (recursive creation not allowed)
void XMiniBuffer::dd_init() void XMiniBuffer::dd_init()
{ {
dropdown_.reset(new DropDown(the_buffer_)); dropdown_.reset(new DropDown(input_));
result_con = dropdown_->result.connect(boost::bind(&XMiniBuffer::set_complete_input, this, _1)); result_con = dropdown_->result.connect(boost::bind(&XMiniBuffer::set_complete_input, this, _1));
keypress_con = dropdown_->keypress.connect(boost::bind(&XMiniBuffer::append_char, this, _1)); keypress_con = dropdown_->keypress.connect(boost::bind(&XMiniBuffer::append_char, this, _1));
} }
@ -134,14 +140,14 @@ int XMiniBuffer::peek_event(FL_OBJECT * ob, int event,
set_input(new_input); set_input(new_input);
int x,y,w,h; int x,y,w,h;
fl_get_wingeometry(fl_get_real_object_window(the_buffer_), fl_get_wingeometry(fl_get_real_object_window(input_),
&x, &y, &w, &h); &x, &y, &w, &h);
// asynchronous completion // asynchronous completion
int const air = the_buffer_->x; int const air = input_->x;
x += air; x += air;
y += h - (the_buffer_->h + air); y += h - (input_->h + air);
w = the_buffer_->w; w = input_->w;
dropdown_->select(comp, x, y, w); dropdown_->select(comp, x, y, w);
return 1; return 1;
} }
@ -172,46 +178,11 @@ int XMiniBuffer::peek_event(FL_OBJECT * ob, int event,
} }
extern "C" {
static
int C_XMiniBuffer_peek_event(FL_OBJECT * ob, int event,
FL_Coord, FL_Coord,
int key, void * xev)
{
XMiniBuffer * mini = static_cast<XMiniBuffer*>(ob->u_vdata);
return mini->peek_event(ob, event, key,
static_cast<XEvent *>(xev));
}
}
FL_OBJECT * XMiniBuffer::create_input_box(int type, FL_Coord x, FL_Coord y,
FL_Coord w, FL_Coord h)
{
FL_OBJECT * obj;
the_buffer_ = obj = fl_add_input(type, x, y, w, h, "");
fl_set_object_boxtype(obj, FL_DOWN_BOX);
fl_set_object_resize(obj, FL_RESIZE_ALL);
fl_set_object_gravity(obj, SouthWestGravity, SouthEastGravity);
fl_set_object_color(obj, FL_MCOL, FL_MCOL);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
// To intercept Up, Down, Table for history
fl_set_object_prehandler(obj, C_XMiniBuffer_peek_event);
obj->u_vdata = this;
obj->wantkey = FL_KEY_TAB;
return obj;
}
void XMiniBuffer::freeze() void XMiniBuffer::freeze()
{ {
// we must prevent peek_event, or we get an unfocus() when the // we must prevent peek_event, or we get an unfocus() when the
// containing form gets destroyed // containing form gets destroyed
fl_set_object_prehandler(input_obj_, 0); fl_set_object_prehandler(input_, 0);
} }
@ -229,7 +200,7 @@ void XMiniBuffer::show_info(string const & info, string const & input, bool appe
void XMiniBuffer::idle_timeout() void XMiniBuffer::idle_timeout()
{ {
set_input(currentState(view_->view().get())); set_input(controller_.getCurrentState());
} }
@ -242,7 +213,7 @@ void XMiniBuffer::info_timeout()
bool XMiniBuffer::isEditingMode() const bool XMiniBuffer::isEditingMode() const
{ {
return the_buffer_->focus; return input_->focus;
} }
@ -250,14 +221,14 @@ void XMiniBuffer::messageMode(bool on)
{ {
set_input(""); set_input("");
if (!on) { if (!on) {
fl_activate_object(the_buffer_); fl_activate_object(input_);
fl_set_focus_object(view_->getForm(), the_buffer_); fl_set_focus_object(input_->form, input_);
redraw(); redraw();
idle_timer_->stop(); idle_timer_->stop();
} else { } else {
if (isEditingMode()) { if (isEditingMode()) {
// focus back to the workarea // focus back to the workarea
fl_set_focus_object(view_->getForm(), 0); fl_set_focus_object(input_->form, 0);
idle_timer_->start(); idle_timer_->start();
} }
} }
@ -266,7 +237,7 @@ void XMiniBuffer::messageMode(bool on)
void XMiniBuffer::redraw() void XMiniBuffer::redraw()
{ {
fl_redraw_object(the_buffer_); fl_redraw_object(input_);
XFlush(fl_display); XFlush(fl_display);
} }
@ -276,12 +247,12 @@ void XMiniBuffer::append_char(char c)
if (!c || !isprint(c)) if (!c || !isprint(c))
return; return;
char const * tmp = fl_get_input(the_buffer_); char const * tmp = fl_get_input(input_);
string str = tmp ? tmp : ""; string str = tmp ? tmp : "";
str += c; str += c;
fl_set_input(the_buffer_, str.c_str()); fl_set_input(input_, str.c_str());
} }
@ -304,5 +275,38 @@ void XMiniBuffer::message(string const & str)
void XMiniBuffer::set_input(string const & str) void XMiniBuffer::set_input(string const & str)
{ {
fl_set_input(the_buffer_, str.c_str()); fl_set_input(input_, str.c_str());
} }
namespace {
extern "C"
int C_XMiniBuffer_peek_event(FL_OBJECT * ob, int event,
FL_Coord, FL_Coord,
int key, void * xev)
{
XMiniBuffer * mini = static_cast<XMiniBuffer*>(ob->u_vdata);
return mini->peek_event(ob, event, key, static_cast<XEvent *>(xev));
}
FL_OBJECT * create_input_box(void * parent, int type,
FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h)
{
FL_OBJECT * obj = fl_add_input(type, x, y, w, h, "");
fl_set_object_boxtype(obj, FL_DOWN_BOX);
fl_set_object_resize(obj, FL_RESIZE_ALL);
fl_set_object_gravity(obj, SouthWestGravity, SouthEastGravity);
fl_set_object_color(obj, FL_MCOL, FL_MCOL);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
// To intercept Up, Down, Table for history
fl_set_object_prehandler(obj, C_XMiniBuffer_peek_event);
obj->u_vdata = parent;
obj->wantkey = FL_KEY_TAB;
return obj;
}
} // namespace anon

View File

@ -16,10 +16,10 @@
#include FORMS_H_LOCATION #include FORMS_H_LOCATION
#include "LString.h"
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
#include <boost/signals/connection.hpp> #include <boost/signals/connection.hpp>
class DropDown; class DropDown;
class ControlCommandBuffer; class ControlCommandBuffer;
class Timeout; class Timeout;
@ -28,7 +28,7 @@ class Timeout;
class XMiniBuffer { class XMiniBuffer {
public: public:
/// ///
XMiniBuffer(XFormsView * o, ControlCommandBuffer & control, XMiniBuffer(ControlCommandBuffer & control,
FL_Coord x, FL_Coord y, FL_Coord h, FL_Coord w); FL_Coord x, FL_Coord y, FL_Coord h, FL_Coord w);
/// ///
@ -74,9 +74,6 @@ private:
/// set the minibuffer content in editing mode /// set the minibuffer content in editing mode
void set_input(string const &); void set_input(string const &);
/// This creates the input widget for the minibuffer
FL_OBJECT * create_input_box(int, FL_Coord, FL_Coord, FL_Coord, FL_Coord);
/// go into message mode /// go into message mode
void messageMode(bool on = true); void messageMode(bool on = true);
@ -100,18 +97,13 @@ private:
boost::signals::connection result_con; boost::signals::connection result_con;
/// ///
boost::signals::connection keypress_con; boost::signals::connection keypress_con;
/// This is the input widget object
FL_OBJECT * the_buffer_;
/// the input box /// This is the input widget object
FL_OBJECT * input_obj_; FL_OBJECT * input_;
/// the controller we use /// the controller we use
ControlCommandBuffer & controller_; ControlCommandBuffer & controller_;
/// the lyx view
XFormsView * view_;
/// stored input when showing info /// stored input when showing info
string stored_input_; string stored_input_;