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