/* * Alabastra Project - C++ Editor writed with QT Library V.4 * Copyright (C) Igor Maculan - geocronos@gmail.com Marco Buoncristiano - marco.buoncristiano@gmail.com * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "AlWinMain.h" #include "AlWinPrjManager.h" #include "ui_AlHelp.h" #include "AlGoToLine.h" #include #include #include #include #include #include using namespace std; AlWinMain::AlWinMain() { ui.setupUi(this); actualTxt=NULL; statusBar()->showMessage("Alabastra Started"); connect_action(); srcWin=NULL; lastOpenDir=""; iconsAD(); }; void AlWinMain::connect_action() { #ifdef Q_WS_WIN connect (ui.list_files,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(view_file(QListWidgetItem*))); #endif #ifdef Q_WS_X11 connect (ui.list_files,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(view_file(QListWidgetItem*))); #endif #ifdef Q_WS_MAC connect (ui.list_files,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(view_file(QListWidgetItem*))); #endif connect (ui.list_files,SIGNAL(methodImplement(QString)),this,SLOT(insertText(QString))); connect (ui.actionEsci,SIGNAL(triggered()),this,SLOT(close())); connect (ui.actionNuovo,SIGNAL(triggered()),this,SLOT(new_file())); connect (ui.actionSalva,SIGNAL(triggered()),this,SLOT(save())); connect (ui.actionSalva_Tutti,SIGNAL(triggered()),this,SLOT(saveall())); connect (ui.actionSalva_con_nome,SIGNAL(triggered()),this,SLOT(save_as())); connect (ui.actionApri,SIGNAL(triggered()),this,SLOT(open())); connect (ui.actionChiudi,SIGNAL(triggered()),this,SLOT(closeFile())); connect (ui.actionChiudiTab,SIGNAL(triggered()),this,SLOT(closeTab())); connect (ui.actionEsporta,SIGNAL(triggered()),this,SLOT(esporta())); connect (ui.actionAbout,SIGNAL(triggered()),this,SLOT(about())); connect (ui.actionChiuditutto,SIGNAL(triggered()),this,SLOT(closeAll())); connect (ui.actionStampa,SIGNAL(triggered()),this,SLOT(print())); connect (ui.actionDirezioneLayout,SIGNAL(triggered()),this,SLOT(direction())); connect (ui.actionRefresh,SIGNAL(triggered()),this,SLOT(refresh())); connect (ui.actionCancella,SIGNAL(triggered()),this,SLOT(cancella())); connect (ui.actionGestione_Progetti,SIGNAL(triggered()),this,SLOT(openPrjManager())); connect (ui.actionApri_Progetto,SIGNAL(triggered()),this,SLOT(openProject())); connect (ui.actionReload,SIGNAL(triggered()),this,SLOT(reload())); connect (ui.action_InsDataOra,SIGNAL(triggered()),this,SLOT(insertDateTime())); connect (ui.actionCommento,SIGNAL(triggered()),this,SLOT(insertComment())); connect (ui.tab,SIGNAL(currentChanged(int)),this,SLOT(view_file(int))); connect (ui.actionFileList,SIGNAL(toggled(bool)),ui.dck_fileLists,SLOT(setVisible(bool))); connect (ui.actionMethodList,SIGNAL(toggled(bool)),ui.dck_methods,SLOT(setVisible(bool))); connect (ui.action_Trova,SIGNAL(triggered()),this,SLOT(showSearch())); connect (ui.action_Sostituisci,SIGNAL(triggered()),this,SLOT(showSearch())); connect (ui.actionGoToLine,SIGNAL(triggered()),this,SLOT(showGoToLine())); connect (ui.action_findNext,SIGNAL(triggered()),this,SLOT(findNext())); connect (ui.action_findPrev,SIGNAL(triggered()),this,SLOT(findPrev())); connect (ui.actionRefreshMetods,SIGNAL(triggered()),this,SLOT(refreshMethodList())); connect (ui.list_method,SIGNAL(itemPressed(QListWidgetItem*)),this,SLOT(goToMethod(QListWidgetItem*))); //funzioni non implementate }; void AlWinMain::connectEditor( AlTextEdit *edt ){ if (edt!=NULL && !edt->isConnected()){ connect (ui.action_Copia,SIGNAL(triggered()),edt,SLOT(copy())); connect (ui.action_Taglia,SIGNAL(triggered()),edt,SLOT(cut())); connect (ui.action_Incolla,SIGNAL(triggered()),edt,SLOT(paste())); connect (ui.action_Undo,SIGNAL(triggered()),edt,SLOT(undo())); connect (ui.action_Redo,SIGNAL(triggered()),edt,SLOT(redo())); connect (ui.action_Seleziona_Tutto,SIGNAL(triggered()),edt,SLOT(selectAll())); connect (edt,SIGNAL(cursorPositionChanged()),this,SLOT(showPosition())); connect (edt,SIGNAL(fileNameChanged(AlTextEdit*)),this,SLOT(changeFileName(AlTextEdit*))); connect (edt->getAlDocument(),SIGNAL(modified(AlDocument*,bool)),this,SLOT(modifiedDocument(AlDocument*,bool))); connect (ui.actionComment,SIGNAL(triggered()),edt,SLOT(comment())); edt->setConnected(true); } }; void AlWinMain::disConnectEditor( AlTextEdit *edt ){ if (edt!=NULL && edt->isConnected()){ disconnect (ui.action_Copia,SIGNAL(triggered()),edt,SLOT(copy())); disconnect (ui.action_Taglia,SIGNAL(triggered()),edt,SLOT(cut())); disconnect (ui.action_Incolla,SIGNAL(triggered()),edt,SLOT(paste())); disconnect (ui.action_Undo,SIGNAL(triggered()),edt,SLOT(undo())); disconnect (ui.action_Redo,SIGNAL(triggered()),edt,SLOT(redo())); disconnect (ui.action_Seleziona_Tutto,SIGNAL(triggered()),edt,SLOT(selectAll())); disconnect (edt,SIGNAL(cursorPositionChanged()),this,SLOT(showPosition())); disconnect (ui.actionComment,SIGNAL(triggered()),edt,SLOT(comment())); edt->setConnected(false); // disconnect (edt,SIGNAL(fileNameChanged(AlTextEdit*)),this,SLOT(changeFileName(AlTextEdit*))); // disconnect (edt->getAlDocument(),SIGNAL(modified(AlDocument*,bool)),this,SLOT(modifiedDocument(AlDocument*,bool))); } }; /* *Inserisce la data e la ora odierni */ void AlWinMain::insertDateTime(){ QDateTime dt=QDateTime::currentDateTime(); if (ui.list_files->currentItem() > 0) actualTxt->textCursor().insertText(dt.toString(Qt::LocalDate)); }; /* * Apre una finestra di dialogo per l'apertura di un progetto */ void AlWinMain::openProject(){ QString fPrj=QFileDialog::getOpenFileName(this,tr("Apri Progetto"),lastOpenDir,tr("XML File (*.xml)")); if (!fPrj.isEmpty()){ prj=new AlProject(); if (prj->open(fPrj)){ loadFromProject(prj); } } }; /* * Apre un progetto passatogli come argomento */ void AlWinMain::loadFromProject(AlProject *prj){ QList files = prj->getFiles(); for (int i=0;iaddTab(tmp,tmp->getAlDocument()->getFileName()); actualTxt=tmp; QListWidgetItem *lit; lit=new QListWidgetItem(tmp->getAlDocument()->getFileName()); QVariant edtVariant=qVariantFromValue((void*)tmp); lit->setData(101,edtVariant); tmp->setListWidgetItem(lit); ui.list_files->addItem(lit); ui.tab->setCurrentIndex(t); ui.list_files->setCurrentItem(lit); ui.list_files->sortItems(); connectEditor(actualTxt); iconsAD(); }; /** *Visualizza il contenuto del file selezionato */ void AlWinMain::view_file(int pos){ if (pos>0 || (pos == 0 && !ui.tbWelcome->isVisible())) { AlTextEdit *edt=(AlTextEdit*)ui.tab->widget(pos); view_file(edt->getListWidgetItem()); } }; void AlWinMain::view_file(QListWidgetItem *lit){ AlTextEdit *edt=ui.list_files->getEditor(lit); view_file(edt); ui.list_files->setCurrentItem(lit); }; void AlWinMain::view_file(AlTextEdit*edt){ //cerco se il file gi dentro ad un tab int t=ui.tab->indexOf(edt); disConnectEditor(actualTxt); if (t==-1){ //se il file nn gi aperto in un tab QString fname=edt->getAlDocument()->getFileName(); fname=fname.right(fname.length()-fname.lastIndexOf('/')-1); t=ui.tab->addTab(edt,fname); } actualTxt=edt; ui.tab->setCurrentIndex(t); connectEditor(actualTxt); actualTxt->setFocus(Qt::MouseFocusReason); refreshMethodList(); //refreshIcons iconsAD(); } /* *Aggiorna la lista dei metodi */ void AlWinMain::refreshMethodList(){ ui.list_method->clear(); if (actualTxt!=NULL){ disConnectEditor(actualTxt); actualTxt->getAlDocument()->refreshMethod(); QList methodList = actualTxt->getAlDocument()->getAlMethodList(); for (int i=0;iaddItem(methodList.at(i)->getName()); } ui.list_method->sortItems(); connectEditor(actualTxt); } }; void AlWinMain::goToMethod(QListWidgetItem *litM){ if (actualTxt!=NULL){ actualTxt->scrollToAnchor(litM->text()); } }; /* * Vai alla riga */ void AlWinMain::goToLine(int r){ if (actualTxt!=NULL){ QTextCursor c=actualTxt->textCursor(); c.movePosition(QTextCursor::Start); for (int i=1;isetTextCursor((const QTextCursor&) c); actualTxt->setFocus(); } }; /** *Salva l'attuale file */ void AlWinMain::save(){ if (actualTxt!=NULL) save(actualTxt); }; void AlWinMain::save(AlTextEdit *edt) { save( edt->getAlDocument() ); }; void AlWinMain::save(AlDocument *doc) { doc->refreshMethod(); switch ( doc->save() ) { case -1://ERRORE DI SALVATAGGIO QMessageBox::critical(this,tr("Salvataggio File"),tr("Salvataggio non riuscito")); break; case 0: break; //SAVE OK case 1: //MAI Salvato save_as(doc); break; case 2:break; //NON MODIFICATO } }; /** *Salva tutto */ void AlWinMain::saveall(){ for (int i=0;icount();i++){ save(ui.list_files->getEditor(ui.list_files->item(i))); } }; /** *Salva con nome */ void AlWinMain::save_as(AlDocument *doc) { QString fname=QFileDialog::getSaveFileName(this,tr("Salva con nome"),lastOpenDir,"Source (*.cpp *.c);;Header (*.h);;Tutti (*.*)"); if (!fname.isEmpty()) { //Salvo il file //recupero la directory per memorizzarla in lastOpenDir lastOpenDir=fname.left(fname.lastIndexOf("/")); if ( ! doc->save(fname) ) QMessageBox::critical(this,tr("Salvataggio File"),tr("Salvataggio non riuscito")); } }; /* *Salva con nome l'attuale documento */ void AlWinMain::save_as(){ save_as(actualTxt->getAlDocument()); }; /** Evento scatenato dal cambio del nome file (SALVA) */ void AlWinMain::changeFileName(AlTextEdit *edt) { QString fname=edt->getAlDocument()->getShortFileName(); ui.list_files->getItem(edt->getAlDocument())->setText(fname); int t=ui.tab->indexOf(edt); ui.tab->setTabText(t,fname); }; /* * Mette l'asterisco nel nome del file solo nel caso il file sia stato modificato */ void AlWinMain::modifiedDocument(AlDocument *doc,bool mod){ QListWidgetItem *lit=ui.list_files->getItem(doc); if (lit!=NULL){ QString actualName=lit->text(); if (mod ){ if (actualName.right(1)!="*") lit->setText(actualName+"*"); }else{ QString fname=ui.list_files->getEditor(lit)->getAlDocument()->getShortFileName(); lit->setText(fname); } } }; /** * Apertura fisica del file */ void AlWinMain::openfile(QString fname){ if (!fname.isEmpty() && ui.list_files->findItems(fname.right(fname.length()-fname.lastIndexOf('/')-1), Qt::MatchExactly).size()==0 ){ //Apro il file lastOpenDir=fname.left(fname.lastIndexOf("/")); new_file(); disConnectEditor(actualTxt); QFile f(fname); f.open(QFile::ReadOnly); QByteArray data=f.readAll(); QString tx=QString::fromLocal8Bit(data); actualTxt->setPlainText((const QString&)tx); f.close(); actualTxt->getAlDocument()->open(fname); refreshMethodList(); connectEditor(actualTxt); } }; /** Apertura File */ void AlWinMain::open() { QStringList filenames =QFileDialog::getOpenFileNames(this,tr("Apri"),lastOpenDir,"CPP Files (*.cpp *.c *.cc *.h);;Source (*.cpp *.c);;Header (*.h);;Tutti (*.*)"); for (int i=0;idocument()); if ( doc->isSaved() ){ if ( doc->isModified() ){ int r = QMessageBox::question(this,tr( "Riapertura File" ),tr("ATTENZIONE\nRiaprendo il file tutte le modifche andranno perse\nContinuare con la riapertura?" ),tr("Si"),tr("No")); if (r==0) openfile(doc->getFileName()); } } } }; /** Chiusura File */ bool AlWinMain::closeFile(QListWidgetItem *lit){ AlTextEdit* edt = ui.list_files->getEditor(lit); AlDocument *dc=edt->getAlDocument(); int row=ui.list_files->row(lit); bool annulla=false; if (dc->isModified() || (!dc->isSaved() && !dc->isEmpty())) { int r=QMessageBox::question(this,tr("Chiusura File %1").arg(dc->getShortFileName()),tr("Si vuole salvare le modifiche prima di chiudere il file?"),tr("Si"),tr("No"),tr("ANNULLA")); switch(r){ case 0:{ if (dc->isSaved() && !dc->isModified()){ ui.list_files->takeItem(row); ui.tab->removeTab(ui.tab->indexOf(edt)); disConnectEditor(edt); } else{ save(dc); disConnectEditor(edt); } }break; case 1:{ ui.list_files->takeItem(row); ui.tab->removeTab(ui.tab->indexOf(edt)); disConnectEditor(edt); }break; default: annulla=true; } } else{ ui.list_files->takeItem(row); disConnectEditor(edt); } if (ui.list_files->count()==0){ actualTxt = NULL; refreshMethodList(); } //refreshIcons iconsAD(); return !annulla; }; /* *chiude il file attuale */ void AlWinMain::closeFile(){ if (ui.list_files->currentItem()!=0){ if ( closeFile(ui.list_files->currentItem()) ) ui.tab->removeTab(ui.tab->currentIndex()); } }; void AlWinMain::closeTab(){ if (actualTxt!=NULL){ ui.tab->removeTab(ui.tab->currentIndex()); if ( (ui.tab->count()== 0) || (ui.tab->count()==1 && ui.tbWelcome->isVisible()) ) actualTxt=NULL; refreshMethodList(); //refreshIcons iconsAD(); } }; /* *Visualizza la riga e la colonna in fondo all'editor */ void AlWinMain::showPosition(){ ui.lbl_bottom->setText(tr("Riga: %1 Colonna: %2") .arg(actualTxt->textCursor().blockNumber()+1) .arg(actualTxt->textCursor().columnNumber()) ); }; /* * Alla chiusura del programma */ void AlWinMain::closeEvent(QCloseEvent *e){ if (closeAll()){ if (srcWin!=NULL) srcWin->close(); e->accept(); } else e->ignore(); }; //chiudi tutti bool AlWinMain::closeAll() { QListWidgetItem *lit; bool ok=true; while (ui.list_files->count()>0 && ok) { lit=ui.list_files->item(0); ok=ok && closeFile(lit); if (ok) //chiudo il tab ui.tab->removeTab(ui.tab->indexOf((QWidget*)ui.list_files->getEditor(lit))); } refreshMethodList(); return ok; }; //esporta il file corrente in formato .pdf .ps .html void AlWinMain::esporta() { #ifndef QT_NO_PRINTER exportdlg=new QFileDialog (this, tr("Esporta"), lastOpenDir, "*.pdf ;;*.ps ;;*.html"); exportdlg->setAcceptMode(QFileDialog::AcceptSave); connect (exportdlg, SIGNAL(accepted()), this, SLOT (expor())); exportdlg->show(); #endif }; /* * Esportazione su file in base all'estensione */ void AlWinMain::expor() { QStringList files=exportdlg->selectedFiles(); qDebug()<selectedFilter(); if (files.size() ==1){ QString fname = files.at(0); if (!fname.isEmpty()) {//se non vuoto if (exportdlg->selectedFilter()!= "*.html"){ if (QFileInfo(fname).suffix().isEmpty()) if (exportdlg->selectedFilter()== "*.pdf") fname.append(".pdf"); else fname.append(".ps"); QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setOutputFormat(QPrinter::PostScriptFormat); printer.setOutputFileName(fname); actualTxt->document()->print(&printer); } else { if (QFileInfo(fname).suffix().isEmpty()) fname.append(".html"); QFile html(fname); html.open(QFile::WriteOnly); QTextStream out(&html); out<toHtml(); html.close(); } } } }; //sezione about... void AlWinMain::about(){ QDialog *about=new QDialog(this); Ui::about_ui abui; abui.setupUi(about); about->setModal(true); about->show(); }; /* * Apertura Gestore Progetti */ void AlWinMain::openPrjManager(){ AlWinPrjManager *frm=new AlWinPrjManager(this); frm->showMaximized(); }; /* * Finestra di dialogo di Funzione non disponibile */ void AlWinMain::showNotEnabled(){ QMessageBox::information(this,tr("Funzione non disponibile"),tr("Alabastra Ver. 0.1Alfa\nFunzione non acora disponibile.")); }; /* * Finestra di Ricerca e Sostituzione */ void AlWinMain::showSearch(){ if (actualTxt!=NULL && actualTxt->isEnabled()){ if (srcWin==NULL) srcWin=new AlSearch(this,actualTxt); if (!srcWin->isVisible()) { srcWin->setAlTextEdit(actualTxt); srcWin->show(); } } }; /* * Trova il successivo */ void AlWinMain::findNext(){ if (srcWin!=NULL) if (srcWin->compare(actualTxt)) srcWin->next(); else{ srcWin->setAlTextEdit(actualTxt); srcWin->next(); } }; /* * Trova il precedente */ void AlWinMain::findPrev(){ if (srcWin!=NULL) if (srcWin->compare(actualTxt)) srcWin->prev(); else{ srcWin->setAlTextEdit(actualTxt); srcWin->prev(); } }; /* * Apertura finestra di dialogo per lo spostamento alla riga inserita */ void AlWinMain::showGoToLine(){ if (actualTxt!=NULL){ QDialog *frmGTL = new AlGoToLine(this,actualTxt); frmGTL->setModal(true); connect (frmGTL,SIGNAL(lineSelected(int)),this,SLOT(goToLine(int))); frmGTL->show(); } }; /* * Funzione di stampa singolo documento */ void AlWinMain::print() { #ifndef QT_NO_PRINTER QPrinter printer(QPrinter::HighResolution); printer.setFullPage(true); QPrintDialog *doc = new QPrintDialog(&printer, this); doc->setWindowTitle(tr("Stampa Documento")); if (doc->exec() == QDialog::Accepted) { actualTxt->document()->print(&printer); } delete doc; #endif }; /* * Switch direzione sinistra/destra layout */ void AlWinMain::direction() { if (layoutDirection() == Qt::LeftToRight) qApp->setLayoutDirection(Qt::RightToLeft); else qApp->setLayoutDirection(Qt::LeftToRight); }; /* * Ricarica File */ void AlWinMain::refresh() { //actualTxt->refresh(); }; /* * Cancella File attuale */ void AlWinMain::cancella() { if (actualTxt > 0 && ui.list_files->currentItem() > 0) actualTxt->clear(); }; /* * Inserisci commento */ void AlWinMain::insertComment() { if (actualTxt > 0 && ui.list_files->currentItem() > 0) actualTxt->textCursor().insertText(" /*********/" "/* */" "/*********/" ); }; /* * Attiva/Disattiva le icone */ void AlWinMain::iconsAD() { if (actualTxt!=NULL) ui.action_Incolla->setEnabled(true); else ui.action_Incolla->setEnabled(false); }; /* * Inserisce del testo nella posizione attuale del cursore */ void AlWinMain::insertText(QString text){ if (actualTxt!=NULL){ actualTxt->textCursor().insertText(text); QTextCursor c=actualTxt->textCursor(); c.movePosition(QTextCursor::PreviousBlock); c.movePosition(QTextCursor::EndOfLine); actualTxt->setTextCursor(c); actualTxt->setFocus(); } };