1 /***************************************************************************
2  *   copyright       : (C) 2003-2017 by Pascal Brachet                     *
3  *   http://www.xm1math.net/texmaker/                                      *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  ***************************************************************************/
11 
12 #include "unicodeview.h"
13 #include <QVBoxLayout>
14 #include <QFrame>
15 #include <QTextDocument>
16 #include <QTextCursor>
17 #include <QFileDialog>
18 #include <QTextBlock>
19 #include <QLineEdit>
20 #include <QTextCodec>
21 #include <QTextStream>
22 #include <QFile>
23 #include <QMessageBox>
24 
25 #include "geticon.h"
26 
UnicodeView(QWidget * parent,QFont & efont,bool line,QList<QColor> edcolors,QList<QColor> hicolors)27 UnicodeView::UnicodeView(QWidget *parent,QFont & efont,bool line, QList<QColor> edcolors, QList<QColor> hicolors ) : QWidget(parent)
28 {
29 
30 splitter=new MiniSplitter(this);
31 splitter->setOrientation(Qt::Vertical);
32 
33 QFrame *framebis=new QFrame(splitter);
34 // framebis->setLineWidth(0);
35 // framebis->setFrameShape(QFrame::NoFrame);
36 // framebis->setFrameShadow(QFrame::Plain);
37 // framebis->setFrameStyle(QFrame::NoFrame);
38 
39 
40 QVBoxLayout* mainlay = new QVBoxLayout(framebis );
41 mainlay->setSpacing(0);
42 mainlay->setMargin(0);
43 
44 centralToolBar=new QToolBar("ToolBar",framebis);
45 centralToolBar->setFloatable(false);
46 centralToolBar->setOrientation(Qt::Horizontal);
47 centralToolBar->setMovable(false);
48 centralToolBar->setIconSize(QSize(16,16 ));
49 centralToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
50 mainlay->addWidget(centralToolBar);
51 QAction *Act = new QAction(getIcon(":/images/filesave.png"),tr("Save"), this);
52 connect(Act, SIGNAL(triggered()), this, SLOT(fileSave()));
53 centralToolBar->addAction(Act);
54 centralToolBar->addSeparator();
55 titleLabel=new QLabel("Unicode UTF-8",centralToolBar);
56 centralToolBar->addWidget(titleLabel);
57 
58 
59 QFrame *frame=new QFrame(framebis);
60 // frame->setLineWidth(0);
61 // frame->setFrameShape(QFrame::NoFrame);
62 // frame->setFrameShadow(QFrame::Plain);
63 // frame->setFrameStyle(QFrame::NoFrame);
64 mainlay->addWidget(frame);
65 
66 lastdocument="";
67 editor=new LightLatexEditor(frame,efont,edcolors,hicolors,"");
68 connect(editor, SIGNAL(requestFind()), this, SLOT(showFind()));
69 connect(editor, SIGNAL(requestGotoLine()), this, SLOT(showGoto()));
70 m_lineNumberWidget = new LightLineNumberWidget( editor, frame);
71 m_lineNumberWidget->setFont(efont);
72 QFontMetrics fm( efont );
73 m_lineNumberWidget->setFixedWidth( fm.width( "00000" ) + 22 );
74 QHBoxLayout* lay = new QHBoxLayout( frame );
75 lay->setSpacing(0);
76 lay->setMargin(0);
77 lay->addWidget( m_lineNumberWidget );
78 lay->addWidget( editor );
79 setFocusProxy( editor );
80 setLineNumberWidgetVisible(line);
81 
82 Stack=new QStackedWidget(this);
83 Stack->setLineWidth(0);
84 Stack->setFrameShape(QFrame::NoFrame);
85 Stack->setFrameShadow(QFrame::Plain);
86 
87 findwidget=new LightFindWidget(Stack);
88 Stack->addWidget(findwidget);
89 findwidget->SetEditor(editor);
90 connect(findwidget, SIGNAL( requestHide() ), Stack, SLOT( hide() ) );
91 connect(findwidget, SIGNAL( requestExtension() ), this, SLOT( showFind() ) );
92 
93 gotolinewidget=new LightGotoLineWidget(Stack);
94 Stack->addWidget(gotolinewidget);
95 gotolinewidget->SetEditor(editor);
96 connect(gotolinewidget, SIGNAL( requestHide() ), Stack, SLOT( hide() ) );
97 
98 Stack->hide();
99 
100 splitter->addWidget(framebis);
101 splitter->addWidget(Stack);
102 
103 QVBoxLayout *mainlayout= new QVBoxLayout(this);
104 mainlayout->setSpacing(0);
105 mainlayout->setMargin(0);
106 mainlayout->addWidget(splitter);
107 }
108 
~UnicodeView()109 UnicodeView::~UnicodeView()
110 {
111 }
112 
setLineNumberWidgetVisible(bool b)113 void UnicodeView::setLineNumberWidgetVisible( bool b )
114 {
115     if( b ){
116 	m_lineNumberWidget->show();
117     } else {
118 	m_lineNumberWidget->hide();
119     }
120 }
121 
changeSettings(QFont & new_font,bool line)122 void UnicodeView::changeSettings(QFont & new_font,bool line)
123 {
124   editor->changeFont(new_font);
125   m_lineNumberWidget->setFont(new_font);
126   QFontMetrics fm( new_font );
127   m_lineNumberWidget->setFixedWidth( fm.width( "00000" ) + 32 );
128   setLineNumberWidgetVisible(line);
129 }
130 
fileSave()131 void UnicodeView::fileSave()
132 {
133 QString currentDir=QDir::homePath();
134 if (!lastdocument.isEmpty())
135 	{
136 	QFileInfo fi(lastdocument);
137 	if (fi.exists() && fi.isReadable()) currentDir=fi.absolutePath();
138 	}
139 QString fn = QFileDialog::getSaveFileName(this,tr("Save As"),currentDir,"TeX files (*.tex *.bib *.sty *.cls *.mp *.Rnw *.asy);;All files (*.*)");
140 if ( !fn.isEmpty() )
141 	{
142 	if (!fn.contains('.')) fn += ".tex";
143 	QFile file(fn);
144 	if ( !file.open( QIODevice::WriteOnly ) )
145 		{
146 		QMessageBox::warning( this,tr("Error"),tr("The file could not be saved. Please check if you have write permission."));
147 		return;
148 		}
149 	QTextStream ts( &file );
150 	QTextCodec* codec = QTextCodec::codecForName(QString("UTF-8").toLatin1());
151 	ts.setCodec(codec);
152 	ts << editor->toPlainText();
153 	file.close();
154 	lastdocument=fn;
155 	}
156 
157 }
158 
showFind()159 void UnicodeView::showFind()
160 {
161 QList<int> sizes;
162 sizes  << height()-findwidget->height() << findwidget->height();
163 splitter->setSizes( sizes );
164 Stack->setCurrentWidget(findwidget);
165 Stack->setMaximumHeight(findwidget->minimumSizeHint().height());
166 Stack->show();
167 QTextCursor c =editor->textCursor();
168 if (c.hasSelection()) findwidget->ui.comboFind->lineEdit()->setText(c.selectedText());
169 findwidget->ui.comboFind->setFocus();
170 findwidget->ui.comboFind->lineEdit()->selectAll();
171 }
172 
173 /*void UnicodeView::showFindNext()
174 {
175 QList<int> sizes;
176 sizes << height()-findwidget->height() << findwidget->height();
177 splitter->setSizes( sizes );
178 Stack->setCurrentWidget(findwidget);
179 Stack->setMaximumHeight(findwidget->minimumSizeHint().height());
180 Stack->show();
181 if (findwidget->ui.comboFind->lineEdit()->text()!="") findwidget->doFind();
182 }*/
183 
showGoto()184 void UnicodeView::showGoto()
185 {
186 QList<int> sizes;
187 sizes  << height()-gotolinewidget->height() << gotolinewidget->height();
188 splitter->setSizes( sizes );
189 Stack->setCurrentWidget(gotolinewidget);
190 Stack->setMaximumHeight(gotolinewidget->minimumSizeHint().height());
191 Stack->show();
192 gotolinewidget->ui.spinLine->setFocus();
193 gotolinewidget->ui.spinLine->setMinimum( 1 );
194 gotolinewidget->ui.spinLine->setMaximum(editor->numoflines() );
195 gotolinewidget->ui.spinLine->selectAll();
196 }
197 
198