]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QRef.C
Add style browser to bibtex and document combo to refs. Also some altered dialog...
[lyx.git] / src / frontends / qt2 / QRef.C
1 /**
2  * \file QRef.C
3  * Copyright 2001 the LyX Team
4  * Read the file COPYING
5  *
6  * \author John Levon
7  */
8
9 #include <config.h>
10
11 #include "ControlRef.h"
12 #include "QRef.h"
13 #include "QRefDialog.h"
14 #include "Qt2BC.h"
15
16 #include <qlineedit.h>
17 #include <qcheckbox.h>
18 #include <qlistbox.h>
19 #include <qcombobox.h>
20 #include <qpushbutton.h>
21 #include <qtooltip.h>
22
23 #include "helper_funcs.h" // getStringFromVector
24 #include "support/lstrings.h" // frontStrip, strip
25 #include "gettext.h"
26 #include "insets/insetref.h"
27  
28 using std::find;
29 using std::max;
30 using std::sort;
31 using std::vector;
32 using std::endl;
33
34 typedef Qt2CB<ControlRef, Qt2DB<QRefDialog> > base_class;
35
36 QRef::QRef(ControlRef & c, Dialogs &)
37         : base_class(c, _("Cross Reference")),
38         sort_(false), at_ref_(false)
39 {
40 }
41
42
43 void QRef::build_dialog()
44 {
45         dialog_.reset(new QRefDialog(this));
46
47         bc().setOK(dialog_->okPB);
48         bc().setCancel(dialog_->closePB);
49         bc().addReadOnly(dialog_->refsLB);
50         bc().addReadOnly(dialog_->sortCB);
51         bc().addReadOnly(dialog_->nameED);
52         bc().addReadOnly(dialog_->referenceED);
53         bc().addReadOnly(dialog_->typeCO);
54         bc().addReadOnly(dialog_->bufferCO);
55 }
56
57
58 void QRef::update_contents()
59 {
60         dialog_->referenceED->setText(controller().params().getContents().c_str());
61
62         dialog_->nameED->setText(controller().params().getOptions().c_str());
63         dialog_->nameED->setReadOnly(!nameAllowed() && !readOnly());
64
65         dialog_->typeCO->setCurrentItem(InsetRef::getType(controller().params().getCmdName()));
66         dialog_->typeCO->setEnabled(!typeAllowed() && !readOnly());
67         if (!typeAllowed())
68                 dialog_->typeCO->setCurrentItem(0);
69
70         dialog_->sortCB->setChecked(sort_);
71
72         /* insert buffer list */
73         dialog_->bufferCO->clear();
74         vector<string> const buffers = controller().getBufferList();
75         for (vector<string>::const_iterator it = buffers.begin();
76                 it != buffers.end(); ++it) {
77                 dialog_->bufferCO->insertItem(it->c_str());
78         }
79         dialog_->bufferCO->setCurrentItem(controller().getBufferNum());
80         
81         updateRefs();
82 }
83
84
85 void QRef::apply()
86 {
87         controller().params().setCmdName(InsetRef::getName(dialog_->typeCO->currentItem()));
88         controller().params().setContents(dialog_->referenceED->text().latin1());
89         controller().params().setOptions(dialog_->nameED->text().latin1());
90 }
91
92
93 bool QRef::nameAllowed()
94 {
95         return controller().docType() != ControlRef::LATEX &&
96                 controller().docType() != ControlRef::LITERATE;
97 }
98
99
100 bool QRef::typeAllowed()
101 {
102         return controller().docType() == ControlRef::LINUXDOC ||
103             controller().docType() == ControlRef::DOCBOOK;
104 }
105
106
107 void QRef::setGoBack()
108 {
109         dialog_->gotoPB->setText(_("&Go back"));
110         QToolTip::remove(dialog_->gotoPB);
111         QToolTip::add(dialog_->gotoPB, _("Go back"));
112 }
113
114
115 void QRef::setGotoRef()
116 {
117         dialog_->gotoPB->setText(_("&Goto"));
118         QToolTip::remove(dialog_->gotoPB);
119         QToolTip::add(dialog_->gotoPB, _("Go to reference"));
120 }
121
122
123 void QRef::gotoRef()
124 {
125         string ref(dialog_->referenceED->text());
126
127         if (at_ref_) {
128                 // go back
129                 setGotoRef();
130                 controller().gotoBookmark();
131         } else {
132                 // go to the ref
133                 setGoBack();
134                 controller().gotoRef(ref);
135         }
136         at_ref_ = !at_ref_;
137 }
138
139
140 void QRef::redoRefs()
141 {
142         dialog_->refsLB->setAutoUpdate(false);
143
144         // need this because Qt will send a highlight() here for
145         // the first item inserted
146         string tmp(dialog_->referenceED->text());
147
148         for (std::vector<string>::const_iterator iter = refs_.begin();
149                 iter != refs_.end(); ++iter) {
150                 if (sort_)
151                         dialog_->refsLB->inSort(iter->c_str());
152                 else
153                         dialog_->refsLB->insertItem(iter->c_str());
154         }
155
156         dialog_->referenceED->setText(tmp.c_str());
157
158         for (unsigned int i = 0; i < dialog_->refsLB->count(); ++i) {
159                 if (!compare(tmp.c_str(), dialog_->refsLB->text(i).latin1()))
160                         dialog_->refsLB->setCurrentItem(i);
161         }
162
163         dialog_->refsLB->setAutoUpdate(true);
164         dialog_->refsLB->update();
165 }
166
167
168 void QRef::updateRefs()
169 {
170         refs_.clear();
171         if (at_ref_)
172                 gotoRef();
173         dialog_->refsLB->clear();
174         string const name = controller().getBufferName(dialog_->bufferCO->currentItem());
175         refs_ = controller().getLabelList(name);
176         dialog_->sortCB->setEnabled(!refs_.empty());
177         dialog_->refsLB->setEnabled(!refs_.empty());
178         redoRefs();
179 }