3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include <libglademm.h>
16 #include "ControlMath.h"
17 #include "GMathDelim.h"
18 #include "support/filetools.h"
19 #include "support/lstrings.h"
28 enum enumDelimType {LEFT, RIGHT, SINGLE};
30 int const delimType[] = {
32 LEFT, RIGHT, LEFT, RIGHT, SINGLE, SINGLE, LEFT, RIGHT,LEFT, RIGHT,
35 LEFT, RIGHT, LEFT, RIGHT, SINGLE, SINGLE, LEFT, RIGHT, SINGLE, SINGLE,
39 int const delimRevert[] = {
40 1,0,3,2,4,5,7,6,9,8,10,11,
41 13,12,15,14,16,17,19,18,20,21,22
44 char const * delimValues[] = {
45 "(", ")", "lceil", "rceil", "uparrow", "Uparrow",
46 "[", "]", "lfloor", "rfloor", "updownarrow", "Updownarrow",
47 "{", "}", "/", "backslash", "downarrow", "Downarrow",
48 "langle", "rangle", "|", "Vert", ".", 0
51 int const delimTblRows = 2;
53 int const delimTblCols = 12;
55 int const delimMax = 23;
57 GXpmBtnTbl::XbmData xbm =
65 inline int index(int row, int col)
67 return row * delimTblCols + col;
70 inline int indexToRow(int index)
72 return index / delimTblCols;
75 inline int indexToCol(int index)
77 return index % delimTblCols;
82 GMathDelim::GMathDelim(Dialog & parent) :
83 GViewCB<ControlMath, GViewGladeB>(parent, _("Math Delimiters")),
84 delimTbl_(delimTblRows, delimTblCols, xbm)
89 void GMathDelim::doBuild()
91 string const gladeName =
92 lyx::support::LibFileSearch("glade", "mathDelim", "glade");
93 xml_ = Gnome::Glade::Xml::create(gladeName);
98 xml_->get_widget("Left", left_);
99 xml_->get_widget("Right", right_);
100 xml_->get_widget("Both", both_);
101 xml_->get_widget("OK", ok);
102 xml_->get_widget("Apply", apply);
103 xml_->get_widget("Close", close);
104 xml_->get_widget("Demo", demo_);
108 // Initialize demo button pixmap to "()" as found in images/delim0.xpm
112 xml_->get_widget("Box", box);
113 delimTbl_.signalClicked().connect(
114 SigC::slot(*this, &GMathDelim::onDelimTblClicked));
116 box->children().push_back(
117 Gtk::Box_Helpers::Element(delimTbl_));
118 bcview().addReadOnly(&delimTbl_);
119 bcview().addReadOnly(left_);
120 bcview().addReadOnly(right_);
121 bcview().addReadOnly(both_);
122 bcview().addReadOnly(demo_);
123 left_->signal_clicked().connect(
124 SigC::slot(*this, &GMathDelim::onRadioClicked));
125 right_->signal_clicked().connect(
126 SigC::slot(*this, &GMathDelim::onRadioClicked));
127 both_->signal_clicked().connect(
128 SigC::slot(*this, &GMathDelim::onRadioClicked));
132 void GMathDelim::setDemoPixmap()
135 pixmap_ = Gdk::Pixmap::create_from_xpm(demo_->get_colormap(),
138 image = SigC::manage(new Gtk::Image(pixmap_, mask_));
141 gcMask_ = Gdk::GC::create(mask_);
145 void GMathDelim::apply()
147 std::ostringstream os;
148 os << delimValues[leftSel_] << ' ' << delimValues[rightSel_];
149 controller().dispatchDelim(os.str());
153 void GMathDelim::update()
159 void GMathDelim::onDelimTblClicked(int row, int col)
161 int const sel = index(row, col);
164 bool left = left_->get_active();
165 bool right = right_->get_active();
166 bool both = both_->get_active();
172 if (delimType[sel] == LEFT) {
174 rightSel_ = delimRevert[sel];
175 } else if (delimType[sel] == RIGHT) {
177 leftSel_ = delimRevert[sel];
179 leftSel_ = rightSel_ = sel;
185 void GMathDelim::updateDemoPixmap()
187 int const delimWidth = delim_width / delimTblCols;
188 Glib::RefPtr<Gdk::Pixmap> pixmap;
189 Glib::RefPtr<Gdk::Bitmap> mask;
190 GXpmBtnTbl::GXpmBtn * btn = delimTbl_.getBtn(indexToRow(leftSel_),
191 indexToCol(leftSel_));
192 pixmap = btn->getPixmap();
193 mask = btn->getMask();
194 pixmap_->draw_drawable(left_->get_style()->get_black_gc(),
198 mask_->draw_drawable(gcMask_,
202 btn = delimTbl_.getBtn(indexToRow(rightSel_),
203 indexToCol(rightSel_));
204 pixmap = btn->getPixmap();
205 mask = btn->getMask();
206 pixmap_->draw_drawable(left_->get_style()->get_black_gc(),
210 mask_->draw_drawable(gcMask_,
214 int x, y, width, height, depth;
215 demo_->get_window()->get_geometry(x, y, width, height, depth);
216 demo_->get_window()->invalidate_rect(
217 Gdk::Rectangle(x, y, width, height), true);
222 void GMathDelim::onRadioClicked()