diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f4b152ce..64b13867a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,4 +12,188 @@ Your pull requests are welcome; however, they may not be accepted for various re In short: The easier the code review is, the better the chance your pull request will get accepted. - + +##Coding style: + +####GENERAL + +* Do not use Java-like braces: + +GOOD: +```c + if () + { + // Do something + } +``` +BAD: + ```c + if () { + // Do something + } +``` +* Use tabs instead of whitespaces (we usually set our editors to 4 + whitespaces for 1 tab, but the choice is up to you) + + +* Always leave one space before and after binary and ternary operators + Only leave one space after semi-colons in "for" statements. + +GOOD: +```c + if (10 == a && 42 == b) +``` +BAD: + ```c + if (a==10&&b==42) +``` +GOOD: + ```c + for (int i = 0; i != 10; ++i) + ``` +BAD: + ```c + for(int i=0;i<10;++i) +``` +* Keywords are not function calls. + Function names are not separated from the first parenthesis: + +GOOD: +```c + foo(); + myObject.foo(24); +``` +BAD: +```c + foo (); +``` +* Keywords are separated from the first parenthesis by one space : + +GOOD: +```c + if (true) + while (true) +``` +BAD: +```c + if(myCondition) +``` + +* Use the following indenting for "switch" statements +```c + switch (test) + { + case 1: + { + // Do something + break; + } + default: + // Do something else + } // No semi-colon here +``` + +* Avoid magic numbers + +BAD: +```c + while (lifeTheUniverseAndEverything != 42) + lifeTheUniverseAndEverything = buildMorePowerfulComputerForTheAnswer(); +``` +GOOD: +```c + if (foo < I_CAN_PUSH_ON_THE_RED_BUTTON) + startThermoNuclearWar(); +``` + +* Prefer enums for integer constants + + + +####NAMING CONVENTIONS + +* Classes (camel case) : + +GOOD: +```c + class IAmAClass + {}; +``` +BAD: +```c + class iAmClass + {}; + class I_am_class + {}; +``` + +* methods (camel case + begins with a lower case) + method parameters (camel case + begins with a lower case) + +GOOD: +```c + void myMethod(uint myVeryLongParameter); +``` +* member variables + Any member variable name of class/struct should be preceded by an underscore +```c + public: + int _publicAttribute; + private: + int _pPrivateAttribute; + float _pAccount; +``` + +* Always prefer a variable name that describes what the variable is used for + +GOOD: +```c + if (hours < 24 && minutes < 60 && seconds < 60) +``` +BAD: +```c + if (a < 24 && b < 60 && c < 60) +``` + +####COMMENTS + +* Use C++ comment line style than c comment style + +GOOD: +``` + // Two lines comment + // Use still C++ comment line style +``` +BAD: +``` + /* + Please don't piss me off with that + */ +``` + + +####BEST PRACTICES + +* Prefer this form : +```c + ++i +``` + to +```c + i++ +``` + (It does not change anything for builtin types but it would bring consistency) + + +* Avoid using pointers. Prefer references. You might need the variable to + be assigned a NULL value: in this case the NULL value has semantics and must + be checked. Wherever possible, use a SmartPtr instead of old-school pointers. + +* Avoid using new if you can use automatic variable. + +* Don't place any "using namespace" directives in headers + +* Compile time is without incidence. Increasing compile time to reduce execution + time is encouraged. + +* Code legibility and length is less important than easy and fast end-user experience. diff --git a/PowerEditor/src/MISC/Common/LongRunningOperation.cpp b/PowerEditor/src/MISC/Common/LongRunningOperation.cpp new file mode 100644 index 000000000..7191197df --- /dev/null +++ b/PowerEditor/src/MISC/Common/LongRunningOperation.cpp @@ -0,0 +1,42 @@ +// This file is part of Notepad++ project +// Copyright (C)2003 Don HO +// +// 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. +// +// Note that the GPL places important restrictions on "derived works", yet +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a +// "derivative work" for the purpose of this license if it does any of the +// following: +// 1. Integrates source code from Notepad++. +// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable +// installer, such as those produced by InstallShield. +// 3. Links to a library or executes a program that does any of the above. +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + +#include "LongRunningOperation.h" +#include + +static std::recursive_mutex _operationMutex; + +LongRunningOperation::LongRunningOperation() +{ + _operationMutex.lock(); +} + +LongRunningOperation::~LongRunningOperation() +{ + _operationMutex.unlock(); +} \ No newline at end of file diff --git a/PowerEditor/src/MISC/Common/LongRunningOperation.h b/PowerEditor/src/MISC/Common/LongRunningOperation.h new file mode 100644 index 000000000..691f5b644 --- /dev/null +++ b/PowerEditor/src/MISC/Common/LongRunningOperation.h @@ -0,0 +1,39 @@ +// This file is part of Notepad++ project +// Copyright (C)2003 Don HO +// +// 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. +// +// Note that the GPL places important restrictions on "derived works", yet +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a +// "derivative work" for the purpose of this license if it does any of the +// following: +// 1. Integrates source code from Notepad++. +// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable +// installer, such as those produced by InstallShield. +// 3. Links to a library or executes a program that does any of the above. +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + +#ifndef M30_IDE_LONGRUNNINGOPERATION_h +#define M30_IDE_LONGRUNNINGOPERATION_h + +class LongRunningOperation +{ +public: + LongRunningOperation(); + ~LongRunningOperation(); +}; + +#endif //M30_IDE_LONGRUNNINGOPERATION_h diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index db16c461e..98542483d 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -36,6 +36,7 @@ #include "documentMap.h" #include "functionListPanel.h" #include "Sorters.h" +#include "LongRunningOperation.h" void Notepad_plus::macroPlayback(Macro macro) @@ -178,16 +179,22 @@ void Notepad_plus::command(int id) break; case IDM_EDIT_UNDO: + { + LongRunningOperation op; _pEditView->execute(WM_UNDO); checkClipboard(); checkUndoState(); break; + } case IDM_EDIT_REDO: + { + LongRunningOperation op; _pEditView->execute(SCI_REDO); checkClipboard(); checkUndoState(); break; + } case IDM_EDIT_CUT: _pEditView->execute(WM_CUT); @@ -260,6 +267,7 @@ void Notepad_plus::command(int id) case IDM_EDIT_PASTE: { + LongRunningOperation op; int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); _pEditView->execute(SCI_PASTE); _pEditView->execute(SCI_CONVERTEOLS, eolMode); @@ -268,6 +276,7 @@ void Notepad_plus::command(int id) case IDM_EDIT_PASTE_BINARY: { + LongRunningOperation op; if (!IsClipboardFormatAvailable(CF_TEXT)) return; @@ -312,6 +321,7 @@ void Notepad_plus::command(int id) case IDM_EDIT_PASTE_AS_RTF: case IDM_EDIT_PASTE_AS_HTML: { + LongRunningOperation op; UINT f = RegisterClipboardFormat(id==IDM_EDIT_PASTE_AS_HTML?CF_HTML:CF_RTF); if (!IsClipboardFormatAvailable(f)) @@ -354,6 +364,8 @@ void Notepad_plus::command(int id) case IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING: case IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING: { + LongRunningOperation op; + size_t fromLine = 0, toLine = 0; size_t fromColumn = 0, toColumn = 0; diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index f6f242936..875bf973a 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -34,6 +34,7 @@ #include "ScintillaEditView.h" #include "EncodingMapper.h" #include "uchardet.h" +#include "LongRunningOperation.h" FileManager * FileManager::_pSelf = new FileManager(); @@ -60,10 +61,11 @@ Buffer::Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus _userLangExt = TEXT(""); _fullPathName = TEXT(""); _fileName = NULL; + _currentStatus = type; + setFileName(fileName, ndds._lang); updateTimeStamp(); checkFileState(); - _currentStatus = type; _isDirty = false; _needLexer = false; //new buffers do not need lexing, Scintilla takes care of that @@ -674,6 +676,8 @@ For untitled document (new 4) */ bool FileManager::backupCurrentBuffer() { + LongRunningOperation op; + Buffer * buffer = _pNotepadPlus->getCurrentBuffer(); bool result = false; bool hasModifForSession = false; diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp index 6720f66fd..74e46e462 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -31,6 +31,7 @@ #include "ScintillaEditView.h" #include "Notepad_plus_msgs.h" #include "UniConversion.h" +#include "LongRunningOperation.h" FindOption * FindReplaceDlg::_env; FindOption FindReplaceDlg::_options; @@ -725,6 +726,7 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP case IDREPLACE : { + LongRunningOperation op; if (_currentStatus == REPLACE_DLG) { setStatusbarMessage(TEXT(""), FSNoMessage); @@ -811,6 +813,7 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP case IDD_FINDINFILES_REPLACEINFILES : { + LongRunningOperation op; setStatusbarMessage(TEXT(""), FSNoMessage); const int filterSize = 256; TCHAR filters[filterSize]; @@ -851,6 +854,7 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP case IDC_REPLACE_OPENEDFILES : { + LongRunningOperation op; if (_currentStatus == REPLACE_DLG) { setStatusbarMessage(TEXT(""), FSNoMessage); @@ -871,6 +875,7 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP case IDREPLACEALL : { + LongRunningOperation op; if (_currentStatus == REPLACE_DLG) { setStatusbarMessage(TEXT(""), FSNoMessage); diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 6877fd60b..cdb800deb 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -217,7 +217,7 @@ std ieee work standard textio std_logic_1164 std_logic_arith std_logic_misc std_logic_signed std_logic_textio std_logic_unsigned numeric_bit numeric_std math_complex math_real vital_primitives vital_timing boolean bit character severity_level integer real time delay_length natural positive string bit_vector file_open_kind file_open_status line text side width std_ulogic std_ulogic_vector std_logic std_logic_vector X01 X01Z UX01 UX01Z unsigned signed - + diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj index bab03030f..762db8006 100644 --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -138,6 +138,7 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml + diff --git a/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj b/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj index b8fe86275..17c3bf724 100644 --- a/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj @@ -59,16 +59,13 @@ Neither ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) WIN32;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) - true Async Default MultiThreadedDebug - Create - precompiledHeaders.h - $(IntDir)$(TargetName).pch Level4 true ProgramDatabase + true 4456;4457;4459 @@ -106,12 +103,11 @@ Async MultiThreaded true - Create - precompiledHeaders.h Level4 true ProgramDatabase NoExtensions + true 4456;4457;4459 @@ -211,7 +207,6 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml -