]> git.lyx.org Git - lyx.git/blob - src/frontends/gnome/FormToc.C
Dekel's lyxrc.example; Angus's FormDocument; John's build-listerrors; POTFILES.in...
[lyx.git] / src / frontends / gnome / FormToc.C
1 // -*- C++ -*-
2 /* This file is part of
3  * ====================================================== 
4  *
5  *           LyX, The Document Processor
6  *
7  *           Copyright 2000 The LyX Team.
8  *
9  * ======================================================
10  */
11
12 #include <config.h>
13 #include <vector>
14
15 #ifdef __GNUG__
16 #pragma implementation
17 #endif
18
19
20 #include "gettext.h"
21 #include "Dialogs.h"
22 #include "FormToc.h"
23 #include "LyXView.h"
24 #include "form_toc.h"
25 #include "lyxtext.h"
26
27 extern "C" {
28 #include "diatoc_interface.h"
29 #include "support.h"
30 }
31
32 #include <gtk--/base.h>
33 #include <gtk--/button.h>
34 #include <gtk--/label.h>
35 #include <gtk--/scrolledwindow.h>
36 #include <gtk--/menu.h>
37 #include <gtk--/menuitem.h>
38
39 using SigC::bind;
40
41 FormToc::FormToc(LyXView * lv, Dialogs * d)
42   : lv_(lv), d_(d), inset_(0), u_(0), h_(0), ih_(0), dialog_(NULL), ignore_callback_(false)
43 {
44   // let the dialog be shown
45   // These are permanent connections so we won't bother
46   // storing a copy because we won't be disconnecting.
47   d->showTOC.connect(slot(this, &FormToc::showInset));
48   d->createTOC.connect(slot(this, &FormToc::createInset));
49 }
50
51
52 FormToc::~FormToc()
53 {
54   hide();
55 }
56
57 void FormToc::showInset( InsetCommand * const inset )
58 {
59   if( dialog_!=NULL || inset == 0 ) return;
60   
61   inset_ = inset;
62   ih_ = inset_->hide.connect(slot(this, &FormToc::hide));
63   
64   params = inset->params();
65   show();
66 }
67
68
69 void FormToc::createInset( string const & arg )
70 {
71   if( dialog_!=NULL ) return;
72   
73   params.setFromString( arg );
74   show();
75 }
76
77
78 void FormToc::show()
79 {
80   Gtk::Button * b_refresh;
81   Gtk::Button * b_close;
82   Gtk::ScrolledWindow *scrolled_window;
83
84   if (!dialog_)
85     {
86       GtkWidget * pd = create_DiaToc();
87
88       dialog_ = Gtk::wrap( GNOME_DIALOG(pd) );
89       choice_ = Gtk::wrap( GTK_OPTION_MENU( lookup_widget(pd, "choice") ) );
90       scrolled_window = Gtk::wrap( GTK_SCROLLED_WINDOW( lookup_widget(pd, "scrolledwindow") ) );
91
92       list_ = manage( new Gtk::List() );
93       scrolled_window->add_with_viewport(*list_);
94
95       // fill choice
96       Gtk::MenuItem * e;
97
98       choice_->get_menu()->items().clear();
99       
100       e = manage( new Gtk::MenuItem(N_("Table of Contents")) );
101       e->activate.connect(bind<Buffer::TocType>(slot(this, &FormToc::changeList), Buffer::TOC_TOC));
102       choice_->get_menu()->append( *e );
103
104       e = manage( new Gtk::MenuItem(N_("List of Figures")) );
105       e->activate.connect(bind<Buffer::TocType>(slot(this, &FormToc::changeList), Buffer::TOC_LOF));
106       choice_->get_menu()->append( *e );
107
108       e = manage( new Gtk::MenuItem(N_("List of Tables")) );
109       e->activate.connect(bind<Buffer::TocType>(slot(this, &FormToc::changeList), Buffer::TOC_LOT));
110       choice_->get_menu()->append( *e );
111
112       e = manage( new Gtk::MenuItem(N_("List of Algorithms")) );
113       e->activate.connect(bind<Buffer::TocType>(slot(this, &FormToc::changeList), Buffer::TOC_LOA));
114       choice_->get_menu()->append( *e );
115
116       // wrap buttons and connect slots
117       b_refresh = Gtk::wrap( GTK_BUTTON( lookup_widget(pd, "button_refresh") ) );
118       b_close   = Gtk::wrap( GTK_BUTTON( lookup_widget(pd, "button_close") ) );
119       
120       b_refresh->clicked.connect(slot(this, &FormToc::update));
121       b_close->clicked.connect(dialog_->destroy.slot());
122       dialog_->destroy.connect(slot(this, &FormToc::free));
123
124       u_ = d_->updateBufferDependent.connect(slot(this, &FormToc::update));
125       h_ = d_->hideBufferDependent.connect(slot(this, &FormToc::hide));
126
127       if (!dialog_->is_visible()) dialog_->show_all();
128
129       update();  // make sure its up-to-date
130     }
131   else
132     {
133       Gdk_Window dialog_win(dialog_->get_window());
134       dialog_win.raise();
135     }
136 }
137
138
139 void FormToc::update()
140 {
141   Buffer::TocType type;
142   string wintitle;
143
144   if (dialog_ != NULL &&
145       !lv_->view()->available())
146     {
147       wintitle = N_( "*** No Document ***");
148       dialog_->set_title(wintitle);
149       list_->items().clear();
150
151       Gtk::ListItem * l = manage( new Gtk::ListItem(wintitle) );
152       list_->items().push_back( *l );
153       return;
154     }
155   
156   
157   if (dialog_ != NULL &&
158       lv_->view()->available())
159     {
160
161       int selection = 0;
162       
163       if( params.getCmdName() == "tableofcontents" )
164         {
165           type = Buffer::TOC_TOC;
166           wintitle = N_("Table of Contents");
167           selection = 0;
168         }
169       else if( params.getCmdName() == "listoffigures" )
170         {
171           type = Buffer::TOC_LOF;
172           wintitle = N_("List of Figures");
173           selection = 1;
174         }
175       else if( params.getCmdName() == "listofalgorithms" )
176         {
177           type = Buffer::TOC_LOA;
178           wintitle = N_("List of Algorithms");
179           selection = 3;
180         }
181       else
182         {
183           type = Buffer::TOC_LOT;
184           wintitle = N_("List of Tables");
185           selection = 2;
186         }
187
188       ignore_callback_ = true;
189       choice_->set_history(selection);
190       ignore_callback_ = false;
191       
192       list_->items().clear();
193
194       dialog_->set_title(wintitle);
195
196       vector<Buffer::TocItem> toclist = (lv_->view()->buffer()->getTocList())[type];
197
198       Gtk::ListItem * item;
199
200       vector<Buffer::TocItem>::const_iterator end = toclist.end();
201       for (vector<Buffer::TocItem>::const_iterator it = toclist.begin();
202            it != end; ++it)
203         {
204           item = manage( new Gtk::ListItem(string(4*(*it).depth,' ')+(*it).str) );
205           item->select.connect(bind<Buffer::TocItem>(slot(this,&FormToc::apply), (*it)));
206           list_->add( *item );
207         }
208     }
209
210   dialog_->show_all();
211 }
212
213 void FormToc::apply(Buffer::TocItem tg)
214 {
215   if (!lv_->view()->available()) return;
216   
217   lv_->view()->beforeChange();
218   lv_->view()->text->SetCursor( lv_->view(), tg.par, 0 );
219   lv_->view()->text->sel_cursor = lv_->view()->text->cursor;
220   lv_->view()->update(BufferView::SELECT|BufferView::FITCUR);
221 }
222
223 void FormToc::changeList(Buffer::TocType type)
224 {
225   if (!ignore_callback_)
226     {
227       switch (type) {
228       case Buffer::TOC_TOC :
229         {
230           params.setCmdName("tableofcontents");
231           break;
232         }
233       case Buffer::TOC_LOF :
234         {
235           params.setCmdName("listoffigures");
236           break;
237         }
238       case Buffer::TOC_LOT :
239         {
240           params.setCmdName("listoftabels");
241           break;
242         }
243       case Buffer::TOC_LOA :
244         {
245           params.setCmdName("listofalgorithms");
246           break;
247         }
248       };
249       update();
250     }
251 }
252
253 void FormToc::hide()
254 {
255   if (dialog_!=NULL) dialog_->destroy();
256 }
257
258 void FormToc::free()
259 {
260   if (dialog_!=NULL)
261     {
262       dialog_ = NULL;
263       u_.disconnect();
264       h_.disconnect();
265       inset_ = 0;
266       ih_.disconnect();
267     }
268 }
269