USGS

Isis 3.0 Object Programmers' Reference

Home

GuiEditFile.cpp
1 #include "FileName.h"
2 #include "GuiEditFile.h"
3 #include "UserInterface.h"
4 
5 #include <QDir>
6 #include <QFileDialog>
7 #include <QList>
8 #include <QPushButton>
9 #include <QStatusBar>
10 #include <QTextEdit>
11 #include <QTextStream>
12 #include <QMenuBar>
13 #include <QMessageBox>
14 
15 using namespace Isis;
16 using namespace std;
17 
18 namespace Isis {
19 
20  // Singleton
22 
32  void GuiEditFile::EditFile(UserInterface & pUI, QString psFile) {
33  if (m_instance == NULL) {
34  m_instance = new GuiEditFile(pUI, psFile);
35  }
36  else {
37  m_instance->showWindow(psFile);
38  }
39  }
40 
48  void GuiEditFile::showWindow(QString psFile) {
49  m_fileName = QString(psFile);
50  m_editWin->setWindowTitle (m_fileName);
51  OpenFile(m_fileName);
52  m_editWin->show();
53  }
54 
63  GuiEditFile::GuiEditFile(UserInterface & pUI, QString psFile) {
64  // Init data members
65  m_parent = pUI.TheGui();
66  m_fileName = QString(psFile);
67  m_editFile=NULL;
68 
69  // Main Window
70  m_editWin = new QMainWindow(m_parent, Qt::SubWindow);
71  m_editWin->setWindowTitle (m_fileName);
72  m_editWin->resize (400, 600);
73 
74  // Status bar
75  QStatusBar *statusBar = new QStatusBar(m_editWin);
76  m_editWin->setStatusBar(statusBar);
77 
78  // Menu bar
79  QMenuBar *menuBar = new QMenuBar(m_editWin);
80  QMenu *fileMenu = menuBar->addMenu("&File");
81 
82  // Action File-> Open
83  m_open = new QAction(menuBar);
84  m_open->setShortcut(Qt::CTRL + Qt::Key_O);
85  m_open->setText("&Open...");
86  m_open->setToolTip("Open File");
87  QString whatsThis = "Open a file to edit";
88  m_open->setWhatsThis(whatsThis);
89  connect(m_open, SIGNAL(activated()), this, SLOT(open()));
90  fileMenu->addAction(m_open);
91 
92  // Action File-> Save
93  m_save = new QAction(menuBar);
94  m_save->setShortcut(Qt::CTRL + Qt::Key_S);
95  m_save->setText("&Save...");
96  m_save->setToolTip("Save File");
97  m_save->setWhatsThis("Save the current file");
98  connect(m_save, SIGNAL(activated()), this, SLOT(saveFile()));
99  fileMenu->addAction(m_save);
100 
101  // Action File->Save As
102  m_saveAs = new QAction(menuBar);
103  m_saveAs->setText("Save &As...");
104  m_saveAs->setShortcut(Qt::CTRL + Qt::Key_A);
105  m_saveAs->setToolTip("Save As File");
106  m_saveAs->setWhatsThis("Save the current file into another file");
107  connect(m_saveAs, SIGNAL(activated()), this, SLOT(saveAs()));
108  fileMenu->addAction(m_saveAs);
109 
110  // Action File->close
111  m_close = new QAction(menuBar);
112  m_close->setText("&Close...");
113  m_close->setShortcut(Qt::CTRL + Qt::Key_C);
114  m_close->setToolTip("Close File");
115  m_close->setWhatsThis("Close the current file");
116  connect(m_close, SIGNAL(activated()), this, SLOT(closeFile()));
117  fileMenu->addAction(m_close);
118 
119  // Action Exit
120  m_exit = menuBar->addAction("&Exit");
121  m_exit->setShortcut(Qt::CTRL + Qt::Key_E);
122  m_exit->setText("&Exit...");
123  m_exit->setToolTip("Exit");
124  m_exit->setWhatsThis("Exit the Editor");
125  //connect(m_exit, SIGNAL(activated()), m_editWin, SLOT(close()));
126  connect(m_exit, SIGNAL(activated()), this, SLOT(closeWin()));
127 
128  m_editWin->setMenuBar(menuBar);
129 
130  // Text Edit
131  m_textChanged = false;
132  m_txtEdit = new QTextEdit(m_editWin);
133  m_txtEdit->setUndoRedoEnabled(true);
134  m_txtEdit->resize(400,500);
135  m_editWin->setCentralWidget(m_txtEdit);
136  if (m_fileName.length() > 0){
137  OpenFile(m_fileName);
138  }
139  connect(m_txtEdit, SIGNAL(textChanged()), this, SLOT(setTextChanged()));
140 
141  m_editWin->show();
142  }
143 
150  delete m_editFile;
151  m_editFile = NULL;
152 
153  delete m_txtEdit;
154  m_txtEdit = NULL;
155 
156  delete m_editWin;
157  m_editWin = NULL;
158 
159  delete m_instance;
160  m_instance = NULL;
161  }
162 
169  m_editWin->close();
170  m_txtEdit->clear();
171  }
172 
179  m_textChanged = true;
180  }
181 
188  //Set up the list of filters that are default with this dialog.
189  //cerr << "setTextChanged=" << m_textChanged << endl;
190  if (m_textChanged) {
191  if(QMessageBox::question((QWidget *)parent(), tr("Save File?"),
192  tr("Are you sure you want to save this file?"),
193  tr("&Save"), tr("&Cancel"),
194  QString(), 1, 0)) {
195  saveFile();
196  }
197  }
198 
199  QString sFilterList("All files (*)");
200  QDir currDir = QDir::current();
201  QString sOpen("Open");
202  QFileDialog *fileDialog = new QFileDialog((QWidget *)parent(), sOpen, currDir.dirName(), sFilterList);
203  fileDialog->show();
204  connect(fileDialog, SIGNAL(fileSelected(QString)), this, SLOT(OpenFile(QString)));
205  }
206 
213  if (m_textChanged) {
214  if(QMessageBox::question((QWidget *)parent(), tr("Save File?"),
215  tr("Changes have been made to the file. Do you want to Save?"),
216  QMessageBox::Save, QMessageBox::No) == QMessageBox::Save) {
217  saveFile();
218  }
219  }
220  m_editFile->close();
221  m_txtEdit->clear();
222  m_textChanged = false;
223  m_editWin->setWindowTitle(tr(""));
224  }
225 
233  void GuiEditFile::OpenFile(QString psOutFile){
234  //cerr << "Open File " << psOutFile.toStdString() << "\n";
235  if(psOutFile.isEmpty()){
236  QMessageBox::information((QWidget *)parent(), "Error", "No output file selected");
237  return;
238  }
239 
240  if (m_editFile != NULL) {
241  m_txtEdit->clear();
242  delete (m_editFile);
243  }
244  m_editFile = new QFile(psOutFile);
245  //m_editWin->setWindowTitle(FileName(psOutFile.toStdString()).Name().c_str());
246  windowTitle(psOutFile);
247 
248  if (m_editFile->open(QIODevice::ReadWrite)){
249  char buf[1024];
250  QString bufStr;
251  qint64 lineLength = m_editFile->readLine(buf, sizeof(buf));
252  while (lineLength != -1) {
253  bufStr = QString(buf);
254  //std::cerr << bufStr.toStdString();
255  bufStr.remove('\n'); // puts an additional new line
256  m_txtEdit->append(bufStr);
257  lineLength = m_editFile->readLine(buf, sizeof(buf));
258  }
259  }
260  else {
261  m_txtEdit->append("\nThis file cannot be edited. Please check the file's Write permissions");
262  }
263  m_textChanged = false;
264  }
265 
272  if (m_editFile){
273  clearFile();
274  QTextStream out(m_editFile);
275  out << m_txtEdit->document()->toPlainText();
276  m_textChanged = false;
277  }
278  }
279 
286  QString sFilterList("All files (*)");
287  QDir currDir = QDir::current();
288  QString sOpen("Open");
289  QFileDialog *saveAsDialog = new QFileDialog((QWidget *)parent(), sOpen, currDir.dirName(), sFilterList);
290 
291  QList<QPushButton *> allPButtons = saveAsDialog->findChildren<QPushButton *>();
292  // Edit the first (Open) button title.
293  allPButtons[0]->setText("&Save");
294  // Edit the second (Cancel) button title.
295  allPButtons[1]->setText("&Close");
296 
297  saveAsDialog->show();
298  connect(saveAsDialog, SIGNAL(fileSelected(QString)), this, SLOT(saveAsFile(QString)));
299  }
300 
308  void GuiEditFile::saveAsFile(QString psNewFile) {
309  m_editFile->close();
310  delete(m_editFile);
311  m_editFile = new QFile(psNewFile);
312  m_editFile->open(QFile::ReadWrite);
313  saveFile();
314  windowTitle(psNewFile);
315  }
316 
324  if (m_editFile){
325  m_editFile->close();
326  //m_editFile->open(QIODevice::Truncate | QIODevice::ReadWrite);
327  m_editFile->open(QFile::ReadWrite | QFile::Truncate);
328  }
329  }
330 
338  void GuiEditFile::windowTitle(QString & psfile) {
339  m_editWin->setWindowTitle(FileName(psfile).name());
340  }
341 
342 }