/** * \brief */ bool NewClassDlg::ValidateInput() { // validate the class name if(!IsValidCppIndetifier(m_textClassName->GetValue())) { wxString msg; msg << wxT("'") << m_textClassName->GetValue() << _("' is not a valid C++ qualifier"); wxMessageBox(msg, _("CodeLite"), wxOK | wxICON_WARNING); return false; } // validate the namespace if(!m_textCtrlNamespace->GetValue().IsEmpty()) { wxArrayString namespacesList; this->GetNamespacesList(namespacesList); // validate each namespace for(unsigned int i = 0; i < namespacesList.Count(); i++) { if(!IsValidCppIndetifier(namespacesList[i])) { wxString msg; msg << wxT("'") << namespacesList[i] << _("' is not a valid C++ qualifier"); wxMessageBox(msg, _("CodeLite"), wxOK | wxICON_WARNING); return false; } } } // validate the path of the class wxString path(m_textCtrlGenFilePath->GetValue()); if(!wxDir::Exists(path)) { wxString msg; msg << wxT("'") << path << _("': directory does not exist"); wxMessageBox(msg, _("CodeLite"), wxOK | wxICON_WARNING); return false; } if(GetClassFile().IsEmpty()) { wxMessageBox(_("Empty file name"), _("CodeLite"), wxOK | wxICON_WARNING); return false; } wxString cpp_file; cpp_file << GetClassPath() << wxFileName::GetPathSeparator() << GetClassFile() << wxT(".cpp"); if(wxFileName::FileExists(cpp_file)) { if(wxMessageBox( wxString::Format(_("A file with this name: '%s' already exists, continue anyway?"), cpp_file.GetData()), _("CodeLite"), wxYES_NO | wxICON_WARNING) == wxNO) { return false; } } wxString h_file; h_file << GetClassPath() << wxFileName::GetPathSeparator() << GetClassFile() << wxT(".h"); if(wxFileName::FileExists(h_file)) { if(wxMessageBox( wxString::Format(_("A file with this name: '%s' already exists, continue anyway?"), h_file.GetData()), _("CodeLite"), wxYES_NO | wxICON_WARNING) == wxNO) { return false; } } if(GetVirtualDirectoryPath().IsEmpty()) { wxMessageBox(_("Please select a virtual directory"), _("CodeLite"), wxOK | wxICON_WARNING); return false; } return true; }
ClangThreadRequest* ClangDriver::DoMakeClangThreadRequest(IEditor* editor, WorkingContext context) { ///////////////////////////////////////////////////////////////// // Prepare all the buffers required by the thread wxString fileName = editor->GetFileName().GetFullPath(); wxString currentBuffer = editor->GetTextRange(0, editor->GetLength()); wxString filterWord; // Move backward until we found our -> or :: or . m_position = editor->GetCurrentPosition(); wxString tmpBuffer = editor->GetTextRange(0, editor->GetCurrentPosition()); while(!tmpBuffer.IsEmpty()) { // Context word complete and we found a whitespace - break the search if((context == CTX_WordCompletion || context == CTX_Calltip) && wxIsWhitespace(tmpBuffer.Last())) { break; } if(context == CTX_WordCompletion && !IsValidCppIndetifier(tmpBuffer.Last())) { break; } if(tmpBuffer.EndsWith(wxT("->")) || tmpBuffer.EndsWith(wxT(".")) || tmpBuffer.EndsWith(wxT("::"))) { break; } else { filterWord.Prepend(tmpBuffer.Last()); tmpBuffer.RemoveLast(); } } // Get the current line's starting pos int lineStartPos = editor->PosFromLine(editor->GetCurrentLine()); int column = editor->GetCurrentPosition() - lineStartPos + 1; int lineNumber = editor->GetCurrentLine() + 1; if(context == CTX_GotoDecl || context == CTX_GotoImpl) { wxString sel = editor->GetSelection(); if(sel.IsEmpty()) { filterWord = editor->GetWordAtCaret(); } else { filterWord = sel; column = editor->GetSelectionStart() - lineStartPos + 1; } } else { column -= (int)filterWord.Length(); } // Column can not be lower than 1 switch(context) { case CTX_Calltip: case CTX_WordCompletion: case CTX_CodeCompletion: if(column < 1) { CL_DEBUG(wxT("Clang: column can not be lower than 1")); m_isBusy = false; return NULL; } break; default: break; } wxString projectPath; wxString pchFile; FileTypeCmpArgs_t compileFlags = DoPrepareCompilationArgs(editor->GetProjectName(), fileName, projectPath, pchFile); #if 0 //{ // Prepare a copy of the file but with as special prefix CODELITE_CLANG_FILE_PREFIX // We do this because on Windows, libclang locks the file so // the user can not save into the file until it is released by libclang (which may take a while...) // we overcome this by letting clang compile a copy of the file // The temporary file that was created for this purpose is later deleted by a special "cleaner" thread // which removes all kind of libclang leftovers (preamble*.pch files under %TMP% and these files) wxFileName source_file(fileName); source_file.SetFullName( CODELITE_CLANG_FILE_PREFIX + source_file.GetFullName() ); { wxLogNull nl; ::wxCopyFile( fileName, source_file.GetFullPath() ); } //} #else wxFileName source_file(fileName); #endif ClangThreadRequest* request = new ClangThreadRequest(m_index, fileName, currentBuffer, compileFlags, filterWord, context, lineNumber, column, DoCreateListOfModifiedBuffers(editor)); request->SetFileName(source_file.GetFullPath()); return request; }