notepad-plus-plus-legacy/PowerEditor/src/Notepad_plus.h

588 lines
17 KiB
C
Raw Normal View History

//this file is part of notepad++
//Copyright (C)2003 Don HO ( donho@altern.org )
//
//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., 675 Mass Ave, Cambridge, MA 02139, USA.
#ifndef NOTEPAD_PLUS_H
#define NOTEPAD_PLUS_H
#ifndef SCINTILLA_EDIT_VIEW_H
#include "ScintillaEditView.h"
#endif //SCINTILLA_EDIT_VIEW_H
#ifndef DOCTABVIEW_H
#include "DocTabView.h"
#endif //DOCTABVIEW_H
#ifndef SPLITTER_CONTAINER_H
#include "SplitterContainer.h"
#endif //SPLITTER_CONTAINER_H
#ifndef FIND_REPLACE_DLG_H
#include "FindReplaceDlg.h"
#endif //FIND_REPLACE_DLG_H
#ifndef ABOUT_DLG_H
#include "AboutDlg.h"
#endif //ABOUT_DLG_H
#ifndef RUN_DLG_H
#include "RunDlg.h"
#endif //RUN_DLG_H
#ifndef STATUS_BAR_H
#include "StatusBar.h"
#endif //STATUS_BAR_H
#ifndef LASTRECENTFILELIST_H
#include "lastRecentFileList.h"
#endif //LASTRECENTFILELIST_H
#ifndef GOTILINE_DLG_H
#include "GoToLineDlg.h"
#endif //GOTILINE_DLG_H
#ifndef COLUMNEDITOR_H
#include "columnEditor.h"
#endif //COLUMNEDITOR_H
#ifndef WORD_STYLE_H
#include "WordStyleDlg.h"
#endif //WORD_STYLE_H
#ifndef TRAY_ICON_CONTROLER_H
#include "trayIconControler.h"
#endif //TRAY_ICON_CONTROLER_H
#ifndef PLUGINSMANAGER_H
#include "PluginsManager.h"
#endif //PLUGINSMANAGER_H
/*
#ifndef NOTEPAD_PLUS_MSGS_H
#include "Notepad_plus_msgs.h"
#endif //NOTEPAD_PLUS_MSGS_H
*/
#ifndef PREFERENCE_DLG_H
#include "preferenceDlg.h"
#endif //PREFERENCE_DLG_H
#ifndef WINDOWS_DLG_H
#include "WindowsDlg.h"
#endif //WINDOWS_DLG_H
#ifndef RUN_MACRO_DLG_H
#include "RunMacroDlg.h"
#endif //RUN_MACRO_DLG_H
#ifndef DOCKINGMANAGER_H
#include "DockingManager.h"
#endif //DOCKINGMANAGER_H
#ifndef PROCESSUS_H
#include "Process.h"
#endif //PROCESSUS_H
#ifndef AUTOCOMPLETION_H
#include "AutoCompletion.h"
#endif //AUTOCOMPLETION_H
#ifndef SMARTHIGHLIGHTER_H
#include "SmartHighlighter.h"
#endif //SMARTHIGHLIGHTER_H
#ifndef SCINTILLACTRLS_H
#include "ScintillaCtrls.h"
#endif //SCINTILLACTRLS_H
#ifndef SIZE_DLG_H
#include "lesDlgs.h"
#endif //SIZE_DLG_H
#include "localization.h"
#define MENU 0x01
#define TOOLBAR 0x02
#define URL_REG_EXPR "[A-Za-z]+://[A-Za-z0-9_\\-\\+~.:?&@=/%#,;\\{\\}\\(\\)\\[\\]\\|\\*\\!\\\\]+"
enum FileTransferMode {
TransferClone = 0x01,
TransferMove = 0x02
};
enum WindowStatus { //bitwise mask
WindowMainActive = 0x01,
WindowSubActive = 0x02,
WindowBothActive = 0x03, //little helper shortcut
WindowUserActive = 0x04,
WindowMask = 0x07
};
/*
//Plugins rely on #define's
enum Views {
MAIN_VIEW = 0x00,
SUB_VIEW = 0x01
};
*/
struct TaskListInfo;
struct VisibleGUIConf {
bool isPostIt;
bool isFullScreen;
//Used by both views
bool isMenuShown;
//bool isToolbarShown; //toolbar forcefully hidden by hiding rebar
DWORD_PTR preStyle;
//used by postit only
bool isTabbarShown;
bool isAlwaysOnTop;
bool isStatusbarShown;
//used by fullscreen only
WINDOWPLACEMENT _winPlace;
VisibleGUIConf() : isPostIt(false), isFullScreen(false),
isAlwaysOnTop(false), isMenuShown(true), isTabbarShown(true),
isStatusbarShown(true), preStyle(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN)
{
_winPlace.length = 0;
};
};
class FileDialog;
class Notepad_plus : public Window {
enum comment_mode {cm_comment, cm_uncomment, cm_toggle};
public:
Notepad_plus();
virtual ~Notepad_plus();
void init(HINSTANCE, HWND, const TCHAR *cmdLine, CmdLineParams *cmdLineParams);
void killAllChildren();
virtual void destroy(){
::DestroyWindow(_hSelf);
};
static const TCHAR * Notepad_plus::getClassName() {
return _className;
};
void setTitle();
void getTaskListInfo(TaskListInfo *tli);
// For filtering the modeless Dialog message
bool isDlgsMsg(MSG *msg, bool unicodeSupported) const;
// fileOperations
//The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone
BufferID doOpen(const TCHAR *fileName, bool isReadOnly = false, int encoding = -1);
bool doReload(BufferID id, bool alert = true);
bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false);
void doClose(BufferID, int whichOne);
//bool doDelete(const TCHAR *fileName) const {return ::DeleteFile(fileName) != 0;};
void fileOpen();
void fileNew() {
BufferID newBufID = MainFileManager->newEmptyDocument();
loadBufferIntoView(newBufID, currentView(), true); //true, because we want multiple new files if possible
activateBuffer(newBufID, currentView());
};
bool fileReload() {
BufferID buf = _pEditView->getCurrentBufferID();
return doReload(buf, buf->isDirty());
};
bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from
bool fileCloseAll();
bool fileCloseAllButCurrent();
bool fileSave(BufferID id = BUFFER_INVALID);
bool fileSaveAll();
bool fileSaveAs(BufferID id = BUFFER_INVALID, bool isSaveCopy = false);
bool fileDelete(BufferID id = BUFFER_INVALID);
bool fileRename(BufferID id = BUFFER_INVALID);
bool addBufferToView(BufferID id, int whichOne);
bool moveBuffer(BufferID id, int whereTo); //assumes whereFrom is otherView(whereTo)
bool switchToFile(BufferID buffer); //find buffer in active view then in other view.
// end fileOperations
bool isFileSession(const TCHAR * filename);
void filePrint(bool showDialog);
bool saveScintillaParams(bool whichOne);
bool saveGUIParams();
void saveDockingParams();
void saveUserDefineLangs() {
if (ScintillaEditView::getUserDefineDlg()->isDirty())
(NppParameters::getInstance())->writeUserDefinedLang();
};
void saveShortcuts(){
NppParameters::getInstance()->writeShortcuts();
};
void saveSession(const Session & session);
void saveFindHistory(){
_findReplaceDlg.saveFindHistory();
(NppParameters::getInstance())->writeFindHistory();
};
void getCurrentOpenedFiles(Session & session);
bool fileLoadSession(const TCHAR *fn = NULL);
const TCHAR * fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save);
const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR ** fileNames = NULL);
void changeToolBarIcons();
bool doBlockComment(comment_mode currCommentMode);
bool doStreamComment();
void doTrimTrailing();
HACCEL getAccTable() const{
return _accelerator.getAccTable();
};
bool addCurrentMacro();
void loadLastSession(){
Session lastSession = (NppParameters::getInstance())->getSession();
loadSession(lastSession);
};
bool loadSession(Session & session);
winVer getWinVersion() const {return _winVersion;};
bool emergency(generic_string emergencySavedDir);
void notifyBufferChanged(Buffer * buffer, int mask);
bool findInFiles();
bool replaceInFiles();
void setFindReplaceFolderFilter(const TCHAR *dir, const TCHAR *filters);
vector<generic_string> addNppComponents(const TCHAR *destDir, const TCHAR *extFilterName, const TCHAR *extFilter);
int getHtmlXmlEncoding(const TCHAR *fileName) const;
static HWND gNppHWND; //static handle to Notepad++ window, NULL if non-existant
private:
static const TCHAR _className[32];
Window *_pMainWindow;
DockingManager _dockingManager;
AutoCompletion _autoCompleteMain;
AutoCompletion _autoCompleteSub; //each Scintilla has its own autoComplete
SmartHighlighter _smartHighlighter;
NativeLangSpeaker _nativeLangSpeaker;
DocTabView _mainDocTab;
DocTabView _subDocTab;
DocTabView *_pDocTab;
DocTabView *_pNonDocTab;
ScintillaEditView _subEditView;
ScintillaEditView _mainEditView;
ScintillaEditView _invisibleEditView; //for searches
ScintillaEditView _fileEditView; //for FileManager
ScintillaEditView *_pEditView;
ScintillaEditView *_pNonEditView;
SplitterContainer *_pMainSplitter;
SplitterContainer _subSplitter;
ContextMenu _tabPopupMenu, _tabPopupDropMenu;
ToolBar _toolBar;
IconList _docTabIconList;
StatusBar _statusBar;
bool _toReduceTabBar;
ReBar _rebarTop;
ReBar _rebarBottom;
// Dialog
FindReplaceDlg _findReplaceDlg;
FindIncrementDlg _incrementFindDlg;
AboutDlg _aboutDlg;
RunDlg _runDlg;
GoToLineDlg _goToLineDlg;
ColumnEditorDlg _colEditorDlg;
WordStyleDlg _configStyleDlg;
PreferenceDlg _preference;
// a handle list of all the Notepad++ dialogs
vector<HWND> _hModelessDlgs;
LastRecentFileList _lastRecentFileList;
//vector<iconLocator> _customIconVect;
WindowsMenu _windowsMenu;
HMENU _mainMenuHandle;
bool _sysMenuEntering;
bool _isPrelaunch;
// For FullScreen/PostIt features
VisibleGUIConf _beforeSpecialView;
void fullScreenToggle();
void postItToggle();
// Keystroke macro recording and playback
Macro _macro;
bool _recordingMacro;
RunMacroDlg _runMacroDlg;
// For hotspot
bool _linkTriggered;
bool _isDocModifing;
bool _isHotspotDblClicked;
//For Dynamic selection highlight
CharacterRange _prevSelectedRange;
struct ActivateAppInfo {
bool _isActivated;
int _x;
int _y;
ActivateAppInfo() : _isActivated(false), _x(0), _y(0){};
} _activeAppInf;
//Synchronized Scolling
struct SyncInfo {
int _line;
int _column;
bool _isSynScollV;
bool _isSynScollH;
SyncInfo():_line(0), _column(0), _isSynScollV(false), _isSynScollH(false){};
bool doSync() const {return (_isSynScollV || _isSynScollH); };
} _syncInfo;
bool _isUDDocked;
trayIconControler *_pTrayIco;
int _zoomOriginalValue;
Accelerator _accelerator;
ScintillaAccelerator _scintaccelerator;
PluginsManager _pluginsManager;
ButtonDlg _restoreButton;
winVer _winVersion;
bool _isFileOpening;
ScintillaCtrls _scintillaCtrls4Plugins;
vector<pair<int, int> > _hideLinesMarks;
StyleArray _hotspotStyles;
bool _rememberThisSession; // always true. except -nosession is indicated on the launch time
static LRESULT CALLBACK Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
BOOL notify(SCNotification *notification);
void specialCmd(int id, int param);
void command(int id);
//Document management
UCHAR _mainWindowStatus; //For 2 views and user dialog if docked
int _activeView;
//User dialog docking
void dockUserDlg();
void undockUserDlg();
//View visibility
void showView(int whichOne);
bool viewVisible(int whichOne);
void hideView(int whichOne);
void hideCurrentView();
bool bothActive() { return (_mainWindowStatus & WindowBothActive) == WindowBothActive; };
bool reloadLang();
bool loadStyles();
int currentView(){
return _activeView;
};
int otherView(){
return (_activeView == MAIN_VIEW?SUB_VIEW:MAIN_VIEW);
};
int otherFromView(int whichOne){
return (whichOne == MAIN_VIEW?SUB_VIEW:MAIN_VIEW);
};
bool canHideView(int whichOne); //true if view can safely be hidden (no open docs etc)
int switchEditViewTo(int gid); //activate other view (set focus etc)
void docGotoAnotherEditView(FileTransferMode mode); //TransferMode
void docOpenInNewInstance(FileTransferMode mode, int x = 0, int y = 0);
void loadBufferIntoView(BufferID id, int whichOne, bool dontClose = false); //Doesnt _activate_ the buffer
void removeBufferFromView(BufferID id, int whichOne); //Activates alternative of possible, or creates clean document if not clean already
bool activateBuffer(BufferID id, int whichOne); //activate buffer in that view if found
void notifyBufferActivated(BufferID bufid, int view);
void performPostReload(int whichOne);
//END: Document management
int doSaveOrNot(const TCHAR *fn);
int doReloadOrNot(const TCHAR *fn, bool dirty);
int doCloseOrNot(const TCHAR *fn);
int doDeleteOrNot(const TCHAR *fn);
int doActionOrNot(const TCHAR *title, const TCHAR *displayText, int type);
void enableMenu(int cmdID, bool doEnable) const;
void enableCommand(int cmdID, bool doEnable, int which) const;
void checkClipboard();
void checkDocState();
void checkUndoState();
void checkMacroState();
void checkSyncState();
void dropFiles(HDROP hdrop);
void checkModifiedDocument();
void getMainClientRect(RECT & rc) const;
void dynamicCheckMenuAndTB() const;
void enableConvertMenuItems(formatType f) const;
void checkUnicodeMenuItems() const;
generic_string getLangDesc(LangType langType, bool shortDesc = false);
void setLangStatus(LangType langType){
_statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE);
};
void setDisplayFormat(formatType f);
int getCmdIDFromEncoding(int encoding) const;
void setUniModeText();
void checkLangsMenu(int id) const ;
void setLanguage(LangType langType);
enum LangType menuID2LangType(int cmdID);
int getFolderMarginStyle() const;
void checkFolderMarginStyleMenu(int id2Check) const {
::CheckMenuRadioItem(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_SIMPLE, IDM_VIEW_FOLDERMAGIN_BOX, id2Check, MF_BYCOMMAND);
};
int getFolderMaginStyleIDFrom(folderStyle fStyle) const;
void checkMenuItem(int itemID, bool willBeChecked) const {
::CheckMenuItem(_mainMenuHandle, itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED));
};
void charAdded(TCHAR chAdded);
void MaintainIndentation(TCHAR ch);
void addHotSpot(bool docIsModifing = false);
void bookmarkAdd(int lineno) const {
if (lineno == -1)
lineno = _pEditView->getCurrentLineNumber();
if (!bookmarkPresent(lineno))
_pEditView->execute(SCI_MARKERADD, lineno, MARK_BOOKMARK);
};
void bookmarkDelete(int lineno) const {
if (lineno == -1)
lineno = _pEditView->getCurrentLineNumber();
if ( bookmarkPresent(lineno))
_pEditView->execute(SCI_MARKERDELETE, lineno, MARK_BOOKMARK);
};
bool bookmarkPresent(int lineno) const {
if (lineno == -1)
lineno = _pEditView->getCurrentLineNumber();
LRESULT state = _pEditView->execute(SCI_MARKERGET, lineno);
return ((state & (1 << MARK_BOOKMARK)) != 0);
};
void bookmarkToggle(int lineno) const {
if (lineno == -1)
lineno = _pEditView->getCurrentLineNumber();
if (bookmarkPresent(lineno))
bookmarkDelete(lineno);
else
bookmarkAdd(lineno);
};
void bookmarkNext(bool forwardScan);
void bookmarkClearAll() const {
_pEditView->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK);
};
void copyMarkedLines();
void cutMarkedLines();
void deleteMarkedLines();
void pasteToMarkedLines();
void deleteMarkedline(int ln);
void replaceMarkedline(int ln, const TCHAR *str);
generic_string getMarkedLine(int ln);
void findMatchingBracePos(int & braceAtCaret, int & braceOpposite);
bool braceMatch();
void activateNextDoc(bool direction);
void activateDoc(int pos);
void updateStatusBar();
size_t getSelectedCharNumber(UniMode);
size_t getCurrentDocCharCount(size_t numLines, UniMode u);
int getSelectedAreas();
int _numSel;
size_t getSelectedBytes();
bool isFormatUnicode(UniMode);
int getBOMSize(UniMode);
void showAutoComp();
void autoCompFromCurrentFile(bool autoInsert = true);
void showFunctionComp();
//void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText);
bool replaceAllFiles();
bool findInOpenedFiles();
bool findInCurrentFile();
bool matchInList(const TCHAR *fileName, const vector<generic_string> & patterns);
void getMatchedFileNames(const TCHAR *dir, const vector<generic_string> & patterns, vector<generic_string> & fileNames, bool isRecursive, bool isInHiddenDir);
void doSynScorll(HWND hW);
void setWorkingDir(const TCHAR *dir);
bool str2Cliboard(const TCHAR *str2cpy);
bool bin2Cliboard(const UCHAR *uchar2cpy, size_t length);
bool getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible);
int getLangFromMenuName(const TCHAR * langName);
generic_string getLangFromMenu(const Buffer * buf);
generic_string Notepad_plus::exts2Filters(generic_string exts) const;
int setFileOpenSaveDlgFilters(FileDialog & fDlg, int langType = -1);
void markSelectedTextInc(bool enable);
Style * getStyleFromName(const TCHAR *styleName);
bool dumpFiles(const TCHAR * outdir, const TCHAR * fileprefix = TEXT("")); //helper func
void drawTabbarColoursFromStylerArray();
void loadCommandlineParams(const TCHAR * commandLine, CmdLineParams * pCmdParams);
bool noOpenedDoc() const;
bool goToPreviousIndicator(int indicID2Search, bool isWrap = true) const;
bool goToNextIndicator(int indicID2Search, bool isWrap = true) const;
};
#endif //NOTEPAD_PLUS_H