0029018: Documentation - Provide user guide for Qt browser
[occt.git] / tools / DFBrowser / DFBrowser_SearchLine.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/DFBrowser_SearchLine.hxx>
17 #include <inspector/DFBrowser_SearchLineModel.hxx>
18 #include <inspector/DFBrowser_Window.hxx>
19
20 #include <inspector/DFBrowserPane_Tools.hxx>
21 #include <inspector/DFBrowser_Module.hxx>
22
23 #include <TDocStd_Application.hxx>
24 #include <TDocStd_Document.hxx>
25 #include <TDF_AttributeIterator.hxx>
26 #include <TDF_ChildIterator.hxx>
27
28 #include <QStringList>
29 #include <QWidget>
30 #include <QHBoxLayout>
31 #include <QLineEdit>
32 #include <QToolButton>
33 #include <QCompleter>
34 #include <QIcon>
35 #include <QPaintEvent>
36 #include <QPainter>
37 #include <QStyle>
38
39 //! class DFBrowser_LineEdit
40 //! Extension of Qt line edit to visualize help text until the line edit control has not been filled yet
41 class DFBrowser_LineEdit : public QLineEdit
42 {
43 public:
44
45   //! Constructor
46   DFBrowser_LineEdit (QWidget* theParent) : QLineEdit(theParent) {}
47
48   //! Destructor
49   virtual ~DFBrowser_LineEdit() {}
50
51   //! Sets text that is shown in line edit it the text of this control is empty
52   //! \param theText a string value
53   void setPlaneHolder (const QString& theText) { myPlaceHolder = theText; }
54
55   //! Draws the line edit context, put plane holder if text is empty
56   //! \param theEvent a paint event
57   virtual void paintEvent (QPaintEvent* theEvent) Standard_OVERRIDE
58   {
59     QLineEdit::paintEvent (theEvent);
60     if (!text().isEmpty())
61       return;
62
63     QPainter aPainter (this);
64     QFontMetrics aFontMetrics = fontMetrics();
65     QRect aLineRect = rect();
66     Qt::Alignment anAlignment = QStyle::visualAlignment (layoutDirection(), Qt::AlignLeft);
67
68     QColor aColor = Qt::gray;
69     QPen anOldpen = aPainter.pen();
70     aPainter.setPen (aColor);
71     aLineRect.adjust (4, 4, 0, 0);
72     QString anElidedText = aFontMetrics.elidedText (myPlaceHolder, Qt::ElideRight, aLineRect.width());
73     aPainter.drawText (aLineRect, anAlignment, anElidedText);
74     aPainter.setPen (anOldpen);
75   }
76
77 private:
78
79   QString myPlaceHolder; //!< text of filling line edit content if the text is empty
80 };
81
82 // =======================================================================
83 // function : Constructor
84 // purpose :
85 // =======================================================================
86 DFBrowser_SearchLine::DFBrowser_SearchLine (QWidget* theParent)
87 : QFrame (theParent)
88 {
89   QHBoxLayout* aLayout = new QHBoxLayout (this);
90   aLayout->setContentsMargins (0, 0, 0, 0);
91   aLayout->setSpacing (0);
92
93   myLineControl = new DFBrowser_LineEdit (this);
94   ((DFBrowser_LineEdit*)myLineControl)->setPlaneHolder (QString (tr ("Scanning application ...")));
95   mySearchButton = new QToolButton (this);
96   mySearchButton->setIcon (QIcon (":/icons/search.png"));
97
98   QCompleter* aCompleter = new QCompleter (this);
99   aCompleter->setCaseSensitivity (Qt::CaseInsensitive);
100   myLineControl->setCompleter (aCompleter);
101
102   aLayout->addWidget (myLineControl);
103   aLayout->addWidget (mySearchButton);
104
105   connect (myLineControl, SIGNAL (textChanged (const QString&)), this, SLOT (onTextChanged (const QString&)));
106   connect (myLineControl, SIGNAL (returnPressed()), this, SLOT (onReturnPressed()));
107   connect (mySearchButton, SIGNAL (clicked()), this, SLOT (onSearchButtonClicked()));
108
109   DFBrowser_Window::SetWhiteBackground (this);
110 }
111
112 // =======================================================================
113 // function : SetModule
114 // purpose :
115 // =======================================================================
116 void DFBrowser_SearchLine::SetModule (DFBrowser_Module* theModule)
117 {
118   DFBrowser_SearchLineModel* aModel = new DFBrowser_SearchLineModel (myLineControl, theModule);
119   myLineControl->completer()->setModel (aModel);
120 }
121
122 // =======================================================================
123 // function : GetModule
124 // purpose :
125 // =======================================================================
126 DFBrowser_Module* DFBrowser_SearchLine::GetModule()
127 {
128   DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
129   return aModel->GetModule();
130 }
131
132 // =======================================================================
133 // function : SetValues
134 // purpose :
135 // =======================================================================
136 void DFBrowser_SearchLine::SetValues (const QMap<int, QMap<QString, DFBrowser_SearchItemInfo > >& theDocumentValues,
137                                       const QMap<int, QStringList>& theDocumentInfoValues)
138 {
139   DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
140   aModel->SetValues (theDocumentValues, theDocumentInfoValues);
141
142   QString aFirstValue = !theDocumentInfoValues.empty() ? theDocumentInfoValues.begin().value().first() : "";
143   DFBrowser_LineEdit* aLineEdit = dynamic_cast<DFBrowser_LineEdit*> (myLineControl);
144   aLineEdit->setPlaneHolder (QString (tr ("Search : %1")).arg (aFirstValue));
145 }
146
147 // =======================================================================
148 // function : ClearValues
149 // purpose :
150 // =======================================================================
151 void DFBrowser_SearchLine::ClearValues()
152 {
153   DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
154   aModel->ClearValues();
155
156   DFBrowser_LineEdit* aLineEdit = dynamic_cast<DFBrowser_LineEdit*> (myLineControl);
157   aLineEdit->setPlaneHolder(QString (tr ("Scanning application ...")));
158 }
159
160 // =======================================================================
161 // function : onTextChanged
162 // purpose :
163 // =======================================================================
164 void DFBrowser_SearchLine::onTextChanged (const QString& theText)
165 {
166   mySearchButton->setIcon (theText.isEmpty() ? QIcon (":/icons/search.png")
167                                              : QIcon (":/icons/search_cancel.png"));
168   emit searchActivated();
169 }
170
171 // =======================================================================
172 // function : onSearchButtonClicked
173 // purpose :
174 // =======================================================================
175 void DFBrowser_SearchLine::onSearchButtonClicked()
176 {
177   if (!Text().isEmpty())
178     SetText (QString());
179 }