1 #ifndef Header_Config_Manager
2 #define Header_Config_Manager
3 
4 #include "mostQtHeaders.h"
5 
6 #include "buildmanager.h"
7 #include "configmanagerinterface.h"
8 #include "smallUsefulFunctions.h"
9 
10 class ConfigDialog;
11 class LatexCompleterConfig;
12 class LatexEditorViewConfig;
13 class WebPublishDialogConfig;
14 class InsertGraphicsConfig;
15 struct PDFDocumentConfig;
16 class GrammarCheckerConfig;
17 class InternalTerminalConfig;
18 
19 #ifdef Q_OS_WIN
20 const QKeySequence::SequenceFormat SHORTCUT_FORMAT = QKeySequence::PortableText;
21 #else
22 const QKeySequence::SequenceFormat SHORTCUT_FORMAT = QKeySequence::NativeText;
23 #endif
24 
25 struct ManagedToolBar {
26 	QString name;
27 	QStringList defaults;
28 	QStringList actualActions;
29 	QToolBar *toolbar;
30 	ManagedToolBar(const QString &newName, const QStringList &defs);
31 };
32 
33 class ConfigManager: public QObject, public ConfigManagerInterface
34 {
35 	Q_OBJECT
36 
37 public:
38     static const int MAX_NUM_MACROS = 5000;
39 
40     ConfigManager(QObject *parent = nullptr);
41 	~ConfigManager();
42 
43 	QString iniPath();
44 	static QString portableConfigDir();
45 	bool isPortableMode();
46 
47 	QSettings *newQSettings();
48 	QSettings *readSettings(bool reread = false);
49 	QSettings *saveSettings(const QString &saveName = "");
50     QSettings *getSettings();
51 
52     void saveMacros();
53 
54     bool execConfigDialog(QWidget *parentToDialog);
55 
56 //public configuration
57 
58 	static QTextCodec *newFileEncoding;
59 	QString newFileEncodingName;
60 	bool autoDetectEncodingFromChars;
61 	bool autoDetectEncodingFromLatex;
62 	QStringList commonEncodings;
63 
64 	QHash<QString, int> editorKeys;
65 	QSet<int> editorAvailableOperations;
66 
67 	//startup
68 	bool checkLatexConfiguration;
69 
70 	//build
71 	BuildManager *buildManager;
72 	bool showMessagesWhenCompiling;
73 	bool runLaTeXBibTeXLaTeX;
74 	int showStdoutOption; //never = 0, user commands, always
75 
76 	//svn
77 	//bool autoCheckinAfterSave;
78 	int autoCheckinAfterSaveLevel;
79     int useVCS; // 0 SVN   1 GIT
80 	bool svnUndo;
81 	bool svnKeywordSubstitution;
82 	int svnSearchPathDepth;
83 
84 
85 	//appearance
86 	QPalette systemPalette;
87 	QString interfaceStyle;
88 	QString interfaceFontFamily;
89 	int guiToolbarIconSize, guiSymbolGridIconSize;
90 	int guiSecondaryToolbarIconSize;
91     int guiPDFToolbarIconSize;
92     int guiConfigShortcutColumnWidth;
93 	bool useTexmakerPalette;
94 	int interfaceFontSize;
95 	bool mruDocumentChooser;
96 	bool configShowAdvancedOptions, configRiddled;
97 	bool centralVisible;
98 	bool showStatusbar;
99 	bool showLineNumbersInStructure;
100 	int indentationInStructure;
101 	bool indentIncludesInStructure;
102 	bool showCommentedElementsInStructure;
103 	bool markStructureElementsBeyondEnd;
104 	bool markStructureElementsInAppendix;
105     int globalTOCbackgroundOptions;
106 	QString referenceCommandsInContextMenu;
107     bool structureShowSingleDoc;
108     bool structureScrollToCurrentPosition;
109 
110     bool macroEditorUsesLineWrap;
111 
112 	//update
113 	bool autoUpdateCheck;
114 	int updateLevel;
115 	int autoUpdateCheckIntervalDays;
116 	QDateTime lastUpdateCheck;
117 
118 	//language
119 	QString language, lastLanguage;
120 	QTranslator *appTranslator;
121 	QTranslator *basicTranslator;
122 
123 	//editor
124 	LatexEditorViewConfig *const editorConfig;
125 	//completion
126 	LatexCompleterConfig *const completerConfig;
127 
128 	//webpublish dialog
129 	WebPublishDialogConfig *const webPublishDialogConfig;
130 	//pdf preview
131 	PDFDocumentConfig *const pdfDocumentConfig;
132 
133 	//other dialogs
134 	int lastHardWrapColumn;
135 	bool lastHardWrapSmartScopeSelection;
136 	bool lastHardWrapJoinLines;
137 
138 	//insert graphics dialog
139 	InsertGraphicsConfig *const insertGraphicsConfig;
140 
141 	//Grammar check
142 	GrammarCheckerConfig *const grammarCheckerConfig;
143 
144 	//Terminal
145 	InternalTerminalConfig *const terminalConfig;
146 
147 	//bool autoReplaceCommands; // moved to static codesnippet
148 
149 	int tabstop;
150 
151 	bool useEscForClosingLog;
152 	bool useEscForClosingEmbeddedViewer;
153 	bool useEscForClosingFullscreen;
154 	bool showShortcutsInTooltips;
155 	int replaceQuotes; //0: none, 1: ``..'', 2: \"< \"> 3: \"`..\"' , 4: \\og..\\fg{} 5: \"> \"<
156 
157 	// table autoformat
158 	QString tableAutoFormatSpecialCommands; // colon separated
159 	int tableAutoFormatSpecialCommandPos;
160 	bool tableAutoFormatOneLinePerCell;
161 
162 	// LogView
163 	double logViewWarnIfFileSizeLargerMB;
164     int logViewRememberChoice;
165 
166 	//preview
167 	enum PreviewMode {PM_TOOLTIP_AS_FALLBACK = 0, PM_PANEL, PM_TOOLTIP, PM_BOTH, PM_INLINE, PM_EMBEDDED};
168 	enum AutoPreviewMode {AP_NEVER = 0, AP_PREVIOUSLY = 1};
169 	PreviewMode previewMode;
170 	AutoPreviewMode autoPreview;
171 	int autoPreviewDelay;
172 	int segmentPreviewScalePercent;
173 
174 	// embedded viewer
175 	bool viewerEnlarged;
176 
177 	//files
178 	QString lastDocument; //last opened document, for file open directory
179 	QStringList recentFilesList, recentProjectList, recentSessionList;
180 	QMap<QString, QString> recentFileHighlightLanguage;
181 	int maxRecentFiles, maxRecentProjects, maxRecentSessions;
182 	bool rememberFileFilter, useNativeFileDialog;
183 	bool sessionRestore;
184 	bool sessionStoreRelativePaths;
185 	bool parseBibTeX, parseMaster;
186 	QString logFileEncoding, bibFileEncoding;
187 	bool autoLoadChildren;
188 
189     // insert cite command, when no context available
190     QString citeCommand;
191 
192 	//autosave
193 	int autosaveEveryMinutes;
194 
195 	bool addRecentFile(const QString &fileName, bool asMaster);  //adds a recent file
196 	void updateRecentFiles(bool alwaysRecreateMenuItems = false);
197 	QMenu *updateListMenu(const QString &menuName, const QStringList &items, const QString &namePrefix, bool prefixNumber, const char *slotName, const int baseShortCut, bool alwaysRecreateMenuItems = false, int additionalEntries = 2, const QList<QVariant> data=QList<QVariant>());
198     void updateUserMacroMenu();
199     void updateUserMacroShortcuts();
200 
201 	QString additionalBibPaths;
202 	QString additionalImagePaths;
203 
204 	//dictionaries
205 	QString spellDictDir;
206 	QString spellLanguage;
207 	QString spell_dic, thesaurus_database;
208 
209 	//debug
210 #ifndef QT_NO_DEBUG
211 	QDateTime debugLastFileModification;
212 	QDateTime debugLastFullTestRun;
213 #endif
214 
215 	bool goToErrorWhenDisplayingLog;
216 	bool showLogMarkersWhenClickingLogEntry;
217 	bool scanInstalledLatexPackages;
218 
219 	// input unicode instead of latex command from symbolgrid (if available)
220 	bool insertSymbolsAsUnicode;
221     QByteArray stateSymbolsWidget;
222 
223     // macro repository
224     QString URLmacroRepository;
225 	//menus
226     QObjectList menuParents;
227     QObject *menuParent; //lets assume there is only one
228 	QMenuBar *menuParentsBar; //that's ugly, but faster as long as there is only one (both values could be extracted from the action's name)
229 	QList<QMenu *> managedMenus;
230 	QHash<QString, QKeySequence> managedMenuShortcuts;
231 	QList<QPair<QString, QString> > managedMenuNewShortcuts;
232 #if (QT_VERSION <= 0x050700) && (defined(Q_OS_MAC))
233 	//workaround that osx/qt does not support alt+key/esc as shortcuts
234     QMultiMap<QKeySequence, QAction *> specialShortcuts;
235 #endif
236 
237 	QMenu *newManagedMenu(const QString &id, const QString &text);
238 	QMenu *newManagedMenu(QMenu *menu, const QString &id, const QString &text);
239     QMenu *newManagedMenu(QWidget *menuParent,QMenuBar *menuParentsBar,const QString &id, const QString &text);
240 	QAction *newManagedAction(QWidget *menu, const QString &id, const QString &text, const char *slotName, const QList<QKeySequence> &shortCuts = QList<QKeySequence>(), const QString &iconFile = "");
241     QAction *newManagedAction(QObject *rootMenu,QWidget *menu, const QString &id, const QString &text, QObject *obj,const char *slotName, const QList<QKeySequence> &shortCuts = QList<QKeySequence>(), const QString &iconFile = "");
242 	QAction *newManagedAction(QWidget *menu, const QString &id, QAction *act);
243     QAction *newOrLostOldManagedAction(QWidget *menu, const QString &id, const QString &text, const char *slotName, const QList<QKeySequence> *shortCuts = nullptr, const QString &iconFile = "");
244 	QAction *getManagedAction(const QString &id);
245     QList<QAction *> getManagedActions(const QString &id);
246 	QList<QAction *> getManagedActions(const QStringList &ids, const QString &commonPrefix = "");
247 	QMenu *getManagedMenu(const QString &id);
248 	void removeManagedMenus();
249 	void triggerManagedAction(const QString &id);
250 
251 	static QString configDirOverride;
252     static bool dontRestoreSession;
253     static int RUNAWAYLIMIT;
254 private:
255 	void setupDirectoryStructure();
256 	void moveCwls();
257 	void connectExtendedSlot(QAction *act, const QString &slot);
258 	bool modifyMenuContentsFirstCall;
259 	void modifyMenuContent(QStringList &ids, const QString &id);
260     void clearMenu(QMenu *menu);
261 public:
262 	void modifyMenuContents();
263     void modifyManagedShortcuts(QString startsWith="");
264 	void setManagedShortCut(QAction *act, int num, const QKeySequence &key);
265 	void loadManagedMenu(QMenu *parent, const QDomElement &f);
266 	void loadManagedMenus(const QString &f);
267 	QStringList possibleMenuSlots;
268 private:
269 	void managedMenuToTreeWidget(QTreeWidgetItem *parent, QMenu *menu);
270 	void treeWidgetToManagedMenuTo(QTreeWidgetItem *item);
271 
272 	QTreeWidgetItem *managedLatexMenuToTreeWidget(QTreeWidgetItem *parent, QMenu *menu);
273 	void treeWidgetToManagedLatexMenuTo();
274 
275 public:
276 	// custom toolbar
277 	QList<ManagedToolBar> managedToolBars;
278 	QStringList watchedMenus;  //list of all sub menus mapped on toolbars
279 	QMap<QString, QVariant> replacedIconsOnMenus;
280 
281 	void populateCustomActions(QListWidget *parent, QMenu *menu, bool go = false);
282 
283 signals:
284 	void watchedMenuChanged(const QString &menuId);
285 	void iconSizeChanged(int value);
286 	void secondaryIconSizeChanged(int value);
287     void pdfIconSizeChanged(int value);
288 	void symbolGridIconSizeChanged(int value);
289 public:
290 //private:
291 	QString configFileName, configFileNameBase, defaultStyleName, configBaseDir;
292 	enum CommmandGridWidgetType {CG_ID, CG_RERUN, CG_CMD, CG_PROGRAM, CG_RESET, CG_CONFIG, CG_DEL, CG_MOVEUP, CG_MOVEDOWN, CG_ADD};
293 	CommandMapping tempCommands;
294 	QList<QPushButton *> rerunButtons; // only for non-user commands
295 	QList<QWidget *> commandInputs;   // only for non-user commands
296 	QGridLayout *userGridLayout;
297 	QLineEdit *pdflatexEdit;
298 	void loadTranslations(QString locale);
299 
300 	void registerOption(const QString &name, void *storage, PropertyType type, QVariant def, void *displayWidgetOffset);
301 	virtual void registerOption(const QString &name, void *storage, PropertyType type, QVariant def);
302 
303 #define REGISTER_OPTION(TYPE, dummy) \
304 	void registerOption(const QString& name, TYPE* storage, QVariant def,  void* displayWidgetOffset); \
305 	virtual void registerOption(const QString& name, TYPE* storage, QVariant def=QVariant());
306 	PROPERTY_TYPE_FOREACH_MACRO(REGISTER_OPTION)
307 #undef REGISTER_OPTION
308 
309 	//virtual void registerOption(const QString& name, QVariant* storage, QVariant def);
310 	virtual void setOption(const QString &name, const QVariant &value);
311 	virtual QVariant getOption(const QString &name, const QVariant &defaultValue = QVariant()) const;
312 	virtual bool existsOption(const QString &name) const;
313 	virtual void linkOptionToDialogWidget(const void *optionStorage, QWidget *widget);
314 	virtual void linkOptionToObject(const void *optionStorage, QObject *widget, LinkOptions options);
315 	virtual void updateAllLinkedObjects(const void *optionStorage);
316 
317 	static void getDefaultEncoding(const QByteArray &unused, QTextCodec *&guess, int &sure);
318 
319 	QString parseDir(QString s) const;
320 	QStringList parseDirList(const QString &s) const;
321 	QString reverseParseDir(QString s) const;
322 	QString reverseParseDir(const QStringList &s) const;
323 private:
324 	void setInterfaceStyle();
325 
326 	QSettings *persistentConfig;
327 
328 	QList<QTreeWidgetItem *> changedItemsList, superAdvancedItems;
329 	QHash<QString, QTreeWidgetItem *> manipulatedMenuTree;
330 
331 	QMap<QString, QVariant> manipulatedMenus;
332 
333 	QList<ManagedProperty> managedProperties;
334 
335 	QMap<QWidget *, QList<QWidget *> > managedOptionDialogs;
336 	ManagedProperty *getManagedProperty(const void *storage);
337 	ManagedProperty *getManagedProperty(const QString &name);
338 	const ManagedProperty *getManagedProperty(const QString &name) const;
339 
340 	QMap<ManagedProperty *, QPair<LinkOptions, QList<QObject *> > > managedOptionObjects;
341 
342 	int userCommandRowCount();
343 	void addCommandRow(QGridLayout *parent, const CommandInfo &cmd, int row);
344 	void createCommandList(QGroupBox *box, const QStringList &order, bool user, bool meta);
345 	void setFirstRowMoveUpEnable(bool enable);
346 	void setLastRowMoveDownEnable(bool enable);
347 private slots:
348 	void browseCommand();
349 	void undoCommand();
350 	void editCommand();
351 	void addCommand();
352 	void removeCommand();
353 	void moveUpCommand();
354 	void moveDownCommand();
355 	void moveCommand(int dir, int atRow = -1);
356 
357 	void menuTreeItemChanged(QTreeWidgetItem *item, int l);
358 	void menuTreeNewItem(bool menu = false);
359 	void menuTreeNewMenuItem();
360     void menuTreeRevertItem();
361 	void toggleVisibleTreeItems(bool show);
362 	void activateInternalViewer(bool activated);
363 
364 	void managedOptionDialogAccepted();
365 	void managedOptionObjectDestroyed(QObject *obj);
366 	void managedOptionBoolToggled();
367 private:
368 	void updateManagedOptionObjects(ManagedProperty *property);
369 };
370 #endif
371