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